Skip to Content

Lecture / écriture en C de fichiers distants en combinant libxml2 et GnomeVFS

Comment combiner GnomeVFS et libxml pour lire et écrire des fichiers XML sur des serveurs distants.

Première étape, permettre l’authentification de l’utilisateur si nécessaire :

Il faut en tout premier initaliser GnomeVFS, puis le gestionnaire d’authentification.


gnome_vfs_init ();
gnome_authentication_manager_init ();

Cet appel n’est nécessaire que si le serveur distant nécessite une authentification. Dans le doute, il l’est. La fonction est implémentée dans libgnomeui et donc cette bibliothèque est nécessaire.
Remarque : si le premier accès se fait à travers la boite de dialogue GtkFileChooserDialog, cet appel n’est pas nécessaire, et si on veut éviter l’utilisation de libgnomeui, on peut toujours écire une fonction équivalente.

Deuxième étape, lire le fichier pour obtenir une structure xmlDoc :


GnomeVFSHandle *handle;
xmlDocPtr xml;
GnomeVFSResult result = gnome_vfs_open (&handle, filename, GNOME_VFS_OPEN_READ);
if (result != GNOME_VFS_OK) {
        /* traiter l'erreur, par exemple en émettant un message et en retournant un code d'erreur */
}
if (!(xml = xmlReadIO ((xmlInputReadCallback) cb_vfs_to_xml,
                                 (xmlInputCloseCallback) gnome_vfs_close, handle, filename, NULL, 0))) {
        /* traiter l'erreur de lecture */
}

La fonction cb_vfs_to_xml est nécessaire car gnome_vfs_write n’a pas les mêmes arguments que xmlInputCloseCallback. Son code source est :


static int        cb_vfs_to_xml (GnomeVFSHandle *handle, char* buf, int nb)
{
        GnomeVFSFileSize ndone;
        return  (gnome_vfs_read (handle, buf, nb, &ndone) == GNOME_VFS_OK)? (int) ndone: -1;
}

De même, pour écrire un fichier :


xmlDocPtr xml;
/* Ici, construire l'arbre ... */

xmlOutputBufferPtr buf = xmlAllocOutputBuffer (NULL);
GnomeVFSHandle *handle;
int n;
GnomeVFSResult result = gnome_vfs_open (&handle, filename, GNOME_VFS_OPEN_WRITE);
if (result == GNOME_VFS_ERROR_NOT_FOUND)
        result = gnome_vfs_create (&handle, filename, GNOME_VFS_OPEN_WRITE, true, 0644); /* on peut utiliser un autre droit d'accès, mais ils ne sont utilisés que si le serveur l'autorise */
if (result != GNOME_VFS_OK) {
        /* traiter l'erreur, par exemple en émettant un message et en retournant un code d'erreur */
}
buf->context = handle;
buf->closecallback = (xmlOutputCloseCallback) gnome_vfs_close;
buf->writecallback = (xmlOutputWriteCallback) cb_xml_to_vfs;
int n = xmlSaveFormatFileTo (buf, xml, NULL, true);

De la même façon que pour la lecture, on a besoin d’une fonction utilitaire, appelée ici cb_xml_to_vfs. Son code est :


static int        cb_xml_to_vfs (GnomeVFSHandle *handle, const char* buf, int nb)
{
        GnomeVFSFileSize ndone;
        return (int) gnome_vfs_write (handle, buf, nb, &ndone);
}

Commentaires

> Lecture / écriture de fichiers distants en combinant libxml2 e

désolé mais je n’ai pas les compétances pour évaluer le code ...

mais la presentation est pas mal :))

> Lecture / écriture de fichiers distants en combinant libxml2 e

Bonjour Jean,

Etant donné que je ne connais ni libxml2 ni GnomeVFS, j’aurais bien aimé une très courte descrition de ce que c’est.

Il faudrait peut-être indiquer aussi que c’est en C.
 > Programme en C pour lire et écrire des fichiers XML distants en utilisant libxml2 et GnomeVFS

PS. Je pense que c’est très bien de mettre en ligne des petits articles très techniques comme celui-là.

Merci pour l’article.

Tony