Mercurial > pidgin
changeset 12524:977ebab0435f
[gaim-migrate @ 14836]
cleaning up: fixing a memleak, removing unnecessary faux-status stuff, tweaking plaintext messaging support and encoding weirdness
committer: Tailor Script <tailor@pidgin.im>
author | Christopher O'Brien <siege@pidgin.im> |
---|---|
date | Sat, 17 Dec 2005 15:40:06 +0000 |
parents | b5c5c4a57555 |
children | dd2b171a624c |
files | src/protocols/sametime/sametime.c src/protocols/sametime/sametime.h |
diffstat | 2 files changed, 75 insertions(+), 295 deletions(-) [+] |
line wrap: on
line diff
--- a/src/protocols/sametime/sametime.c Sat Dec 17 06:23:42 2005 +0000 +++ b/src/protocols/sametime/sametime.c Sat Dec 17 15:40:06 2005 +0000 @@ -829,23 +829,36 @@ alias = mwSametimeGroup_getAlias(stgroup); type = mwSametimeGroup_getType(stgroup); + DEBUG_INFO("attempting to ensure group %s, called %s\n", + NSTR(name), NSTR(alias)); + /* first attempt at finding the group, by the name key */ for(gn = blist->root; gn; gn = gn->next) { - const char *n; + const char *n, *o; if(! GAIM_BLIST_NODE_IS_GROUP(gn)) continue; n = gaim_blist_node_get_string(gn, GROUP_KEY_NAME); + o = gaim_blist_node_get_string(gn, GROUP_KEY_OWNER); + + DEBUG_INFO("found group named %s, owned by %s\n", NSTR(n), NSTR(o)); if(n && !strcmp(n, name)) { - group = (GaimGroup *) gn; - break; + if(!o || !strcmp(o, owner)) { + DEBUG_INFO("that'll work\n"); + group = (GaimGroup *) gn; + break; + } } - } + } /* try again, by alias */ - if(! group) group = gaim_find_group(alias); + if(! group) { + DEBUG_INFO("searching for group by alias %s\n", NSTR(alias)); + group = gaim_find_group(alias); + } /* oh well, no such group. Let's create it! */ if(! group) { + DEBUG_INFO("creating group\n"); group = gaim_group_new(alias); gaim_blist_add_group(group, NULL); } @@ -1138,87 +1151,6 @@ } -/** callback passed to the storage service when it's told to load one - of the default status messages */ -static void fetch_msg_cb(struct mwServiceStorage *srvc, - guint32 result, struct mwStorageUnit *item, - gpointer data) { - - struct mwGaimPluginData *pd = data; - GaimConnection *gc; - GaimAccount *acct; - struct mwSession *session; - char *msg, *m; - - /* it's no big deal if these entries don't exist on the server */ - if(result != ERR_SUCCESS) return; - - g_return_if_fail(pd != NULL); - - gc = pd->gc; - g_return_if_fail(gc != NULL); - - acct = gaim_connection_get_account(gc); - g_return_if_fail(acct != NULL); - - session = pd->session; - g_return_if_fail(session != NULL); - - m = msg = mwStorageUnit_asString(item); - - /* only load the first (non-empty) line of the collection of - status messages */ - if(m && *m) { - while(*m && isspace(*m)) m++; - if(*m) { - char *tail; - - tail = strchr(m, '\r'); - if(tail) *tail = '\0'; - tail = strchr(m, '\n'); - if(tail) *tail = '\0'; - } - } - - switch(mwStorageUnit_getKey(item)) { - case mwStore_AWAY_MESSAGES: - DEBUG_INFO("setting away message to \"%s\"\n", NSTR(m)); - gaim_account_set_string(acct, MW_KEY_AWAY_MSG, m); - break; - - case mwStore_BUSY_MESSAGES: - DEBUG_INFO("setting busy message to \"%s\"\n", NSTR(m)); - gaim_account_set_string(acct, MW_KEY_BUSY_MSG, m); - break; - - case mwStore_ACTIVE_MESSAGES: - DEBUG_INFO("setting active message to \"%s\"\n", NSTR(m)); - gaim_account_set_string(acct, MW_KEY_ACTIVE_MSG, m); - break; - - default: - g_free(msg); - g_return_if_reached(); - } - - g_free(msg); - msg = NULL; - -#if 0 - /* XXX resets the status, thus updating the message */ - if(!gc->away_state || !strcmp(gc->away_state, MW_STATE_ACTIVE)) { - msg = MW_STATE_ACTIVE; - } else if(gc->away_state && !strcmp(gc->away_state, MW_STATE_AWAY)) { - msg = MW_STATE_AWAY; - } else if(gc->away_state && !strcmp(gc->away_state, MW_STATE_BUSY)) { - msg = MW_STATE_BUSY; - } - - if(msg) serv_set_away(gc, msg, NULL); -#endif -} - - /** signal triggered when a conversation is opened in Gaim */ static void conversation_created_cb(GaimConversation *g_conv, struct mwGaimPluginData *pd) { @@ -1374,16 +1306,6 @@ unit = mwStorageUnit_new(mwStore_AWARE_LIST); mwServiceStorage_load(pd->srvc_store, unit, fetch_blist_cb, pd, NULL); - /* fetch the away/busy/active messages from the server */ - unit = mwStorageUnit_new(mwStore_AWAY_MESSAGES); - mwServiceStorage_load(pd->srvc_store, unit, fetch_msg_cb, pd, NULL); - - unit = mwStorageUnit_new(mwStore_BUSY_MESSAGES); - mwServiceStorage_load(pd->srvc_store, unit, fetch_msg_cb, pd, NULL); - - unit = mwStorageUnit_new(mwStore_ACTIVE_MESSAGES); - mwServiceStorage_load(pd->srvc_store, unit, fetch_msg_cb, pd, NULL); - /* start watching for new conversations */ gaim_signal_connect(gaim_conversations_get_handle(), "conversation-created", gc, @@ -2526,12 +2448,6 @@ } else { convo_data_new(conv); - -#if 0 - if(gaim_prefs_get_bool(MW_PRPL_OPT_PSYCHIC)) { - convo_do_psychic(conv); - } -#endif } { /* record the client key for the buddy */ @@ -2582,23 +2498,18 @@ } - -static char *im_decode(GaimConnection *gc, const char *msg) { - return gaim_utf8_try_convert(msg); -} - - static void im_recv_text(struct mwConversation *conv, struct mwGaimPluginData *pd, const char *msg) { struct mwIdBlock *idb; - char *txt, *esc, *t; + char *txt, *esc; + const char *t; idb = mwConversation_getTarget(conv); - txt = im_decode(pd->gc, msg); - - t = txt? txt: (char *) msg; + + txt = gaim_utf8_try_convert(msg); + t = txt? txt: msg; esc = g_markup_escape_text(t, -1); serv_got_im(pd->gc, idb->user, esc, 0, time(NULL)); @@ -2623,18 +2534,24 @@ static void im_recv_html(struct mwConversation *conv, struct mwGaimPluginData *pd, const char *msg) { - struct mwIdBlock *idb; - char *txt, *t; + char *t1, *t2; + const char *t; idb = mwConversation_getTarget(conv); - txt = im_decode(pd->gc, msg); - - t = txt? txt: (char *) msg; + + /* ensure we're receiving UTF8 */ + t1 = gaim_utf8_try_convert(msg); + t = t1? t1: msg; + + /* convert entities to UTF8 so they'll log correctly */ + t2 = gaim_utf8_ncr_decode(t); + t = t2? t2: t; serv_got_im(pd->gc, idb->user, t, 0, time(NULL)); - g_free(txt); + g_free(t1); + g_free(t2); } @@ -2732,16 +2649,11 @@ /* concatenate all the text parts together */ guchar *data; - char *txt; gsize len; gaim_mime_part_get_data_decoded(part, &data, &len); - - txt = im_decode(pd->gc, (const char *)data); - g_string_append(str, txt?txt:(const char *)data); - + g_string_append(str, (const char *)data); g_free(data); - g_free(txt); } } @@ -2787,8 +2699,7 @@ } } - /* actually display the message */ - serv_got_im(pd->gc, idb->user, str->str, 0, time(NULL)); + im_recv_html(conv, pd, str->str); g_string_free(str, TRUE); @@ -3256,26 +3167,26 @@ static char *user_supports_text(struct mwServiceAware *srvc, const char *who) { - char *feat[] = {NULL, NULL, NULL, NULL, NULL}; - char **f = feat; - - if(user_supports(srvc, who, mwAttribute_AV_PREFS_SET)) { - gboolean mic, speak, video; - - mic = user_supports(srvc, who, mwAttribute_MICROPHONE); - speak = user_supports(srvc, who, mwAttribute_SPEAKERS); - video = user_supports(srvc, who, mwAttribute_VIDEO_CAMERA); - - if(mic) *f++ = _("Microphone"); - if(speak) *f++ = _("Speakers"); - if(video) *f++ = _("Video Camera"); - } - - if(user_supports(srvc, who, mwAttribute_FILE_TRANSFER)) - *f++ = _("File Transfer"); - - return (*feat)? g_strjoinv(", ", feat): NULL; - /* jenni loves siege */ + char *feat[] = {NULL, NULL, NULL, NULL, NULL}; + char **f = feat; + + if(user_supports(srvc, who, mwAttribute_AV_PREFS_SET)) { + gboolean mic, speak, video; + + mic = user_supports(srvc, who, mwAttribute_MICROPHONE); + speak = user_supports(srvc, who, mwAttribute_SPEAKERS); + video = user_supports(srvc, who, mwAttribute_VIDEO_CAMERA); + + if(mic) *f++ = _("Microphone"); + if(speak) *f++ = _("Speakers"); + if(video) *f++ = _("Video Camera"); + } + + if(user_supports(srvc, who, mwAttribute_FILE_TRANSFER)) + *f++ = _("File Transfer"); + + return (*feat)? g_strjoinv(", ", feat): NULL; + /* jenni loves siege */ } @@ -3655,7 +3566,7 @@ gc->flags |= GAIM_CONNECTION_NO_IMAGES; user = g_strdup(gaim_account_get_username(account)); - pass = (char *) gaim_account_get_password(account); + pass = g_strdup(gaim_account_get_password(account)); host = strrchr(user, ':'); if(host) { @@ -3685,9 +3596,9 @@ mwSession_setProperty(pd->session, mwSession_NO_SECRET, (char *) no_secret, NULL); mwSession_setProperty(pd->session, mwSession_AUTH_USER_ID, user, g_free); - mwSession_setProperty(pd->session, mwSession_AUTH_PASSWORD, pass, NULL); - - client = MW_CLIENT_TYPE_ID; + mwSession_setProperty(pd->session, mwSession_AUTH_PASSWORD, pass, g_free); + + client = mwLogin_MEANWHILE; if(gaim_account_get_bool(account, MW_KEY_FAKE_IT, FALSE)) client = mwLogin_BINARY; @@ -3739,7 +3650,8 @@ /** generates a random-ish content id string */ static char *im_mime_content_id() { srand(time(NULL)); - return g_strdup_printf("%03x@%05xmeanwhile", rand() & 0xfff, rand() & 0xfffff); + return g_strdup_printf("%03x@%05xmeanwhile", + rand() & 0xfff, rand() & 0xfffff); } @@ -3825,12 +3737,12 @@ if(! info) return FALSE; /* NotesBuddy can be at least three different type IDs (all in the - 0x1400 range), or it can show up as 0x1002. However, if we're + 0x1400 range), or it can show up as 0x1000. However, if we're calling this check, then we're already in HTML or MIME mode, so - we can discount the real 0x1002 */ + we can discount the real 0x1000 */ /* I tried to avoid having any client-type-dependant code in here, I really did. Oh well. CURSE YOU NOTESBUDDY */ - return ((info->type == 0x1002) || ((info->type & 0xff00) == 0x1400)); + return ((info->type == 0x1000) || ((info->type & 0xff00) == 0x1400)); } @@ -3998,7 +3910,6 @@ } else if(mwConversation_supports(conv, mwImSend_HTML)) { /* send an HTML message */ - /* need to do this to get the \n to <br> conversion */ if(is_nb(conv)) { /* html messages need the notesbuddy hack */ @@ -4007,6 +3918,7 @@ g_free(msg); } else { + /* need to do this to get the \n to <br> conversion */ tmp = gaim_strdup_withhtml(message); } @@ -4015,9 +3927,9 @@ } else { /* default to text */ - tmp = gaim_unescape_html(message); + tmp = gaim_markup_strip_html(message); ret = mwConversation_send(conv, mwImSend_PLAIN, tmp); - g_free(tmp); + g_free(tmp); } return !ret; @@ -4435,7 +4347,10 @@ hash = g_hash_table_new(g_str_hash, g_str_equal); for(l = result->matches; l; l = l->next) { struct mwResolveMatch *match = l->data; - + + DEBUG_INFO("multi resolve: %s, %s\n", + NSTR(match->id), NSTR(match->name)); + if(!match->id || !match->name) continue; @@ -4445,6 +4360,7 @@ /* collect set into a list of structures */ l = NULL; g_hash_table_foreach(hash, (GHFunc) foreach_resolved_id, &l); + g_hash_table_destroy(hash); g_list_sort(l, (GCompareFunc) resolved_id_comp); /* populate choices in request field */ @@ -4561,7 +4477,7 @@ srvc = pd->srvc_resolve; /* catch external buddies. They won't be in the resolve service */ - if(gaim_str_has_prefix(buddy->name, "@E ")) { + if(buddy_is_external(buddy)) { buddy_add(pd, buddy); return; } @@ -5264,107 +5180,6 @@ }; -#if 0 -static void status_msg_action_cb(GaimConnection *gc, - GaimRequestFields *fields) { - GaimAccount *acct; - GaimRequestField *f; - const char *msg; - - struct mwGaimPluginData *pd; - struct mwServiceStorage *srvc; - struct mwStorageUnit *unit; - - pd = gc->proto_data; - srvc = pd->srvc_store; - - acct = gaim_connection_get_account(gc); - - f = gaim_request_fields_get_field(fields, "active"); - msg = gaim_request_field_string_get_value(f); - gaim_account_set_string(acct, MW_KEY_ACTIVE_MSG, msg); - unit = mwStorageUnit_newString(mwStore_ACTIVE_MESSAGES, msg); - mwServiceStorage_save(srvc, unit, NULL, NULL, NULL); - - f = gaim_request_fields_get_field(fields, "away"); - msg = gaim_request_field_string_get_value(f); - gaim_account_set_string(acct, MW_KEY_AWAY_MSG, msg); - unit = mwStorageUnit_newString(mwStore_AWAY_MESSAGES, msg); - mwServiceStorage_save(srvc, unit, NULL, NULL, NULL); - - f = gaim_request_fields_get_field(fields, "busy"); - msg = gaim_request_field_string_get_value(f); - gaim_account_set_string(acct, MW_KEY_BUSY_MSG, msg); - unit = mwStorageUnit_newString(mwStore_BUSY_MESSAGES, msg); - mwServiceStorage_save(srvc, unit, NULL, NULL, NULL); - - /* XXX */ - /* need to propagate the message change if we're in any of those - default states */ - msg = NULL; - if(!gc->away_state || !strcmp(gc->away_state, MW_STATE_ACTIVE)) { - msg = MW_STATE_ACTIVE; - } else if(gc->away_state && !strcmp(gc->away_state, MW_STATE_AWAY)) { - msg = MW_STATE_AWAY; - } else if(gc->away_state && !strcmp(gc->away_state, MW_STATE_BUSY)) { - msg = MW_STATE_BUSY; - } - if(msg) - serv_set_away(gc, msg, NULL); -} - - -/** Prompt for messages for the three default status types. These - values should be mirrored as strings in the storage service */ -static void status_msg_action(GaimPluginAction *act) { - GaimConnection *gc; - GaimAccount *acct; - - GaimRequestFields *fields; - GaimRequestFieldGroup *g; - GaimRequestField *f; - - char *msgA, *msgB; - const char *val; - - gc = act->context; - acct = gaim_connection_get_account(gc); - - fields = gaim_request_fields_new(); - - g = gaim_request_field_group_new(NULL); - gaim_request_fields_add_group(fields, g); - - val = gaim_account_get_string(acct, MW_KEY_ACTIVE_MSG, - MW_PLUGIN_DEFAULT_ACTIVE_MSG); - f = gaim_request_field_string_new("active", _("Active Message"), val, FALSE); - gaim_request_field_set_required(f, FALSE); - gaim_request_field_group_add_field(g, f); - - val = gaim_account_get_string(acct, MW_KEY_AWAY_MSG, - MW_PLUGIN_DEFAULT_AWAY_MSG); - f = gaim_request_field_string_new("away", _("Away Message"), val, FALSE); - gaim_request_field_set_required(f, FALSE); - gaim_request_field_group_add_field(g, f); - - val = gaim_account_get_string(acct, MW_KEY_BUSY_MSG, - MW_PLUGIN_DEFAULT_BUSY_MSG); - f = gaim_request_field_string_new("busy", _("Busy Message"), val, FALSE); - gaim_request_field_set_required(f, FALSE); - gaim_request_field_group_add_field(g, f); - - msgA = _("Default status messages"); - msgB = (""); - - gaim_request_fields(gc, _("Edit Status Messages"), - msgA, msgB, fields, - _("OK"), G_CALLBACK(status_msg_action_cb), - _("Cancel"), NULL, - gc); -} -#endif - - static void st_import_action_cb(GaimConnection *gc, char *filename) { struct mwSametimeList *l; @@ -5671,12 +5486,6 @@ GaimPluginAction *act; GList *l = NULL; -#if 0 - act = gaim_plugin_action_new(_("Set Status Messages..."), - status_msg_action); - l = g_list_append(l, act); -#endif - act = gaim_plugin_action_new(_("Import Sametime List..."), st_import_action); l = g_list_append(l, act);
--- a/src/protocols/sametime/sametime.h Sat Dec 17 06:23:42 2005 +0000 +++ b/src/protocols/sametime/sametime.h Sat Dec 17 15:40:06 2005 +0000 @@ -3,27 +3,6 @@ /* CFLAGS trumps configure values */ -/** default active message */ -#ifndef MW_PLUGIN_DEFAULT_ACTIVE_MSG -#define MW_PLUGIN_DEFAULT_ACTIVE_MSG "Talk to me" -#endif -/* "Talk to me" */ - - -/** default away message */ -#ifndef MW_PLUGIN_DEFAULT_AWAY_MSG -#define MW_PLUGIN_DEFAULT_AWAY_MSG "Not here right now" -#endif -/* "Not here right now" */ - - -/** default busy message */ -#ifndef MW_PLUGIN_DEFAULT_BUSY_MSG -#define MW_PLUGIN_DEFAULT_BUSY_MSG "Please do not disturb me" -#endif -/* "Please do not disturb me" */ - - /** default host for the gaim plugin. You can specialize a build to default to your server by supplying this at compile time */ #ifndef MW_PLUGIN_DEFAULT_HOST @@ -40,14 +19,6 @@ /* 1533 */ -/** client id to report to the server. See mwLoginType in meanwhile's - mw_common.h for some sample values */ -#ifndef MW_CLIENT_TYPE_ID -#define MW_CLIENT_TYPE_ID mwLogin_MEANWHILE -#endif -/* mwLogin_MEANWHILE */ - - /** default encoding for the gaim plugin.*/ #ifndef MW_PLUGIN_DEFAULT_ENCODING #define MW_PLUGIN_DEFAULT_ENCODING "ISO-8859-1"