Move API to own object
This commit is contained in:
parent
f075b6c83f
commit
333e4fc03e
@ -18,12 +18,7 @@ typedef struct _YacosCartItemPriv {
|
|||||||
|
|
||||||
yacos_cart_item_status status;
|
yacos_cart_item_status status;
|
||||||
|
|
||||||
struct api {
|
YacosApi *api;
|
||||||
gchar *url_base;
|
|
||||||
gchar *token;
|
|
||||||
|
|
||||||
SoupSession *soup_session_meta;
|
|
||||||
} api;
|
|
||||||
} YacosCartItemPriv;
|
} YacosCartItemPriv;
|
||||||
|
|
||||||
struct _YacosCartItem {
|
struct _YacosCartItem {
|
||||||
@ -50,10 +45,7 @@ static void yacos_cart_item_finalize(GObject *gobject)
|
|||||||
{
|
{
|
||||||
YacosCartItem *self = yacos_cart_item_get_instance_private(YACOS_CART_ITEM(gobject));
|
YacosCartItem *self = yacos_cart_item_get_instance_private(YACOS_CART_ITEM(gobject));
|
||||||
|
|
||||||
g_free(self->priv.api.url_base);
|
G_OBJECT_CLASS(yacos_cart_item_parent_class)->finalize(gobject);
|
||||||
g_free(self->priv.api.token);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS(yacos_cart_item_parent_class)->constructed(gobject);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void yacos_cart_item_class_init(YacosCartItemClass *klass)
|
static void yacos_cart_item_class_init(YacosCartItemClass *klass)
|
||||||
@ -91,11 +83,6 @@ static void yacos_cart_item_init(YacosCartItem *self)
|
|||||||
|
|
||||||
self->priv.stack_image_loader = GTK_STACK(gtk_builder_get_object(builder, "stack_image_loader"));
|
self->priv.stack_image_loader = GTK_STACK(gtk_builder_get_object(builder, "stack_image_loader"));
|
||||||
|
|
||||||
self->priv.api.url_base = g_strdup("http://localhost:8080/api.php");
|
|
||||||
self->priv.api.token = g_strdup("123456");
|
|
||||||
|
|
||||||
self->priv.api.soup_session_meta = soup_session_new();
|
|
||||||
|
|
||||||
g_signal_connect(self->priv.button_delete,
|
g_signal_connect(self->priv.button_delete,
|
||||||
"clicked",
|
"clicked",
|
||||||
(GCallback) yacos_cart_item_button_delete_cb,
|
(GCallback) yacos_cart_item_button_delete_cb,
|
||||||
@ -141,16 +128,15 @@ void yacos_cart_item_set_id(YacosCartItem *self, yacos_tag_id tag_id)
|
|||||||
g_free(id_str2);
|
g_free(id_str2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void yacos_cart_item_fetch_meta_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
|
static void yacos_cart_item_fetch_meta_cb (guint status, JsonParser *parser, gpointer user_data)
|
||||||
{
|
{
|
||||||
YacosCartItem *self = YACOS_CART_ITEM(user_data);
|
YacosCartItem *self = YACOS_CART_ITEM(user_data);
|
||||||
const char *temp;
|
const char *temp;
|
||||||
JsonParser *parser;
|
|
||||||
JsonReader *reader;
|
JsonReader *reader;
|
||||||
const static GdkRGBA color_error = {.red = 1.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
|
const static GdkRGBA color_error = {.red = 1.0, .green = 0.0, .blue = 0.0, .alpha = 1.0};
|
||||||
|
|
||||||
if (msg->status_code != 200) {
|
if (status != 200) {
|
||||||
g_warning("Received error code %d from server.", msg->status_code);
|
g_warning("Received error code %d from server.", status);
|
||||||
gtk_label_set_text(GTK_LABEL(self->priv.label_title), "Unknown article");
|
gtk_label_set_text(GTK_LABEL(self->priv.label_title), "Unknown article");
|
||||||
gtk_widget_override_color(self->priv.label_title, GTK_STATE_FLAG_NORMAL, &color_error);
|
gtk_widget_override_color(self->priv.label_title, GTK_STATE_FLAG_NORMAL, &color_error);
|
||||||
gtk_label_set_text(GTK_LABEL(self->priv.label_description), "This article will be ignored on checkout.");
|
gtk_label_set_text(GTK_LABEL(self->priv.label_description), "This article will be ignored on checkout.");
|
||||||
@ -159,12 +145,6 @@ static void yacos_cart_item_fetch_meta_cb (SoupSession *session, SoupMessage *ms
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
parser = json_parser_new ();
|
|
||||||
json_parser_load_from_data (parser,
|
|
||||||
msg->response_body->data,
|
|
||||||
msg->response_body->length,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
reader = json_reader_new (json_parser_get_root (parser));
|
reader = json_reader_new (json_parser_get_root (parser));
|
||||||
|
|
||||||
json_reader_read_member (reader, "title");
|
json_reader_read_member (reader, "title");
|
||||||
@ -187,7 +167,6 @@ static void yacos_cart_item_fetch_meta_cb (SoupSession *session, SoupMessage *ms
|
|||||||
json_reader_end_member (reader);
|
json_reader_end_member (reader);
|
||||||
|
|
||||||
g_object_unref (reader);
|
g_object_unref (reader);
|
||||||
g_object_unref (parser);
|
|
||||||
|
|
||||||
gtk_editable_set_editable(GTK_EDITABLE(self->priv.entry_comment), TRUE);
|
gtk_editable_set_editable(GTK_EDITABLE(self->priv.entry_comment), TRUE);
|
||||||
self->priv.status = YACOS_CART_ITEM_STATUS_VALID;
|
self->priv.status = YACOS_CART_ITEM_STATUS_VALID;
|
||||||
@ -195,29 +174,11 @@ static void yacos_cart_item_fetch_meta_cb (SoupSession *session, SoupMessage *ms
|
|||||||
|
|
||||||
void yacos_cart_item_fetch_meta(YacosCartItem *self)
|
void yacos_cart_item_fetch_meta(YacosCartItem *self)
|
||||||
{
|
{
|
||||||
SoupMessage *msg;
|
|
||||||
gchar *url;
|
|
||||||
gchar *id_str;
|
|
||||||
|
|
||||||
gtk_label_set_text(GTK_LABEL(self->priv.label_title), "Loading ...");
|
gtk_label_set_text(GTK_LABEL(self->priv.label_title), "Loading ...");
|
||||||
gtk_label_set_text(GTK_LABEL(self->priv.label_description), "");
|
gtk_label_set_text(GTK_LABEL(self->priv.label_description), "");
|
||||||
gtk_entry_set_text(GTK_ENTRY(self->priv.entry_comment), "");
|
gtk_entry_set_text(GTK_ENTRY(self->priv.entry_comment), "");
|
||||||
|
|
||||||
id_str = yacos_tag_id_to_str(self->priv.tag_id);
|
yacos_api_fetch_meta(self->priv.api, self->priv.tag_id, yacos_cart_item_fetch_meta_cb, self);
|
||||||
|
|
||||||
url = g_strdup_printf("%s?meta&id=%s", self->priv.api.url_base, id_str);
|
|
||||||
msg = soup_message_new("GET", url);
|
|
||||||
soup_message_headers_append (msg->request_headers, "x-token", self->priv.api.token);
|
|
||||||
|
|
||||||
g_free(url);
|
|
||||||
g_free(id_str);
|
|
||||||
|
|
||||||
soup_session_queue_message(self->priv.api.soup_session_meta,
|
|
||||||
msg,
|
|
||||||
yacos_cart_item_fetch_meta_cb,
|
|
||||||
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)
|
static void yacos_cart_item_fetch_image_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
|
||||||
@ -244,26 +205,15 @@ static void yacos_cart_item_fetch_image_cb (SoupSession *session, SoupMessage *m
|
|||||||
|
|
||||||
void yacos_cart_item_fetch_image(YacosCartItem *self)
|
void yacos_cart_item_fetch_image(YacosCartItem *self)
|
||||||
{
|
{
|
||||||
SoupMessage *msg;
|
yacos_api_fetch_image(self->priv.api, self->priv.tag_id, yacos_cart_item_fetch_image_cb, self);
|
||||||
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)
|
yacos_tag_id yacos_cart_item_get_id(YacosCartItem *self)
|
||||||
{
|
{
|
||||||
return self->priv.tag_id;
|
return self->priv.tag_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void yacos_cart_item_set_yacos_api(YacosCartItem *self, YacosApi *api)
|
||||||
|
{
|
||||||
|
self->priv.api = api;
|
||||||
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <libsoup/soup.h>
|
#include <libsoup/soup.h>
|
||||||
#include "scanner.h"
|
#include "scanner.h"
|
||||||
|
#include "yacos_api.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
G_DECLARE_FINAL_TYPE(YacosCartItem, yacos_cart_item, YACOS, CART_ITEM, GtkListBoxRow)
|
G_DECLARE_FINAL_TYPE(YacosCartItem, yacos_cart_item, YACOS, CART_ITEM, GtkListBoxRow)
|
||||||
@ -21,6 +22,7 @@ void yacos_cart_item_set_id(YacosCartItem *self, yacos_tag_id tag_id);
|
|||||||
void yacos_cart_item_fetch_meta(YacosCartItem *self);
|
void yacos_cart_item_fetch_meta(YacosCartItem *self);
|
||||||
void yacos_cart_item_fetch_image(YacosCartItem *self);
|
void yacos_cart_item_fetch_image(YacosCartItem *self);
|
||||||
yacos_tag_id yacos_cart_item_get_id(YacosCartItem *self);
|
yacos_tag_id yacos_cart_item_get_id(YacosCartItem *self);
|
||||||
|
void yacos_cart_item_set_yacos_api(YacosCartItem *self, YacosApi *api);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ static void activate(GtkApplication* app, gpointer user_data)
|
|||||||
struct mainWindow **mainWindow = &(app_state->mainWindow);
|
struct mainWindow **mainWindow = &(app_state->mainWindow);
|
||||||
|
|
||||||
YacosScanner *scanner;
|
YacosScanner *scanner;
|
||||||
|
YacosApi *api;
|
||||||
|
|
||||||
*mainWindow = mainWindow_new(app);
|
*mainWindow = mainWindow_new(app);
|
||||||
if (!(*mainWindow)) {
|
if (!(*mainWindow)) {
|
||||||
@ -22,6 +23,9 @@ static void activate(GtkApplication* app, gpointer user_data)
|
|||||||
gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW((*mainWindow)->main_window));
|
gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW((*mainWindow)->main_window));
|
||||||
gtk_widget_show_all((*mainWindow)->main_window);
|
gtk_widget_show_all((*mainWindow)->main_window);
|
||||||
|
|
||||||
|
api = yacos_api_new();
|
||||||
|
mainWindow_set_yacos_api(*mainWindow, api);
|
||||||
|
|
||||||
scanner = yacos_scanner_new();
|
scanner = yacos_scanner_new();
|
||||||
if (!scanner) {
|
if (!scanner) {
|
||||||
g_error("Error initializing scanner.");
|
g_error("Error initializing scanner.");
|
||||||
|
@ -48,6 +48,8 @@ void mainWindow_scan_tags(YacosScanner *scanner, struct mainWindow *mainWindow)
|
|||||||
if (found)
|
if (found)
|
||||||
continue;
|
continue;
|
||||||
le = yacos_cart_item_new();
|
le = yacos_cart_item_new();
|
||||||
|
yacos_cart_item_set_yacos_api(YACOS_CART_ITEM(le),
|
||||||
|
mainWindow->api);
|
||||||
yacos_cart_item_set_id(YACOS_CART_ITEM(le), tag_id);
|
yacos_cart_item_set_id(YACOS_CART_ITEM(le), tag_id);
|
||||||
yacos_cart_item_fetch_meta(YACOS_CART_ITEM(le));
|
yacos_cart_item_fetch_meta(YACOS_CART_ITEM(le));
|
||||||
yacos_cart_item_fetch_image(YACOS_CART_ITEM(le));
|
yacos_cart_item_fetch_image(YACOS_CART_ITEM(le));
|
||||||
@ -55,3 +57,8 @@ void mainWindow_scan_tags(YacosScanner *scanner, struct mainWindow *mainWindow)
|
|||||||
gtk_widget_show(le);
|
gtk_widget_show(le);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mainWindow_set_yacos_api(struct mainWindow *mainWindow, YacosApi *api)
|
||||||
|
{
|
||||||
|
mainWindow->api = api;
|
||||||
|
}
|
||||||
|
@ -4,10 +4,12 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include "scanner.h"
|
#include "scanner.h"
|
||||||
#include "cart_item.h"
|
#include "cart_item.h"
|
||||||
|
#include "yacos_api.h"
|
||||||
|
|
||||||
struct mainWindow {
|
struct mainWindow {
|
||||||
GtkWidget *main_window;
|
GtkWidget *main_window;
|
||||||
|
|
||||||
|
YacosApi *api;
|
||||||
GtkStack *stack_main;
|
GtkStack *stack_main;
|
||||||
|
|
||||||
struct page_intro {
|
struct page_intro {
|
||||||
@ -23,6 +25,7 @@ struct mainWindow {
|
|||||||
|
|
||||||
struct mainWindow *mainWindow_new();
|
struct mainWindow *mainWindow_new();
|
||||||
|
|
||||||
|
void mainWindow_set_yacos_api(struct mainWindow *mainWindow, YacosApi *api);
|
||||||
void mainWindow_scan_tags(YacosScanner *scanner, struct mainWindow *mainWindow);
|
void mainWindow_scan_tags(YacosScanner *scanner, struct mainWindow *mainWindow);
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
121
client/src/yacos_api.c
Normal file
121
client/src/yacos_api.c
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
#include "yacos_api.h"
|
||||||
|
|
||||||
|
struct _YacosApi {
|
||||||
|
gchar *url_base;
|
||||||
|
gchar *token;
|
||||||
|
|
||||||
|
SoupSession *soup_session;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _YacosApiCallbackData {
|
||||||
|
YacosApiCallback cb;
|
||||||
|
gpointer user_data;
|
||||||
|
} YacosApiCallbackData;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE(YacosApi, yacos_api, G_TYPE_OBJECT)
|
||||||
|
|
||||||
|
static void yacos_api_finalize(GObject *gobject)
|
||||||
|
{
|
||||||
|
YacosApi *self = yacos_api_get_instance_private(YACOS_API(gobject));
|
||||||
|
|
||||||
|
g_object_unref(self->soup_session);
|
||||||
|
|
||||||
|
g_free(self->url_base);
|
||||||
|
g_free(self->token);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS(yacos_api_parent_class)->finalize(gobject);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void yacos_api_class_init(YacosApiClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS(klass);
|
||||||
|
|
||||||
|
object_class->finalize = yacos_api_finalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void yacos_api_init(YacosApi *self)
|
||||||
|
{
|
||||||
|
self->url_base = g_strdup("http://localhost:8080/api.php");
|
||||||
|
self->token = g_strdup("123456");
|
||||||
|
|
||||||
|
self->soup_session = soup_session_new();
|
||||||
|
}
|
||||||
|
|
||||||
|
YacosApi *yacos_api_new(void)
|
||||||
|
{
|
||||||
|
return g_object_new(YACOS_TYPE_API, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void yacos_api_fetch_meta_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
|
||||||
|
{
|
||||||
|
YacosApiCallbackData *callback_data = user_data;
|
||||||
|
JsonParser *parser = NULL;
|
||||||
|
|
||||||
|
parser = json_parser_new();
|
||||||
|
json_parser_load_from_data(parser,
|
||||||
|
msg->response_body->data,
|
||||||
|
msg->response_body->length,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
callback_data->cb(msg->status_code, parser, callback_data->user_data);
|
||||||
|
|
||||||
|
g_object_unref(parser);
|
||||||
|
free(callback_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void yacos_api_fetch_meta(YacosApi *api,
|
||||||
|
yacos_tag_id tag_id,
|
||||||
|
YacosApiCallback cb,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
SoupMessage *msg;
|
||||||
|
gchar *url;
|
||||||
|
gchar *id_str;
|
||||||
|
YacosApiCallbackData *callback_data;
|
||||||
|
|
||||||
|
callback_data = malloc(sizeof(callback_data));
|
||||||
|
callback_data->cb = cb;
|
||||||
|
callback_data->user_data = user_data;
|
||||||
|
|
||||||
|
id_str = yacos_tag_id_to_str(tag_id);
|
||||||
|
|
||||||
|
url = g_strdup_printf("%s?meta&id=%s", api->url_base, id_str);
|
||||||
|
msg = soup_message_new("GET", url);
|
||||||
|
soup_message_headers_append (msg->request_headers, "x-token", api->token);
|
||||||
|
|
||||||
|
g_free(url);
|
||||||
|
g_free(id_str);
|
||||||
|
|
||||||
|
soup_session_queue_message(api->soup_session,
|
||||||
|
msg,
|
||||||
|
yacos_api_fetch_meta_cb,
|
||||||
|
callback_data);
|
||||||
|
|
||||||
|
// callback_data will be freed in the callback
|
||||||
|
|
||||||
|
// TODO: The soup 's probably memory-leaking all over the place. Check this some time..
|
||||||
|
}
|
||||||
|
|
||||||
|
void yacos_api_fetch_image(YacosApi *api,
|
||||||
|
yacos_tag_id tag_id,
|
||||||
|
SoupSessionCallback cb,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
SoupMessage *msg;
|
||||||
|
gchar *url;
|
||||||
|
gchar *id_str;
|
||||||
|
|
||||||
|
id_str = yacos_tag_id_to_str(tag_id);
|
||||||
|
url = g_strdup_printf("%s?image&id=%s", api->url_base, id_str);
|
||||||
|
g_free(id_str);
|
||||||
|
msg = soup_message_new("GET", url);
|
||||||
|
soup_message_headers_append (msg->request_headers, "x-token", api->token);
|
||||||
|
g_free(url);
|
||||||
|
|
||||||
|
soup_session_queue_message(api->soup_session,
|
||||||
|
msg,
|
||||||
|
cb,
|
||||||
|
user_data);
|
||||||
|
|
||||||
|
/* TODO: More memory leaks? */
|
||||||
|
}
|
28
client/src/yacos_api.h
Normal file
28
client/src/yacos_api.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef YACOS_API_H
|
||||||
|
#define YACOS_API_H
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
#include <libsoup/soup.h>
|
||||||
|
#include <json-glib/json-glib.h>
|
||||||
|
#include "scanner.h"
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define YACOS_TYPE_API yacos_api_get_type()
|
||||||
|
G_DECLARE_FINAL_TYPE(YacosApi, yacos_api, YACOS, API, GObject)
|
||||||
|
|
||||||
|
typedef void (*YacosApiCallback) (guint status, JsonParser *parser, gpointer user_data);
|
||||||
|
|
||||||
|
YacosApi *yacos_api_new(void);
|
||||||
|
void yacos_api_fetch_meta(YacosApi *api,
|
||||||
|
yacos_tag_id tag_id,
|
||||||
|
YacosApiCallback cb,
|
||||||
|
gpointer user_data);
|
||||||
|
void yacos_api_fetch_image(YacosApi *api,
|
||||||
|
yacos_tag_id tag_id,
|
||||||
|
SoupSessionCallback cb,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif // YACOS_API_H
|
Loading…
Reference in New Issue
Block a user