X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fdata%2Fgis-http.c;h=915f6483538a0e540826b51408d600de36157bfe;hp=b610fa3e67c57d60a79372f71a3d75ac42cdfc2d;hb=f9a7664a7e3474a7635150b400cdd8ac02911ef3;hpb=ffb05ac5f9bdc820ecb279b73782a747651a192a diff --git a/src/data/gis-http.c b/src/data/gis-http.c index b610fa3..915f648 100644 --- a/src/data/gis-http.c +++ b/src/data/gis-http.c @@ -79,6 +79,24 @@ struct _CacheInfo { GisChunkCallback callback; gpointer user_data; }; +struct _CacheInfoMain { + gchar *path; + GisChunkCallback callback; + gpointer user_data; + goffset cur, total; +}; + +/* call the user callback from the main thread, + * since it's usually UI updates */ +static gboolean _chunk_main_cb(gpointer _infomain) +{ + struct _CacheInfoMain *infomain = _infomain; + infomain->callback(infomain->path, + infomain->cur, infomain->total, + infomain->user_data); + g_free(infomain); + return FALSE; +} /** * Append data to the file and call the users callback if they supplied one. @@ -97,12 +115,17 @@ static void _chunk_cb(SoupMessage *message, SoupBuffer *chunk, gpointer _info) g_error("GisHttp: _chunk_cb - Unable to write data"); if (info->callback) { - goffset cur = ftell(info->fp); - goffset st=0, end=0, total=0; + struct _CacheInfoMain *infomain = g_new0(struct _CacheInfoMain, 1); + infomain->path = info->path; + infomain->callback = info->callback; + infomain->user_data = info->user_data; + infomain->cur = ftell(info->fp); + goffset st=0, end=0; soup_message_headers_get_content_range(message->response_headers, - &st, &end, &total); - info->callback(info->path, cur, total, info->user_data); + &st, &end, &infomain->total); + g_idle_add(_chunk_main_cb, infomain); } + } /** @@ -226,6 +249,8 @@ GList *gis_http_available(GisHttp *http, g_snprintf(tmp, sizeof(tmp), ".index.%x", g_random_int()); gchar *path = gis_http_fetch(http, index, tmp, GIS_REFRESH, NULL, NULL); + if (!path) + return files; gchar *html; g_file_get_contents(path, &html, NULL, NULL);