Qui sommes nous ? Nous contacter
Ouverture de session :

Pseudonyme

Mot de Passe
Enregistrement
Rechercher :
SOMMAIRE
INFORMATIONS
MMT-fr
Ce site respecte les principes de la charte HONcode.
Ce site respecte les principes de la charte HONcode de HON 
Vérifiez ici.
Licences GNU FSF !
Licence Open Source
EN  LIGNE
Il y a actuellement 5 invités et 0 membres en ligne

Vous êtes un visiteur anonyme. Inscrivez-vous gratuitement en cliquant ici.

Programmer en OPL - 1ère Partie

(5927 total des mots dans ce texte)
(19330 lectures)   Format imprimable

Programmer en OPL - 1ère Partie
Éléments de base

P l a n

 Introduction

 Historique de l'OPL

 Principes de programmation

 Éléments de base du langage OPL

  • Déclaration de Procédures
  • Types de Variables
  • Déclaration de Variables
  • Déclaration de Tableaux de Variables
  • Déclarations de Constantes
  • Instructions d'exécution en Boucles
  • Embranchements décisionnels

 Organisations des Fichiers

  • Fichiers de Code Source (extension .tpl ou .opl)
  • Fichiers d'Entête (extension .tph ou .oph)
  • Fichier de Code objet interprété (extension .opo)
  • Fichier interprété d'Application (extension .app et .aif)
  • Fichier d'Images (extension .mbm )
  • Fichier d'Installation (extension .sis )
  • Comment organiser votre projet

Retour au début du Plan >

Introduction

> Cet article et les suivant ont pour objectif de vous faire découvrir l'OPL - acronyme de « Open Programming Langage » - qui vous permettra d'accéder d'une manière simple à la programmation pour les différentes plateformes SymbianOS.

> Après un court historique et un rappel des principes de programmation pour ces machines, vous trouverez  les informations nécessaires pour vous procurer les kits (gratuits) de développement et les documents utiles concernant les différentes commandes et leur syntaxe afin de réaliser votre premier exercice : la conception d'un Calculateur médical.

Retour au Plan >

Historique de l'OPL

> Depuis l'apparition des premières machines permettant de traiter l'Information, le mode de dialogue homme / machine n'a cessé de se perfectionner. De même, le mode de programmer ces machines s'est progressivement simplifé. Il existe de nos jours différents langages qui permettent d'accéder à différents niveaux :

  • les plus élémentaires (Code machine et Assembleur) permettent d'accéder au coeur du système mais sont peu lisibles et varie selon le processeur ;
  • les langages intermédiaires (C++, Delphi, ...) plus lisibles permettent également d'accéder au coeur du système, mais plus facilement et le code peut être en partie réutilisé d'une machine à une autre.
  • les langages plus évolués (Java, VisualBasic, ...) permettent d'écrire des applications ubiquitaires mais au prix d'un accès limité au coeur du système et d'une vitesse d'exécution plus lente.
  • l'OPL pour sa part, est un langage interprété de haut niveau, destiné aux téléphones mobiles Symbian OS. C'est un outil de développement de démarrage qui permet le développement rapide d'applications (RAD = Rapid Application Development).

Niveaux de langages

> L'OPL s'apparente au langage BASIC (Beginners All purpose Symbolic Code). Cela pourrait sembler désuet, pas d'Orientation Objet là dedans (bienqu'une tentative de version Orientée Objet nommée OOPL ait fait une brève appartion) ou d'opération logiques étranges dans le style C++. L'OPL fournit plutôt en ensemble de commandes faciles à comprendre et gére un flux procédural simple ce qui le rend accessible et simple à mettre en oeuvre.

> Il a débuté son existence sur les organiseurs Psion , OPL signifiant alors Organiser Programming Language (OPL = langage de programmation pour organiseur). La signification de l'acronyme a évolué avec le temps, se mutant en Open Programming Language (OPL = langage de programmation ouvert) dans un passé récent. Durant les années 90, l'OPL a constitué la base d'un nombre significatif d'applications commerciales et non commerciales conçues pour les machines Psion Series 3 et Series 5. Son attrait particulier résidait dans le fait qu'il était possible de créer les applications OPL directement sur la machine quasiment à la volée.

