From 5560fccb85a89bb668a79eed3d4cd0e668278331 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Sat, 20 Apr 2013 10:14:05 +0000 Subject: - temporary commit. may contain non-working code git-svn-id: http://svn.miranda-ng.org/main/trunk@4480 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Skype/src/skype_database.cpp | 156 ++++++++++++++++++++++----------- 1 file changed, 105 insertions(+), 51 deletions(-) (limited to 'protocols/Skype/src/skype_database.cpp') diff --git a/protocols/Skype/src/skype_database.cpp b/protocols/Skype/src/skype_database.cpp index 50fac3651f..8623d08a7b 100644 --- a/protocols/Skype/src/skype_database.cpp +++ b/protocols/Skype/src/skype_database.cpp @@ -17,17 +17,34 @@ HANDLE CSkypeProto::AddDataBaseEvent(HANDLE hContact, WORD type, DWORD time, DWO void CSkypeProto::RaiseAuthRequestEvent( DWORD timestamp, - const char* sid, - const char* nick, - const char* firstName, - const char* lastName, - const char* reason) + CContact::Ref contact) { + SEString data; + + contact->GetPropSkypename(data); + char *sid = ::mir_strdup(data); + + contact->GetPropDisplayname(data); + char *nick = ::mir_utf8decodeA(data); + + contact->GetPropReceivedAuthrequest(data); + char* reason = ::mir_utf8decodeA((const char*)data); + + contact->GetPropFullname(data); + char* fullname = ::mir_utf8decodeA((const char*)data); + + char* firstName = strtok(fullname, " "); + char* lastName = strtok(NULL, " "); + if (lastName == NULL) + { + lastName = ""; + } + PROTORECVEVENT pre = {0}; CCSDATA ccs = {0}; ccs.szProtoService = PSR_AUTH; - ccs.hContact = this->AddContactBySid(sid, nick); + ccs.hContact = this->AddContact(contact); ccs.wParam = 0; ccs.lParam = (LPARAM)⪯ pre.timestamp = timestamp; @@ -54,62 +71,99 @@ void CSkypeProto::RaiseAuthRequestEvent( ::CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs); } +bool CSkypeProto::IsMessageInDB(HANDLE hContact, DWORD timestamp, const char* message, int flag) +{ + bool result = false; + + int length = ::strlen(message); + + HANDLE hDbEvent = ::db_event_last(hContact); + while (hDbEvent) + { + DBEVENTINFO dbei = { sizeof(dbei) }; + dbei.cbBlob = ::db_event_getBlobSize(hDbEvent); + dbei.pBlob = (PBYTE)::mir_alloc(dbei.cbBlob); + ::db_event_get(hDbEvent, &dbei); + + if (dbei.timestamp < timestamp) + { + ::mir_free(dbei.pBlob); + break; + } + + int sendFlag = dbei.flags & DBEF_SENT; + if (dbei.eventType == EVENTTYPE_MESSAGE && sendFlag == flag) + { + char *dbMessage = (char *)dbei.pBlob; + if (::strncmp(dbMessage, message, length) == 0 && dbei.timestamp == timestamp) + { + ::mir_free(dbei.pBlob); + result = true; + break; + } + } + + ::mir_free(dbei.pBlob); + hDbEvent = ::db_event_prev(hDbEvent); + } + + return result; +} + void CSkypeProto::RaiseMessageReceivedEvent( + HANDLE hContact, DWORD timestamp, - const char* sid, - const char* nick, - const char* message) + const char* message, + bool isNeedCheck) { - PROTORECVEVENT pre = {0}; + if (isNeedCheck) + if (this->IsMessageInDB(hContact, timestamp, message)) + return; - CCSDATA ccs = {0}; - ccs.szProtoService = PSR_MESSAGE; - ccs.hContact = this->AddContactBySid(sid, nick); - ccs.wParam = 0; - ccs.lParam = (LPARAM)⪯ - pre.flags = PREF_UTF; - pre.timestamp = timestamp; - pre.szMessage = (char *)message; + PROTORECVEVENT recv; + recv.flags = PREF_UTF; + recv.timestamp = timestamp; + recv.szMessage = ::mir_strdup(message); - ::CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs); + ::ProtoChainRecvMsg(hContact, &recv); } void CSkypeProto::RaiseMessageSendedEvent( + HANDLE hContact, DWORD timestamp, - const char* sid, - const char* nick, const char* message) { - PROTORECVEVENT pre = {0}; + if (this->IsMessageInDB(hContact, timestamp, message, DBEF_SENT)) + return; - CCSDATA ccs = {0}; - ccs.szProtoService = PSR_MESSAGE; - ccs.hContact = this->AddContactBySid(sid, nick); - ccs.wParam = 0; - ccs.lParam = (LPARAM)⪯ - pre.flags = PREF_UTF; - pre.timestamp = timestamp; - pre.szMessage = (char *)message; - - ::CallService(MS_PROTO_CHAINSEND, 0, (LPARAM)&ccs); -} + DBEVENTINFO dbei = { 0 }; + dbei.cbSize = sizeof(dbei); + dbei.szModule = this->m_szModuleName; + dbei.timestamp = timestamp; + dbei.eventType = EVENTTYPE_MESSAGE; + dbei.cbBlob = (DWORD)::strlen(message) + 1; + dbei.pBlob = (PBYTE)::mir_strdup(message); + dbei.flags = DBEF_UTF | DBEF_SENT; -void CSkypeProto::RaiseFileReceivedEvent( - DWORD timestamp, - const char* sid, - const char* nick, - const char* message) -{ - PROTORECVFILET pre = {0}; + ::db_event_add(hContact, &dbei); +} - CCSDATA ccs = {0}; - ccs.szProtoService = PSR_FILE; - ccs.hContact = this->AddContactBySid(sid, nick); - ccs.wParam = 0; - ccs.lParam = (LPARAM)⪯ - pre.flags = PREF_UTF; - pre.timestamp = timestamp; - //pre.szMessage = (char *)message; - - ::CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs); -} \ No newline at end of file +//void CSkypeProto::RaiseFileReceivedEvent( +// DWORD timestamp, +// const char* sid, +// const char* nick, +// const char* message) +//{ +// PROTORECVFILET pre = {0}; +// +// CCSDATA ccs = {0}; +// ccs.szProtoService = PSR_FILE; +// ccs.hContact = this->AddContactBySid(sid, nick); +// ccs.wParam = 0; +// ccs.lParam = (LPARAM)⪯ +// pre.flags = PREF_UTF; +// pre.timestamp = timestamp; +// //pre.szMessage = (char *)message; +// +// ::CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs); +//} \ No newline at end of file -- cgit v1.2.3