static void __input_teen(BYTE header, WORD desc_num, char *body) { switch (header) { case HEADER_TG_FORCE_LOGOUT: { char *data = body; char login[LOGIN_MAX_LEN+1] = {0}; memcpy(login, data, LOGIN_MAX_LEN); data += LOGIN_MAX_LEN; LPDESC d = DESC_MANAGER::instance().FindByLoginName(login); if (NULL==d) return; d->SetPhase(PHASE_CLOSE); } break; case HEADER_TG_TEEN_NOTICE: { char *data = body; char login[LOGIN_MAX_LEN+1] = {0}; memcpy(login, data, LOGIN_MAX_LEN); data += LOGIN_MAX_LEN; int hour = decode_4bytes(data); data += 4; __proc_teen_notice(login, hour); } break; case HEADER_TG_LOGIN_NOTICE: { char *data = body; char login[LOGIN_MAX_LEN+1] = {0}; memcpy(login, data, LOGIN_MAX_LEN); data += LOGIN_MAX_LEN; int on_time = decode_4bytes(data); data += 4; int off_time = decode_4bytes(data); data += 4; __proc_login_notice(login, on_time, off_time); } break; } }
bool CInputTeen::ProcessHandshake(LPDESC lpDesc, const void * c_pvOrig, size_t uiBytes, int & r_iBytesProceed) { const char *c_pData = (const char*) c_pvOrig; size_t packet_len = sizeof(DWORD); if (uiBytes < packet_len) return false; DWORD handshake = decode_4bytes(c_pData); c_pData += packet_len; m_iBufferLeft -= packet_len; r_iBytesProceed += packet_len; this->SetStep(1); char buf[256]; *((DWORD *) buf) = handshake ^ HANDSHAKE_XOR; lpDesc->Packet(buf, sizeof(DWORD)); return true; }
int input_logout(DESC_DATA *d, const char *data, int plen) { const int PACKET_LENGTH = 4; if (plen < PACKET_LENGTH) return 0; DWORD account_id = decode_4bytes((const BYTE*)data); // sys_log("LOGOUT: %u", account_id); CONN_DATA *conn = conn_find(account_id); if (NULL==conn) { return PACKET_LENGTH; } // update online time and logout time { conn_delete(account_id); } return PACKET_LENGTH; } /* end of input_logout() */
int input_login(DESC_DATA *d, const char *data, int plen) { const int PACKET_LENGTH = 4; if (plen < PACKET_LENGTH) return 0; DWORD account_id = decode_4bytes((const BYTE*)data); // sys_log("LOGIN: %u", account_id); /* 기존 정보가 있으면 접속을 끊으라고 알려줌 */ CONN_DATA *conn = conn_find(account_id); if (conn) { send_force_logout(conn); //conn_delete(GET_ID(conn)); // 새로운 접속자도 접속을 끊는다. { PACKET_DATA *buf = &d->packet_buffer; packet_header(buf, HEADER_TG_FORCE_LOGOUT, d->desc_num); packet(buf, GET_LOGIN(conn), MAX_LOGIN_LEN); } return PACKET_LENGTH; } conn = (CONN_DATA*) calloc(1, sizeof(CONN_DATA)); GET_ID(conn) = account_id; GET_DESC(conn) = d; GET_EVENT(conn) = NULL; int login_succ = FALSE; if (teen_all_flag) login_succ = account_login_teen_all(account_id, conn); else login_succ = account_login(account_id, conn); if (FALSE==login_succ) { //conn_delete(GET_ID(conn)); SAFE_FREE(conn); return PACKET_LENGTH; } conn_insert(conn); if (YES==GET_TEENAGE(conn)) { conn_event_info *info = (conn_event_info*) calloc(1, sizeof(conn_event_info)); info->conn = conn; GET_EVENT(conn) = event_create(conn_event_func, info, (CHECK_TIME_SEC * PASSES_PER_SEC)); } else { GET_EVENT(conn) = NULL; } if (YES==GET_TEENAGE(conn)) { send_login_notice(conn); set_notice_step(conn); send_notice(conn); } sys_log("CONN_INSERT : %u, %s", GET_ID(conn), GET_LOGIN(conn)); return PACKET_LENGTH; } /* end of input_login() */