📄 nmevent.c
字号:
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 + -