summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
authorAlexander Lantsev <aunsane@gmail.com>2014-08-11 18:47:10 +0000
committerAlexander Lantsev <aunsane@gmail.com>2014-08-11 18:47:10 +0000
commit9f7023fdefc4bbdc888c8bb208bc79bbaa8df225 (patch)
tree30a29895f906c96f62349e17adf17a58ae004ff4 /protocols
parentf1e6c9b63fc90e6fbbcfcef52912ad0fda768302 (diff)
Tox: added friend list loading
git-svn-id: http://svn.miranda-ng.org/main/trunk@10157 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols')
-rw-r--r--protocols/Tox/Tox_12.vcxproj1
-rw-r--r--protocols/Tox/Tox_12.vcxproj.filters1
-rw-r--r--protocols/Tox/src/common.h7
-rw-r--r--protocols/Tox/src/tox_account.cpp4
-rw-r--r--protocols/Tox/src/tox_contacts.cpp43
-rw-r--r--protocols/Tox/src/tox_options.cpp2
-rw-r--r--protocols/Tox/src/tox_proto.cpp6
-rw-r--r--protocols/Tox/src/tox_proto.h11
-rw-r--r--protocols/Tox/src/tox_utils.cpp47
9 files changed, 70 insertions, 52 deletions
diff --git a/protocols/Tox/Tox_12.vcxproj b/protocols/Tox/Tox_12.vcxproj
index 2f8f1bf09c..bde6e2631b 100644
--- a/protocols/Tox/Tox_12.vcxproj
+++ b/protocols/Tox/Tox_12.vcxproj
@@ -197,7 +197,6 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
- <ClInclude Include="res\resource.h" />
<ClInclude Include="src\common.h" />
<ClInclude Include="src\resource.h" />
<ClInclude Include="src\tox\tox.h" />
diff --git a/protocols/Tox/Tox_12.vcxproj.filters b/protocols/Tox/Tox_12.vcxproj.filters
index 70da2bf03d..2aa898c866 100644
--- a/protocols/Tox/Tox_12.vcxproj.filters
+++ b/protocols/Tox/Tox_12.vcxproj.filters
@@ -39,7 +39,6 @@
<ClInclude Include="src\tox_bootstrap.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="res\resource.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\tox_proto.cpp">
diff --git a/protocols/Tox/src/common.h b/protocols/Tox/src/common.h
index 7aaddd04b4..d9bc42d4ce 100644
--- a/protocols/Tox/src/common.h
+++ b/protocols/Tox/src/common.h
@@ -5,6 +5,11 @@
#include <windows.h>
#include <time.h>
+#include <string>
+#include <sstream>
+#include <iomanip>
+#include <vector>
+
#include <newpluginapi.h>
#include <m_protoint.h>
@@ -24,4 +29,6 @@
extern HINSTANCE g_hInstance;
+#define TOX_SETTING_ID "ToxID"
+
#endif //_COMMON_H_ \ No newline at end of file
diff --git a/protocols/Tox/src/tox_account.cpp b/protocols/Tox/src/tox_account.cpp
index 33b1f4a8ed..59edd4ec52 100644
--- a/protocols/Tox/src/tox_account.cpp
+++ b/protocols/Tox/src/tox_account.cpp
@@ -48,7 +48,9 @@ void CToxProto::ConnectionThread(void*)
if (tox_isconnected(tox))
{
isConnected = true;
-
+
+ LoadContactList();
+
m_iStatus = m_iDesiredStatus = ID_STATUS_ONLINE;
ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iStatus);
diff --git a/protocols/Tox/src/tox_contacts.cpp b/protocols/Tox/src/tox_contacts.cpp
index 263e922595..929ca1fbf3 100644
--- a/protocols/Tox/src/tox_contacts.cpp
+++ b/protocols/Tox/src/tox_contacts.cpp
@@ -5,7 +5,7 @@ bool CToxProto::IsProtoContact(MCONTACT hContact)
return ::lstrcmpiA(::GetContactProto(hContact), m_szModuleName) == 0;
}
-MCONTACT CToxProto::GetContactByUserId(const wchar_t *userId)
+MCONTACT CToxProto::GetContactByUserId(const char *clientId)
{
MCONTACT hContact = NULL;
@@ -13,8 +13,8 @@ MCONTACT CToxProto::GetContactByUserId(const wchar_t *userId)
for (hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName))
{
- ptrW cUserId(::db_get_wsa(hContact, m_szModuleName, "UserID"));
- if (lstrcmpi(cUserId, userId) == 0)
+ ptrA contactId(getStringA(hContact, TOX_SETTING_ID));
+ if (lstrcmpiA(contactId, clientId) == 0)
break;
}
@@ -23,26 +23,49 @@ MCONTACT CToxProto::GetContactByUserId(const wchar_t *userId)
return hContact;
}
-MCONTACT CToxProto::AddContact(const wchar_t *userId, const wchar_t *nick, bool isHidden)
+MCONTACT CToxProto::AddContact(const char *clientId, const char *nick, bool isHidden)
{
- MCONTACT hContact = GetContactByUserId(userId);
- if ( !hContact)
+ MCONTACT hContact = GetContactByUserId(clientId);
+ if (!hContact)
{
hContact = (MCONTACT)::CallService(MS_DB_CONTACT_ADD, 0, 0);
- ::CallService(MS_PROTO_ADDTOCONTACT, hContact, (LPARAM)m_szModuleName);
+ CallService(MS_PROTO_ADDTOCONTACT, hContact, (LPARAM)m_szModuleName);
- db_set_b(hContact, "CList", "NotOnList", 1);
+ /*db_set_b(hContact, "CList", "NotOnList", 1);
if (isHidden)
+ {
db_set_b(hContact, "CList", "Hidden", 1);
+ }*/
- setWString(hContact, "UserId", userId);
- setWString(hContact, "Nick", nick);
+ setString(hContact, TOX_SETTING_ID, clientId);
+ setString(hContact, "Nick", nick);
}
return hContact;
}
+void CToxProto::LoadContactList()
+{
+ uint32_t count = tox_count_friendlist(tox);
+ if (count > 0)
+ {
+ int32_t *friends = (int32_t*)mir_alloc(count * sizeof(int32_t));
+ tox_get_friendlist(tox, friends, count);
+ std::vector<uint8_t> clientId(TOX_CLIENT_ID_SIZE);
+ std::vector<uint8_t> username(TOX_MAX_NAME_LENGTH);
+ for (uint32_t i = 0; i < count; ++i)
+ {
+ tox_get_client_id(tox, friends[i], &clientId[0]);
+ std::string toxId = DataToHexString(clientId);
+ tox_get_name(tox, friends[i], &username[0]);
+ std::string nick(username.begin(), username.end());
+
+ AddContact(toxId.c_str(), nick.c_str());
+ }
+ }
+}
+
void __cdecl CToxProto::SearchByUidAsync(void* arg)
{
ptrW userId((wchar_t*)arg);
diff --git a/protocols/Tox/src/tox_options.cpp b/protocols/Tox/src/tox_options.cpp
index d9779c6dc4..7f5fd47824 100644
--- a/protocols/Tox/src/tox_options.cpp
+++ b/protocols/Tox/src/tox_options.cpp
@@ -19,7 +19,7 @@ INT_PTR CALLBACK CToxProto::MainOptionsProc(HWND hwnd, UINT uMsg, WPARAM wParam,
if (!dataPath)
{
char defaultPath[MAX_PATH];
- mir_snprintf(defaultPath, MAX_PATH, "%s\\Tox\\%s.tox", VARS("%miranda_userdata%"), _T2A(proto->m_tszUserName));
+ mir_snprintf(defaultPath, MAX_PATH, "%s\\%s.tox", VARS("%miranda_userdata%"), _T2A(proto->m_tszUserName));
dataPath = mir_strdup(defaultPath);
}
SetDlgItemTextA(hwnd, IDC_DATAPATH, dataPath);
diff --git a/protocols/Tox/src/tox_proto.cpp b/protocols/Tox/src/tox_proto.cpp
index c20d1aa7e4..9413a56e40 100644
--- a/protocols/Tox/src/tox_proto.cpp
+++ b/protocols/Tox/src/tox_proto.cpp
@@ -35,9 +35,9 @@ CToxProto::~CToxProto()
MCONTACT __cdecl CToxProto::AddToList(int flags, PROTOSEARCHRESULT* psr)
{
- MCONTACT hContact = AddContact(psr->id, psr->nick);
+// MCONTACT hContact = AddContact(psr->id, psr->nick);
- return hContact;
+ return NULL;
}
MCONTACT __cdecl CToxProto::AddToListByEvent(int flags, int iContact, HANDLE hDbEvent) { return 0; }
@@ -67,7 +67,7 @@ DWORD_PTR __cdecl CToxProto::GetCaps(int type, MCONTACT hContact)
case PFLAG_UNIQUEIDTEXT:
return (INT_PTR)"Tox ID";
case PFLAG_UNIQUEIDSETTING:
- return (DWORD_PTR)"ToxID";
+ return (DWORD_PTR)TOX_SETTING_ID;
case PFLAG_MAXLENOFMESSAGE:
return TOX_MAX_MESSAGE_LENGTH;
}
diff --git a/protocols/Tox/src/tox_proto.h b/protocols/Tox/src/tox_proto.h
index 502928419b..220e07d0c0 100644
--- a/protocols/Tox/src/tox_proto.h
+++ b/protocols/Tox/src/tox_proto.h
@@ -104,8 +104,10 @@ private:
// contacts
bool IsProtoContact(MCONTACT hContact);
- MCONTACT GetContactByUserId(const wchar_t *userId);
- MCONTACT AddContact(const wchar_t*userId, const wchar_t *nick, bool isHidden = false);
+ MCONTACT GetContactByUserId(const char *clientId);
+ MCONTACT AddContact(const char *clientId, const char *nick, bool isHidden = false);
+
+ void LoadContactList();
void __cdecl SearchByUidAsync(void* arg);
@@ -115,8 +117,9 @@ private:
// utils
TOX_USERSTATUS MirandaToToxStatus(int status);
- uint8_t *HexStringToData(const char *hex_string);
- char *DataToHexString(const uint8_t *bin_string);
+
+ std::vector<uint8_t> HexStringToData(const std::string hex);
+ std::string DataToHexString(const std::vector<uint8_t>);
int LoadToxData(const char *path);
int SaveToxData(const char *path);
diff --git a/protocols/Tox/src/tox_utils.cpp b/protocols/Tox/src/tox_utils.cpp
index e6f1a037f8..456b1dd75a 100644
--- a/protocols/Tox/src/tox_utils.cpp
+++ b/protocols/Tox/src/tox_utils.cpp
@@ -21,47 +21,32 @@ TOX_USERSTATUS CToxProto::MirandaToToxStatus(int status)
return userstatus;
}
-uint8_t *HexStringToData(const char *hex_string)
+std::vector<uint8_t> HexStringToData(const std::string hex)
{
- size_t legth = strlen(hex_string) / 2;
- uint8_t *data = (uint8_t*)mir_alloc(legth);
+ std::stringstream ss;
+ std::vector<uint8_t> data;
- for (size_t i = 0; i < legth; i++)
+ size_t count = hex.length() / 2;
+ for (size_t i = 0; i < count; i++)
{
- unsigned int val;
- sscanf(&hex_string[i * 2], "%2hhx", &val);
- data[i] = val;
+ uint8_t temp;
+ ss << std::hex << hex.substr(i * 2, 2);
+ ss >> temp;
+ data.push_back(temp);
}
return data;
}
-char *CToxProto::DataToHexString(const uint8_t *bin_string)
+std::string CToxProto::DataToHexString(const std::vector<uint8_t> data)
{
- uint32_t delta = 0, pos_extra, sum_extra = 0;
- char *ret = (char*)mir_alloc(TOX_FRIEND_ADDRESS_SIZE + 1);
-
- for (uint32_t i = 0; i < TOX_FRIEND_ADDRESS_SIZE; i++) {
- sprintf(&ret[2 * i + delta], "%02X", bin_string[i]);
-
- if ((i + 1) == TOX_CLIENT_ID_SIZE)
- pos_extra = 2 * (i + 1) + delta;
-
- if (i >= TOX_CLIENT_ID_SIZE)
- sum_extra |= bin_string[i];
-
- /*if (!((i + 1) % FRADDR_TOSTR_CHUNK_LEN)) {
- id_str[2 * (i + 1) + delta] = ' ';
- delta++;
- }*/
+ std::stringstream ss;
+ ss << std::hex << std::uppercase;
+ for (uint32_t i = 0; i < data.size(); i++)
+ {
+ ss << (int)data[i];
}
-
- //ret[2 * i + delta] = 0;
-
- if (!sum_extra)
- ret[pos_extra] = 0;
-
- return ret;
+ return ss.str();
}
int CToxProto::LoadToxData(const char *path)