Première approche des API managées de PocketOutlook
Pierre Cauchois - Article publié le 19 décembre 2008
Nous avons tous nos petites habitudes quant à l’utilisation des SMS ou emails, de sa liste de contacts, ou de son calendrier, et parfois, on tombe dans un cas d’utilisation qui n’a pas été prévu par les applications PIM (Personnal Information Management) de Windows Mobile . Les équipes qui s’occupent du SDK Windows Mobile l’ont bien compris, et nous offre des APIs très simples d’utilisation pour développer nos propres applications. Dans cet article nous allons illustrer par l’exemple l’utilisation de quelques unes de ces APIs, à travers 3 applications volontairement simplistes et inspirées des codes d’exemple que l’on trouve dans le SDK.
I. Tour d’horizon
Les APIs PocketOutlook sont contenues dans deux espaces de nommage Microsoft.WindowsMobile. PocketOutlook, qui va contenir toutes les classes liées à la manipulation des données PIM, et Microsoft.WindowsMobile.PocketOutlook.MessageInterception, qui concerne le traitement des messages reçus par le terminal, que ce soit des SMS, des MMS, ou des emails. il faut donc commencer son projet par ajouter la référence à la DLL Microsoft.WindowsMobile.PocketOutlook.dll du SDK Windows Mobile, et également ajouter la bonne directive « using » :
using Microsoft.WindowsMobile.PocketOutlook;
Ouvrir l’Object Browser de Visual Studio est un bon moyen de voir quelles sont les classes de cet espace de nommage. A souligner pour la suite de l’article, les classes Contact, SmsMessage, Appointment, et OutlookSession.
La première chose à faire lorsque l’on veut manipuler les données PIM du téléphone est d’ouvrir une « session outlook » sur le téléphone :
using (OutlookSession session = new OutlookSession())
{
/* Le code se servant de l’accès à la session Outlook */
}
Une fois cette session ouverte il est possible par exemple de demander au système le nombre de contacts existants déjà dans le téléphone :
int currentNumberOfContacts = session.Contacts.Items.Count;
}
La classe OutlookSession contient nombre d’informations intéressantes, notamment les dossiers des rendez-vous (appointments), des contacts, des taches (tasks) ainsi que les collections des comptes emails (car il est possible d’en avoir plusieurs !) et le compte SMS .
II. Les Contacts, Les Tâches et les Rendez-Vous
Contacts, tâches et rendez-vous sont gérés de la même façon dans Pocket Outlook, à savoir, ils sont contenus dans une collection rattachée à un dossier, celui-ci étant rattaché à une session. Ensuite, chacun de ces types de données PIM dispose d’une classe qui lui est propre (respectivement Contact, Appointment et Task) héritant de la classe PimItem.
Ces classes Contact, Appointment et Task possèdent toutes un grand nombre de membres, le plus souvent de type string (pour les données textuelles à stocker), bool (par exemple pour les flags) ou DateTime (par exemple pour les dates de complétion).
La classe Contact par exemple contient nom, prénom, numéro(s) de téléphone, email(s), addresse(s), etc : voici comment créer un nouvel objet de type Contact, et remplir quelques-unes des informations basiques :
Contact ct = new Contact();
ct.FirstName = "John";
ct.LastName = "Doe";
ct.Email1Address = "john.doe@contoso.com";
ct.CompanyName = "Contoso";
ct.CompanyTelephoneNumber = "+33115522443";
Les classes Task et Appointment fonctionnent de la même manière.
Pour ajouter ce contact à la liste des contacts du téléphone :
session.Contacts.Items.Add(ct);
La classe OutlookSession dont nous avons déjà parlé contient un membre Contacts de type ContactFolder, qui lui-même contient la collection de contact (de type ContactCollection).
Je vais conclure ce petit tour rapide des classes dérivant de PimItem en ajoutant qu’avec le Compact Framework 3.5 on dispose de LINQ, et que les PimItem étant stockés sous forme de collection, on peut utiliser une requête Linq pour chercher dans cette liste. Par exemple, pour extraire la liste des tâches qui ont été terminées après leur date butoir, on peut faire :
List<Task> overdueTasks = (from Task t in session.Tasks.Items
where t.DateCompleted > t.DueDate
select t).ToList();
III.Les Messages
Très facile également avec les API PocketOutlook de manipuler des messages, que ce soit des SMS ou des emails. Par exemple, envoyer un SMS se fait en deux lignes de code :
SmsMessage msg = new SmsMessage("recipientPhoneNumber", "test");
msg.Send();
Une autre possibilité sympathique des API PocketOutlook est celle de définir des intercepteurs de messages (classe MessageInterceptor). Attention ils ont leur propre espace de nommage :
using Microsoft.WindowsMobile.PocketOutlook.MessageInterception;
Pour définir un intercepteur, on procède en quatre étapes
1. Instanciation de ce nouvel intercepteur :
MessageInterceptor interceptor = new
MessageInterceptor(InterceptionAction.NotifyAndDelete);
2. Définition de la condition d’interception :
interceptor.MessageCondition = new MessageCondition();
interceptor.MessageCondition.CaseSensitive = true;
interceptor.MessageCondition.ComparisonType = MessagePropertyComparisonType.Equals;
interceptor.MessageCondition.ComparisonValue = "toto";
interceptor.MessageCondition.Property = MessageProperty.Sender;
3. Définition du handler qui effectuera le traitement lors d’une interception :
public void InterceptorHandler(object sender, MessageInterceptorEventArgs e)
{
MessageBox.Show("Message Intercepted");
}
4. Activation de l’intercepteur dans le système :
interceptor.MessageReceived += InterceptorHandler;
interceptor.EnableApplicationLauncher("myFilter");
4. Activation de l’intercepteur dans le système :
Il existe cependant des limitations à ce que l’on peut faire avec ces APIs PocketOutlook en code managé, notamment la manipulation des messages dans les dossiers est impossible une fois que ces messages ont été reçus, si aucun filtre n’a été déclenché.
A souligner également, pour ceux qui préfèrent le C++ ou qui ont besoin de plus de performance, les API PocketOutlook existent aussi en code natif.
Pour conclure, rappelons que PocketOutlook est loin d’être le seul composant du très riche SDK Windows Mobile : Bien entendu on dispose de toutes les fonctionnalités du Compact Framework .NET, mais on peut si l’on veut manipuer la stack cellulaire avec la Telephony API, et la stack Bluetooth. On a accès de façon unifiée à l’éventuelle fonctionnalité GPS avec le GPS Intermediate Driver, à l’appareil photo, que ce soit à travers le très simple CameraCaptureDialog ou directement dans des filtres DirectShow (qui permettent par exemple après d’appliquer des filtres de traitement d’image en temps-réel). On dispose de Direct3D et DirectDraw , de bases de données avec EDB et SQL CE, de contrôles Internet Explorer Mobile, pour inclure une expérience de browsing dans une application tierce. On peut accéder à des fonctionnalités d’Active Sync ainsi qu’a la Remote API, pour connecter un téléphone à un autre équipement, aux fonctionnalités d’Inking, par exemple pour reconnaitre de l’écriture manuscrite… et même au Shell pour programmer au plus près du système d’exploitation ! Autant de sujet qui feront l’objet de pro chains articles, mais qui sont déjà bien documentés dans la librairie MSDN et surtout dont des codes d’exemples sont disponibles dans le SDK : n’hésitez donc pas à parcourir votre dossier C:\Program Files\Windows Mobile 6 SDK\Samples !