Se connecter aux IsolatedStorages d’applications Windows Phone à partir d’une application Desktop

L’IsolatedStorage (IS) est très souvent utilisé dans les applications Windows Phone afin de stocker des paramètres ou des données en cache. La gestion de l’IsolatedStorage est normalement réservé à l’application Windows Phone qui l’utilise. Or il peut être avantageux de pouvoir accéder à ces données à partir d’une application Windows.

Ainsi, le backup de données de son application, le debuggage d’une application ou l’ajout de données/goodies/maps sans passer par internet sont autant de raison de vouloir se connecter à l’IsolatedStorage à partir d’une application Windows.

Concrétement, dans le cadre du développement de Wario’s Jewels (WJ7), mon emulateur Gameboy pour WP7, pour chaque changement de version, j’avais besoin d’un backup de l’état des jeux enregistrés dans l’IS et pour aider le joueur débutant, d’un ajout de Rom directement dans l’IS sans passer par un serveur distant.

A ma connaissance Il n’existe que deux solutions possibles à ce probleme: WP7 Isolated storage explorer et ISETool. Nous allons maintenant les découvrir ensemble.

WP7 Isolated Storage Explorer

La première et la plus connue pour le moment s’appelle « Windows Phone 7 Isolated Storage Explorer ». Vous pouvez la retrouver sur codeplex à l’adresse suivante :

Cette solution se compose basiquement d’un service WCF dans une application Windows et d’une librairie installée dans l’application du téléphone qui sera chargée de répondre aux commandes en envoyant des requêtes au service régulièrement (pooling).

Ses avantages :

  • la DLL WP7 est très simple à intégrer et à lancer.
  • Le client Windows est simple à prendre en main même si l’UI pourrait être plus poussée.
  • Une intégration dans Visual Studio est disponible.

Ses inconvénients :

  • nécessite l’intégration d’une DLL coté WP7.
  • l’adresse ip du poste windows est demandé pour le pooling.
  • Le pooling, même si il tourne en tache de fond, peut influencer les performances d’une application (animation ou calcul intensif)
  • Le firewall du poste client doit avoir le port 2502 ouvert.
  • Il n’est pas prévue (ou je n’ai pas trouver comment faire ) d’arrêter le pooling.
  • L’implémentation dans une autre application Windows que celle prévue n’est pas des plus aisées même si les sources ssponibles dans codeplex.

J’ai implémenté cette solution dans WJ7 et cela fonctionne bien mais comme il n’y a apparement aucun moyen d’arrêter le pooling du service et que je ne voulais pas que cela influe sur les performances de l’emulateur j’ai du me resoudre à créer un ecran spécifique qui ne s’arrête qu’en quittant l’application.
De plus l’utilisateur final (pas toujours aguéri) à parfois du mal à comprendre qu’il faut ouvrir un port sur son firewall et rentrer l’adresse ip de son poste pour pouvoir accéder aux fameuses informations.
Bref cette solution manque parfois de simplicité.

ISETool

La deuxième solution est un outil en ligne de commande offert par Microsoft dans le SDK 7.1 Windows Phone.
Cette solution est assez étonnante puisque sans aucune DLL ajoutée sur le téléphone elle est capable d’envoyer/recevoir les données de n’importe qu’elle IsolatedStorage présent sur le téléphone.

