X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fdata%2Fgis-http.c;h=915f6483538a0e540826b51408d600de36157bfe;hp=613dd439fa7ce38f7c55486415cf5a1a8cc8d15a;hb=f9a7664a7e3474a7635150b400cdd8ac02911ef3;hpb=b9f5eb2820a7eddf625a17de87a48e70e0a4179f diff --git a/src/data/gis-http.c b/src/data/gis-http.c index 613dd43..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); } + } /** @@ -123,9 +146,7 @@ static void _chunk_cb(SoupMessage *message, SoupBuffer *chunk, gpointer _info) gchar *gis_http_fetch(GisHttp *http, const gchar *uri, const char *local, GisCacheType mode, GisChunkCallback callback, gpointer user_data) { - g_debug("GisHttp: fetch - %s... >> %s/%s mode=%d", - uri, http->prefix, local, mode); - + g_debug("GisHttp: fetch - %s mode=%d", local, mode); gchar *path = _get_cache_path(http, local); /* Unlink the file if we're refreshing it */ @@ -141,7 +162,8 @@ gchar *gis_http_fetch(GisHttp *http, const gchar *uri, const char *local, gchar *part = path; if (!g_file_test(path, G_FILE_TEST_EXISTS)) part = g_strdup_printf("%s.part", path); - FILE *fp = fopen_p(part, "a"); + FILE *fp = fopen_p(part, "ab"); + fseek(fp, 0, SEEK_END); // "a" is broken on Windows, twice /* Make temp data */ struct _CacheInfo info = { @@ -178,6 +200,7 @@ gchar *gis_http_fetch(GisHttp *http, const gchar *uri, const char *local, } } + /* TODO: free everything.. */ return path; } @@ -217,15 +240,17 @@ GList *gis_http_available(GisHttp *http, if (g_regex_match(filter_re, file, 0, NULL)) files = g_list_prepend(files, g_strdup(file)); g_free(path); + g_dir_close(dir); } - /* Add online files if online */ if (index) { gchar tmp[16]; 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); @@ -243,11 +268,14 @@ GList *gis_http_available(GisHttp *http, g_match_info_next(info, NULL); } + g_regex_unref(extract_re); g_match_info_free(info); g_unlink(path); g_free(path); g_free(html); } + g_regex_unref(filter_re); + return files; }