?? jabber.c
字號:
if(purple_ssl_is_supported()) { js->gsc = purple_ssl_connect(account, server, purple_account_get_int(account, "port", 5222), jabber_login_callback_ssl, jabber_ssl_connect_failure, gc); } else { purple_connection_error(gc, _("SSL support unavailable")); } } if(!js->gsc) { if (connect_server[0]) { jabber_login_connect(js, js->user->domain, server, purple_account_get_int(account, "port", 5222)); } else { js->srv_query_data = purple_srv_resolve("xmpp-client", "tcp", js->user->domain, srv_resolved_cb, js); } }}void jabber_close(PurpleConnection *gc){ JabberStream *js = gc->proto_data; /* Don't perform any actions on the ssl connection * if we were forcibly disconnected because it will crash * on some SSL backends. */ if (!gc->disconnect_timeout) jabber_send_raw(js, "</stream:stream>", -1); if (js->srv_query_data) purple_srv_cancel(js->srv_query_data); if(js->gsc) {#ifdef HAVE_OPENSSL if (!gc->disconnect_timeout)#endif purple_ssl_close(js->gsc); } else if (js->fd > 0) { if(js->gc->inpa) purple_input_remove(js->gc->inpa); close(js->fd); } jabber_buddy_remove_all_pending_buddy_info_requests(js); if(js->iq_callbacks) g_hash_table_destroy(js->iq_callbacks); if(js->disco_callbacks) g_hash_table_destroy(js->disco_callbacks); if(js->buddies) g_hash_table_destroy(js->buddies); if(js->chats) g_hash_table_destroy(js->chats); while(js->chat_servers) { g_free(js->chat_servers->data); js->chat_servers = g_list_delete_link(js->chat_servers, js->chat_servers); } while(js->user_directories) { g_free(js->user_directories->data); js->user_directories = g_list_delete_link(js->user_directories, js->user_directories); } if(js->stream_id) g_free(js->stream_id); if(js->user) jabber_id_free(js->user); if(js->avatar_hash) g_free(js->avatar_hash); purple_circ_buffer_destroy(js->write_buffer); if(js->writeh) purple_input_remove(js->writeh);#ifdef HAVE_CYRUS_SASL if(js->sasl) sasl_dispose(&js->sasl); if(js->sasl_mechs) g_string_free(js->sasl_mechs, TRUE); if(js->sasl_cb) g_free(js->sasl_cb); if(js->serverFQDN) g_free(js->serverFQDN);#endif g_free(js->server_name); g_free(js->gmail_last_time); g_free(js->gmail_last_tid); g_free(js); gc->proto_data = NULL;}void jabber_stream_set_state(JabberStream *js, JabberStreamState state){ PurpleStoredImage *img; js->state = state; switch(state) { case JABBER_STREAM_OFFLINE: break; case JABBER_STREAM_CONNECTING: purple_connection_update_progress(js->gc, _("Connecting"), 1, JABBER_CONNECT_STEPS); break; case JABBER_STREAM_INITIALIZING: purple_connection_update_progress(js->gc, _("Initializing Stream"), js->gsc ? 5 : 2, JABBER_CONNECT_STEPS); jabber_stream_init(js); break; case JABBER_STREAM_AUTHENTICATING: purple_connection_update_progress(js->gc, _("Authenticating"), js->gsc ? 6 : 3, JABBER_CONNECT_STEPS); if(js->protocol_version == JABBER_PROTO_0_9 && js->registration) { jabber_register_start(js); } else if(js->auth_type == JABBER_AUTH_IQ_AUTH) { jabber_auth_start_old(js); } break; case JABBER_STREAM_REINITIALIZING: purple_connection_update_progress(js->gc, _("Re-initializing Stream"), (js->gsc ? 7 : 4), JABBER_CONNECT_STEPS); /* The stream will be reinitialized later, in jabber_recv_cb_ssl() */ js->reinit = TRUE; break; case JABBER_STREAM_CONNECTED: /* lets make sure our buddy icon is up to date * before we go letting people know we're here */ img = purple_buddy_icons_find_account_icon(js->gc->account); if(NULL != img) { jabber_set_buddy_icon(js->gc, img); purple_imgstore_unref(img); } /* now we can alert the core that we're ready to send status */ purple_connection_set_state(js->gc, PURPLE_CONNECTED); jabber_disco_items_server(js); break; }}char *jabber_get_next_id(JabberStream *js){ return g_strdup_printf("purple%x", js->next_id++);}void jabber_idle_set(PurpleConnection *gc, int idle){ JabberStream *js = gc->proto_data; js->idle = idle ? time(NULL) - idle : idle;}const char *jabber_list_icon(PurpleAccount *a, PurpleBuddy *b){ return "jabber";}const char* jabber_list_emblem(PurpleBuddy *b){ JabberStream *js; JabberBuddy *jb = NULL; if(!b->account->gc) return NULL; js = b->account->gc->proto_data; if(js) jb = jabber_buddy_find(js, b->name, FALSE); if(!PURPLE_BUDDY_IS_ONLINE(b)) { if(jb && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) return "not-authorized"; } return NULL;}char *jabber_status_text(PurpleBuddy *b){ JabberBuddy *jb = jabber_buddy_find(b->account->gc->proto_data, b->name, FALSE); char *ret = NULL; if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) { ret = g_strdup(_("Not Authorized")); } else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) { ret = g_strdup(jb->error_msg); } else { char *stripped; if(!(stripped = purple_markup_strip_html(jabber_buddy_get_status_msg(jb)))) { PurpleStatus *status = purple_presence_get_active_status(purple_buddy_get_presence(b)); if(!purple_status_is_available(status)) stripped = g_strdup(purple_status_get_name(status)); } if(stripped) { ret = g_markup_escape_text(stripped, -1); g_free(stripped); } } return ret;}void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full){ JabberBuddy *jb; g_return_if_fail(b != NULL); g_return_if_fail(b->account != NULL); g_return_if_fail(b->account->gc != NULL); g_return_if_fail(b->account->gc->proto_data != NULL); jb = jabber_buddy_find(b->account->gc->proto_data, b->name, FALSE); if(jb) { JabberBuddyResource *jbr = NULL; const char *sub; GList *l; if (full) { if(jb->subscription & JABBER_SUB_FROM) { if(jb->subscription & JABBER_SUB_TO) sub = _("Both"); sub = _("From (To pending)"); else sub = _("From"); } else { if(jb->subscription & JABBER_SUB_TO) sub = _("To"); else if(jb->subscription & JABBER_SUB_PENDING) sub = _("None (To pending)"); else sub = _("None"); } purple_notify_user_info_add_pair(user_info, _("Subscription"), sub); } for(l=jb->resources; l; l = l->next) { char *text = NULL; char *res = NULL; char *label, *value; const char *state; jbr = l->data; if(jbr->status) { char *tmp; text = purple_strreplace(jbr->status, "\n", "<br />\n"); tmp = purple_markup_strip_html(text); g_free(text); text = g_markup_escape_text(tmp, -1); g_free(tmp); } if(jbr->name) res = g_strdup_printf(" (%s)", jbr->name); state = jabber_buddy_state_get_name(jbr->state); if (text != NULL && !purple_utf8_strcasecmp(state, text)) { g_free(text); text = NULL; } label = g_strdup_printf("%s%s", _("Status"), (res ? res : "")); value = g_strdup_printf("%s%s%s", state, (text ? ": " : ""), (text ? text : "")); purple_notify_user_info_add_pair(user_info, label, value); g_free(label); g_free(value); g_free(text); g_free(res); } if(!PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) { purple_notify_user_info_add_pair(user_info, _("Error"), jb->error_msg); } }}GList *jabber_status_types(PurpleAccount *account){ PurpleStatusType *type; GList *types = NULL; PurpleValue *priority_value; priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 1); type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE), NULL, TRUE, TRUE, FALSE, "priority", _("Priority"), priority_value, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, type); priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 1); type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT), _("Chatty"), TRUE, TRUE, FALSE, "priority", _("Priority"), priority_value, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, type); priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 0); type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY), NULL, TRUE, TRUE, FALSE, "priority", _("Priority"), priority_value, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, type); priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 0); type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA), NULL, TRUE, TRUE, FALSE, "priority", _("Priority"), priority_value, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, type); priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 0); type = purple_status_type_new_with_attrs(PURPLE_STATUS_UNAVAILABLE, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_DND), _("Do Not Disturb"), TRUE, TRUE, FALSE, "priority", _("Priority"), priority_value, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, type); /* if(js->protocol_version == JABBER_PROTO_0_9) m = g_list_append(m, _("Invisible")); */ type = purple_status_type_new_with_attrs(PURPLE_STATUS_OFFLINE, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_UNAVAILABLE), NULL, FALSE, TRUE, FALSE, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, type); return types;}static voidjabber_password_change_result_cb(JabberStream *js, xmlnode *packet, gpointer data){ const char *type; type = xmlnode_get_attrib(packet, "type"); if(type && !strcmp(type, "result")) { purple_notify_info(js->gc, _("Password Changed"), _("Password Changed"), _("Your password has been changed.")); } else { char *msg = jabber_parse_error(js, packet); purple_notify_error(js->gc, _("Error changing password"), _("Error changing password"), msg); g_free(msg); }}static void jabber_password_change_cb(JabberStream *js, PurpleRequestFields *fields){ const char *p1, *p2; JabberIq *iq; xmlnode *query, *y; p1 = purple_request_fields_get_string(fields, "password1"); p2 = purple_request_fields_get_string(fields, "password2"); if(strcmp(p1, p2)) { purple_notify_error(js->gc, NULL, _("New passwords do not match."), NULL); return; } iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:register"); xmlnode_set_attrib(iq->node, "to", js->user->domain); query = xmlnode_get_child(iq->node, "query"); y = xmlnode_new_child(query, "username"); xmlnode_insert_data(y, js->user->node, -1); y = xmlnode_new_child(query, "password"); xmlnode_insert_data(y, p1, -1); jabber_iq_set_callback(iq, jabber_password_change_result_cb, NULL); jabber_iq_send(iq); purple_account_set_password(js->gc->account, p1);}static void jabber_password_change(PurplePluginAction *action){ PurpleConnection *gc = (PurpleConnection *) action->context; JabberStream *js = gc->proto_data; PurpleRequestFields *fields; PurpleRequestFieldGroup *group; PurpleRequestField *field; fields = purple_request_fields_new(); group = purple_request_field_group_new(NULL); purple_request_fields_add_group(fields, group); field = purple_request_field_string_new("password1", _("Password"), "", FALSE); purple_request_field_string_set_masked(field, TRUE); purple_request_field_group_add_field(group, field); field = purple_request_field_string_new("password2", _("Password (again)"), "", FALSE); purple_request_field_string_set_masked(field, TRUE); purple_request_field_group_add_field(group, field); purple_request_fields(js->gc, _("Change XMPP Password"), _("Change XMPP Password"), _("Please enter your new password"), fields, _("OK"), G_CALLBACK(jabber_password_change_cb), _("Cancel"), NULL, purple_connection_get_account(gc), NULL, NULL, js);}GList *jabber_actions(PurplePlugin *plugin, gpointer context){ GList *m = NULL; PurplePluginAction *act; act = purple_plugin_action_new(_("Set User Info..."), jabber_setup_set_info); m = g_list_append(m, act); /* if (js->protocol_options & CHANGE_PASSWORD) { */ act = purple_plugin_action_new(_("Change Password..."), jabber_password_change); m = g_list_append(m, act); /* } */ act = purple_plugin_action_new(_("Search for Users..."), jabber_user_search_begin); m = g_list_append(m, act); return m;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -