iCal et 4D

Dave DELL'AQUILA

En combinant la puissance de 4D et le format standardisé de iCal, vous êtes en mesure de proposer des solutions qui seront compatibles avec beaucoup d'applications. La possibilité de lire des fichiers iCal publiés signifie, qu'en plus importer ces documents, 4D peut tout simplement être contrôlé par iCal en mettant sur pied des mécanismes basés sur les noms des événements. ♪

- Titre : iCal et 4D

- Auteur : Dave DELL'AQUILA

- Parution : 1 mai 2004

- Licence : Ce document est issu de https://www.developpez.comet reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- I. Introduction

- II. Résumé

- III. Publier ses données iCal

- La solution .Mac

- La solution serveur Web

- IV. Configurer 4DWebStar en tant que serveur WebDAV

- V. 4D et iCal

- VI. Du parsing avec 4e Dimension

- VII. Publier un calendrier depuis 4D

- VIII. La base exemple

- IX. Tout est possible !

- X. Bases exemples

I - Introduction

La dernière décennie a vu l'explosion de l'usage des calendriers et autres agendas électroniques. Cependant, la croissance à long terme de ces technologies est bridée, au niveau de l'Internet, par l'absence d'un standard fixant la forme du contenu de ces messages.

II - Résumé

L'application iCal est disponible http://www.apple.com/fr/ical/ depuis MacOS 10.2. iCal répond aux besoins d'informer sur des dates d'anniversaire, événements récurrents, fixer des échéances ou planifier des réunions. Tous les contacts de votre carnet d'adresses MacOS X peuvent recevoir le rappel d'un événement iCal via un message par email posté par l'application Mail de MacOS X. iCal simplifie la publication et son partage en ligne avec, au choix, la solution Apple dénommée .Mac ou des solutions tierces telles les serveurs WebDAV. iCal stocke ses fichiers au standard iCalendar (.ics), format en cours dans le calendrier Mozilla. Vous pouvez donc vous inspirer de code existant depuis longtemps pour lire et analyser les fichiers .ics et les intégrer à votre base.

- Des calendriers multiples
Garder la trace du planning des collègues, amis ou de qui vous voulez n'a jamais été aussi aisé. Qui partage un même compte utilisateur d'un ordinateur peut créer son calendrier et voir celui des autres, individuellement ou collectivement.

- Partager des calendriers
iCal peut aussi être partagé s'il est publié sur le réseau Internet. Ainsi, les personnes qui ne sont pas sur votre machine ont accès à vos informations. En publiant sur .Mac, les autres personnes peuvent les voir à l'aide d'un navigateur classique.
Il est également possible d'ajouter à votre liste des calendriers publiés sur le web : il suffit de s'y abonner.

- Simplicité de mise à jour entre ordinateurs ou équipements.
Si vous gérez plusieurs calendriers sur plusieurs ordinateurs, il est possible de les synchroniser avec iSync afin que chaque machine ait les informations les plus récentes. Avec la technologie Bluetooth, un adaptateur USB peut créer une synchronisation sans fil vers vos devices (comme aiment à dire les Américains) que sont votre téléphone GSM, votre PDA (Palm et autres…) et autre iPod.

- Une étroite collaboration avec 4D
Avec 4D, le développeur peut proposer une nouvelle gamme de solutions qui coopère avec iCal. ce dernier peut devenir une application cliente de 4D : vous stockez des tâches de planning dans le data de 4D et, vice-versa, iCal affiche des informations contenues dans la base de données.

III - Publier ses données iCal

Nous allons passer en revue quelques options de publication de données iCal via des services externes. Dans tous les cas vos informations sont publiées à sens unique par duplication de votre fichier .ics. À l'aide de l'URL du .ics publié, d'autres utilisateurs pourront souscrire à votre calendrier en lisant cette copie.

La publication iCal consiste à créer des calendriers spécifiques et à les rendre disponibles, en lecture seule. Un calendrier publié ne peut l'être qu'une seule fois sur un même serveur. Publier revient à placer une copie d'un calendrier en particulier sur un serveur distant et à en préciser le rythme des mises à jour.

Il existe deux façons de publier : avec .Mac ou des serveurs tiers compatibles WebDAV ou encore des sites web voués à cette tâche. La publication la plus facile se fera avec un compte .Mac.

La solution .Mac

Créez un calendrier et ensuite choisissez la ligne « Publier » sous le menu « calendrier ».
Si vous ne l'avez pas encore ouvert, une invitation vous est faite à saisir un compte .Mac dans vos Préférences système. Un compte « à l'essai »  peut être ouvert temporairement et gratuitement.

