Copy a file from desktop/pc to a pda or mobile device and vice versa using RAPI API
Tech-Today

Copy a file from desktop/pc to a pda or mobile device and vice versa using RAPI API


Objective:
-To copy a file from desktop to a pda device and vice versa using RAPI API.
-http://msdn.microsoft.com/en-us/library/aa921197.aspx

Requirement:
-microsoft activesync must be installed
-of course either .net framework 2 or greater

To implement a RAPI API functionalities we need to define 2 class. One is the enumeration of structures, functions, interface that we will use and the other is the class that will implement the actual copy function.

I will just define the 2 classes then:

/**
* @author edwardpantojalegaspi
* @since 2009.09.15
* */

using System.Runtime.InteropServices;
using System;

namespace Ipiel.Framework.RAPI
{
public class RapiApi
{
[StructLayout(LayoutKind.Sequential)]
public struct RAPIINIT
{
public int cbSize;
public int heRapiInit;
public int hrRapiInit;
};

public static int FILE_ATTRIBUTE_NORMAL = 128;
public static int INVALID_HANDLE_VALUE = -1;

public static int S_OK = 0;
public static int GENERIC_READ = -2147483648;
public static int GENERIC_WRITE = -1073741824;
public static int CREATE_NEW = 1;
public static int CREATE_ALWAYS = 2;
public static int OPEN_EXISTING = 3;
public static int OPEN_ALWAYS = 4;
public static int TRUNCATE_EXISTING = 5;

public static int ERROR_FILE_EXISTS = 80;
public static int ERROR_INVALID_PARAMETER = 87;
public static int ERROR_DISK_FULL = 112;
public static int ERROR_FILE_NOT_FOUND = 2;

[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
public static extern int WaitForSingleObject(int handle, int milliseconds);

[DllImport("Kernel32.dll", EntryPoint = "RtlZeroMemory", SetLastError = false)]
public static extern void ZeroMemory(IntPtr dest, int size);

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeRapiInit();

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeRapiInitEx(ref RAPIINIT pRapiInit);

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeCreateFile(string lpfilename, int dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplatefile);

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeGetFileSize(int hFile, int lpFileSizeHigh);

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeReadFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToRead, ref int lpNumberOfBytesRead, int lpOverlapped);

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeWriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, int lpOverlapped);

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeCloseHandle(int hobject);

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeRapiUninit();

[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
public static extern int CeDeleteFile(string DeviceFileName);
}
}

And the actual class that implements the copy from desktop to mobile and vice versa function:

/**
* @author edwardpantojalegaspi
* @since 2009.09.15
* */

using System;
using System.IO;
using System.Windows.Forms;

