Comme beaucoup de personnes qui commencent la programmation, on commence par de petits programmes simple comme "hello world" puis un peu plus gros avec une calculatrice, puis un carnet d'adresse,... jusqu'à de gros projets bien plus ambitieux. Ici, je vais vous présenter mon carnet d'adresse qui se voulait simple d'utilisation mais qui offrait tout de même quelques fonctionnalités intéressantes.
Pour l'interface graphique j'utilise le framework Qt car il est très puissant et pourtant assez simple d'utilisation. Il se paye le luxe en plus d'être très bien documenté alors pourquoi se priver? Nous voyons donc sur mon carnet d'adresse une liste à droite qui correspond aux groupes de contacts. On peut évidemment les éditer, en rajouter et en supprimer. A droite, nous avons la liste de contact qui correspond au groupe sélectionné et les informations qui y figurent sont paramétrables, c'est à dire, que l'on peut sélectionner les informations à afficher ou désafficher en faisant un clic droit sur la barre du tableau. On peut aussi déplacer des contacts dans un autre groupe en faisant un drag&drop ou via les menus. Regardons donc maintenant comment on créer un nouveau contact! Pour celà, vous l'aurez deviné, on clique sur le bouton "Nouveau" ou bien, on fait appel au menu contextuel de la liste de contacts et voilà ce qui s'affiche.
Nous avons donc une boite de dialogue comportant 3 onglets représentants en quelque sorte 3 niveaux d"informations du contact, en premier lieu : les informations personnelles, puis les informations privée et professionnelle. Tous les contacts sont ensuite enregistrés dans un simple fichier comportant les classes sérialisées avec leur hash afin de vérifier à l'ouverture du programme que le fichier n'a pas été corrompu. L'image ci-dessous montre le contenu du menu "fichier", on voit que l'on peut importer des contacts (csv, format inventé .ls ou format MAB). Le format MAB est utilisé par Thunderbird et j'en parlerai un peu plus bas.
Vous avez surement vu que l'on pouvez imprimer via ce menu... mais que peut-on imprimer me direz vous? En fait, en sélectionnant un groupe et en faisant une impression, le programme créé auparavant un tableau comportant des informations préselectionnées par mes soins (en effet, on ne peut pas mettre toutes les informations dans le tableau, une feuille A4 même en format paysage ne suffirait pas) puis affiche la fameuse boite de dialogue d'impression. Le menu "edition" permet de modifier les contacts mais aussi de les déplacer comme pour le drag&drop, le menu "affichage" permet d'afficher ou de désafficher la toolbar. Le menu "outils" lui contient le sous menu exportation qui ouvre la boite de dialogue ci-contre:
En fonction du type d'export choisi, la boite de dialogue devait permettre à l'utilisateur de choisir les groupes de contacts concernés mais aussi les informations à exporter, seulement je n'ai pas continuer plus loin et ce sont donc des
paramètres prédéfinis quelque soit l'export pour le moment. Qui sait, peut-être qu'un jour je le continuerai!
Il y a une dernière fonctionnalité dont il me faut parler, il s'agit de la synchronisation avec les contacts Thunderbird. Actuellement, elle est transparente pour l'utilisateur car elle s'effectue à chaque redémarrage du programme en allant chercher
le fichier de donnée de Thunderbird et ces contacts sont affichés dans le groupe nommé "Contacts Thunderbird" (très original n'est-ce pas?). Pour réussir cette fonctionnalité il m'aura fallu beaucoup de temp car le format de fichier utilisé par Thunderbird
est assez peu utilisé et est même humainement peu compréhensible contrairement à du XML ou éventuellement du JSON quand on prend le soin de faire les sauts de ligne et l'indentation évidemment. Heureusement, il existait un parser créé par une personne
tierce afin de récupérer les informations de ce type de fichier mais sans aucune documentation si ce n'est le code lui même. Il m'aura donc fallu faire un peu de reverse engineering et surtout de beaucoup de tests pour l'utiliser correctement.
Même si je m'engage dans une pente glissante, je vais tenter d'expliquer comment fonctionne un fichier MAB (ou mork):
Pour commencer, voilà à quoi ça ressemble (et encore il n'y a qu'un contact et pas toutes les informations renseignées!) :
Comme vous le voyez c'est assez imbuvable... Alors comment ça fonctionne? Et bien au début du fichier se trouve ce qui ressemble à une table de correspondance par exemple : B8 correspond à l'élément LastModifiedDate non utile
pour mon programme mais qui permet tout de même de savoir si le contact à été modifié récemment. Si l'on descend plus bas après la chaine de caractère suivante : @$${1{@, on commence enfin à avoir les données des contacts. C'est
très ressemblant du tableau de correspondance mais ne nous y trompons pas, il ne suffit pas de se dire que 81 correspond à mon nom entier comme on pourrait le croire car dans le tableau de correspondance 81 fait référence à un tout
autre élément! Alors quoi? Comment on récupère les données dans l'ordre? Et bien en fait, dans le second paragraphe après les caractères {-1:^80 {(k^BC:c)(s=9)} nous avons une sorte de table de correspondance qui va nous permettre
de remettre les choses dans l'ordre. Nous avons donc une série d'éléments entre parenthèses comme ceci : (^87^81) ou bien (82=). La première parenthèse m'indique que l'élément 87 du contact correspond à l'élément 81 du
tableau de correspondance! Enfin, on peut récupérer le nom complet! Mais le second? Alors lui il indique juste que l'élément 82 du tableau de correspondance n'est pas renseigné! Drole de façon de gérer les données n'est-ce pas? Surtout que
pour courronner le tout, le tableau de correspondance de chaque contact est différent! Je ne vous raconte pas le nombre d'heures que j'ai passé à comprendre le système et surtout à l'interfacer avec mon logiciel!
En tout cas ce fut un plaisir d'y parvenir!
Voilà les sources du programme pour ceux que ça intéresse
