summaryrefslogtreecommitdiff
path: root/protocols/Skype/src
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Skype/src')
-rw-r--r--protocols/Skype/src/skype_account.cpp1
-rw-r--r--protocols/Skype/src/skype_contacts.cpp22
-rw-r--r--protocols/Skype/src/skype_database.cpp22
-rw-r--r--protocols/Skype/src/skype_events.cpp114
-rw-r--r--protocols/Skype/src/skype_profile.cpp20
-rw-r--r--protocols/Skype/src/skype_proto.h13
6 files changed, 107 insertions, 85 deletions
diff --git a/protocols/Skype/src/skype_account.cpp b/protocols/Skype/src/skype_account.cpp
index 7091dc35ab..fa29bafbef 100644
--- a/protocols/Skype/src/skype_account.cpp
+++ b/protocols/Skype/src/skype_account.cpp
@@ -254,7 +254,6 @@ void CSkypeProto::OnCblUpdated()
{
// reload our CL after skype CL fully synced
this->LoadContactList(reinterpret_cast<void *>(static_cast<int>(false)));
- this->LoadAuthWaitList(this);
}
void CSkypeProto::OnLoggedOut(CAccount::LOGOUTREASON reason)
diff --git a/protocols/Skype/src/skype_contacts.cpp b/protocols/Skype/src/skype_contacts.cpp
index 11f36f8c43..0f805c2326 100644
--- a/protocols/Skype/src/skype_contacts.cpp
+++ b/protocols/Skype/src/skype_contacts.cpp
@@ -44,6 +44,17 @@ void CSkypeProto::UpdateContactStatus(HANDLE hContact, CContact::Ref contact)
}
}
+void CSkypeProto::UpdateContactNickName(SEObject *obj, HANDLE hContact)
+{
+ // todo: P_DISPLAYNAME = 21 is unworked
+ wchar_t *nick = ::mir_utf8decodeW(obj->GetStrProp(/* *::P_FULLNAME */ 5));
+ if ( !::wcslen(nick))
+ ::db_unset(hContact, this->m_szModuleName, "Nick");
+ else
+ ::db_set_ws(hContact, this->m_szModuleName, "Nick", nick);
+ ::mir_free(nick);
+}
+
void CSkypeProto::UpdateContactOnlineSinceTime(SEObject *obj, HANDLE hContact)
{
uint newTS = obj->GetUintProp(/* CContact::P_LASTONLINE_TIMESTAMP */35);
@@ -267,7 +278,16 @@ void __cdecl CSkypeProto::LoadContactList(void* data)
this->UpdateContactAuthState(hContact, contact);
this->UpdateContactStatus(hContact, contact);
- this->UpdateProfileNickName(contact.fetch(), hContact);
+ wchar_t *nick = ::db_get_wsa(hContact, "CList", "MyHandle");
+ if ( !nick || !::wcslen(nick))
+ {
+ SEString data;
+ contact->GetPropFullname(data);
+
+ mir_ptr<wchar_t> nick = ::mir_utf8decodeW(data);
+ ::db_set_ws(hContact, "CList", "MyHandle", nick);
+ }
+
this->UpdateProfile(contact.fetch(), hContact);
}
}
diff --git a/protocols/Skype/src/skype_database.cpp b/protocols/Skype/src/skype_database.cpp
index 9ed2a21797..86bd7a49ac 100644
--- a/protocols/Skype/src/skype_database.cpp
+++ b/protocols/Skype/src/skype_database.cpp
@@ -91,9 +91,9 @@ void CSkypeProto::RaiseAuthRequestEvent(DWORD timestamp, CContact::Ref contact)
this->AddDBEvent(hContact, EVENTTYPE_AUTHREQUEST, time(NULL), PREF_UTF, cbBlob, pBlob);
}
-void CSkypeProto::RaiseMessageReceivedEvent(HANDLE hContact, DWORD timestamp, const char *guid, const wchar_t *message, bool isNeedCheck)
+void CSkypeProto::RaiseMessageReceivedEvent(HANDLE hContact, DWORD timestamp, const char *guid, const char *message, bool isUnreaded)
{
- if (isNeedCheck)
+ if ( !isUnreaded)
if (this->IsMessageInDB(hContact, timestamp, guid))
return;
@@ -101,23 +101,33 @@ void CSkypeProto::RaiseMessageReceivedEvent(HANDLE hContact, DWORD timestamp, co
recv.flags = PREF_UTF;
recv.lParam = (LPARAM)guid;
recv.timestamp = timestamp;
- recv.szMessage = ::mir_utf8encodeW(message);
+ recv.szMessage = ::mir_strdup(message);
::ProtoChainRecvMsg(hContact, &recv);
}
-void CSkypeProto::RaiseMessageSendedEvent(HANDLE hContact, DWORD timestamp, const char *guid, const wchar_t *message)
+void CSkypeProto::RaiseMessageSendedEvent(HANDLE hContact, DWORD timestamp, const char *guid, const char *message, bool isUnreaded)
{
if (this->IsMessageInDB(hContact, timestamp, guid, DBEF_SENT))
return;
int guidLen = ::strlen(guid);
- char *msg = ::mir_utf8encodeW(message);
+ char *msg = ::mir_strdup(message);
int msgLen = ::strlen(msg) + 1;
msg = (char *)::mir_realloc(msg, msgLen + 32);
::memcpy((char *)&msg[msgLen], guid, 32);
- this->AddDBEvent(hContact, EVENTTYPE_MESSAGE, timestamp, PREF_UTF | DBEF_SENT, msgLen + guidLen, (PBYTE)msg);
+ DWORD flags = DBEF_UTF | DBEF_SENT;
+ if ( !isUnreaded)
+ flags |= DBEF_READ;
+
+ this->AddDBEvent(
+ hContact,
+ EVENTTYPE_MESSAGE,
+ timestamp,
+ flags,
+ msgLen + guidLen,
+ (PBYTE)msg);
} \ No newline at end of file
diff --git a/protocols/Skype/src/skype_events.cpp b/protocols/Skype/src/skype_events.cpp
index 28a003453d..c41ff0975c 100644
--- a/protocols/Skype/src/skype_events.cpp
+++ b/protocols/Skype/src/skype_events.cpp
@@ -65,6 +65,58 @@ int CSkypeProto::OnMessagePreCreate(WPARAM, LPARAM lParam)
return 1;
}
+void CSkypeProto::OnMessageReceived(CConversation::Ref &conversation, CMessage::Ref &message)
+{
+ SEString data;
+
+ uint timestamp;
+ message->GetPropTimestamp(timestamp);
+
+ CMessage::CONSUMPTION_STATUS status;
+ message->GetPropConsumptionStatus(status);
+
+ message->GetPropBodyXml(data);
+ char *text = CSkypeProto::RemoveHtml(data);
+
+ CConversation::TYPE type;
+ conversation->GetPropType(type);
+ if (type == CConversation::DIALOG)
+ {
+ message->GetPropAuthor(data);
+
+ CContact::Ref author;
+ g_skype->GetContact(data, author);
+
+ HANDLE hContact = this->AddContact(author);
+
+ SEBinary guid;
+ message->GetPropGuid(guid);
+
+ char *cguid = ::mir_strdup(guid.data());
+ cguid[guid.size()] = 0;
+
+ this->RaiseMessageReceivedEvent(
+ hContact,
+ timestamp,
+ cguid,
+ text,
+ status == CMessage::UNCONSUMED_NORMAL);
+ }
+ else
+ {
+ message->GetPropAuthor(data);
+ wchar_t *sid = ::mir_utf8decodeW(data);
+
+ conversation->GetPropIdentity(data);
+ wchar_t *cid = ::mir_utf8decodeW(data);
+
+ this->SendChatMessage(cid, sid, ::mir_utf8decodeW(text));
+
+ ::mir_free(sid);
+ ::mir_free(cid);
+ }
+}
+
void CSkypeProto::OnMessageSended(CConversation::Ref &conversation, CMessage::Ref &message)
{
SEString data;
@@ -79,7 +131,7 @@ void CSkypeProto::OnMessageSended(CConversation::Ref &conversation, CMessage::Re
message->GetPropConsumptionStatus(status);
message->GetPropBodyXml(data);
- wchar_t *text = ::mir_utf8decodeW(CSkypeProto::RemoveHtml(data));
+ char *text = CSkypeProto::RemoveHtml(data);
CConversation::TYPE type;
conversation->GetPropType(type);
@@ -112,7 +164,8 @@ void CSkypeProto::OnMessageSended(CConversation::Ref &conversation, CMessage::Re
hContact,
timestamp,
cguid,
- text);
+ text,
+ status == CMessage::UNCONSUMED_NORMAL);
}
}
else
@@ -126,68 +179,13 @@ void CSkypeProto::OnMessageSended(CConversation::Ref &conversation, CMessage::Re
nick = ::db_get_wsa(NULL, this->m_szModuleName, SKYPE_SETTINGS_LOGIN);
}
- this->SendChatMessage(cid, nick, text);
+ this->SendChatMessage(cid, nick, ::mir_utf8decodeW(text));
::mir_free(nick);
::mir_free(cid);
}
-
- ::mir_free(text);
}
-void CSkypeProto::OnMessageReceived(CConversation::Ref &conversation, CMessage::Ref &message)
-{
- SEString data;
-
- uint timestamp;
- message->GetPropTimestamp(timestamp);
-
- CMessage::CONSUMPTION_STATUS status;
- message->GetPropConsumptionStatus(status);
-
- message->GetPropBodyXml(data);
- wchar_t *text = ::mir_utf8decodeW(CSkypeProto::RemoveHtml(data));
-
- CConversation::TYPE type;
- conversation->GetPropType(type);
- if (type == CConversation::DIALOG)
- {
- message->GetPropAuthor(data);
-
- CContact::Ref author;
- g_skype->GetContact(data, author);
-
- HANDLE hContact = this->AddContact(author);
-
- SEBinary guid;
- message->GetPropGuid(guid);
-
- char *cguid = ::mir_strdup(guid.data());
- cguid[guid.size()] = 0;
-
- this->RaiseMessageReceivedEvent(
- hContact,
- timestamp,
- cguid,
- text,
- status != CMessage::UNCONSUMED_NORMAL);
- }
- else
- {
- message->GetPropAuthor(data);
- wchar_t *sid = ::mir_utf8decodeW(data);
-
- conversation->GetPropIdentity(data);
- wchar_t *cid = ::mir_utf8decodeW(data);
-
- this->SendChatMessage(cid, sid, text);
-
- ::mir_free(sid);
- ::mir_free(cid);
- }
-
- ::mir_free(text);
-}
void CSkypeProto::OnTransferChanged(CTransfer::Ref transfer, int prop)
{
diff --git a/protocols/Skype/src/skype_profile.cpp b/protocols/Skype/src/skype_profile.cpp
index 4d7af22d45..bbe9eb4a87 100644
--- a/protocols/Skype/src/skype_profile.cpp
+++ b/protocols/Skype/src/skype_profile.cpp
@@ -1,7 +1,7 @@
#include "skype_proto.h"
SettingItem CSkypeProto::setting[] = {
- {LPGENT("Full name"), "Nick", DBVT_WCHAR, LI_STRING},
+ {LPGENT("Nick"), "Nick", DBVT_WCHAR, LI_STRING},
{LPGENT("Mood"), "XStatusMsg", DBVT_WCHAR, LI_STRING},
{LPGENT("Mobile phone"), "Cellular", DBVT_WCHAR, LI_NUMBER},
@@ -263,14 +263,6 @@ void CSkypeProto::UpdateProfileMobilePhone(SEObject *obj, HANDLE hContact)
::mir_free(phone);
}
-void CSkypeProto::UpdateProfileNickName(SEObject *obj, HANDLE hContact)
-{
- wchar_t *nick = ::mir_utf8decodeW(obj->GetStrProp(/* *::P_DISPLAYNAME */ 21));
- if (::wcslen(nick))
- ::db_set_ws(hContact, this->m_szModuleName, "Nick", nick);
- ::mir_free(nick);
-}
-
void CSkypeProto::UpdateProfilePhone(SEObject *obj, HANDLE hContact)
{
wchar_t* phone = ::mir_a2u(obj->GetStrProp(/* *::P_PHONE_HOME */ 13));
@@ -366,6 +358,7 @@ void CSkypeProto::UpdateProfile(SEObject *obj, HANDLE hContact)
if (hContact)
{
+ this->UpdateContactNickName(obj, hContact);
this->UpdateContactOnlineSinceTime(obj, hContact);
this->UpdateContactLastEventDate(obj, hContact);
@@ -379,9 +372,14 @@ void CSkypeProto::UpdateProfile(SEObject *obj, HANDLE hContact)
void __cdecl CSkypeProto::LoadOwnInfo(void*)
{
wchar_t *nick = ::db_get_wsa(NULL, this->m_szModuleName, "Nick");
- if (!nick || !::wcslen(nick))
+ if ( !nick || !::wcslen(nick))
{
- ::db_set_ws(NULL, this->m_szModuleName, "Nick", this->login);
+ SEString data;
+ this->account->GetPropFullname(data);
+
+ mir_ptr<wchar_t> nick = ::mir_utf8decodeW(data);
+ ::db_set_ws(NULL, this->m_szModuleName, "Nick", nick);
}
+
this->UpdateProfile(this->account.fetch());
} \ No newline at end of file
diff --git a/protocols/Skype/src/skype_proto.h b/protocols/Skype/src/skype_proto.h
index 5ad86dfc6b..031bcfb1ea 100644
--- a/protocols/Skype/src/skype_proto.h
+++ b/protocols/Skype/src/skype_proto.h
@@ -340,6 +340,7 @@ protected:
void UpdateContactAuthState(HANDLE hContact, CContact::Ref contact);
void UpdateContactAvatar(HANDLE hContact, CContact::Ref contact);
void UpdateContactStatus(HANDLE hContact, CContact::Ref contact);
+ void UpdateContactNickName(SEObject *obj, HANDLE hContact);
void UpdateContactOnlineSinceTime(SEObject *obj, HANDLE hContact);
void UpdateContactLastEventDate(SEObject *obj, HANDLE hContact);
@@ -472,18 +473,14 @@ protected:
HANDLE hContact,
DWORD timestamp,
const char* guid,
- const wchar_t *message,
- bool isNeedCheck = true);
+ const char *message,
+ bool isUnreaded = true);
void RaiseMessageSendedEvent(
HANDLE hContact,
DWORD timestamp,
const char* guid,
- const wchar_t *message);
- /*void RaiseFileReceivedEvent(
- DWORD timestamp,
- const char* sid,
- const char* nick,
- const char* message);*/
+ const char *message,
+ bool isUnreaded = true);
void RaiseAuthRequestEvent(
DWORD timestamp,
CContact::Ref contact);