comparison libpurple/media.c @ 26069:7d2e06b29f88

Add state-changed signal to PurpleMedia.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Mon, 05 Jan 2009 06:34:30 +0000
parents b0e6a64cbf2e
children 8dba34f5f21a
comparison
equal deleted inserted replaced
26068:d881fc5d907f 26069:7d2e06b29f88
120 NEW_CANDIDATE, 120 NEW_CANDIDATE,
121 CANDIDATES_PREPARED, 121 CANDIDATES_PREPARED,
122 CANDIDATE_PAIR, 122 CANDIDATE_PAIR,
123 CODECS_READY, 123 CODECS_READY,
124 READY_NEW, 124 READY_NEW,
125 STATE_CHANGED,
125 LAST_SIGNAL 126 LAST_SIGNAL
126 }; 127 };
127 static guint purple_media_signals[LAST_SIGNAL] = {0}; 128 static guint purple_media_signals[LAST_SIGNAL] = {0};
128 129
129 enum { 130 enum {
149 0, 150 0,
150 (GInstanceInitFunc) purple_media_init, 151 (GInstanceInitFunc) purple_media_init,
151 NULL 152 NULL
152 }; 153 };
153 type = g_type_register_static(G_TYPE_OBJECT, "PurpleMedia", &info, 0); 154 type = g_type_register_static(G_TYPE_OBJECT, "PurpleMedia", &info, 0);
155 }
156 return type;
157 }
158
159 GType
160 purple_media_state_changed_get_type()
161 {
162 static GType type = 0;
163 if (type == 0) {
164 static const GEnumValue values[] = {
165 { PURPLE_MEDIA_STATE_CHANGED_NEW, "PURPLE_MEDIA_STATE_CHANGED_NEW", "new" },
166 { PURPLE_MEDIA_STATE_CHANGED_CONNECTED, "PURPLE_MEDIA_STATE_CHANGED_CONNECTED", "connected" },
167 { PURPLE_MEDIA_STATE_CHANGED_END, "PURPLE_MEDIA_STATE_CHANGED_END", "end" },
168 { 0, NULL, NULL }
169 };
170 type = g_enum_register_static("PurpleMediaStateChangedType", values);
154 } 171 }
155 return type; 172 return type;
156 } 173 }
157 174
158 static void 175 static void
234 G_TYPE_NONE, 1, G_TYPE_STRING); 251 G_TYPE_NONE, 1, G_TYPE_STRING);
235 purple_media_signals[READY_NEW] = g_signal_new("ready-new", G_TYPE_FROM_CLASS(klass), 252 purple_media_signals[READY_NEW] = g_signal_new("ready-new", G_TYPE_FROM_CLASS(klass),
236 G_SIGNAL_RUN_LAST, 0, NULL, NULL, 253 G_SIGNAL_RUN_LAST, 0, NULL, NULL,
237 purple_smarshal_VOID__STRING_STRING, 254 purple_smarshal_VOID__STRING_STRING,
238 G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); 255 G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
256 purple_media_signals[STATE_CHANGED] = g_signal_new("state-changed", G_TYPE_FROM_CLASS(klass),
257 G_SIGNAL_RUN_LAST, 0, NULL, NULL,
258 purple_smarshal_VOID__ENUM_STRING_STRING,
259 G_TYPE_NONE, 3, PURPLE_MEDIA_TYPE_STATE_CHANGED,
260 G_TYPE_STRING, G_TYPE_STRING);
239 g_type_class_add_private(klass, sizeof(PurpleMediaPrivate)); 261 g_type_class_add_private(klass, sizeof(PurpleMediaPrivate));
240 } 262 }
241 263
242 264
243 static void 265 static void
843 } 865 }
844 866
845 void 867 void
846 purple_media_hangup(PurpleMedia *media) 868 purple_media_hangup(PurpleMedia *media)
847 { 869 {
870 g_signal_emit(media, purple_media_signals[STATE_CHANGED],
871 0, PURPLE_MEDIA_STATE_CHANGED_END,
872 NULL, NULL);
848 g_signal_emit(media, purple_media_signals[HANGUP], 0); 873 g_signal_emit(media, purple_media_signals[HANGUP], 0);
849 } 874 }
850 875
851 void 876 void
852 purple_media_reject(PurpleMedia *media) 877 purple_media_reject(PurpleMedia *media)
853 { 878 {
879 g_signal_emit(media, purple_media_signals[STATE_CHANGED],
880 0, PURPLE_MEDIA_STATE_CHANGED_END,
881 NULL, NULL);
854 g_signal_emit(media, purple_media_signals[REJECT], 0); 882 g_signal_emit(media, purple_media_signals[REJECT], 0);
855 } 883 }
856 884
857 void 885 void
858 purple_media_got_request(PurpleMedia *media) 886 purple_media_got_request(PurpleMedia *media)
861 } 889 }
862 890
863 void 891 void
864 purple_media_got_hangup(PurpleMedia *media) 892 purple_media_got_hangup(PurpleMedia *media)
865 { 893 {
894 g_signal_emit(media, purple_media_signals[STATE_CHANGED],
895 0, PURPLE_MEDIA_STATE_CHANGED_END,
896 NULL, NULL);
866 g_signal_emit(media, purple_media_signals[GOT_HANGUP], 0); 897 g_signal_emit(media, purple_media_signals[GOT_HANGUP], 0);
867 } 898 }
868 899
869 void 900 void
870 purple_media_got_accept(PurpleMedia *media) 901 purple_media_got_accept(PurpleMedia *media)
1170 stream->sink); 1201 stream->sink);
1171 sinkpad = gst_element_get_static_pad(stream->sink, "ghostsink"); 1202 sinkpad = gst_element_get_static_pad(stream->sink, "ghostsink");
1172 purple_debug_info("media", "connecting new src pad: %s\n", 1203 purple_debug_info("media", "connecting new src pad: %s\n",
1173 gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure"); 1204 gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure");
1174 gst_element_set_state(stream->sink, GST_STATE_PLAYING); 1205 gst_element_set_state(stream->sink, GST_STATE_PLAYING);
1206
1207 g_signal_emit(stream->session->media, purple_media_signals[STATE_CHANGED],
1208 0, PURPLE_MEDIA_STATE_CHANGED_CONNECTED,
1209 stream->session->id, stream->participant);
1175 } 1210 }
1176 1211
1177 static gchar * 1212 static gchar *
1178 purple_media_get_stun_pref_ip() 1213 purple_media_get_stun_pref_ip()
1179 { 1214 {
1257 session->id = g_strdup(sess_id); 1292 session->id = g_strdup(sess_id);
1258 session->media = media; 1293 session->media = media;
1259 session->type = purple_media_from_fs(type, type_direction); 1294 session->type = purple_media_from_fs(type, type_direction);
1260 1295
1261 purple_media_add_session(media, session); 1296 purple_media_add_session(media, session);
1297 g_signal_emit(media, purple_media_signals[STATE_CHANGED],
1298 0, PURPLE_MEDIA_STATE_CHANGED_NEW,
1299 session->id, NULL);
1262 } 1300 }
1263 1301
1264 if (!(participant = purple_media_add_participant(media, who))) { 1302 if (!(participant = purple_media_add_participant(media, who))) {
1265 purple_media_remove_session(media, session); 1303 purple_media_remove_session(media, session);
1266 g_free(session); 1304 g_free(session);
1267 return FALSE; 1305 return FALSE;
1306 } else {
1307 g_signal_emit(media, purple_media_signals[STATE_CHANGED],
1308 0, PURPLE_MEDIA_STATE_CHANGED_NEW,
1309 NULL, who);
1268 } 1310 }
1269 1311
1270 stream = purple_media_get_stream(media, sess_id, who); 1312 stream = purple_media_get_stream(media, sess_id, who);
1271 1313
1272 if (!stream) { 1314 if (!stream) {
1308 1350
1309 /* callback for source pad added (new stream source ready) */ 1351 /* callback for source pad added (new stream source ready) */
1310 g_signal_connect(G_OBJECT(fsstream), 1352 g_signal_connect(G_OBJECT(fsstream),
1311 "src-pad-added", G_CALLBACK(purple_media_src_pad_added_cb), stream); 1353 "src-pad-added", G_CALLBACK(purple_media_src_pad_added_cb), stream);
1312 1354
1355 g_signal_emit(media, purple_media_signals[STATE_CHANGED],
1356 0, PURPLE_MEDIA_STATE_CHANGED_NEW,
1357 session->id, who);
1313 } else if (*direction != type_direction) { 1358 } else if (*direction != type_direction) {
1314 /* change direction */ 1359 /* change direction */
1315 g_object_set(stream->stream, "direction", type_direction, NULL); 1360 g_object_set(stream->stream, "direction", type_direction, NULL);
1316 } 1361 }
1317 1362
1348 } 1393 }
1349 1394
1350 void 1395 void
1351 purple_media_remove_stream(PurpleMedia *media, const gchar *sess_id, const gchar *who) 1396 purple_media_remove_stream(PurpleMedia *media, const gchar *sess_id, const gchar *who)
1352 { 1397 {
1353 1398 /* Add state-changed end emits in here when this is implemented */
1354 } 1399 }
1355 1400
1356 PurpleMediaSessionType 1401 PurpleMediaSessionType
1357 purple_media_get_session_type(PurpleMedia *media, const gchar *sess_id) 1402 purple_media_get_session_type(PurpleMedia *media, const gchar *sess_id)
1358 { 1403 {