namespace Ipiel.Framework.RAPI
{
///
/// Summary description for Rapi.
///

public class Rapi
{
public Rapi()
{

}

///
/// Copies a file from Desktop to PDA.
///

/// desktop source file /// mobile destination file /// true if file is transferred
public bool CopyFilePCtoPDA(String filePath, String desFile)
{
bool flag = true;
FileStream sourceFile = null;

try
{
RapiApi.RAPIINIT ri = new RapiApi.RAPIINIT();
ri.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(ri);

int hr = RapiApi.CeRapiInitEx(ref ri);
if (ri.hrRapiInit == RapiApi.S_OK)
{
sourceFile = new FileStream(filePath, FileMode.Open);
int Handle = RapiApi.CeCreateFile(desFile, RapiApi.GENERIC_WRITE, 0, 0, RapiApi.CREATE_ALWAYS, RapiApi.FILE_ATTRIBUTE_NORMAL, 0);

byte[] bytes = new byte[sourceFile.Length];
int numBytesToRead = (int)sourceFile.Length;
int numBytesRead = 0;
int lpNumberofBytesWritten = 0;

while (numBytesToRead > 0)
{
// Read may return anything from 0 to numBytesToRead.
int n = sourceFile.Read(bytes, numBytesRead, numBytesToRead);

// Break when the end of the file is reached.
if (n == 0)
break;

numBytesRead += n;
numBytesToRead -= n;
}
numBytesToRead = bytes.Length;

RapiApi.CeWriteFile(Handle, bytes, numBytesToRead, ref lpNumberofBytesWritten, 0);
RapiApi.CeCloseHandle(Handle);
}
else
{
//timeout error
flag = false;
}
}
catch(Exception e)
{
//error found
RapiApi.CeRapiUninit();
flag = false;
}
finally
{
RapiApi.CeRapiUninit();
if(sourceFile != null)
sourceFile.Close();
}
return flag;
}


public delegate void CopyFileCallBack(int bytesCopied, int totalBytes);
///
/// CallBack to avoid cross-threads.
///

/// actual bytes copied /// total bytes to be copied private void CallBack(int bytesCopied, int totalBytes)
{
//you can implement a progressbar here
//if not null update the progress bytes
/*if ((progressBar != null) && (bytesCopied > 0 || totalBytes > 0))
{
progressBar.Maximum = totalBytes;
progressBar.Value = bytesCopied;
}
progressBar.Refresh();*/
}

///
/// Copies file from PDA to Desktop
///

/// desktop destination file /// mobile source file public void CopyPDAtoPC(string deskTopFileName, string PDAFileName)
{
//enable the progress bar
progressBar.Enabled = true;
progressBar.Visible = true;
progressBar.Show();

CopyPDAtoPC(deskTopFileName, PDAFileName, null);
}

///
/// Copies file from PDA to Desktop
///

/// desktop destination file /// mobile source file /// public void CopyPDAtoPC(string deskTopFileName, string PDAFileName, CopyFileCallBack cb)
{
int Handle;
int bufferSize = 32768;
byte[] lpBuffer = new byte[bufferSize + 1];
System.IO.FileStream outFile;

try
{
#region If no PDA connected connection timeout
RapiApi.RAPIINIT ri = new RapiApi.RAPIINIT();
ri.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(ri);

int hr = RapiApi.CeRapiInitEx(ref ri);
if (ri.hrRapiInit == RapiApi.S_OK)
{
//initialized file for reading
outFile = new System.IO.FileStream(deskTopFileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
int lpNumberofBytesRead = bufferSize;
Handle = RapiApi.CeCreateFile(PDAFileName, RapiApi.GENERIC_READ, 0, 0, RapiApi.OPEN_EXISTING, RapiApi.FILE_ATTRIBUTE_NORMAL, 0);

int fileSize = RapiApi.CeGetFileSize(Handle, 0);
int bytesToRead = bufferSize;
int bytesRead = 0;

while (lpNumberofBytesRead > 0)
{
RapiApi.CeReadFile(Handle, lpBuffer, bytesToRead, ref lpNumberofBytesRead, 0);
outFile.Write(lpBuffer, 0, lpNumberofBytesRead);
bytesRead += lpNumberofBytesRead;
if ((cb != null))
{
cb(bytesRead, fileSize);
}
else
{
CallBack(bytesRead, fileSize);
}
}
outFile.Close();
RapiApi.CeCloseHandle(Handle);
}
else
{
throw new Exception("Timeout - No Device");
}
#endregion
}
catch (Exception ex)
{
throw ex;
}
finally
{
//disble the progress bar
//progressBar.Enabled = false;
//progressBar.Visible = false;
RapiApi.CeRapiUninit();
}
}

///
/// Dispose this object.
///

public void Dispose()
{
RapiApi.CeRapiUninit();
}
}
}




- Encode Image And Display In Html
To encode an image file(eg. png, jpg, gif) we will need the apache commons-codec library. To avoid it in a maven project: <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version>...

- How To Zipped A File Or Directory In Java
There are times when we have to zipped a file or directory recursively in Java. This is how we do it: public static void zipFile(File file) throws IOException { byte[] buffer = new byte[1024]; FileOutputStream fos = new FileOutputStream( file.getParent()...

- How To Send And Receive Stomp Message In Jboss 7.2
The following code is an example of how we can send and receive a stomp message with JBoss 7.2. package org.meveo.util; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Properties; import javax.naming.InitialContext;...

- Injection Of Control In A C# Console Application
Now that I'm working with C# MVC3, I learned that it's easier to setup Injection of Control because of several available plugins that you can use straightly after install. For example the one I'm using is Unity.MVC, in Visual Studio 2010 you...

- How To Implement Jni Code In Ericsson's Sds/ims Framework
My CDC JNI Codes: //.pkg #{"eplDll DLL"},(0xAFFFFFFE),1,0,0 ;Localised Vendor name %{"eScience"} ;Unique Vendor name :"edwardpantojalegaspi" "$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\eplDll.dll" -"!:\sys\bin\eplDll.dll" //bld.inf PRJ_PLATFORMS...



Tech-Today








.