Donner votre URL à vos utilisateurs.
Dès qu'un calendrier est publié, il devient disponible en ligne à l'adresse http://ical.mac.com/.mac/identifiant.Mac/nomducalendrier.
Quant aux autres, ils peuvent y souscrire à cette adresse : webcal://ical.mac.com/identifiant.Mac/nomducalendrier;
La solution est étonnamment simple à mettre en œuvre et facile d'accès pour peu que vos correspondants aient une application capable de lire du .ics.

La solution serveur Web

Une autre manière de publier est le recours à un serveur web. iCal exchange http://www.icalx.com est aussi une solution et est actuellement gratuite.

Le service a la particularité de proposer des zones publiques et des zones privées. Ainsi vous contrôlez l'usage de vos calendriers. Ils peuvent être consultés dans une page html ou par souscription via iCal. (Note du traducteur : au moment de publier ces lignes, l'accès au serveur icalx.com semblait « perturbé »).

Pour les calendriers d'intérêt général que vous voulez porter à la connaissance du monde entier, il est possible d'utiliser un annuaire comme iCalShare http://icalshare.com/.

4DWebmail

4DWebmail est une application open source qui fournit une interface web, la gestion des comptes email en POP3 et IMAP, un gestionnaire de contacts et la capacité de publier des calendriers au format .ics. 4DWebmail est disponible à cette adresse :
https://fr.4d.com/products/downloads/download_4dws.html.

IV - Configurer 4DWebStar en tant que serveur WebDAV

Hormis l'usage de serveur web pour le partage de votre calendrier, vous pouvez aussi utiliser 4DWebStar V qui intègre la technologie WebDAV, un protocole de partage de fichier basé sur HTTP.

Voici, pas à pas, la manière de régler 4DWebStar V et en faire un WebDAV.

1 : Créez un sous-dossier qui recevra vos fichiers iCal. Par exemple, placez-le dans : Applications/4DWebStar/Webserver/DefaultSite/iCal :

2 : Connectez-vous avec le client d'administration :

3 : Ouvrez le site approprié :

4 : Définissez les permissions :

5 : Définissez un royaume. Assurez-vous que les URI correspondent au chemin d'accès du dossier défini au point 1 :

6 : Créez un nom d'utilisateur et un mot de passe :

7 : Définissez une méthode d'authentification :

8 : Sélectionnez [YOUR AUTHENTICATOR] et réglez les permissions :

Vous êtes prêt à publier votre calendrier iCal sur votre propre serveur :
http://localhost/iCal.

V - 4D et iCal

Parce que le format iCal est normalisé iCalendar, vous pourrez écrire et lire vos propres fichiers .ics depuis 4D. Dans le texte qui suit, nous allons approfondir iCalendar et étudier un morceau de code destiné à importer et écrire des .ics.

Le format iCalendar

Les spécifications exhaustives de iCalendar sont disponibles sur le web à l'adresse http://www.ietf.org/rfc/rfc2445.txt. Voici un exemple simple :

BEGIN:VCALENDAR
CALSCALE:GREGORIAN
X-WR-TIMEZONE;VALUE=TEXT:US/Pacific
METHOD:PUBLISH
PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
X-WR-CALNAME;VALUE=TEXT:Example
VERSION:2.0
BEGIN:VEVENT
SEQUENCE:5
DTSTART;TZID=US/Pacific:20021028T140000
DTSTAMP:20021028T011706Z
SUMMARY:Coffee with Jason
UID:EC9439B1-FF65-11D6-9973-003065F99D04
DTEND;TZID=US/Pacific:20021028T150000
BEGIN:VALARM
TRIGGER;VALUE=DURATION:-P1D
ACTION:DISPLAY
DESCRIPTION:Event reminder
END:VALARM
END:VEVENT
END:VCALENDAR

Chaque ligne - une « content-line » - est constituée en deux parties séparées par un double point.

À gauche des deux points, la propriété qui peut être faite d'un ou plusieurs paramètres. Vous séparez la propriété de ses paramètres par des points-virgules et plusieurs paramètres seront séparés par des virgules.

À droite des deux-points, la valeur. Par exemple, la propriété DTSTART du dessus (la date et l'heure de début de l'événement) a un paramètre qui précise le fuseau horaire appliqué TZID dont la valeur est US/Pacific DTSTART;TZID=US/Pacific. La valeur de la propriété est une chaîne date/heure formatée AAAAMMJJ (Année sur 4 digits, le mois sur 2 et le jour sur 2) suivi de la lettre T et une chaîne heure formatée HHMMSS.

Notez que ces lignes se terminent « à la Windows » avec un CRLF (Carriage Return Line Feed). Vous pouvez briser une longue ligne en insérant un CRLF suivi par 1 ou plusieurs caractères d'espacement.