> L'OPL a cessé de faire partie intégrante du paquetage logiciel avec l'apparition du premier téléphone Symbian OS, le Nokia 9210 Communicator. Bienqu'une version d'OPL pour le Nokia 9210™ ait été diffusée en 2001, ce revirement a porté un coup sévère à la communauté de développeurs OPL. Cette communauté a pu ressusciter depuis en 2003 grâce à la mise à disposition de l'OPL en Open Source et on compte à ce jour une centaine d'applications disponibles. Mais ce n'est que la partie visible de l'iceberg, car de nombreuses applications personnelles ou conçues pour des firmes ne sont en fait jamais diffusées de manière formelle.

> L'OPL, comme le langage Java est un langage interprété. Il a besoin d'un Runtime OPL spécifique qui doit être installé sur la machine cible et dont la fonction est de transformer la suite d'instructions du programme en Code machine. Le Runtime OPL est écrit en C++ afin de ne pas pénaliser la vitesse d'exécution. De plus, afin d'accéder à certaines fonctions de la machine, il existe des bibliothèques d'extensions écrite en C++, les OPX (acronyme pour OPL eXtension) que vous pouvez charger dans grâce à une simple ligne de code dans votre programme.

Retour au Plan >

Principes de programmation

> La première chose à garder en tête c'est que le terminal mobile auquel vous intéressez est un mini-ordinateur doté d'une Unité centrale (CPU ou Processeur) et d'une Mémoire lui fournissant instructions et données. Il est à ce titre capable de stocker et d'échanger des informations numériques (sous forme de [0/1] ou bit) en son sein et avec l'extérieur via les connexions qui lui sont offertes. Les appareils SymbianOS savent gèrer des informations codées sur 32 bits.

> L'unité centrale dialogue avec le monde extérieur afin de savoir quelles données traiter (Entrées - Inputs en anglais - effectuées à l'aide d'un Clavier ou d'un Écran tactile par exemple) et rendre le résultat des tâches qu'elle effectue (Sorties - Outputs en anglais - par le biais d'un Écran ou d'un Message sonore par exemple).

Ordinateur modélisé

> Je vous invite dès maintenant à garder sous le coude votre Ouvrage de référence en matière de programmation, afin que vous puissiez en cas de difficulté de lecture, vous rafraîchir si nécessaire la mémoire ... sur les différents types de structures données ou d'instructions par exemple. (À défaut, vous pouvez vous reporter à l'ouvrage "Apprenez à programmer" de Christian DABANCOURT qui vous apportera les connaissances nécessaires au bon déroulement de votre projet).

Retour au Plan >

Éléments de base du langage OPL

> Comme tout langage, l'OPL possède son vocabulaire et sa syntaxe que nous allons découvrir ensemble. Ses mots (Commandes) permettent de composer des phrases (Ligne de code) qui peuvent être regroupés en paragraphes (Procédures)

 Déclaration de Procédures

> Lorsqu'une application OPL est lancée, elle appelle la Procédure principale qui débute par la ligne de d'instruction PROC Main:, et se finit par la commande ENDP marquant la fin de procédure.

rem * Procédure principale *
PROC Main:
   etc ...
ENDP
rem *Fin de la procédure principale *

L'instruction rem permet d'insérer les commentaires utiles pour comprendre l'articulation de votre programme (à quoi servent vos variables, que font vos procédures et lignes de commande, …).

> Cette procédure peut elle-même en appeler d'autres, nécessaires au bon fonctionnement de votre programme.

rem * Procédure principale *
PROC Main:
   OuvrirAppl:
   ClairCreat:
   FermerAppl:
ENDP
rem *Fin de la procédure principale

rem * Procédure d'Ouverture *
PROC OuvrirAppl:
    rem Déclarations de Variables
    rem Ouverture de Base de Donnée
    rem Réservations de Mémoire
    rem etc...
ENDP

rem * Procédure effectrice *
PROC CalcCreat:
    rem Calcule la Clairance de la Créatinine avec interfaces (saisie / affichage)
ENDP

rem * Procédure de Fermeture *
PROC FermerAppl:
    rem Fermeture de Base de Donnée
    rem Libération de Mémoire
    rem etc...
ENDP 

Afin de simplifier la lecture du code, vous devez utiliser des noms le plus explicites possibles pour vos variables et procédures et insérer des commentaires si besoin pour décrire ce qu'effectue le code.

 Types de Variables

