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

📄 nmevent.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		g_free(guid);	return rc;}/* Read the conference closed, set up the event object, and * remove the conference from the list */static NMERR_Thandle_conference_closed(NMUser * user, NMEvent * event){	NMERR_T rc = NM_OK;	guint32 size = 0;	char *guid = NULL;	NMConference *conference;	NMConn *conn;	conn = nm_user_get_conn(user);	/* Read the conference guid */	rc = nm_read_uint32(conn, &size);	if (size == MAX_UINT32)	return NMERR_PROTOCOL;	if (rc == NM_OK) {		guid = g_new0(char, size + 1);		rc = nm_read_all(conn, guid, size);	}	if (rc == NM_OK) {		conference = nm_conference_list_find(user, guid);		if (conference) {			nm_event_set_conference(event, conference);			nm_conference_list_remove(user, conference);		} else {			rc = NMERR_CONFERENCE_NOT_FOUND;		}	}	if (guid)		g_free(guid);	return rc;}/* Read the conference joined event, set up the event object, and * get details for the event source if we don't have them yet. */static NMERR_Thandle_conference_joined(NMUser * user, NMEvent * event){	NMERR_T rc = NM_OK;	guint32 size = 0, flags = 0;	char *guid = NULL;	NMConn *conn;	NMConference *conference;	NMUserRecord *user_record;	conn = nm_user_get_conn(user);	/* Read the conference guid */	rc = nm_read_uint32(conn, &size);	if (size == MAX_UINT32)	return NMERR_PROTOCOL;	if (rc == NM_OK) {		guid = g_new0(char, size + 1);		rc = nm_read_all(conn, guid, size);	}	/* Read the conference flags */	if (rc == NM_OK) {		rc = nm_read_uint32(conn, &flags);	}	if (rc == NM_OK) {		conference = nm_conference_list_find(user, guid);		if (conference) {			nm_conference_set_flags(conference, flags);			nm_event_set_conference(event, conference);			/* Add the new user to the participants list */			user_record = nm_find_user_record(user, nm_event_get_source(event));			if (user_record) {				nm_conference_remove_participant(conference,												 nm_user_record_get_dn(user_record));				nm_conference_add_participant(conference, user_record);			} else {				/* Need to go to the server to get details for the user */				rc = nm_send_get_details(user, nm_event_get_source(event),										 _got_user_for_conference, event);				if (rc == NM_OK)					rc = -1;		/* Not done processing the event yet! */			}		} else {			rc = NMERR_CONFERENCE_NOT_FOUND;		}	}	if (guid)		g_free(guid);	return rc;}/* Read the typing event and set up the event object */static NMERR_Thandle_typing(NMUser * user, NMEvent * event){	NMERR_T rc = NM_OK;	guint32 size = 0;	char *guid = NULL;	NMConference *conference;	NMConn *conn;	conn = nm_user_get_conn(user);	/* Read the conference guid */	rc = nm_read_uint32(conn, &size);	if (size == MAX_UINT32)	return NMERR_PROTOCOL;	if (rc == NM_OK) {		guid = g_new0(char, size + 1);		rc = nm_read_all(conn, guid, size);	}	if (rc == NM_OK) {		conference = nm_conference_list_find(user, guid);		if (conference) {			nm_event_set_conference(event, conference);		} else {			rc = NMERR_CONFERENCE_NOT_FOUND;		}	}	if (guid)		g_free(guid);	return rc;}/* Read the event, set up the event object, and update * the status in the user record (for the event source) */static NMERR_Thandle_status_change(NMUser * user, NMEvent * event){	NMERR_T rc = NM_OK;	guint16 status;	guint32 size;	char *text = NULL;	NMUserRecord *user_record;	NMConn *conn;	conn = nm_user_get_conn(user);	/* Read new status */	rc = nm_read_uint16(conn, &status);	if (rc == NM_OK) {		/* Read the status text */		rc = nm_read_uint32(conn, &size);		if (size == MAX_UINT32)	return NMERR_PROTOCOL;		if (rc == NM_OK) {			text = g_new0(char, size + 1);			rc = nm_read_all(conn, text, size);		}	}	if (rc == NM_OK) {		nm_event_set_text(event, text);		/* Get a reference to the user record and store the new status */		user_record = nm_find_user_record(user, nm_event_get_source(event));		if (user_record) {			nm_event_set_user_record(event, user_record);			nm_user_record_set_status(user_record, status, text);		}	}	if (text)		g_free(text);	return rc;}/* Read the undeliverable event */static NMERR_Thandle_undeliverable_status(NMUser * user, NMEvent * event){	NMERR_T rc = NM_OK;	guint32 size = 0;	char *guid = NULL;	NMConn *conn;	conn = nm_user_get_conn(user);	/* Read the conference guid */	rc = nm_read_uint32(conn, &size);	if (size == MAX_UINT32)	return NMERR_PROTOCOL;	if (rc == NM_OK) {		guid = g_new0(char, size + 1);		rc = nm_read_all(conn, guid, size);	}	if (guid)		g_free(guid);	return rc;}/******************************************************************************* * Event API -- see header file for comments ******************************************************************************/NMEvent *nm_create_event(int type, const char *source, guint32 gmt){	NMEvent *event = g_new0(NMEvent, 1);	event->type = type;	event->gmt = gmt;	if (source)		event->source = g_strdup(source);	event->ref_count = 1;	return event;}voidnm_release_event(NMEvent * event){	if (event == NULL) {		return;	}	if (--(event->ref_count) == 0) {		if (event->source)			g_free(event->source);		if (event->conference)			nm_release_conference(event->conference);		if (event->user_record)			nm_release_user_record(event->user_record);		if (event->text)			g_free(event->text);		g_free(event);	}}NMConference *nm_event_get_conference(NMEvent * event){	if (event)		return event->conference;	else		return NULL;}voidnm_event_set_conference(NMEvent * event, NMConference * conference){	if (event && conference) {		nm_conference_add_ref(conference);		event->conference = conference;	}}NMUserRecord *nm_event_get_user_record(NMEvent * event){	if (event)		return event->user_record;	else		return NULL;}voidnm_event_set_user_record(NMEvent * event, NMUserRecord * user_record){	if (event && user_record) {		nm_user_record_add_ref(user_record);		event->user_record = user_record;	}}const char *nm_event_get_text(NMEvent * event){	if (event)		return event->text;	else		return NULL;}voidnm_event_set_text(NMEvent * event, const char *text){	if (event) {		if (text)			event->text = g_strdup(text);		else			event->text = NULL;	}}const char *nm_event_get_source(NMEvent * event){	if (event)		return event->source;	else		return NULL;}intnm_event_get_type(NMEvent * event){	if (event)		return event->type;	else		return -1;}time_tnm_event_get_gmt(NMEvent * event){	if (event)		return event->gmt;	else		return (time_t)-1;}NMERR_Tnm_process_event(NMUser * user, int type){	NMERR_T rc = NM_OK;	guint32 size = 0;	NMEvent *event = NULL;	char *source = NULL;	nm_event_cb cb;	NMConn *conn;	if (user == NULL)		return NMERR_BAD_PARM;	if (type < NMEVT_START || type > NMEVT_STOP)		return NMERR_PROTOCOL;	conn = nm_user_get_conn(user);	/* Read the event source */	rc = nm_read_uint32(conn, &size);	if (rc == NM_OK) {		if (size > 0) {			source = g_new0(char, size);			rc = nm_read_all(conn, source, size);		}	}	/* Read the event data */	if (rc == NM_OK) {		event = nm_create_event(type, source, time(0));		if (event) {			switch (type) {			case NMEVT_STATUS_CHANGE:				rc = handle_status_change(user, event);				break;			case NMEVT_RECEIVE_MESSAGE:				rc = handle_receive_message(user, event, FALSE);				break;			case NMEVT_RECEIVE_AUTOREPLY:				rc = handle_receive_message(user, event, TRUE);				break;			case NMEVT_USER_TYPING:			case NMEVT_USER_NOT_TYPING:				rc = handle_typing(user, event);				break;			case NMEVT_CONFERENCE_LEFT:				rc = handle_conference_left(user, event);				break;			case NMEVT_CONFERENCE_CLOSED:				rc = handle_conference_closed(user, event);				break;			case NMEVT_CONFERENCE_JOINED:				rc = handle_conference_joined(user, event);				break;			case NMEVT_CONFERENCE_INVITE:				rc = handle_conference_invite(user, event);				break;			case NMEVT_CONFERENCE_REJECT:				rc = handle_conference_reject(user, event);				break;			case NMEVT_CONFERENCE_INVITE_NOTIFY:				rc = handle_conference_invite_notify(user, event);				break;			case NMEVT_UNDELIVERABLE_STATUS:				rc = handle_undeliverable_status(user, event);				break;			case NMEVT_INVALID_RECIPIENT:				/* Nothing else to read, just callback */				break;			case NMEVT_USER_DISCONNECT:				/* Nothing else to read, just callback */				break;			case NMEVT_SERVER_DISCONNECT:				/* Nothing else to read, just callback */				break;			case NMEVT_RECEIVE_FILE:			case NMEVT_CONTACT_ADD:				/* Safely ignored for now */				break;			default:				purple_debug(PURPLE_DEBUG_INFO, "novell",						   "Unknown event %d received.\n", type);				rc = NMERR_PROTOCOL;				break;			}		}	}	if (rc == (NMERR_T)-1) {		/* -1 means that we are not ready to callback yet. */		rc = NM_OK;	} else if (rc == NM_OK && (cb = nm_user_get_event_callback(user))) {		cb(user, event);		if (event)			nm_release_event(event);	} else {		if (event)			nm_release_event(event);	}	/* Cleanup */	if (source)		g_free(source);	return rc;}

⌨️ 快捷键说明

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