# HG changeset patch # User Mike Ruprecht # Date 1231137270 0 # Node ID 7d2e06b29f8873a55667700e6c8ca83869d94764 # Parent d881fc5d907f880fda60e99b2dd3be86ef6087c7 Add state-changed signal to PurpleMedia. diff -r d881fc5d907f -r 7d2e06b29f88 libpurple/marshallers.list --- a/libpurple/marshallers.list Sun Jan 04 12:13:12 2009 +0000 +++ b/libpurple/marshallers.list Mon Jan 05 06:34:30 2009 +0000 @@ -2,3 +2,4 @@ VOID:POINTER,POINTER,OBJECT BOOLEAN:OBJECT,POINTER,STRING VOID:STRING,STRING +VOID:ENUM,STRING,STRING diff -r d881fc5d907f -r 7d2e06b29f88 libpurple/media.c --- a/libpurple/media.c Sun Jan 04 12:13:12 2009 +0000 +++ b/libpurple/media.c Mon Jan 05 06:34:30 2009 +0000 @@ -122,6 +122,7 @@ CANDIDATE_PAIR, CODECS_READY, READY_NEW, + STATE_CHANGED, LAST_SIGNAL }; static guint purple_media_signals[LAST_SIGNAL] = {0}; @@ -155,6 +156,22 @@ return type; } +GType +purple_media_state_changed_get_type() +{ + static GType type = 0; + if (type == 0) { + static const GEnumValue values[] = { + { PURPLE_MEDIA_STATE_CHANGED_NEW, "PURPLE_MEDIA_STATE_CHANGED_NEW", "new" }, + { PURPLE_MEDIA_STATE_CHANGED_CONNECTED, "PURPLE_MEDIA_STATE_CHANGED_CONNECTED", "connected" }, + { PURPLE_MEDIA_STATE_CHANGED_END, "PURPLE_MEDIA_STATE_CHANGED_END", "end" }, + { 0, NULL, NULL } + }; + type = g_enum_register_static("PurpleMediaStateChangedType", values); + } + return type; +} + static void purple_media_class_init (PurpleMediaClass *klass) { @@ -236,6 +253,11 @@ G_SIGNAL_RUN_LAST, 0, NULL, NULL, purple_smarshal_VOID__STRING_STRING, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); + purple_media_signals[STATE_CHANGED] = g_signal_new("state-changed", G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, + purple_smarshal_VOID__ENUM_STRING_STRING, + G_TYPE_NONE, 3, PURPLE_MEDIA_TYPE_STATE_CHANGED, + G_TYPE_STRING, G_TYPE_STRING); g_type_class_add_private(klass, sizeof(PurpleMediaPrivate)); } @@ -845,12 +867,18 @@ void purple_media_hangup(PurpleMedia *media) { + g_signal_emit(media, purple_media_signals[STATE_CHANGED], + 0, PURPLE_MEDIA_STATE_CHANGED_END, + NULL, NULL); g_signal_emit(media, purple_media_signals[HANGUP], 0); } void purple_media_reject(PurpleMedia *media) { + g_signal_emit(media, purple_media_signals[STATE_CHANGED], + 0, PURPLE_MEDIA_STATE_CHANGED_END, + NULL, NULL); g_signal_emit(media, purple_media_signals[REJECT], 0); } @@ -863,6 +891,9 @@ void purple_media_got_hangup(PurpleMedia *media) { + g_signal_emit(media, purple_media_signals[STATE_CHANGED], + 0, PURPLE_MEDIA_STATE_CHANGED_END, + NULL, NULL); g_signal_emit(media, purple_media_signals[GOT_HANGUP], 0); } @@ -1172,6 +1203,10 @@ purple_debug_info("media", "connecting new src pad: %s\n", gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure"); gst_element_set_state(stream->sink, GST_STATE_PLAYING); + + g_signal_emit(stream->session->media, purple_media_signals[STATE_CHANGED], + 0, PURPLE_MEDIA_STATE_CHANGED_CONNECTED, + stream->session->id, stream->participant); } static gchar * @@ -1259,12 +1294,19 @@ session->type = purple_media_from_fs(type, type_direction); purple_media_add_session(media, session); + g_signal_emit(media, purple_media_signals[STATE_CHANGED], + 0, PURPLE_MEDIA_STATE_CHANGED_NEW, + session->id, NULL); } if (!(participant = purple_media_add_participant(media, who))) { purple_media_remove_session(media, session); g_free(session); return FALSE; + } else { + g_signal_emit(media, purple_media_signals[STATE_CHANGED], + 0, PURPLE_MEDIA_STATE_CHANGED_NEW, + NULL, who); } stream = purple_media_get_stream(media, sess_id, who); @@ -1310,6 +1352,9 @@ g_signal_connect(G_OBJECT(fsstream), "src-pad-added", G_CALLBACK(purple_media_src_pad_added_cb), stream); + g_signal_emit(media, purple_media_signals[STATE_CHANGED], + 0, PURPLE_MEDIA_STATE_CHANGED_NEW, + session->id, who); } else if (*direction != type_direction) { /* change direction */ g_object_set(stream->stream, "direction", type_direction, NULL); @@ -1350,7 +1395,7 @@ void purple_media_remove_stream(PurpleMedia *media, const gchar *sess_id, const gchar *who) { - + /* Add state-changed end emits in here when this is implemented */ } PurpleMediaSessionType diff -r d881fc5d907f -r 7d2e06b29f88 libpurple/media.h --- a/libpurple/media.h Sun Jan 04 12:13:12 2009 +0000 +++ b/libpurple/media.h Mon Jan 05 06:34:30 2009 +0000 @@ -45,6 +45,8 @@ #define PURPLE_IS_MEDIA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA)) #define PURPLE_MEDIA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA, PurpleMediaClass)) +#define PURPLE_MEDIA_TYPE_STATE_CHANGED (purple_media_state_changed_get_type()) + /** @copydoc _PurpleMedia */ typedef struct _PurpleMedia PurpleMedia; /** @copydoc _PurpleMediaClass */ @@ -69,6 +71,13 @@ PURPLE_MEDIA_VIDEO = PURPLE_MEDIA_RECV_VIDEO | PURPLE_MEDIA_SEND_VIDEO } PurpleMediaSessionType; +/** Media state-changed types */ +typedef enum { + PURPLE_MEDIA_STATE_CHANGED_NEW = 0, + PURPLE_MEDIA_STATE_CHANGED_CONNECTED, + PURPLE_MEDIA_STATE_CHANGED_END, +} PurpleMediaStateChangedType; + #ifdef USE_VV /** The media class */ @@ -95,6 +104,13 @@ */ GType purple_media_get_type(void); +/** + * Gets the type of the state-changed enum + * + * @return The state-changed enum's GType + */ +GType purple_media_state_changed_get_type(void); + /**************************************************************************/ /** @name Media Utility Functions */ /**************************************************************************/ diff -r d881fc5d907f -r 7d2e06b29f88 libpurple/protocols/jabber/jingle/rtp.c --- a/libpurple/protocols/jabber/jingle/rtp.c Sun Jan 04 12:13:12 2009 +0000 +++ b/libpurple/protocols/jabber/jingle/rtp.c Mon Jan 05 06:34:30 2009 +0000 @@ -329,6 +329,13 @@ } } +static void +jingle_rtp_state_changed_cb(PurpleMedia *media, PurpleMediaStateChangedType type, + gchar *sid, gchar *name, JingleSession *session) +{ + purple_debug_info("jingle-rtp", "state-changed: type %d id: %s name: %s\n", type, sid, name); +} + static PurpleMedia * jingle_rtp_create_media(JingleContent *content) { @@ -368,6 +375,8 @@ G_CALLBACK(jingle_rtp_candidate_pair_established_cb), session); g_signal_connect(G_OBJECT(media), "ready-new", G_CALLBACK(jingle_rtp_ready_cb), session); + g_signal_connect(G_OBJECT(media), "state-changed", + G_CALLBACK(jingle_rtp_state_changed_cb), session); g_object_unref(session); return media;