> Une Variable correspond à quelque chose que avez envie de garder à la disposition de votre programme soit durant l'intégralité de son exécution, soit uniquement lors de l'exécution d'une procédure donnée. Cela peut correspondre à un petit ou un grand nombre, une chaîne de caractères, de chiffres ou de symboles.

> Il existe différents Types de variables qui permettent de coder et d'utiliser efficacement tous ces éléments dans la machine.

  • Les Entiers courts (type short integer) sont notés EntierCourt%. Codés sur 16 bits, ils permettent de représenter les nombres entiers de -32768 à 32767. (ex : IndiceMaxiTableau% permet de stocker la valeur de l'indice maximum d'un tableau).
  • Les Entiers longs (type long integer) sont notés EntierLong&. Codés sur 32 bits, ils permettent de représenter des nombres entiers allant de -2147483648 à 2147483647.

    Ils sont trés utiles pour pointer directement dans la mémoire certaines variables en conservant leur Adresse (ex : AdressePremierElementListe&)

  • Les Nombres à virgule flottante (type Float), qui permettent de représenter les nombres décimaux, sont notés NombreDecimal, c'est à dire telquels. Codés sur 32 bits, ils sont capables de représenter des nombres allant de 2.2250738585072015E-308 à 1.7976931348623157E+308 .

    Notez bien que pour les nombres, la virgule décimale doit être remplacée par un point dans le listing de votre programme.

  • Les Chaînes de caractères (type String) qui utilisent toutes les lettres, les chiffres et les symboles qui permettent de composer un texte, sont notées ChaineDeCaractere$ (ex : MonPrenom$). Elle ne peut pas contenir plus de 255 caractères.

 Déclaration de Variables

> Avant de pouvoir utiliser une Variable dans votre programme, vous devez la déclarer. Il faut comparer cette action à une réservation qui permet d'assigner une Adresse mémoire et un Espace mémoire aloué au stockage de l'information. C'est la première action à effectuer dans l'écriture d'une procédure.

> Il existe deux façons d'effectuer cette réservation :

  1. Une Variable de type GLOBAL peut être utilisée par n'importe quelle procédure du programme. C'est la première ligne de votre programme.
  2. Une Variable de type LOCAL n'existe que dans la procédure dans laquelle elle a été définie. Lorsque vous quittez la procédure, l'espace mémoire réservé pour cette Variable est libéré et son contenu détruit.

Les Variables locales sont souvent utilisées pour les compteurs temporaires de boucle (ex : i%), les indices de liste ou de tableau (ex : IndiceTableau%) ou les coordonnées d'écran (ex : x%, y%) qui n'ont de raison d'être que dans la procédure en cours.

> Vous pouvez déclarer plusieurs Variables séparées par une virgule sur la même ligne de commande.

rem * Procédure principale *
PROC Main:
   GLOBAL NomFichier$(255),NumeroFiche%,IndiceMax%
   DebutAppl:
   ClairCreat:
   FinAppl:
ENDP

rem * Procédure effectrice *
PROC CalcCreat:
    LOCAL TailleCm,PoidsKg,AgeAns%,CreatSang,CreatUrine,Diurese
    rem Calcule la Clairance de la Créatinine avec interfaces (saisie / affichage)
ENDP

On doit lors de la déclaration de Chaînes de caractère, noter entre parenthèses la taille maximale (en nombre de caractères) que vous assignez à votre Variable (ex : NomNaissance$(50),Prenom$(25),Adresse$(255) ). Cette taille maximale est implicite pour les autres types de Variables.

> Une fois déclarée, vous pouvez attribuer une valeur à vos Variable

  IndiceMax%=255
  NomNaissance$="Dr Goodgas"
  AgeAns%=45
  TailleCm=178
  PoidsKg=85
  SiteInternet$="www.smart-doc.org"

L'OPL attribue aux Variables une valeur par défaut lors de leur déclaration. Il est parfois utile de forcer ces Variables à une valeur donnée en début de procédure afin d'éviter des surprises lors de l'affichage de Chaînes de caractère ou lors de calculs (division par zéro par exemple).

 Déclaration de Tableaux de Variables

> Un tableau correspond à une liste de Variables de même type. Cela permet en une seule déclaration de directement réserver la place en mémoire pour cet ensemble.

