static gboolean _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data) { struct SimpleTestConference *dat = user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ELEMENT: { const GstStructure *s = gst_message_get_structure (message); ts_fail_if (s==NULL, "NULL structure in element message"); if (gst_structure_has_name (s, "farsight-error")) { const GValue *value; FsError errorno; const gchar *error, *debug; ts_fail_unless ( gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE), "Received farsight-error from non-farsight element"); ts_fail_unless ( gst_structure_has_field_typed (s, "src-object", G_TYPE_OBJECT), "farsight-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "error-no", FS_TYPE_ERROR), "farsight-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "error-msg", G_TYPE_STRING), "farsight-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "debug-msg", G_TYPE_STRING), "farsight-error structure has no src-object field"); value = gst_structure_get_value (s, "error-no"); errorno = g_value_get_enum (value); error = gst_structure_get_string (s, "error-msg"); debug = gst_structure_get_string (s, "debug-msg"); ts_fail ("Error on BUS (%d) %s .. %s", errorno, error, debug); } else if (gst_structure_has_name (s, "farsight-new-local-candidate")) { FsStream *stream; FsCandidate *candidate; const GValue *value; ts_fail_unless ( gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE), "Received farsight-error from non-farsight element"); ts_fail_unless ( gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM), "farsight-new-local-candidate structure has no stream field"); ts_fail_unless ( gst_structure_has_field_typed (s, "candidate", FS_TYPE_CANDIDATE), "farsight-new-local-candidate structure has no candidate field"); value = gst_structure_get_value (s, "stream"); stream = g_value_get_object (value); value = gst_structure_get_value (s, "candidate"); candidate = g_value_get_boxed (value); ts_fail_unless (stream && candidate, "new-local-candidate with NULL" " stream(%p) or candidate(%p)", stream, candidate); _new_local_candidate (stream, candidate); } else if (gst_structure_has_name (s, "farsight-new-active-candidate-pair")) { FsStream *stream; FsCandidate *local_candidate, *remote_candidate; const GValue *value; ts_fail_unless ( gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE), "Received farsight-error from non-farsight element"); ts_fail_unless ( gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM), "farsight-new-active-candidate-pair structure" " has no stream field"); ts_fail_unless ( gst_structure_has_field_typed (s, "local-candidate", FS_TYPE_CANDIDATE), "farsight-new-active-candidate-pair structure" " has no local-candidate field"); ts_fail_unless ( gst_structure_has_field_typed (s, "remote-candidate", FS_TYPE_CANDIDATE), "farsight-new-active-candidate-pair structure" " has no remote-candidate field"); value = gst_structure_get_value (s, "stream"); stream = g_value_get_object (value); value = gst_structure_get_value (s, "local-candidate"); local_candidate = g_value_get_boxed (value); value = gst_structure_get_value (s, "remote-candidate"); remote_candidate = g_value_get_boxed (value); ts_fail_unless (stream && local_candidate && remote_candidate, "new-local-candidate with NULL stream(%p)" " or local_candidate(%p) or remote_candidate(%p)", stream, local_candidate, remote_candidate); } else if (gst_structure_has_name (s, "farsight-current-send-codec-changed")) { FsSession *session; FsCodec *codec; const GValue *value; ts_fail_unless ( gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE), "Received farsight-error from non-farsight element"); ts_fail_unless ( gst_structure_has_field_typed (s, "session", FS_TYPE_SESSION), "farsight-current-send-codec-changed structure" " has no session field"); ts_fail_unless ( gst_structure_has_field_typed (s, "codec", FS_TYPE_CODEC), ""); value = gst_structure_get_value (s, "session"); session = g_value_get_object (value); value = gst_structure_get_value (s, "codec"); codec = g_value_get_boxed (value); ts_fail_unless (session && codec, "current-send-codec-changed with NULL session(%p) or codec(%p)", session, codec); _current_send_codec_changed (session, codec); } } break; case GST_MESSAGE_ERROR: { GError *error = NULL; gchar *debug = NULL; gst_message_parse_error (message, &error, &debug); ts_fail ("Got an error on the BUS (%d): %s (%s)", error->code, error->message, debug); g_error_free (error); g_free (debug); } break; case GST_MESSAGE_WARNING: { GError *error = NULL; gchar *debug = NULL; gst_message_parse_warning (message, &error, &debug); g_debug ("%d: Got a warning on the BUS (%d): %s (%s)", dat->id, error->code, error->message, debug); g_error_free (error); g_free (debug); } break; default: break; } return TRUE; }
static gboolean _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data) { struct SimpleTestConference *dat = user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ELEMENT: { const GstStructure *s = gst_message_get_structure (message); if (gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE) && gst_structure_has_name (s, "farsight-error")) { const GValue *value; FsError errorno; const gchar *error, *debug; GEnumClass *enumclass = NULL; GEnumValue *enumvalue = NULL; ts_fail_unless ( gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE), "Received farsight-error from non-farsight element"); ts_fail_unless ( gst_structure_has_field_typed (s, "src-object", G_TYPE_OBJECT), "farsight-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "error-no", FS_TYPE_ERROR), "farsight-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "error-msg", G_TYPE_STRING), "farsight-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "debug-msg", G_TYPE_STRING), "farsight-error structure has no src-object field"); value = gst_structure_get_value (s, "error-no"); errorno = g_value_get_enum (value); error = gst_structure_get_string (s, "error-msg"); debug = gst_structure_get_string (s, "debug-msg"); enumclass = g_type_class_ref (FS_TYPE_ERROR); enumvalue = g_enum_get_value (enumclass, errorno); ts_fail ("Error on BUS %s (%d, %s) %s .. %s", enumvalue->value_name, errorno, enumvalue->value_nick, error, debug); g_type_class_unref (enumclass); } else if (gst_structure_has_name (s, "farsight-send-codec-changed")) { ready_to_send = TRUE; } } break; case GST_MESSAGE_ERROR: { GError *error = NULL; gchar *debug = NULL; gst_message_parse_error (message, &error, &debug); ts_fail ("Got an error on the BUS (%d): %s (%s)", error->code, error->message, debug); g_error_free (error); g_free (debug); } break; case GST_MESSAGE_WARNING: { GError *error = NULL; gchar *debug = NULL; gst_message_parse_warning (message, &error, &debug); GST_WARNING ("%d: Got a warning on the BUS (%d): %s (%s)", dat->id, error->code, error->message, debug); g_error_free (error); g_free (debug); } break; default: break; } return TRUE; }
static gboolean bus_watch (GstBus *bus, GstMessage *message, gpointer user_data) { struct SimpleMsnConference *dat = user_data; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ELEMENT: { const GstStructure *s = gst_message_get_structure (message); ts_fail_if (s==NULL, "NULL structure in element message"); if (gst_structure_has_name (s, "farstream-error")) { const GValue *value; FsError errorno; const gchar *error; ts_fail_unless ( gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE), "Received farstream-error from non-farstream element"); ts_fail_unless ( gst_structure_has_field_typed (s, "src-object", G_TYPE_OBJECT), "farstream-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "error-no", FS_TYPE_ERROR), "farstream-error structure has no src-object field"); ts_fail_unless ( gst_structure_has_field_typed (s, "error-msg", G_TYPE_STRING), "farstream-error structure has no src-object field"); value = gst_structure_get_value (s, "error-no"); errorno = g_value_get_enum (value); error = gst_structure_get_string (s, "error-msg"); ts_fail ("Error on BUS (%d) %s", errorno, error); } else if (gst_structure_has_name (s, "farstream-new-local-candidate")) { FsStream *stream; FsCandidate *candidate; const GValue *value; ts_fail_unless ( gst_implements_interface_check (GST_MESSAGE_SRC (message), FS_TYPE_CONFERENCE), "Received farstream-error from non-farstream element"); ts_fail_unless ( gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM), "farstream-new-local-candidate structure has no stream field"); ts_fail_unless ( gst_structure_has_field_typed (s, "candidate", FS_TYPE_CANDIDATE), "farstream-new-local-candidate structure has no candidate field"); value = gst_structure_get_value (s, "stream"); stream = g_value_get_object (value); value = gst_structure_get_value (s, "candidate"); candidate = g_value_get_boxed (value); ts_fail_unless (stream && candidate, "new-local-candidate with NULL" " stream(%p) or candidate(%p)", stream, candidate); if (dat->target) { GError *error = NULL; GList *list = g_list_append (NULL, candidate); gboolean add_remote_candidates_res; GST_DEBUG ("Setting candidate: %s %d", candidate->ip, candidate->port); add_remote_candidates_res = fs_stream_add_remote_candidates ( dat->target->stream, list, &error); ts_fail_unless (add_remote_candidates_res, "Could not set remote candidate: %s", error ? error->message : "No GError"); ts_fail_unless (error == NULL); g_list_free (list); } } } break; case GST_MESSAGE_ERROR: { GError *error = NULL; gchar *debug = NULL; gst_message_parse_error (message, &error, &debug); ts_fail ("Got an error on the BUS (%d): %s (%s)", error->code, error->message, debug); g_error_free (error); g_free (debug); } break; case GST_MESSAGE_WARNING: { GError *error = NULL; gchar *debug = NULL; gst_message_parse_warning (message, &error, &debug); GST_DEBUG ("%d: Got a warning on the BUS: %s (%s)", error->code, error->message, debug); g_error_free (error); g_free (debug); } break; default: break; } return TRUE; }