⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jabber.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		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");				else if(jb->subscription & JABBER_SUB_PENDING)					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 + -