From 51f7fc039421443ec24607716804365442254320 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Fri, 26 Jul 2019 20:38:33 +0200 Subject: [PATCH] Add image support --- client/src/cart_item.c | 40 +++++++++++++++++++++++++++++++++++++++- server/api.php | 31 ++++++++++++++++++++++++++++--- server/img/BE6200.png | Bin 0 -> 5514 bytes server/img/BF09CE.png | Bin 0 -> 19056 bytes 4 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 server/img/BE6200.png create mode 100644 server/img/BF09CE.png diff --git a/client/src/cart_item.c b/client/src/cart_item.c index 0a5da38..9fc09b1 100644 --- a/client/src/cart_item.c +++ b/client/src/cart_item.c @@ -179,9 +179,47 @@ void yacos_cart_item_fetch_meta(YacosCartItem *self) // TODO: The soup 's probably memory-leaking all over the place. Check this some time.. } +static void yacos_cart_item_fetch_image_cb (SoupSession *session, SoupMessage *msg, gpointer user_data) +{ + YacosCartItem *self = YACOS_CART_ITEM(user_data); + GdkPixbuf *pixbuf_raw, *pixbuf_scaled; + GMemoryInputStream *s; + + if (msg->status_code != 200) { + g_warning("image: Received error code %d from server.", msg->status_code); + } else { + s = G_MEMORY_INPUT_STREAM(g_memory_input_stream_new()); + g_memory_input_stream_add_data(s, msg->response_body->data, msg->response_body->length, NULL); + pixbuf_raw = gdk_pixbuf_new_from_stream(G_INPUT_STREAM(s), NULL, NULL); + g_object_unref(s); + pixbuf_scaled = gdk_pixbuf_scale_simple(pixbuf_raw, 100, 100, GDK_INTERP_BILINEAR); + g_object_unref(pixbuf_raw); + gtk_image_set_from_pixbuf(GTK_IMAGE(self->priv.image), pixbuf_scaled); + g_object_unref(pixbuf_scaled); + } + + gtk_stack_set_visible_child(self->priv.stack_image_loader, self->priv.image); +} + void yacos_cart_item_fetch_image(YacosCartItem *self) { - return; + SoupMessage *msg; + gchar *url; + gchar *id_str; + + id_str = yacos_tag_id_to_str(self->priv.tag_id); + url = g_strdup_printf("%s?image&id=%s", self->priv.api.url_base, id_str); + g_free(id_str); + msg = soup_message_new("GET", url); + soup_message_headers_append (msg->request_headers, "x-token", self->priv.api.token); + g_free(url); + + soup_session_queue_message(self->priv.api.soup_session_meta, + msg, + yacos_cart_item_fetch_image_cb, + self); + + /* TODO: More memory leaks? */ } yacos_tag_id yacos_cart_item_get_id(YacosCartItem *self) diff --git a/server/api.php b/server/api.php index b87c659..6f62c0a 100644 --- a/server/api.php +++ b/server/api.php @@ -2,10 +2,22 @@ // This is just a dummy implementation during the development of the GTK+3 GUI -if ($_SERVER['HTTP_X_TOKEN'] != "123456") die("Invalid token.\n"); +if ($_SERVER['HTTP_X_TOKEN'] != "123456") { + http_response_code(403); + die("Invalid token.\n"); +} + +$id = $_GET['id']; +preg_match("/^[A-Za-z0-9]{6,10}$/", $id, $matches); +if (!$matches) { + http_response_code(400); + die ("Invalid tag ID."); +} + +// $id is now safe to use if (isset($_GET['meta'])) { - if ($_GET['id'] == "BF09CE") { + if ($id == "BF09CE") { ?> { "title" : "Cute Wifi Cat", @@ -13,7 +25,7 @@ if (isset($_GET['meta'])) { "comment" : "It's mewine!" } { "title" : "Crazy Stuff", @@ -22,6 +34,7 @@ if (isset($_GET['meta'])) { } { "title" : "INVALID", @@ -30,5 +43,17 @@ if (isset($_GET['meta'])) { } diff --git a/server/img/BE6200.png b/server/img/BE6200.png new file mode 100644 index 0000000000000000000000000000000000000000..630503e26d1f9ce6a4ad0cc8d397aa2a6277262b GIT binary patch literal 5514 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