/*
- * Copyright (C) 2009-2010 Andy Spencer <andy753421@gmail.com>
+ * Copyright (C) 2009-2011 Andy Spencer <andy753421@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
http->soup = soup_session_sync_new();
http->prefix = g_strdup(prefix);
g_object_set(http->soup, "user-agent", PACKAGE_STRING, NULL);
+ g_object_set(http->soup, "timeout", 10, NULL);
return http;
}
+/**
+ * grits_http_abort:
+ * @http: the #GritsHttp to abort
+ *
+ * Cancels any pending requests and prevents new requests.
+ */
+void grits_http_abort(GritsHttp *http)
+{
+ g_debug("GritsHttp: abort - %s", http->prefix);
+ http->aborted = TRUE;
+ soup_session_abort(http->soup);
+}
+
/**
* grits_http_free:
* @http: the #GritsHttp to free
void grits_http_free(GritsHttp *http)
{
g_debug("GritsHttp: free - %s", http->prefix);
- soup_session_abort(http->soup);
g_object_unref(http->soup);
g_free(http->prefix);
g_free(http);
GritsCacheType mode, GritsChunkCallback callback, gpointer user_data)
{
g_debug("GritsHttp: fetch - %s mode=%d", local, mode);
+ if (http->aborted) {
+ g_debug("GritsPluginSat: _load_tile_thread - aborted");
+ return NULL;
+ }
gchar *path = _get_cache_path(http, local);
/* Unlink the file if we're refreshing it */
if (!g_file_test(path, G_FILE_TEST_EXISTS))
part = g_strdup_printf("%s.part", path);
FILE *fp = fopen_p(part, "ab");
+ if (!fp) {
+ g_warning("GritsHttp: fetch - error opening %s", path);
+ return NULL;
+ }
fseek(fp, 0, SEEK_END); // "a" is broken on Windows, twice
/* Make temp data */
if (message == NULL)
g_error("message is null, cannot parse uri");
g_signal_connect(message, "got-chunk", G_CALLBACK(_chunk_cb), &info);
- soup_message_headers_set_range(message->request_headers, ftell(fp), -1);
+ //if (ftell(fp) > 0)
+ soup_message_headers_set_range(message->request_headers, ftell(fp), -1);
if (mode == GRITS_REFRESH)
soup_message_headers_replace(message->request_headers,
"Cache-Control", "max-age=0");
/* Close file */
fclose(fp);
- if (path != part && SOUP_STATUS_IS_SUCCESSFUL(message->status_code)) {
- g_rename(part, path);
+ if (path != part) {
+ if (SOUP_STATUS_IS_SUCCESSFUL(message->status_code))
+ g_rename(part, path);
g_free(part);
}
/* Finished */
- if (message->status_code == 416) {
+ guint status = message->status_code;
+ g_object_unref(message);
+ if (status == SOUP_STATUS_CANCELLED) {
+ return NULL;
+ } else if (status == SOUP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE) {
/* Range unsatisfiable, file already complete */
- } else if (!SOUP_STATUS_IS_SUCCESSFUL(message->status_code)) {
+ } else if (!SOUP_STATUS_IS_SUCCESSFUL(status)) {
g_warning("GritsHttp: done_cb - error copying file, status=%d\n"
"\tsrc=%s\n"
"\tdst=%s",
- message->status_code, uri, path);
+ status, uri, path);
return NULL;
}
}
-
/* TODO: free everything.. */
return path;
}
const gchar *file;
gchar *path = _get_cache_path(http, cache);
GDir *dir = g_dir_open(path, 0, NULL);
- while ((file = g_dir_read_name(dir)))
+ while (dir && (file = g_dir_read_name(dir)))
if (g_regex_match(filter_re, file, 0, NULL))
files = g_list_prepend(files, g_strdup(file));
g_free(path);
- g_dir_close(dir);
+ if (dir)
+ g_dir_close(dir);
}
/* Add online files if online */