diff options
| author | Victor Kareh <[email protected]> | 2025-10-01 14:36:29 -0400 |
|---|---|---|
| committer | Victor Kareh <[email protected]> | 2025-10-02 02:58:32 +0000 |
| commit | d433bbd9aeb7ae3377e59c70f6608c3e29f9ebbc (patch) | |
| tree | c30271c47198d6c4c7eb1d09166325c5611fbf67 /invest-applet | |
| parent | c90425a43ed401ce71766ef038e0333269dcee73 (diff) | |
| download | mate-applets-master.tar.bz2 mate-applets-master.tar.xz | |
Diffstat (limited to 'invest-applet')
| -rw-r--r-- | invest-applet/invest/invest-applet-chart.c | 36 | ||||
| -rw-r--r-- | invest-applet/invest/invest-applet.c | 38 |
2 files changed, 55 insertions, 19 deletions
diff --git a/invest-applet/invest/invest-applet-chart.c b/invest-applet/invest/invest-applet-chart.c index 1114b900..c6699088 100644 --- a/invest-applet/invest/invest-applet-chart.c +++ b/invest-applet/invest/invest-applet-chart.c @@ -49,7 +49,7 @@ struct _InvestChart { }; static void fetch_chart_data (InvestChart *chart); -static void on_chart_data_received (SoupSession *session, SoupMessage *msg, gpointer user_data); +static void on_chart_data_received (GObject *source_object, GAsyncResult *result, gpointer user_data); static gboolean chart_draw_cb (GtkWidget *widget, cairo_t *cr, InvestChart *chart); static gboolean chart_window_key_press (GtkWidget *widget, GdkEventKey *event, InvestChart *chart); static void chart_range_button_clicked (GtkWidget *widget, InvestChart *chart); @@ -221,15 +221,17 @@ fetch_chart_data (InvestChart *chart) SoupMessage *msg = soup_message_new ("GET", url); /* HACK: avoid rate limiting */ - soup_message_headers_replace (msg->request_headers, "User-Agent", + SoupMessageHeaders *headers = soup_message_get_request_headers (msg); + soup_message_headers_replace (headers, "User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"); - gpointer *user_data_with_index = g_malloc (2 * sizeof (gpointer)); + gpointer *user_data_with_index = g_malloc (3 * sizeof (gpointer)); user_data_with_index[0] = chart; user_data_with_index[1] = GINT_TO_POINTER (i); + user_data_with_index[2] = msg; /* Queue the actual request to the Yahoo Finance API */ - soup_session_queue_message (chart->applet->soup_session, msg, on_chart_data_received, user_data_with_index); + soup_session_send_and_read_async (chart->applet->soup_session, msg, G_PRIORITY_DEFAULT, NULL, on_chart_data_received, user_data_with_index); g_free (url); } @@ -237,29 +239,42 @@ fetch_chart_data (InvestChart *chart) } static void -on_chart_data_received (SoupSession *session, SoupMessage *msg, gpointer user_data) +on_chart_data_received (GObject *source_object, GAsyncResult *result, gpointer user_data) { gpointer *user_data_with_index = (gpointer *)user_data; InvestChart *chart = (InvestChart *)user_data_with_index[0]; gint symbol_index = GPOINTER_TO_INT (user_data_with_index[1]); + SoupMessage *msg = SOUP_MESSAGE (user_data_with_index[2]); JsonParser *parser = NULL; JsonNode *root; JsonObject *root_obj; GError *error = NULL; + GBytes *response_body; - if (msg->status_code != SOUP_STATUS_OK) { - g_warning ("Failed to fetch chart data for symbol %d: %s", symbol_index, msg->reason_phrase); + response_body = soup_session_send_and_read_finish (SOUP_SESSION (source_object), result, &error); + if (error) { + g_warning ("Failed to fetch chart data for symbol %d: %s", symbol_index, error->message); + g_error_free (error); + goto cleanup; + } + + if (soup_message_get_status (msg) != SOUP_STATUS_OK) { + g_warning ("Failed to fetch chart data for symbol %d: %s", symbol_index, soup_message_get_reason_phrase (msg)); + g_bytes_unref (response_body); goto cleanup; } parser = json_parser_new (); - if (!json_parser_load_from_data (parser, msg->response_body->data, - msg->response_body->length, &error)) { + gsize data_length; + const gchar *data = g_bytes_get_data (response_body, &data_length); + if (!json_parser_load_from_data (parser, data, data_length, &error)) { g_warning ("Failed to parse chart JSON for symbol %d: %s", symbol_index, error->message); g_error_free (error); + g_bytes_unref (response_body); goto cleanup; } + g_bytes_unref (response_body); root = json_parser_get_root (parser); root_obj = json_node_get_object (root); @@ -349,6 +364,9 @@ cleanup: if (parser) { g_object_unref (parser); } + if (msg) { + g_object_unref (msg); + } /* Redraw chart if window is still visible */ if (chart->window && gtk_widget_get_visible (chart->window)) { diff --git a/invest-applet/invest/invest-applet.c b/invest-applet/invest/invest-applet.c index 979d90fb..d35c053c 100644 --- a/invest-applet/invest/invest-applet.c +++ b/invest-applet/invest/invest-applet.c @@ -66,31 +66,44 @@ invest_applet_update_display (InvestApplet *applet) } static void -on_stock_data_received (SoupSession *session, - SoupMessage *msg, - gpointer user_data) +on_stock_data_received (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { gpointer *user_data_with_index = (gpointer *)user_data; InvestApplet *applet = INVEST_APPLET (user_data_with_index[0]); gint symbol_index = GPOINTER_TO_INT (user_data_with_index[1]); + SoupMessage *msg = SOUP_MESSAGE (user_data_with_index[2]); JsonParser *parser = NULL; JsonNode *root; JsonObject *root_obj; GError *error = NULL; + GBytes *response_body; - if (msg->status_code != SOUP_STATUS_OK) { - g_warning ("Failed to fetch stock data for symbol %d: %s", symbol_index, msg->reason_phrase); + response_body = soup_session_send_and_read_finish (SOUP_SESSION (source_object), result, &error); + if (error) { + g_warning ("Failed to fetch stock data for symbol %d: %s", symbol_index, error->message); + g_error_free (error); + goto cleanup; + } + + if (soup_message_get_status (msg) != SOUP_STATUS_OK) { + g_warning ("Failed to fetch stock data for symbol %d: %s", symbol_index, soup_message_get_reason_phrase (msg)); + g_bytes_unref (response_body); goto cleanup; } parser = json_parser_new (); - if (!json_parser_load_from_data (parser, msg->response_body->data, - msg->response_body->length, &error)) { + gsize data_length; + const gchar *data = g_bytes_get_data (response_body, &data_length); + if (!json_parser_load_from_data (parser, data, data_length, &error)) { g_warning ("Failed to parse JSON for symbol %d: %s", symbol_index, error->message); g_error_free (error); + g_bytes_unref (response_body); goto cleanup; } + g_bytes_unref (response_body); root = json_parser_get_root (parser); root_obj = json_node_get_object (root); @@ -148,6 +161,9 @@ cleanup: if (parser) { g_object_unref (parser); } + if (msg) { + g_object_unref (msg); + } applet->pending_requests--; if (applet->pending_requests == 0) { @@ -227,14 +243,16 @@ invest_applet_update_stocks (gpointer user_data) SoupMessage *msg = soup_message_new ("GET", url); /* HACK: avoid rate limiting */ - soup_message_headers_replace (msg->request_headers, "User-Agent", + SoupMessageHeaders *headers = soup_message_get_request_headers (msg); + soup_message_headers_replace (headers, "User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"); - gpointer *user_data_with_index = g_malloc (2 * sizeof (gpointer)); + gpointer *user_data_with_index = g_malloc (3 * sizeof (gpointer)); user_data_with_index[0] = applet; user_data_with_index[1] = GINT_TO_POINTER (i); + user_data_with_index[2] = msg; - soup_session_queue_message (applet->soup_session, msg, on_stock_data_received, user_data_with_index); + soup_session_send_and_read_async (applet->soup_session, msg, G_PRIORITY_DEFAULT, NULL, on_stock_data_received, user_data_with_index); g_free (url); } |
