summaryrefslogtreecommitdiff
path: root/rest-extras
diff options
context:
space:
mode:
authorEitan Isaacson <eitan@monotonous.org>2011-04-07 11:54:59 -0700
committerEitan Isaacson <eitan@monotonous.org>2011-04-13 09:57:09 -0700
commit69b36f8f4073073ce9e3119f37e8eb4347570e76 (patch)
tree3204c2571ca6796c01f0d53fa1067f06e2ebfc13 /rest-extras
parent9beaa488c4b5d0f763517db0ce1de5b64dfe78db (diff)
youtube-proxy: Added upload progress callbacks.
Diffstat (limited to 'rest-extras')
-rw-r--r--rest-extras/youtube-proxy.c48
-rw-r--r--rest-extras/youtube-proxy.h4
2 files changed, 40 insertions, 12 deletions
diff --git a/rest-extras/youtube-proxy.c b/rest-extras/youtube-proxy.c
index af39e20..39a1ac1 100644
--- a/rest-extras/youtube-proxy.c
+++ b/rest-extras/youtube-proxy.c
@@ -144,7 +144,7 @@ RestProxy *
youtube_proxy_new_with_auth (const char *developer_key,
const char *user_auth)
{
- return g_object_new (YOUTUBE_TYPE_PROXY,
+ return g_object_new (YOUTUBE_TYPE_PROXY,
"developer-key", developer_key,
"user-auth", user_auth,
NULL);
@@ -245,13 +245,14 @@ typedef struct {
SoupMessage *message;
GObject *weak_object;
gpointer user_data;
+ gsize uploaded;
} YoutubeProxyUploadClosure;
static void
_upload_async_weak_notify_cb (gpointer *data,
GObject *dead_object)
{
- YoutubeProxyUploadClosure *closure =
+ YoutubeProxyUploadClosure *closure =
(YoutubeProxyUploadClosure *) data;
_rest_proxy_cancel_message (REST_PROXY (closure->proxy), closure->message);
@@ -279,7 +280,7 @@ _upload_async_closure_new (YoutubeProxy *self,
{
YoutubeProxyUploadClosure *closure =
g_slice_new0 (YoutubeProxyUploadClosure);
-
+
closure->proxy = g_object_ref (self);
closure->callback = callback;
closure->message = message;
@@ -310,12 +311,31 @@ _upload_completed_cb (SoupSession *session,
message->status_code,
message->reason_phrase);
- closure->callback (closure->proxy, message->response_body->data, error,
- closure->weak_object, closure->user_data);
+ closure->callback (closure->proxy, message->response_body->data,
+ message->request_body->length,
+ message->request_body->length,
+ error, closure->weak_object, closure->user_data);
_upload_async_closure_free (closure);
}
+static void
+_message_wrote_data_cb (SoupMessage *msg,
+ SoupBuffer *chunk,
+ YoutubeProxyUploadClosure *closure)
+{
+ closure->uploaded = closure->uploaded + chunk->length;
+
+ if (closure->uploaded < msg->request_body->length)
+ closure->callback (closure->proxy,
+ NULL,
+ msg->request_body->length,
+ closure->uploaded,
+ NULL,
+ closure->weak_object,
+ closure->user_data);
+}
+
gboolean
youtube_proxy_upload_async (YoutubeProxy *self,
const gchar *filename,
@@ -355,7 +375,7 @@ youtube_proxy_upload_async (YoutubeProxy *self,
soup_message_headers_append (part_headers, "Content-Type",
"application/atom+xml; charset=UTF-8");
-
+
soup_multipart_append_part (mp, part_headers, sb);
soup_buffer_free (sb);
@@ -364,21 +384,21 @@ youtube_proxy_upload_async (YoutubeProxy *self,
filename,
(const guchar*) g_mapped_file_get_contents (map),
g_mapped_file_get_length (map),
- NULL);
-
+ NULL);
+
sb = soup_buffer_new_with_owner (g_mapped_file_get_contents (map),
g_mapped_file_get_length (map),
map,
(GDestroyNotify) g_mapped_file_unref);
soup_message_headers_replace (part_headers, "Content-Type", content_type);
-
+
soup_multipart_append_part (mp, part_headers, sb);
-
+
soup_buffer_free (sb);
soup_message_headers_free (part_headers);
-
+
message = soup_form_request_new_from_multipart (UPLOAD_URL, mp);
soup_multipart_free (mp);
@@ -388,6 +408,12 @@ youtube_proxy_upload_async (YoutubeProxy *self,
closure = _upload_async_closure_new (self, callback, message, weak_object,
userdata);
+ g_signal_connect (message,
+ "wrote-body-data",
+ (GCallback) _message_wrote_data_cb,
+ closure);
+
+
_rest_proxy_queue_message (REST_PROXY (self), message, _upload_completed_cb,
closure);
diff --git a/rest-extras/youtube-proxy.h b/rest-extras/youtube-proxy.h
index 440fd6a..943f9f0 100644
--- a/rest-extras/youtube-proxy.h
+++ b/rest-extras/youtube-proxy.h
@@ -75,8 +75,10 @@ RestProxy* youtube_proxy_new_with_auth (const gchar *developer_key,
void youtube_proxy_set_user_auth (YoutubeProxy *proxy,
const gchar *user_auth);
-typedef void (*YoutubeProxyUploadCallback)(YoutubeProxy *proxy,
+typedef void (*YoutubeProxyUploadCallback)(YoutubeProxy *proxy,
const gchar *payload,
+ gsize total,
+ gsize uploaded,
const GError *error,
GObject *weak_object,
gpointer userdata);