Ses avantages :

  • Rien à mettre en place coté Windows Phone.
  • Accès aux données très rapide.
  • Ses inconvénients :

  • Une application en ligne de commande peut-être parfois très pratique mais son ergonomie n’est pas toujours convaincante.
  • L’application nécessite de rentrer le ProductID de l’application WP7 (un GUID que l’on trouve dans le fichier WMAppManifest.xml) dont on veut voir l’IS.
  • Intégration dans un application tierce reste difficile car pas de source.
  • Il ne permet pas de voir le fichier de settings WP7 (sans doute pour protéger les données)
  • Pour plus d’information je vous conseille de jeter un coup d’oeil sur sa page MSDN :

    et sur cette vidéo très didactique :

    Plus loin avec ISETool

    Savez vous que ISETool est une application .NET ? et bien c’est en essayant de l’ouvrir avec Reflector que je m’en suis aperçu ^^
    Autre constatation, ISETool utilise une DLL externe pour executer l’ensemble de ses commandes. Il s’agit de Microsoft.SmartDevice.Connectivity.dll que vous trouverez à cet emplacement :

    C:\Program Files (x86)\Common Files\microsoft shared\Phone Tools\CoreCon\10.0\Bin\Microsoft.Smartdevice.Connectivity.dll

    Il est possible que cette librairie ne soit disponible qu’avec le SDK 7.1 Windows Phone, je vous avoue que je n’ai pas vérifier.

    Codons avec Microsoft.SmartDevice.Connectivity

    Après avoir ajouté la dll à notre projet Windows Phone, nous allons commencer par récupérer les devices disponibles (physique ou emulateur).

                DatastoreManager manager = new DatastoreManager(0x409);
                
                foreach (Platform platform in manager.GetPlatforms())
                {
                    foreach (Device device in platform.GetDevices())
                    {
    	             if( device.IsEmulator() )
                          {
                                  // on a choisit l'emulateur
                                  return device;
                          }
    	       }
                }
    

    Une fois le device selectionné on s’y connecte puis on liste les applications disponibles :

                    device.Connect();
                    List<RemoteApplication> applications = device.GetInstalledApplications().ToList();
                    RemoteApplication application = applications[0];
    

    On retrouve dans chaque objet RemoteApplication des informations sur l’application mais aussi des méthodes permettant dans lancer, desinstaller ou encore mettre à jour l’application !

    Malheureusement, pour une raison obscure, seul les ProductIDs sont disponibles dans l’objet et pas les noms des applications (pas très pratique).

    Une fois l’application choisit, il est possible d’ouvrir très simplement l’isolatedStorage :

                RemoteIsolatedStorageFile isolatedStore = application.GetIsolatedStore();
    

    On peut maintenant agir sur les fichiers de l’IsolatedStorage de notre application !

    Par exemple pour créer un repertoire à la racine on utilisera la commande suivante :

    	isolatedStore.CreateDirectory("Cache"):
    

    Pour lister les fichiers et les repertoires d’un repertoire parent :

    	List<RemoteFileInfo> remoteFileInfos = isolatedStore.GetDirectoryListing("Cache");
    

    Les répertoires et les fichiers sont représentés par des objects RemoteFileInfo. Ils contiennent des informations de type taille, date de création, de dernier accès ou d’écriture. Ils sont équivalent aux informations que l’on pourrait trouver dans un objet FileInfo du System.IO.
    Attention tout de même à la propriété Name qui represente le nom du fichier ou du repertoire en y incluant l’ensemble du chemin (dont la racine). Ainsi le nom du fichier Toto.txt se trouvant dans le répertoire Cache serait :

    \Applications\Data\__MonProductID__\Data\IsolatedStore\Cache\Toto.txt
    (remplacer __MonProductID__ par un GUID d’application)

    Si l’on veut se baser sur ce nom pour naviguer il faudra enlever la racine inclue dans le nom.
    Cela complexifie un peu le developpement.

    L’envoi d’un fichier s’effectue via la méthode suivante :

    	isolatedStore.SendFile("c:\Temp\Toto.txt", "Cache\Toto.txt", true);
    

    Tandis que la reception s’effectue de manière inverse :

    	isolatedStore.ReceiveFile("Cache\Toto.txt", "c:\Temp\Toto.txt", true);
    

    C’est simple mais l’envoi/reception d’un dossier complet manque à l’appel.

    Cette solution combine donc les avantages de deux solutions sans leurs inconvénients.
    Afin de pallier à ces quelques petits défaut, envoi/reception de dossier notamment, j’ai développé un Helper spécifique.
    Je vous en parlerais dans mon prochain article mais pour vous mettre en haleine voici quelques screenshots de l’application que j’ai pu développer avec son aide et que vous pourrez decouvrir bientôt sur CodePlex :)

    IMPORTANT :
    L’accès à l’isolatedStorage ne fonctionne que pour les applications en developpement. Les applications en provenance du marketplace ne sont pas détectées afin d’en garantir la sécurité. Merci à Rudy (Huyn) de m’avoir indiqué ce fait important !
    Cela n’en reste pas moins intéressant comme outil de développement ou pour des applications homebrews :)

    EDIT :

    Vous trouverez l’application IsoStoreSpy décrite dans cet article.

    4 réponses à Se connecter aux IsolatedStorages d’applications Windows Phone à partir d’une application Desktop

    1.  

      Merveilleux, merci d’avoir documenté le ISE et sa manipulation par code.

    2.  

      Vraiment une bonne idée et je kiffe le design ;)

    3.  

      Très intéressant :) J’attends de voir ça sur Codeplex!

    4.  

    leave your comment