Search code examples
.netiorapihandhelddevice

Reading the content of a PDA directory while sync with ActiveSync


I have a project in which I would need to copy files found within a PDA (in my case, it's a MC3000 if that makes any difference). I have ActiveSync installed and it create the syncronisation folder for me just fine. However, I would like to be able to read the content of the PDA not only in its MyDocument Folder so I can't use this (Plus it have to work with 20+ possible PDA of the same model, thus making 20+ directory)

Is there a way to do some IO inside the PDA, while it is docked and sync with ActiveSync that is.

I can see the 'Mobile Device' in Explorer.

Thanks


Solution

  • Use RAPI. It's a codeplex project that provides managed wrapper classes for Rapi.dll and ActiveSync. It lets desktop .NET apps communicate with tethered mobile devices. The wrapper originated within the OpenNetCF project, but is now managed separately.

    You can use the whole RAPI project DLL as it ships from that project, or just use the subset of code that you need. I needed to create files on the device when it connected, so I didn't need the performance statistics stuff, or the device registry stuff that is included in Rapi. So I just grabbed the 3 source files I needed...

    The way it works for me, is this:

    • Use ActiveSync (DccManSink) to detect mobile device connection/disconnect status
    • Use the RAPI wrapper to copy files to the device, create files on the device, copy files from the device, and so on.

    private DccMan DeviceConnectionMgr;
    private int AdviceCode;
    private int ConnectionStatus = 1;
    private System.Threading.AutoResetEvent DeviceConnectionNotification = new System.Threading.AutoResetEvent(false);
    
    
    public void OnConnectionError()
    {
        ConnectionStatus = -1;
        DeviceConnectionNotification.Set();
    }
    
    public void OnIpAssigned(int address)
    {
        ConnectionStatus = 0;
        DeviceConnectionNotification.Set();
    }
    
    
    private void btnCopyToDevice_Click(object sender, EventArgs e)
    {
        // copy the database (in the form of an XML file) to the connected device
        Cursor.Current = Cursors.WaitCursor;
    
        // register for events and wait.
        this.DeviceConnectionMgr = new DccMan();
    
        DccManSink deviceEvents = new DccManSink();
        deviceEvents.IPChange += new IPAddrHandler(this.OnIpAssigned);
        deviceEvents.Error += new ErrorHandler(this.OnConnectionError);
        ((IDccMan)DeviceConnectionMgr).Advise(deviceEvents, out this.AdviceCode);
    
        // should do this asynchronously, with a timeout; too lazy.
        this.statusLabel.Text = "Waiting for a Windows Mobile device to connect....";
    
        this.Update();
        Application.DoEvents();  // allow the form to update
    
        bool exitSynchContextBeforeWait = false;
        DeviceConnectionNotification.WaitOne(SECONDS_TO_WAIT_FOR_DEVICE * 1000, exitSynchContextBeforeWait);
    
        if (ConnectionStatus == 0)
        {
            this.statusLabel.Text = "The Device is now connected.";
            this.Update();
            Application.DoEvents();  // allow the form to update
    
            RAPI deviceConnection = new RAPI();
            deviceConnection.Connect(true, 120);  // wait up to 2 minutes until connected
            if (deviceConnection.Connected)
            {
                this.statusLabel.Text = "Copying the database file to the connected Windows Mobile device.";
                this.Update();
                Application.DoEvents();  // allow the form to update
                string destPath = "\\Storage Card\\Application Data\\MyApp\\db.xml";
                deviceConnection.CopyFileToDevice(sourceFile,
                                                  destPath,
                                                  true);
    
                this.statusLabel.Text = "Successfully copied the file to the Windows Mobile device....";
            }
            else
            {
                this.statusLabel.Text = "Oh, wait, it seems the Windows Mobile device isn't really connected? Sorry.";
            }
    
        }
        else
        {
            this.statusLabel.Text = "Could not copy the file because the Device does not seem to be connected.";
        }
    
        Cursor.Current = Cursors.Default;
    
    }