INT_PTR CAimProto::OnLeaveChat(WPARAM wParam, LPARAM) { if (m_state != 1) return 0; MCONTACT hContact = wParam; DBVARIANT dbv; if (!getString(hContact, "ChatRoomID", &dbv)) { chat_leave(dbv.pszVal); db_free(&dbv); } return 0; }
INT_PTR CAimProto::OnLeaveChat(WPARAM wParam, LPARAM /*lParam*/) { if (state != 1) return 0; HANDLE hContact = (HANDLE)wParam; DBVARIANT dbv; if (!getString(hContact, "ChatRoomID", &dbv)) { chat_leave(dbv.pszVal); DBFreeVariant(&dbv); } return 0; }
void pars_privat(void) { int privat; privat = pars_number(); strncpy(status->nick, packet, NICK_MAXLEN); if (user_ignore()) return; strncpy(status->channel, packet, NICK_MAXLEN); if (!strncmp(config->nick, status->nick, NICK_MAXLEN)) strncpy(status->channel, pars_word(), NICK_MAXLEN); else if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return; switch (privat) { case MSG_PRIVATJOIN: if (!config->packet_qchat) { pars_word(); status->gender = pars_number(); } chat_join(); break; case MSG_PRIVATLEAVE: if (!config->packet_qchat) { pars_word(); status->gender = pars_number(); } chat_leave(); break; case MSG_PRIVATCHAT: chat_rejoin(); snprintf(message, MSG_SIZE, "<%s> %s\n", status->nick, pars_word()); write_log(config->log_priv); write_str(status->channel, COL_CHAT); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_chat(); break; case MSG_PRIVATME: chat_rejoin(); snprintf(message, MSG_SIZE, " * %s %s\n", status->nick, pars_word()); write_log(config->log_priv); write_str(status->channel, COL_CHAT); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_chat(); break; default: #ifdef DEBUG fprintf(debug_file, "error: Unknown private type.\n"); fflush(debug_file); #endif /* DEBUG */ break; } }
int CAimProto::OnGCEvent(WPARAM wParam,LPARAM lParam) { GCHOOK *gch = (GCHOOK*) lParam; if (!gch) return 1; if (strcmp(gch->pDest->pszModule, m_szModuleName)) return 0; char* id = mir_t2a(gch->pDest->ptszID); chat_list_item* item = find_chat_by_id(id); if (item == NULL) return 0; switch (gch->pDest->iType) { case GC_SESSION_TERMINATE: aim_sendflap(item->hconn,0x04,0,NULL,item->seqno); Netlib_Shutdown(item->hconn); break; case GC_USER_MESSAGE: if (gch->ptszText && _tcslen(gch->ptszText)) { char* msg = mir_utf8encodeT(gch->ptszText); aim_chat_send_message(item->hconn, item->seqno, msg); mir_free(msg); } break; case GC_USER_CHANMGR: DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CHATROOM_INVITE), NULL, invite_to_chat_dialog, LPARAM(new invite_chat_param(item->id, this))); break; case GC_USER_PRIVMESS: { char* sn = mir_t2a(gch->ptszUID); HANDLE hContact = contact_from_sn(sn); mir_free(sn); CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0); } break; case GC_USER_LOGMENU: switch(gch->dwData) { case 10: DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CHATROOM_INVITE), NULL, invite_to_chat_dialog, LPARAM(new invite_chat_param(item->id, this))); break; case 20: chat_leave(id); break; } break; case GC_USER_NICKLISTMENU: { char *sn = mir_t2a(gch->ptszUID); HANDLE hContact = contact_from_sn(sn); mir_free(sn); switch (gch->dwData) { case 10: CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); break; case 20: CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)hContact, 0); break; case 110: chat_leave(id); break; } } break; case GC_USER_TYPNOTIFY: break; } mir_free(id); return 0; }
void __cdecl CAimProto::aim_chat_negotiation(void* param) { chat_list_item *item = (chat_list_item*)param; HANDLE hServerPacketRecver = (HANDLE)CallService(MS_NETLIB_CREATEPACKETRECVER, (WPARAM)item->hconn, 2048 * 8); NETLIBPACKETRECVER packetRecv = { 0 }; packetRecv.cbSize = sizeof(packetRecv); packetRecv.dwTimeout = DEFAULT_KEEPALIVE_TIMER * 1000; for (;;) { int recvResult = CallService(MS_NETLIB_GETMOREPACKETS, (WPARAM)hServerPacketRecver, (LPARAM)&packetRecv); if (recvResult == 0) break; if (recvResult == SOCKET_ERROR) { if (WSAGetLastError() == ERROR_TIMEOUT) { if (aim_keepalive(item->hconn, item->seqno) < 0) break; } else break; } if (recvResult > 0) { unsigned short flap_length = 0; for (; packetRecv.bytesUsed < packetRecv.bytesAvailable; packetRecv.bytesUsed = flap_length) { if (!packetRecv.buffer) break; FLAP flap((char*)&packetRecv.buffer[packetRecv.bytesUsed], packetRecv.bytesAvailable - packetRecv.bytesUsed); if (!flap.len()) break; flap_length += FLAP_SIZE + flap.len(); if (flap.cmp(0x01)) { aim_send_cookie(item->hconn, item->seqno, item->CHAT_COOKIE_LENGTH, item->CHAT_COOKIE);//cookie challenge mir_free(item->CHAT_COOKIE); item->CHAT_COOKIE = NULL; item->CHAT_COOKIE_LENGTH = 0; } else if (flap.cmp(0x02)) { SNAC snac(flap.val(), flap.snaclen()); if (snac.cmp(0x0001)) { snac_supported_families(snac, item->hconn, item->seqno); snac_supported_family_versions(snac, item->hconn, item->seqno); snac_chat_rate_limitations(snac, item->hconn, item->seqno); snac_error(snac); } if (snac.cmp(0x000E)) { snac_chat_received_message(snac, item); snac_chat_joined_left_users(snac, item); snac_error(snac); } } else if (flap.cmp(0x04)) goto exit; } } } exit: Netlib_CloseHandle(hServerPacketRecver); Netlib_CloseHandle(item->hconn); chat_leave(item->id); remove_chat_by_ptr(item); debugLogA("Chat Server Connection has ended"); }