From 7c8a36e9dd320eb7e14da8fdb7875ff087b5d603 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Sat, 27 Apr 2013 14:02:03 +0000 Subject: - some fixes in chats - code reorganizing git-svn-id: http://svn.miranda-ng.org/main/trunk@4554 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Skype/src/skype_chat.cpp | 184 ++++++++++++++++++++-------------- protocols/Skype/src/skype_dialogs.cpp | 53 ++++------ protocols/Skype/src/skype_events.cpp | 30 +++--- protocols/Skype/src/skype_profile.cpp | 4 + protocols/Skype/src/skype_proto.h | 63 +----------- protocols/Skype/src/string_list.h | 56 +++++++++++ 6 files changed, 210 insertions(+), 180 deletions(-) create mode 100644 protocols/Skype/src/string_list.h (limited to 'protocols/Skype/src') diff --git a/protocols/Skype/src/skype_chat.cpp b/protocols/Skype/src/skype_chat.cpp index a63d3475fa..204b091e8b 100644 --- a/protocols/Skype/src/skype_chat.cpp +++ b/protocols/Skype/src/skype_chat.cpp @@ -109,7 +109,7 @@ void CSkypeProto::ChatPrepare(HANDLE hItem, HWND hwndList, const wchar_t *contac } } -void CSkypeProto::GetInviteContacts(HANDLE hItem, HWND hwndList, SEStringList &chatTargets) +void CSkypeProto::GetInviteContacts(HANDLE hItem, HWND hwndList, StringList &chatTargets) { if (hItem == NULL) hItem = (HANDLE)::SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_ROOT, 0); @@ -132,12 +132,12 @@ void CSkypeProto::GetInviteContacts(HANDLE hItem, HWND hwndList, SEStringList &c TCHAR buf[128] = _T(""); SendMessage(hwndList, CLM_GETITEMTEXT, (WPARAM)hItem, (LPARAM)buf); - if (buf[0]) chatTargets.append(mir_t2a(buf)); + if (buf[0]) chatTargets.insertn(buf); } else { ::mir_ptr sid(::db_get_wsa(hItem, this->m_szModuleName, SKYPE_SETTINGS_LOGIN)); - chatTargets.append(::mir_u2a(sid)); + chatTargets.insertn(sid); } } } @@ -203,77 +203,77 @@ void CSkypeProto::CreateChatWindow(CConversation::Ref conversation, bool showWin ::mir_free(chatName); } -wchar_t *CSkypeProto::StartChat(const wchar_t *cid, const SEStringList &invitedContacts) -{ - wchar_t *chatID; - SEString data; - CConversation::Ref conversation; - - if (invitedContacts.size()) - { - if (cid) - { - g_skype->GetConversationByIdentity(::mir_utf8encodeW(cid), conversation); - conversation->GetJoinBlob(data); - g_skype->GetConversationByBlob(data, conversation, false); - conversation->Join(); - - chatID = ::mir_wstrdup(cid); - } - else - { - g_skype->CreateConference(conversation); - conversation->SetOption(CConversation::P_OPT_JOINING_ENABLED, true); - conversation->SetOption(CConversation::P_OPT_ENTRY_LEVEL_RANK, CParticipant::WRITER); - conversation->SetOption(CConversation::P_OPT_DISCLOSE_HISTORY, 1); - - conversation->GetPropIdentity(data); - chatID = ::mir_utf8decodeW(data); - } - - conversation->AddConsumers(invitedContacts); - - conversation->GetPropDisplayname(data); - wchar_t *chatName; - if (data.length()) - chatName = ::mir_utf8decodeT(data); - else - chatName = ::TranslateT("New conference"); - - GCSESSION gcw = {0}; - gcw.cbSize = sizeof(gcw); - gcw.iType = GCW_CHATROOM; - gcw.dwFlags = GC_TCHAR; - gcw.pszModule = this->m_szModuleName; - gcw.ptszName = chatName; - gcw.ptszID = chatID; - ::CallServiceSync(MS_GC_NEWSESSION, 0, (LPARAM)&gcw); - - GCDEST gcd = { m_szModuleName, { NULL }, GC_EVENT_ADDGROUP }; - gcd.ptszID = chatID; - - GCEVENT gce = {0}; - gce.cbSize = sizeof(GCEVENT); - gce.dwFlags = GC_TCHAR; - gce.pDest = &gcd; - for (int i = 0; i < SIZEOF(CSkypeProto::Roles); i++) - { - gce.ptszStatus =:: TranslateW(CSkypeProto::Roles[i]); - ::CallServiceSync(MS_GC_EVENT, NULL, (LPARAM)&gce); - } - - gcd.iType = GC_EVENT_CONTROL; - ::CallServiceSync(MS_GC_EVENT, SESSION_INITDONE, (LPARAM)&gce); - ::CallServiceSync(MS_GC_EVENT, SESSION_ONLINE, (LPARAM)&gce); - ::CallServiceSync(MS_GC_EVENT, WINDOW_VISIBLE, (LPARAM)&gce); - - ::mir_free(chatName); - - return chatID; - } - else - return NULL; -} +//wchar_t *CSkypeProto::StartChat(const wchar_t *cid, const SEStringList &invitedContacts) +//{ +// wchar_t *chatID; +// SEString data; +// CConversation::Ref conversation; +// +// if (invitedContacts.size()) +// { +// if (cid) +// { +// g_skype->GetConversationByIdentity(::mir_utf8encodeW(cid), conversation); +// conversation->GetJoinBlob(data); +// g_skype->GetConversationByBlob(data, conversation, false); +// conversation->Join(); +// +// chatID = ::mir_wstrdup(cid); +// } +// else +// { +// g_skype->CreateConference(conversation); +// conversation->SetOption(CConversation::P_OPT_JOINING_ENABLED, true); +// conversation->SetOption(CConversation::P_OPT_ENTRY_LEVEL_RANK, CParticipant::WRITER); +// conversation->SetOption(CConversation::P_OPT_DISCLOSE_HISTORY, 1); +// +// conversation->GetPropIdentity(data); +// chatID = ::mir_utf8decodeW(data); +// } +// +// conversation->AddConsumers(invitedContacts); +// +// conversation->GetPropDisplayname(data); +// wchar_t *chatName; +// if (data.length()) +// chatName = ::mir_utf8decodeT(data); +// else +// chatName = ::TranslateT("New conference"); +// +// GCSESSION gcw = {0}; +// gcw.cbSize = sizeof(gcw); +// gcw.iType = GCW_CHATROOM; +// gcw.dwFlags = GC_TCHAR; +// gcw.pszModule = this->m_szModuleName; +// gcw.ptszName = chatName; +// gcw.ptszID = chatID; +// ::CallServiceSync(MS_GC_NEWSESSION, 0, (LPARAM)&gcw); +// +// GCDEST gcd = { m_szModuleName, { NULL }, GC_EVENT_ADDGROUP }; +// gcd.ptszID = chatID; +// +// GCEVENT gce = {0}; +// gce.cbSize = sizeof(GCEVENT); +// gce.dwFlags = GC_TCHAR; +// gce.pDest = &gcd; +// for (int i = 0; i < SIZEOF(CSkypeProto::Roles); i++) +// { +// gce.ptszStatus =:: TranslateW(CSkypeProto::Roles[i]); +// ::CallServiceSync(MS_GC_EVENT, NULL, (LPARAM)&gce); +// } +// +// gcd.iType = GC_EVENT_CONTROL; +// ::CallServiceSync(MS_GC_EVENT, SESSION_INITDONE, (LPARAM)&gce); +// ::CallServiceSync(MS_GC_EVENT, SESSION_ONLINE, (LPARAM)&gce); +// ::CallServiceSync(MS_GC_EVENT, WINDOW_VISIBLE, (LPARAM)&gce); +// +// ::mir_free(chatName); +// +// return chatID; +// } +// else +// return NULL; +//} void CSkypeProto::JoinToChat(CConversation::Ref conversation, bool showWindow) { @@ -316,6 +316,42 @@ void CSkypeProto::JoinToChat(CConversation::Ref conversation, bool showWindow) ::mir_free(chatID); } +void CSkypeProto::AddConactsToChat(CConversation::Ref conversation, const StringList &invitedContacts) +{ + SEString data; + + conversation->GetPropIdentity(data); + wchar_t *cid = ::mir_utf8decodeW(data); + + StringList alreadyInChat(this->GetChatUsers(cid)); + + CParticipant::Refs participants; + conversation->GetParticipants(participants, CConversation::OTHER_CONSUMERS); + for (uint i = 0; i < participants.size(); i++) + { + participants[i]->GetPropIdentity(data); + mir_ptr sid = ::mir_utf8decodeW(data); + + if (invitedContacts.contains(sid) && !alreadyInChat.contains(sid)) + { + CContact::Ref contact; + g_skype->GetContact((char *)mir_ptr(::mir_utf8encodeW(sid)), contact); + + CContact::AVAILABILITY status; + contact->GetPropAvailability(status); + + CParticipant::RANK rank; + participants[i]->GetPropRank(rank); + + this->AddChatContact( + cid, + sid, + CSkypeProto::Roles[rank], + status); + } + } +} + void CSkypeProto::LeaveChat(const wchar_t *cid) { wchar_t *chatID = ::mir_wstrdup(cid); diff --git a/protocols/Skype/src/skype_dialogs.cpp b/protocols/Skype/src/skype_dialogs.cpp index 7a02cebe69..647e84e155 100644 --- a/protocols/Skype/src/skype_dialogs.cpp +++ b/protocols/Skype/src/skype_dialogs.cpp @@ -640,50 +640,33 @@ INT_PTR CALLBACK CSkypeProto::InviteToChatProc(HWND hwndDlg, UINT msg, WPARAM wP { HWND hwndList = ::GetDlgItem(hwndDlg, IDC_CCLIST); - SEStringList invitedContacts; + StringList invitedContacts; param->ppro->GetInviteContacts(NULL, hwndList, invitedContacts); wchar_t *chatID = ::mir_wstrdup(param->id); + SEStringList needToAdd; + CConversation::Ref conversation; if (chatID) { - for (uint i = 0; i < invitedContacts.size(); i++) - { - CContact::Ref contact; - CContact::AVAILABILITY status; - g_skype->GetContact(invitedContacts[i], contact); - contact->GetPropAvailability(status); - - //todo: fix rank - param->ppro->AddChatContact( - chatID, - ::mir_utf8decodeW(invitedContacts[i]), - CSkypeProto::Roles[CParticipant::SPEAKER], - status); - } - - CConversation::Ref conversation; g_skype->GetConversationByIdentity(::mir_utf8encodeW(chatID), conversation); - conversation->AddConsumers(invitedContacts); + for (uint i = 0; i < invitedContacts.getCount(); i++) + needToAdd.append((char *)mir_ptr(::mir_u2a(invitedContacts[i]))); + conversation->AddConsumers(needToAdd); } else - { - chatID = param->ppro->StartChat(NULL, invitedContacts); - - for (uint i = 0; i < invitedContacts.size(); i++) - { - CContact::Ref contact; - CContact::AVAILABILITY status; - g_skype->GetContact(invitedContacts[i], contact); - contact->GetPropAvailability(status); - - //todo: fix rank - param->ppro->AddChatContact( - chatID, - ::mir_utf8decodeW(invitedContacts[i]), - CSkypeProto::Roles[CParticipant::SPEAKER], - status); - } + { + g_skype->CreateConference(conversation); + conversation->SetOption(CConversation::P_OPT_JOINING_ENABLED, true); + conversation->SetOption(CConversation::P_OPT_ENTRY_LEVEL_RANK, CParticipant::WRITER); + conversation->SetOption(CConversation::P_OPT_DISCLOSE_HISTORY, 1); + conversation->AddConsumers(needToAdd); + + SEString data; + conversation->GetPropIdentity(data); + chatID = ::mir_utf8decodeW(data); + + param->ppro->JoinToChat(conversation); } if (chatID) EndDialog(hwndDlg, IDOK); diff --git a/protocols/Skype/src/skype_events.cpp b/protocols/Skype/src/skype_events.cpp index cc814d52e7..3ba8f1a113 100644 --- a/protocols/Skype/src/skype_events.cpp +++ b/protocols/Skype/src/skype_events.cpp @@ -399,15 +399,19 @@ void CSkypeProto::OnMessage(CConversation::Ref conversation, CMessage::Ref messa } else { - message->GetPropIdentities(data); - StringList alreadyInChat(this->GetChatUsers(cid)); + + message->GetPropIdentities(data); StringList needToAdd(::mir_utf8decodeW(data)); - needToAdd.remove(this->login); - for (int i = 0; i < needToAdd.getCount(); i++) + + CParticipant::Refs participants; + conversation->GetParticipants(participants, CConversation::OTHER_CONSUMERS); + for (uint i = 0; i < participants.size(); i++) { - wchar_t *sid = needToAdd[i]; - if ( !alreadyInChat.contains(sid)) + participants[i]->GetPropIdentity(data); + mir_ptr sid = ::mir_utf8decodeW(data); + + if (needToAdd.contains(sid) && !alreadyInChat.contains(sid)) { CContact::Ref contact; g_skype->GetContact((char *)mir_ptr(::mir_utf8encodeW(sid)), contact); @@ -415,11 +419,13 @@ void CSkypeProto::OnMessage(CConversation::Ref conversation, CMessage::Ref messa CContact::AVAILABILITY status; contact->GetPropAvailability(status); - //todo: fix rank + CParticipant::RANK rank; + participants[i]->GetPropRank(rank); + this->AddChatContact( cid, sid, - CSkypeProto::Roles[CParticipant::WRITER], + CSkypeProto::Roles[rank], status); } } @@ -470,11 +476,11 @@ void CSkypeProto::OnMessage(CConversation::Ref conversation, CMessage::Ref messa conversation->GetPropIdentity(data); char *cid = ::mir_strdup(data); - /*HANDLE hContact = this->GetChatRoomByCid(cid); - if ( !hContact || this->IsContactOnline(hContact)) + HANDLE hContact = this->AddChatRoom(conversation); + if ( !this->IsContactOnline(hContact)) { - this->JoinChat(cid); - }*/ + this->JoinToChat(conversation); + } } break; diff --git a/protocols/Skype/src/skype_profile.cpp b/protocols/Skype/src/skype_profile.cpp index a20d93eae0..96217b2375 100644 --- a/protocols/Skype/src/skype_profile.cpp +++ b/protocols/Skype/src/skype_profile.cpp @@ -1,6 +1,10 @@ #include "skype_proto.h" #include +#define LI_STRING 0 +#define LI_LIST 1 +#define LI_NUMBER 2 + SettingItem CSkypeProto::setting[] = { {LPGENT("Nick"), "Nick", DBVT_WCHAR, LI_STRING}, {LPGENT("First name"), "FirstName", DBVT_WCHAR, LI_STRING}, diff --git a/protocols/Skype/src/skype_proto.h b/protocols/Skype/src/skype_proto.h index 0b8e41e2f5..f42d581b35 100644 --- a/protocols/Skype/src/skype_proto.h +++ b/protocols/Skype/src/skype_proto.h @@ -1,6 +1,7 @@ #pragma once #include "skype.h" +#include "string_list.h" #include "skypekit\skypekit.h" #include @@ -11,59 +12,6 @@ typedef int (__cdecl CSkypeProto::* SkypeEventFunc)(WPARAM, LPARAM); typedef INT_PTR (__cdecl CSkypeProto::* SkypeServiceFunc)(WPARAM, LPARAM); typedef INT_PTR (__cdecl CSkypeProto::* SkypeServiceFuncParam)(WPARAM, LPARAM, LPARAM); -struct StringList : public LIST -{ - static int compare(const wchar_t* p1, const wchar_t* p2) { return ::wcsicmp(p1, p2); } - - StringList() : LIST(2, compare) {} - StringList(const wchar_t* string, const wchar_t *delimeters = L" ") : LIST(2, compare) - { - wchar_t *data = ::mir_wstrdup(string); - if (data) - { - wchar_t *p = ::wcstok(data, delimeters); - if (p) - { - this->insert(::mir_wstrdup(p)); - while (p = wcstok(NULL, delimeters)) - { - this->insert(::mir_wstrdup(p)); - } - } - ::mir_free(data); - } - } - ~StringList() { destroy(); } - - void destroy( void ) - { - for (int i=0; i < count; i++) - mir_free(items[i]); - - List_Destroy((SortedList*)this); - } - - int insertn(const wchar_t* p) { return insert(::mir_wstrdup(p)); } - - int remove(int idx) - { - mir_free(items[idx]); - return List_Remove((SortedList*)this, idx); - } - - int remove(const wchar_t* p) - { - int idx; - return List_GetIndex((SortedList*)this, (wchar_t*)p, &idx) == 1 ? remove(idx) : -1; - } - - bool contains(wchar_t* p) - { - int idx; - return List_GetIndex((SortedList*)this, (wchar_t*)p, &idx) == 1; - } -}; - struct _tag_iconList { wchar_t* Description; @@ -72,10 +20,6 @@ struct _tag_iconList HANDLE Handle; }; -#define LI_STRING 0 -#define LI_LIST 1 -#define LI_NUMBER 2 - struct SettingItem { const TCHAR *szDescription; @@ -312,15 +256,16 @@ protected: void ChatValidateContact(HANDLE hItem, HWND hwndList, const wchar_t *contacts); void ChatPrepare(HANDLE hItem, HWND hwndList, const wchar_t *contacts); - void GetInviteContacts(HANDLE hItem, HWND hwndList, SEStringList &invitedContacts); + void GetInviteContacts(HANDLE hItem, HWND hwndList, StringList &invitedContacts); void InitChat(); - wchar_t *StartChat(const wchar_t *cid, const SEStringList &invitedContacts); + //wchar_t *StartChat(const wchar_t *cid, const SEStringList &invitedContacts); void LeaveChat(const wchar_t *cid); void CreateChatWindow(CConversation::Ref conversation, bool showWindow = true); void JoinToChat(CConversation::Ref conversation, bool showWindow = true); + void AddConactsToChat(CConversation::Ref conversation, const StringList &invitedContacts); void RaiseChatEvent(const wchar_t *cid, const wchar_t *sid, int evt, DWORD flags = 0x0001, DWORD itemData = 0, const wchar_t *status = NULL, const wchar_t *message = NULL); void SendChatMessage(const wchar_t *cid, const wchar_t *sid, const wchar_t *message); diff --git a/protocols/Skype/src/string_list.h b/protocols/Skype/src/string_list.h new file mode 100644 index 0000000000..241080928e --- /dev/null +++ b/protocols/Skype/src/string_list.h @@ -0,0 +1,56 @@ +#pragma once + +#include + +struct StringList : public LIST +{ + static int compare(const wchar_t* p1, const wchar_t* p2) { return ::wcsicmp(p1, p2); } + + StringList() : LIST(2, compare) {} + StringList(const wchar_t* string, const wchar_t *delimeters = L" ") : LIST(2, compare) + { + wchar_t *data = ::mir_wstrdup(string); + if (data) + { + wchar_t *p = ::wcstok(data, delimeters); + if (p) + { + this->insert(::mir_wstrdup(p)); + while (p = wcstok(NULL, delimeters)) + { + this->insert(::mir_wstrdup(p)); + } + } + ::mir_free(data); + } + } + ~StringList() { destroy(); } + + void destroy( void ) + { + for (int i=0; i < count; i++) + mir_free(items[i]); + + List_Destroy((SortedList*)this); + } + + int insertn(const wchar_t* p) { return insert(::mir_wstrdup(p)); } + + int remove(int idx) + { + mir_free(items[idx]); + return List_Remove((SortedList*)this, idx); + } + + int remove(const wchar_t* p) + { + int idx; + return List_GetIndex((SortedList*)this, (wchar_t*)p, &idx) == 1 ? remove(idx) : -1; + } + + bool contains(wchar_t* p) const + { + int idx; + return List_GetIndex((SortedList*)this, (wchar_t*)p, &idx) == 1; + } +}; \ No newline at end of file -- cgit v1.2.3