Les calendriers peuvent contenir diverses composantes : des événements, des alarmes, des choses à faire, etc. La plus classique est l'événement. Dans l'exemple plus haut, vous en avez un entre les lignes BEGIN:VEVENT et END:VEVENT. Son début et sa fin peuvent être précisés par les propriétés DTSTART et DTEND ou par la combinaison des propriétés DTSTART, DURATION et RRULE.
RRULE définit la répétitivité d'un objet et sa syntaxe peut devenir complexe. RRULE permet à un fichier iCalendar de contenir un événement qui se perpétue sans cesse : chaque second mardi de chaque mois, mais pas en novembre ni en juin. Voici un exemple d'événement récurrent qui a lieu du lundi au jeudi, et ce jusqu'au 14 décembre 2002 :

RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,
TU,WE,TH

VI - Du parsing avec 4e Dimension

Nous allons examiner la base « iCal_NT ». Le pseudocode qui suit nous montre l'angle pris pour analyser les fichiers :

- si le fichier est « distant » (cas des abonnements), le ramener localement ;

- ouvrir le document ;

- le découper dans un tableau ;

- détruire le fichier temporaire ;

- création d'enregistrements basés sur le tableau ;

- fermer le document.

C'est à présent que débutent les choses intéressantes : en regardant de plus près nous voyons un algorithme classique fondé sur RECEVOIR PAQUET placé dans une boucle.

1. C_BOOLEEN(vEvent)

3. C_ENTIER LONG(vlElem)

5. C_TEXTE($1)

6. C_POINTEUR($2;$3;$4;$5;$6;$7)

7. C_TEXTE($T_Calendrier)

8. C_TEXTE($T_Data)

9. C_HEURE($H_Doc)

11. $T_Calendrier:=$1   ` Accès au fichier .ICS

12. Si (Tester chemin acces($T_Calendrier)=Est un document )

13. $H_Doc:=Ouvrir document($T_Calendrier;"TEXT";Mode lecture )

14. Si (OK=1)

15. vEvent:=Faux

16. Repeter

17. RECEVOIR PAQUET($H_Doc;$T_Data;Caractere(10))

18. iCal_Data_To_Arrays ($T_Data;$2;$3;$4;$5;$6;$7)

19. Jusque (OK=0)

20. FERMER DOCUMENT($H_Doc)

21. Fin de si

23. Fin de si

Voici le code de la méthode iCal_Data_To_Arrays, qui est invoquée pour chaque ligne lue dans le fichier .ics. À noter que les paramètres $2 à $7 contiennent des pointeurs vers des tableaux que nous déclarons avant toute chose.

1. ` ----------------------------------------------------

2. ` Méthode : iCal_Data_To_Arrays

3. ` Description

4. ` Augmente la taille du tableau

5. ` et extrait les données pour les placer dans le tableau adéquat

6. ` ----------------------------------------------------

7. ` Auteur :Add Komoncharoensiri - 4D, Inc

8. ` ----------------------------------------------------

10. C_TEXTE($1)

11. C_POINTEUR($2;$3;$4)

13. C_TEXTE($T_Data;$T_Tag;$T_Valeur;$T_Date;$T_Heure)

14. C_ENTIER($I_Annee;$I_Mois;$I_Jour)

15. C_ENTIER($I_Position)

17. $T_Data:=$1

19. Si (Non(vEvent))

20. Si ($T_Data="BEGIN:VEVENT")

21. vEvent:=Vrai

22. vlElem:=Taille tableau($2->)+1

23. INSERER LIGNES($2->;vlElem)

24. INSERER LIGNES($3->;vlElem)

25. INSERER LIGNES($4->;vlElem)

26. INSERER LIGNES($5->;vlElem)

27. INSERER LIGNES($6->;vlElem)

28. INSERER LIGNES($7->;vlElem)

29. Fin de si

30. Sinon

31. $I_Position:=Position(":";$T_Data)

32. $T_Tag:=Sous chaine($T_Data;1;$I_Position-1)

33. Au cas ou

34. : ($T_Tag="SUMMARY")

35. $2->{vlElem}:=Sous chaine($T_Data;$I_Position+1)

37. : ($T_Tag="DESCRIPTION")

38. $5->{vlElem}:=Sous chaine($T_Data;$I_Position+1)

40. : ($T_Tag="DTSTAMP")

41. $6->{vlElem}:=Sous chaine($T_Data;$I_Position+1)

43. : ($T_Tag="UID")

44. $7->{vlElem}:=Sous chaine($T_Data;$I_Position+1)

46. : ($T_Tag="END")

47. Si ($T_Data="END:VEVENT")

48. vEvent:=Faux

49. Fin de si

51. $I_Position:=Position("DTEND";$T_Data)

52. Si ($I_Position>0)

53. $I_Position:=Position(":";$T_Data)

54. $T_Valeur:=Sous chaine($T_Data;$I_Position+1)

55. $I_Position:=Position("T";$T_Valeur)

57. $T_Date:=$T_Valeur   `Sous-chaine($T_Valeur;1;$I_Position-1)

