summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Skype/src/skype_contacts.cpp2
-rw-r--r--protocols/Skype/src/skype_proto.cpp93
-rw-r--r--protocols/Skype/src/skype_proto.h4
-rw-r--r--protocols/Skype/src/skype_subclassing.cpp6
-rw-r--r--protocols/Skype/src/skype_subclassing.h2
5 files changed, 51 insertions, 56 deletions
diff --git a/protocols/Skype/src/skype_contacts.cpp b/protocols/Skype/src/skype_contacts.cpp
index d24f7d01fe..5b64c6b5fe 100644
--- a/protocols/Skype/src/skype_contacts.cpp
+++ b/protocols/Skype/src/skype_contacts.cpp
@@ -617,7 +617,7 @@ CContact::AVAILABILITY CSkypeProto::MirandaToSkypeStatus(int status)
{
CContact::AVAILABILITY availability = CContact::UNKNOWN;
- switch(this->m_iStatus)
+ switch(status)
{
case ID_STATUS_ONLINE:
availability = CContact::ONLINE;
diff --git a/protocols/Skype/src/skype_proto.cpp b/protocols/Skype/src/skype_proto.cpp
index 6c596b5f45..6ed5366ccc 100644
--- a/protocols/Skype/src/skype_proto.cpp
+++ b/protocols/Skype/src/skype_proto.cpp
@@ -1,6 +1,7 @@
#include "skype_proto.h"
CSkypeProto::CSkypeProto(const char* protoName, const TCHAR* userName)
+ : login(L"")
{
this->m_iVersion = 2;
this->m_iStatus = ID_STATUS_OFFLINE;
@@ -10,7 +11,7 @@ CSkypeProto::CSkypeProto(const char* protoName, const TCHAR* userName)
//_strlwr(m_szProtoName);
//this->m_szProtoName[0] = toupper(m_szProtoName[0]);
- this->login = NULL;
+ //this->login = NULL;
this->password = NULL;
this->rememberPassword = false;
@@ -267,29 +268,41 @@ int CSkypeProto::SetStatus(int new_status)
int old_status = this->m_iStatus;
this->m_iDesiredStatus = new_status;
- if (new_status == ID_STATUS_OFFLINE && old_status != ID_STATUS_OFFLINE)
+ switch (new_status)
{
- this->m_iStatus = new_status;
+ case ID_STATUS_OFFLINE:
+ if ( this->account->IsOnline())
+ {
+ this->account->SetAvailability(CContact::OFFLINE);
+ this->account->Logout(true);
+ this->account->BlockWhileLoggingOut();
- this->account->Logout(true);
- this->account->BlockWhileLoggingOut();
- this->account->SetAvailability(CContact::OFFLINE);
- this->SetAllContactStatus(ID_STATUS_OFFLINE);
- }
- else
- {
- if (old_status == ID_STATUS_OFFLINE)
- if ( !this->SignIn())
- return 0;
-
- this->m_iStatus = new_status;
+ this->m_iStatus = new_status;
+ this->SetAllContactStatus(ID_STATUS_OFFLINE);
+ }
+ break;
+
+ default:
+ if (old_status == ID_STATUS_OFFLINE && !this->IsOnline())
+ {
+ this->m_iStatus = ID_STATUS_CONNECTING;
+ if ( !this->SignIn()) return 0;
- CContact::AVAILABILITY availability = this->MirandaToSkypeStatus(this->m_iStatus);
- if(availability != CContact::UNKNOWN)
- this->account->SetAvailability(availability);
+ }
+ else
+ {
+ CContact::AVAILABILITY availability = this->MirandaToSkypeStatus(new_status);
+ if (availability != CContact::UNKNOWN)
+ this->account->SetAvailability(availability);
+
+ this->m_iStatus = new_status;
+ }
+
+ break;
}
- this->SendBroadcast(ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, this->m_iStatus);
+ this->SetSettingWord("Status", this->m_iStatus);
+ this->SendBroadcastAsync(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, this->m_iStatus);
return 0;
}
@@ -301,6 +314,7 @@ int __cdecl CSkypeProto::SetAwayMsg( int m_iStatus, const TCHAR* msg ) { retu
int __cdecl CSkypeProto::UserIsTyping( HANDLE hContact, int type )
{
+ // todo: rewrite
CConversation::Ref conversation;
g_skype->GetConversationByIdentity(::mir_u2a(this->GetSettingString(hContact, "sid")), conversation);
if (conversation)
@@ -328,7 +342,7 @@ int __cdecl CSkypeProto::OnEvent(PROTOEVENTTYPE eventType, WPARAM wParam, LPA
return 1;
}
-void __cdecl CSkypeProto::SignInThread(void*)
+void __cdecl CSkypeProto::SignInAsync(void*)
{
WaitForSingleObject(&this->signin_lock, INFINITE);
@@ -348,11 +362,9 @@ void __cdecl CSkypeProto::SignInThread(void*)
ACKRESULT_FAILED,
NULL,
this->SkypeToMirandaLoginError(this->account->logoutReason));
- ::MessageBox(
+ this->ShowNotification(
NULL,
- ::mir_a2u(this->account->logoutReasonString),
- _T("Skype"),
- MB_OK);
+ ::mir_a2u(this->account->logoutReasonString));
}
else
{
@@ -388,15 +400,15 @@ bool CSkypeProto::SignIn(bool isReadPassword)
}
else if (g_skype->GetAccount(::mir_u2a(this->login), this->account))
{
- this->m_iStatus = ID_STATUS_CONNECTING;
- this->SendBroadcast(ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_OFFLINE, this->m_iStatus);
+ /*this->m_iStatus = ID_STATUS_CONNECTING;
+ this->SendBroadcast(ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_OFFLINE, this->m_iStatus); */
if (isReadPassword)
this->password = this->GetDecodeSettingString(SKYPE_SETTINGS_PASSWORD);
if (::wcscmp(this->password, L"") == 0)
this->RequestPassword();
else
{
- this->ForkThread(&CSkypeProto::SignInThread, this);
+ this->ForkThread(&CSkypeProto::SignInAsync, this);
//this->SignInThread(this);
return true;
}
@@ -407,7 +419,8 @@ bool CSkypeProto::SignIn(bool isReadPassword)
bool CSkypeProto::IsOnline()
{
- return this->m_iStatus != ID_STATUS_OFFLINE;
+ return this->account && this->account->IsOnline();
+ //return this->m_iStatus != ID_STATUS_OFFLINE;
}
void CSkypeProto::RequestPassword()
@@ -429,28 +442,4 @@ void CSkypeProto::OnConversationAdded(CConversation::Ref conversation)
{
conversation->SetOnMessageReceivedCallback(
(CConversation::OnMessageReceived)&CSkypeProto::OnOnMessageReceived, this);
-}
-
-void __cdecl CSkypeProto::SendMessageAsync(void* arg)
-{
- CCSDATA *ccs = static_cast<CCSDATA *>(arg);
-
- if ( !this->IsOnline())
- {
- this->SendBroadcast(
- ccs->hContact,
- ACKTYPE_MESSAGE,
- ACKRESULT_FAILED,
- (HANDLE)ccs->lParam,
- (LPARAM)"You cannot send when you are offline.");
- }
-
- CConversation::Ref conversation;
- g_skype->GetConversationByIdentity(::mir_u2a(this->GetSettingString(ccs->hContact, "sid")), conversation);
- if (conversation)
- {
- Message::Ref message;
- conversation->SetMyTextStatusTo(Participant::WRITING);
- conversation->PostText((char *)ccs->wParam, message);
- }
} \ No newline at end of file
diff --git a/protocols/Skype/src/skype_proto.h b/protocols/Skype/src/skype_proto.h
index b097201e26..b87adf872d 100644
--- a/protocols/Skype/src/skype_proto.h
+++ b/protocols/Skype/src/skype_proto.h
@@ -116,7 +116,7 @@ protected:
HANDLE signin_lock;
bool SignIn(bool isReadPassword = true);
- void __cdecl SignInThread(void*);
+ void __cdecl SignInAsync(void*);
bool IsOnline();
@@ -124,8 +124,6 @@ protected:
void OnOnMessageReceived(const char *sid, const char *text);
void OnConversationAdded(CConversation::Ref conversation);
- void __cdecl SendMessageAsync(void*);
-
// contacts
void UpdateContactAboutText(HANDLE hContact, CContact::Ref contact);
void UpdateContactAuthState(HANDLE hContact, CContact::Ref contact);
diff --git a/protocols/Skype/src/skype_subclassing.cpp b/protocols/Skype/src/skype_subclassing.cpp
index c6eaecd4c3..7f1bfc73a0 100644
--- a/protocols/Skype/src/skype_subclassing.cpp
+++ b/protocols/Skype/src/skype_subclassing.cpp
@@ -100,6 +100,12 @@ void CAccount::BlockWhileLoggingOut()
Sleep(1);
}
+bool CAccount::IsOnline()
+{
+ return this->isLoggedIn;
+ //(CAccount::STATUS)this->GetUintProp(CAccount::P_STATUS) == Account::LOGGED_IN;
+}
+
// CContactGroup
CContactGroup::CContactGroup(unsigned int oid, SERootObject* root) : ContactGroup(oid, root)
diff --git a/protocols/Skype/src/skype_subclassing.h b/protocols/Skype/src/skype_subclassing.h
index 4835023894..578de49ef7 100644
--- a/protocols/Skype/src/skype_subclassing.h
+++ b/protocols/Skype/src/skype_subclassing.h
@@ -110,6 +110,8 @@ public:
void BlockWhileLoggingIn();
void BlockWhileLoggingOut();
+ bool IsOnline();
+
private:
void OnChange(int prop);
};