# HG changeset patch # User Etan Reisner # Date 1250204219 0 # Node ID cbb907781528861cb05e90cea8ab0a94ae1dcb68 # Parent 9358464cdf6aad2fb6ca1cae3f6fc341db11b9ea# Parent 3a52cc5eb30a4c8817195080a93907394ac48533 merge of '595994cbd9222742a876670d7503f564822c34c1' and 'b3fde32d81f67879e4efa44dfa6f550e6b4eeeff' diff -r 3a52cc5eb30a -r cbb907781528 ChangeLog --- a/ChangeLog Thu Aug 13 22:56:45 2009 +0000 +++ b/ChangeLog Thu Aug 13 22:56:59 2009 +0000 @@ -47,6 +47,8 @@ * Various memory leaks fixed as reported by Josh Mueller. * Properly handle an IRC buddy appearing in multiple groups. * Escape HTML entities in usernames when written with the HTML logger. + * Do not display MySpace status changes as incoming IMs. (Mark Doliner and + Justin Williams) AIM and ICQ: * Preliminary support for a new authentication scheme called diff -r 3a52cc5eb30a -r cbb907781528 libpurple/ft.c --- a/libpurple/ft.c Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/ft.c Thu Aug 13 22:56:59 2009 +0000 @@ -926,9 +926,6 @@ if (xfer->ops.read != NULL) { r = (xfer->ops.read)(buffer, xfer); - if ((purple_xfer_get_size(xfer) > 0) && - ((purple_xfer_get_bytes_sent(xfer)+r) >= purple_xfer_get_size(xfer))) - purple_xfer_set_completed(xfer, TRUE); } else { *buffer = g_malloc0(s); @@ -938,9 +935,6 @@ r = 0; else if (r < 0) r = -1; - else if ((purple_xfer_get_size(xfer) > 0) && - ((purple_xfer_get_bytes_sent(xfer)+r) >= purple_xfer_get_size(xfer))) - purple_xfer_set_completed(xfer, TRUE); else if (r == 0) r = -1; } @@ -1004,6 +998,10 @@ g_free(buffer); return; } + + if ((purple_xfer_get_size(xfer) > 0) && + ((purple_xfer_get_bytes_sent(xfer)+r) >= purple_xfer_get_size(xfer))) + purple_xfer_set_completed(xfer, TRUE); } else if(r < 0) { purple_xfer_cancel_remote(xfer); g_free(buffer); diff -r 3a52cc5eb30a -r cbb907781528 libpurple/media.c --- a/libpurple/media.c Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/media.c Thu Aug 13 22:56:59 2009 +0000 @@ -1906,8 +1906,8 @@ gst_element_add_pad(session->media->priv->confbin, ghost); } + gst_element_set_state(session->tee, GST_STATE_PLAYING); gst_element_link(session->src, session->media->priv->confbin); - gst_element_set_state(session->tee, GST_STATE_PLAYING); g_object_get(session->session, "sink-pad", &sinkpad, NULL); if (session->type & PURPLE_MEDIA_SEND_AUDIO) { @@ -1922,10 +1922,10 @@ g_free(name); gst_bin_add(GST_BIN(session->media->priv->confbin), volume); gst_bin_add(GST_BIN(session->media->priv->confbin), level); - gst_element_link(session->tee, volume); - gst_element_link(volume, level); gst_element_set_state(level, GST_STATE_PLAYING); gst_element_set_state(volume, GST_STATE_PLAYING); + gst_element_link(volume, level); + gst_element_link(session->tee, volume); srcpad = gst_element_get_static_pad(level, "src"); g_object_set(volume, "volume", input_volume, NULL); } else { @@ -2466,6 +2466,7 @@ gst_element_set_state(sink, GST_STATE_PLAYING); gst_element_set_state(stream->level, GST_STATE_PLAYING); gst_element_set_state(stream->volume, GST_STATE_PLAYING); + gst_element_set_state(queue, GST_STATE_PLAYING); gst_element_link(stream->level, sink); gst_element_link(stream->volume, stream->level); gst_element_link(queue, stream->volume); @@ -2477,11 +2478,11 @@ "fakesink", NULL); g_object_set(G_OBJECT(sink), "async", FALSE, NULL); gst_bin_add(GST_BIN(priv->confbin), sink); + gst_element_set_state(sink, GST_STATE_PLAYING); } stream->tee = gst_element_factory_make("tee", NULL); gst_bin_add_many(GST_BIN(priv->confbin), stream->src, stream->tee, NULL); - gst_element_set_state(sink, GST_STATE_PLAYING); gst_element_set_state(stream->tee, GST_STATE_PLAYING); gst_element_set_state(stream->src, GST_STATE_PLAYING); gst_element_link_many(stream->src, stream->tee, sink, NULL); @@ -2617,26 +2618,27 @@ 0, PURPLE_MEDIA_STATE_NEW, session->id, NULL); - session_type = purple_media_from_fs(media_type, - FS_DIRECTION_SEND); - src = purple_media_manager_get_element( - media->priv->manager, session_type, - media, session->id, who); - if (!GST_IS_ELEMENT(src)) { - purple_debug_error("media", - "Error creating src for session %s\n", - session->id); - purple_media_end(media, session->id, NULL); - return FALSE; + if (type_direction & FS_DIRECTION_SEND) { + session_type = purple_media_from_fs(media_type, + FS_DIRECTION_SEND); + src = purple_media_manager_get_element( + media->priv->manager, session_type, + media, session->id, who); + if (!GST_IS_ELEMENT(src)) { + purple_debug_error("media", + "Error creating src for session %s\n", + session->id); + purple_media_end(media, session->id, NULL); + return FALSE; + } + + purple_media_set_src(media, session->id, src); + gst_element_set_state(session->src, GST_STATE_PLAYING); + purple_media_manager_create_output_window( + media->priv->manager, + session->media, + session->id, NULL); } - - purple_media_set_src(media, session->id, src); - gst_element_set_state(session->src, GST_STATE_PLAYING); - - purple_media_manager_create_output_window( - media->priv->manager, - session->media, - session->id, NULL); } if (!(participant = purple_media_add_participant(media, who))) { @@ -3002,14 +3004,23 @@ if (session == NULL) return FALSE; - - g_object_get(session->session, "codecs-ready", &ret, NULL); + if (session->type & (PURPLE_MEDIA_SEND_AUDIO | + PURPLE_MEDIA_SEND_VIDEO)) + g_object_get(session->session, + "codecs-ready", &ret, NULL); + else + ret = TRUE; } else { GList *values = g_hash_table_get_values(media->priv->sessions); for (; values; values = g_list_delete_link(values, values)) { PurpleMediaSession *session = values->data; - g_object_get(session->session, - "codecs-ready", &ret, NULL); + if (session->type & (PURPLE_MEDIA_SEND_AUDIO | + PURPLE_MEDIA_SEND_VIDEO)) + g_object_get(session->session, + "codecs-ready", &ret, NULL); + else + ret = TRUE; + if (ret == FALSE) break; } diff -r 3a52cc5eb30a -r cbb907781528 libpurple/mediamanager.c --- a/libpurple/mediamanager.c Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/mediamanager.c Thu Aug 13 22:56:59 2009 +0000 @@ -473,7 +473,6 @@ gst_element_link(tee, fakesink); ret = bin; - gst_element_set_locked_state(ret, TRUE); gst_object_ref(ret); gst_bin_add(GST_BIN(purple_media_manager_get_pipeline( manager)), ret); @@ -714,7 +713,7 @@ (participant == ow->participant)) && !strcmp(session_id, ow->session_id)) { GstBus *bus; - GstElement *queue; + GstElement *queue, *colorspace; GstElement *tee = purple_media_get_tee(media, session_id, participant); @@ -723,6 +722,8 @@ queue = gst_element_factory_make( "queue", NULL); + colorspace = gst_element_factory_make( + "ffmpegcolorspace", NULL); ow->sink = purple_media_manager_get_element( manager, PURPLE_MEDIA_RECV_VIDEO, ow->media, ow->session_id, @@ -743,7 +744,7 @@ } gst_bin_add_many(GST_BIN(GST_ELEMENT_PARENT(tee)), - queue, ow->sink, NULL); + queue, colorspace, ow->sink, NULL); bus = gst_pipeline_get_bus(GST_PIPELINE( manager->priv->pipeline)); @@ -752,8 +753,10 @@ gst_object_unref(bus); gst_element_set_state(ow->sink, GST_STATE_PLAYING); + gst_element_set_state(colorspace, GST_STATE_PLAYING); gst_element_set_state(queue, GST_STATE_PLAYING); - gst_element_link(queue, ow->sink); + gst_element_link(colorspace, ow->sink); + gst_element_link(queue, colorspace); gst_element_link(tee, queue); } } @@ -822,8 +825,14 @@ GstPad *pad = gst_element_get_static_pad( output_window->sink, "sink"); GstPad *peer = gst_pad_get_peer(pad); - GstElement *queue = GST_ELEMENT_PARENT(peer); + GstElement *colorspace = GST_ELEMENT_PARENT(peer), *queue; gst_object_unref(pad); + gst_object_unref(peer); + pad = gst_element_get_static_pad(colorspace, "sink"); + peer = gst_pad_get_peer(pad); + queue = GST_ELEMENT_PARENT(peer); + gst_object_unref(pad); + gst_object_unref(peer); pad = gst_element_get_static_pad(queue, "sink"); peer = gst_pad_get_peer(pad); gst_object_unref(pad); @@ -832,6 +841,9 @@ gst_element_set_locked_state(queue, TRUE); gst_element_set_state(queue, GST_STATE_NULL); gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(queue)), queue); + gst_element_set_locked_state(colorspace, TRUE); + gst_element_set_state(colorspace, GST_STATE_NULL); + gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(colorspace)), colorspace); gst_element_set_locked_state(output_window->sink, TRUE); gst_element_set_state(output_window->sink, GST_STATE_NULL); gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(output_window->sink)), diff -r 3a52cc5eb30a -r cbb907781528 libpurple/protocols/jabber/jingle/rtp.c --- a/libpurple/protocols/jabber/jingle/rtp.c Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/protocols/jabber/jingle/rtp.c Thu Aug 13 22:56:59 2009 +0000 @@ -589,8 +589,8 @@ if (!strcmp(senders, "both")) type = is_audio == TRUE ? PURPLE_MEDIA_AUDIO : PURPLE_MEDIA_VIDEO; - else if (!strcmp(senders, "initiator") - && jingle_session_is_initiator(session)) + else if ((strcmp(senders, "initiator") == 0) == + jingle_session_is_initiator(session)) type = is_audio == TRUE ? PURPLE_MEDIA_SEND_AUDIO : PURPLE_MEDIA_SEND_VIDEO; else diff -r 3a52cc5eb30a -r cbb907781528 libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/protocols/myspace/myspace.c Thu Aug 13 22:56:59 2009 +0000 @@ -1341,6 +1341,27 @@ return ret; } #endif +/** + * Process incoming status mood messages. + * + * @param session + * @param msg Status mood update message. Caller frees. + * + * @return TRUE if successful. + */ +static gboolean +msim_incoming_status_mood(MsimSession *session, MsimMessage *msg) { + /* TODO: I dont know too much about this yet, + * so until I see how the official client handles + * this and decide if libpurple should as well, + * well just say we used it + */ + gchar *ss; + ss = msim_msg_get_string(msg, "msg"); + purple_debug_info("msim", "Incoming Status Message: %s", ss ? ss : "(NULL)"); + g_free(ss); + return TRUE; +} /** * Process incoming status messages. @@ -1692,6 +1713,8 @@ return msim_incoming_media(session, msg); case MSIM_BM_UNOFFICIAL_CLIENT: return msim_incoming_unofficial_client(session, msg); + case MSIM_BM_STATUS_MOOD: + return msim_incoming_status_mood(session, msg); default: /* * Unknown message type! We used to call diff -r 3a52cc5eb30a -r cbb907781528 libpurple/protocols/myspace/myspace.h --- a/libpurple/protocols/myspace/myspace.h Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/protocols/myspace/myspace.h Thu Aug 13 22:56:59 2009 +0000 @@ -132,6 +132,7 @@ #define MSIM_BM_ACTION_OR_IM_INSTANT 121 #define MSIM_BM_MEDIA 122 #define MSIM_BM_PROFILE 124 +#define MSIM_BM_STATUS_MOOD 126 #define MSIM_BM_UNOFFICIAL_CLIENT 200 /* Authentication algorithm for login2 */ diff -r 3a52cc5eb30a -r cbb907781528 libpurple/protocols/yahoo/libymsg.c --- a/libpurple/protocols/yahoo/libymsg.c Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/protocols/yahoo/libymsg.c Thu Aug 13 22:56:59 2009 +0000 @@ -971,7 +971,7 @@ /* disconnect the peer if connected through p2p and sends wrong value for session id */ if( (pkt_type == YAHOO_PKT_TYPE_P2P) && (val_11 != yd->session_id) ) { - purple_debug_warning("yahoo","p2p: %s sent us message with wrong session id. Disconnecting p2p connection to peer\n", im->from); + purple_debug_warning("yahoo","p2p: %s sent us message with wrong session id. Disconnecting p2p connection to peer\n", im ? im->from : "(im was null)"); /* remove from p2p connection lists, also calls yahoo_p2p_disconnect_destroy_data */ g_hash_table_remove(yd->peers, im->from); return; diff -r 3a52cc5eb30a -r cbb907781528 libpurple/util.c --- a/libpurple/util.c Thu Aug 13 22:56:45 2009 +0000 +++ b/libpurple/util.c Thu Aug 13 22:56:59 2009 +0000 @@ -405,7 +405,7 @@ encoded_word_state_t state = state_start; const char *cur, *mark; const char *charset0 = NULL, *encoding0 = NULL, *encoded_text0 = NULL; - char *n, *new; + GString *new; /* token can be any CHAR (supposedly ISO8859-1/ISO2022), not just ASCII */ #define token_char_p(c) \ @@ -415,16 +415,9 @@ #define encoded_text_char_p(c) \ ((c & 0x80) == 0 && c != '?' && c != ' ' && isgraph(c)) - #define RECOVER_MARKED_TEXT strncpy(n, mark, cur - mark + 1); \ - n += cur - mark + 1 - g_return_val_if_fail(str != NULL, NULL); - /* NOTE: Assuming that we need just strlen(str)+1 *may* be wrong. - * It would be wrong if one byte (in some unknown encoding) could - * expand to >=4 bytes of UTF-8; I don't know if there are such things. - */ - n = new = g_malloc(strlen(str) + 1); + new = g_string_new(NULL); /* Here we will be looking for encoded words and if they seem to be * valid then decode them. @@ -437,7 +430,7 @@ if (*cur == '?') { state = state_question1; } else { - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -446,7 +439,7 @@ charset0 = cur; state = state_charset; } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -454,7 +447,7 @@ if (*cur == '?') { state = state_question2; } else if (!token_char_p(*cur)) { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -463,7 +456,7 @@ encoding0 = cur; state = state_encoding; } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -471,7 +464,7 @@ if (*cur == '?') { state = state_question3; } else if (!token_char_p(*cur)) { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -483,7 +476,7 @@ encoded_text0 = cur; state = state_question4; } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -491,7 +484,7 @@ if (*cur == '?') { state = state_question4; } else if (!encoded_text_char_p(*cur)) { - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -513,7 +506,7 @@ char *converted = g_convert((const gchar *)decoded, dec_len, "utf-8", charset, NULL, &len, NULL); if (converted) { - n = strncpy(n, converted, len) + len; + g_string_append_len(new, converted, len); g_free(converted); } g_free(decoded); @@ -523,7 +516,7 @@ g_free(encoded_text); state = state_equal2; /* Restart the FSM */ } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -533,19 +526,16 @@ state = state_equal1; } else { /* Some unencoded text. */ - *n = *cur; - n += 1; + g_string_append_c(new, *cur); } break; } /* switch */ } /* for */ - if (state != state_start) { - RECOVER_MARKED_TEXT; - } - *n = '\0'; - - return new; + if (state != state_start) + g_string_append_len(new, mark, cur - mark + 1); + + return g_string_free(new, FALSE);; } diff -r 3a52cc5eb30a -r cbb907781528 pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Thu Aug 13 22:56:45 2009 +0000 +++ b/pidgin/gtkmedia.c Thu Aug 13 22:56:59 2009 +0000 @@ -882,6 +882,14 @@ GstPad *ghost; GstCaps *caps; +#ifdef _WIN32 + /* autovideosrc doesn't pick ksvideosrc for some reason */ + src = gst_element_factory_make("ksvideosrc", NULL); + if (src == NULL) + src = gst_element_factory_make("dshowvideosrc", NULL); + if (src == NULL) + src = gst_element_factory_make("autovideosrc", NULL); +#else src = gst_element_factory_make("gconfvideosrc", NULL); if (src == NULL) src = gst_element_factory_make("autovideosrc", NULL); @@ -889,10 +897,7 @@ src = gst_element_factory_make("v4l2src", NULL); if (src == NULL) src = gst_element_factory_make("v4lsrc", NULL); - if (src == NULL) - src = gst_element_factory_make("ksvideosrc", NULL); - if (src == NULL) - src = gst_element_factory_make("dshowvideosrc", NULL); +#endif if (src == NULL) { purple_debug_error("gtkmedia", "Unable to find a suitable " "element for the default video source.\n");