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

📄 novell.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
{	NMUser *user;	NMConference *conference;	NMERR_T rc = NM_OK;	if (parms == NULL || g_slist_length(parms) != 2)		return;	user = g_slist_nth_data(parms, 0);	conference = g_slist_nth_data(parms, 1);	if (user && conference) {		rc = nm_send_reject_conference(user, conference, NULL, NULL);		_check_for_disconnect(user, rc);	}	g_slist_free(parms);}static void_initiate_conference_cb(PurpleBlistNode *node, gpointer ignored){	PurpleBuddy *buddy;	PurpleConnection *gc;	NMUser *user;	const char *conf_name;	PurpleConversation *chat = NULL;	NMUserRecord *user_record;	NMConference *conference;	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));	buddy = (PurpleBuddy *) node;	gc = purple_account_get_connection(buddy->account);	user = gc->proto_data;	if (user == NULL)		return;	/* We should already have a userrecord for the buddy */	user_record = nm_find_user_record(user, buddy->name);	if (user_record == NULL)		return;	conf_name = _get_conference_name(++user->conference_count);	chat = serv_got_joined_chat(gc, user->conference_count, conf_name);	if (chat) {		conference = nm_create_conference(NULL);		nm_conference_set_data(conference, (gpointer) chat);		nm_send_create_conference(user, conference, _createconf_resp_send_invite, user_record);		nm_release_conference(conference);	}}const char *_get_conference_name(int id){	static char *name = NULL;	if (name)		g_free(name);	name = g_strdup_printf(_("GroupWise Conference %d"), id);	return name;}static void_show_privacy_locked_error(PurpleConnection *gc, NMUser *user){	char *err;	err = g_strdup_printf(_("Unable to change server side privacy settings (%s)."),						  nm_error_to_string(NMERR_ADMIN_LOCKED));	purple_notify_error(gc, NULL, err, NULL);	g_free(err);}/******************************************************************************* * Connect and recv callbacks ******************************************************************************/static voidnovell_ssl_connect_error(PurpleSslConnection * gsc,						 PurpleSslErrorType error, gpointer data){	PurpleConnection *gc;	NMUser *user;	gc = data;	user = gc->proto_data;	user->conn->ssl_conn->data = NULL;	purple_connection_error(gc, _("Unable to make SSL connection to server."));}static voidnovell_ssl_recv_cb(gpointer data, PurpleSslConnection * gsc,				   PurpleInputCondition condition){	PurpleConnection *gc = data;	NMUser *user;	NMERR_T rc;	if (gc == NULL)		return;	user = gc->proto_data;	if (user == NULL)		return;	rc = nm_process_new_data(user);	if (rc != NM_OK) {		if (_is_disconnect_error(rc)) {			purple_connection_error(gc,								  _("Error communicating with server."									" Closing connection."));		} else {			purple_debug(PURPLE_DEBUG_INFO, "novell",					   "Error processing event or response (%d).\n", rc);		}	}}static voidnovell_ssl_connected_cb(gpointer data, PurpleSslConnection * gsc,						PurpleInputCondition cond){	PurpleConnection *gc = data;	NMUser *user;	NMConn *conn;	NMERR_T rc = 0;	const char *pwd = NULL;	const char *my_addr = NULL;	char *ua = NULL;	if (gc == NULL || gsc == NULL)		return;	user = gc->proto_data;	if ((user == NULL) || (conn = user->conn) == NULL)		return;	purple_connection_update_progress(gc, _("Authenticating..."),									2, NOVELL_CONNECT_STEPS);	my_addr = purple_network_get_my_ip(gsc->fd);	pwd = purple_connection_get_password(gc);	ua = _user_agent_string();	rc = nm_send_login(user, pwd, my_addr, ua, _login_resp_cb, NULL);	if (rc == NM_OK) {		conn->connected = TRUE;		purple_ssl_input_add(gsc, novell_ssl_recv_cb, gc);	} else {		purple_connection_error(gc, _("Unable to connect to server."));	}	purple_connection_update_progress(gc, _("Waiting for response..."),									3, NOVELL_CONNECT_STEPS);	g_free(ua);}/******************************************************************************* * Event callback and event handlers ******************************************************************************/static void_evt_receive_message(NMUser * user, NMEvent * event){	NMUserRecord *user_record = NULL;	NMContact *contact = NULL;	PurpleConversation *gconv;	NMConference *conference;	PurpleMessageFlags flags;	char *text = NULL;	text = g_markup_escape_text(nm_event_get_text(event), -1);	conference = nm_event_get_conference(event);	if (conference) {		PurpleConversation *chat = nm_conference_get_data(conference);		/* Is this a single person 'conversation' or a conference? */		if (chat == NULL && nm_conference_get_participant_count(conference) == 1) {			user_record = nm_find_user_record(user, nm_event_get_source(event));			if (user_record) {				flags = 0;				if (nm_event_get_type(event) == NMEVT_RECEIVE_AUTOREPLY)					flags |= PURPLE_MESSAGE_AUTO_RESP;				serv_got_im(purple_account_get_connection(user->client_data),							nm_user_record_get_display_id(user_record),							text, flags,							nm_event_get_gmt(event));				gconv =	purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,					nm_user_record_get_display_id(user_record),					(PurpleAccount *) user->client_data);				if (gconv) {					contact = nm_find_contact(user, nm_event_get_source(event));					if (contact) {						purple_conversation_set_title(							gconv, nm_contact_get_display_name(contact));					} else {						const char *name =							nm_user_record_get_full_name(user_record);						if (name == NULL)							name = nm_user_record_get_userid(user_record);						purple_conversation_set_title(gconv, name);					}				}			} else {				/* this should not happen, see the event code.				 * the event code will get the contact details from				 * the server if it does not have them before calling				 * the event callback.				 */			}		} else if (chat) {			/* get the contact for send if we have one */			NMContact *contact = nm_find_contact(user,												 nm_event_get_source(event));			/* get the user record for the sender */			user_record = nm_find_user_record(user, nm_event_get_source(event));			if (user_record) {				const char *name = nm_contact_get_display_name(contact);				if (name == NULL) {					name = nm_user_record_get_full_name(user_record);					if (name == NULL)						name = nm_user_record_get_display_id(user_record);				}				serv_got_chat_in(purple_account_get_connection(user->client_data),								 purple_conv_chat_get_id(PURPLE_CONV_CHAT(chat)),								 name, 0, text, nm_event_get_gmt(event));			}		}	}	g_free(text);}static void_evt_conference_left(NMUser * user, NMEvent * event){	PurpleConversation *chat;	NMConference *conference;	conference = nm_event_get_conference(event);	if (conference) {		chat = nm_conference_get_data(conference);		if (chat) {			NMUserRecord *ur = nm_find_user_record(user,												   nm_event_get_source(event));			if (ur)				purple_conv_chat_remove_user(PURPLE_CONV_CHAT(chat),										   nm_user_record_get_display_id(ur),										   NULL);		}	}}static void_evt_conference_invite_notify(NMUser * user, NMEvent * event){	PurpleConversation *gconv;	NMConference *conference;	NMUserRecord *user_record = NULL;	char *str = NULL;	user_record = nm_find_user_record(user, nm_event_get_source(event));	conference = nm_event_get_conference(event);	if (user_record && conference) {		gconv = nm_conference_get_data(conference);		str = g_strdup_printf(_("%s has been invited to this conversation."),							  nm_user_record_get_display_id(user_record));		purple_conversation_write(gconv, NULL, str,								PURPLE_MESSAGE_SYSTEM, time(NULL));		g_free(str);	}}static void_evt_conference_invite(NMUser * user, NMEvent * event){	NMUserRecord *ur;	PurpleConnection *gc;	GSList *parms = NULL;	const char *title = NULL;	const char *secondary = NULL;	const char *name = NULL;	char *primary = NULL;	time_t gmt;	ur = nm_find_user_record(user, nm_event_get_source(event));	if (ur)		name = nm_user_record_get_full_name(ur);	if (name == NULL)		name = nm_event_get_source(event);	gmt = nm_event_get_gmt(event);	title = _("Invitation to Conversation");	primary = g_strdup_printf(_("Invitation from: %s\n\nSent: %s"),							  name, purple_date_format_full(localtime(&gmt)));	secondary = _("Would you like to join the conversation?");	/* Set up parms list for the callbacks	 * We need to send the NMUser object and	 * the NMConference object to the callbacks	 */	parms = NULL;	parms = g_slist_append(parms, user);	parms = g_slist_append(parms, nm_event_get_conference(event));	/* Prompt the user */	gc = purple_account_get_connection(user->client_data);	purple_request_action(gc, title, primary, secondary,						PURPLE_DEFAULT_ACTION_NONE,						purple_connection_get_account(gc), name, NULL,						parms, 2,						_("Yes"), G_CALLBACK(_join_conference_cb),						_("No"), G_CALLBACK(_reject_conference_cb));	g_free(primary);}static void_evt_conference_joined(NMUser * user, NMEvent * event){	PurpleConversation *chat = NULL;	PurpleConnection *gc;	NMConference *conference = NULL;	NMUserRecord *ur = NULL;	const char *name;	const char *conf_name;	gc = purple_account_get_connection(user->client_data);	if (gc == NULL)		return;	conference = nm_event_get_conference(event);	if (conference) {		chat = nm_conference_get_data(conference);		if (nm_conference_get_participant_count(conference) == 2 && chat == NULL) {			ur = nm_conference_get_participant(conference, 0);			if (ur) {				conf_name = _get_conference_name(++user->conference_count);				chat =					serv_got_joined_chat(gc, user->conference_count, conf_name);				if (chat) {					nm_conference_set_data(conference, (gpointer) chat);					name = nm_user_record_get_display_id(ur);					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL, 											PURPLE_CBFLAGS_NONE, TRUE);				}			}		}		if (chat != NULL) {			ur = nm_find_user_record(user, nm_event_get_source(event));			if (ur) {				name = nm_user_record_get_display_id(ur);				if (!purple_conv_chat_find_user(PURPLE_CONV_CHAT(chat), name)) {					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL, 											PURPLE_CBFLAGS_NONE, TRUE);				}			}		}	}}static void_evt_status_change(NMUser * user, NMEvent * event){	PurpleBuddy *buddy = NULL;	GSList *buddies;	GSList *bnode;	NMUserRecord *user_record;	const char *display_id;	int status;	user_record = nm_event_get_user_record(event);	if (user_record) {		/* Retrieve new status */		status = nm_user_record_get_status(user_record);		/* Update status for buddy in all folders */		display_id = nm_user_record_get_display_id(user_record);		buddies = purple_find_buddies(user->client_data, display_id);		for (bnode = buddies; bnode; bnode = bnode->next) {			buddy = (PurpleBuddy *) bnode->data;			if (buddy) {				_update_buddy_status(user, buddy, status, nm_event_get_gmt(event));			}		}		g_slist_free(buddies);	}}static void_evt_user_disconnect(NMUser * user, NMEvent * event){	PurpleConnection *gc;	gc = purple_account_get_connection((PurpleAccount *) user->client_data);	if (gc)	{		gc->wants_to_die = TRUE; /* we don't want to reconnect in this case */		purple_connection_error(gc, _("You have been logged out because you"									" logged in at another workstation."));	}}static void_evt_user_typing(NMUser * user, NMEvent * event){	PurpleConnection *gc;	NMUserRecord *user_record = NULL;	gc = purple_account_get_connection((PurpleAccount *) user->client_data);	if (gc) {		user_record = nm_find_user_record(user, nm_event_get_source(event));		if (user_record) {			serv_got_typing(gc, nm_user_record_get_display_id(user_record),							30, PURPLE_TYPING);		}	}}static void_evt_user_not_typing(NMUser * user, NMEvent * event){	PurpleConnection *gc;	NMUserRecord *user_record;	gc = purple_account_get_connection((PurpleAccount *) user->client_data);	if (gc) {		user_record = nm_find_user_record(user, nm_event_get_source(event));		if (user_record) {			serv_got_typing_stopped(gc,									nm_user_record_get_display_id(user_record));		}	}}static void_evt_undeliverable_status(NMUser * user, NMEvent * event){	NMUserRecord *ur;	PurpleConversation *gconv;	char *str;	ur = nm_find_user_record(user, nm_event_get_source(event));	if (ur) {		/* XXX - Should this be PURPLE_CONV_TYPE_IM? */		gconv =			purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY,												nm_user_record_get_display_id(ur),												user->client_data);		if (gconv) {			const char *name = nm_user_record_get_full_name(ur);			if (name == NULL) {				name = nm_user_record_get_display_id(ur);			}			str = g_strdup_printf(_("%s appears to be offline and did not receive"									" the message that you just sent."), name);			purple_conversation_write(gconv, NULL, str,									PURPLE_MESSAGE_SYSTEM, time(NULL));			g_free(str);		}	}}static void_event_callback(NMUser * user, NMEvent * event){	if (user == NULL || event == NULL)		return;	switch (nm_event_get_type(event)) {		case NMEVT_STATUS_CHANGE:			_evt_status_change(user, event);			break;		case NMEVT_RECEIVE_AUTOREPLY:		case NMEVT_RECEIVE_MESSAGE:			_evt_receive_message(user, event);			break;		case NMEVT_USER_DISCONNECT:			_evt_user_disconnect(user, event);			break;		case NMEVT_USER_TYPING:			_evt_user_typing(user, event);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -