static void handle_received_chunk (SoupMessage * msg, SoupBuffer * chunk, SnraClient * client) { const gchar *ptr; gsize length; SnraClientFlags flag = get_flag_from_msg (msg); if (client->was_connected & flag) { g_print ("Successfully connected %s to server %s:%d\n", flag == SNRA_CLIENT_PLAYER ? "player" : "controller", client->connected_server, client->connected_port); client->was_connected |= flag; } /* Successful server connection, stop avahi discovery */ if (client->avahi_client) { avahi_client_free (client->avahi_client); client->avahi_sb = NULL; client->avahi_client = NULL; } if (client->json == NULL) client->json = json_parser_new (); #if 0 { gchar *tmp = g_strndup (chunk->data, chunk->length); g_print ("%s\n", tmp); g_free (tmp); } #endif ptr = memchr (chunk->data, '\0', chunk->length); if (!ptr) return; /* Save remaining portion */ ptr += 1; length =(chunk->length - (ptr - chunk->data)); chunk = soup_message_body_flatten (msg->response_body); if (json_parser_load_from_data (client->json, chunk->data, chunk->length, NULL)) { JsonNode *root = json_parser_get_root (client->json); GstStructure *s = snra_json_to_gst_structure (root); if (s == NULL) goto end; /* Invalid chunk */ if (flag == SNRA_CLIENT_PLAYER) handle_player_message (client, s); else handle_controller_message (client, s); gst_structure_free (s); } end: soup_message_body_truncate (msg->response_body); /* Put back remaining part */ if (length) soup_message_body_append (msg->response_body, SOUP_MEMORY_COPY, ptr, length); }
static void handle_received_chunk (SoupMessage * msg, SoupBuffer * chunk, AurClient * client) { const gchar *ptr; gsize length; AurClientFlags flag = get_flag_from_msg (msg); JsonNode *root; GstStructure *s; GError *err = NULL; gchar *json_str = NULL; if (client->was_connected & flag) { g_print ("Successfully connected %s to server %s:%d\n", flag == AUR_CLIENT_PLAYER ? "player" : "controller", client->connected_server, client->connected_port); client->was_connected |= flag; } /* Set up or re-trigger 20 second idle timeout for ping messages */ if (client->idle_timeout) g_source_remove (client->idle_timeout); client->idle_timeout = g_timeout_add_seconds (20, (GSourceFunc) conn_idle_timeout, client); #if HAVE_AVAHI /* Successful server connection, stop avahi discovery */ if (client->avahi_client) { avahi_client_free (client->avahi_client); client->avahi_sb = NULL; client->avahi_client = NULL; } #endif if (client->json == NULL) client->json = json_parser_new (); ptr = memchr (chunk->data, '\0', chunk->length); if (!ptr) return; /* Save remaining portion */ ptr += 1; length = (chunk->length - (ptr - chunk->data)); chunk = soup_message_body_flatten (msg->response_body); // Ignore null string chunks if (chunk->length < 2) goto end; /* Workaround: Copy to a string to avoid stupid * UTF-8 validation bug in json-glib 1.0.2 */ json_str = g_strndup (chunk->data, chunk->length); #if 0 g_print ("%s\n", json_str); #endif if (!json_parser_load_from_data (client->json, json_str, -1, &err) || err != NULL) goto fail; root = json_parser_get_root (client->json); s = aur_json_to_gst_structure (root); if (s == NULL) goto fail; /* Invalid chunk */ if (flag == AUR_CLIENT_PLAYER) handle_player_message (client, s); else handle_controller_message (client, s); gst_structure_free (s); end: g_free (json_str); soup_message_body_truncate (msg->response_body); /* Put back remaining part */ if (length) soup_message_body_append (msg->response_body, SOUP_MEMORY_COPY, ptr, length); return; fail:{ g_print ("Failed to parse message '%s'\n", json_str); if (err) { g_print ("Error: %s\n", err->message); g_error_free (err); } goto end; } }