rem * Tableau composé de 100 entiers courts
GLOBAL Tableau%(100)
rem * Tableau d'Entiers longs permettant de stocker 255 pointeurs d'adresse
GLOBAL Adresse&(255)

> Il est possible de définir des tableaux de Chaînes de caractère

rem * Tableau de 100 noms de 50 caractères maximum
GLOBAL TableauNoms$(100,50)

Hormis pour les Chaînes de caractère, L'OPL ne permet pas de déclarer de Variables sous forme de tableau à plusieurs dimensions (ex : matrice 2 x 2).

 Déclarations de Constantes

> Lorsque vous voulez assigner un nom à certains paramètres de votre programme qui ont une valeur constante, l'usage veut que ce nom débute par la lettre K afin de mieux les identifier.

rem * Déclaration des constantes
CONSTANT KNbHeureJour%=24,KNbMinuteHeure%=60,KNbSecondeMinute%=60
rem * Procédure principale *
PROC Main:
   OuvrirAppl:
   ClairCreat:
   FermerAppl:
ENDP
rem *Fin de la procédure principale

> Il existe pour l'OPL un fichier nommé Constant.oph qui contient un nombre important de Constantes prédéfinies dont le contenu peut être consulté dans la Documentation OPL. La commande INCLUDE permet d'intégrer ce fichier à votre programme et d'utiliser toutes ces Constantes.

rem * Inclusion du fichier contenant les Constantes prédéfinies
INCLUDE Constant.oph
rem * Procédure principale *
PROC Main:
   OuvrirAppl:
   ClairCreat:
   FermerAppl:
ENDP

 Instructions d'exécution en Boucles

> Il existe en OPL deux façons d'effectuer une opération en boucle :

  1. Exécuter [Processus] ... Jusqu'à [Condition d'arrêt vérifiée]  >> DO ... UNTIL.
    Le Processus Action est exécutée au moins une fois puisque la condition d'arrêt est vérifiée en fin de boucle.

rem * Exemple de procédure avec boucle DO...UNTIL
rem * exécutant 100 fois la procedure Action
PROC FaireJusqua:
    LOCAL Indice%,IndiceMax%
    Indice%=1
    IndiceMax%=100
    DO
        Action
rem * Incrémentation du compteur        
        Indice%=Indice%+1
    UNTIL Indice%=IndiceMax%
ENDP

  1. Tant que [Condition de bouclage vérifiée .... Processus] Fin  >> WHILE ... ENDWH.
    Le Processus Action n'est pas exécuté si la condition de départ n'est pas vérifiée.

rem * Exemple de procédure avec boucle WHILE...ENDWH
rem * exécutant 100 fois la procédure Action
PROC TantQueFaire:
    LOCAL Indice%,IndiceMax%
    Indice%=0
    IndiceMax%=100
    WHILE Indice%<IndiceMax%
        Action
rem * Incrémentation du compteur        
        Indice%=Indice%+1
    ENDWHILE
ENDP

> La commande BREAK permet d'interrompre l'exécution de la boucle à l'endroit où cette instruction est placée et de se placer sur la ligne d'instruction qui suit UNTIL ou ENDWH.

 Embranchements décisionnels

> Votre programme doit pouvoir prendre une direction variable selon la vérification de certaines conditions :

Si [Condition1 vérifiée] alors [Action 1]
        Sinon
[Condition2 vérifiée] alors [Action 2]
              ...
                    Sinon
[Condition n vérifiée] alors [Action n])
Fin

  C'est le rôle de l'ensemble d'instructions IF ... ELSEIF .... ELSE ... ENDIF.

rem * Exemple de procédure utilisant IF...ELSEIF...ELSE...ENDIF
PROC TailleSujet
    LOCAL TailleCm, Message$(100)
    rem Appelle de la procédure qui permet de saisir la Taille
    SaisieTaille
rem * Début du bloc conditionnel
    IF TailleCm > 220
      Message$="Quel géant !"
    ELSEIF TailleCm > 200
      Message$="Vous êtes vraiment très grand"
    ELSEIF TailleCm > 180
      Message$="Vous êtes grand"
    ELSEIF TailleCm > 160
      Message$="Avez-vous fini votre croissance ?"
    ELSE
      Message$="Mangez de la soupe, il n'est peut-être pas trop tard"
    ENDIF
rem * Fin du bloc conditionnel
rem * Appelle de la procédure qui affiche le message passé en paramètre
    Affiche(Message$)
