From 7cbb90a5ab4982cfebd80d7a672078ac96489042 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Sun, 21 Oct 2012 16:51:03 +0000 Subject: - fixed protocol connecting git-svn-id: http://svn.miranda-ng.org/main/trunk@2028 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Skype/src/skype_contacts.cpp | 2 +- protocols/Skype/src/skype_proto.cpp | 93 ++++++++++++++----------------- protocols/Skype/src/skype_proto.h | 4 +- protocols/Skype/src/skype_subclassing.cpp | 6 ++ protocols/Skype/src/skype_subclassing.h | 2 + 5 files changed, 51 insertions(+), 56 deletions(-) (limited to 'protocols/Skype') 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(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); }; -- cgit v1.2.3