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);      } | 
