void CAimProto::chat_event(const char* id, const char* sn, int evt, const TCHAR* msg) { TCHAR* idt = mir_a2t(id); TCHAR* snt = mir_a2t(sn); HANDLE hContact = contact_from_sn(sn); TCHAR* nick = hContact ? (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, WPARAM(hContact), GCDNF_TCHAR) : snt; GCDEST gcd = { m_szModuleName, { NULL }, evt }; gcd.ptszID = idt; GCEVENT gce = {0}; gce.cbSize = sizeof(gce); gce.dwFlags = GC_TCHAR | GCEF_ADDTOLOG; gce.pDest = &gcd; gce.ptszNick = nick; gce.ptszUID = snt; gce.bIsMe = _stricmp(sn, username) == 0; gce.ptszStatus = gce.bIsMe ? TranslateT("Me") : TranslateT("Others"); gce.ptszText = msg; gce.time = time(NULL); CallServiceSync(MS_GC_EVENT, 0, (LPARAM)&gce); mir_free(snt); mir_free(idt); }
void CAimProto::avatar_retrieval_handler(const char* sn, const char* hash, const char* data, int data_len) { bool res = false; PROTO_AVATAR_INFORMATIONT AI = {0}; AI.cbSize = sizeof(AI); AI.hContact = contact_from_sn(sn); if (data_len > 0) { const TCHAR *type; AI.format = detect_image_type(data, type); get_avatar_filename(AI.hContact, AI.filename, SIZEOF(AI.filename), type); int fileId = _topen(AI.filename, _O_CREAT | _O_TRUNC | _O_WRONLY | O_BINARY, _S_IREAD | _S_IWRITE); if (fileId >= 0) { _write(fileId, data, data_len); _close(fileId); res = true; char *my_sn = getSetting(AIM_KEY_SN); if (!_strcmps(sn, my_sn)) CallService(MS_AV_REPORTMYAVATARCHANGED, (WPARAM)m_szModuleName, 0); mir_free(my_sn); } // else // ShowError("Cannot set avatar. File '%s' could not be created/overwritten", file); } else LOG("AIM sent avatar of zero length for %s.(Usually caused by repeated request for the same icon)", sn); sendBroadcast(AI.hContact, ACKTYPE_AVATAR, res ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, &AI, 0); }
MCONTACT CAimProto::AddToList(int flags, PROTOSEARCHRESULT* psr) { if (state != 1) return 0; TCHAR *id = psr->id ? psr->id : psr->nick; char *sn = psr->flags & PSR_UNICODE ? mir_u2a((wchar_t*)id) : mir_strdup((char*)id); MCONTACT hContact = contact_from_sn(sn, true, (flags & PALF_TEMPORARY) != 0); mir_free(sn); return hContact; //See authrequest for serverside addition }
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; }