static JsonNode * snra_json_value_to_node (const GValue *value) { JsonNode *n = NULL; if (GST_VALUE_HOLDS_STRUCTURE (value)) { const GstStructure *s = gst_value_get_structure (value); n = snra_json_from_gst_structure (s); } else if (GST_VALUE_HOLDS_ARRAY (value)) { guint count = gst_value_array_get_size (value); guint i; JsonArray *arr = json_array_sized_new (count); for (i = 0; i < count; i++) { const GValue *sub_val = gst_value_array_get_value (value, i); JsonNode *tmp = snra_json_value_to_node (sub_val); if (tmp) json_array_add_element (arr, tmp); } n = json_node_new (JSON_NODE_ARRAY); json_node_take_array (n, arr); } else { n = json_node_new (JSON_NODE_VALUE); json_node_set_value (n, value); } return n; }
static void manager_send_msg_to_client (SnraManager * manager, SnraServerClient * client, gint send_to_mask, GstStructure * msg) { JsonGenerator *gen; JsonNode *root; gchar *body; gsize len; root = snra_json_from_gst_structure (msg); gst_structure_free (msg); gen = json_generator_new (); json_generator_set_root (gen, root); body = json_generator_to_data (gen, &len); g_object_unref (gen); json_node_free (root); if (client) { snra_server_client_send_message (client, body, len); } else { /* client == NULL - send to all clients */ GList *cur; if (send_to_mask & SEND_MSG_TO_PLAYERS) { for (cur = manager->player_info; cur != NULL; cur = g_list_next (cur)) { SnraPlayerInfo *info = (SnraPlayerInfo *) (cur->data); if (info->conn) snra_server_client_send_message (info->conn, body, len); } } if (send_to_mask & SEND_MSG_TO_CONTROLLERS) { for (cur = manager->ctrl_clients; cur != NULL; cur = g_list_next (cur)) { client = (SnraServerClient *) (cur->data); snra_server_client_send_message (client, body, len); } } } g_free (body); }