Appelant : le logiciel qui appelle PONX ; le plus souvent, c'est Paradox. Les paramètres indiqués suivent les habitudes de Python. Ainsi, le signe "=" permet de préciser une valeur par défaut. def vifi(chaine): Visualise une chaine ; affiche un message. L'architecture de PONX fait que le message sera récupéré par l'appelant, à la fin du l'appel. def ponxquit(): Plus utilisé ; sauf si l'on utilise le passage de paramètres par fichier. def ponxopen(dossier): Plus utilisé ; sauf si l'on utilise le passage de paramètres par fichier. Le fichier sortant est nommé "Ponx.out", dans le répertoire indiqué par le paramètre "dossier". def retouridem(str): Retourne la chaine passée en paramètre. Utilisé pour tester PONX. def retourlen(): Retourne, sous forme de chaine, la longueur du 2e paramètre d'appel à PONX. def persist(commande, cod=None, valeur=None): Utilisation de la persistence locale. "commande" est, au choix : "SET" pour mémoriser un l'objet "valeur", avec l'identifiant "cod" "GET" obtient (retourne) l'objet identifié par "cod" "SAVE" enregistre, sur disque, la persistence locale, sour le nom "cod" "LOAD" lit, depuis le disque (avec le nom "cod"), la persistence locale def TCPconnect(): Etablit une connexion TCP/IP ; à la place de paramètres, on utilise les variables globales suivantes : TCPconnexion 'handle' de la connexion TCPHOST nom du serveur (exemples : 127.0.0.1 ; localhost ; 192.168.1.1 ; mclaveau.alias.net ) TCPPORT numéro du port TCP/IP Retourne 'OK.' ou 'Erreur. No connect' Usage interne (appelé par TCPersisttstserver, TCPersistenvoitxt, TCPersistenvoifin, etc.) def TCPclose(): Termine une connexion TCP/IP. def TCPersisttstserver(HOST=None,PORT=22222): Teste (Tente) de se connecter à un serveur de télé-persistence (TCPersistServer ou MMS), avec les paramètres suivants : PHOST nom du serveur (exemples : 127.0.0.1 ; localhost ; 192.168.1.1 ; mclaveau.alias.net ) PORT numéro du port TCP/IP Retourne 'OK.' ou 'Erreur' La connexion est ensuite systématiquement fermée. def TCPersistenvoitxt(id, txt): Envoie l'objet chaine "txt" au serveur de télé-persistence, avec l'identifiant "id". Apparté sur la Télé-persistence : "id" ne doit pas dépasser 10 caractères "objet" a une taille quelconque (mais utilise de la mémoire, et du temps de transfert). Si le serveur de télé-persistence est accessible par Internet, tenez compte du temps de transfert, avant d'envoyer, par exemple, une chaine d'un Mo. Actuellement, il n'est pas possible de se connecter, simultanément, à plusieurs serveurs de télé-persistence. Cependant, rien n'empèche de se déconnecter, d'un serveur, pour se connecter à un autre. Cela est même assez rapide. Par contre, il est possible d'utiliser, simultanement, la télé-persistence, et la persistence locale. Rien n'empêche, par exemple, de faire : TCPersistenvoitxt("TOTO", persist("GET", cod="TITI")) cette commande envoi, au serveur de télé-persistence, un objet de la persistence locale (il faut que ce soit un objet texte). Il est également possible de donner l'ordre, à un serveur de télépersistence, d'envoyer un objet à un autre serveur de télépersistence. Une architecture avec de nombreux serveurs pourrait, ainsi, diffuser des objets, d'une manière hiérarchique, à de nombreux serveurs. Si un serveur est lancé sur les postes locaux, on dispose d'un possibilité de PUSH très simple. Attention : en cas d'échec de l'envoi, un simple message d'erreur est retourné. Il n'y a pas de nouvelle tentative automatique. ToDo : - envoi dans un thread séparé - connexions simultanées à plusieurs serveurs. - gestion de x tentatives d'envoi - meilleure interconnexion entre les tâches planifiées, MelPondeur et la télé-persistence. - augmenter les possibilités de télé-exécution. - mettre un moyen "externe" de savoir si le serveur est actif (pour savoir s'il faut le relancer). def TCPersistenvoifin(): Envoi un ordre d'arrêt au serveur de télé-persistence. A manipuler avec précaution, car il peut être très difficile de relancer le serveur. def TCPersistgettxt(id): Obtient, du serveur de télé-persistence. l'objet texte identifié par "id". def TCPersistdeltxt(id): Supprime, sur le du serveur de télé-persistence. l'objet texte identifié par "id". def TCPersistlit(id): Ordonne au serveur de télé-persistence, de charger le dictionnaire des objets, depuis le disque, à partir du fichier "id". def TCPersistsave(id): Ordonne au serveur de télé-persistence, de sauver (enregistrer) le dictionnaire des objets, dans le fichier "id". def TCPersistgetlst(): Obtient, du serveur de télé-persistence. la liste des ("id" des) objets disponibles. On récupère la liste dans une chaine. def TCPersistPexec(id): Ordonne au serveur de télé-persistence, d'exécuter, en tant que script python, l'objet texte identifié par "id". L'exécution se fera sur le télé-serveur. Cette fonction est très, très puissante. Un exemple (réel) d'utilisation : dans un réseau local, on envoie au télé-serveur, l'ordre de lancer, sous Paradox, un calcul de planification. Le résultat de ce calcul est ensuite envoyé, par FTP, à un autre serveur, pour le mettre à disposition par Internet ; un mail est envoyé, pour signaler la fin de l'opération. Et cet ordre est donné, pour être exécuté à un horaire précis, quelques heures plus tard. def clipboard_get(chaineid): Lit un objet dans le presse-papier. "chaineid" est le type/format recherché dans le presse-papier. Explications sur le type/format : si vous copiez une image, puis un texte en RTF, puis un bouton d'une fiche Paradox, , dans le presse-papier, ces trois éléments coexisteront dans le presse-pepier. De plus, le texte-RTF sera enregistré plusieurs fois : RTF, en texte seul, etc. Il faut donc choisir ce que l'on va récupérer. Quelques exemples de type/formats : Rich Text Format Borland Form Object CF_TEXT CF_BITMAP actuellement non supporté. CF_WAVE def clipboard_set(chaineid, format, data): Ecrit, dans le presse-papier, l'objet "data", avec le type/format "chaineid" (format n'est plus utilisé, mais laissé pour compatibilité ascendante). def screenshot2(filename='c:\\screenshot.bmp'): Effectue une copie d'écran, avec utilisation de wxPython. Le fichier est "filename", toujours de type .BMP def screenshot(filename='c:\\screenshot.bmp'): Effectue une copie d'écran, avec utilisation de PIL. Le fichier est "filename", toujours de type .BMP def screenshotplus(filename='c:\\screenshot.bmp', postai=[], taille=67, txt="PONX",txtx=40,txty=10,police="arial.ttf",ftaille=42,fcolor="#ff2200", ombrage="OUI", filetampon="c:\\dev\\python\\ponx.jpg",tamponx=1,tampony=1 ): Fait une copie d'écran "retraitée". Les traitements complémentaires sont donnés par les paramètres. "filename" est le nom du fichier en sortie. L'extension du fichier permet de choisir le type de fichier (BMP, GIF, JPG, PNG, etc.), parmi ceux supportés par PIL. "postai" est utilisé pour retailler (crop) l'image ; exemple [160,120,600,480] ([0,0] c'est "en haut à gauche") "taille" indique le pourcentage de redimentionnement de l'image (50 = 50%) "txt" texte qui sera écrit sur l'image "txtx" position x du texte écrit "txty" position y du texte écrit "police" nom de la police .TTF utilisée pour écrire "ftaille" taille de la police (les limites dépendent, notamment, de la police) "fcolor" couleur de la police (même convention de codification qu'en HTML) "ombrage" c'est "OUI" ou "NON" si "OUI", le même texte est écrit en noir, derrière l'écriture prévue, légèrement décalé. Cela peut aider à faire ressortir le texte. "filetampon" path & nom d'un fichier graphique qui sera écrit sue l'image en cours "tamponx" position x du tampon "tampony" position y du tampon def ponxzip(commande, dossier, fichierzip, listfichiers): Permet de tester un fichier .ZIP "commande" doit être "T" ou "t" "dossier" est pe path (emplacement) du fichier .ZIP "fichierzip" nom du fichier .ZIP "listfichiers" pas utilisé Le résultat retourné est : 'OK' 'Pb dans le contenu' ou 'Pb Global' Pour une gestion plus complète des fichiers .ZIP, il est conseillé d'utiliser le programme ZipMci.py. Ce programme peut utilisé de manière autonome, ou piloté depuis PONX. Il permet : - la compression des fichiers - le test de fichiers .ZIP - l'extraction de fichiers - la suppression dans un .ZIP - la liste des fichiers contenus dans un .ZIP def recupweb(adr): Lit, sur internet, une page, selon l'URL donnée par "adr". Le résultat est retourné dans une chaine. def recupfileweb(adr, repenregistrement): Charge, sur internet, un fichier, en utilisant HTTP, situé à 'URL donnée par "adr". Le résultat est enregistré dans le répertoire "repenregistrement" ; le nom de fichier est constitué par la dernière partie de l'URL ("adr"), splitée par des "/". def recupdezipweb(adr, rep): Comme recupfileweb( , mais avec un fichier compressé en .ZIP ; ce fichier est ensuite décompressé, et les fichiers extraits sont enregistrés dans "rep". Cela permet d'obtenir des vitesses de téléchargement très intéressantes. Si le fichier .ZIP contient une fiche Paradox, le nom de cette fiche (extraite) best fourni en retour. def convsansaccent(inp, mappingchar=mappingcharmaj): Convertit une chaine de caractère en chaine sans accents, avec en paramètre mappingcharmin : respect des majuscules/minuscules. mappingcharmaj : conversion en majuscules (valeur par défaut). Exemples d'utilisation : chain="çà va être bientôt Noël." convsansaccent(chain) => CA VA ETRE BIENTOT NOEL. convsansaccent(chain,mappingcharmin) => ca va etre bientot Noel. def remplacerdansfichiertxt(file, listeremplacement, filout): Permet d'effectuer une série de chercher/remplacer, dans le fichier texte "file" une série d'opérations, indiquée dans "listeremplacement" ; le résultat est enregistré dans "fileout". Les opérations peuvent être des expressions régulières. Exemples (simples) : [('AZERTY','abc'),('2003','2004'),('ALPHA','Abcdefghijklmnopqrstuvwxyz 1234567890')] Toutes les occurences sont remplacées ; le fichier est lu, et écrit, une seule fois ; chaque opération de remplacement est faite en une seule passe. C'est une fonction que j'utilise très souvent, notamment pour préparer des pages Internet dynamiques. def remplacerdansfichierchainetxt(file, listeremplacement): Comme précédemment, mais le résultat est retourné comme une chaine, au lieu d'écrire un fichier. Utile pour les "sous-pages HTML" (parties de pages). def remplacerdanschainetxt(str, listeremplacement): Comme précédemment, mais travaille sur une chaine ("str") en entrée (au lieu d'un fichier). def chercherdanschainere(rexpression=None): Effectue une recherche, avec une expression régulière. "rexpression" contient l'expression régulière. Si elle n'est pas fournie, il y a ré-utilisation de l'expression précédente. Cela permet de ne compiler qu'une fois l'expression et de l'utiliser avec une grande rapidité, par exemple si vous voulez l'utiliser dans tous les enregistrements d'une table. def serialize(obj, smode='COMPRESS'): Permet de sérialiser un objet. L'option 'COMPRESS' (par défaut) permet de compresser l'objet résultant avec zLib. La sérialisation permet de manipuler des objets complexes comme un objet simple. Il est ainsi possible de communiquer plus facilement avec le serveur de télé-persistence, par e-mails, etc. Un autre usage peut être de compresser des objets Paradox (champ(s), mémo(s), table(s), etc.) def deserialize(obj, smode='COMPRESS'): Fonction inverse de la précédente. Permet de retrouver l'original d'un objet sérialisé. def convcodec(fparam, fdest, ccodec='utf-8'): Permet de convertir une chaine de caractères, ou un fichier (texte) dans différents codecs. C'est la taille du paramètre fparam qui permet de déterminer si c'est un nom de fichier (taille inférieure ou égale à 64 caractères) ou une chaine de caractères (taille >=64 caractères) Parmi les codecs possibles : 'utf-8' (unicode sur 8 bits / 1 octet) 'utf-16' (unicode sur 16 bits / 2 octets) 'utf-16-be' (le même un big-indian) 'utf-16-le' (le même un little-indian ; 'utf-16' est en 'le' sous windows) 'utf-32' (unicode-wide, sur 32 bits / 4 octets) 'ascii' (ASCII 7 bits dans 1 octet) 'latin-1' 'iso8859-1' 'iso8859-15' 'iso8859-1' Cette fonction permet notamment de préparer des chaines UNICODE avec des codecs travaillant sur des caractères de plus d'un octet. Le fait de passer par un fichier (texte) en sortie permet de contourner les limitations de Paradox. def ftpconnect(): Connexion à un serveur FTP A la place des paramètres, on utilise les variables globales : "host" nom du serveur "port" port utilisé "login" nom d'utilisateur "pwd" mot de passe "path" répertoire du serveur FTP "pathlocal" répertoire local (emplacement des fichiers) "connftp" 'handle' de la connexion La réponse du serveur est retournée. def ftpclose(): Ferme la connexion FTP def ftpupload(): Envoie les fichiers contenus dans la liste "flist" (rappel :"pathlocal" contient répertoire local où sont les fichiers). def ftpdownload(): Lit (download) les fichiers contenus dans la liste "flist" (rappel :"pathlocal" contient répertoire local où seront enregistrés les fichiers). def ftpnlst(): Lit le répertoire courant du serveur FTP. Le résultat est la liste (simple) des fichiers, retournée dans une chaine. def ftpstodir(txt): (usage interne) def ftpdir(): Non terminé. Doit retourner le contenu du directory courant du serveur FTP. def plitnews(): Lit des articles sur un newsgroup, et les enregistre, à raison d'un fichier par message, avec l'extension '.nws'. A la place des paramètres, on utilise les variables globales : "newsserver" nom du serveur "newsport" port (normalement 119) "newsuser" nom d'utilisateur (si nécessaire) "newspasse" mot de passe (si nécessaire) "groupname" nom du newsgroup sur le serveur "pdestination" nom du répertoire où seront enregistrés les articles "newspremier" numéro du premier message à lire "newsdernier" numéro du dernier message à lire def composemsgnews(newsgroup, sdate, ssujet, piecesj=[]): Permet de préparer (composer) un message pour un newsgroup. Le "source" du message est passé en deuwième paramètre à PONX (GlobalPARAM1) Si le message contienh "