ENDP

> La cascade est explorée jusqu'à ce que la condition soit vérifiée, ce qui permet d'en sortir.

Retour au Plan >

Organisations des Fichiers

> Comme tout langage de programmation, l'OPL est constitué de différentes parties qui doivent fonctionner ensemble. Nous allons nous atteler dans les paragraphes qui suivent à décrire l'organisation physique de ces parties et les outils qui permettent de les rassembler.

 Fichiers de Code Source (extension .tpl ou .opl)

> Le Code source correspond à la suite d'instructions que vous écrivez dans votre éditeur et que vous appelez votre programme. Il doit répondre exactement aux règles de vocabulaire et de syntaxe fixées sous peine d'être rejeté. Ce Code source, une fois lu par le Traducteur, est transformé en code compréhensible par la machine qui peut alors l'exécuter. C'est à l'Interpréteur que revient d'effectuer les vérifications concernant vocabulaire et syntaxe.

> Il vous est possible d'écrire votre programme sur votre PC ou directement sur votre terminal mobile SymbianOS. Le Code source écrit grâce à l'application Program de votre téléphone mobile n'est pas lisible directement dans l'éditeur de votre PC car il contient, en tant que document « natif », un certains nombres de marqueurs et un identifiant unique SymbianOS. Vous devez utiliser l'option Export text de l'application Program pour qu'il soit lisible sur le PC. Inversement, utilisez l'option Import text pour lire sur votre téléphone un fichier issu de votre PC.

Pour programmer directement sur votre téléphone mobile plus confortablement, utilisez si cela est possible un clavier Bluetooth (Par exemple le clavier Nokia SU-8W ou ThinkOutside Bluetooth).

> Il est recommandé de donner comme extension :

  • .opl aux fichiers de Code source sur l'appareil mobile
  • .tpl aux fichiers de Code source sur le PC, la lettre t signifiant qu'il s'agit d'un pur fichier texte.

 Fichiers d'Entête (extension .tph ou .oph)

> Les fichiers d'Entête (ou Header en anglais) sont des Fichiers texte destinés à rendre votre Code source OPL plus lisible. Ils servent par exemple, à déclarer certaines valeurs constantes de votre programme avec des lignes telles que :

CONSTANT KNbHeureJour%=24,KNbMinuteHeure%=60,KNbSecondeMinute%=60

Les Constantes ainsi déclarées peuvent être utilisées à l'intérieur de tout votre programme.

Stockez dans vos fichiers d'entête tout ce qui peut être réutilisable d'une application à une autre. Ce peut être également l'une des façons de stocker les textes de l'interface utilisateur de votre application en différentes langues.

> Comme précédemment, Il est recommandé de donner comme extension :

  • .oph aux fichiers de Code source sur l'appareil mobile (lettre h pour « header »)
  • .tph aux fichiers de Code source sur le PC

> Le Fichier Constant.oph que je vous invite dès maintenant à consulter, est le fichier standard d'Entête auquel vous pouvez recourir. La commande INCLUDE permet de le déclarer en début de programme.

rem * Déclaration du fichier d'Entête
INCLUDE Constant.oph
rem * Procédure principale *
PROC Main:
   OuvrirAppl:
   ClairCreat:
   FermerAppl:
ENDP
rem *Fin de la procédure principale

 Fichier de Code objet interprété (extension .opo)

> Le traitement de votre Code source par l'Interpréteur génère un nouveau fichier de Code objet dont l'extension est .opo (la lettre o pour objet). Ainsi les fichiers ClCreatCalc.tpl ou ClCreatCalc.opl seront indifféremment traités en fichier interprété ClCreatCalc.opo.

> Il vous sera possible d'exécuter directement ce type de fichier après l'avoir installé sur votre téléphone, en le sélectionnant à l'aide du Gestionaire de Fichiers (File manager en anglais).

 Fichier compilé d'Application (extension .app et .aif)

> Si vous choisissez de donner à votre programme l'aspect d'une application qui puisse apparaître avec son icône à l'écran, vous devez rajouter les commandes APP au début et ENDA à la fin de votre Code source.

rem * Application ClairCreatCalc calculant la clairance de la créatinine
APP ClairCreatCalc,123456789
    etc...
ENDA

