summaryrefslogtreecommitdiff
path: root/protocols/Skype
diff options
context:
space:
mode:
authorAlexander Lantsev <aunsane@gmail.com>2013-04-27 14:02:03 +0000
committerAlexander Lantsev <aunsane@gmail.com>2013-04-27 14:02:03 +0000
commit7c8a36e9dd320eb7e14da8fdb7875ff087b5d603 (patch)
tree197ab1fce765e898218fa6845411dc0df86acaaa /protocols/Skype
parent81068651df147a3369a740008f326b5168cb19a6 (diff)
- some fixes in chats
- code reorganizing git-svn-id: http://svn.miranda-ng.org/main/trunk@4554 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Skype')
-rw-r--r--protocols/Skype/Skype_10.vcxproj1
-rw-r--r--protocols/Skype/Skype_10.vcxproj.filters3
-rw-r--r--protocols/Skype/src/skype_chat.cpp184
-rw-r--r--protocols/Skype/src/skype_dialogs.cpp53
-rw-r--r--protocols/Skype/src/skype_events.cpp30
-rw-r--r--protocols/Skype/src/skype_profile.cpp4
-rw-r--r--protocols/Skype/src/skype_proto.h63
-rw-r--r--protocols/Skype/src/string_list.h56
8 files changed, 214 insertions, 180 deletions
diff --git a/protocols/Skype/Skype_10.vcxproj b/protocols/Skype/Skype_10.vcxproj
index 398ac252ff..a213b0e6d3 100644
--- a/protocols/Skype/Skype_10.vcxproj
+++ b/protocols/Skype/Skype_10.vcxproj
@@ -195,6 +195,7 @@
<ClInclude Include="src\skypekit\skypekit.h" />
<ClInclude Include="src\skypekit\transfer.h" />
<ClInclude Include="src\skype_proto.h" />
+ <ClInclude Include="src\string_list.h" />
<ClInclude Include="src\version.h" />
<ClInclude Include="src\resource.h" />
</ItemGroup>
diff --git a/protocols/Skype/Skype_10.vcxproj.filters b/protocols/Skype/Skype_10.vcxproj.filters
index e8d089c327..aad1753c47 100644
--- a/protocols/Skype/Skype_10.vcxproj.filters
+++ b/protocols/Skype/Skype_10.vcxproj.filters
@@ -158,6 +158,9 @@
<ClInclude Include="src\skypekit\skypekit.h">
<Filter>Header Files\skypekit</Filter>
</ClInclude>
+ <ClInclude Include="src\string_list.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="res\Resource.rc">
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<wchar_t> 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<wchar_t> sid = ::mir_utf8decodeW(data);
+
+ if (invitedContacts.contains(sid) && !alreadyInChat.contains(sid))
+ {
+ CContact::Ref contact;
+ g_skype->GetContact((char *)mir_ptr<char>(::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<char>(::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<wchar_t> sid = ::mir_utf8decodeW(data);
+
+ if (needToAdd.contains(sid) && !alreadyInChat.contains(sid))
{
CContact::Ref contact;
g_skype->GetContact((char *)mir_ptr<char>(::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 <sstream>
+#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 <map>
@@ -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<wchar_t>
-{
- static int compare(const wchar_t* p1, const wchar_t* p2) { return ::wcsicmp(p1, p2); }
-
- StringList() : LIST<wchar_t>(2, compare) {}
- StringList(const wchar_t* string, const wchar_t *delimeters = L" ") : LIST<wchar_t>(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 <m_system_cpp.h>
+
+struct StringList : public LIST<wchar_t>
+{
+ static int compare(const wchar_t* p1, const wchar_t* p2) { return ::wcsicmp(p1, p2); }
+
+ StringList() : LIST<wchar_t>(2, compare) {}
+ StringList(const wchar_t* string, const wchar_t *delimeters = L" ") : LIST<wchar_t>(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