58. $I_Annee:=Num(Sous chaine($T_Date;1;4))

59. $I_Mois:=Num(Sous chaine($T_Date;5;2))

60. $I_Jour:=Num(Sous chaine($T_Date;7;2))

61. $T_Date:=Chaine(Ajouter a date(!00/00/00!;$I_Annee;$I_Mois;$I_Jour))

62. $T_Heure:=Sous chaine($T_Valeur;$I_Position+1)

63. $T_Heure:=Inserer chaine($T_Heure;":";3)

64. $T_Heure:=Inserer chaine($T_Heure;":";6)

65. $4->{vlElem}:=$T_Date+" "+$T_Heure

66. Sinon

67. $I_Position:=Position("DTSTART";$T_Data)

68. Si ($I_Position>0)

69. $I_Position:=Position(":";$T_Data)

70. $T_Valeur:=Sous chaine($T_Data;$I_Position+1)

71. $I_Position:=Position("T";$T_Valeur)

72. $T_Date:=Sous chaine($T_Valeur;1;$I_Position-1)

73. $T_Date:=$T_Valeur

74. $I_Annee:=Num(Sous chaine($T_Date;1;4))

75. $I_Mois:=Num(Sous chaine($T_Date;5;2))

76. $I_Jour:=Num(Sous chaine($T_Date;7;2))

77. $T_Date:=Chaine(Ajouter a date(!00/00/00!;$I_Annee;$I_Mois;$I_Jour))

78. $T_Heure:=Sous chaine($T_Valeur;$I_Position+1)

79. $T_Heure:=Inserer chaine($T_Heure;":";3)

80. $T_Heure:=Inserer chaine($T_Heure;":";6)

81. $3->{vlElem}:=$T_Date+" "+$T_Heure

82. Fin de si

83. Fin de si

84. Fin de cas

86. Fin de si

VII - Publier un calendrier depuis 4D

Comme tout adret a son ubac, la lecture a son écriture. Écrire un fichier iCal se fera aussi facilement que l'a été la lecture. Chaque enregistrement contient ces éléments :

BEGIN:VCALENDAR
BEGIN:VEVENT
DTSTAMP: data
SUMMARY: data
UID: data
DTSTART: data
DURING:PT1H: data
DTEND: data
DESCRIPTION: data
END:VEVENT
END:VCALENDAR

Pour créer un .ics, bouclez simplement sur les données de votre sélection en les formatant comme décrit et écrivez dans votre fichier. Modifier créateur et propriété comme pour un fichier iCal et chargez-le sur votre serveur WebDAV. Le plus gros du travail a déjà été réalisé pour vous dans la base exemple qui contient les méthodes qui permettront l'upload de n'importe quel fichier vers un serveur.

Plusieurs avantages peuvent être dégagés de l'écriture de fichier iCal depuis 4D vers un serveur WebDAV. D'abord la solution est Mac et Windows. De plus, les utilisateurs autorisés peuvent écrire sur des serveurs WebDAV et n'importe quel utilisateur peut par la suite éditer le fichier. Notez que les serveurs Apple .Mac ne le permettent pas.

VIII - La base exemple

Cette Note technique est accompagnée d'une base exemple nommée iCal_NT qui fonctionne en se connectant sur un serveur WebStar du 4D Net Center qui met à disposition un calendrier de la tournée du guitariste Eric Clapton, calendrier que vous pourrez, sans crainte, agrémenter de vos commentaires. Vous veillerez à ce que le plug-in 4D Internet Commands soit installé. Après avoir lancé la base vous arriverez sur un formulaire liste :

- le bouton « abonnement » vous permet de récupérer les données distantes et donc de synchroniser la base 4D ;

- le bouton « envoyer ses dates » met à jour le serveur distant ;

- webcal://www.4dnetcenter.com/agenda/EricClaptonTour.ics est l'URL pour voir vos modifications sur le logiciel iCal (Il faut aussi rafraîchir les données avec commande-R !).

IX - Tout est possible !

En combinant la puissance de 4D et le format standardisé de iCal, vous êtes en mesure de proposer des solutions qui seront compatibles avec un grand nombre d'applications et, par là même, proposer aux clients une alternative pour obtenir des informations stockées dans votre base 4D personnelle.

La possibilité de lire des fichiers iCal publiés signifie, qu'en plus d'importer ces documents, 4D peut tout simplement être contrôlé par iCal en mettant sur pied des mécanismes basés sur les noms des événements : imaginons un événement appelé « Sauvegarde » qui déclencherait un archivage de vos données ou bien un événement « Rapport:vente1 » qui imprimerait le rapport nommé vente1 à une heure déterminée dans iCal !

X - Bases exemples

Téléchargez la base exemple :

base exemple Mac

base exemple Windows