FR 2850180 A1 20040723 FR 0300541 A 20030117 SOLUTION DE MESSAGERIE ELECTRONIQUE UTILISANT DES ICÔNES DANS LE SHELL DU SYSTEME D'EXPLOITATION La présente invention se rapporte au domaine des solutions de messagerie électronique. Dans la suite, nous nommerons "Shell" l'interface graphique fournie à l'utilisateur par le système d'exploitation qui permet à l'utilisateur d'effectuer des tâches courantes telles que l'accès au système de fichiers, le lancement de programmes informatiques et d'autres tâches. Dans le cas particulier du système d'exploitation Windows, il s'agit entre autres, du Bureau, du système d'icônes, du Poste de Travail, du panneau de configuration, mais aussi des menus contextuels apparaissant lorsqu'on clique avec le bouton droit de la souris sur une icône, des mécanismes de "drag and drop". La présente invention se rapporte plus particulièrement à une solution de messagerie électronique utilisant des icônes sur le bureau. Cette solution est très simple d'utilisation et permet à l'utilisateur de manipuler directement ses contacts sur le bureau. Un ensemble de contacts est regroupé sous le terme de famille. Le carnet d'adresse de la solution de messagerie électronique selon l'invention se situe dans l'arborescence du Shell du système d'exploitation. L'art antérieur connaît déjà, par la demande de brevet américain US 6 449 344 (AOL) un système de communication. La demande de brevet dévoile un système de communication comprenant un réseau de communications, une multiplicité de terminaux de communication qui peuvent être connectés au réseau de communication et qui peut être utilisé par des utilisateurs pour communiquer à travers le réseau de communications, l'utilisateur n'étant pas nécessairement identifié avec un terminal de communications donné, un appareil pour observer si un utilisateur est connecté ou non au réseau de communications indépendamment du terminal de la multiplicité de terminaux de communications que l'utilisateur utilise, et un appareil pour annoncer à un utilisateur en recherche, connecté au réseau de communications grâce à l'un de la multiplicité de terminaux de communications, une information sur l'état de connexion au réseau concernant d'autres utilisateurs qui font partie de l'ensemble des utilisateurs recherchés, ledit ensemble étant définissable par l'utilisateur en recherche, et pour fournir à l'utilisateur en recherche des informations relatives à l'adresse de connexion concernant les utilisateurs recherchés qui sont connectés au réseau de communications. L'art antérieur connaît aussi, par la demande de brevet américain US 6 091 409 (Microsoft), un procédé consistant à activer un navigateur de façon automatique grâce à des raccourcis Internet sur le bureau. Un ordinateur client possède la capacité d'encapsuler des informations relatives à l'emplacement, comme des URL (Uniform Resource Locator) pour des ressources disponibles sur un ordinateur serveur. Cette capacité est particulièrement bien adaptée pour l'utilisation avec des documents Internet. L'information relative à l'emplacement pour une telle ressource est encapsulée dans un objet connu comme un raccourci Internet. Le raccourci Internet peut être créé par une opération de glisser déposer ( drag and drop ) depuis un lieu vers le bureau. Apparaissant comme une icône, le raccourci est utilisé pour accéder à la ressource sous-jacente. Le raccourci Internet contient un lien vers la ressource distante et va automatiquement activer le navigateur web lorsqu'il est sélectionné. Les icônes raccourcis Internet peuvent être implémentées comme des objets qui sont visibles sur le bureau du système d'exploitation. Les opérations sur des fichiers comme la copie et la suppression peuvent être effectuées sur l'icône du raccourci Internet au moyen d'un menu contextuel. De plus, les raccourcis Internet peuvent être transférés vers un système de messagerie électronique, vers une disquette grâce à un menu contextuel. L'art antérieur connaît également, par la demande de brevet japonais JP 11259393 (Hitachi), un système d'icône utilisateur et de réseau. Le problème à résoudre et de spécifier aisément l'interlocuteur avec lequel on communique en affichant cet interlocuteur sur le bureau d'un ordinateur personnel (PC) grâce à une icône identifiable, et en rendant cette icône fonctionnelle. La solution apportée est, dans un système client-serveur connectant plusieurs PC à un serveur par un réseau, de fournir les images des icônes utilisateurs, qui sont préparées lorsqu'un utilisateur effectue une opération vers le serveur, avec des informations relatives à l'utilisateur et avec la possibilité d'identification de la part des utilisateurs. Les icônes utilisateurs sont affichées sur le bureau du PC. L'icône utilisateur possède des informations sur l'utilisateur, comme la présence (le log-in ou log-out), ou l'activité, ces informations étant fournies par le serveur. L'icône utilisateur est également fournie avec une fonction de boîte aux lettres pour le courrier vers ou de l'utilisateur. L'art antérieur connaît également, par la demande de brevet européen EP 0959592 (Hitachi), un procédé pour transmettre le courrier électronique et un système de messagerie. Dans un système de messagerie électronique, un terminal client affiche sur l'écran une liste de courriers reçus par l'utilisateur du terminal client et une pluralité d'icônes destinataires associées aux noms des destinataires de courriers. Lorsque l'un des courriers est déposé sur une des icônes destinataires par une opération de glisser déposer ( drag and drop ) sur l'écran, le courrier sélectionné est transmis à l'adresse de destination préalablement enregistrée en association avec l'icône destinataire. L'art antérieur connaît également, par la demande de brevet européen EP 1003098 (Fujitsu), un procédé et un système pour afficher et envoyer des informations. Un procédé et un système pour afficher et envoyer des informations fonctionnant grâce à des icônes utilisent un objet message pour organiser l'information associée au moyen d'un thème commun. L'objet message est un containeur d'informations de l'interface utilisateur avec une description d'informations. Dans un mode de réalisation préféré, l'icône objet message peut être glissée déposée ( dragged and dropped ) vers une icône de boîte postale pour transmettre automatiquement les informations contenues dans l'objet message sous une forme appropriée pour le procédé de transmission de données. La présente invention entend remédier aux inconvénients de l'art antérieur en proposant une solution de messagerie électronique simple qui utilise des icônes sur le bureau. A cet effet, l'invention concerne dans son acception la plus générale un procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique, comportant : # une étape consistant à créer l'objet informatique raccourci dans le Shell du système d'exploitation, caractérisé en ce qu'il comporte en outre # une étape consistant à faire pointer l'objet informatique raccourci vers un fichier informatique, ledit fichier informatique contenant des informations sur une ou un groupe de personne (s) physique (s) et notamment un (ou des) identifiant(s) permettant de contacter cette (ou ce groupe de) personne (s) par un système de messagerie électronique ; # une étape consistant à associer à l'objet informatique raccourci une icône dans le Shell représentant graphiquement la ou le groupe de personne (s) physique(s) ; # une étape consistant à lancer un client de messagerie électronique, en prenant en compte les informations contenues dans le fichier informatique vers lequel l'objet informatique raccourci pointe, lors de la sélection de l'objet informatique raccourci par un utilisateur. De préférence, le procédé est mis en #uvre sur un ordinateur. Selon une variante particulière, le procédé est mis en #uvre sur un assistant personnel (PDA). Avantageusement, le procédé est mis en #uvre sur un téléphone portable numérique. Selon une variante, le client de messagerie électronique est un client de courrier électronique [email]. Selon une autre variante, le client de messagerie électronique est un client de messagerie instantanée. Selon un mode de mise en #uvre particulier, le client de messagerie électronique est un client de messagerie pour téléphones mobiles numériques conforme à la norme SMS ou MMS. De préférence, le client de messagerie électronique utilise un canal de transmission de la voix sur IP. Avantageusement, le client de messagerie électronique utilise un canal de transmission de vidéo. Selon une variante, l'icône représentant la ou le groupe de personne (s) est modifiable par un utilisateur. Selon un mode de mise en #uvre particulier, un menu contextuel apparaît lorsqu'un utilisateur effectue un clic-droit sur l'icône de l'objet informatique raccourci. De préférence, l'action par un utilisateur de faire glisser sur l'icône dudit objet informatique raccourci un fichier informatique destiné à être envoyé, déclenche l'envoi dudit fichier informatique destiné à être envoyé vers la ou le groupe de personne(s) physique(s) associée (s) à l'objet informatique raccourci. Avantageusement, l'étape consistant à créer l'objet informatique raccourci dans le Shell du système d'exploitation et ladite étape consistant à faire pointer l'objet informatique raccourci vers un fichier informatique se réalisent de façon simultanée par une action d'un utilisateur dans un logiciel de messagerie électronique. Selon une variante, la sélection de l'objet raccourci par un utilisateur s'effectue par un double- clic gauche sur l'icône de l'objet raccourci. Selon une autre variante, la sélection de l'objet informatique raccourci par un utilisateur s'effectue en choisissant une entrée déterminée dans ledit menu contextuel. Selon un mode de mise en #uvre particulier, la sélection d'un groupe de personnes physiques entraîne l'affichage, dans une fenêtre graphique affichant les éléments du Shell, des éléments représentant les personnes physiques ou les sous-groupes de personnes physiques appartenant au groupe de personnes physiques, ces éléments ayant des propriétés similaires aux propriétés des objets informatiques raccourcis. De préférence, l'action de faire glisser un objet informatique raccourci, conforme au procédé de l'invention, du Shell vers la fenêtre graphique entraîne la disparition de l'objet informatique raccourci du Shell et la création dans la fenêtre graphique d'un élément représentant la ou le groupe de personne (s) sur laquelle/lequel on trouve des informations dans le fichier informatique sur lequel l'objet informatique raccourci pointe. Selon une variante, l'action de faire glisser un élément de la fenêtre graphique vers le Shell entraîne la disparition de l'élément de la fenêtre graphique et la création dans le Shell d'un objet informatique raccourci, conforme à l'invention, pointant vers un fichier informatique contenant des informations vers la personne physique ou le sous-groupe de personnes physiques que représente l'élément. Avantageusement, l'action de faire glisser un objet informatique raccourci, conforme au procédé de l'invention, entraîne un déplacement dans le Shell de l'objet informatique raccourci. Selon un mode de mise en #uvre particulier, le contenu du carnet d'adresses du Shell est identique au contenu du carnet d'adresses du client de messagerie électronique. On comprendra mieux l'invention à l'aide de la description, faite ci-après à titre purement explicatif, d'un mode de réalisation de l'invention, en référence aux figures annexées : # la figure 1 représente les icônes de contacts et de familles selon l'invention ; # la figure 2 représente le diagramme d'héritage pour les classes d'objets du carnet d'adresses de l'utilisateur ; # la figure 3 illustre un exemple d'application ; # la figure 4 illustre des exemples de FQNs et leurs objets associés ; et # la figure 5 représente le diagramme d'héritage de CRosterAPI. Le procédé selon l'invention appartient au domaine de la messagerie électronique. Il permet à son utilisateur d'effectuer des opérations de messagerie e-mail (courrier électronique), de messagerie instantanée, de chat, voix sur IP, SMS, vidéo conférence. Il est destiné à être interface à tout type de logiciel de messagerie électronique existant sur la machine de l'utilisateur, que nous nommerons par la suite client de messagerie électronique . ce peut être un client d'e-mail, de messagerie instantanée, de chat , de messagerie par voix sur IP (VoIP) ou encore par vidéo conférence. Nous désignons par fenêtre de message une fenêtre du client de messagerie électronique permettant à l'utilisateur de cette application de communiquer avec un ou des correspondant(s). Nous décrivons une implémentation du procédé pour le système d'exploitation Windows. Le procédé est destiné à être implémenté sous d'autres systèmes d'exploitation tels que Linux, MacOS, différents Unix ou tout autre système d'exploitation pour ordinateur personnel, serveur, PDA ou téléphone portable numérique. Le procédé selon l'invention permet à l'utilisateur de gérer un carnet d'adresse contenant des informations sur une ou plusieurs personne (s) Ce carnet d'adresses est intégré au Shell de Windows, au même titre que la corbeille de Windows ou que le dossier Poste de travail . Ainsi l'utilisateur est capable de manipuler son carnet d'adresses exactement de la même façon qu'il manipule les autres types de fichiers ou de virtual folder (répertoires virtuels) présents dans le Shell. Dans la suite, nous nommerons contact aussi bien l'objet informatique raccourci représentant une personne physique dans l'arborescence du Shell que la personne physique elle même. Nous noterons famille aussi bien l'objet informatique raccourci représentant un groupe de personnes physiques dans l'arborescence du Shell que le groupe lui-même. Une famille peut contenir plusieurs types d'objets différents des sous-familles et des contacts. Nous nommons dans la suite Roster l'ensemble du carnet d'adresse : contacts et familles. Les familles sont représentées par des icônes du Shell qui reproduisent le comportement d'un folder , comme (voir la Figure 1). Ainsi on retrouve de la part d'une famille la plupart des propriétés attendues de la part d'un folder du Shell ainsi que des propriétés supplémentaires : # on déplace une famille dans une autre famille en faisant glisser ( drag and drop ) son icône sur l'icône de l'autre famille ; # on déplace un contact dans une famille en déplaçant l'icône du contact soit sur l'icône de la famille soit sur la fenêtre d' Explorer affichant les éléments d'une famille. # la famille peut être supprimée en faisant glisser ( drag and drop ) son icône dans la corbeille du bureau ou en effectuant un clic droit sur l'icône de la famille puis en sélectionnant supprimer dans le menu contextuel ; # un double clic gauche sur l'icône d'une famille ouvre une fenêtre d' Explorer contenant les icônes des sous-familles et contacts appartenant à la famille ; # une fenêtre de message du client de messagerie électronique à destination de tous les membres de la famille est ouverte en effectuant un clic droit sur l'icône d'une famille puis en sélectionnant envoyer message à toute la famille ; # une nouvelle famille est créée dans l'arborescence du Shell en effectuant un clic droit sur le bureau ou dans une fenêtre d' Explorer puis en sélectionnant l'entrée nouvelle famille dans le menu contextuel ; # une famille est supprimée en cliquant avec le bouton droit de la souris sur l' icône de la famille dans le Shell puis en choisissant l'entrée supprimer dans le menu contextuel, ou bien en faisant glisser drag &drop la famille dans la corbeille De même, l'utilisateur peut associer une icône prédéfinie à certains contacts, faisant de ceux-ci des contacts "privilégiés" ou "favoris", qu'il peut manipuler et placer dans l'une de ses familles ou sur le bureau ( desktop de Windows) pour les joindre encore plus facilement, comme cela est représenté sur la Figure 1. Ces contacts peuvent être manipulés de la même façon qu'on manipule un fichier dans le Shell, et on retrouve la plupart des propriétés attendues de la part d'un élément du Shell ainsi que des propriétés supplémentaires : # on déplace le contact dans une famille en faisant glisser ( drag and drop ) son icône sur l'icône de la famille et ce quel que soit l'endroit où se trouve l'icône du contact au début de l'opération ; # de même, le contact peut être déplacé sur le bureau desktop en faisant glisser ( drag and drop ) son icône sur le bureau ; # le contact peut être supprimé en faisant glisser ( drag and drop ) son icône sur la corbeille de Windows ; # un double clic gauche sur l'icône du contact provoque l'ouverture d'une fenêtre de message du client de messagerie électronique qui permet à l'utilisateur de rédiger un message à destination du contact désigné par l'icône double cliquée ; # un message peut être envoyé à plusieurs destinataires en cliquant (clic gauche) successivement sur plusieurs icônes : le premier clic ouvre une fenêtre du client de messagerie électronique pour un message destiné au premier correspondant sur lequel on a cliqué et les adresses électroniques des autres correspondants s'ajoutent à la liste des destinataires du message au fur et à mesure que les clics sur les autres icônes sont effectués ; # si le client de messagerie électronique dispose de cette fonctionnalité, un fichier informatique peut être envoyé à un destinataire grâce au client de messagerie électronique en faisant glisser l'icône du fichier informatique sur l'icône du destinataire ; # un nouveau contact est créé dans l'arborescence du Shell en effectuant un clic droit sur le bureau ou dans une fenêtre d'Explorer puis en sélectionnant l'entrée nouveau contact dans le menu contextuel ; # l'utilisateur supprime un contact en cliquant avec le bouton droit de la souris sur l'icône du contact dans le Shell puis en choisissant supprimer dans le menu contextuel, ou bien en faisant glisser drag&drop l'icône du contact dans la corbeille. Il existe deux types d'icônes représentant chacun un type de contact : # les contacts non privilégiés sont représentés par une icône anonyme (icône de type -i-) comme celle de Mr Shadow dans la figure 1 ; # les contacts privilégiés qui sont représentés par des icônes colorées représentant des personnages ou d'autres concepts (icône de type de -ii-), qui sont choisis par l'utilisateur. L'icône du contact est choisie par l'utilisateur en effectuant un clic droit sur une icône anonyme puis en sélectionnant l'entrée modifier l'icône dans le menu contextuel. Les familles sont représentées par une icône telle que l'icône de smiley de la figure 1. L'intégration au Shell est effectuée de plusieurs façons : # quelques icônes de contacts (à priori les plus importantes) sont placées sur le bureau qui sont créées soit en effectuant un drag and drop d'une famille vers le bureau soit en effectuant un clic droit sur le bureau puis en sélectionnant l'entrée nouveau contact dans le menu contextuel. Ces icônes sont gérées grâce à des Shell Extensions ; # les icônes sont aussi organisées en famille, gérées grâce à un Namespace Extension nommé Mes Contacts qui reflète l'état du Roster (carnet d'adresse des contacts et familles). L'arborescence de Mes Contacts est placée dans l'arborescence d'Explorer au même titre que Poste de Travail , la corbeille ou d'autres éléments du Shell. Le Shell propose également une organisation virtuelle de ses divers objets. Cette organisation est l'arborescence qu'on voit dans la partie gauche de l'Explorateur de fichiers : on l'appelle le Namespace du Shell. La racine du Namespace du Shell, ou Shell Namespace en anglais, est le bureau ( desktop ). D'une manière générale, tous les n#uds de cette arborescence qui contiennent d'autres n#uds sont appelés Folders. Les feuilles de l'arborescence sont appelées Items. En particulier, dans le cadre du Shell Namespace, les répertoires du système de fichiers sont des Folders, et les fichiers sont des Items. Parmi les Folders du Shell, on trouve aussi le Poste de Travail, le Panneau de Configuration, le dossier Imprimantes, le Planificateur de Tâches... Quelques exemples d'Items sont les imprimantes, les applets du panneau de configuration ou encore les tâches planifiées. Seuls les Folders apparaissent dans la partie gauche de Windows Explorer. Cette organisation ne correspond pas à l'organisation des fichiers du disque. Il s'agit d'une arborescence virtuelle mise en place par le Shell, qu'il est possible d'étendre avec ce qu'on appelle les Namespace Extensions , qui rajoutent des Folders dans le Shell. Ainsi, par exemple, le Poste de Travail est un Namespace Extension qui insère dans l'arborescence du Shell l'ensemble des fichiers et répertoires des disques de l'ordinateur. Les Namespace Extensions sont des plug-ins qu'Explorer (explorer. exe est le nom du programme qui crée le Shell de Windows, et par extension, le Shell s'appelle Explorer) charge lors de son démarrage, et à qui il demande d'afficher le contenu des Namespace Extensions qu'ils proposent. Ces plug-ins doivent être implémentés sous forme de composants COM. Les Shell Extensions sont des extensions du Shell qui permettent de modifier certaines propriétés du Shell. En particulier, les Shell Extensions permettent de modifier les menus contextuels du Shell, les icônes d'une classe de fichier, ou de gérer les propriétés de drag&drop d'un objet du Shell vers un autre objet du Shell. Les Namespace Extensions et les Shell Extensions sont des objets COM implémentant un certain nombre d'interfaces imposées par le Shell. Ainsi, le Shell sait comment utiliser les objets qu'il charge en tant que Namespace Extensions, car ceux-ci remplissent les conditions d'un contrat prédéterminé, c'est-à-dire qu'ils implémentent des interfaces bien connues. Créer un Namespace Extension revient donc à implémenter des interfaces spécifiées par le Shell. Voici une liste non exhaustive des interfaces requises pour implémenter un Namespace Extension : IShellFolder est la principale interface à implémenter pour créer un Namespace Extension : il s'agit de l'interface qui fait d'un objet un Folder du Namespace. Le Shell passe par cette interface pour demander des renseignements sur les objets (au sens du Shell) que contient le Folder. IShellView l'affichage des objets contenus dans le Folder est géré par un objet implémentant l'interface IShellView. Un objet implémentant IShellView est responsable de l' affichage des données dans la partie droite de l'explorateur, celle qui affiche habituellement les fichiers sous forme d'icônes, grandes ou petites, ou même sous forme de liste détaillée. Ainsi, Explorer met à disposition la partie droite de sa fenêtre aux objets IShellView, seuls capables d'afficher convenablement le contenu de leur IShellFolder associé. IExtractIcon : Explorer affiche une icône pour chaque objet du Shell. Etant donné qu'il ne sait pas quelle icône choisir pour un objet précis (seul le créateur de cet objet sait quelle icône utiliser), le Shell propose l'interface IExtractIcon qui lui permet de récupérer l'icône d'un objet implémentant cette interface. Les trois interfaces IDropSource, IDropTarget, IDataObject sont les interfaces clés pour les opérations de drag and drop . Un objet IDropSource détermine le comportement visuel d'une opération de "drag and drop". L'objet IDropTarget, lui, détermine le comportement du destinataire de l'opération de "drag and drop". Enfin, IDataObject représente un objet encapsulant les données à transporter lors de l'opération de "drag and drop". Cet objet sera passé de la source à la destination du "drag and drop". C'est en inspectant cet objet que le destinataire détermine s'il est capable de gérer les données qu'on dépose sur lui. EnsShell est un serveur COM implémenté dans une DLL ( Dynamic Link Library ), qui contient tous les objets du procédé selon l'invention relatifs à son intégration au Shell. Voici la liste des objets COM implémentés dans EnsShell pour créer des Namespace Extensions (les familles) : Pour chaque nom de classe donné, le nom de l'interface COM qu'il implémente est indiqué entre parenthèses. CFamilyShellFolder (IShellFolder) représente aux yeux du Shell une famille d'éléments du Roster. Il fournit au Shell tous les objets annexes dont ce dernier a besoin pour afficher chacun des éléments contenus dans la famille. Par ailleurs, il crée et renvoie au Shell des instances de CFamilyShellFolder qui représentent les sousfamilles (c'est ainsi que le Shell permet à l' utilisateur de "naviguer" dans les Namespace Extensions : chaque IShellFolder doit pouvoir renvoyer une nouvelle instance de IShellFolder représentant l'un de ses sous-folders). Ces objets sont décrits ci-après. CFamilyShellView (IShellView) affiche dans la partie droite de la fenêtre d'Explorer, les contacts et les sous-familles contenues dans la famille sélectionnée. L'affichage, tout comme pour les fichiers, se fait au moyen d'une liste ( listview ) qui peut afficher les éléments sous diverses formes (grandes icônes, petites icônes, détails, etc.). CFamilyEnumIDList (IEnumIDList) est l'objet qui énumère tous les sous-objets contenus dans un CFamilyShellFolder. Le Shell utilise des PIDLs, des identifiants dont la structure est laissée à la charge du fournisseur du Namespace Extension, pour identifier chaque élément d'un IShellFolder. Donc, lorsqu'il souhaite avoir la liste des sous-éléments d'un IShellFolder, le Shell demande à celui-ci de lui fournir un objet de type IEnumIDList, qui va énumérer les PIDLs de tous les sousobjets. Une fois muni de ces PIDLs, le Shell s'en servira pour demander au IShellFolder associé plus de détails sur chacun des éléments. Ainsi, le CFamilyEnumIDList permet d'énumérer les PIDLs de tous les contacts et sous-familles appartenant à une famille associée à un CFamilyShellFolder. CRosterObjectExtractIcon (IExtractIcon et IPersistFile) se charge de fournir une icône pour un objet du Roster donné. Le Shell, une fois qu'il a le PIDL d'un élément d'un CFamilyShellFolder, demande à ce dernier un objet IExtractIcon qui lui fournira l'icône de cet élément. Un objet de type CRosterObjectExtractIcon sait quelle icône associer à un élément précis du Roster. CFamilyDropTarget (IDropTarget) est responsable de la réception d'un élément par opération de drag and drop . Plus précisément, on associe un élément graphique de Windows (comme une fenêtre ou un élément particulier d'une liste) avec un objet de type IDropTarget. Ce dernier, lorsque le Shell détecte qu'une opération de drag and drop va être effectuée sur l'élément graphique donné auparavant, est sollicité pour savoir d'une part s'il accepte l'opération de drop (il doit pour cela déterminer les données qu'on lui apporte, celles-ci dépendant de la source du drag and drop ) et d'autre part de gérer l'opération de Drop , c'est-à-dire d'incorporer convenablement les données du Drop . Un CFamilyDropTarget est associé à une famille précise du Roster, et ne peut recevoir que des contacts ou d'autres familles (il ne peut recevoir de fichiers ou d'autres types de données). Lorsqu'on "droppe" des contacts ou des familles, ceux-ci sont ajoutés à la famille associée. CContactDropTarget (IDropTarget et IPersistFile) est responsable de la réception d'un drag and drop sur une icône représentant un contact (les contacts sous forme d' items de la CFamilyShellView d'une famille mais aussi les contacts sur le bureau). A la différence des familles, les contacts ne peuvent, eux, pas recevoir d'autres contacts ou d'autres familles. En revanche, ils peuvent recevoir des fichiers, ce qui a pour effet d'envoyer ces fichiers (si le client de messagerie électronique dispose de cette fonctionnalité) au contact représenté par l'icône. CFamilyListDropTarget (IDropTarget) utilise deux objets des deux classes précédentes pour gérer le drag and drop sur une liste d'objets du Roster. En fonction de la nature (contact ou famille) de l'élément sur lequel on passe avec la souris, il fait entrer en jeu l'un ou l'autre objet pour simuler le comportement correct. CRosterObjectDataObject (IDataObject) est le moyen qu'utilise le Shell pour transférer des données via le "drag and drop", mais aussi via le presse-papier. Un IDataObject encapsule les données à transporter, et peut les proposer dans différents formats, et via différents supports. C'est à la source du "drag and drop" de déterminer quels formats et quels supports le IDataObject envoyé doit proposer. Un object CRosterObjectDataObject contient, comme son nom l'indique, des objets du Roster, et il est capable de les proposer sous forme de texte (en donnant le nom des objets, un nom sur chaque ligne), sous forme de fichiers (afin de pouvoir les conserver de manière persistante) et aussi sous un format propriétaire, connu du CFamilyDropTarget, afin de pouvoir gérer l'organisation du Roster par opérations de drag and drop. CRODOEnumFormatETC (IEnumFORMATETC) est, à l'instar du IEnumIDList, un objet qui permet d'énumérer les formats proposés par un IDataObject. Le CRODOEnumFormatETC énumère les formats proposés par un CRosterObjectDataObject. CBasicDropSource (IDropSource) est chargé de fournir le feedback visuel à l'utilisateur durant une opération de "drag and drop". Principalement, cet objet modifie l'aspect du curseur selon que l'opération de "drag and drop" est une copie d'objets, un déplacement d'objets, ou si l'opération n'est pas autorisée. Comme son nom l'indique, cet objet est très simple. CContextMenu (IContextMenu et IShellExtInit) est chargé d'afficher un menu contextuel personnalisé lorsque l'utilisateur effectue un clic droit sur l'icône d'un contact ou d'une famille. Les icônes du bureau sont de véritables fichiers, qui appartiennent au système de fichier. Ces fichiers ont une extension particulière .enetshare ainsi que le GUID 64E7202A-A507-4cal-82D8-800B1DBB8780. Le fichier contact contient le GUID de l'objet du Roster qu'il désigne ainsi qu'un objet CRosterObject sérialisé. De cette façon, en lisant le contenu du fichier et en le désérialisant, on sait exactement quel contact il représente, quelle est son icône,... Pour que le Shell sache comment réagir par rapport aux fichiers contacts, nous incluons dans la base de registre dans la clé \HKEY~CLASSES~ROOT\ l'ensemble des informations dont le Shell a besoin pour savoir comment réagir. Pour que l'extension .enetshare soit masquée par le Shell, nous utilisons la clé NeverShowExt . Pour indiquer au Shell comment afficher l'icône du contact, nous insérons une clé IconHandler dans la sous-clé ShellEx dans laquelle nous indiquons le CLSID de la classe CRosterObjectExtractIcon. La classe CRosterObjectExtractlcon (voir paragraphe précédent) implémente IExtractIcon et IPersistFile. Pour indiquer au Shell comment gérer le drop d'un fichier sur l'icône d'un contact, nous insérons une clé DropHandler dans laquelle nous indiquons le CLSID de la classe CContactDropTarget qui implémente IDropTarget et IPersistFile. Pour indiquer au Shell comment afficher un menu contextuel lorsqu'un utilisateur effectue un clic droit sur un contact, nous insérons une clé ContextMenuHandlers dans laquelle nous indiquons le CLSID de la classe CContextMenu qui implémente IContextMenu et IShellExtInit. Pour indiquer au Shell comment traiter le double clic sur l'icône d'un contact, on indique quel est le programme qui doit être exécuté lorsqu'on effectue le double clic : on indique le chemin de Enetshare.exe (l'application principale) avec le fichier du contact comme argument. Lorsque l'application reçoit cette ligne de commande, elle extrait l'objet CRosterObject sérialisé et effectue ensuite des opérations appropriées. HKCR enetshare = s 'enetsharefile' enetsharefile DefaultIcon = s '%%1' // l'extension .enetshare est masquée val NeverShowExt = s '' Shell // reaction au double clic Open Command = s 'C:\Program Files\Enetshare\Bin\Enetshare. exe %%il ShellEx // IconHandler pour la gestion des icônes. // On renseigne le GUID de la //classe CRosterObjectExtractIcon IconHandler = s '{4FF4526D-D226-4AD6-92FE- 050D4644E5FB}' // DropHandler pour la gestion du drag and drop // de fichiers sur un contact. // On renseigne le GUID de la classe CContactDropTarget DropHandler = s '{D29BOCEO-F10F-4167-9F2F- 7CBCD4EF04F1}' // ContextMenuHandler pour la gestion des menus // contextuels. On renseigne le GUID de la classe // CContextMenu ContextMenuHandlers=s'{C4F74BB0-C7BA-4f64BECC-9D4B8FE6BOF8}' } } } HKLM { Software { Microsoft { Windows { Current Version { ShellExtensions { Approved { {64E7202A-A507-4cal-82D8-800BlDBB8780} = s 'Enetshare Contact Icon' } } } } } Le rôle de l'application principale (Enetshare. exe) du logiciel selon l'invention est : - de charger l'arborescence des contacts et des familles à partir d'un fichier XML, et d'informer EnsShell ; - de gérer l'organisation des familles et des contacts ; - de sauvegarder dans le fichier XML les modifications effectuées sur les familles et les contacts ; - d'envoyer des évènements au client de messagerie électronique , et en particulier de provoquer l'ouverture de la fenêtre de message à destination du ou des contacts. Le Roster est le carnet d'adresses de l'utilisateur du logiciel selon l'invention. Il s'agit d'une structure de données dans laquelle sont placés les contacts et les familles de l'utilisateur. Une instance du Roster existe en mémoire, gérée par l'application principale du logiciel conforme à l'invention. Le Roster possède quelques propriétés importantes : # le Roster est géré de manière à ce que l'utilisateur puisse organiser ses contacts de manière logique. L'utilisateur peut regrouper ses contacts en familles, et une famille peut contenir des sous-familles ; # l'utilisateur peut placer un contact dans deux familles distinctes. Par exemple, un utilisateur du logiciel conforme à l'invention qui travaille avec son frère peut avoir ce contact dans la famille "Famille" et aussi dans la famille "Collègues". L'utilisateur peut donner des noms différents à un contact en fonction de la famille dans laquelle ce contact se trouve ; # si un contact est présent dans deux familles différentes, toute modification doit être répercutée au niveau des deux exemplaires du contact. Ceci permet à l'utilisateur d'avoir l'impression qu'il n'existe véritablement qu'un "objet" contact représentant une personne et qu'il s'agit bien du même objet, quel que soit l'endroit où cet objet apparaît ; # les informations contenues dans le Roster ne doivent pas être dupliquées, afin d'éviter tout problème d'incohérence : s'il existe plusieurs instances du Roster, il devient difficile de répercuter tous les changements sur toutes les instances en même temps, en particulier si les différentes instances sont modifiées par des processus concurrents. L'utilisateur peut avoir dans son Roster des contacts, pour lesquels il a spécifié au moins une icône, et des anonymes, qui sont des contacts dont il ne connaît que l'adresse e-mail. Les contacts, les anonymes et les familles sont les trois types d'objets qu'on peut trouver dans le Roster. Ces objets sont manipulés grâce aux trois classes CRosterContact, CRosterAnonymous et CRosterFamily qui dérivent toutes d'une classe commune : CRosterObject (voir la figure 2). Chaque objet du Roster possède un identifiant, et presque toutes les opérations du Roster qui ont besoin d'identifier un objet précis dépendent d'un tel identifiant. Le contenu d'un objet du Roster est identifié par un GUID. Les familles, qui sont elles-mêmes des objets du Roster, contiennent une liste de liens, chaque lien étant une paire nom/GUID. Ainsi, chaque lien renvoie à un autre objet du Roster (celui dont le GUID correspond au GUID donné par le lien), et dans cette famille, le nom de cet objet est celui donné par le nom du lien. Grâce à ce système de liens, on peut avoir un même objet à plusieurs endroits du Roster, avec un nom différent suivant l'endroit où il se trouve, la manière dont l'utilisateur souhaite identifier le contact pouvant changer selon le contexte. La figure 3 illustre ce cas. Dès lors que le Roster est présenté sous forme d'arborescence, dans laquelle aucune famille ne peut contenir deux éléments portant le même nom, il est possible d'identifier une occurrence d'un objet en donnant la suite de noms qui permet d'y accéder \Collègues\Recherche\Pierre est une occurrence du contact représentant une personne dénommée Pierre qui est classée dans la sous-famille Recherche de la famille Collègues, elle-même située à la racine du Roster. Ce type de chemin est appelé FQN, ou 'Fully Qualified Name', dans l'application conforme à l'invention (voir la figure 4). Il s'agit d'un moyen d'identifier une occurrence d'un objet. Si on souhaite renommer l'objet dans cette famille, ou si l'on désire supprimer cette occurrence, il faut alors utiliser le FQN de l'objet, le seul identifiant de l'objet ne suffisant plus. Le Roster prévoit une opération de résolution de FQN qui renvoie le GUID de l'objet identifié par le FQN donné. Le Roster est sauvegardé dans un fichier entre deux utilisations du procédé selon l'invention. Ce fichier est un fichier XML dont la syntaxe est simple. Le fichier suivant illustre bien ce que sont les différents objets du Roster, ce qu'ils contiennent et quels sont les liens entre eux. jean.martin@enetshare.com Jean Martin 102 paul.legrand@enetshare.com Paul Legrand 101 julien.adam@cryptolog.fr Julien Adam 104 baboonette@netcourrier.fr Elizabeth Chancel 103 no.name@nowhere.com Mr. E 105 Cet exemple montre un Roster contenant 9 objets, le type de l'objet étant identifié par le nom du tag XML qui le définit : Contact, Family ou Anonymous. Le tag XML Id est l'identifiant permettant de contacter le contact à l'aide du client de messagerie électronique (l'identifiant est par exemple l'adresse e- mail) La famille identifiée par le numéro Oefb6b6bb332-42d9-888b-0703e218d6c3 est particulière : en effet, il s'agit du numéro de la famille racine du Roster. Notons que l'objet a44c3140-5cOc-4b4a-ac87- 35cd491b7f9f (le dernier contact du fichier n'est pas atteignable) car il n'est référencé dans aucune famille. Il s'avère difficile d'empêcher l'utilisateur d'effectuer une manipulation malheureuse qui rendrait inaccessible un ou plusieurs objets. La dernière propriété, qui veut que les données ne soient pas dupliquées implique que le Namespace Extension (i. e. la DLL EnsShell) communique avec l'application principale, qui est le seul processus instanciant le Roster (aucun autre processus n'a le droit de construire le même Roster en mémoire). Etant donné que c'est l'application principale qui détient le Roster mais que c'est dans Explorer que l'utilisateur effectue les manipulations, il est nécessaire de ne pas seulement transmettre des données entre les deux processus, mais aussi des instructions du type "l'objet x a été déplacé dans la famille y" ou "un lien vers l' objet x a été créé dans telle famille y et porte le nom z". Lorsque l'utilisateur effectue une manipulation dans le Roster, par exemple à l'aide du "drag and drop", EnsShell envoie l'instruction correspondant à l'application principale du logiciel (Enetshare. exe) conforme à l'invention, qui modifie le Roster, après quoi l'application principale peut renvoyer le nouvel état du Roster à EnsShell. Une utilisation transparente du Roster, indépendante du processus où l'appel est effectué est obtenue grâce à l'utilisation de la hiérarchie de classes représentée Figure 5. L'interface commune CRosterAPI est le principal ingrédient dans l'utilisation identique du Roster quel que soit le processus. Il suffit simplement de choisir une implémentation de cette interface pour utiliser ou non la communication IPC ( interprocess communications ). La classe CExternalRosterAPI implémente cette interface en utilisant la communication IPC, alors que la classe CLocalRosterAPI manipule directement l'appel du Roster par appels de méthodes de la classe CRoster. Mis à part le coût lié à la communication IPC, les deux implémentations sont strictement équivalentes, produisent les mêmes résultats et génèrent les mêmes erreurs (exceptions) en cas d'échec. L'unité de base de transmission de l'information entre les différents processus est le CMessage. Il s'agit d'un conteneur associatif, couplant une clé sous forme de chaîne de caractères avec des données de divers types. Voici un exemple de CMessage contenant un entier nommé valeur, une chaîne nommée nom et une valeur de vérité (un booléen) nommée important : CMessage message; message.AddInt("valeur", 12); message.AddString("nom", "Colis"); message.AddBool("important", false); On peut ainsi véhiculer plusieurs valeurs, et de plusieurs types différents. Grâce à la sérialisation d'objets, il est même possible d'y inclure des objets sérialisés, ce qui implique qu'on peut inclure un message dans un autre message, les objets CMessage étant eux-mêmes serialisables : CMessage conteneur; conteneur.AddSerializedObject("message", message.Serialize()); Un message est envoyé à un destinataire : une boîte à messages. La classe CMessageBox joue le rôle de boîte à message. L'objectif est le suivant : créer un destinataire qui soit unique et visible à travers tout le système. Les CMessageBox sont nommés, et le nom d'un objet CMessageBox est unique à travers tout le système. Grâce à ce nom, un processus peut retrouver la boîte à messages d'un autre processus, et lui envoyer un message. Par exemple, si un processus a créé une boîte s'appelant MaBoite, on peut lui envoyer un message de la façon suivante : CMessage message; message.AddString("instruction", "quitter"); message.SendTo("MaBoite"); Lors de la réception du message, la classe CMessageBox utilise une autre classe, CMessageReceiver, pour prévenir de la réception d'un message. Cette seconde classe est en réalité une interface qui ne possède qu'une méthode, comme le montre la définition suivante : class CMessageReceiver { public: void MessageReceived(CMessage& message, CMessage& reply) = 0 ; }: Une classe qui souhaite recevoir des messages doit alors dériver de cette interface, implémenter la méthode MessageReceived() et se déclarer à la CMessageBox comme récepteur pour pouvoir réagir à l'arrivée d'un message. Plusieurs récepteurs peuvent recevoir les messages arrivant à une CMessageBox. Dans la méthode MessageReceived, le premier argument est le message reçu, le second est un message vierge créé par la CMessageBox et qui sera renvoyé à l'expéditeur du message une fois que tous les récepteurs auront été informés du message. De cette manière, chaque récepteur peut mettre sa réponse dans le message reply. La boîte de message est implémentée grâce à une fenêtre invisible, dont le nom est celui de la boîte de message. Windows permet d'énumérer les fenêtres présentes dans le système, ce qui permet de trouver le Handle de la fenêtre (son identifiant). Lorsqu'on envoie un message à une CMessageBox, on commence par sérialiser le message, puis on envoie les octets à la fenêtre grâce au message WM~COPYDATA. Lorsque la fenêtre reçoit ce message, elle effectue les trois opérations suivantes : # Elle désérialise le message, # Elle passe ce message à tous les récepteurs enregistrés, avec un second message de réponse, vierge celui-ci. # Elle renvoie la réponse à l'expéditeur. Le renvoi de la réponse n'est pas effectué de la même façon que l'envoi du message. La solution retenue utilise une zone de mémoire partagée (au sens de Windows). Il s'agit d'une partie du fichier d'échange de mémoire virtuelle, dans lequel des processus distincts peuvent lire ou écrire des données. Ainsi, le récepteur crée la zone de mémoire partagée, la remplit avec les données de la réponse sérialisée, et informe l' expéditeur que la réponse a été postée dans cette zone de mémoire. Le récepteur lit alors la zone de mémoire partagée, désérialise la réponse, et peut dès lors réagir correctement en fonction de la réponse. Nous utilisons la classe CSerializable, une classe abstraite (interface) qui ne contient qu'une méthode Serialize() renvoyant un objet de type CSerializedObject. Ce dernier est un objet qui gère la mémoire requise pour stocker les octets issus de la sérialisation (allocation, désallocation et nombre d'octets). Ainsi, tout objet qui peut être sérialisé dérive de CSerializable, afin de pouvoir être utilisé de manière uniforme. De même, tout objet sérialisable possède un constructeur de désérialisation, qui prenne en argument un CSerializedObject. Ici, la sérialisation est utilisée principalement pour la transmission d'objets de l'application principale (Enetshare. exe) vers EnsShell, ou inversement. Elle est également utilisée pour stocker un contact sur le bureau, le contact étant stocké sous forme d'un fichier contenant les données sérialisées de ce contact (ce qui implique que la classe CRosterContact est sérialisable. En réalité, c'est la classe CRosterObject qui est sérialisable, et par héritage, toutes les sous-classes le sont aussi). L'invention est décrite dans ce qui précède à titre d'exemple. Il est entendu que l'homme du métier est à même de réaliser différentes variantes de l'invention sans pour autant sortir du cadre du brevet. REVENDICATIONS 1. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique, comportant : # une étape consistant à créer l'objet informatique raccourci dans le Shell du système d'exploitation, caractérisé en ce qu'il comporte en outre # une étape consistant à faire pointer l'objet informatique raccourci vers un fichier informatique, ledit fichier informatique contenant des informations sur une ou un groupe de personne(s) physique(s) et notamment un (ou des) identifiant(s) permettant de contacter cette (ou ce groupe de) personne (s) par un système de messagerie électronique ; # une étape consistant à associer à l'objet informatique raccourci une icône dans le Shell représentant graphiquement la ou le groupe de personne (s) physique(s) ; # une étape consistant à lancer un client de messagerie électronique, en prenant en compte les informations contenues dans le fichier informatique vers lequel l'objet informatique raccourci pointe, lors de la sélection de l'objet informatique raccourci par un utilisateur. 2. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce qu'il est mis en #uvre sur un ordinateur. 3. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce qu'il est mis en #uvre sur un assistant personnel (PDA). 4. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce qu'il est mis en #uvre sur un téléphone portable numérique. 5. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce que le client de messagerie électronique est un client de courrier électronique [e-mail]. 6. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce que le client de messagerie électronique est un client de messagerie instantanée. 7. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce que le client de messagerie électronique est un client de messagerie pour téléphones mobiles numériques conforme à la norme SMS ou MMS. 8. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce que le client de messagerie électronique utilise un canal de transmission de la voix sur IP. 9. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 1, caractérisé en ce que le client de messagerie électronique utilise un canal de transmission de vidéo. 10. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une au moins des revendications précédentes, caractérisé en ce que l'icône représentant la ou le groupe de personne (s) est modifiable par un utilisateur. 11. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une au moins des revendications précédentes, caractérisé en ce qu'un menu contextuel apparaît lorsqu'un utilisateur effectue un clic-droit sur l'icône de l'objet informatique raccourci. 12. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une au moins des revendications précédentes, caractérisé en ce que l'action par un utilisateur de faire glisser sur l'icône dudit objet informatique raccourci un fichier informatique destiné à être envoyé, déclenche l'envoi dudit fichier informatique destiné à être envoyé vers la ou le groupe de personne(s) physique (s) associée (s) à l'objet informatique raccourci. 13. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une au moins des revendications précédentes, caractérisé en ce que ladite étape consistant à créer l'objet informatique raccourci dans le Shell du système d'exploitation et ladite étape consistant à faire pointer l'objet informatique raccourci vers un fichier informatique se réalisent de façon simultanée par une action d'un utilisateur dans un logiciel de messagerie électronique. 14. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une au moins des revendications précédentes, caractérisé en ce que la sélection de l'objet raccourci par un utilisateur s'effectue par un double- clic gauche sur l'icône de l'objet raccourci. 15. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 11, caractérisé en ce que la sélection de l'objet informatique raccourci par un utilisateur s'effectue en choisissant une entrée déterminée dans ledit menu contextuel. 16. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une au moins des revendications précédentes, caractérisé en ce que la sélection d'un groupe de personnes physiques entraîne l'affichage, dans une fenêtre graphique affichant les éléments du Shell, des éléments représentant les personnes physiques ou les sousgroupes de personnes physiques appartenant au groupe de personnes physiques, ces éléments ayant des propriétés similaires aux propriétés des objets informatiques raccourcis. 17. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 16, caractérisé en ce que l'action de faire glisser un objet informatique raccourci, conforme au procédé de l'invention, du Shell vers la fenêtre graphique entraîne la disparition de l'objet informatique raccourci du Shell et la création dans la fenêtre graphique d'un élément représentant la ou le groupe de personne (s) sur laquelle/lequel on trouve des informations dans le fichier informatique sur lequel l'objet informatique raccourci pointe. 18. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon la revendication 16, caractérisé en ce que l'action de faire glisser un élément de la fenêtre graphique vers le Shell entraîne la disparition de l'élément de la fenêtre graphique et la création dans le Shell d'un objet informatique raccourci, conforme à l'invention, pointant vers un fichier informatique contenant des informations vers la personne physique ou le sous-groupe de personnes physiques que représente l'élément. 19. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une des revendications précédentes, caractérisé en ce que l'action de faire glisser un objet informatique raccourci, conforme au procédé de l'invention, entraîne un déplacement dans le Shell de l'objet informatique raccourci. 20. Procédé permettant de fournir un objet informatique raccourci pointant vers un fichier informatique selon l'une des revendications précédentes, caractérisé en ce que le contenu du carnet d'adresses du Shell est identique au contenu du carnet d'adresses du client de messagerie électronique.