int ims_protocol_handler (XIMS xims, IMProtocol *call_data) { g_return_val_if_fail (xims != NULL, 1); g_return_val_if_fail (call_data != NULL, 1); switch (call_data->major_code) { case XIM_OPEN: return xim_open (xims, (IMOpenStruct *)call_data); case XIM_CLOSE: return xim_close (xims, (IMCloseStruct *)call_data); case XIM_CREATE_IC: return xim_create_ic (xims, (IMChangeICStruct *)call_data); case XIM_DESTROY_IC: return xim_destroy_ic (xims, (IMChangeICStruct *)call_data); case XIM_SET_IC_VALUES: return xim_set_ic_values (xims, (IMChangeICStruct *)call_data); case XIM_GET_IC_VALUES: return xim_get_ic_values (xims, (IMChangeICStruct *)call_data); case XIM_FORWARD_EVENT: return xim_forward_event (xims, (IMForwardEventStruct *)call_data); case XIM_SET_IC_FOCUS: return xim_set_ic_focus (xims, (IMChangeFocusStruct *)call_data); case XIM_UNSET_IC_FOCUS: return xim_unset_ic_focus (xims, (IMChangeFocusStruct *)call_data); case XIM_RESET_IC: return xim_reset_ic (xims, (IMResetICStruct *)call_data); case XIM_TRIGGER_NOTIFY: LOG (1, "XIM_TRIGGER_NOTIFY"); return 0; case XIM_PREEDIT_START_REPLY: LOG (1, "XIM_PREEDIT_START_REPLY"); return 0; case XIM_PREEDIT_CARET_REPLY: LOG (1, "XIM_PREEDIT_CARET_REPLY"); return 0; case XIM_SYNC_REPLY: LOG (1, "XIM_SYNC_REPLY"); return 0; default: LOG (1, "Unknown (%d)", call_data->major_code); return 0; } }
void Connection::OnRecv() { std::list<RxPacket *>::iterator i; while (!mRxQ.empty()) { i = mRxQ.begin(); int major = (*i)->getMajor(); if (g_option_mask & OPT_TRACE_XIM) printf("<-: %s.\n", xim_packet_name[major]); // Need to sort the handling sequence using protocol number // once implementing all the protocol. RxPacket *p; p = *i; switch (major) { case XIM_CONNECT: xim_connect(p); break; case XIM_OPEN: xim_open(p); break; case XIM_QUERY_EXTENSION: xim_query_extension(p); break; case XIM_ENCODING_NEGOTIATION: xim_encoding_negotiation(p); break; case XIM_CLOSE: xim_close(p); break; case XIM_DISCONNECT: xim_disconnect(); break; case XIM_GET_IM_VALUES: xim_get_im_values(p); break; case XIM_SET_IC_VALUES: xim_set_ic_values(p); break; case XIM_GET_IC_VALUES: xim_get_ic_values(p); break; case XIM_CREATE_IC: xim_create_ic(p); break; case XIM_DESTROY_IC: xim_destroy_ic(p); break; case XIM_SET_IC_FOCUS: xim_set_ic_focus(p); break; case XIM_UNSET_IC_FOCUS: xim_unset_ic_focus(p); break; case XIM_TRIGGER_NOTIFY: // xim_trigger_notify(*i); We don't use trigger! break; case XIM_FORWARD_EVENT: xim_forward_event(p); break; case XIM_SYNC_REPLY: xim_sync_reply(); break; case XIM_RESET_IC: xim_reset_ic(p); break; case XIM_PREEDIT_START_REPLY: xim_preedit_start_reply(); break; case XIM_PREEDIT_CARET_REPLY: xim_preedit_caret_reply(); break; case XIM_ERROR: xim_error(p); break; default: printf("Unknown (or not implemented) packet from xim connection.\n"); (*i)->dump(); break; } mRxQ.pop_front(); delete p; } }