With what function should I fetch a file from the web using GLib/GIO libs?
If my file is from:
gchar *path = "http://xxx.yyyServer/sharing/temp.txt"
What should I do to download it?
For the local files I simply use C libraries like fopen and fread.
How should I do the above?
There is unfortunately no examples of file handling in the Tutorials. I can only see a File chooser from File Dialog boxes.
UPDATED WITH WORKING CODE FROM COMMENTS: The code below works for binary files of unknown sizes.
char *name= http://127.0.0.1:8000/mybinfile
int getFile(char *name)
{
GFile *f = g_file_new_for_uri(name);
GFileInputStream *fis = NULL;
GDataInputStream* dis = NULL;
GError *err = NULL;
//char buffer[2048];
char *buffer;
size_t length;
int ret = -1;
GFileInfo *info;
int total_size = -1;
/* get input stream */
fis = g_file_read(f, NULL, &err);
if (err != NULL) {
fprintf(stderr, "ERROR: opening %s\n", name);
g_object_unref(f);
return -1;
}
info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (fis),G_FILE_ATTRIBUTE_STANDARD_SIZE,NULL, &err);
if (info)
{
if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE))
total_size = g_file_info_get_size (info);
printf( "total_size = %d\n", total_size);
g_object_unref (info);
}
// fill buffer
if(total_size > 0){
buffer = (char *) malloc(sizeof(char) * total_size);
memset(buffer, 0, total_size);
if ((length = g_input_stream_read (G_INPUT_STREAM(fis),
buffer, total_size, NULL, &err)) != -1) {
printf( "reading file\n");
}
printf( "File length = %d\n", length);
ret = 0;
}
// close streams
g_object_unref(fis);
g_object_unref(f);
return ret;
}
HTTP is one of the protocols supported by GIO, so you can open an HTTP URI just like any other file when using the GIO functions instead of standard C functions. Just use
g_file_new_for_uri
to create the file object and then you can read it just like a local file.You can use
g_file_read
to get a GFileInputStream for the given URI and theng_data_input_stream_new
to get a GDataInputStream for the input stream, which you can then use to read the file line-by-line. You have to upcast the GFileInputStream to a GInputStream before you can pass it tog_data_input_stream_new
(or before you can do anything else useful with it), but if you're programming GTK in C, you're probably used to that by now.I'm a noob just as you with GTK (maybe even more) but I suspect that there isn't a "one-instruction" way to download a file in C/C++. You have to use external tools (wget, etc.) or write a GET procedure yourself. Here is an example of file download in C using libcurl. Good luck!