Mercurial > pidgin.yaz
changeset 28010:0754698c49f4
merged with im.pidgin.pidgin
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sun, 26 Jul 2009 22:18:59 +0900 |
parents | 7a661fe78cdd (diff) efe680b86811 (current diff) |
children | 586093c4b17b |
files | configure.ac libpurple/certificate.c libpurple/protocols/jabber/google.c libpurple/protocols/jabber/jabber.c libpurple/protocols/oscar/family_icbm.c libpurple/protocols/yahoo/libymsg.c libpurple/server.c pidgin/gtkblist.c pidgin/pixmaps/dialogs/64/scalable/auth.svg pidgin/pixmaps/dialogs/64/scalable/cool.svg pidgin/pixmaps/dialogs/64/scalable/dialog.svg pidgin/pixmaps/dialogs/64/scalable/error.svg pidgin/pixmaps/dialogs/64/scalable/info.svg pidgin/pixmaps/dialogs/64/scalable/mail.svg pidgin/pixmaps/dialogs/64/scalable/question.svg pidgin/pixmaps/dialogs/64/scalable/warning.svg pidgin/pixmaps/emblems/16/scalable/aol-client.svg pidgin/pixmaps/emblems/16/scalable/birthday.svg pidgin/pixmaps/emblems/16/scalable/blocked.svg pidgin/pixmaps/emblems/16/scalable/bot.svg pidgin/pixmaps/emblems/16/scalable/external.svg pidgin/pixmaps/emblems/16/scalable/female.svg pidgin/pixmaps/emblems/16/scalable/free-for-chat.svg pidgin/pixmaps/emblems/16/scalable/game.svg pidgin/pixmaps/emblems/16/scalable/male.svg pidgin/pixmaps/emblems/16/scalable/mobile.svg pidgin/pixmaps/emblems/16/scalable/music.svg pidgin/pixmaps/emblems/16/scalable/not-authorized.svg pidgin/pixmaps/emblems/16/scalable/qq-member.svg pidgin/pixmaps/emblems/16/scalable/secure.svg pidgin/pixmaps/emblems/16/scalable/unavailable.svg pidgin/pixmaps/emblems/16/scalable/video.svg pidgin/pixmaps/emblems/16/scalable/voice.svg pidgin/pixmaps/protocols/48/scalable/aim.svg pidgin/pixmaps/protocols/48/scalable/bonjour.svg pidgin/pixmaps/protocols/48/scalable/gadu-gadu.svg pidgin/pixmaps/protocols/48/scalable/google-talk.svg pidgin/pixmaps/protocols/48/scalable/icq.svg pidgin/pixmaps/protocols/48/scalable/irc.svg pidgin/pixmaps/protocols/48/scalable/jabber.svg pidgin/pixmaps/protocols/48/scalable/meanwhile.svg pidgin/pixmaps/protocols/48/scalable/msn.svg pidgin/pixmaps/protocols/48/scalable/novell.svg pidgin/pixmaps/protocols/48/scalable/qq.svg pidgin/pixmaps/protocols/48/scalable/silc.svg pidgin/pixmaps/protocols/48/scalable/simple.svg pidgin/pixmaps/protocols/48/scalable/yahoo.svg pidgin/pixmaps/protocols/48/scalable/zephyr.svg |
diffstat | 51 files changed, 1141 insertions(+), 1455 deletions(-) [+] |
line wrap: on
line diff
--- a/autogen.sh Sat Jul 25 02:55:33 2009 +0000 +++ b/autogen.sh Sun Jul 26 22:18:59 2009 +0900 @@ -149,4 +149,4 @@ # Run configure ############################################################################### echo "running ./configure ${CONFIGURE_FLAGS} $@" -./configure ${CONFIGURE_FLAGS} $@ +#./configure ${CONFIGURE_FLAGS} $@
--- a/configure.ac Sat Jul 25 02:55:33 2009 +0000 +++ b/configure.ac Sun Jul 26 22:18:59 2009 +0900 @@ -144,7 +144,7 @@ ;; esac -ALL_LINGUAS="af am ar az be@latin bg bn bs ca ca@valencia cs da de dz el en_AU en_CA en_GB eo es et eu fa fi fr ga gl gu he hi hu hy id it ja ka km kn ko ku lo lt mk mn my_MM nb ne nl nn oc pa pl pt_BR pt ps ro ru si sk sl sq sr sr@latin sv sw ta te th tr uk ur vi xh zh_CN zh_HK zh_TW" +ALL_LINGUAS="" AM_GLIB_GNU_GETTEXT dnl If we don't have msgfmt, then po/ is going to fail -- ensure that
--- a/libpurple/conversation.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/conversation.c Sun Jul 26 22:18:59 2009 +0900 @@ -653,6 +653,8 @@ PurpleBuddy *b; PurpleChat *chat; const char *text = NULL, *name; + gchar *utf8; + gsize dummy; g_return_if_fail(conv != NULL); @@ -671,7 +673,9 @@ if(text == NULL) text = name; - purple_conversation_set_title(conv, text); + utf8 = sanitize_utf(text, strlen(text), &dummy); + purple_conversation_set_title(conv, utf8); + g_free(utf8); } void @@ -1162,17 +1166,27 @@ PurpleMessageFlags flags, time_t mtime) { PurpleConversation *c; + char *tmpmessage = NULL; g_return_if_fail(im != NULL); g_return_if_fail(message != NULL); c = purple_conv_im_get_conversation(im); + // yaz + if (purple_prefs_get_bool("/purple/conversations/msnstyle")) { + tmpmessage = g_strdup_printf("<br>%s", message); + } else { + tmpmessage = g_strdup_printf("%s", message); + } + /* Pass this on to either the ops structure or the default write func. */ if (c->ui_ops != NULL && c->ui_ops->write_im != NULL) - c->ui_ops->write_im(c, who, message, flags, mtime); + c->ui_ops->write_im(c, who, tmpmessage, flags, mtime); else - purple_conversation_write(c, who, message, flags, mtime); + purple_conversation_write(c, who, tmpmessage, flags, mtime); + + g_free(tmpmessage); } gboolean purple_conv_present_error(const char *who, PurpleAccount *account, const char *what)
--- a/libpurple/notify.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/notify.c Sun Jul 26 22:18:59 2009 +0900 @@ -417,6 +417,9 @@ purple_signal_emit(purple_notify_get_handle(), "displaying-userinfo", purple_connection_get_account(gc), who, user_info); + g_return_val_if_fail(g_utf8_validate(who, -1, NULL), NULL); //yaz + g_return_val_if_fail(g_utf8_validate(user_info, -1, NULL), NULL); //yaz + ui_handle = ops->notify_userinfo(gc, who, user_info); if (ui_handle != NULL) {
--- a/libpurple/protocols/gg/lib/http.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/gg/lib/http.c Sun Jul 26 22:18:59 2009 +0900 @@ -44,6 +44,7 @@ #include "compat.h" #include "libgadu.h" +#include <glib.h> /* * gg_http_connect() // funkcja pomocnicza
--- a/libpurple/protocols/gg/lib/pubdir50.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/gg/lib/pubdir50.c Sun Jul 26 22:18:59 2009 +0900 @@ -22,6 +22,7 @@ #include <stdlib.h> #include <string.h> #include <time.h> +#include <glib.h> #include "libgadu.h"
--- a/libpurple/protocols/irc/irc.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/irc/irc.c Sun Jul 26 22:18:59 2009 +0900 @@ -997,6 +997,12 @@ option = purple_account_option_bool_new(_("Auto-detect incoming UTF-8"), "autodetect_utf8", IRC_DEFAULT_AUTODETECT); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + option = purple_account_option_bool_new(_("Use SO/SI to send hankaku kana"), "irc_use_sosi", FALSE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + + option = purple_account_option_bool_new(_("Use 8bit to send hankaku kana"), "irc_use_8bit", FALSE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); + option = purple_account_option_string_new(_("Username"), "username", ""); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
--- a/libpurple/protocols/irc/parse.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/irc/parse.c Sun Jul 26 22:18:59 2009 +0900 @@ -35,7 +35,7 @@ #include <ctype.h> static char *irc_send_convert(struct irc_conn *irc, const char *string); -static char *irc_recv_convert(struct irc_conn *irc, const char *string); +static char *irc_recv_convert(struct irc_conn *irc, char *string); static void irc_parse_error_cb(struct irc_conn *irc, char *input); @@ -160,6 +160,20 @@ { NULL, NULL, NULL, NULL } }; +/* yaz */ +#define ASCII 0 +#define KANJI 1 +#define KANA 2 +#define ROMAN 3 +char seq_ascii[] = {0x1B,0x28,0x42,0x00}; /* ESC ( B */ +char seq_kanji[] = {0x1B,0x24,0x42,0x00}; /* ESC $ B */ +char seq_kana[] = {0x1B,0x28,0x49,0x00}; /* ESC ( I */ +char seq_roman[] = {0x1B,0x28,0x4A,0x00}; /* ESC ( J */ +char *seq[4] = {seq_ascii, seq_kanji, seq_kana, seq_roman}; +char *jisstate[5] = {"ASCII", "KANJI", "KANA", "ROMAN"}; +char SO[] = {0x0E,0x00}; +char SI[] = {0x0F,0x00}; + static PurpleCmdRet irc_parse_purple_cmd(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) { @@ -227,34 +241,111 @@ GError *err = NULL; gchar **encodings; const gchar *enclist; + char *escpos = NULL; + char *temp = NULL; + gboolean iskana = FALSE; + char *pos = NULL; + gboolean irc_use_sosi, irc_use_8bit; + char *strtmp; + gsize strtmp_len; enclist = purple_account_get_string(irc->account, "encoding", IRC_DEFAULT_CHARSET); encodings = g_strsplit(enclist, ",", 2); + irc_use_sosi = purple_account_get_bool(irc->account, "irc_use_sosi", FALSE); + irc_use_8bit = purple_account_get_bool(irc->account, "irc_use_8bit", FALSE); + if (encodings[0] == NULL || !g_ascii_strcasecmp("UTF-8", encodings[0])) { g_strfreev(encodings); return NULL; } - utf8 = g_convert(string, strlen(string), encodings[0], "UTF-8", NULL, NULL, &err); + strtmp = botch_utf(string, strlen(string), &strtmp_len); + utf8 = g_convert(strtmp, strlen(strtmp), encodings[0], "UTF-8", NULL, NULL, &err); + if (err) { purple_debug(PURPLE_DEBUG_ERROR, "irc", "Send conversion error: %s\n", err->message); purple_debug(PURPLE_DEBUG_ERROR, "irc", "Sending as UTF-8 instead of %s\n", encodings[0]); - utf8 = g_strdup(string); + utf8 = g_strdup(strtmp); g_error_free(err); } + + /* yaz */ + if (!strncasecmp("iso-2022-jp", encodings[0], strlen("iso-2022-jp"))) { + escpos = strrchr(utf8, 0x1B); + if(escpos && (!strncmp(seq_kanji, escpos, 3) || !strncmp(seq_kana, escpos, 3))){ + char *oldutf8 = utf8; + utf8 = g_realloc(utf8, strlen(utf8)+1+3); + if(utf8) + strncat(utf8, seq_ascii, 3); + else + utf8 = oldutf8; + } + + if(irc_use_sosi || irc_use_8bit){ + /* SO/SI */ + //find kana escape and replace with roman+SO + temp = g_malloc0(strlen(utf8) * 7); //XXX should be reasonable size + pos = utf8; + while(pos < utf8+strlen(utf8)){ + escpos = strchr(pos, 0x1B); + if(escpos){ + if(!strncmp(seq_kana, escpos, 3)){ /* kana found */ + iskana = TRUE; + strncat(temp, pos, escpos-pos); + strcat(temp, seq_roman); + if(irc_use_sosi) + strcat(temp, SO); + pos = escpos+3; + } else { + if(iskana){ + char *ptr; + ptr = temp + strlen(temp); + while(pos<escpos){ + if(irc_use_8bit) + *ptr = *pos + 128; // convert to 8bit + else + *ptr = *pos; + ptr++; pos++; + } + if(irc_use_sosi) + strcat(temp, SI); + strncat(temp, escpos, 3); + pos = escpos+3; + iskana = FALSE; + } else { + strncat(temp, pos, escpos-pos+3); //include esc + pos = escpos+3; + } + } + } else { /* escpos == NULL */ + strcat(temp, pos); + break; + } + } + g_free(utf8); + utf8 = temp; + } + } + g_strfreev(encodings); - + g_free(strtmp); return utf8; } -static char *irc_recv_convert(struct irc_conn *irc, const char *string) +static char *irc_recv_convert(struct irc_conn *irc, char *string) { char *utf8 = NULL; const gchar *charset, *enclist; gchar **encodings; gboolean autodetect; int i; + GError *err; + gboolean retry; + gsize in_len, out_len; + int conv_len; + char *strtmp; + gsize strtmp_len; enclist = purple_account_get_string(irc->account, "encoding", IRC_DEFAULT_CHARSET); encodings = g_strsplit(enclist, ",", -1); @@ -278,13 +369,123 @@ if (!g_ascii_strcasecmp("UTF-8", charset)) { if (g_utf8_validate(string, -1, NULL)) utf8 = g_strdup(string); + } else if (!strncasecmp("iso-2022-jp-2", charset, strlen("iso-2022-jp-2"))){ + /* pre-process quirky jis */ + unsigned char *jisstr; + unsigned char *ptr, *ptr2; + int state = ASCII; + int is8bit = FALSE; + + jisstr = (unsigned char *)calloc(1, strlen(string)*7); /* enough? */ + ptr = (unsigned char *)string; ptr2 = jisstr; + + while(*ptr){ + if(*ptr == 0x1B){ + /* escape sequence. */ + if(*(ptr+1) == 0x28 && *(ptr+2) == 0x42){ + state = ASCII; + + } else if(*(ptr+1) == 0x24 && *(ptr+2) == 0x42){ + state = KANJI; + + } else if(*(ptr+1) == 0x28 && *(ptr+2) == 0x49){ + state = KANA; + + } else if(*(ptr+1) == 0x28 && *(ptr+2) == 0x4a){ + state = ROMAN; + + } + purple_debug(PURPLE_DEBUG_INFO, "irc", "state %s\n", jisstate[state]); + } + if(*ptr >= 0xA1 && *ptr <= 0xDF){ + /* raw 8bit */ + if(!is8bit){ + strcat((char *)jisstr, seq[KANA]); + ptr2 += 3; + is8bit = TRUE; + purple_debug(PURPLE_DEBUG_INFO, "irc", "8bit = TRUE\n"); + } + *ptr2 = *ptr - 0x80; + ptr++ ; ptr2++; + } else { + /* 7bit */ + if(*ptr == 0x0E){ + /* SO */ + strcat((char *)jisstr, seq[KANA]); + ptr++; ptr2 += 3; + purple_debug(PURPLE_DEBUG_INFO, "irc", "SO\n"); + continue; + } else if(*ptr == 0x0F){ + /* SI */ + strcat((char *)jisstr, seq[state]); + purple_debug(PURPLE_DEBUG_INFO, "irc", "SI to %s\n", jisstate[state]); + ptr++; ptr2 += 3; + purple_debug(PURPLE_DEBUG_INFO, "irc", "SI\n"); + continue; + } + if(is8bit){ /* the edge of 8bit -> 7bit */ + purple_debug(PURPLE_DEBUG_INFO, "irc", "8bit to %s\n", jisstate[state]); + strcat((char *)jisstr, seq[state]); + ptr2 += 3; + is8bit=FALSE; + purple_debug(PURPLE_DEBUG_INFO, "irc", "8bit = FALSE\n"); + } + /* copy str */ + *ptr2 = *ptr; + ptr++; ptr2++; + } + } + + /* convert & error recovery */ + do { + err = NULL; + retry = FALSE; + + conv_len = strlen((char *)jisstr); + utf8 = g_convert_with_fallback((char *)jisstr, conv_len, "UTF-8", charset, + "?", &in_len, &out_len, &err); + if(err != NULL){ + if(err->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE){ + memmove(jisstr + in_len, jisstr + in_len + 1, + conv_len - in_len -1); + conv_len--; + *(jisstr + conv_len) = '\0'; + retry = TRUE; + } + g_error_free(err); + } + } while(retry); + + if(jisstr) + free(jisstr); + } else { - utf8 = g_convert(string, -1, "UTF-8", charset, NULL, NULL, NULL); + do { + err = NULL; + retry = FALSE; + + conv_len = strlen(string); + utf8 = g_convert_with_fallback(string, conv_len, "UTF-8", charset, + "?", &in_len, &out_len, &err); + if(err != NULL){ + if(err->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE){ + memmove(string + in_len, string + in_len + 1, + conv_len - in_len -1); + conv_len--; + *(string + conv_len) = '\0'; + retry = TRUE; + } + g_error_free(err); + } + } while(retry); } - if (utf8) { - g_strfreev(encodings); - return utf8; + + if(utf8){ + strtmp = sanitize_utf(utf8, strlen(utf8), &strtmp_len); + g_strfreev(encodings); + g_free(utf8); + return strtmp; } } g_strfreev(encodings);
--- a/libpurple/protocols/jabber/google.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/jabber/google.c Sun Jul 26 22:18:59 2009 +0900 @@ -1,3 +1,4 @@ +/* -*- coding: utf-8 -*- */ /** * Purple is the legal property of its developers, whose names are too numerous * to list here. Please refer to the COPYRIGHT file distributed with this @@ -1288,8 +1289,11 @@ if (!js->googletalk) return; if (jbr->status && purple_str_has_prefix(jbr->status, "♫ ")) { + gchar *unescaped; + unescaped = purple_unescape_html(jbr->status + strlen("♫ ")); purple_prpl_got_user_status(js->gc->account, user, "tune", - PURPLE_TUNE_TITLE, jbr->status + strlen("♫ "), NULL); + PURPLE_TUNE_TITLE, unescaped, NULL); + g_free(unescaped); g_free(jbr->status); jbr->status = NULL; } else {
--- a/libpurple/protocols/jabber/jabber.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sun Jul 26 22:18:59 2009 +0900 @@ -458,8 +458,9 @@ gpointer unused) { JabberStream *js; - char *txt; + char *txt, *utf; int len; + gsize utflen; if (NULL == packet) return; @@ -471,8 +472,9 @@ g_str_equal((*packet)->name, "presence")) xmlnode_set_namespace(*packet, "jabber:client"); txt = xmlnode_to_str(*packet, &len); - jabber_send_raw(js, txt, len); - g_free(txt); + utf = botch_utf(txt, len, &utflen); //yaz + jabber_send_raw(js, utf, utflen); + g_free(txt); g_free(utf); } void jabber_send(JabberStream *js, xmlnode *packet) @@ -2081,6 +2083,7 @@ const char *title = purple_status_get_attr_string(tune, PURPLE_TUNE_TITLE); const char *artist = purple_status_get_attr_string(tune, PURPLE_TUNE_ARTIST); const char *album = purple_status_get_attr_string(tune, PURPLE_TUNE_ALBUM); + char *playing = purple_util_format_song_info(title, artist, album, NULL); if (playing) { purple_notify_user_info_add_pair(user_info, _("Now Listening"), playing);
--- a/libpurple/protocols/jabber/message.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/jabber/message.c Sun Jul 26 22:18:59 2009 +0900 @@ -616,13 +616,17 @@ jm->thread_id = xmlnode_get_data(child); } else if(!strcmp(child->name, "body") && !strcmp(xmlns,"jabber:client")) { if(!jm->body) { - char *msg = xmlnode_to_str(child, NULL); + char *tmp, *msg; + gsize len; + tmp = xmlnode_to_str(child, NULL); + msg = sanitize_utf(tmp, strlen(tmp), &len); jm->body = purple_strdup_withhtml(msg); - g_free(msg); + g_free(msg); g_free(tmp); } } else if(!strcmp(child->name, "html") && !strcmp(xmlns,"http://jabber.org/protocol/xhtml-im")) { if(!jm->xhtml && xmlnode_get_child(child, "body")) { char *c; + gsize len; const PurpleConnection *gc = js->gc; PurpleAccount *account = purple_connection_get_account(gc); @@ -673,7 +677,9 @@ reformatted_xhtml = jabber_message_xml_to_string_strip_img_smileys(child); - jm->xhtml = reformatted_xhtml; + jm->xhtml = + sanitize_utf(reformatted_xhtml, + strlen(reformatted_xhtml), &len); /* add known custom emoticons to the conversation */ /* note: if there were no smileys in the incoming message, or
--- a/libpurple/protocols/jabber/si.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/jabber/si.c Sun Jul 26 22:18:59 2009 +0900 @@ -38,6 +38,8 @@ #define STREAMHOST_CONNECT_TIMEOUT 15 +#include "util.h" + typedef struct _JabberSIXfer { JabberStream *js; @@ -1258,8 +1260,17 @@ JabberIq *iq; xmlnode *si, *file, *feature, *x, *field, *option, *value; char buf[32]; + gchar *f1 = NULL, *f2 = NULL; + gsize dummy; - xfer->filename = g_path_get_basename(xfer->local_filename); + /* yaz */ + f1 = g_filename_display_basename(xfer->local_filename); + f2 = botch_utf(f1, strlen(f1), &dummy); + if(f2){ + purple_xfer_set_filename(xfer, (char *)f2); + } + g_free(f1); f1 = NULL; + g_free(f2); f2 = NULL; iq = jabber_iq_new(jsx->js, JABBER_IQ_SET); xmlnode_set_attrib(iq->node, "to", xfer->who);
--- a/libpurple/protocols/msn/msg.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/msn/msg.c Sun Jul 26 22:18:59 2009 +0900 @@ -108,7 +108,8 @@ msn_message_new_plain(const char *message) { MsnMessage *msg; - char *message_cr; + char *message_cr, *message_cr2; + gsize len; msg = msn_message_new(MSN_MSG_TEXT); msg->retries = 1; @@ -120,8 +121,10 @@ "FN=Segoe%20UI; EF=; CO=0; CS=1;PF=0"); message_cr = purple_str_add_cr(message); - msn_message_set_bin_data(msg, message_cr, strlen(message_cr)); + message_cr2 = botch_utf((gchar *)message_cr, -1, &len); + msn_message_set_bin_data(msg, message_cr2, len); g_free(message_cr); + g_free(message_cr2); return msg; } @@ -820,14 +823,15 @@ char *body_str; char *body_enc; char *body_final; - size_t body_len; + char *yaz_body_final; + size_t body_len, new_len; const char *passport; const char *value; gc = cmdproc->session->account->gc; body = msn_message_get_bin_data(msg, &body_len); - body_str = g_strndup(body, body_len); + body_str = sanitize_utf(body, body_len, &new_len); body_enc = g_markup_escape_text(body_str, -1); g_free(body_str); @@ -864,23 +868,30 @@ body_final = body_enc; } + /* yaz */ + /* replace 0D 0A with <br> */ + yaz_body_final = purple_strreplace(body_final, "\r\n", "<br>"); +// purple_debug_info("yaz msn", "yaz_body_final=%s\n", yaz_body_final); + g_free(body_final); + body_final = yaz_body_final; + if (cmdproc->servconn->type == MSN_SERVCONN_SB) { MsnSwitchBoard *swboard = cmdproc->data; swboard->flag |= MSN_SB_FLAG_IM; if (swboard->current_users > 1 || - ((swboard->conv != NULL) && - purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) + ((swboard->conv != NULL) && + purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) { /* If current_users is always ok as it should then there is no need to * check if this is a chat. */ if (swboard->current_users <= 1) purple_debug_misc("msn", "plain_msg: current_users(%d)\n", - swboard->current_users); + swboard->current_users); serv_got_chat_in(gc, swboard->chat_id, passport, 0, body_final, - time(NULL)); + time(NULL)); if (swboard->conv == NULL) { swboard->conv = purple_find_chat(gc, swboard->chat_id); @@ -893,7 +904,7 @@ if (swboard->conv == NULL) { swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, - passport, purple_connection_get_account(gc)); + passport, purple_connection_get_account(gc)); swboard->flag |= MSN_SB_FLAG_IM; } }
--- a/libpurple/protocols/msn/msn.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/msn/msn.c Sun Jul 26 22:18:59 2009 +0900 @@ -180,14 +180,15 @@ MsnSession *session; PurpleAccount *account; const char *alias; + gchar *tmp; + gsize dummy; session = gc->proto_data; cmdproc = session->notification->cmdproc; account = purple_connection_get_account(gc); - if (entry && *entry) - { - char *tmp = g_strdup(entry); + if(entry && *entry) { + tmp = botch_utf(entry, strlen(entry), &dummy); alias = purple_url_encode(g_strstrip(tmp)); g_free(tmp); } @@ -206,6 +207,9 @@ } msn_cmdproc_send(cmdproc, "PRP", "MFN %s", alias); + // propagate change on server side to local --yaz + purple_account_set_alias(account, entry); //oct16 <-- XXX questionable. Sep19. + } static void @@ -333,6 +337,23 @@ } static void +msn_ipc_init(PurplePlugin *plugin) +{ + purple_plugin_ipc_register(plugin, "msn_set_friendly_name", + PURPLE_CALLBACK(msn_act_id), + purple_marshal_VOID__POINTER_POINTER, + purple_value_new(PURPLE_TYPE_UNKNOWN),2, + purple_value_new(PURPLE_TYPE_POINTER), + purple_value_new(PURPLE_TYPE_POINTER)); +} + +static void +msn_ipc_end(PurplePlugin *plugin) +{ + purple_plugin_ipc_unregister_all(plugin); +} + +static void msn_show_set_home_phone(PurplePluginAction *action) { PurpleConnection *gc; @@ -1095,13 +1116,18 @@ msn_send_emoticons(MsnSwitchBoard *swboard, GString *body) { MsnMessage *msg; + gchar *tmp; + gsize len; g_return_if_fail(body != NULL); msg = msn_message_new(MSN_MSG_SLP); msn_message_set_content_type(msg, "text/x-mms-emoticon"); msn_message_set_flag(msg, 'N'); - msn_message_set_bin_data(msg, body->str, body->len); + + tmp = botch_utf(body->str, -1, &len); + msn_message_set_bin_data(msg, tmp, len); + g_free(tmp); msn_switchboard_send_msg(swboard, msg, TRUE); msn_message_destroy(msg); @@ -2508,6 +2534,9 @@ msn_switchboard_init(); msn_sync_init(); + // yaz + msn_ipc_init(plugin); + return TRUE; } @@ -2517,6 +2546,9 @@ msn_switchboard_end(); msn_sync_end(); + // yaz + msn_ipc_end(plugin); + return TRUE; }
--- a/libpurple/protocols/msnp9/msg.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/msnp9/msg.c Sun Jul 26 22:18:59 2009 +0900 @@ -525,9 +525,7 @@ if (data != NULL && len > 0) { - msg->body = g_malloc0(len + 1); - memcpy(msg->body, data, len); - msg->body_len = len; + msg->body = botch_utf((gchar *)data, len, &msg->body_len); /* yaz */ } else {
--- a/libpurple/protocols/msnp9/msn.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/msnp9/msn.c Sun Jul 26 22:18:59 2009 +0900 @@ -174,13 +174,18 @@ MsnSession *session; PurpleAccount *account; const char *alias; + gchar *tmp; + gsize dummy; session = gc->proto_data; cmdproc = session->notification->cmdproc; account = purple_connection_get_account(gc); - if(entry && strlen(entry)) - alias = purple_url_encode(entry); + if(entry && strlen(entry)) { + tmp = botch_utf(entry, strlen(entry), &dummy); + alias = purple_url_encode(tmp); + g_free(tmp); + } else alias = "";
--- a/libpurple/protocols/msnp9/switchboard.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/msnp9/switchboard.c Sun Jul 26 22:18:59 2009 +0900 @@ -837,7 +837,7 @@ char *body_str; char *body_enc; char *body_final; - size_t body_len; + size_t body_len, new_len; const char *passport; const char *value; @@ -845,7 +845,7 @@ swboard = cmdproc->data; body = msn_message_get_bin_data(msg, &body_len); - body_str = g_strndup(body, body_len); + body_str = sanitize_utf(body, body_len, &new_len); body_enc = g_markup_escape_text(body_str, -1); g_free(body_str);
--- a/libpurple/protocols/oscar/family_icbm.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/oscar/family_icbm.c Sun Jul 26 22:18:59 2009 +0900 @@ -52,8 +52,8 @@ #endif #include "util.h" - - +/* yaz */ +#include "debug.h" /** * Add a standard ICBM header to the given bstream with the given * information. @@ -465,6 +465,9 @@ guchar cookie[8]; GSList *outer_tlvlist = NULL, *inner_tlvlist = NULL; ByteStream hdrbs; + // yaz + char *ucs = NULL; + gsize bytes; if (!od || !(conn = flap_connection_findbygroup(od, SNAC_FAMILY_ICBM))) return -EINVAL; @@ -503,15 +506,51 @@ * raw data, followed by a series of TLVs. * */ +#if 0 byte_stream_new(&hdrbs, 2+8+16+6+4+4+strlen(msg)+4+2+1+strlen(roomname)+2); byte_stream_put16(&hdrbs, 0x0000); /* Unknown! */ byte_stream_putraw(&hdrbs, cookie, sizeof(cookie)); /* I think... */ byte_stream_putcaps(&hdrbs, OSCAR_CAPABILITY_CHAT); - +#endif + //yaz + // convert msg to ascii first. if it succeed, send as plain ascii. + // if it fails, convert msg into UTF-16BE, and send it. + ucs = g_convert(msg, strlen(msg), "ASCII", "UTF-8", NULL, &bytes, NULL); + if(ucs){ + byte_stream_new(&hdrbs, 2+8+16+6+4+4+strlen(msg)+4+2+1+strlen(roomname)+2); + + byte_stream_put16(&hdrbs, 0x0000); /* Unknown! */ + byte_stream_putraw(&hdrbs, cookie, sizeof(cookie)); /* I think... */ + byte_stream_putcaps(&hdrbs, OSCAR_CAPABILITY_CHAT); + + aim_tlvlist_add_16(&inner_tlvlist, 0x000a, 0x0001); + aim_tlvlist_add_noval(&inner_tlvlist, 0x000f); + aim_tlvlist_add_raw(&inner_tlvlist, 0x000c, strlen(msg), (guint8 *)msg); + free(ucs); + } else { + byte_stream_new(&hdrbs, 2+8+16+6+4+4+strlen(msg)+4+2+1+strlen(roomname)+2+4+11); + + byte_stream_put16(&hdrbs, 0x0000); /* Unknown! */ + byte_stream_putraw(&hdrbs, cookie, sizeof(cookie)); /* I think... */ + byte_stream_putcaps(&hdrbs, OSCAR_CAPABILITY_CHAT); + + aim_tlvlist_add_16(&inner_tlvlist, 0x000a, 0x0001); + aim_tlvlist_add_raw(&inner_tlvlist, 0x000d, 11, (guint8 *)"unicode-2-0"); + aim_tlvlist_add_noval(&inner_tlvlist, 0x000f); + //yaz + ucs = g_convert(msg, strlen(msg), "UTF-16BE", "UTF-8", NULL, &bytes, NULL); + if(ucs){ + botch_ucs(ucs, bytes); + aim_tlvlist_add_raw(&inner_tlvlist, 0x000c, bytes, (guint8 *)ucs); + free(ucs); + } + } +#if 0 aim_tlvlist_add_16(&inner_tlvlist, 0x000a, 0x0001); aim_tlvlist_add_noval(&inner_tlvlist, 0x000f); aim_tlvlist_add_str(&inner_tlvlist, 0x000c, msg); +#endif aim_tlvlist_add_chatroom(&inner_tlvlist, 0x2711, exchange, roomname, instance); aim_tlvlist_write(&hdrbs, &inner_tlvlist);
--- a/libpurple/protocols/oscar/odc.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/oscar/odc.c Sun Jul 26 22:18:59 2009 +0900 @@ -101,18 +101,22 @@ byte_stream_new(&bs, length + frame->payload.len); byte_stream_putraw(&bs, conn->magic, 4); byte_stream_put16(&bs, length); + byte_stream_put16(&bs, frame->type); byte_stream_put16(&bs, frame->subtype); byte_stream_put16(&bs, 0x0000); + byte_stream_putraw(&bs, frame->cookie, 8); byte_stream_put16(&bs, 0x0000); byte_stream_put16(&bs, 0x0000); byte_stream_put16(&bs, 0x0000); byte_stream_put16(&bs, 0x0000); + byte_stream_put32(&bs, frame->payload.len); - byte_stream_put16(&bs, 0x0000); byte_stream_put16(&bs, frame->encoding); byte_stream_put16(&bs, 0x0000); + byte_stream_put16(&bs, 0x0000); + byte_stream_put16(&bs, frame->flags); byte_stream_put16(&bs, 0x0000); byte_stream_put16(&bs, 0x0000); @@ -496,11 +500,14 @@ frame->type = byte_stream_get16(bs); frame->subtype = byte_stream_get16(bs); byte_stream_advance(bs, 2); + byte_stream_getrawbuf(bs, frame->cookie, 8); byte_stream_advance(bs, 8); + frame->payload.len = byte_stream_get32(bs); frame->encoding = byte_stream_get16(bs); byte_stream_advance(bs, 4); + frame->flags = byte_stream_get16(bs); byte_stream_advance(bs, 4); byte_stream_getrawbuf(bs, frame->bn, 32);
--- a/libpurple/protocols/oscar/oft.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/oscar/oft.c Sun Jul 26 22:18:59 2009 +0900 @@ -642,6 +642,8 @@ { PeerConnection *conn; size_t size; + gchar *f1 = NULL, *f2 = NULL; + gsize dummy; conn = xfer->data; conn->flags |= PEER_CONNECTION_FLAG_APPROVED; @@ -679,7 +681,16 @@ strncpy((gchar *)conn->xferdata.idstring, "Cool FileXfer", 31); conn->xferdata.modtime = 0; conn->xferdata.cretime = 0; - xfer->filename = g_path_get_basename(xfer->local_filename); + + /* yaz */ + f1 = g_filename_display_basename(xfer->local_filename); + f2 = botch_utf(f1, strlen(f1), &dummy); + if(f2){ + purple_xfer_set_filename(xfer, (char *)f2); + } + g_free(f1); f1 = NULL; + g_free(f2); f2 = NULL; + conn->xferdata.name_length = MAX(64, strlen(xfer->filename) + 1); conn->xferdata.name = (guchar *)g_strndup(xfer->filename, conn->xferdata.name_length - 1);
--- a/libpurple/protocols/oscar/oscar.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.c Sun Jul 26 22:18:59 2009 +0900 @@ -308,7 +308,25 @@ gchar *utf8 = NULL; if ((encoding == NULL) || encoding[0] == '\0') { - purple_debug_info("oscar", "Empty encoding, assuming UTF-8\n"); + purple_debug_info("yaz oscar", "Empty encoding, validate as UTF-8\n"); + if(g_utf8_validate(text, textlen, NULL)){ + gsize newlen; + utf8 = sanitize_utf(text, textlen, &newlen); + goto done; + } + // not UTF-8 + purple_debug_info("yaz oscar", "Empty encoding, assuming UTF-16BE\n"); + sanitize_ucs((gchar *)text, textlen); + utf8 = g_convert(text, textlen, "UTF-8", "UTF-16BE", NULL, NULL, NULL); + if(utf8){ + if(!g_utf8_validate(utf8, strlen(utf8), NULL)){ + purple_debug_info("yaz oscar", "Invalid conversion\n"); + g_free(utf8); + utf8 = NULL; + } + } else { + purple_debug_info("yaz oscar", "Conversion failed\n"); + } } else if (!g_ascii_strcasecmp(encoding, "iso-8859-1")) { utf8 = g_convert(text, textlen, "UTF-8", "iso-8859-1", NULL, NULL, NULL); } else if (!g_ascii_strcasecmp(encoding, "ISO-8859-1-Windows-3.1-Latin-1") || @@ -323,6 +341,7 @@ * and do something (un)reasonable with that, and not * mess up too much else. */ const gchar *charset = purple_account_get_string(account, "encoding", NULL); + sanitize_ucs((gchar *)text, textlen); if (charset) { gsize len; utf8 = g_convert(text, textlen, charset, "UTF-16BE", &len, NULL, NULL); @@ -354,7 +373,7 @@ else utf8 = g_strndup(text, textlen); } - +done: return utf8; } @@ -379,7 +398,7 @@ static gchar * purple_plugin_oscar_convert_to_utf8(const gchar *data, gsize datalen, const char *charsetstr, gboolean fallback) { - gchar *ret = NULL; + gchar *ret = NULL, *ret2 = NULL; GError *err = NULL; if ((charsetstr == NULL) || (*charsetstr == '\0')) @@ -402,7 +421,9 @@ purple_debug_warning("oscar", "String is not valid UTF-8.\n"); } - return ret; + ret2 = sanitize_utf(ret, -1, NULL); + g_free(ret); + return ret2; } /** @@ -438,11 +459,11 @@ } else if (charset == AIM_CHARSET_ASCII) { /* Should just be "ASCII" */ charsetstr1 = "ASCII"; - charsetstr2 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); - } else if (charset == 0x000d) { + charsetstr2 = "UTF-8"; + } else if (charset == AIM_CHARSET_QUIRKUTF8) { /* Mobile AIM client on a Nokia 3100 and an LG VX6000 */ - charsetstr1 = "ISO-8859-1"; - charsetstr2 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); + charsetstr1 = "UTF-8"; //iChat use 0x000d when it sends UTF-8. --yaz + charsetstr2 = "ISO-8859-1"; } else { /* Unknown, hope for valid UTF-8... */ charsetstr1 = "UTF-8"; @@ -511,6 +532,7 @@ if ((b != NULL) && (PURPLE_BUDDY_IS_ONLINE(b))) { *msg = g_convert(from, -1, "UTF-16BE", "UTF-8", NULL, &msglen, &err); + botch_ucs(*msg, msglen); if (*msg != NULL) { *charset = AIM_CHARSET_UNICODE; @@ -538,6 +560,10 @@ * XXX - We need a way to only attempt to convert if we KNOW "from" * can be converted to "charsetstr" */ +#ifndef _WIN32 + /* nosuke reported that this portion caused unexpected + * conversion from utf-8 fullwidth tilde/numbers/alphabets to + * halfwidth ones on windows environment. --yaz */ *msg = g_convert(from, -1, charsetstr, "UTF-8", NULL, &msglen, &err); if (*msg != NULL) { *charset = AIM_CHARSET_CUSTOM; @@ -550,11 +576,13 @@ charsetstr, err->message); g_error_free(err); err = NULL; +#endif /* * Nothing else worked, so send as UTF-16BE. */ - *msg = g_convert(from, -1, "UTF-16BE", "UTF-8", NULL, &msglen, &err); + *msg = g_convert(from, strlen(from), "UTF-16BE", "UTF-8", NULL, &msglen, &err); + botch_ucs(*msg, msglen); if (*msg != NULL) { *charset = AIM_CHARSET_UNICODE; *charsubset = 0x0000; @@ -2355,6 +2383,8 @@ tmp = purple_plugin_oscar_decode_im_part(account, userinfo->bn, curpart->charset, curpart->charsubset, curpart->data, curpart->datalen); if (tmp != NULL) { + purple_str_strip_char(tmp, 0x0d); // yaz: strip CR +// purple_debug_info("yaz oscar", "tmp=%s",tmp); g_string_append(message, tmp); g_free(tmp); } @@ -2457,6 +2487,7 @@ char *encoding, *utf8name, *tmp; GHashTable *components; +// purple_debug_info("yaz oscar", "chat request %s\n", args->msg); if (!args->info.chat.roominfo.name || !args->info.chat.roominfo.exchange) { g_free(message); return 1; @@ -2479,6 +2510,8 @@ g_hash_table_replace(components, g_strdup("room"), utf8name); g_hash_table_replace(components, g_strdup("exchange"), g_strdup_printf("%d", args->info.chat.roominfo.exchange)); + purple_debug_info("yaz oscar", "about to call serv_got_chat_invite\n"); +// purple_debug_info("yaz oscar", "name=%s message=%s\n", name ? name : args->info.chat.roominfo.name, message); serv_got_chat_invite(gc, utf8name, userinfo->bn, @@ -2703,7 +2736,7 @@ * for this suck-ass part of the protocol by splitting the string into at * most 1 baby string. */ - msg1 = g_strsplit(args->msg, "\376", (args->type == 0x01 ? 1 : 0)); + msg1 = g_strsplit(args->msg, "\376", (args->type == 0x01 ? 1 : 0)); // \376 is 0xfe for (numtoks=0; msg1[numtoks]; numtoks++); msg2 = (gchar **)g_malloc((numtoks+1)*sizeof(gchar *)); for (i=0; msg1[i]; i++) { @@ -4392,9 +4425,7 @@ { GString *msg; GString *data; - gchar *tmp; - int tmplen; - guint16 charset, charsubset; + guint16 charset; GData *attribs; const char *start, *end, *last; int oscar_id = 0; @@ -4454,12 +4485,9 @@ g_string_append(msg, "</BODY></HTML>"); - /* Convert the message to a good encoding */ - purple_plugin_oscar_convert_to_best_encoding(conn->od->gc, - conn->bn, msg->str, &tmp, &tmplen, &charset, &charsubset); - g_string_free(msg, TRUE); - msg = g_string_new_len(tmp, tmplen); - g_free(tmp); + /* iChat and AIM6 use 0x000d to send UTF8. + moreover, AIM6 persists only to UTF8! --yaz */ + charset = AIM_CHARSET_QUIRKUTF8; /* Append any binary data that we may have */ if (oscar_id) { @@ -4702,7 +4730,8 @@ charset = oscar_charset_check(str); if (charset == AIM_CHARSET_UNICODE) { - encoded = g_convert(str, -1, "UTF-16BE", "UTF-8", NULL, ret_len, NULL); + encoded = g_convert(str, strlen(str), "UTF-16BE", "UTF-8", NULL, ret_len, NULL); + botch_ucs(encoded, *ret_len); *encoding = "unicode-2-0"; } else if (charset == AIM_CHARSET_CUSTOM) { encoded = g_convert(str, -1, "ISO-8859-1", "UTF-8", NULL, ret_len, NULL); @@ -5846,7 +5875,7 @@ charsetstr = "unicode-2-0"; else if (charset == AIM_CHARSET_CUSTOM) charsetstr = "iso-8859-1"; - aim_chat_send_im(od, c->conn, 0, buf2, len, charsetstr, "en"); + aim_chat_send_im(od, c->conn, 0, buf2, len, charsetstr, "JA"); g_free(buf2); g_free(buf);
--- a/libpurple/protocols/oscar/oscar.h Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/oscar/oscar.h Sun Jul 26 22:18:59 2009 +0900 @@ -812,6 +812,7 @@ #define AIM_CHARSET_ASCII 0x0000 #define AIM_CHARSET_UNICODE 0x0002 /* UTF-16BE */ #define AIM_CHARSET_CUSTOM 0x0003 +#define AIM_CHARSET_QUIRKUTF8 0x000d /* iChat and AIM6 use this in the meaning of UTF-8 in ODC. --yaz */ /* * Multipart message structures.
--- a/libpurple/protocols/yahoo/libyahoo.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/libyahoo.c Sun Jul 26 22:18:59 2009 +0900 @@ -32,6 +32,7 @@ #include "yahoo_doodle.h" #include "yahoo_filexfer.h" #include "yahoo_picture.h" +#include "ycht.h" static PurplePlugin *my_protocol = NULL; @@ -327,8 +328,6 @@ option = purple_account_option_string_new(_("Encoding"), "local_charset", "UTF-8"); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - -#if 0 option = purple_account_option_string_new(_("Chat room list URL"), "room_list", YAHOO_ROOMLIST_URL); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); @@ -337,7 +336,6 @@ option = purple_account_option_int_new(_("Yahoo Chat port"), "ycht-port", YAHOO_YCHT_PORT); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); -#endif my_protocol = plugin; yahoo_register_commands();
--- a/libpurple/protocols/yahoo/libyahoojp.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/libyahoojp.c Sun Jul 26 22:18:59 2009 +0900 @@ -31,6 +31,7 @@ #include "yahoo_doodle.h" #include "yahoo_filexfer.h" #include "yahoo_picture.h" +#include "ycht.h" static void yahoojp_register_commands(void) { @@ -223,17 +224,14 @@ option = purple_account_option_string_new(_("Encoding"), "local_charset", "UTF-8"); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - -#if 0 - option = purple_account_option_string_new(_("Chat room list URL"), "room_list", YAHOO_ROOMLIST_URL); + option = purple_account_option_string_new(_("Chat room list URL"), "room_list", YAHOOJP_ROOMLIST_URL); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_string_new(_("Yahoo Chat server"), "ycht-server", YAHOO_YCHT_HOST); + option = purple_account_option_string_new(_("Yahoo Chat server"), "ycht-server", YAHOOJP_YCHT_HOST); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_int_new(_("Yahoo Chat port"), "ycht-port", YAHOO_YCHT_PORT); + option = purple_account_option_int_new(_("Yahoo Chat port"), "ycht-port", YAHOOJP_YCHT_PORT); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); -#endif yahoojp_register_commands(); yahoo_init_colorht();
--- a/libpurple/protocols/yahoo/libymsg.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/libymsg.c Sun Jul 26 22:18:59 2009 +0900 @@ -1470,8 +1470,9 @@ #define OUT_CHARSET "utf-8" -static char *yahoo_decode(const char *text) +static char *yahoo_decode(PurpleConnection *gc, const char *text) { + struct yahoo_data *yd = gc->proto_data; char *converted = NULL; char *n, *new; const char *end, *p; @@ -1512,11 +1513,16 @@ *n = '\0'; - if (strstr(text, "\033$B")) - converted = g_convert(new, n - new, OUT_CHARSET, "iso-2022-jp", NULL, NULL, NULL); - if (!converted) - converted = g_convert(new, n - new, OUT_CHARSET, "iso-8859-1", NULL, NULL, NULL); - g_free(new); + if (yd->jp) { + converted = g_convert(new, n - new, OUT_CHARSET, "UTF-8", NULL, NULL, NULL); + } + if (!yd->jp || !converted) { + if (strstr(text, "\033$B")) + converted = g_convert(new, n - new, OUT_CHARSET, "iso-2022-jp", NULL, NULL, NULL); + if (!converted) + converted = g_convert(new, n - new, OUT_CHARSET, "iso-8859-1", NULL, NULL, NULL); + g_free(new); + } return converted; } @@ -1549,8 +1555,8 @@ } if (who && subj && email && *email) { - char *dec_who = yahoo_decode(who); - char *dec_subj = yahoo_decode(subj); + char *dec_who = yahoo_decode(gc, who); + char *dec_subj = yahoo_decode(gc, subj); char *from = g_strdup_printf("%s (%s)", dec_who, email); purple_notify_email(gc, dec_subj, from, purple_account_get_username(account), @@ -4510,6 +4516,7 @@ struct yahoo_packet *pkt = NULL; char *msg = NULL, *msg2 = NULL; PurpleStatus *status = NULL; + gboolean utf8 = TRUE; if (idle && yd->current_status != YAHOO_STATUS_CUSTOM) yd->current_status = YAHOO_STATUS_IDLE; @@ -4527,7 +4534,6 @@ status = purple_presence_get_active_status(purple_account_get_presence(purple_connection_get_account(gc))); tmp = purple_status_get_attr_string(status, "message"); if (tmp != NULL) { - gboolean utf8 = TRUE; msg = yahoo_string_encode(gc, tmp, &utf8); msg2 = purple_markup_strip_html(msg); yahoo_packet_hash_str(pkt, 97, utf8 ? "1" : 0); @@ -4535,6 +4541,7 @@ } else { /* get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message */ + yahoo_packet_hash_str(pkt, 97, utf8 ? "1" : 0); yahoo_packet_hash_str(pkt, 19, _("Away")); } } else {
--- a/libpurple/protocols/yahoo/util.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/util.c Sun Jul 26 22:18:59 2009 +0900 @@ -29,6 +29,7 @@ #include "prpl.h" #include "libymsg.h" +#include "util.h" #include <string.h> @@ -119,14 +120,13 @@ char *yahoo_string_encode(PurpleConnection *gc, const char *str, gboolean *utf8) { struct yahoo_data *yd = gc->proto_data; - char *ret; + char *ret = NULL; + gsize newlen; const char *to_codeset; - if (yd->jp) - return g_strdup(str); - - if (utf8 && *utf8) /* FIXME: maybe don't use utf8 if it'll fit in latin1 */ - return g_strdup(str); + if (utf8 && *utf8) { + return botch_utf((gchar *)str, strlen((gchar *)str), &newlen); + } to_codeset = purple_account_get_string(purple_connection_get_account(gc), "local_charset", "ISO-8859-1"); ret = g_convert_with_fallback(str, -1, to_codeset, "UTF-8", "?", NULL, NULL, NULL); @@ -148,23 +148,29 @@ char *yahoo_string_decode(PurpleConnection *gc, const char *str, gboolean utf8) { struct yahoo_data *yd = gc->proto_data; - char *ret; + char *ret, *tmp; const char *from_codeset; + gsize newlen; if (utf8) { - if (g_utf8_validate(str, -1, NULL)) - return g_strdup(str); + ret = sanitize_utf((gchar *)str, strlen((gchar *)str), &newlen); + if (g_utf8_validate(ret, -1, NULL)) + return ret; } - if (yd->jp) + if (yd->jp && !utf8) from_codeset = "SHIFT_JIS"; else from_codeset = purple_account_get_string(purple_connection_get_account(gc), "local_charset", "ISO-8859-1"); ret = g_convert_with_fallback(str, -1, "UTF-8", from_codeset, NULL, NULL, NULL, NULL); - if (ret) + if (ret) { + tmp = ret; + ret = sanitize_utf((gchar *)tmp, strlen((gchar *)tmp), &newlen); + g_free(tmp); return ret; + } else return g_strdup(""); }
--- a/libpurple/protocols/yahoo/yahoo_filexfer.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_filexfer.c Sun Jul 26 22:18:59 2009 +0900 @@ -226,7 +226,7 @@ PurpleXfer *xfer; struct yahoo_xfer_data *xd; struct yahoo_packet *pkt; - gchar *size, *filename, *encoded_filename, *header; + gchar *size, *filename, *encoded_filename, *header, *tmp = NULL; guchar *pkt_buf; const char *host; int port; @@ -234,6 +234,7 @@ PurpleConnection *gc; PurpleAccount *account; struct yahoo_data *yd; + gsize dummy; purple_debug_info("yahoo", "in yahoo_sendfile_connected\n"); @@ -260,8 +261,12 @@ YAHOO_STATUS_AVAILABLE, yd->session_id); size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); - filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); - encoded_filename = yahoo_string_encode(gc, filename, NULL); + + /* yaz */ + tmp = g_filename_display_basename(purple_xfer_get_local_filename(xfer)); + filename = botch_utf(tmp, strlen(tmp), &dummy); + g_free(tmp); + encoded_filename = yahoo_string_encode(gc, filename, NULL); // this takes utf8 as input. --yaz yahoo_packet_hash(pkt, "sssss", 0, purple_connection_get_display_name(gc), 5, xfer->who, 14, "", 27, encoded_filename, 28, size); @@ -981,8 +986,8 @@ struct yahoo_xfer_data *xd; struct sockaddr_in *addr; struct yahoo_packet *pkt; - long actaddr; - long a,b,c,d; + unsigned long actaddr; + unsigned long a,b,c,d; PurpleConnection *gc; PurpleAccount *account; struct yahoo_data *yd;
--- a/libpurple/protocols/yahoo/yahoo_packet.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_packet.c Sun Jul 26 22:18:59 2009 +0900 @@ -42,6 +42,7 @@ { struct yahoo_pair *pair; + g_return_if_fail(pkt != NULL); g_return_if_fail(value != NULL); pair = g_new0(struct yahoo_pair, 1); @@ -54,6 +55,8 @@ { struct yahoo_pair *pair; + g_return_if_fail(pkt != NULL); + pair = g_new0(struct yahoo_pair, 1); pair->key = key; pair->value = g_strdup_printf("%d", value); @@ -386,6 +389,9 @@ { int ret; + g_return_val_if_fail(pkt != NULL, 0); + g_return_val_if_fail(yd != NULL, 0); + ret = yahoo_packet_send(pkt, yd); yahoo_packet_free(pkt); return ret;
--- a/libpurple/protocols/yahoo/yahoo_profile.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo_profile.c Sun Jul 26 22:18:59 2009 +0900 @@ -22,6 +22,7 @@ */ #define PHOTO_SUPPORT 1 +//original is 1 --yaz #include "internal.h" #include "debug.h" @@ -670,6 +671,7 @@ }, }; +#if 0 static char *yahoo_info_date_reformat(const char *field, size_t len) { char *tmp = g_strndup(field, len); @@ -678,6 +680,7 @@ g_free(tmp); return g_strdup(purple_date_format_short(localtime(&t))); } +#endif static char *yahoo_remove_nonbreaking_spaces(char *str) { @@ -763,6 +766,7 @@ #endif /* PHOTO_SUPPORT */ +#define PROF_LEN (1024 * 10) static void yahoo_got_info(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, size_t len, const gchar *error_message) { @@ -1011,6 +1015,9 @@ g_free(stripped); stripped = purple_utf8_ncr_decode(p); stripped_len = strlen(stripped); + + purple_debug_misc("yahoo", "after utf8 conversion: stripped@1 = (%s)\n", + stripped); //payload --yaz g_free(p); } } @@ -1022,7 +1029,7 @@ strings->charset, NULL, NULL, NULL); yahoo_remove_nonbreaking_spaces(last_updated_utf8_string); - purple_debug_misc("yahoo", "after utf8 conversion: stripped = (%s)\n", stripped); + purple_debug_misc("yahoo", "after utf8 conversion: stripped = (%s)\n", stripped); //payload --yaz } if (profile_state == PROFILE_STATE_DEFAULT) { @@ -1055,16 +1062,17 @@ } } #endif /* PHOTO_SUPPORT */ + purple_debug_info("yahoo", "email = %s\n", strings->my_email_string); /* extract their Email address and put it in */ found |= purple_markup_extract_info_field(stripped, stripped_len, user_info, strings->my_email_string, (yd->jp ? 4 : 1), " ", 0, strings->private_string, _("Email"), 0, NULL, NULL); - +#if 0 /* extract the Nickname if it exists */ found |= purple_markup_extract_info_field(stripped, stripped_len, user_info, "Nickname:", 1, "\n", '\n', - NULL, _("Nickname"), 0, NULL, NULL); + NULL, _("Nickname"), 0, NULL, NULL); /* extract their RealName and put it in */ found |= purple_markup_extract_info_field(stripped, stripped_len, user_info, @@ -1095,7 +1103,7 @@ found |= purple_markup_extract_info_field(stripped, stripped_len, user_info, strings->occupation_string, 2, "\n", '\n', NULL, _("Occupation"), 0, NULL, NULL); - +#endif /* Hobbies, Latest News, and Favorite Quote are a bit different, since * the values can contain embedded newlines... but any or all of them * can also not appear. The way we delimit them is to successively @@ -1104,7 +1112,7 @@ * next thing to follow this bunch. (For Yahoo Japan, we check for * the "Description" ("Self PR") heading instead of "Links".) */ - +#if 0 if (!purple_markup_extract_info_field(stripped, stripped_len, user_info, strings->hobbies_string, (yd->jp ? 3 : 1), strings->latest_news_string, '\n', "\n", _("Hobbies"), 0, NULL, NULL)) @@ -1190,6 +1198,7 @@ last_updated_utf8_string, (yd->jp ? 2 : 1), (yd->jp ? "\n" : " "), (yd->jp ? 0 : '\n'), NULL, _("Last Update"), 0, NULL, (yd->jp ? NULL : yahoo_info_date_reformat)); } +#endif } /* if (profile_state == PROFILE_STATE_DEFAULT) */ if(!found)
--- a/libpurple/protocols/yahoo/yahoochat.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoochat.c Sun Jul 26 22:18:59 2009 +0900 @@ -951,7 +951,7 @@ g_free(msg1); msg1 = yahoo_string_encode(gc, msg2, &utf8); g_free(msg2); - room2 = yahoo_string_encode(gc, room, NULL); + room2 = yahoo_string_encode(gc, room, &utf8); pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YAHOO_STATUS_AVAILABLE, yd->session_id); @@ -1590,6 +1590,7 @@ char *url; char *id; const char *rll; + gboolean jp = purple_account_get_bool(list->account, "yahoojp", FALSE); if (category->type != PURPLE_ROOMLIST_ROOMTYPE_CATEGORY) return; @@ -1599,17 +1600,12 @@ return; } - rll = purple_account_get_string(list->account, "room_list_locale", - YAHOO_ROOMLIST_LOCALE); + rll = jp ? YAHOOJP_ROOMLIST_LOCALE : purple_account_get_string(list->account, "room_list_locale", YAHOO_ROOMLIST_LOCALE); if (rll != NULL && *rll != '\0') { - url = g_strdup_printf("%s?chatroom_%s=0&intl=%s", - purple_account_get_string(list->account,"room_list", - YAHOO_ROOMLIST_URL), id, rll); + url = g_strdup_printf("%s?chatroom_%s=0&intl=%s", jp ? YAHOOJP_ROOMLIST_URL : purple_account_get_string(list->account,"room_list", YAHOO_ROOMLIST_URL), id, rll); } else { - url = g_strdup_printf("%s?chatroom_%s=0", - purple_account_get_string(list->account,"room_list", - YAHOO_ROOMLIST_URL), id); + url = g_strdup_printf("%s?chatroom_%s=0", jp ? YAHOOJP_ROOMLIST_URL : purple_account_get_string(list->account,"room_list", YAHOO_ROOMLIST_URL), id); } yrl = g_new0(struct yahoo_roomlist, 1);
--- a/libpurple/protocols/yahoo/ycht.h Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/protocols/yahoo/ycht.h Sun Jul 26 22:18:59 2009 +0900 @@ -32,6 +32,10 @@ #define YAHOO_YCHT_HOST "jcs3.chat.dcn.yahoo.com" #define YAHOO_YCHT_PORT 8002 +/* fix these --yaz */ +#define YAHOOJP_YCHT_HOST "chat.yahoo.co.jp" +#define YAHOOJP_YCHT_PORT 8000 + #define YCHT_VERSION (0xae) #define YCHT_HEADER_LEN (0x10)
--- a/libpurple/server.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/server.c Sun Jul 26 22:18:59 2009 +0900 @@ -241,6 +241,8 @@ GSList *buddies; PurpleBuddy *b; PurpleConversation *conv; + gsize dummy; + gchar *alias2 = NULL; account = purple_connection_get_account(gc); buddies = purple_find_buddies(account, who); @@ -257,13 +259,16 @@ if (purple_strequal(server_alias, alias)) continue; - purple_blist_server_alias_buddy(b, alias); + if(alias) + alias2 = sanitize_utf(alias, strlen(alias), &dummy); + + purple_blist_server_alias_buddy(b, alias2); conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, purple_buddy_get_name(b), account); - if (conv != NULL && alias != NULL && purple_strequal(alias, who)) + if (conv != NULL && alias2 != NULL && !purple_strequal(alias2, who)) { char *escaped = g_markup_escape_text(who, -1); - char *escaped2 = g_markup_escape_text(alias, -1); + char *escaped2 = g_markup_escape_text(alias2, -1); char *tmp = g_strdup_printf(_("%s is now known as %s.\n"), escaped, escaped2); @@ -275,6 +280,8 @@ g_free(escaped2); g_free(escaped); } + g_free(alias2); + alias2 = NULL; } } @@ -284,6 +291,8 @@ PurpleAccount *account = NULL; GSList *buddies = NULL; PurpleBuddy *b = NULL; + gsize dummy; + gchar *alias2 = NULL; account = purple_connection_get_account(gc); buddies = purple_find_buddies(account, who); @@ -298,11 +307,13 @@ if (purple_strequal(balias, alias)) continue; - purple_blist_alias_buddy(b, alias); + alias2 = sanitize_utf(alias, strlen(alias), &dummy); + purple_blist_alias_buddy(b, alias2); + g_free(alias2); + alias2 = NULL; } } - PurpleAttentionType *purple_get_attention_type_from_code(PurpleAccount *account, guint type_code) { PurplePlugin *prpl;
--- a/libpurple/util.c Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/util.c Sun Jul 26 22:18:59 2009 +0900 @@ -1338,6 +1338,8 @@ return FALSE; q = strstr(p, end_token); + if(q == NULL) //yaz + return FALSE; /* Trim leading blanks */ while (*p != '\n' && g_ascii_isspace(*p)) { @@ -1350,7 +1352,7 @@ } /* Don't bother with null strings */ - if (p == q) + if (p >= q) return FALSE; if (q != NULL && (!no_value_token || @@ -2129,6 +2131,20 @@ } static gboolean +is_zenkaku_space(const char *c) +{ + gboolean rv = FALSE; + const guchar *u = (guchar *)c; + + if(!c || !strcmp(c, "") || strlen(c) < 3) + rv = FALSE; + else if(*u == 0xe3 && *(u+1) == 0x80 && *(u+2) == 0x80) + rv = TRUE; + + return rv; +} + +static gboolean badchar(char c) { switch (c) { @@ -2165,6 +2181,7 @@ gunichar g; gboolean inside_html = FALSE; int inside_paren = 0; + int inside_bracket = 0; GString *ret; if (text == NULL) @@ -2181,6 +2198,12 @@ c++; } + if(*c == '[' && !inside_html) { + inside_bracket++; + ret = g_string_append_c(ret, *c); + c++; + } + if(inside_html) { if(*c == '>') { inside_html = FALSE; @@ -2208,7 +2231,7 @@ (!g_ascii_strncasecmp(c, "https://", 8)))) { t = c; while (1) { - if (badchar(*t) || badentity(t)) { + if (badchar(*t) || badentity(t) || is_zenkaku_space(t)) { if ((!g_ascii_strncasecmp(c, "http://", 7) && (t - c == 7)) || (!g_ascii_strncasecmp(c, "https://", 8) && (t - c == 8))) { @@ -2225,6 +2248,9 @@ if ((*(t - 1) == ')' && (inside_paren > 0))) { t--; } + if ((*(t - 1) == ']' && (inside_bracket > 0))) { + t--; + } url_buf = g_strndup(c, t - c); tmpurlbuf = purple_unescape_html(url_buf); @@ -2242,7 +2268,7 @@ if (c[4] != '.') { t = c; while (1) { - if (badchar(*t) || badentity(t)) { + if (badchar(*t) || badentity(t) || is_zenkaku_space(t)) { if (t - c == 4) { break; } @@ -2257,6 +2283,9 @@ if ((*(t - 1) == ')' && (inside_paren > 0))) { t--; } + if ((*(t - 1) == ']' && (inside_bracket > 0))) { + t--; + } url_buf = g_strndup(c, t - c); tmpurlbuf = purple_unescape_html(url_buf); g_string_append_printf(ret, @@ -2273,7 +2302,7 @@ } else if (!g_ascii_strncasecmp(c, "ftp://", 6) || !g_ascii_strncasecmp(c, "sftp://", 7)) { t = c; while (1) { - if (badchar(*t) || badentity(t)) { + if (badchar(*t) || badentity(t) || is_zenkaku_space(t)) { if ((!g_ascii_strncasecmp(c, "ftp://", 6) && (t - c == 6)) || (!g_ascii_strncasecmp(c, "sftp://", 7) && (t - c == 7))) { @@ -2285,6 +2314,9 @@ if ((*(t - 1) == ')' && (inside_paren > 0))) { t--; } + if ((*(t - 1) == ']' && (inside_bracket > 0))) { + t--; + } url_buf = g_strndup(c, t - c); tmpurlbuf = purple_unescape_html(url_buf); g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>", @@ -2303,7 +2335,7 @@ if (c[4] != '.') { t = c; while (1) { - if (badchar(*t) || badentity(t)) { + if (badchar(*t) || badentity(t) || is_zenkaku_space(t)) { if (t - c == 4) { break; } @@ -2312,6 +2344,9 @@ if ((*(t - 1) == ')' && (inside_paren > 0))) { t--; } + if ((*(t - 1) == ']' && (inside_bracket > 0))) { + t--; + } url_buf = g_strndup(c, t - c); tmpurlbuf = purple_unescape_html(url_buf); g_string_append_printf(ret, @@ -2330,7 +2365,7 @@ } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) { t = c; while (1) { - if (badchar(*t) || badentity(t)) { + if (badchar(*t) || badentity(t) || is_zenkaku_space(t)) { char *d; if (t - c == 7) { break; @@ -2364,7 +2399,7 @@ (c == text || badchar(c[-1]) || badentity(c-1))) { t = c; while (1) { - if (badchar(*t) || badentity(t)) { + if (badchar(*t) || badentity(t) || is_zenkaku_space(t)) { if (t - c == 5) { break; @@ -2380,6 +2415,9 @@ if ((*(t - 1) == ')' && (inside_paren > 0))) { t--; } + if ((*(t - 1) == ']' && (inside_bracket > 0))) { + t--; + } url_buf = g_strndup(c, t - c); tmpurlbuf = purple_unescape_html(url_buf); @@ -2467,6 +2505,11 @@ ret = g_string_append_c(ret, *c); c++; } + if(*c == ']' && !inside_html) { + inside_bracket--; + ret = g_string_append_c(ret, *c); + c++; + } if (*c == 0) break; @@ -5152,3 +5195,296 @@ } #endif } + +#ifdef _WIN32 +void botch_ucs(gchar *ucs_src, gsize len) +{ + /* no operation */ +} +#else +void botch_ucs(gchar *ucs_src, gsize len) +{ + gint i; + guchar *ucs = (guchar *)ucs_src; + + g_return_if_fail(ucs_src != NULL); + g_return_if_fail(len > 0); + + for(i=0;i<len;i+=2){ + switch(*(ucs+i)){ + case 0x00: + switch(*(ucs+i+1)){ + case 0xa2: // ¢ + *(ucs+i) = 0xff; + *(ucs+i+1) = 0xe0; + break; + case 0xa3: // £ + *(ucs+i) = 0xff; + *(ucs+i+1) = 0xe1; + break; + case 0xac: // ¬ + *(ucs+i) = 0xff; + *(ucs+i+1) = 0xe2; + break; + } + break; + case 0x20: // ‖ + if(*(ucs+i+1) == 0x16){ + *(ucs+i) = 0x22; + *(ucs+i+1) = 0x25; + } + break; + case 0x22: // − + if(*(ucs+i+1) == 0x12){ + *(ucs+i) = 0xff; + *(ucs+i+1) = 0x0d; + } + break; + case 0x30: // 〜 + if(*(ucs+i+1) == 0x1c){ + *(ucs+i) = 0xff; + *(ucs+i+1) = 0x5e; + } + break; + } + } + +} +#endif + +#ifdef _WIN32 +void sanitize_ucs(gchar *ucs, gsize len) +{ + /* no operation */ +} +#else +void sanitize_ucs(gchar *ucs_src, gsize len) +{ + gint i; + guchar *ucs = (guchar *)ucs_src; + + g_return_if_fail(ucs_src != NULL); + g_return_if_fail(len > 0); + + for(i=0;i<len;i+=2){ + switch(*(ucs+i)){ + case 0x22: + switch(*(ucs+i+1)){ + case 0x25: // ‖ + *(ucs+i) = 0x20; + *(ucs+i+1) = 0x16; + break; + } + break; + case 0xff: + switch(*(ucs+i+1)){ + case 0x0d: // − + *(ucs+i) = 0x22; + *(ucs+i+1) = 0x12; + break; + case 0x5e: // 〜 + *(ucs+i) = 0x30; + *(ucs+i+1) = 0x1c; + break; + case 0xe0: // ¢ + *(ucs+i) = 0x00; + *(ucs+i+1) = 0xa2; + break; + case 0xe1: // £ + *(ucs+i) = 0x00; + *(ucs+i+1) = 0xa3; + break; + case 0xe2: // ¬ + *(ucs+i) = 0x00; + *(ucs+i+1) = 0xac; + break; + } + break; + } + } +} +#endif + +#ifdef _WIN32 +gchar *sanitize_utf(const gchar *msg, gsize len, gsize *newlen) +{ + g_return_val_if_fail(msg != NULL, NULL); + if(len == -1) + len = strlen(msg); + g_return_val_if_fail(len > 0, NULL); + + if(newlen) + *newlen = len; + + return g_strndup(msg, len); +} +#else +gchar *sanitize_utf(const gchar *msg, gsize len, gsize *newlen) +{ + gint i; + size_t bytes; + guchar *utf; + + g_return_val_if_fail(msg != NULL, NULL); + if(len == -1) + len = strlen(msg); + g_return_val_if_fail(len > 0, NULL); + + utf = (guchar *)g_strndup(msg, len); + + bytes = len; + + for(i=0;i<len;i++){ + switch(*(utf+i)){ + case 0xe2: + if(*(utf+i+1) == 0x88) { + if(*(utf+i+2) == 0xa5) { // ‖ + *(utf+i) = 0xe2; + *(utf+i+1) = 0x80; + *(utf+i+2) = 0x96; + } + } + break; + case 0xef: + switch(*(utf+i+1)){ + case 0xbc: + if(*(utf+i+2) == 0x8d) { // − + *(utf+i) = 0xe2; + *(utf+i+1) = 0x88; + *(utf+i+2) = 0x92; + } + break; + case 0xbd: + if(*(utf+i+2) == 0x9e) { // 〜 + *(utf+i) = 0xe3; + *(utf+i+1) = 0x80; + *(utf+i+2) = 0x9c; + } + break; + case 0xbf: + switch(*(utf+i+2)){ + case 0xa0: // ¢ + *(utf+i) = 0xc2; + *(utf+i+1) = 0xa2; + memmove(utf+i+2, utf+i+3, + len-i-3); //shorten by 1byte + bytes--; + break; + case 0xa1: // £ + *(utf+i) = 0xc2; + *(utf+i+1) = 0xa3; + memmove(utf+i+2, utf+i+3, + len-i-3); //shorten by 1byte + bytes--; + break; + case 0xa2: // ¬ + *(utf+i) = 0xc2; + *(utf+i+1) = 0xac; + memmove(utf+i+2, utf+i+3, + len-i-3); //shorten by 1byte + bytes--; + break; + } + break; + } + break; + } + } + *(utf+bytes)= 0x00; //terminate + if(newlen) + *newlen = bytes; + return (gchar *)utf; +} +#endif + +#ifdef _WIN32 +gchar *botch_utf(const gchar *msg, gsize len, gsize *newlen) +{ + g_return_val_if_fail(msg != NULL, NULL); + if(len == -1) + len = strlen(msg); + g_return_val_if_fail(len > 0, NULL); + + if(newlen) + *newlen = len; + + return g_strndup(msg, len); +} +#else +gchar *botch_utf(const gchar *msg, gsize len, gsize *newlen) +{ + int i,bytes; + unsigned char *utf; + + g_return_val_if_fail(msg != NULL, NULL); + if(len == -1) + len = strlen(msg); + g_return_val_if_fail(len > 0, NULL); + + bytes = len; + + utf = g_malloc0(bytes*3/2+1); /* new length might be 3/2 in the worst case */ + memcpy(utf, msg, bytes); + + for(i=0;i<bytes;i++){ + switch(*(utf+i)){ + case 0xc2: + switch(*(utf+i+1)){ + case 0xa2: // ¢ + *(utf+i) = 0xef; + *(utf+i+1) = 0xbf; + memmove(utf+i+3, utf+i+2, bytes-i-2); + *(utf+i+2) = 0xa0; + bytes++; + break; + case 0xa3: // £ + *(utf+i) = 0xef; + *(utf+i+1) = 0xbf; + memmove(utf+i+3, utf+i+2, bytes-i-2); + *(utf+i+2) = 0xa1; + bytes++; + break; + case 0xac: // ¬ + *(utf+i) = 0xef; + *(utf+i+1) = 0xbf; + memmove(utf+i+3, utf+i+2, bytes-i-2); + *(utf+i+2) = 0xa2; + bytes++; + break; + } + break; + case 0xe2: + switch(*(utf+i+1)){ + case 0x80: // ‖ + if(*(utf+i+2) == 0x96){ + *(utf+i) = 0xe2; + *(utf+i+1) = 0x88; + *(utf+i+2) = 0xa5; + } + break; + case 0x88: // − + if(*(utf+i+1) == 0x92){ + *(utf+i) = 0xef; + *(utf+i+1) = 0xbc; + *(utf+i+2) = 0x8d; + } + break; + } + break; + case 0xe3: // 〜 + if(*(utf+i+1) == 0x80){ + if(*(utf+i+2) == 0x9c){ + *(utf+i) = 0xef; + *(utf+i+1) = 0xbd; + *(utf+i+2) = 0x9e; + } + } + break; + } //switch + } + *(utf+bytes) = 0x00; //terminate + if(newlen) + *newlen = bytes; + return (gchar *)utf; +} +#endif
--- a/libpurple/util.h Sat Jul 25 02:55:33 2009 +0000 +++ b/libpurple/util.h Sun Jul 26 22:18:59 2009 +0900 @@ -1427,4 +1427,10 @@ } #endif +/* to address incompatibility with cp932. */ +void botch_ucs(gchar *ucs, gsize len); +void sanitize_ucs(gchar *ucs, gsize len); +gchar *botch_utf(const gchar *utf, gsize len, gsize *newlen); +gchar *sanitize_utf(const gchar *msg, gsize len, gsize *newlen); + #endif /* _PURPLE_UTIL_H_ */
--- a/pidgin/gtkblist.c Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkblist.c Sun Jul 26 22:18:59 2009 +0900 @@ -72,6 +72,11 @@ #define HEADLINE_CLOSE_SIZE 11 +/* I noticed that some of short cuts are very annoying. + If you really want to use them, change this to 1. --yaz +*/ +#define ENABLE_SHORTCUT 0 + typedef struct { PurpleAccount *account; @@ -3465,6 +3470,7 @@ { N_("/Tools/System _Log"), NULL, gtk_blist_show_systemlog_cb, 3, "<Item>", NULL }, { "/Tools/sep3", NULL, NULL, 0, "<Separator>", NULL }, { N_("/Tools/Mute _Sounds"), NULL, pidgin_blist_mute_sounds_cb, 0, "<CheckItem>", NULL }, + /* Help */ { N_("/_Help"), NULL, NULL, 0, "<Branch>", NULL }, { N_("/Help/Online _Help"), "F1", gtk_blist_show_onlinehelp_cb, 0, "<StockItem>", GTK_STOCK_HELP },
--- a/pidgin/gtkconv.c Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkconv.c Sun Jul 26 22:18:59 2009 +0900 @@ -1,3 +1,4 @@ +/* -*- coding: utf-8 -*- */ /** * @file gtkconv.c GTK+ Conversation API * @ingroup pidgin @@ -120,6 +121,10 @@ static GdkColor *nick_colors = NULL; static guint nbr_nick_colors; +/* yaz. If you want to use shortcut keys that may conflict with + inputmethods, change this to 1. */ +#define ENABLE_SHORTCUT 0 + typedef struct { GtkWidget *window; @@ -274,6 +279,43 @@ return FALSE; } +static gboolean +size_allocate_cb(GtkWidget *w, GtkAllocation *allocation, PidginConversation *gtkconv) +{ + PurpleConversation *conv = gtkconv->active_conv; + + if (!GTK_WIDGET_VISIBLE(w)) + return FALSE; + + if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + return FALSE; + if (gtkconv->auto_resize) { + return FALSE; + } + + if (gdk_window_get_state(gtkconv->win->window->window) & GDK_WINDOW_STATE_MAXIMIZED) { + return FALSE; + } + + /* I find that I resize the window when it has a bunch of conversations in it, mostly so that the + * tab bar will fit, but then I don't want new windows taking up the entire screen. I check to see + * if there is only one conversation in the window. This way we'll be setting new windows to the + * size of the last resized new window. */ + /* I think that the above justification is not the majority, and that the new tab resizing should + * negate it anyway. --luke */ + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) + { + if (w == gtkconv->lower_hbox) + purple_prefs_set_int(PIDGIN_PREFS_ROOT "/conversations/im/entry_height", allocation->height); + } + else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) + { + if (w == gtkconv->lower_hbox) + purple_prefs_set_int(PIDGIN_PREFS_ROOT "/conversations/chat/entry_height", allocation->height); + } + return FALSE; +} + static void default_formatize(PidginConversation *c) { @@ -424,6 +466,20 @@ gtkconv->send_history = g_list_prepend(first, NULL); } +#if 0 +static void +reset_default_size(PidginConversation *gtkconv) +{ + PurpleConversation *conv = gtkconv->active_conv; + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) + gtk_widget_set_size_request(gtkconv->lower_hbox, -1, + purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/entry_height")); + else + gtk_widget_set_size_request(gtkconv->lower_hbox, -1, + purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/entry_height")); +} +#endif + static gboolean check_for_and_do_command(PurpleConversation *conv) { @@ -3136,13 +3192,21 @@ { "/Conversation/sep0", NULL, NULL, 0, "<Separator>", NULL }, +#if ENABLE_SHORTCUT { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0, "<StockItem>", GTK_STOCK_FIND }, +#else + { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0, + "<Item>", NULL }, +#endif { N_("/Conversation/View _Log"), NULL, menu_view_log_cb, 0, "<Item>", NULL }, { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, "<StockItem>", GTK_STOCK_SAVE_AS }, +#if ENABLE_SHORTCUT { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, - +#else + { N_("/Conversation/Clea_r Scrollback"), NULL, menu_clear_cb, 0, "<Item>", NULL }, +#endif { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL }, #ifdef USE_VV @@ -3159,8 +3223,13 @@ { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 0, "<Item>", NULL }, +#if ENABLE_SHORTCUT { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO }, +#else + { N_("/Conversation/_Get Info"), NULL, menu_get_info_cb, 0, + "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO }, +#endif { N_("/Conversation/In_vite..."), NULL, menu_invite_cb, 0, "<Item>", NULL }, { N_("/Conversation/M_ore"), NULL, NULL, 0, "<Branch>", NULL }, @@ -3885,7 +3954,11 @@ gtk_widget_destroy(win->menu.send_to); /* Build the Send To menu */ +#if ENABLE_SHORTCUT win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("S_end To")); +#else + win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("Send To")); //to free Alt-s. intentional. --yaz +#endif gtk_widget_show(win->menu.send_to); menu = gtk_menu_new(); @@ -4289,6 +4362,7 @@ PidginChatPane *gtkchat; char *new_topic; const char *current_topic; + char dummy[] = "No Topic"; gc = purple_conversation_get_gc(conv); @@ -4308,7 +4382,7 @@ return; } - gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic); + gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic ? current_topic : dummy); prpl_info->set_chat_topic(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)), new_topic); @@ -4591,12 +4665,10 @@ height = CLAMP(height, MIN(min_height, max_height), max_height); diff = height - gtkconv->entry->allocation.height; - if (ABS(diff) < oneline.height / 2) + if (diff == 0 || (diff < 0 && -diff < oneline.height / 2)) return FALSE; - gtk_widget_set_size_request(gtkconv->lower_hbox, -1, - diff + gtkconv->lower_hbox->allocation.height); - + diff + gtkconv->lower_hbox->allocation.height); return FALSE; } @@ -4814,7 +4886,7 @@ static GtkWidget * setup_common_pane(PidginConversation *gtkconv) { - GtkWidget *vbox, *frame, *imhtml_sw, *event_box; + GtkWidget *paned, *vbox, *frame, *imhtml_sw, *event_box; GtkCellRenderer *rend; GtkTreePath *path; PurpleConversation *conv = gtkconv->active_conv; @@ -4823,8 +4895,12 @@ GtkPolicyType imhtml_sw_hscroll; int buddyicon_size = 0; + paned = gtk_vpaned_new(); + gtk_widget_show(paned); + /* Setup the top part of the pane */ vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); gtk_widget_show(vbox); /* Setup the info pane */ @@ -4953,18 +5029,30 @@ g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event", G_CALLBACK(refocus_entry_cb), gtkconv); + /* Setup the bottom half of the conversation window */ + vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtk_paned_pack2(GTK_PANED(paned), vbox, FALSE, TRUE); + gtk_widget_show(vbox); + gtkconv->lower_hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox), gtkconv->lower_hbox, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), gtkconv->lower_hbox, TRUE, TRUE, 0); gtk_widget_show(gtkconv->lower_hbox); + vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtk_box_pack_end(GTK_BOX(gtkconv->lower_hbox), vbox, TRUE, TRUE, 0); + gtk_widget_show(vbox); + /* Setup the toolbar, entry widget and all signals */ frame = pidgin_create_imhtml(TRUE, >kconv->entry, >kconv->toolbar, NULL); - gtk_box_pack_start(GTK_BOX(gtkconv->lower_hbox), frame, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); gtk_widget_show(frame); gtk_widget_set_name(gtkconv->entry, "pidgin_conv_entry"); gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), purple_account_get_protocol_name(conv->account)); + gtk_widget_set_size_request(gtkconv->lower_hbox, -1, + chat ? purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/entry_height") : + purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/im/entry_height")); g_signal_connect(G_OBJECT(gtkconv->entry), "populate-popup", G_CALLBACK(entry_popup_menu_cb), gtkconv); @@ -4974,6 +5062,8 @@ G_CALLBACK(send_cb), gtkconv); g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", G_CALLBACK(entry_stop_rclick_cb), NULL); + g_signal_connect(G_OBJECT(gtkconv->lower_hbox), "size-allocate", + G_CALLBACK(size_allocate_cb), gtkconv); gtkconv->entry_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); @@ -4998,7 +5088,7 @@ default_formatize(gtkconv); g_signal_connect_after(G_OBJECT(gtkconv->entry), "format_function_clear", G_CALLBACK(clear_formatting_cb), gtkconv); - return vbox; + return paned; } static void @@ -6662,6 +6752,9 @@ AtkObject *accessibility_obj; /* I think this is a little longer than it needs to be but I'm lazy. */ char *style; + gboolean ellipsis; + int side; + char *tab_title = NULL; if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) im = PURPLE_CONV_IM(conv); @@ -6756,8 +6849,26 @@ style = NULL; } + // nosuke's tab width patch + side = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side"); + side &= ~8; + if ( (side == GTK_POS_LEFT || side == GTK_POS_RIGHT) && + purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/trim_vertical_tabs") ) + ellipsis = TRUE; + else + ellipsis = FALSE; + + if (ellipsis) { + tab_title = pidgin_gtk_ellipsis_text(gtkconv->tab_label, title, 60, "..."); + } + else { + tab_title = g_strdup(title); + } + gtk_widget_set_name(gtkconv->tab_label, style); - gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title); + gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), tab_title); + g_free(tab_title); tab_title = NULL; + gtk_widget_set_state(gtkconv->tab_label, GTK_STATE_ACTIVE); if (gtkconv->unseen_state == PIDGIN_UNSEEN_TEXT || @@ -7184,6 +7295,24 @@ return page_num; } +//nosuke +static void +trim_vertical_tabs_pref_cb(const char *name, PurplePrefType type, + gconstpointer value, gpointer data) +{ + GList *l; + PurpleConversation *conv; + + for (l = purple_get_conversations(); l != NULL; l = l->next) { + conv = (PurpleConversation *)l->data; + + if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + continue; + + pidgin_conv_update_fields(conv, PIDGIN_CONV_SET_TITLE); + } +} + static void close_on_tabs_pref_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data) @@ -7253,6 +7382,7 @@ pidgin_conv_tab_pack(gtkwin, gtkconvs->data); } } + trim_vertical_tabs_pref_cb(name, type, value, data); } static void @@ -7311,7 +7441,7 @@ else gtk_widget_hide(gtkconv->toolbar); - g_idle_add((GSourceFunc)resize_imhtml_cb,gtkconv); +// g_idle_add((GSourceFunc)resize_imhtml_cb,gtkconv); } } @@ -7818,6 +7948,7 @@ purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations"); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/use_smooth_scrolling", TRUE); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs", TRUE); + purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/trim_vertical_tabs", FALSE); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold", FALSE); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic", FALSE); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline", FALSE); @@ -7872,6 +8003,8 @@ /* Connect callbacks. */ purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/close_on_tabs", close_on_tabs_pref_cb, NULL); + purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/trim_vertical_tabs", + trim_vertical_tabs_pref_cb, NULL); purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/show_timestamps", show_timestamps_pref_cb, NULL); purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar",
--- a/pidgin/gtkimhtml.c Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkimhtml.c Sun Jul 26 22:18:59 2009 +0900 @@ -116,6 +116,10 @@ gint y, guint time); +/* yaz. If you want to use shortcut keys that may conflict with + inputmethods, change this to 1. */ +#define ENABLE_SHORTCUT 0 + static void preinsert_cb(GtkTextBuffer *buffer, GtkTextIter *iter, gchar *text, gint len, GtkIMHtml *imhtml); static void insert_cb(GtkTextBuffer *buffer, GtkTextIter *iter, gchar *text, gint len, GtkIMHtml *imhtml); static void delete_cb(GtkTextBuffer *buffer, GtkTextIter *iter, GtkTextIter *end, GtkIMHtml *imhtml); @@ -509,10 +513,11 @@ static gint gtk_imhtml_tip (gpointer data) { - GtkIMHtml *imhtml = data; + GtkIMHtml *imhtml = (GtkIMHtml *)data; PangoFontMetrics *font_metrics; PangoLayout *layout; PangoFont *font; + PangoLanguage *lang; gint gap, x, y, h, w, scr_w, baseline_skip; @@ -558,7 +563,9 @@ return FALSE; } - font_metrics = pango_font_get_metrics(font, NULL); + lang = pango_context_get_language (pango_layout_get_context(layout)); + font_metrics = pango_font_get_metrics(font, lang); //it's ok. +// font_metrics = pango_font_get_metrics(font, NULL); //crash! pango_layout_get_pixel_size(layout, &scr_w, NULL); gap = PANGO_PIXELS((pango_font_metrics_get_ascent(font_metrics) + @@ -671,14 +678,12 @@ tip = g_object_get_data(G_OBJECT(anchor), "gtkimhtml_tiptext"); hand = FALSE; } - if (tip && *tip) { if (!GTK_IMHTML(imhtml)->editable && hand) gdk_window_set_cursor(win, GTK_IMHTML(imhtml)->hand_cursor); GTK_IMHTML(imhtml)->tip_timer = g_timeout_add (TOOLTIP_TIMEOUT, gtk_imhtml_tip, imhtml); } - GTK_IMHTML(imhtml)->tip = tip; g_slist_free(tags); return FALSE; @@ -1034,18 +1039,25 @@ if (info == TARGET_HTML) { char *selection; #ifndef _WIN32 - gsize len; if (primary) { text = gtk_imhtml_get_markup_range(imhtml, &start, &end); } else text = html_clipboard; - /* Mozilla asks that we start our text/html with the Unicode byte order mark */ - selection = g_convert(text, -1, "UTF-16", "UTF-8", NULL, &len, NULL); - gtk_selection_data_set(selection_data, gdk_atom_intern("text/html", FALSE), 16, (const guchar *)selection, len); -#else + selection = NULL; + if (primary) { + text = gtk_imhtml_get_markup_range(imhtml, &start, &end); + } else { + text = html_clipboard; + } + /* xxx should remove following line --yaz */ + purple_debug_info("imhtml clipboard", "html_clipboard: %s len = %d\n", text, strlen(text)); + gtk_selection_data_set(selection_data, gdk_atom_intern("text/html", FALSE), + 8, (const guchar *)text, strlen(text)+1); // include trailing '\0' --yaz +#else /*_WIN32 */ selection = clipboard_html_to_win32(html_clipboard); - gtk_selection_data_set(selection_data, gdk_atom_intern("HTML Format", FALSE), 8, (const guchar *)selection, strlen(selection)); + gtk_selection_data_set(selection_data, gdk_atom_intern("HTML Format", FALSE), + 8, (const guchar *)selection, strlen(selection)); #endif g_free(selection); } else { @@ -1196,7 +1208,8 @@ if (selection_data->length >= 2 && (*(guint16 *)text == 0xfeff || *(guint16 *)text == 0xfffe)) { /* This is UTF-16 */ - char *utf8 = utf16_to_utf8_with_bom_check(text, selection_data->length); +// char *utf8 = utf16_to_utf8_with_bom_check(text, selection_data->length); + char *utf8 = g_convert(text, selection_data->length, "UTF-8", "UTF-16", NULL, NULL, NULL); g_free(text); text = utf8; if (!text) { @@ -1931,7 +1944,8 @@ * http://mail.gnome.org/archives/gtk-devel-list/2001-September/msg00114.html */ if (sd->length >= 2 && !g_utf8_validate(text, sd->length - 1, NULL)) { - utf8 = utf16_to_utf8_with_bom_check(text, sd->length); +// utf8 = utf16_to_utf8_with_bom_check(text, sd->length); + utf8 = g_convert(text, sd->length, "UTF-8", "UTF-16", NULL, NULL, NULL); if (!utf8) { purple_debug_warning("gtkimhtml", "g_convert from UTF-16 failed in drag_rcv_cb\n"); @@ -3377,6 +3391,7 @@ break; } } + ws[wpos] = '\0'; // chop ws at wpos. due to bug of gtk_text_buffer_insert() --yaz gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos); ws[0] = '\0'; wpos = 0;
--- a/pidgin/gtkimhtmltoolbar.c Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Sun Jul 26 22:18:59 2009 +0900 @@ -1432,7 +1432,7 @@ gtk_container_add(GTK_CONTAINER(smiley_button), bbox); image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0); - label = gtk_label_new_with_mnemonic(_("_Smile!")); + label = gtk_label_new_with_mnemonic(_("Smile!")); gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(box), smiley_button, FALSE, FALSE, 0); g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley);
--- a/pidgin/gtkimhtmltoolbar.h Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkimhtmltoolbar.h Sun Jul 26 22:18:59 2009 +0900 @@ -30,7 +30,7 @@ extern "C" { #endif -#define DEFAULT_FONT_FACE "Helvetica 12" +#define DEFAULT_FONT_FACE "Sans 12" #define GTK_TYPE_IMHTMLTOOLBAR (gtk_imhtmltoolbar_get_type()) #define GTK_IMHTMLTOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_IMHTMLTOOLBAR, GtkIMHtmlToolbar))
--- a/pidgin/gtknotify.c Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtknotify.c Sun Jul 26 22:18:59 2009 +0900 @@ -1180,12 +1180,15 @@ pidgin_notify_uri(const char *uri) { #ifndef _WIN32 - char *escaped = g_shell_quote(uri); + char *tmp = g_shell_quote(uri); + char *escaped = g_locale_from_utf8(tmp, -1, NULL, NULL, NULL); char *command = NULL; char *remote_command = NULL; const char *web_browser; int place; + g_free(tmp); + web_browser = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"); place = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/browsers/place");
--- a/pidgin/gtkprefs.c Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkprefs.c Sun Jul 26 22:18:59 2009 +0900 @@ -1491,6 +1491,9 @@ pidgin_prefs_checkbox(_("Show close b_utton on tabs"), PIDGIN_PREFS_ROOT "/conversations/close_on_tabs", vbox2); + pidgin_prefs_checkbox(_("Trim names on vertical tabs"), + PIDGIN_PREFS_ROOT "/conversations/trim_vertical_tabs", vbox2); + label = pidgin_prefs_dropdown(vbox2, _("_Placement:"), PURPLE_PREF_INT, PIDGIN_PREFS_ROOT "/conversations/tab_side", _("Top"), GTK_POS_TOP, @@ -1575,7 +1578,7 @@ #endif pidgin_prefs_checkbox(_("Use smooth-scrolling"), PIDGIN_PREFS_ROOT "/conversations/use_smooth_scrolling", vbox); - + pidgin_prefs_checkbox(_("Use msn messenger style"), "/purple/conversations/msnstyle", vbox);//yaz #ifdef _WIN32 pidgin_prefs_checkbox(_("F_lash window when IMs are received"), PIDGIN_PREFS_ROOT "/win32/blink_im", vbox); #endif
--- a/pidgin/gtkutils.c Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkutils.c Sun Jul 26 22:18:59 2009 +0900 @@ -3929,3 +3929,61 @@ gtk_imhtml_class_register_protocol("gopher://", NULL, NULL); } +gchar * +pidgin_gtk_ellipsis_text(GtkWidget *widget, const char *text, gint min_width, gchar *ellipsis) +{ + PangoLayout *layout; + gint width, height; + gint ewidth; + glong len0, len1, len2; + gchar *buf, *buf_tmp; + gboolean with_ellipsis = FALSE; + const gchar default_ellipsis[] = "..."; + + if(!ellipsis) + ellipsis = default_ellipsis; + + /* allocate buf */ + buf = g_malloc0(strlen(text) * 2); + + /* create layout */ + layout = gtk_widget_create_pango_layout(widget, ellipsis); + pango_layout_get_pixel_size(layout, &width, &height); + ewidth = width; /* length of ellipsis text. */ + + len0 = 0; + len1 = g_utf8_strlen(text, -1); + len2 = len1; + + while (1) { + + if (len2 == len0) + break; + + g_utf8_strncpy(buf, text, len2); + pango_layout_set_text(layout, buf, -1); + pango_layout_get_pixel_size(layout, &width, &height); + + if(!with_ellipsis && width <= min_width) + break; + else + with_ellipsis = TRUE; + + if (width + ewidth > min_width) + len1 = len2; + else + len0 = len2; + + len2 = (len0 + len1) / 2; + } + + g_object_unref(layout); + + if (with_ellipsis) { + buf_tmp = buf; + buf = g_strdup_printf("%s%s", buf_tmp, ellipsis); + g_free(buf_tmp); + } + + return buf; +}
--- a/pidgin/gtkutils.h Sat Jul 25 02:55:33 2009 +0000 +++ b/pidgin/gtkutils.h Sun Jul 26 22:18:59 2009 +0900 @@ -859,5 +859,7 @@ */ void pidgin_utils_uninit(void); +gchar *pidgin_gtk_ellipsis_text(GtkWidget *widget, const char *text, gint min_width, gchar *ellipsis); + #endif /* _PIDGINUTILS_H_ */
--- a/pidgin/pixmaps/icons/hicolor/16x16/apps/scalable/pidgin.svg Sat Jul 25 02:55:33 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,335 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="16" - height="16" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.46" - sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Bureaublad/pidgin16-4.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - version="1.0" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs4347"> - <linearGradient - id="linearGradient8739" - inkscape:collect="always"> - <stop - id="stop8741" - offset="0" - style="stop-color:#602869;stop-opacity:1" /> - <stop - id="stop8743" - offset="1" - style="stop-color:#3b1941;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8760"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop8762" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop8764" /> - </linearGradient> - <linearGradient - id="linearGradient8989" - inkscape:collect="always"> - <stop - id="stop8991" - offset="0" - style="stop-color:#ffffff;stop-opacity:1" /> - <stop - id="stop8993" - offset="1" - style="stop-color:#eeeeec;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8776"> - <stop - style="stop-color:#ffffff;stop-opacity:0.82412058" - offset="0" - id="stop8778" /> - <stop - style="stop-color:#ffffff;stop-opacity:0" - offset="1" - id="stop8780" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8720"> - <stop - style="stop-color:#fdc26a;stop-opacity:1" - offset="0" - id="stop8722" /> - <stop - style="stop-color:#f57900;stop-opacity:1" - offset="1" - id="stop8724" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3124"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop3126" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop3128" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3116"> - <stop - style="stop-color:#894599;stop-opacity:1" - offset="0" - id="stop3118" /> - <stop - style="stop-color:#82508e;stop-opacity:0" - offset="1" - id="stop3120" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8989" - id="linearGradient6512" - x1="15.242517" - y1="38.066795" - x2="15.242517" - y2="42.163002" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.474981,0,0,0.4591462,0.5705609,-3.9567446)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3124" - id="linearGradient3130" - x1="12.561858" - y1="39.998802" - x2="12.561858" - y2="42.352577" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.5069392,0,0,0.4907885,-2.0817467e-2,-4.88025)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8720" - id="linearGradient8726" - x1="12.806054" - y1="16.65247" - x2="13.166923" - y2="16.608501" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.8035512,0,0,0.6654138,-0.6991237,0.3717176)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3116" - id="linearGradient8774" - x1="10.624538" - y1="19.264456" - x2="10.624538" - y2="23.165424" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.7506322,0,0,0.7602819,0.3614067,-1.1609868)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient8776" - id="radialGradient8782" - cx="11.539145" - cy="11.774944" - fx="11.539145" - fy="11.774944" - r="9.5" - gradientTransform="matrix(1.1492907,-3.5818508e-2,2.1662967e-2,0.7172256,-4.3193915,-6.011096e-2)" - gradientUnits="userSpaceOnUse" /> - <filter - inkscape:collect="always" - id="filter9040" - x="-0.095484518" - width="1.190969" - y="-0.32181817" - height="1.6436363"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.22627841" - id="feGaussianBlur9042" /> - </filter> - <filter - inkscape:collect="always" - id="filter8756" - x="-0.067594799" - width="1.1351896" - y="-0.12311285" - height="1.2462257"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.25007298" - id="feGaussianBlur8758" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8760" - id="linearGradient8766" - x1="10.025534" - y1="24.3125" - x2="12.26086" - y2="24.3125" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8739" - id="linearGradient8816" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.2058295,0,0,3.3872105,-0.5868595,-0.5305442)" - x1="6.6287227" - y1="0.48644698" - x2="0.44665223" - y2="1.4697748" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8760" - id="linearGradient8735" - gradientUnits="userSpaceOnUse" - x1="9.778717" - y1="24.3125" - x2="12.178589" - y2="24.3125" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="32" - inkscape:cx="17.336548" - inkscape:cy="7.0248271" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="false" - width="24px" - height="24px" - inkscape:object-bbox="true" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10"> - <inkscape:grid - type="xygrid" - id="grid7936" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - style="opacity:1;fill:none;fill-rule:evenodd;stroke:url(#linearGradient8816);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" - d="M 7.9293116,5.0795231 C 8.4000613,4.9623562 8.4835059,4.5003986 8.6165851,4.1601444 C 8.8703534,3.4900386 8.9850242,3.2527412 8.8138379,2.5709314 C 8.2219508,0.45209022 2.1611419,-0.88447008 1.4517269,2.9807965" - id="path8814" - sodipodi:nodetypes="cscc" /> - <path - style="opacity:1;fill:url(#linearGradient8774);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 7.5832705,1.5 C 4.2253041,1.5 1.5,4.2484155 1.5,7.6348558 C 1.5,10.409353 1.5368298,15.204777 2.3493298,16.119387 C 2.9513142,16.119387 14.14629,17.5 15.510463,17.5 C 16.582197,17.5 15.529722,16.489173 15.529722,16.489173 C 15.529722,15.082448 14.037305,14.095385 13.065033,13.123113 C 12.31715,12.330145 13.159601,10.088797 13.159601,10.088797 C 13.484704,9.3379883 13.534521,8.6063333 13.534521,7.735143 C 13.534521,4.348703 10.941237,1.5 7.5832705,1.5 z" - id="path5176" - sodipodi:nodetypes="cccccccsc" /> - <path - style="opacity:0.54299998999999999;fill:url(#radialGradient8782);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 7.6952762,2.4999998 C 4.8395496,2.4999998 2.5080065,4.8304336 2.5001711,7.7371358 C 2.5001581,7.7420387 2.4997927,7.7465938 2.5001711,7.7514849 C 2.5001711,11.097502 3.0181313,16.475208 3.0181313,16.475208 C 3.9379713,16.475208 10.734965,16.461527 13.502192,16.461527 C 14.056593,16.461527 15,16.692971 15,16.020522 C 15,15.91871 14.623872,16.133525 14.362514,15.895884 C 14.101157,15.658243 13.835251,15.059314 13.403964,14.806022 C 12.543199,14.263752 11.86054,13.312811 11.81661,11.873858 C 11.874694,10.425059 12.718766,9.4318208 12.620458,7.8321281 C 12.620458,4.918572 10.555818,2.4999998 7.6952762,2.4999998 z" - id="path5241" - sodipodi:nodetypes="cscccsscccc" /> - <path - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 7.9998599,7.6813275 C 7.9998599,9.061316 6.8055234,10 5.9999296,10 C 4.8959685,10 4,8.880011 4,7.5000225 C 4,6.3007912 4.6142095,4.9911617 5.7181378,5.0000449 C 8.059493,5.018459 7.9998599,6.5910879 7.9998599,7.6813275 z" - id="path5157" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient8766);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.8057553,0,0,0.7927385,-2.1942434,-11.247142)" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.63276428" - inkscape:original="M 10.5 14 C 10.223 14 10 14.223 10 14.5 C 10 14.777 10.223 15 10.5 15 L 11.5 15 C 11.777 15 12 14.777 12 14.5 C 12 14.223 11.777 14 11.5 14 L 10.5 14 z M 13.5 14 C 13.223 14 13 14.223 13 14.5 C 13 14.777 13.223 15 13.5 15 L 14.5 15 C 14.777 15 15 14.777 15 14.5 C 15 14.223 14.777 14 14.5 14 L 13.5 14 z " - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter9040)" - id="path8998" - d="M 10.5,13.375 C 9.8833937,13.375 9.375,13.883394 9.375,14.5 C 9.375,15.116606 9.8833937,15.625 10.5,15.625 L 11.5,15.625 C 11.997417,15.625 12.351557,15.26606 12.5,14.8125 C 12.648443,15.26606 13.002583,15.625 13.5,15.625 L 14.5,15.625 C 15.116606,15.625 15.625,15.116606 15.625,14.5 C 15.625,13.883394 15.116606,13.375 14.5,13.375 L 13.5,13.375 C 13.002583,13.375 12.648443,13.73394 12.5,14.1875 C 12.351557,13.73394 11.997417,13.375 11.5,13.375 L 10.5,13.375 z" - transform="matrix(0.7360213,0,0,0.7376927,0.4333759,-1.1147722)" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.58151811" - inkscape:original="M 8.5 9 C 7.5744947 9 8.0888797 12.372263 4 10.3125 C 5.6494162 12.565197 8.197109 13 8.96875 13 C 9.7318012 13 11.759773 11.940619 12.03125 9.96875 C 9.8826905 12.168839 9.3373684 9 8.5 9 z " - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter8756)" - id="path7960" - d="M 8.5,8.40625 C 8.2077387,8.40625 7.9340555,8.5866498 7.78125,8.75 C 7.6284445,8.9133502 7.5498385,9.0608344 7.46875,9.21875 C 7.3065731,9.5345811 7.172643,9.8595724 7,10.0625 C 6.827357,10.265428 6.671609,10.387141 6.28125,10.40625 C 5.890891,10.425359 5.2196564,10.269712 4.25,9.78125 C 4.0077291,9.6621096 3.7153231,9.7253647 3.5439557,9.9339859 C 3.3725882,10.142607 3.3673262,10.44173 3.53125,10.65625 C 4.4297328,11.883357 5.5774976,12.609102 6.59375,13.03125 C 7.6100024,13.453398 8.4737052,13.59375 8.96875,13.59375 C 9.6193922,13.59375 10.340813,13.267437 11.0625,12.6875 C 11.784187,12.107563 12.433247,11.228313 12.59375,10.0625 C 12.622923,9.8212663 12.499043,9.5873227 12.283116,9.4758765 C 12.067189,9.3644302 11.804734,9.3989754 11.625,9.5625 C 11.145204,10.053803 10.811541,10.151032 10.65625,10.15625 C 10.500959,10.161468 10.384244,10.105939 10.1875,9.90625 C 9.9907556,9.7065608 9.7866869,9.3846583 9.5625,9.09375 C 9.4504065,8.9482959 9.3464815,8.8194169 9.1875,8.6875 C 9.0285185,8.5555831 8.7880568,8.40625 8.5,8.40625 z" - transform="translate(0.9337088,2.2097087e-2)" /> - <path - style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 12.665364,5.6592388 C 12.000973,4.6508398 10.81971,4.941345 10.39549,5.5852216 C 9.8141493,6.4675705 9.881553,8.00209 10.545944,9.0104902 C 11.123309,9.8868033 12.156638,10.433807 12.737979,9.551461 C 13.319319,8.6691115 13.190256,6.4559104 12.665364,5.6592388 z" - id="path3134" - sodipodi:nodetypes="csssc" /> - <path - style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 8,9 C 8,9 8,10 8,10 L 8.8944098,10 C 9.0595775,10 9.1925465,9.7769994 9.1925465,9.4999995 C 9.1925465,9.2229999 9.0595775,9 8.8944098,9 L 8,9 z M 10.086956,9 C 9.9217887,9 9.7888198,9.2229999 9.7888198,9.4999995 C 9.7888198,9.7769994 9.9217887,10 10.086956,10 L 11,10 C 11,10 11,9.1680139 11,9 L 10.086956,9 z" - id="rect3140" - sodipodi:nodetypes="cccscccscccc" /> - <path - style="fill:url(#linearGradient8726);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 4.9337087,10.066933 C 8.8819634,12.626696 8.4961475,9.022097 9.4216528,9.022097 C 10.259021,9.022097 10.807246,12.196312 12.955806,9.9962228 C 12.684329,11.968092 10.658384,13.022097 9.8953332,13.022097 C 9.1236918,13.022097 6.5674999,12.88213 4.9337087,10.066933 z" - id="path3142" - sodipodi:nodetypes="czczc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:url(#linearGradient8735);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path8733" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.8057555,0,0,0.7724141,2.8057548,-10.779318)" /> - </g> -</svg>
--- a/pidgin/pixmaps/icons/hicolor/24x24/apps/scalable/pidgin.svg Sat Jul 25 02:55:33 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,347 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.46" - sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Bureaublad/pidgin.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - version="1.0" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs4347"> - <linearGradient - id="linearGradient8989" - inkscape:collect="always"> - <stop - id="stop8991" - offset="0" - style="stop-color:#ffffff;stop-opacity:0.81407034" /> - <stop - id="stop8993" - offset="1" - style="stop-color:#eeeeec;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8838"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop8840" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop8842" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8830"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop8832" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop8834" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8776"> - <stop - style="stop-color:#ffffff;stop-opacity:0.82412058" - offset="0" - id="stop8778" /> - <stop - style="stop-color:#ffffff;stop-opacity:0" - offset="1" - id="stop8780" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8720"> - <stop - style="stop-color:#fdc26a;stop-opacity:1" - offset="0" - id="stop8722" /> - <stop - style="stop-color:#f57900;stop-opacity:1" - offset="1" - id="stop8724" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3124"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop3126" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop3128" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3116"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop3118" /> - <stop - style="stop-color:#82508e;stop-opacity:0" - offset="1" - id="stop3120" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8989" - id="linearGradient6512" - x1="15.712908" - y1="41.672424" - x2="15.712908" - y2="43.283482" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.657666,0,0,0.625853,0.8007403,-4.3010586)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3124" - id="linearGradient3130" - x1="12.561858" - y1="39.538197" - x2="12.561858" - y2="43.858727" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.6753496,0,0,0.6455349,0.4630688,-4.891953)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8720" - id="linearGradient8726" - x1="12.806054" - y1="16.65247" - x2="13.166923" - y2="16.608501" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(0.9722718,0)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3116" - id="linearGradient8774" - x1="10.624538" - y1="19.763729" - x2="10.624538" - y2="23.347383" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(0.9722718,0)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient8776" - id="radialGradient8782" - cx="11.763939" - cy="12.831866" - fx="11.763939" - fy="12.831866" - r="9.5000002" - gradientTransform="matrix(1.5913256,-4.8823489e-2,2.9994878e-2,0.9776358,-5.9699631,1.0103644)" - gradientUnits="userSpaceOnUse" /> - <filter - inkscape:collect="always" - id="filter8810" - x="-0.066766478" - width="1.133533" - y="-0.10563155" - height="1.2112631"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.30534121" - id="feGaussianBlur8812" /> - </filter> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8830" - id="linearGradient8836" - x1="6.3341951" - y1="3.1008458" - x2="0.83419508" - y2="3.1008458" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(0.9722718,0)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8838" - id="linearGradient8844" - x1="9.5704832" - y1="3.0778286" - x2="3.0625" - y2="-0.047171354" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(0.9722718,0)" /> - <filter - inkscape:collect="always" - id="filter9040" - x="-0.095484515" - width="1.190969" - y="-0.32181818" - height="1.6436364"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.22627841" - id="feGaussianBlur9042" /> - </filter> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="22.627417" - inkscape:cx="21.62498" - inkscape:cy="11.838987" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1440" - inkscape:window-height="847" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="false" - width="24px" - height="24px" - inkscape:object-bbox="true" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10"> - <inkscape:grid - type="xygrid" - id="grid7936" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - style="fill:url(#linearGradient8844);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 6.9177548,1.9731142 C 8.1897168,-0.34713734 10.972272,1.9093507 10.972272,4.2806574 L 9.9267968,4.1947658 C 9.9267968,2.9993751 8.9228106,1.7171212 6.9177548,1.9731142 z" - id="rect5189" - sodipodi:nodetypes="cccc" /> - <path - style="fill:url(#linearGradient8836);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 4.3071856,3.782206 C 4.2486113,1.1368282 7.7866188,1.6997265 8.9722718,3.7533385 L 8.0239178,4.2016918 C 7.4262233,3.1664528 5.9156185,2.5579816 4.3071856,3.782206 z" - id="path8784" - sodipodi:nodetypes="cccc" - inkscape:transform-center-x="1.7235728" - inkscape:transform-center-y="-0.24306796" /> - <path - style="opacity:1;fill:url(#linearGradient8774);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 10.593313,3.5 C 6.1197955,3.5 2.4891175,7.1149956 2.4891175,11.569186 C 2.4891175,15.218486 3.4986749,23.427658 -1.7892089,23.427658 C -0.98723886,23.427658 18.806305,24.544826 20.623671,24.544826 C 22.051445,24.544826 21.939905,23.215283 21.939905,23.215283 C 21.939905,22.576692 21.741015,22.10882 20.830589,21.409004 C 19.67644,20.521846 19.025096,20.449608 18.028757,19.406617 C 17.032418,18.363626 18.022158,14.796859 18.022158,14.796859 C 18.455264,13.809319 18.521629,12.846972 18.521629,11.701094 C 18.521629,7.2469039 15.066831,3.5 10.593313,3.5 z" - id="path5176" - sodipodi:nodetypes="ccccsszcsc" /> - <path - style="opacity:0.5;fill:url(#radialGradient8782);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 10.665731,4.5 C 6.7116478,4.5 3.4833573,7.6765676 3.4725083,11.638635 C 3.4724903,11.645318 3.4719843,11.651527 3.4725083,11.658194 C 3.4725083,11.658194 4.335542,22.578523 0.47920826,23.611825 C 1.7528328,23.611825 14.992315,23.530678 18.82386,23.530678 C 19.591493,23.530678 20.897748,23.846154 20.897748,22.929553 C 20.897748,22.790774 20.766378,22.529834 20.404498,22.20591 C 20.042618,21.881986 19.501364,21.534156 18.904198,21.188899 C 17.106601,20.449743 16.43302,19.238726 16.372193,17.277317 C 16.452619,15.30249 17.621333,13.948626 17.485214,11.768117 C 17.485214,7.7967072 14.626482,4.5 10.665731,4.5 z" - id="path5241" - sodipodi:nodetypes="cscccsscccc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.97252291" - inkscape:original="M 7.15625 8 C 5.7694225 8 4.9999998 9.5395554 5 10.96875 C 5 12.613363 6.1444228 13.96875 7.53125 13.96875 C 8.5432599 13.96875 10.03125 12.832113 10.03125 11.1875 C 10.03125 9.8881973 8.5430781 8 7.15625 8 z " - style="opacity:1;fill:#9757a4;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path8816" - d="M 7.15625,7.03125 C 6.1029614,7.03125 5.2431984,7.6462575 4.75,8.40625 C 4.2568016,9.1662425 4.0312499,10.07963 4.03125,10.96875 C 4.03125,13.064524 5.5107726,14.9375 7.53125,14.9375 C 8.4013507,14.9375 9.1895212,14.517728 9.84375,13.875 C 10.497979,13.232272 11,12.303108 11,11.1875 C 11,10.166552 10.509035,9.2426793 9.84375,8.46875 C 9.1784648,7.6948207 8.2910346,7.03125 7.15625,7.03125 z" - transform="matrix(1.0039789,0,0,1,-4.3768242e-2,6.25e-2)" /> - <path - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 9.9722718,11.217568 C 9.9722718,12.873569 8.4886302,14 7.4878967,14 C 6.1165222,14 5.0035223,12.656001 5.0035223,11 C 5.0035223,9.5609094 5.7664715,8 7.1378462,8 C 8.5092214,8 9.9722718,9.9092687 9.9722718,11.217568 z" - id="path5157" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(1.1960429,0,0,1.158621,-4.7066825,-16.575223)" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="1.0018603" - inkscape:original="M 15.375 8 C 14.972613 8.0219165 14.616322 8.2670758 14.40625 8.59375 C 13.830495 9.4890789 13.873243 11.039266 14.53125 12.0625 C 15.103067 12.951704 16.049246 13.426577 16.625 12.53125 C 17.200756 11.635921 17.051098 9.4958908 16.53125 8.6875 C 16.202247 8.1758836 15.777387 7.9780835 15.375 8 z " - style="fill:#9757a4;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path8820" - d="M 15.3125,7 C 14.537055,7.0422356 13.927975,7.4941649 13.5625,8.0625 C 12.689986,9.4193046 12.791183,11.199932 13.6875,12.59375 C 14.065497,13.181554 14.559478,13.713455 15.28125,13.9375 C 16.003022,14.161545 17.002245,13.787939 17.46875,13.0625 C 17.974403,12.276184 18.035404,11.401604 18,10.53125 C 17.964596,9.6608958 17.828805,8.8619408 17.375,8.15625 C 16.897304,7.4134085 16.079992,6.9581976 15.3125,7 z" - transform="translate(0.9722718,0)" /> - <path - style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 17.512585,8.6790592 C 16.854579,7.6558262 15.784106,7.9284344 15.363962,8.5817827 C 14.788207,9.4771112 14.854963,11.034204 15.51297,12.057438 C 16.084787,12.946642 17.025322,13.413012 17.601076,12.517685 C 18.176831,11.622356 18.032433,9.48745 17.512585,8.6790592 z" - id="path3134" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path3136" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.8057553,0,0,1.158621,7.7780286,-16.668973)" /> - <path - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter8810)" - d="M 13.566022,12.4375 C 13.194663,12.4375 12.924994,12.697732 12.784772,12.90625 C 12.64455,13.114768 12.563861,13.333559 12.472272,13.5625 C 12.289094,14.020382 12.105216,14.51781 11.847272,14.875 C 11.589328,15.23219 11.326777,15.452654 10.816022,15.46875 C 10.305267,15.484846 9.472703,15.240041 8.2535218,14.4375 C 8.0308701,14.276718 7.7244458,14.30128 7.530249,14.495477 C 7.3360522,14.689674 7.3114894,14.996098 7.4722718,15.21875 C 8.177906,16.27546 9.2361909,17.5841 10.612897,18.40625 C 11.30125,18.817325 12.405251,19.087337 12.987897,19.34375 C 13.570543,19.600163 13.914091,19.5625 14.378522,19.5625 C 14.899377,19.5625 15.235127,19.263825 15.597272,18.9375 C 15.959417,18.611175 16.339029,18.201439 16.691022,17.75 C 17.395008,16.847123 18.035855,15.803499 18.409772,15.1875 C 18.520635,14.941092 18.439589,14.65066 18.217158,14.49726 C 17.994726,14.343859 17.694451,14.37131 17.503522,14.5625 C 16.887662,15.324047 16.510081,15.447586 16.316022,15.4375 C 16.121963,15.427414 15.873341,15.263025 15.597272,14.875 C 15.321203,14.486975 15.048543,13.963561 14.784772,13.5 C 14.652887,13.26822 14.51805,13.036007 14.347272,12.84375 C 14.176494,12.651493 13.932762,12.4375 13.566022,12.4375 z" - id="path8770" - sodipodi:nodetypes="csssscscssssscscssssc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.63276428" - inkscape:original="M 10.5 14 C 10.223 14 10 14.223 10 14.5 C 10 14.777 10.223 15 10.5 15 L 11.5 15 C 11.777 15 12 14.777 12 14.5 C 12 14.223 11.777 14 11.5 14 L 10.5 14 z M 13.5 14 C 13.223 14 13 14.223 13 14.5 C 13 14.777 13.223 15 13.5 15 L 14.5 15 C 14.777 15 15 14.777 15 14.5 C 15 14.223 14.777 14 14.5 14 L 13.5 14 z " - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter9040)" - id="path8998" - d="M 10.5,13.375 C 9.8833937,13.375 9.375,13.883394 9.375,14.5 C 9.375,15.116606 9.8833937,15.625 10.5,15.625 L 11.5,15.625 C 11.997417,15.625 12.351557,15.26606 12.5,14.8125 C 12.648443,15.26606 13.002583,15.625 13.5,15.625 L 14.5,15.625 C 15.116606,15.625 15.625,15.116606 15.625,14.5 C 15.625,13.883394 15.116606,13.375 14.5,13.375 L 13.5,13.375 C 13.002583,13.375 12.648443,13.73394 12.5,14.1875 C 12.351557,13.73394 11.997417,13.375 11.5,13.375 L 10.5,13.375 z" - transform="translate(0.9722718,0)" /> - <path - style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 11,14 C 11,14 11,15 11,15 L 12.491733,15 C 12.767207,15 12.988978,14.777 12.988978,14.5 C 12.988978,14.223 12.767207,14 12.491733,14 L 11,14 z M 14.480711,14 C 14.205238,14 13.983467,14.223 13.983467,14.5 C 13.983467,14.777 14.205238,15 14.480711,15 L 16.003522,15 C 16.003522,15 16.003522,14.168014 16.003522,14 L 14.480711,14 z" - id="rect3140" - sodipodi:nodetypes="cccscccscccc" /> - <path - style="fill:url(#linearGradient8726);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 7.982195,14.992875 C 13.070707,18.088335 12.577918,13 13.567333,13 C 14.578647,13 15.264171,18.201991 17.938001,14.895644 C 17.517658,16.431071 15.326409,19.011297 14.376811,19.011297 C 13.416522,19.011297 10.034853,18.378283 7.982195,14.992875 z" - id="path3142" - sodipodi:nodetypes="czczc" /> - </g> -</svg>
--- a/pidgin/pixmaps/icons/hicolor/32x32/apps/scalable/pidgin.svg Sat Jul 25 02:55:33 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,617 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="32" - height="32" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.46" - sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/32/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Bureaublad/pidgin-32.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - version="1.0" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs4347"> - <linearGradient - inkscape:collect="always" - id="linearGradient2816"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop2818" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop2820" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2826"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop2828" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop2830" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2834"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop2836" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop2838" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6537"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6539" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6506"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop6508" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6510" /> - </linearGradient> - <linearGradient - y2="30.188351" - x2="18.143806" - y1="29.72571" - x1="18.097515" - gradientUnits="userSpaceOnUse" - id="linearGradient8818" - xlink:href="#linearGradient8808" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="30.431053" - x2="18.031723" - y1="29.72571" - x1="18.097515" - id="linearGradient8814" - xlink:href="#linearGradient8820" - inkscape:collect="always" /> - <linearGradient - id="linearGradient8686" - inkscape:collect="always"> - <stop - id="stop8688" - offset="0" - style="stop-color:#fdb751;stop-opacity:1" /> - <stop - id="stop8690" - offset="1" - style="stop-color:#ce5c00;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient8808" - inkscape:collect="always"> - <stop - id="stop8810" - offset="0" - style="stop-color:#6e3100;stop-opacity:1;" /> - <stop - id="stop8812" - offset="1" - style="stop-color:#6e3100;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8820"> - <stop - style="stop-color:#522400;stop-opacity:1" - offset="0" - id="stop8822" /> - <stop - style="stop-color:#6e3100;stop-opacity:0;" - offset="1" - id="stop8824" /> - </linearGradient> - <linearGradient - id="linearGradient8848" - inkscape:collect="always"> - <stop - id="stop8850" - offset="0" - style="stop-color:#000000;stop-opacity:1;" /> - <stop - id="stop8852" - offset="1" - style="stop-color:#ffffff;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient8860" - inkscape:collect="always"> - <stop - id="stop8862" - offset="0" - style="stop-color:#3b1941;stop-opacity:1;" /> - <stop - id="stop8864" - offset="1" - style="stop-color:#a949b9;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient8868" - inkscape:collect="always"> - <stop - id="stop8870" - offset="0" - style="stop-color:#3b1941;stop-opacity:1;" /> - <stop - id="stop8872" - offset="1" - style="stop-color:#a646b7;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient8876" - inkscape:collect="always"> - <stop - id="stop8878" - offset="0" - style="stop-color:#9a5ba8;stop-opacity:1;" /> - <stop - id="stop8880" - offset="1" - style="stop-color:#744380;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient8884" - inkscape:collect="always"> - <stop - id="stop8886" - offset="0" - style="stop-color:#9a5ba8;stop-opacity:1;" /> - <stop - id="stop8888" - offset="1" - style="stop-color:#6b3e75;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient8904" - inkscape:collect="always"> - <stop - id="stop8906" - offset="0" - style="stop-color:#729fcf;stop-opacity:1;" /> - <stop - id="stop8908" - offset="1" - style="stop-color:#25486d;stop-opacity:1" /> - </linearGradient> - <linearGradient - id="linearGradient8732" - inkscape:collect="always"> - <stop - id="stop8734" - offset="0" - style="stop-color:#6b3678;stop-opacity:1;" /> - <stop - id="stop8736" - offset="1" - style="stop-color:#6b3678;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient8744"> - <stop - style="stop-color:#7a1d90;stop-opacity:1" - offset="0" - id="stop8746" /> - <stop - style="stop-color:#6b3678;stop-opacity:0;" - offset="1" - id="stop8748" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8732" - id="linearGradient8239" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(-0.6883673,0,0,0.6819755,24.954518,-0.5239125)" - x1="4.0852318" - y1="40.416641" - x2="4.0852318" - y2="43.352409" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8744" - id="linearGradient8242" - gradientUnits="userSpaceOnUse" - x1="4.0852318" - y1="39.097038" - x2="4.0852318" - y2="44.321774" - gradientTransform="matrix(0.6883673,0,0,0.6819755,-0.5307196,-0.5239125)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8686" - id="linearGradient8248" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.7692307,0,0,0.8858131,-1.2307696,-7.0311428)" - x1="18.5" - y1="29.911009" - x2="19.985121" - y2="29.853554" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient2816" - id="radialGradient8261" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.7193306,0,0,0.7337558,-19.889272,-7.8067639)" - cx="46.861629" - cy="38.01083" - fx="46.861629" - fy="38.01083" - r="16.390338" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient8263" - gradientUnits="userSpaceOnUse" - x1="15.645709" - y1="40.956318" - x2="15.645709" - y2="44.694569" - gradientTransform="matrix(0.6894969,0,0,0.6764991,-0.2876444,-0.2797398)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2834" - id="linearGradient8266" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.7068603,0,0,0.6774341,-33.464679,-11.987365)" - x1="58.611423" - y1="56.489136" - x2="58.611423" - y2="61.328545" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2826" - id="linearGradient8268" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.7068603,0,0,0.6774341,-33.464679,-11.987365)" - x1="60.8349" - y1="56.601696" - x2="60.8349" - y2="61.321751" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8868" - id="linearGradient8271" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.9347751,0,0,0.4640431,-5.8911763,1.552034)" - x1="12.409452" - y1="10.602999" - x2="16.140554" - y2="13.895189" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8860" - id="linearGradient8274" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.0342512,0,0,0.6819755,-6.0896085,-1.7917997)" - x1="13.061977" - y1="10.027351" - x2="16.545418" - y2="12.891665" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient8277" - gradientUnits="userSpaceOnUse" - x1="30.5" - y1="1.7319652" - x2="30.5" - y2="22.781603" - gradientTransform="matrix(0.6666666,0,0,0.6587574,0.1666662,-0.1468935)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8904" - id="linearGradient8280" - gradientUnits="userSpaceOnUse" - x1="29.466667" - y1="6.8962817" - x2="42.829762" - y2="37.801281" - gradientTransform="matrix(0.6875001,0,0,0.6767003,-0.4687499,-0.5159997)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8876" - id="linearGradient8284" - gradientUnits="userSpaceOnUse" - x1="10.46875" - y1="25.3125" - x2="9.53125" - y2="19.6875" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8848" - id="linearGradient8286" - gradientUnits="userSpaceOnUse" - x1="10.48653" - y1="25.21174" - x2="9.7512932" - y2="23.675837" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8884" - id="linearGradient8288" - gradientUnits="userSpaceOnUse" - x1="23.881994" - y1="24.343237" - x2="24.973602" - y2="19.216713" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient8848" - id="linearGradient8290" - gradientUnits="userSpaceOnUse" - x1="10.498732" - y1="24.936121" - x2="9.6415968" - y2="23.675837" /> - <filter - inkscape:collect="always" - id="filter9078"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.29164334" - id="feGaussianBlur9080" /> - </filter> - <filter - inkscape:collect="always" - id="filter9122" - x="-0.06288049" - width="1.125761" - y="-0.22385455" - height="1.4477091"> - <feGaussianBlur - inkscape:collect="always" - stdDeviation="0.14573864" - id="feGaussianBlur9124" /> - </filter> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="17.236022" - inkscape:cx="25.766946" - inkscape:cy="17.060038" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1432" - inkscape:window-height="840" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="false" - width="32px" - height="32px" - inkscape:object-bbox="true" - inkscape:snap-bbox="true" - inkscape:snap-nodes="false" - objecttolerance="10" - gridtolerance="10"> - <inkscape:grid - type="xygrid" - id="grid8236" - visible="true" - enabled="true" /> - </sodipodi:namedview> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - style="fill:#efefef;fill-opacity:1;stroke:url(#linearGradient8280);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.646486,0.49905075 C 11.351227,0.49905075 9.5000004,2.6044244 9.5000004,5.2148058 L 9.5000004,13.377503 C 9.5000004,15.987885 11.351227,18.470375 13.646486,18.470375 L 23.588406,18.470375 C 23.588406,18.470375 23.18568,20.245193 22.16985,21.5 C 25.739035,21.5 26.597376,19.058605 26.597376,18.460569 L 28.062501,18.470375 C 30.821257,18.470375 31.500001,15.984112 31.500001,13.377503 L 31.500001,5.2148058 C 31.500001,2.6044246 29.648775,0.49905075 27.353517,0.49905075 L 13.646486,0.49905075 z" - id="path8201" - sodipodi:nodetypes="cccccccccccc" /> - <path - style="fill:url(#linearGradient8277);fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.854166,1.5 C 12.0438,1.5 10.5,3.1982064 10.5,5.4319585 L 10.5,13.37822 C 10.5,15.611972 12.0438,17.310178 13.854166,17.310178 L 23.854707,17.310178 C 24.222455,17.311225 24.520314,17.605549 24.521373,17.968936 C 24.521373,17.968936 24.644478,19.146784 24.232611,19.890811 C 25.286204,19.513694 25.854166,17.433696 25.854166,17.433696 C 25.969506,17.352067 26.108135,17.30881 26.249999,17.310178 L 27.833332,17.310178 C 28.997823,17.310178 29.543634,16.936466 29.9375,16.280871 C 30.331365,15.625274 30.5,14.590529 30.5,13.37822 L 30.5,5.4319585 C 30.5,3.1982066 28.956198,1.5 27.145833,1.5 L 13.854166,1.5 z" - id="path8203" - sodipodi:nodetypes="ccccccccccscccc" /> - <rect - style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect8734" - width="4.8185711" - height="1.2686747" - x="10.237393" - y="17.486546" - rx="0.5602473" - ry="0.63433737" /> - <path - style="fill:url(#linearGradient8274);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 6,4.9064736 C 7.9672058,3.6750483 11.311019,5.8704952 11.667854,7 L 8.951995,7 C 8.9089721,5.4016199 6,4.9064736 6,4.9064736 z" - id="path8205" - sodipodi:nodetypes="cccc" /> - <path - style="fill:url(#linearGradient8271);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 5,6.7464464 C 6.2268113,5.1783371 10,6.3940033 10,7.5343215 L 7.134176,8 C 8.0531299,6.6379921 5,6.7464464 5,6.7464464 z" - id="path8207" - sodipodi:nodetypes="cccc" /> - <path - style="fill:url(#linearGradient8266);fill-opacity:1;stroke:url(#linearGradient8268);stroke-width:0.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 11.067522,6.4999996 C 6.385278,6.4999996 2.2201068,10.234965 2.6293774,14.884611 C 3.5249724,25.059298 0.81309749,23.680419 0.50183135,28.323515 C 0.50183135,29.735371 1.1983857,30.406973 2.6874788,30.406973 C 3.5268674,30.406973 21.218061,30.505972 23.120221,30.505972 C 24.614613,30.505972 24.497868,29.110729 24.497868,29.110729 C 24.497868,27.305087 19.972479,25.789981 18.711123,24.464564 C 17.418686,23.109004 18.842985,18.271782 18.842985,18.271782 C 19.296299,17.235443 19.549846,16.087114 19.549846,14.884611 C 19.549846,10.210316 15.749766,6.4999996 11.067522,6.4999996 z" - id="path8209" - sodipodi:nodetypes="cscccszcsc" /> - <path - style="opacity:0.55;fill:url(#radialGradient8261);fill-opacity:1;stroke:url(#linearGradient8263);stroke-width:0.99999982;stroke-miterlimit:4;stroke-opacity:1" - d="M 10.916681,7.4999998 C 6.7712212,7.4999998 3.1789143,10.957612 3.5045886,15.167484 C 3.8937578,20.198131 3.7235067,21.924032 2.4866618,25.116843 C 0.50096208,28.326958 1.8660136,29.846841 3.4810518,29.846841 C 4.8163187,29.846841 17.103621,29.826924 21.120612,29.826924 C 21.925398,29.826924 23.294875,30.163902 23.294875,29.184825 C 23.294875,29.036588 23.157148,28.757863 22.777754,28.411859 C 22.398357,28.065856 21.830907,27.694319 21.204838,27.325529 C 20.578767,26.956739 19.909935,26.583672 19.308721,26.218308 C 18.707508,25.852945 18.174778,25.511888 17.800447,25.027522 C 17.379851,24.483292 17.186833,23.843536 17.14928,23.147336 C 17.111728,22.451136 17.206769,21.704215 17.28733,20.995566 C 17.448452,19.578267 17.800447,18.342413 17.800447,18.342413 C 17.810782,18.299429 17.825209,18.257467 17.84354,18.217067 C 18.248606,17.280213 18.468397,16.236634 18.468397,15.146094 C 18.468397,10.903994 15.069132,7.4999998 10.916681,7.4999998 z" - id="path8211" - sodipodi:nodetypes="cscccssssssscssc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="1.0174263" - inkscape:original="M 9.96875 19 C 8.022221 19 6.9374998 21.081214 6.9375 23 C 6.9375 25.208 8.5222219 27 10.46875 27 C 11.889191 27 14 25.489251 14 23.28125 C 14 21.536852 11.915281 19 9.96875 19 z " - style="fill:url(#linearGradient8284);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path8838" - d="M 9.96875,17.96875 C 8.6328774,17.96875 7.5286409,18.753017 6.875,19.71875 C 6.2213591,20.684483 5.9062499,21.848884 5.90625,23 C 5.90625,25.694817 7.8977844,28.03125 10.46875,28.03125 C 11.539674,28.03125 12.596335,27.527372 13.46875,26.71875 C 14.341165,25.910128 15.03125,24.709464 15.03125,23.28125 C 15.03125,22.003744 14.362496,20.808851 13.46875,19.8125 C 12.575004,18.816149 11.384009,17.96875 9.96875,17.96875 z" - transform="matrix(0.8767124,0,0,0.795031,-1.1780825,-4.2857136)" /> - <path - style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11,14.217567 C 11,15.873567 9.2097808,17 8.0022573,17 C 6.3475044,17 5.0045159,15.655999 5.0045159,14 C 5.0045159,12.56091 5.9251197,11 7.5798726,11 C 9.2346277,11 11,12.909268 11,14.217567 z" - id="path8214" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="fill:#6b1a80;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path8216" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(1.2086331,0,0,1.1586209,-4.7913664,-13.66897)" /> - <path - sodipodi:type="arc" - style="fill:url(#linearGradient8286);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5164" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.4028777,0,0,0.3862069,3.4028779,5.1103446)" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="1.0250763" - inkscape:original="M 24.71875 19 C 23.921039 19.030682 23.197708 19.355158 22.78125 19.8125 C 21.639847 21.065961 21.758036 23.254972 23.0625 24.6875 C 24.196099 25.932389 26.077347 26.565958 27.21875 25.3125 C 28.360153 24.05904 28.061824 21.069247 27.03125 19.9375 C 26.379019 19.221236 25.516461 18.969318 24.71875 19 z " - style="fill:url(#linearGradient8288);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path8846" - d="M 24.6875,17.96875 C 23.636213,18.009185 22.683031,18.409233 22.03125,19.125 C 20.466122,20.843786 20.678782,23.580894 22.3125,25.375 C 23.011072,26.142154 23.917332,26.724837 24.9375,26.9375 C 25.957668,27.150163 27.151401,26.89759 27.96875,26 C 28.842555,25.04041 29.039766,23.753975 28.96875,22.53125 C 28.897734,21.308525 28.565932,20.111716 27.78125,19.25 C 26.906665,18.289553 25.728905,17.928695 24.6875,17.96875 z" - transform="matrix(0.7484239,0,0,0.7741119,-1.6908405,-3.9075188)" /> - <path - style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 18.387083,11.67906 C 17.509743,10.655828 16.082447,10.928433 15.522253,11.58178 C 14.754581,12.477109 14.843587,14.034201 15.720929,15.057435 C 16.483351,15.94664 17.737401,16.413013 18.505073,15.517687 C 19.272745,14.622358 19.080214,12.487451 18.387083,11.67906 z" - id="path8220" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="fill:#6b1a80;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path8222" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.8057552,0,0,1.1586207,7.8057579,-13.668966)" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.45127434" - inkscape:original="M 13.4375 16 C 12.661218 16 12.51015 20.901969 8 18.0625 C 9.44341 21.526853 12.98614 22.15225 14.4375 23 C 15.186206 22.224914 17.79624 20.07567 18 17.6875 C 14.33672 20.56768 14.203099 16 13.4375 16 z " - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter9078)" - id="path8294" - d="M 13.4375,15.5625 C 13.102994,15.5625 12.900231,15.762242 12.78125,15.9375 C 12.662269,16.112758 12.598408,16.320422 12.5,16.53125 C 12.303184,16.952907 12.081096,17.438832 11.78125,17.8125 C 11.481404,18.186168 11.117515,18.452218 10.59375,18.5 C 10.069985,18.547782 9.3270345,18.365572 8.25,17.6875 C 8.0823108,17.580065 7.8640254,17.595242 7.7128173,17.724849 C 7.5616092,17.854456 7.5132259,18.067852 7.59375,18.25 C 9.1305666,21.93854 12.960094,22.63981 14.21875,23.375 C 14.390432,23.472658 14.605671,23.447336 14.75,23.3125 C 15.08711,22.963512 15.981008,22.217382 16.78125,21.25 C 17.581492,20.282618 18.32272,19.06403 18.4375,17.71875 C 18.441912,17.546498 18.34786,17.386764 18.195094,17.30706 C 18.042327,17.227356 17.857509,17.241591 17.71875,17.34375 C 16.849538,18.02715 16.256503,18.203898 15.875,18.1875 C 15.493497,18.171102 15.246785,17.984965 15,17.65625 C 14.753215,17.327535 14.557786,16.863539 14.375,16.46875 C 14.283607,16.271356 14.181058,16.105684 14.0625,15.9375 C 13.943942,15.769316 13.757564,15.5625 13.4375,15.5625 z" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="0.28790623" - inkscape:original="M 11.5 17 C 11.223 17 11 17.223 11 17.5 C 11 17.777 11.223 18 11.5 18 L 15.5 18 C 15.777 18 16 17.777 16 17.5 C 16 17.223 15.777 17 15.5 17 L 11.5 17 z " - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter9122)" - id="path9084" - d="M 11.5,16.71875 C 11.06848,16.71875 10.71875,17.06848 10.71875,17.5 C 10.71875,17.93152 11.06848,18.28125 11.5,18.28125 L 15.5,18.28125 C 15.93152,18.28125 16.28125,17.93152 16.28125,17.5 C 16.28125,17.06848 15.93152,16.71875 15.5,16.71875 L 11.5,16.71875 z" /> - <rect - style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect8226" - width="5" - height="1" - x="11" - y="17" - rx="0.5" - ry="0.5" /> - <path - style="fill:url(#linearGradient8248);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 8,18.051818 C 12.51015,20.891288 12.65519,16 13.431472,16 C 14.197071,16 14.33672,20.582306 18,17.702126 C 17.79624,20.090296 15.178764,22.224914 14.430058,23 C 12.978698,22.15225 9.44341,21.516171 8,18.051818 z" - id="rect5187" - sodipodi:nodetypes="czccc" /> - <path - sodipodi:type="arc" - style="opacity:0.61111108999999997;fill:url(#linearGradient8814);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path8806" - sodipodi:cx="18.097515" - sodipodi:cy="29.72571" - sodipodi:rx="0.28726214" - sodipodi:ry="0.6408155" - d="M 18.384777,29.72571 A 0.28726214,0.6408155 0 1 1 17.810253,29.72571 A 0.28726214,0.6408155 0 1 1 18.384777,29.72571 z" - transform="matrix(-1.0945739,0.462613,0.6067759,0.7520251,16.272223,-11.226626)" /> - <path - sodipodi:type="arc" - style="opacity:0.61111108999999997;fill:url(#linearGradient8818);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - id="path8816" - sodipodi:cx="18.097515" - sodipodi:cy="29.72571" - sodipodi:rx="0.28726214" - sodipodi:ry="0.6408155" - d="M 18.384777,29.72571 A 0.28726214,0.6408155 0 1 1 17.810253,29.72571 A 0.28726214,0.6408155 0 1 1 18.384777,29.72571 z" - transform="matrix(1.0945739,0.462613,-0.606776,0.7520251,10.727779,-11.226626)" /> - <path - sodipodi:type="arc" - style="fill:url(#linearGradient8290);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path8856" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714,24.3125 A 1.2410715,1.2946428 0 1 1 8.928571,24.3125 A 1.2410715,1.2946428 0 1 1 11.410714,24.3125 z" - transform="matrix(0.4028777,0,0,0.3862069,11.402878,5.110345)" /> - <path - style="opacity:0.61111109;fill:url(#linearGradient8242);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 1.79252,30.122362 C 0.67392318,29.866621 0.24369361,27.479706 2.3518185,23.856712 C 3.1851311,27.272027 7.0413207,29.73875 7.0413207,29.73875 L 1.79252,30.122362 z" - id="rect7959" - sodipodi:nodetypes="cccc" /> - <path - style="opacity:0.61111109;fill:url(#linearGradient8239);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" - d="M 22.631278,30.122362 C 23.749876,29.866621 24.782427,28.50267 19.275488,25.774768 C 19.517749,28.593354 17.382477,29.73875 17.382477,29.73875 L 22.631278,30.122362 z" - id="path8740" - sodipodi:nodetypes="cccc" /> - </g> -</svg>