Si vous avez déjà développé des applications pour PocketPC, il vous ai déjà – certainement – arrivé de vous demander comment synchroniser les données du device avec celles d’un serveur. Trois solutions s’offrent à vous (si l’utilisation de SQLCE n’est pas prévue) :
- déclencher la synchronisation à partir du Pocket PC
- ajouter un module COM à ActiveSync
- Se servir de RAPI pour transferer les données
La solution 1 fera – probablement – l’objet d’un second billet, la 2 est pratiquement irréalisable – l’API de ActiveSync est l’une des plus obscures que j’ai eu l’occasion de voir dans le monde MS –; reste donc le point N°3 qui sera le sujet de ce jour.
Cet exemple se base sur l’utilisation de fichiers XML comme source de données sur le Pocket PC
Etape 1 : lancer le logiciel lors de la connexion.
Pour cela, rien de plus facile : ActiveSync le fera pour vous pour peu que vous preniez la peine de lui demander. Il vous suffit juste d’ajouter une valeur dans la base de registre :
Chemin de la clef :
HKEY_LOCAL_MACHINE\
SOFTWARE\
Microsoft\
Windows CE Services\
AutoStartOnConnect
Il vous suffit d’ajouter une valeur de type REG_SZ ayant un nom unique (un Guid serait parfait) et qui contient le path vers votre application.
Etape 2 : Se connecter au périphérique
Maintenant, voyons un peu le code. Pour simplifier l’accès à RAPI (l’API permettant d’exécuter à distance des commandes sur un périphérique Windows CE), j’ai décidé d’utiliser une assembly de l’OpenNetCF, qui a le double avantage d’être simple à utiliser et maintenue par des gens qui savent de quoi ils parlent. Si vous preferez gérer tout cela «à la dure», un petit tour par PInvoke.net, vous permettra de récuperer les définitions nécesaires.
Le code est ensuite assez simple :
RAPI rapi = new RAPI();
if (rapi.DevicePresent)
{
rapi.Connect();
// effectuer la synchronisation
DoSync(rapi);
}
Etape 3 : Envoyer/Recevoir des fichiers XML
Je ne parlerai pas des moyens permettant d’obtenir les données à mettre sur le Pocket PC ou ceux permettant de mettre à jour un serveur : cela ne concerne que vous – bien que l’utilisation de web-services ai personnellement ma préférence - mais uniquement sur les moyens de transférer un fichier depuis (ou vers) le périphérique.
// tester la présence d'un fichier est
// d'un simplicité enfantine avec
// la classe openNetCF
if (rapi.DeviceFileExists(
@"\program files\mcarbenay\demo.xml"))
{
// de même que le copier vers le PC
rapi.CopyFileFromDevice(destination,
@"\program files\mcarbenay\demo.xml");
// faire la synchro
. . .
// puis retransférer le fichier dans l'autre sens
rapi.CopyFileToDevice(nouveauFichier,
@"\program files\mcarbenay\demo.xml",true);
}