summaryrefslogtreecommitdiff
path: root/libnautilus-private/nautilus-annotation.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnautilus-private/nautilus-annotation.c')
-rw-r--r--libnautilus-private/nautilus-annotation.c76
1 files changed, 61 insertions, 15 deletions
diff --git a/libnautilus-private/nautilus-annotation.c b/libnautilus-private/nautilus-annotation.c
index d89b0b9af..be8643bf0 100644
--- a/libnautilus-private/nautilus-annotation.c
+++ b/libnautilus-private/nautilus-annotation.c
@@ -87,12 +87,16 @@ struct NautilusDigestFileHandle {
};
#define READ_CHUNK_SIZE 65536
-#define SERVER_URI_TEMPLATE "http://dellbert.differnet.com/get_notes.cgi?ids=%s"
+#define MAX_DIGESTS_IN_PROGRESS 16
+#define SERVER_URI_TEMPLATE "http://dellbert.differnet.com/get_notes.cgi?ids=%s"
static int open_count = 0;
static int close_count = 0;
+static int digests_in_progress = 0;
+static GList* digest_request_queue = NULL;
static GList* annotation_request_queue = NULL;
+
static GHashTable *files_awaiting_annotation = NULL;
static void md5_transform (guint32 buf[4], const guint32 in[16]);
@@ -102,6 +106,8 @@ static union _endian { int i; char b[4]; } *_endian = (union _endian *)&_ie;
#define IS_BIG_ENDIAN() (_endian->b[0] == '\x44')
#define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11')
+static void got_file_digest (NautilusFile *file, const char *file_digest);
+static void process_digest_requests (void);
/*
* Note: this code is harmless on little-endian machines.
@@ -389,6 +395,8 @@ digest_file_completed (NautilusDigestFileHandle *digest_handle)
NULL);
}
+ digests_in_progress -= 1;
+
/* Invoke the callback to continue processing the annotation */
md5_final (&digest_handle->digest_context, digest_result);
@@ -406,15 +414,14 @@ digest_file_completed (NautilusDigestFileHandle *digest_handle)
}
(* digest_handle->callback) (digest_handle->file, &digest_string[0]);
-
- {
- char* name = nautilus_file_get_name (digest_handle->file);
- g_free (name);
- }
nautilus_file_unref (digest_handle->file);
g_free (digest_handle->buffer);
g_free (digest_handle);
+
+ /* start new digest requests if necessary */
+ process_digest_requests ();
+
}
/* Tell the caller we failed. */
@@ -427,11 +434,16 @@ digest_file_failed (NautilusDigestFileHandle *digest_handle, GnomeVFSResult resu
NULL);
}
g_free (digest_handle->buffer);
+
+ digests_in_progress -= 1;
(* digest_handle->callback) (digest_handle->file, NULL);
nautilus_file_unref (digest_handle->file);
g_free (digest_handle);
+
+ /* start new digest requests if necessary */
+ process_digest_requests ();
}
/* Here is the callback from the file read routine, where we actually accumulate the checksum */
@@ -504,7 +516,6 @@ read_file_open_callback (GnomeVFSAsyncHandle *handle,
digest_handle);
}
-
/* calculate the digest for the passed-in file asynchronously, invoking the passed in
* callback when the calculation has been completed.
*/
@@ -514,11 +525,7 @@ calculate_file_digest (NautilusFile *file, NautilusCalculateDigestCallback callb
NautilusDigestFileHandle *handle;
char *uri;
- /* if annotation lookup is disabled, don't bother to do all this work */
- if (!nautilus_preferences_get_boolean (NAUTILUS_PREFERENCES_LOOKUP_ANNOTATIONS)) {
- return 0;
- }
-
+
/* allocate a digest-handle structure to keep our state */
handle = g_new0 (NautilusDigestFileHandle, 1);
@@ -545,6 +552,47 @@ calculate_file_digest (NautilusFile *file, NautilusCalculateDigestCallback callb
return handle;
}
+/* process the digest request queue, launching as many requests as we can handle */
+static void
+process_digest_requests (void)
+{
+ GList *current_entry;
+ NautilusFile *file;
+
+ while (digests_in_progress < MAX_DIGESTS_IN_PROGRESS && digest_request_queue != NULL)
+ {
+ /* pull entry off queue */
+ current_entry = digest_request_queue;
+ digest_request_queue = current_entry->next;
+
+ file = NAUTILUS_FILE (current_entry->data);
+
+ /* initiate request */
+ calculate_file_digest (file, (NautilusCalculateDigestCallback) got_file_digest);
+
+ /* dispose of queue entry */
+ nautilus_file_unref (file);
+ g_list_free_1 (current_entry);
+
+ digests_in_progress += 1;
+ }
+}
+
+/* queue the digest request, and start processing it if we haven't exceeded the limit of requests
+ * in progress
+ */
+static void
+queue_file_digest_request (NautilusFile *file)
+{
+ /* if annotation lookup is disabled, don't bother to do all this work */
+ if (!nautilus_preferences_get_boolean (NAUTILUS_PREFERENCES_LOOKUP_ANNOTATIONS)) {
+ return;
+ }
+ nautilus_file_ref (file);
+ digest_request_queue = g_list_prepend (digest_request_queue, file);
+ process_digest_requests ();
+}
+
/* given a digest, retrieve an associated file object from the hash table */
static NautilusFile *
get_file_from_digest (const char *digest)
@@ -700,8 +748,6 @@ got_annotations_callback (GnomeVFSResult result,
return;
}
- g_message ("got annotation response %s", file_contents);
-
/* inexplicably, the gnome-xml parser requires a zero-terminated array, so add the null at the end. */
buffer = g_realloc (file_contents, file_size + 1);
buffer[file_size] = '\0';
@@ -867,7 +913,7 @@ char *nautilus_annotation_get_annotation (NautilusFile *file)
/* there isn't a digest, so start a request for one going, and return NULL */
if (digest == NULL) {
- calculate_file_digest (file, (NautilusCalculateDigestCallback) got_file_digest);
+ queue_file_digest_request (file);
return NULL;
}