// MsnAuthAllow - called after successful authorization int CMsnProto::Authorize(MEVENT hDbEvent) { if (!msnLoggedIn) return 1; DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == -1) return 1; dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); if (db_event_get(hDbEvent, &dbei)) return 1; if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return 1; if (mir_strcmp(dbei.szModule, m_szModuleName)) return 1; char *nick = (char*)(dbei.pBlob + sizeof(DWORD) * 2); char *firstName = nick + mir_strlen(nick) + 1; char *lastName = firstName + mir_strlen(firstName) + 1; char *email = lastName + mir_strlen(lastName) + 1; MCONTACT hContact = MSN_HContactFromEmail(email, nick, true, 0); int netId = Lists_GetNetId(email); MSN_AddUser(hContact, email, netId, LIST_AL); MSN_AddUser(hContact, email, netId, LIST_BL + LIST_REMOVE); MSN_AddUser(hContact, email, netId, LIST_PL + LIST_REMOVE); MSN_SetContactDb(hContact, email); return 0; }
static int HookDBEventAdded(WPARAM hContact, LPARAM hDbEvent) { //process the event DBEVENTINFO dbe = { sizeof(dbe) }; db_event_get(hDbEvent, &dbe); //check if we should process the event if (dbe.flags & (DBEF_SENT | DBEF_READ) || dbe.eventType != EVENTTYPE_CONTACTS) return 0; //get event contents dbe.cbBlob = db_event_getBlobSize(hDbEvent); if (dbe.cbBlob != -1) dbe.pBlob = (PBYTE)_alloca(dbe.cbBlob); db_event_get(hDbEvent, &dbe); //play received sound SkinPlaySound("RecvContacts"); { //add event to the contact list TCHAR caToolTip[128]; mir_sntprintf(caToolTip, _T("%s %s"), TranslateT("Contacts received from"), pcli->pfnGetContactDisplayName(hContact, 0)); CLISTEVENT cle = { sizeof(cle) }; cle.hContact = hContact; cle.hDbEvent = hDbEvent; cle.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_CONTACTS)); cle.pszService = MS_CONTACTS_RECEIVE; cle.ptszTooltip = caToolTip; cle.flags |= CLEF_UNICODE; CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle); } return 0; //continue processing by other hooks }
static int MessageEventAdded(WPARAM hContact, LPARAM hDbEvent) { if (!BoltunAutoChat(hContact)) return 0; DBEVENTINFO dbei; memset(&dbei, 0, sizeof(dbei)); dbei.cbSize = sizeof(dbei); dbei.cbBlob = 0; dbei.cbBlob = db_event_getBlobSize(hDbEvent); if (dbei.cbBlob == -1) return 0; dbei.pBlob = (PBYTE)malloc(dbei.cbBlob); if (dbei.pBlob == NULL) return 0; db_event_get(hDbEvent, &dbei); if (dbei.flags & DBEF_SENT || dbei.flags & DBEF_READ || dbei.eventType != EVENTTYPE_MESSAGE) return 0; DBEVENTGETTEXT egt; egt.codepage = CP_ACP; egt.datatype = DBVT_TCHAR; egt.dbei = &dbei; TCHAR* s = (TCHAR*)(void*)CallService(MS_DB_EVENT_GETTEXT, 0, (LPARAM)&egt); free(dbei.pBlob); if (Config.MarkAsRead) db_event_markRead(hContact, hDbEvent); AnswerToContact(hContact, s); mir_free(s); return 0; }
int CYahooProto::Authorize( HANDLE hdbe ) { debugLogA("[YahooAuthAllow]"); if ( !m_bLoggedIn ) { debugLogA("[YahooAuthAllow] Not Logged In!"); return 1; } DBEVENTINFO dbei = { sizeof(dbei) }; if (( dbei.cbBlob = db_event_getBlobSize(hdbe)) == -1 ) return 1; dbei.pBlob = ( PBYTE )_alloca( dbei.cbBlob ); if (db_event_get(hdbe, &dbei)) return 1; if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return 1; if ( strcmp(dbei.szModule, m_szModuleName)) return 1; /* Need to remove the buddy from our Miranda Lists */ MCONTACT hContact = DbGetAuthEventContact(&dbei); if (hContact != NULL) { ptrA who( getStringA(hContact, YAHOO_LOGINID)); if (who) { ptrA myid( getStringA(hContact, "MyIdentity")); debugLogA("Accepting buddy:%s", who); accept(myid, who, getWord(hContact, "yprotoid", 0)); } } return 0; }
static int MsgEventAdded(WPARAM wParam,LPARAM lParam) { HANDLE hDbEvent = (HANDLE)lParam; if (currentWatcherType & SDWTF_MESSAGE) { DBEVENTINFO dbe = { sizeof(dbe) }; dbe.cbBlob = db_event_getBlobSize(hDbEvent); dbe.pBlob = (BYTE*)mir_alloc(dbe.cbBlob+2); /* ensure term zero */ if (dbe.pBlob == NULL) return 0; if (!db_event_get(hDbEvent, &dbe)) if (dbe.eventType == EVENTTYPE_MESSAGE && !(dbe.flags & DBEF_SENT)) { DBVARIANT dbv; if (!db_get_ts(NULL,"AutoShutdown","Message",&dbv)) { TrimString(dbv.ptszVal); TCHAR *pszMsg = GetMessageText(&dbe.pBlob,&dbe.cbBlob); if (pszMsg != NULL && _tcsstr(pszMsg,dbv.ptszVal) != NULL) ShutdownAndStopWatcher(); /* msg with specified text recvd */ mir_free(dbv.ptszVal); /* does NULL check */ } } mir_free(dbe.pBlob); } return 0; }
static int HookDBEventAdded(WPARAM hContact, LPARAM hDbEvent) { //process the event DBEVENTINFO dbe = {}; db_event_get(hDbEvent, &dbe); //check if we should process the event if (dbe.flags & (DBEF_SENT | DBEF_READ) || dbe.eventType != EVENTTYPE_CONTACTS) return 0; //get event contents dbe.cbBlob = db_event_getBlobSize(hDbEvent); if (dbe.cbBlob != -1) dbe.pBlob = (PBYTE)_alloca(dbe.cbBlob); db_event_get(hDbEvent, &dbe); //play received sound Skin_PlaySound("RecvContacts"); { //add event to the contact list wchar_t caToolTip[128]; mir_snwprintf(caToolTip, L"%s %s", TranslateT("Contacts received from"), Clist_GetContactDisplayName(hContact)); CLISTEVENT cle = {}; cle.hContact = hContact; cle.hDbEvent = hDbEvent; cle.hIcon = LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_CONTACTS)); cle.pszService = MS_CONTACTS_RECEIVE; cle.szTooltip.w = caToolTip; cle.flags |= CLEF_UNICODE; g_clistApi.pfnAddEvent(&cle); } return 0; //continue processing by other hooks }
bool EventList::GetEventData(const EventIndex& ev, EventData& data) { if (!ev.isExternal) { DWORD newBlobSize = db_event_getBlobSize(ev.hEvent); if (newBlobSize > goldBlobSize) { gdbei.pBlob = (PBYTE)mir_realloc(gdbei.pBlob,newBlobSize); goldBlobSize = newBlobSize; } gdbei.cbBlob = goldBlobSize; if (db_event_get(ev.hEvent, &gdbei) == 0) { data.isMe = (gdbei.flags & DBEF_SENT) != 0; data.eventType = gdbei.eventType; data.timestamp = gdbei.timestamp; return true; } } else if (ev.exIdx >= 0 && ev.exIdx < (int)importedMessages.size()) { IImport::ExternalMessage& em = importedMessages[ev.exIdx]; data.isMe = (em.flags & DBEF_SENT) != 0; data.eventType = em.eventType; data.timestamp = em.timestamp; return true; } return false; }
MEVENT CSkypeProto::GetMessageFromDb(MCONTACT hContact, const char *messageId, LONGLONG timestamp) { if (messageId == NULL) return NULL; timestamp -= 600; // we check events written 10 minutes ago size_t messageIdLength = mir_strlen(messageId); mir_cslock lock(messageSyncLock); for (MEVENT hDbEvent = db_event_last(hContact); hDbEvent; hDbEvent = db_event_prev(hContact, hDbEvent)) { DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); if (dbei.cbBlob < messageIdLength) continue; mir_ptr<BYTE> blob((PBYTE)mir_alloc(dbei.cbBlob)); dbei.pBlob = blob; db_event_get(hDbEvent, &dbei); size_t cbLen = mir_strlen((char*)dbei.pBlob); if (memcmp(&dbei.pBlob[cbLen + 1], messageId, messageIdLength) == 0) return hDbEvent; if (dbei.timestamp < timestamp) break; } return NULL; }
MEVENT CSkypeProto::AppendDBEvent(MCONTACT hContact, MEVENT hEvent, const char *szContent, const char *szUid, time_t edit_time) { mir_cslock lck(m_AppendMessageLock); DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hEvent); dbei.pBlob = mir_ptr<BYTE>((PBYTE)mir_alloc(dbei.cbBlob)); db_event_get(hEvent, &dbei); JSONNode jMsg = JSONNode::parse((char*)dbei.pBlob); if (jMsg) { JSONNode &jEdits = jMsg["edits"]; if (jEdits) { for (auto it = jEdits.begin(); it != jEdits.end(); ++it) { const JSONNode &jEdit = *it; if (jEdit["time"].as_int() == edit_time) return hEvent; } JSONNode jEdit; jEdit << JSONNode("time", (long)edit_time) << JSONNode("text", szContent); jEdits << jEdit; } } else { jMsg = JSONNode(); JSONNode jOriginalMsg; jOriginalMsg.set_name("original_message"); JSONNode jEdits(JSON_ARRAY); jEdits.set_name("edits"); JSONNode jEdit; jOriginalMsg << JSONNode("time", (long)dbei.timestamp) << JSONNode("text", (char*)dbei.pBlob); jMsg << jOriginalMsg; jEdit << JSONNode("time", (long)edit_time) << JSONNode("text", szContent); jEdits << jEdit; jMsg << jEdits; } db_event_delete(hContact, hEvent); return AddDbEvent(SKYPE_DB_EVENT_TYPE_EDITED_MESSAGE, hContact, dbei.timestamp, DBEF_UTF, jMsg.write().c_str(), szUid); }
MIRANDA_HOOK_EVENT(ME_DB_EVENT_ADDED, hContact, hDbEvent) { DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); if (dbei.cbBlob == -1) return 0; dbei.pBlob = (BYTE*)alloca(dbei.cbBlob); db_event_get(hDbEvent, &dbei); // if event is in protocol that is not despammed if (!ProtoInList(dbei.szModule)) return 0; // event is an auth request if (gbHandleAuthReq) { if (!(dbei.flags & DBEF_SENT) && !(dbei.flags & DBEF_READ) && dbei.eventType == EVENTTYPE_AUTHREQUEST) { MCONTACT hcntct = DbGetAuthEventContact(&dbei); // if request is from unknown or not marked Answered contact int a = db_get_b(hcntct, "CList", "NotOnList", 0); int b = !db_get_b(hcntct, pluginName, "Answered", 0); if (a && b) { // ...send message if (gbHideContacts) db_set_b(hcntct, "CList", "Hidden", 1); if (gbSpecialGroup) db_set_ws(hcntct, "CList", "Group", gbSpammersGroup.c_str()); BYTE msg = 1; if (gbIgnoreURL) { TCHAR* EventText = ReqGetText(&dbei); //else return NULL msg = !IsUrlContains(EventText); mir_free(EventText); } if (gbInvisDisable) { if (CallProtoService(dbei.szModule, PS_GETSTATUS, 0, 0) == ID_STATUS_INVISIBLE) msg = 0; else if (db_get_w(hContact, dbei.szModule, "ApparentMode", 0) == ID_STATUS_OFFLINE) msg = 0; //is it useful ? } if (msg) { ptrA buff(mir_utf8encodeW(variables_parse(gbAuthRepl, hcntct).c_str())); CallContactService(hcntct, PSS_MESSAGE, 0, (LPARAM)buff); } return 1; } } } return 0; }
static int dbei__init(lua_State *L) { MEVENT hEvent = lua_tointeger(L, 1); DBEVENTINFO *dbei = (DBEVENTINFO*)lua_newuserdata(L, sizeof(DBEVENTINFO)); dbei->cbSize = sizeof(DBEVENTINFO); dbei->cbBlob = db_event_getBlobSize(hEvent); dbei->pBlob = (PBYTE)mir_calloc(dbei->cbBlob); db_event_get(hEvent, dbei); luaL_setmetatable(L, MT_DBEVENTINFO); return 1; }
void EventList::RebuildGroup(int selected) { std::deque<EventIndex> newGroup; for (size_t i = 0; i < eventList[selected].size(); ++i) { EventIndex& ev = eventList[selected][i]; if (!ev.isExternal) { // If event exist, we add it to new group if (db_event_getBlobSize(ev.hEvent) >= 0) newGroup.push_back(eventList[selected][i]); } else newGroup.push_back(eventList[selected][i]); } eventList[selected].clear(); eventList[selected].insert(eventList[selected].begin(), newGroup.begin(), newGroup.end()); }
static int lua_GetEvent(lua_State *L) { ObsoleteMethod(L, "Use totable(x, \"DBEVENTINFO\") instead"); MEVENT hEvent = luaL_checkinteger(L, 1); DBEVENTINFO dbei = { sizeof(DBEVENTINFO) }; dbei.cbBlob = db_event_getBlobSize(hEvent); dbei.pBlob = (PBYTE)mir_calloc(dbei.cbBlob); int res = ::db_event_get(hEvent, &dbei); if (res) { lua_pushnil(L); return 1; } lua_newtable(L); lua_pushliteral(L, "Module"); lua_pushstring(L, ptrA(mir_utf8encode(dbei.szModule))); lua_settable(L, -3); lua_pushliteral(L, "Timestamp"); lua_pushnumber(L, dbei.timestamp); lua_settable(L, -3); lua_pushliteral(L, "Type"); lua_pushinteger(L, dbei.eventType); lua_settable(L, -3); lua_pushliteral(L, "Flags"); lua_pushinteger(L, dbei.flags); lua_settable(L, -3); lua_pushliteral(L, "Length"); lua_pushnumber(L, dbei.cbBlob); lua_settable(L, -3); lua_pushliteral(L, "Blob"); lua_newtable(L); for (DWORD i = 0; i < dbei.cbBlob; i++) { lua_pushinteger(L, i + 1); lua_pushinteger(L, dbei.pBlob[i]); lua_settable(L, -3); } lua_settable(L, -3); mir_free(dbei.pBlob); return 1; }
MIRANDA_HOOK_EVENT(ME_DB_EVENT_ADDED, wParam, lParam) { UNREFERENCED_PARAMETER(wParam); MEVENT hDbEvent = (MEVENT)lParam; DBEVENTINFO dbei = { 0 }; dbei.cbSize = sizeof(dbei); dbei.cbBlob = db_event_getBlobSize(hDbEvent); if (-1 == dbei.cbBlob) return 0; mir_ptr<BYTE> blob((LPBYTE)mir_alloc(dbei.cbBlob)); dbei.pBlob = blob; db_event_get(hDbEvent, &dbei); // if event is in protocol that is not despammed if (plSets->ProtoDisabled(dbei.szModule)) return 0; // event is an auth request if (!(dbei.flags & DBEF_SENT) && !(dbei.flags & DBEF_READ) && dbei.eventType == EVENTTYPE_AUTHREQUEST) { MCONTACT hcntct = DbGetAuthEventContact(&dbei); // if request is from unknown or not marked Answered contact //and if I don't sent message to this contact if (db_get_b(hcntct, "CList", "NotOnList", 0) && !db_get_b(hcntct, pluginName, answeredSetting, 0) && !IsExistMyMessage(hcntct)) { if (!plSets->HandleAuthReq.Get()) { char *buf = mir_utf8encodeW(variables_parse(plSets->AuthRepl.Get(), hcntct).c_str()); CallContactService(hcntct, PSS_MESSAGE, 0, (LPARAM)buf); mir_free(buf); } // ...send message char *AuthRepl = mir_u2a(variables_parse(plSets->AuthRepl.Get(), hcntct).c_str()); CallProtoService(dbei.szModule, PS_AUTHDENY, hDbEvent, (LPARAM)AuthRepl); mir_free(AuthRepl); db_set_b(hcntct, "CList", "NotOnList", 1); db_set_b(hcntct, "CList", "Hidden", 1); if (!plSets->HistLog.Get()) db_event_delete(0, hDbEvent); return 1; } } return 0; }
MCONTACT __cdecl CMsnProto::AddToListByEvent(int flags, int, MEVENT hDbEvent) { DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == (DWORD)(-1)) return NULL; dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); if (db_event_get(hDbEvent, &dbei)) return NULL; if (mir_strcmp(dbei.szModule, m_szModuleName)) return NULL; if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return NULL; char* nick = (char *)(dbei.pBlob + sizeof(DWORD) * 2); char* firstName = nick + mir_strlen(nick) + 1; char* lastName = firstName + mir_strlen(firstName) + 1; char* email = lastName + mir_strlen(lastName) + 1; return AddToListByEmail(email, nick, flags); }
static void FillHistoryThread(void* param) { Thread_SetName("HistoryWindow::FillHistoryThread"); THistoryThread *hInfo = (THistoryThread*)param; HWND hwndList = GetDlgItem(hInfo->hwnd, IDC_LIST); SendDlgItemMessage(hInfo->hwnd, IDC_LIST, LB_RESETCONTENT, 0, 0); int i = db_event_count(hInfo->hContact); SendDlgItemMessage(hInfo->hwnd, IDC_LIST, LB_INITSTORAGE, i, i * 40); DBEVENTINFO dbei = { sizeof(dbei) }; int oldBlobSize = 0; MEVENT hDbEvent = db_event_last(hInfo->hContact); while (hDbEvent != NULL) { if (!IsWindow(hInfo->hwnd)) break; int newBlobSize = db_event_getBlobSize(hDbEvent); if (newBlobSize > oldBlobSize) { dbei.pBlob = (PBYTE)mir_realloc(dbei.pBlob, newBlobSize); oldBlobSize = newBlobSize; } dbei.cbBlob = oldBlobSize; db_event_get(hDbEvent, &dbei); TCHAR str[200], eventText[256], strdatetime[64]; GetObjectSummary(&dbei, str, _countof(str)); if (str[0]) { TimeZone_PrintTimeStamp(NULL, dbei.timestamp, _T("d t"), strdatetime, _countof(strdatetime), 0); mir_sntprintf(eventText, _T("%s: %s"), strdatetime, str); i = SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)eventText); SendMessage(hwndList, LB_SETITEMDATA, i, (LPARAM)hDbEvent); } hDbEvent = db_event_prev(hInfo->hContact, hDbEvent); } mir_free(dbei.pBlob); SendDlgItemMessage(hInfo->hwnd, IDC_LIST, LB_SETCURSEL, 0, 0); SendMessage(hInfo->hwnd, WM_COMMAND, MAKEWPARAM(IDC_LIST, LBN_SELCHANGE), 0); EnableWindow(GetDlgItem(hInfo->hwnd, IDC_LIST), TRUE); mir_free(hInfo); }
int CYahooProto::AuthDeny( HANDLE hdbe, const TCHAR* reason ) { debugLogA("[YahooAuthDeny]"); if ( !m_bLoggedIn ) return 1; DBEVENTINFO dbei = { sizeof( dbei ) }; if (( dbei.cbBlob = db_event_getBlobSize(hdbe)) == -1 ) { debugLogA("[YahooAuthDeny] ERROR: Can't get blob size"); return 1; } dbei.pBlob = ( PBYTE )alloca( dbei.cbBlob ); if (db_event_get(hdbe, &dbei)) { debugLogA("YahooAuthDeny - Can't get db event!"); return 1; } if (dbei.eventType != EVENTTYPE_AUTHREQUEST) { debugLogA("YahooAuthDeny - not Authorization event"); return 1; } if (strcmp( dbei.szModule, m_szModuleName)) { debugLogA("YahooAuthDeny - wrong module?"); return 1; } /* Need to remove the buddy from our Miranda Lists */ MCONTACT hContact = DbGetAuthEventContact(&dbei); if (hContact != NULL) { ptrA who( getStringA(hContact, YAHOO_LOGINID)); if (who) { ptrA myid( getStringA(hContact, "MyIdentity")); ptrA u_reason( mir_utf8encodeT(reason)); debugLogA("Rejecting buddy:%s msg: %s", who, u_reason); reject(myid, who, getWord(hContact, "yprotoid", 0), u_reason); CallService(MS_DB_CONTACT_DELETE, hContact, 0); } } return 0; }
MCONTACT CMraProto::AddToListByEvent(int, int, MEVENT hDbEvent) { DBEVENTINFO dbei = { 0 }; dbei.cbSize = sizeof(dbei); if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) != -1) { dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); if (db_event_get(hDbEvent, &dbei) == 0 && !mir_strcmp(dbei.szModule, m_szModuleName) && (dbei.eventType == EVENTTYPE_AUTHREQUEST || dbei.eventType == EVENTTYPE_CONTACTS)) { char *nick = (char*)(dbei.pBlob + sizeof(DWORD) * 2); char *firstName = nick + mir_strlen(nick) + 1; char *lastName = firstName + mir_strlen(firstName) + 1; char *email = lastName + mir_strlen(lastName) + 1; return AddToListByEmail(_A2T(email), _A2T(nick), _A2T(firstName), _A2T(lastName), 0); } } return 0; }
int CMraProto::Authorize(MEVENT hDBEvent) { if (!m_bLoggedIn) return 1; DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(hDBEvent)) == -1) return 1; dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); if (db_event_get(hDBEvent, &dbei)) return 1; if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return 1; if (mir_strcmp(dbei.szModule, m_szModuleName)) return 1; LPSTR lpszNick = (LPSTR)(dbei.pBlob + sizeof(DWORD) * 2); LPSTR lpszFirstName = lpszNick + mir_strlen(lpszNick) + 1; LPSTR lpszLastName = lpszFirstName + mir_strlen(lpszFirstName) + 1; MraAuthorize(CMStringA(lpszLastName + mir_strlen(lpszLastName) + 1)); return 0; }
//This function used to popup a read SMS window after the user clicked on the received SMS message. int ReadMsgSMS(WPARAM wParam,LPARAM lParam) { CLISTEVENT *cle = (CLISTEVENT*)lParam; DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(((CLISTEVENT*)lParam)->hDbEvent)) != -1) { dbei.pBlob = (PBYTE)_alloca(dbei.cbBlob); if (db_event_get(cle->hDbEvent, &dbei) == 0) if (dbei.eventType == ICQEVENTTYPE_SMS || dbei.eventType == ICQEVENTTYPE_SMSCONFIRMATION) if (dbei.cbBlob > MIN_SMS_DBEVENT_LEN) { if (RecvSMSWindowAdd(cle->hContact,ICQEVENTTYPE_SMS,NULL,0,(LPSTR)dbei.pBlob,dbei.cbBlob)) { db_event_markRead(cle->hContact, cle->hDbEvent); return 0; } } } return 1; }
MCONTACT CSkypeProto::AddToListByEvent(int, int, MEVENT hDbEvent) { debugLogA(__FUNCTION__); DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == (DWORD)(-1)) return NULL; if ((dbei.pBlob = (PBYTE)alloca(dbei.cbBlob)) == NULL) return NULL; if (db_event_get(hDbEvent, &dbei)) return NULL; if (mir_strcmp(dbei.szModule, m_szModuleName)) return NULL; if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return NULL; DB_AUTH_BLOB blob(dbei.pBlob); MCONTACT hContact = AddContact(ptrA(blob.get_id())); return hContact; }
int CMsnProto::AuthDeny(HANDLE hDbEvent, const TCHAR* szReason) { if (!msnLoggedIn) return 1; DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == -1) return 1; dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); if (db_event_get(hDbEvent, &dbei)) return 1; if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return 1; if (strcmp(dbei.szModule, m_szModuleName)) return 1; char* nick = (char*)(dbei.pBlob + sizeof(DWORD)*2); char* firstName = nick + strlen(nick) + 1; char* lastName = firstName + strlen(firstName) + 1; char* email = lastName + strlen(lastName) + 1; MsnContact* msc = Lists_Get(email); if (msc == NULL) return 0; MSN_AddUser(NULL, email, msc->netId, LIST_PL + LIST_REMOVE); MSN_AddUser(NULL, email, msc->netId, LIST_BL); MSN_AddUser(NULL, email, msc->netId, LIST_RL); if (!(msc->list & (LIST_FL | LIST_LL))) { if (msc->hContact) CallService(MS_DB_CONTACT_DELETE, (WPARAM)msc->hContact, 0); msc->hContact = NULL; MCONTACT hContact = MSN_HContactFromEmail(email); if (hContact) CallService(MS_DB_CONTACT_DELETE, hContact, 0); } return 0; }
int CMraProto::AuthDeny(MEVENT hDBEvent, const TCHAR* szReason) { if (!m_bLoggedIn) return 1; DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(hDBEvent)) == -1) return 1; dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); if (db_event_get(hDBEvent, &dbei)) return 1; if (dbei.eventType != EVENTTYPE_AUTHREQUEST) return 1; if (mir_strcmp(dbei.szModule, m_szModuleName)) return 1; LPSTR lpszNick = (LPSTR)(dbei.pBlob + sizeof(DWORD) * 2); LPSTR lpszFirstName = lpszNick + mir_strlen(lpszNick) + 1; LPSTR lpszLastName = lpszFirstName + mir_strlen(lpszFirstName) + 1; LPSTR szEmail = lpszLastName + mir_strlen(lpszLastName) + 1; MraMessage(FALSE, NULL, 0, 0, szEmail, szReason, NULL, 0); return 0; }
//------------------------------------------------------------------------------ bool EventInformation::isValidEvent(HANDLE event) { // clean up the old event if (m_event_info.pBlob) { delete m_event_info.pBlob; } memset(&m_event_info, 0, sizeof(m_event_info)); // find out and assign the space we need for the new event m_event_info.cbSize = sizeof(m_event_info); m_event_info.cbBlob = db_event_getBlobSize(event);// CallService(MS_DB_EVENT_GETBLOBSIZE, reinterpret_cast<LPARAM>(event), 0); if (-1 == m_event_info.cbBlob) { return false; } m_event_info.pBlob = new unsigned char[m_event_info.cbBlob]; // get the event info db_event_get(event, &m_event_info); //CallService(MS_DB_EVENT_GET, reinterpret_cast<LPARAM>(event), reinterpret_cast<LPARAM>(&m_event_info)); // if the event has already been read or was sent by me then exit if (m_event_info.flags & (DBEF_SENT | DBEF_READ)) { return false; } // if the event string doesn't exist in our list then exit if (m_event_strings.find(m_event_info.eventType) == m_event_strings.end()) { return false; } // event was good return true; }
MCONTACT __cdecl CYahooProto::AddToListByEvent( int flags, int /*iContact*/, HANDLE hDbEvent ) { debugLogA("[YahooAddToListByEvent]"); if (!m_bLoggedIn) return 0; DBEVENTINFO dbei = { sizeof( dbei ) }; if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == -1 ) { debugLogA("[YahooAddToListByEvent] ERROR: Can't get blob size."); return 0; } debugLogA("[YahooAddToListByEvent] Got blob size: %lu", dbei.cbBlob); dbei.pBlob = ( PBYTE )_alloca( dbei.cbBlob ); if (db_event_get(hDbEvent, &dbei)) { debugLogA("[YahooAddToListByEvent] ERROR: Can't get event."); return 0; } if (dbei.eventType != EVENTTYPE_AUTHREQUEST) { debugLogA("[YahooAddToListByEvent] ERROR: Not an authorization request."); return 0; } if ( strcmp(dbei.szModule, m_szModuleName)) { debugLogA("[YahooAddToListByEvent] ERROR: Not Yahoo protocol."); return 0; } MCONTACT hContact = DbGetAuthEventContact(&dbei); if (hContact != NULL) debugLogA("Temp Buddy found at: %p ", hContact); else debugLogA("hContact NULL???"); return hContact; }
//Handles new SMS messages added to the database int handleNewMessage(WPARAM hContact, LPARAM hDbEvent) { char szServiceFunction[MAX_PATH], *pszServiceFunctionName; TCHAR szToolTip[MAX_PATH]; DBEVENTINFO dbei = { sizeof(dbei) }; if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == -1) return 0; dbei.pBlob = (PBYTE)MEMALLOC(dbei.cbBlob); if (!dbei.pBlob) return 0; memcpy(szServiceFunction, PROTOCOL_NAMEA, PROTOCOL_NAME_SIZE); pszServiceFunctionName = szServiceFunction + PROTOCOL_NAME_LEN; if (db_event_get(hDbEvent, &dbei) == 0) if ((dbei.flags & DBEF_SENT) == 0) if (dbei.eventType == ICQEVENTTYPE_SMS) { if (dbei.cbBlob > MIN_SMS_DBEVENT_LEN) { SkinPlaySound("RecvSMSMsg"); if (DB_SMS_GetByte(NULL, "AutoPopup", 0)) { if (RecvSMSWindowAdd(hContact, ICQEVENTTYPE_SMS, NULL, 0, (LPSTR)dbei.pBlob, dbei.cbBlob)) db_event_markRead(hContact, hDbEvent); } else { memcpy(pszServiceFunctionName, SMS_READ, sizeof(SMS_READ)); mir_sntprintf(szToolTip, TranslateT("SMS Message from %s"), pcli->pfnGetContactDisplayName(hContact, 0)); CLISTEVENT cle = {}; cle.flags = CLEF_TCHAR; cle.hContact = hContact; cle.hDbEvent = hDbEvent; cle.hIcon = Skin_LoadIcon(SKINICON_OTHER_SMS); cle.pszService = szServiceFunction; cle.ptszTooltip = szToolTip; pcli->pfnAddEvent(&cle); } } } else if (dbei.eventType == ICQEVENTTYPE_SMSCONFIRMATION) { SkinPlaySound("RecvSMSConfirmation"); if (DB_SMS_GetByte(NULL, "AutoPopup", 0)) { if (RecvSMSWindowAdd(hContact, ICQEVENTTYPE_SMSCONFIRMATION, NULL, 0, (LPSTR)dbei.pBlob, dbei.cbBlob)) db_event_delete(hContact, hDbEvent); } else { UINT iIcon; if (GetDataFromMessage((LPSTR)dbei.pBlob, dbei.cbBlob, NULL, NULL, 0, NULL, &iIcon)) { memcpy(pszServiceFunctionName, SMS_READ_ACK, sizeof(SMS_READ_ACK)); mir_sntprintf(szToolTip, TranslateT("SMS Confirmation from %s"), pcli->pfnGetContactDisplayName(hContact, 0)); CLISTEVENT cle = {}; cle.flags = CLEF_TCHAR; cle.hContact = hContact; cle.hDbEvent = hDbEvent; cle.hIcon = (HICON)LoadImage(ssSMSSettings.hInstance, MAKEINTRESOURCE(iIcon), IMAGE_ICON, 0, 0, LR_SHARED); cle.pszService = szServiceFunction; cle.ptszTooltip = szToolTip; pcli->pfnAddEvent(&cle); } } } MEMFREE(dbei.pBlob); return 0; }
int HookedNewEvent(WPARAM wParam, LPARAM hDBEvent) { logmsg("HookedNewEvent1"); DBEVENTINFO dbe; dbe.cbSize = sizeof(dbe); dbe.cbBlob = db_event_getBlobSize(hDBEvent); if (dbe.cbBlob == -1) return 0; dbe.pBlob = (PBYTE) malloc(dbe.cbBlob); if(db_event_get(hDBEvent,&dbe)) return 0; if (dbe.flags & DBEF_SENT) return 0; if (db_get_b(NULL,THIS_MODULE, "messages", DEFAULT_ANNOUNCEMESSAGES)==0) return 0; if (!(db_get_dw(NULL,THIS_MODULE,"showWhen", DEFAULT_SHOWWHEN)&(1<<(db_get_w(NULL, "CList", "Status", ID_STATUS_OFFLINE)-ID_STATUS_OFFLINE)))) return 0; logmsg("HookedNewEvent2"); TCHAR buf[512]; _tcsncpy(buf, DEFAULT_MESSAGEFORMAT,_countof(buf)); DBVARIANT dbv; if(!db_get_ts(NULL,THIS_MODULE,"message_format",&dbv)) { mir_tstrcpy(buf, dbv.ptszVal); db_free(&dbv); } int i1=-1, i2=-1; TCHAR* pbuf = buf; while (*pbuf) { if (*pbuf=='%') { if (*(pbuf+1)=='n') { if (i1==-1) i1=1; else i2=1; *(pbuf+1)='s'; } else if (*(pbuf+1)=='m') { if (i1==-1) i1=2; else i2=2; *(pbuf+1)='s'; } else if (*(pbuf+1)=='l') { *pbuf=0x0d; *(pbuf+1)=0x0a; } } pbuf++; } TCHAR *c1 = 0, *c2 = 0; if ( i1 == 1 ) c1 = mir_tstrdup(pcli->pfnGetContactDisplayName(wParam, 0)); else if ( i1 == 2 ) c1 = DbGetEventTextT( &dbe, 0 ); if ( i2 == 1 ) c2 = mir_tstrdup(pcli->pfnGetContactDisplayName(wParam, 0)); else if ( i2 == 2 ) c2 = DbGetEventTextT( &dbe, 0 ); TCHAR buffer[512]; mir_sntprintf(buffer, buf, c1, c2); ShowOSD(buffer, 0, db_get_dw(NULL,THIS_MODULE, "clr_msg", DEFAULT_CLRMSG), wParam); mir_free( c1 ); mir_free( c2 ); return 0; }
void OnInitDialog() { char szUin[10]; Window_SetSkinIcon_IcoLib(m_hwnd, SKINICON_OTHER_ADDCONTACT); if (m_acs.handleType == HANDLE_EVENT) { DWORD dwUin; DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = sizeof(DWORD); dbei.pBlob = (PBYTE)&dwUin; db_event_get(m_acs.hDbEvent, &dbei); _ltoa(dwUin, szUin, 10); m_acs.szProto = dbei.szModule; } MCONTACT hContact; TCHAR *szName = NULL, *tmpStr = NULL; if (m_acs.handleType == HANDLE_CONTACT) szName = cli.pfnGetContactDisplayName(hContact = m_acs.hContact, 0); else { int isSet = 0; hContact = 0; if (m_acs.handleType == HANDLE_EVENT) { DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(m_acs.hDbEvent); dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); db_event_get(m_acs.hDbEvent, &dbei); hContact = *(MCONTACT*)(dbei.pBlob + sizeof(DWORD)); mir_free(dbei.pBlob); if (hContact != INVALID_CONTACT_ID) { szName = cli.pfnGetContactDisplayName(hContact, 0); isSet = 1; } } if (!isSet) { if (m_acs.handleType == HANDLE_EVENT) szName = mir_a2t(szUin); else { szName = sttDecodeString(m_acs.psr->flags, m_acs.psr->id); if (!szName) szName = sttDecodeString(m_acs.psr->flags, m_acs.psr->nick); } } } if (szName && szName[0]) SetCaption(CMString(FORMAT, TranslateT("Add %s"), szName)); else SetCaption(TranslateT("Add contact")); mir_free(tmpStr); if (m_acs.handleType == HANDLE_CONTACT && m_acs.hContact) if (m_acs.szProto == NULL || (m_acs.szProto != NULL && *m_acs.szProto == 0)) m_acs.szProto = GetContactProto(m_acs.hContact); int groupSel = 0; ptrT tszGroup(db_get_tsa(hContact, "CList", "Group")); TCHAR *grpName; for (int groupId = 1; (grpName = Clist_GroupGetName(groupId, NULL)) != NULL; groupId++) { int id = m_group.AddString(grpName, groupId); if (!mir_tstrcmpi(tszGroup, grpName)) groupSel = id; } m_group.InsertString(TranslateT("None"), 0); m_group.SetCurSel(groupSel); // By default check both checkboxes m_chkAdded.SetState(true); m_chkAuth.SetState(true); // Set last choice if (db_get_b(NULL, "Miranda", "AuthOpenWindow", 1)) m_chkOpen.SetState(true); DWORD flags = (m_acs.szProto) ? CallProtoServiceInt(NULL, m_acs.szProto, PS_GETCAPS, PFLAGNUM_4, 0) : 0; if (flags & PF4_FORCEADDED) // force you were added requests for this protocol m_chkAdded.Enable(false); if (flags & PF4_FORCEAUTH) // force auth requests for this protocol m_chkAuth.Enable(false); if (flags & PF4_NOCUSTOMAUTH) m_authReq.Enable(false); else { m_authReq.Enable(m_chkAuth.Enabled()); m_authReq.SetText(TranslateT("Please authorize my request and add me to your contact list.")); } }
static INT_PTR CALLBACK DlgProcHistory(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { MCONTACT hContact = (MCONTACT)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); hContact = lParam; WindowList_Add(hWindowList, hwndDlg, hContact); Utils_RestoreWindowPosition(hwndDlg, hContact, "History", ""); { TCHAR* contactName, str[200]; contactName = pcli->pfnGetContactDisplayName(hContact, 0); mir_sntprintf(str, TranslateT("History for %s"), contactName); SetWindowText(hwndDlg, str); } Window_SetIcon_IcoLib(hwndDlg, SKINICON_OTHER_HISTORY); SendMessage(hwndDlg, DM_HREBUILD, 0, 0); return TRUE; case DM_HREBUILD: { THistoryThread* hInfo = (THistoryThread*)mir_alloc(sizeof(THistoryThread)); EnableWindow(GetDlgItem(hwndDlg, IDC_LIST), FALSE); hInfo->hContact = hContact; hInfo->hwnd = hwndDlg; mir_forkthread(FillHistoryThread, hInfo); } return TRUE; case WM_DESTROY: Window_FreeIcon_IcoLib(hwndDlg); Utils_SaveWindowPosition(hwndDlg, hContact, "History", ""); WindowList_Remove(hWindowList, hwndDlg); return TRUE; case WM_GETMINMAXINFO: ((MINMAXINFO*)lParam)->ptMinTrackSize.x = 300; ((MINMAXINFO*)lParam)->ptMinTrackSize.y = 230; break; case WM_SIZE: Utils_ResizeDialog(hwndDlg, hInst, MAKEINTRESOURCEA(IDD_HISTORY), HistoryDlgResizer); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: DestroyWindow(hwndDlg); return TRUE; case IDC_FIND: ShowWindow(CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_HISTORY_FIND), hwndDlg, DlgProcHistoryFind, (LPARAM)hwndDlg), SW_SHOW); return TRUE; case IDC_DELETEHISTORY: MEVENT hDbevent; { int index = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETCURSEL, 0, 0); if (index == LB_ERR) break; if (MessageBox(hwndDlg, TranslateT("Are you sure you want to delete this history item?"), TranslateT("Delete history"), MB_YESNO | MB_ICONQUESTION) == IDYES) { hDbevent = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETITEMDATA, index, 0); db_event_delete(hContact, hDbevent); SendMessage(hwndDlg, DM_HREBUILD, 0, 0); } } return TRUE; case IDC_LIST: if (HIWORD(wParam) == LBN_SELCHANGE) { int sel = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETCURSEL, 0, 0); if (sel == LB_ERR) { EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEHISTORY), FALSE); break; } EnableWindow(GetDlgItem(hwndDlg, IDC_DELETEHISTORY), TRUE); MEVENT hDbEvent = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETITEMDATA, sel, 0); DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); if ((int)dbei.cbBlob != -1) { dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); if (db_event_get(hDbEvent, &dbei) == 0) { TCHAR str[8192]; GetObjectDescription(&dbei, str, _countof(str)); if (str[0]) SetDlgItemText(hwndDlg, IDC_EDIT, str); } mir_free(dbei.pBlob); } } return TRUE; } break; case DM_FINDNEXT: int index = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETCURSEL, 0, 0); if (index == LB_ERR) break; DBEVENTINFO dbei = { sizeof(dbei) }; int oldBlobSize = 0; MEVENT hDbEventStart = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETITEMDATA, index, 0); for (;;) { MEVENT hDbEvent = SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETITEMDATA, ++index, 0); if (hDbEvent == LB_ERR) { index = -1; continue; } if (hDbEvent == hDbEventStart) break; int newBlobSize = db_event_getBlobSize(hDbEvent); if (newBlobSize > oldBlobSize) { dbei.pBlob = (PBYTE)mir_realloc(dbei.pBlob, newBlobSize); oldBlobSize = newBlobSize; } dbei.cbBlob = oldBlobSize; db_event_get(hDbEvent, &dbei); TCHAR str[1024]; GetObjectDescription(&dbei, str, _countof(str)); if (str[0]) { CharUpperBuff(str, (int)mir_tstrlen(str)); if (_tcsstr(str, (const TCHAR*)lParam) != NULL) { SendDlgItemMessage(hwndDlg, IDC_LIST, LB_SETCURSEL, index, 0); SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_LIST, LBN_SELCHANGE), 0); break; } } } mir_free(dbei.pBlob); break; } return FALSE; }
INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HANDLE hDbEvent = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details")); Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list")); hDbEvent = (HANDLE)lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); //blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ) DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); db_event_get(hDbEvent, &dbei); DWORD uin = *(PDWORD)dbei.pBlob; HANDLE hContact = DbGetAuthEventContact(&dbei); char* nick = (char*)dbei.pBlob + sizeof(DWORD)*2; char* first = nick + strlen(nick) + 1; char* last = first + strlen(first) + 1; char* email = last + strlen(last) + 1; SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0)); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0)); PROTOACCOUNT* acc = ProtoGetAccount(dbei.szModule); TCHAR* lastT = dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last); TCHAR* firstT = dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first); TCHAR* nickT = dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick); TCHAR* emailT = dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email); TCHAR name[128] = _T(""); int off = 0; if (firstT[0] && lastT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s %s"), firstT, lastT); else if (firstT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s"), firstT); else if (lastT[0]) off = mir_sntprintf(name, SIZEOF(name), _T("%s"), lastT); if (nickT[0]) { if (off) mir_sntprintf(name + off, SIZEOF(name) - off, _T(" (%s)"), nickT); else mir_sntprintf(name, SIZEOF(name), _T("%s"), nickT); } if ( !name[0]) _tcscpy(name, TranslateT("<Unknown>")); TCHAR hdr[256]; if (uin && emailT[0]) mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u (%s) on %s"), name, uin, emailT, acc->tszAccountName); else if (uin) mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u on %s"), name, uin, acc->tszAccountName); else mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%s on %s"), name, emailT[0] ? emailT : TranslateT("(Unknown)"), acc->tszAccountName); SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr); mir_free(lastT); mir_free(firstT); mir_free(nickT); mir_free(emailT); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact); if (hContact == INVALID_HANDLE_VALUE || !db_get_b(hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ADD: { ADDCONTACTSTRUCT acs = {0}; acs.handle = hDbEvent; acs.handleType = HANDLE_EVENT; acs.szProto = ""; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); if ((hContact == INVALID_HANDLE_VALUE) || !db_get_b(hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); break; } case IDC_DETAILS: { HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); break; } case IDOK: { ADDCONTACTSTRUCT acs = {0}; acs.handle = hDbEvent; acs.handleType = HANDLE_EVENT; acs.szProto = ""; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); } //fall through case IDCANCEL: DestroyWindow(hwndDlg); break; } break; case WM_DESTROY: Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); break; } return FALSE; }