====== Introduzione a Gio ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//30/05/2012//** \\ \\
[[http://developer.gnome.org/gio/stable/ch01.html|Gio]] è una libreria inclusa anche nel pacchetto gtk e il suo scopo è dotare [[http://developer.gnome.org/glib/stable/|Glib]] di uno strumento solido e multipiattaforma per I/O su file, flussi e socket. Fu scritta con lo scopo di rimpiazzare GnomeVFS e fornire un framework piu' comodo delle chiamate POSIX . \\ \\
In questo articolo vedremo come copiare un file (una pagina web in questo caso) da una sorgente http al file system locale. Gio usa la logica degli uri per "raggiungere" i file, e sono molti i filesystem che supporta.
===== Il codice =====
**main.c**
#include
int
main (int argc, char **argv)
{
//Inizializzo i tipi di glib
g_type_init();
//Una varibile per gli eventuali errori
GError *error;
//Uri del Gfile sorgente(mySRC) e uri del Gfile di destinazione (myDEST)
GFile* mySRC = g_file_new_for_uri("http://www.freemedialab.org/myip/index.php");
GFile* myDEST = g_file_new_for_uri("file:///home/fabio/progetti/gio/myip.txt");
//Copio il file con questa semplice funzione
g_file_copy (mySRC, myDEST, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error);
//Verifico se ci sono stati errori e stampo dei messaggi
if (error!=NULL)
{
g_error("Attenzione errore nella copia: %s\n",error->message);
}else{
g_print("Copia eseguita correttamente.\n") ;
}
return 0;
}
Come si puo' notare tutto il lavoro sporco lo fa la funzione [[http://developer.gnome.org/gio/stable/GFile.html#g-file-copy|g_file_copy()]].
===== Il makefile =====
**makefile**
CPP = gcc
OPTS = `pkg-config --cflags --libs gio-2.0`
all:
$(CPP) main.c -o gio-test $(OPTS)
clean:
rm gio-test
===== Tenere traccia dello stato di avanzamento delle operazioni =====
Puo' essere utile tenere traccia dei byte copiati mediante delle informazioni sullo schermo o perchè no anche una progressbar. Ecco come fare:
**main.c**
#include
/* La funzione "progress" viene richiamata come callback dalla funzione "g_file_copy()"
* e stampa a schermo le informazioni sull'avanzamento della copia.*/
GFileProgressCallback*
progress(goffset current_num_bytes, goffset total_num_bytes, gpointer user_data)
{
/* In "current_num_bytes" troviamo il numero di byte che si sta copiando in questo momento;
* in "total_num_bytes" la dimesione del file;
* in "userdata" dati dell'utente (eventualmente) passati alla callback
* */
g_print("Copia in corso: %lld di %lld byte\n", current_num_bytes, total_num_bytes );
}
int
main (int argc, char **argv)
{
//Inizializzo i tipi di glib
g_type_init();
//Una varibile per gli eventuali errori
GError *error;
//Uri del Gfile sorgente(mySRC) e uri del Gfile di destinazione (myDEST)
GFile* mySRC = g_file_new_for_uri("http://www.freemedialab.org/open50/bin/win32/open50.exe");
GFile* myDEST = g_file_new_for_uri("file:///home/fabio/progetti/gio/open50.exe");
/*Copio il file con questa semplice funzione. Il quinto parametro punta alla funzione progress
* responsabile delle informazioni sull'avanzamento dell' operazione*/
g_file_copy (mySRC, myDEST, G_FILE_COPY_OVERWRITE, NULL, (GFileProgressCallback)progress, NULL, &error);
//Verifico se ci sono stati errori e stampo dei messaggi
if (error!=NULL)
{
g_error("Attenzione errore nella copia: %s\n",error->message);
}else{
g_print("Copia eseguita correttamente.\n") ;
}
return 0;
}
Per compilare questo sorgente potremmo benissimo riusare il makefile usato per l'esempio base.