summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Skype/src/skype_contacts.cpp13
-rw-r--r--protocols/Skype/src/skype_database.cpp6
-rw-r--r--protocols/Skype/src/skype_proto.cpp86
-rw-r--r--protocols/Skype/src/skype_proto.h4
-rw-r--r--protocols/Skype/src/skype_subclassing.cpp11
-rw-r--r--protocols/Skype/src/skype_subclassing.h4
-rw-r--r--protocols/Skype/src/skype_utils.cpp10
7 files changed, 104 insertions, 30 deletions
diff --git a/protocols/Skype/src/skype_contacts.cpp b/protocols/Skype/src/skype_contacts.cpp
index 500878ac08..e92fc135b7 100644
--- a/protocols/Skype/src/skype_contacts.cpp
+++ b/protocols/Skype/src/skype_contacts.cpp
@@ -565,7 +565,7 @@ HANDLE CSkypeProto::GetContactFromAuthEvent(HANDLE hEvent)
return ::DbGetAuthEventContact(&dbei);
}
-HANDLE CSkypeProto::AddContactBySid(const char* sid, const wchar_t* nick, DWORD flags)
+HANDLE CSkypeProto::AddContactBySid(const char* sid, const char* nick, DWORD flags)
{
HANDLE hContact = this->GetContactBySid(sid);
if ( !hContact)
@@ -574,7 +574,7 @@ HANDLE CSkypeProto::AddContactBySid(const char* sid, const wchar_t* nick, DWORD
::CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContact, (LPARAM)this->m_szModuleName);
::DBWriteContactSettingString(hContact, this->m_szModuleName, "sid", sid);
- this->SetSettingString(hContact, "Nick", nick);
+ ::DBWriteContactSettingString(hContact, this->m_szModuleName, "Nick", nick);
CContact::Ref contact;
if (g_skype->GetContact(sid, contact))
@@ -690,13 +690,13 @@ void __cdecl CSkypeProto::LoadContactList(void*)
SEString data;
contact->GetPropSkypename(data);
- const char *sid = (const char *)data;
+ char *sid = ::mir_strdup((const char *)data);
contact->GetPropDisplayname(data);
- wchar_t *nick = ::mir_utf8decodeW((const char *)data);
+ char *nick = ::mir_strdup((const char *)data);
contact->GetPropFullname(data);
- wchar_t *name = ::mir_utf8decodeW((const char *)data);
+ char *name = ::mir_strdup((const char *)data);
DWORD flags = 0;
CContact::AVAILABILITY availability;
@@ -706,7 +706,8 @@ void __cdecl CSkypeProto::LoadContactList(void*)
{
flags |= 256;
contact->GetPropPstnnumber(data);
- sid = (const char *)data;
+ ::mir_free(sid);
+ sid = ::mir_strdup((const char *)data);
}
else if (availability == CContact::PENDINGAUTH)
flags = PALF_TEMPORARY;
diff --git a/protocols/Skype/src/skype_database.cpp b/protocols/Skype/src/skype_database.cpp
index 887061afbe..9d87b9b2c7 100644
--- a/protocols/Skype/src/skype_database.cpp
+++ b/protocols/Skype/src/skype_database.cpp
@@ -27,7 +27,7 @@ void CSkypeProto::RaiseAuthRequestEvent(
CCSDATA ccs = {0};
ccs.szProtoService = PSR_AUTH;
- ccs.hContact = this->AddContactBySid(sid, ::mir_a2u(nick));
+ ccs.hContact = this->AddContactBySid(sid, nick);
ccs.wParam = 0;
ccs.lParam = (LPARAM)⪯
pre.timestamp = timestamp;
@@ -64,7 +64,7 @@ void CSkypeProto::RaiseMessageReceivedEvent(
CCSDATA ccs = {0};
ccs.szProtoService = PSR_MESSAGE;
- ccs.hContact = this->AddContactBySid(sid, ::mir_a2u(nick));
+ ccs.hContact = this->AddContactBySid(sid, nick);
ccs.wParam = 0;
ccs.lParam = (LPARAM)⪯
pre.flags = PREF_UTF;
@@ -84,7 +84,7 @@ void CSkypeProto::RaiseMessageSendedEvent(
CCSDATA ccs = {0};
ccs.szProtoService = PSR_MESSAGE;
- ccs.hContact = this->AddContactBySid(sid, ::mir_a2u(nick));
+ ccs.hContact = this->AddContactBySid(sid, nick);
ccs.wParam = 0;
ccs.lParam = (LPARAM)⪯
pre.flags = PREF_UTF;
diff --git a/protocols/Skype/src/skype_proto.cpp b/protocols/Skype/src/skype_proto.cpp
index 85a91146dd..c4bd2c6a30 100644
--- a/protocols/Skype/src/skype_proto.cpp
+++ b/protocols/Skype/src/skype_proto.cpp
@@ -44,7 +44,8 @@ CSkypeProto::~CSkypeProto()
HANDLE __cdecl CSkypeProto::AddToList(int flags, PROTOSEARCHRESULT* psr)
{
- return this->AddContactBySid(::mir_u2a(psr->id), psr->nick, 0);
+ //todo:ref
+ return this->AddContactBySid(::mir_u2a(psr->id), ::mir_u2a(psr->nick), 0);
}
HANDLE __cdecl CSkypeProto::AddToListByEvent(int flags, int iContact, HANDLE hDbEvent)
@@ -233,8 +234,9 @@ int __cdecl CSkypeProto::SendMsg(HANDLE hContact, int flags, const char* msg)
{
int result = ::InterlockedIncrement((LONG volatile*)&dwCMDNum);
- CConversation::Ref conversation;
- g_skype->GetConversationByIdentity(::mir_u2a(this->GetSettingString(hContact, "sid")), conversation);
+ CConversation::Ref conversation = CConversation::FindBySid(
+ g_skype,
+ ::DBGetString(hContact, this->m_szModuleName, "sid"));
if (conversation)
{
Message::Ref message;
@@ -307,22 +309,27 @@ int __cdecl CSkypeProto::UserIsTyping( HANDLE hContact, int type )
{
if (hContact && this->IsOnline() && this->m_iStatus != ID_STATUS_INVISIBLE)
{
- CConversation::Ref conversation;
- g_skype->GetConversationByIdentity(::mir_u2a(this->GetSettingString(hContact, "sid")), conversation);
- if (conversation)
+ if (::strcmp(::DBGetString(hContact, this->m_szModuleName, "sid"), this->login) != 0)
{
- switch (type)
+ CConversation::Ref conversation = CConversation::FindBySid(
+ g_skype,
+ ::DBGetString(hContact, this->m_szModuleName, "sid"));
+ if (conversation)
{
- case PROTOTYPE_SELFTYPING_ON:
- conversation->SetMyTextStatusTo(Participant::WRITING);
- return 0;
-
- case PROTOTYPE_SELFTYPING_OFF:
- conversation->SetMyTextStatusTo(Participant::READING); // mb TEXT_UNKNOWN?
- return 0;
+ switch (type)
+ {
+ case PROTOTYPE_SELFTYPING_ON:
+ conversation->SetMyTextStatusTo(Participant::WRITING);
+ return 0;
+
+ case PROTOTYPE_SELFTYPING_OFF:
+ conversation->SetMyTextStatusTo(Participant::READING); // mb TEXT_UNKNOWN?
+ return 0;
+ }
}
}
}
+
return 1;
}
@@ -379,6 +386,57 @@ bool CSkypeProto::SignIn(bool isReadPassword)
this->account->SetOnAccountChangedCallback(
(CAccount::OnAccountChanged)&CSkypeProto::OnAccountChanged,
this);
+ //
+ if (this->hNetlibUser)
+ {
+ NETLIBUSERSETTINGS nlus = { sizeof(NETLIBUSERSETTINGS) };
+ if (
+ !::CallService(MS_NETLIB_GETUSERSETTINGS, (WPARAM)this->hNetlibUser, (LPARAM)&nlus) &&
+ nlus.useProxy)
+ {
+ char address[MAX_PATH];
+ ::mir_snprintf(address, MAX_PATH, "%s:%d", nlus.szProxyServer, nlus.wProxyPort);
+
+ switch (nlus.proxyType)
+ {
+ case PROXYTYPE_HTTP:
+ case PROXYTYPE_HTTPS:
+ g_skype->SetInt(SETUPKEY_HTTPS_PROXY_ENABLE, 1);
+ g_skype->SetInt(SETUPKEY_SOCKS_PROXY_ENABLE, 0);
+ g_skype->SetStr(SETUPKEY_HTTPS_PROXY_ADDR, address);
+ if (nlus.useProxyAuth)
+ {
+ g_skype->SetStr(SETUPKEY_HTTPS_PROXY_USER, nlus.szProxyAuthUser);
+ g_skype->SetStr(SETUPKEY_HTTPS_PROXY_PWD, nlus.szProxyAuthPassword);
+ }
+ break;
+
+ case PROXYTYPE_SOCKS4:
+ case PROXYTYPE_SOCKS5:
+ g_skype->SetInt(SETUPKEY_HTTPS_PROXY_ENABLE, 0);
+ g_skype->SetInt(SETUPKEY_SOCKS_PROXY_ENABLE, 1);
+ g_skype->SetStr(SETUPKEY_SOCKS_PROXY_ADDR, address);
+ if (nlus.useProxyAuth)
+ {
+ g_skype->SetStr(SETUPKEY_SOCKS_PROXY_USER, nlus.szProxyAuthUser);
+ g_skype->SetStr(SETUPKEY_SOCKS_PROXY_PWD, nlus.szProxyAuthPassword);
+ }
+ break;
+
+ default:
+ g_skype->Delete(SETUPKEY_HTTPS_PROXY_ENABLE);
+ g_skype->Delete(SETUPKEY_HTTPS_PROXY_ADDR);
+ g_skype->Delete(SETUPKEY_HTTPS_PROXY_USER);
+ g_skype->Delete(SETUPKEY_HTTPS_PROXY_PWD);
+ g_skype->Delete(SETUPKEY_SOCKS_PROXY_ENABLE);
+ g_skype->Delete(SETUPKEY_SOCKS_PROXY_ADDR);
+ g_skype->Delete(SETUPKEY_SOCKS_PROXY_USER);
+ g_skype->Delete(SETUPKEY_SOCKS_PROXY_PWD);
+ break;
+ }
+ }
+ }
+ //
this->account->LoginWithPassword(this->password, false, false);
return true;
}
diff --git a/protocols/Skype/src/skype_proto.h b/protocols/Skype/src/skype_proto.h
index 8a5eae3498..db10c7522e 100644
--- a/protocols/Skype/src/skype_proto.h
+++ b/protocols/Skype/src/skype_proto.h
@@ -206,7 +206,7 @@ protected:
bool IsProtoContact(HANDLE hContact);
HANDLE GetContactBySid(const char* sid);
HANDLE GetContactFromAuthEvent(HANDLE hEvent);
- HANDLE AddContactBySid(const char* skypeName, const wchar_t* nick, DWORD flags = 0);
+ HANDLE AddContactBySid(const char* sid, const char* nick, DWORD flags = 0);
int SkypeToMirandaStatus(CContact::AVAILABILITY availability);
CContact::AVAILABILITY MirandaToSkypeStatus(int status);
@@ -251,7 +251,7 @@ protected:
int SkypeToMirandaLoginError(CAccount::LOGOUTREASON logoutReason);
- void ShowNotification(const char *sid, const wchar_t *message, int flags = 0);
+ void ShowNotification(const char *nick, const wchar_t *message, int flags = 0);
// instances
static LIST<CSkypeProto> instanceList;
diff --git a/protocols/Skype/src/skype_subclassing.cpp b/protocols/Skype/src/skype_subclassing.cpp
index adbd6a5120..d8843a800f 100644
--- a/protocols/Skype/src/skype_subclassing.cpp
+++ b/protocols/Skype/src/skype_subclassing.cpp
@@ -197,6 +197,17 @@ void CConversation::OnMessage(const MessageRef & message)
(proto->*callback)(message->ref());
}
+CConversation::Ref CConversation::FindBySid(CSkype *skype, SEString sid)
+{
+ SEStringList participants;
+ participants.append(sid);
+
+ CConversation::Ref conversation;
+ skype->GetConversationByParticipants(participants, conversation);
+
+ return conversation;
+}
+
void CConversation::SetOnMessageReceivedCallback(OnMessageReceived callback, CSkypeProto* proto)
{
this->proto = proto;
diff --git a/protocols/Skype/src/skype_subclassing.h b/protocols/Skype/src/skype_subclassing.h
index 2624ba3f76..f2d571ae98 100644
--- a/protocols/Skype/src/skype_subclassing.h
+++ b/protocols/Skype/src/skype_subclassing.h
@@ -7,6 +7,8 @@
struct CSkypeProto;
+class CSkype;
+
class CMessage : public Message
{
public:
@@ -27,6 +29,8 @@ public:
CConversation(unsigned int oid, SERootObject* root);
+ static CConversation::Ref FindBySid(CSkype *skype, SEString sid);
+
void SetOnMessageReceivedCallback(OnMessageReceived callback, CSkypeProto* proto);
private:
diff --git a/protocols/Skype/src/skype_utils.cpp b/protocols/Skype/src/skype_utils.cpp
index a43c621769..73df520aa0 100644
--- a/protocols/Skype/src/skype_utils.cpp
+++ b/protocols/Skype/src/skype_utils.cpp
@@ -452,20 +452,20 @@ int CSkypeProto::SkypeToMirandaLoginError(CAccount::LOGOUTREASON logoutReason)
return loginError;
}
-void CSkypeProto::ShowNotification(const char *sid, const wchar_t *message, int flags)
+void CSkypeProto::ShowNotification(const char *nick, const wchar_t *message, int flags)
{
if (::Miranda_Terminated()) return;
- if ( !ServiceExists(MS_POPUP_ADDPOPUPEX) || !DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1))
+ if ( !ServiceExists(MS_POPUP_ADDPOPUPT) || !DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1))
MessageBoxW(NULL, message, TranslateT("Skype Protocol"), MB_OK);
else {
- if ( !sid)
- sid = "";
+ if ( !nick)
+ nick = "";
POPUPDATAT_V2 ppd = {0};
ppd.cbSize = sizeof(POPUPDATAT_V2);
ppd.lchContact = NULL;
- lstrcpyn(ppd.lpwzContactName, ::mir_a2u(sid), MAX_CONTACTNAME);
+ lstrcpyn(ppd.lpwzContactName, ::mir_a2u(nick), MAX_CONTACTNAME);
lstrcpyn(ppd.lpwzText, message, MAX_SECONDLINE);
ppd.lchIcon = Skin_GetIcon("Skype_main");
ppd.colorBack = ppd.colorText = 0;