123456789 représente le Numéro d'identification unique (UID) de votre application. Pour l'obtenir, il suffit d'adresser votre demande à uid@symbiandevnet.com et il vous en sera fourni gratuitement un pour une durée illimitée. Cet UID peut être noté soit en numération décimale, soit en hexadécimal précédé alors du symbole & (ex : 123456789 décimal équivaut à &75BCD15 hexadécimal - cf. Statman.Info pour la conversion).

> Après interprétation, deux fichiers sont créés :

  • un fichier .app qui contient le Code objet exécutable,
  • un fichier .aif (Application Information File) qui renferme toutes les informations d'installation permettant le bon fonctionnement et la désinstallation correcte de l'application.

 Fichier d'images (extension .mbm )

> Les fichiers Image standard sous SymbianOS ont pour extension .mbm ( pour Multi BitMap). Ils sont capables comme leur nom l'indique en anglais, de stocker tout un livre d'image.

> En pratique, il suffit d'un seul fichier pour regrouper toutes les images utilisées par toute une application. La manipulation de des fichiers sera vu ultérieurement mais vous pouvez trouver dès à présents des informations >> ici <<.

Vous pouvez réaliser vos images à l'aide de l'application Paint de votre PC puis les convertir au format .mbm, à l'aide de l'utilitaire BMConv.exe (Bitmap File Converter) lancé par l'option Exécuter... du menu Démarrer de Windows. Inversement vous pouvez convertir des fichiers .mbm au format que vous souhaitez grâce au logiciel XnVview.

 Fichier d'Installation (extension .sis )

> L'installation d'une application sur une machine SymbianOS présente l'avantage d'être d'une extrême simplicité. Les différents fichiers de l'application sont regroupés dans un seul paquetage dont l'extension est .sis.

> Lorsque ce fichier .sis est exécuté sur votre ordinateur, l'application PC Suite de votre PC va extraire les fichiers de l'application et les placer correctement dans le téléphone mobile. Mais l'installation est également possible en lançant le fichier directement sur votre téléphone après l'avoir téléchargé par infra-rouge, Bluetooth, via le WAP ou un courriel, ou toute autre méthode valide.

> C'est sous cette forme que vous devrez présenter votre application pour qu'elle puisse être distribuée. Nous verrons ultérieurement comment faire.

 Comment organiser votre projet

> Afin de ne pas passer votre temps à rechercher les fichiers utilisés pour un projet, il est important de bien vous organiser. On peut suggérer l'organisation suivante :

Racine :  C:\OPL\<Nom projet>
                             \Source\
                             \Source\Archive\
                             \Objet\
                             \Images\
                             \SIS\
  • Le répertoire Source sert à stocker les fichiers de Code source. Le sous-répertoire Archive est utilisé pour conserver les versions précédentes afin de pouvoir récupérer du code détruit ou voir si on a introduit une erreur.
  • Le répertoire Objet sert à stocker les fichiers .opo exécutables.
  • Le répertoire Images sert à stocker les images bitmap et le fichier d'image.mbm qui les regroupe.
  • Le répertoire SIS regroupe tous les fichiers nécessaires à la composition du paquetage .sis de distribution ainsi que le script qui est nécessaire à cet assemblage.

Afin de vous préserver d'un désastre informatique consécutif à l'altération de votre disque dur C:par un virus, il peut être utile d'effectuer une partition de ce disque (avec Partition Magic par exemple) en créant une unité D: de taille suffisante pour installer les Outils de programmation OPL et les Fichiers de vos projets.

Retour au Plan >

À suivre

> Le prochain chapitre intitulé « Kits de développement et ressources » sera consacré aux Outils de développement, à leur installation et à la documentation concernant l'OPL.

Article rédigé par Lionel RAFFIN pour www.smart-doc.org
Édition 16 Juin 2005

  

[ Retour PROGRAMMATION | Index des Rubriques ]

Accueil Actualités Articles Projets Téléch. Livres Liens Top10

Site internet motorisé par PostNuke ADODB database libraryLangage PHP

Tous les logos et toutes les marques de fabrication sont la propriété de leurs détenteurs respectifs. Les commentaires appartiennent aux personnes qui les ont postés, et tout le reste est Copyright© 2003-2010 de www.smart-doc.org
Ce site internet est réalisé avec PostNuke. Ce système de gestion de portail écrit enPHP est un Logiciel Libre distribué sous licence GNU/GPL license.