From e8f11470ac52bc89e955630d69ed8229a06acc79 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Sun, 15 Feb 2015 15:17:05 +0000 Subject: Tox: - refactoring - nodes settings in db are ansi now - added work with tox network git-svn-id: http://svn.miranda-ng.org/main/trunk@12124 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Tox/src/common.h | 8 ++ protocols/Tox/src/tox_accounts.cpp | 23 ++++ protocols/Tox/src/tox_core.cpp | 108 +++++++++++++++ protocols/Tox/src/tox_network.cpp | 117 ++++++++++++++++ protocols/Tox/src/tox_options.cpp | 265 +++++++++++++++++-------------------- protocols/Tox/src/tox_proto.h | 33 ++--- protocols/Tox/src/tox_transfer.cpp | 11 +- protocols/Tox/src/tox_transfer.h | 2 +- 8 files changed, 401 insertions(+), 166 deletions(-) create mode 100644 protocols/Tox/src/tox_core.cpp create mode 100644 protocols/Tox/src/tox_network.cpp (limited to 'protocols/Tox/src') diff --git a/protocols/Tox/src/common.h b/protocols/Tox/src/common.h index 24ff0df963..878f9e4d09 100644 --- a/protocols/Tox/src/common.h +++ b/protocols/Tox/src/common.h @@ -48,11 +48,19 @@ extern HINSTANCE g_hInstance; #define TOX_ERROR -1 +#define TOX_MAX_DISCONNECT_RETRIES 100 + #define TOX_SETTINGS_ID "ToxID" #define TOX_SETTINGS_DNS "DnsID" #define TOX_SETTINGS_GROUP "DefaultGroup" #define TOX_SETTINGS_AVATAR_HASH "AvatarHash" +#define TOX_SETTINGS_NODE_IPV4 "Node_%d_IPv4" +#define TOX_SETTINGS_NODE_IPV6 "Node_%d_IPv6" +#define TOX_SETTINGS_NODE_PORT "Node_%d_Port" +#define TOX_SETTINGS_NODE_PKEY "Node_%d_PubKey" +#define TOX_SETTINGS_NODE_COUNT "NodeCount" + #define TOX_DB_EVENT_TYPE_ACTION 10001 #define TOX_FILE_BLOCK_SIZE 1024 * 1024 diff --git a/protocols/Tox/src/tox_accounts.cpp b/protocols/Tox/src/tox_accounts.cpp index afcac8e4a6..edefe94051 100644 --- a/protocols/Tox/src/tox_accounts.cpp +++ b/protocols/Tox/src/tox_accounts.cpp @@ -29,5 +29,28 @@ int CToxProto::UninitAccount(CToxProto *proto) accounts.remove(proto); delete proto; + return 0; +} + +int CToxProto::OnAccountLoaded(WPARAM, LPARAM) +{ + HookProtoEvent(ME_OPT_INITIALISE, &CToxProto::OnOptionsInit); + HookProtoEvent(ME_USERINFO_INITIALISE, &CToxProto::OnUserInfoInit); + HookProtoEvent(ME_MSG_PRECREATEEVENT, &CToxProto::OnPreCreateMessage); + + return 0; +} + +int CToxProto::OnAccountRenamed(WPARAM, LPARAM lParam) +{ + PROTOACCOUNT *account = (PROTOACCOUNT*)lParam; + + std::tstring newPath = GetToxProfilePath(); + TCHAR oldPath[MAX_PATH]; + mir_sntprintf(oldPath, MAX_PATH, _T("%s\\%s.tox"), VARST(_T("%miranda_userdata%")), accountName); + _trename(oldPath, newPath.c_str()); + mir_free(accountName); + accountName = mir_tstrdup(m_tszUserName); + return 0; } \ No newline at end of file diff --git a/protocols/Tox/src/tox_core.cpp b/protocols/Tox/src/tox_core.cpp new file mode 100644 index 0000000000..7d97b875f0 --- /dev/null +++ b/protocols/Tox/src/tox_core.cpp @@ -0,0 +1,108 @@ +#include "common.h" + +bool CToxProto::InitToxCore() +{ + debugLogA("CToxProto::InitToxCore: initializing tox profile"); + + Tox_Options options = { 0 }; + options.udp_disabled = getBool("DisableUDP", 0); + options.ipv6enabled = !getBool("DisableIPv6", 0); + + if (hNetlib != NULL) + { + NETLIBUSERSETTINGS nlus = { sizeof(NETLIBUSERSETTINGS) }; + CallService(MS_NETLIB_GETUSERSETTINGS, (WPARAM)hNetlib, (LPARAM)&nlus); + + if (nlus.useProxy) + { + if (nlus.proxyType == PROXYTYPE_HTTP || nlus.proxyType == PROXYTYPE_HTTPS) + { + debugLogA("CToxProto::InitToxCore: setting http user proxy config"); + options.proxy_type = TOX_PROXY_HTTP; + strcpy(&options.proxy_address[0], nlus.szProxyServer); + options.proxy_port = nlus.wProxyPort; + } + + if (nlus.proxyType == PROXYTYPE_SOCKS4 || nlus.proxyType == PROXYTYPE_SOCKS5) + { + debugLogA("CToxProto::InitToxCore: setting socks user proxy config"); + options.proxy_type = TOX_PROXY_SOCKS5; + strcpy(&options.proxy_address[0], nlus.szProxyServer); + options.proxy_port = nlus.wProxyPort; + } + } + } + + tox = tox_new(&options); + password = mir_utf8encodeW(ptrT(getTStringA("Password"))); + bool isProfileLoaded = LoadToxProfile(); + if (isProfileLoaded) + { + tox_callback_friend_request(tox, OnFriendRequest, this); + tox_callback_friend_message(tox, OnFriendMessage, this); + tox_callback_friend_action(tox, OnFriendAction, this); + tox_callback_typing_change(tox, OnTypingChanged, this); + tox_callback_name_change(tox, OnFriendNameChange, this); + tox_callback_status_message(tox, OnStatusMessageChanged, this); + tox_callback_user_status(tox, OnUserStatusChanged, this); + tox_callback_read_receipt(tox, OnReadReceipt, this); + tox_callback_connection_status(tox, OnConnectionStatusChanged, this); + // file transfers + tox_callback_file_control(tox, OnFileRequest, this); + tox_callback_file_send_request(tox, OnFriendFile, this); + tox_callback_file_data(tox, OnFileData, this); + // avatars + tox_callback_avatar_info(tox, OnGotFriendAvatarInfo, this); + tox_callback_avatar_data(tox, OnGotFriendAvatarData, this); + + uint8_t data[TOX_FRIEND_ADDRESS_SIZE]; + tox_get_address(tox, data); + ToxHexAddress address(data, TOX_FRIEND_ADDRESS_SIZE); + setString(NULL, TOX_SETTINGS_ID, address); + + int size = tox_get_self_name_size(tox); + std::string nick(size, 0); + tox_get_self_name(tox, (uint8_t*)nick.data()); + setWString("Nick", ptrW(Utf8DecodeW(nick.c_str()))); + + std::tstring avatarPath = GetAvatarFilePath(); + if (IsFileExists(avatarPath)) + { + SetToxAvatar(avatarPath); + } + } + else + { + if (password != NULL) + { + mir_free(password); + password = NULL; + } + tox_kill(tox); + } + + return isProfileLoaded; +} + +void CToxProto::UninitToxCore() +{ + for (size_t i = 0; i < transfers->Count(); i++) + { + FileTransferParam *transfer = transfers->GetAt(i); + transfer->status = CANCELED; + tox_file_send_control(tox, transfer->friendNumber, transfer->GetDirection(), transfer->fileNumber, TOX_FILECONTROL_KILL, NULL, 0); + ProtoBroadcastAck(transfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DENIED, (HANDLE)transfer, 0); + transfers->Remove(transfer); + } + + ptrA nickname(mir_utf8encodeW(ptrT(getTStringA("Nick")))); + tox_set_name(tox, (uint8_t*)(char*)nickname, mir_strlen(nickname)); + + SaveToxProfile(); + if (password != NULL) + { + mir_free(password); + password = NULL; + } + tox_kill(tox); +} \ No newline at end of file diff --git a/protocols/Tox/src/tox_network.cpp b/protocols/Tox/src/tox_network.cpp new file mode 100644 index 0000000000..834f438304 --- /dev/null +++ b/protocols/Tox/src/tox_network.cpp @@ -0,0 +1,117 @@ +#include "common.h" + +bool CToxProto::IsOnline() +{ + return isConnected && m_iStatus > ID_STATUS_OFFLINE; +} + +void CToxProto::BootstrapNode(int index) +{ + bool isIPv4 = getBool("DisableIPv6", 0); + int nodeCount = db_get_w(NULL, "TOX", TOX_SETTINGS_NODE_COUNT, 0); + if (!nodeCount) + { + tox_bootstrap_from_address( + tox, isIPv4 ? "192.254.75.102" : "2607:5600:284::2", 33445, + ToxBinAddress("951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F")); + tox_bootstrap_from_address( + tox, "104.219.184.206", 443, + ToxBinAddress("8CD087E31C67568103E8C2A28653337E90E6B8EDA0D765D57C6B5172B4F1F04C")); + return; + } + int i = index % nodeCount; + char setting[MAX_PATH]; + mir_snprintf(setting, SIZEOF(setting), isIPv4 ? TOX_SETTINGS_NODE_IPV4 : TOX_SETTINGS_NODE_IPV6, i); + ptrA address(db_get_sa(NULL, "TOX", setting)); + if (address == NULL && !isIPv4) + { + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV4, i); + address = db_get_sa(NULL, "TOX", setting); + } + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PORT, i); + int port = db_get_w(NULL, "TOX", setting, 0); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PKEY, i); + ptrA pubKey(db_get_sa(NULL, "TOX", setting)); + tox_bootstrap_from_address(tox, address, port, ToxBinAddress(pubKey)); +} + +void CToxProto::TryConnect() +{ + if (tox_isconnected(tox)) + { + isConnected = true; + debugLogA("CToxProto::PollingThread: successfuly connected to DHT"); + m_iStatus = m_iDesiredStatus; + ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iStatus); + tox_set_user_status(tox, MirandaToToxStatus(m_iStatus)); + debugLogA("CToxProto::PollingThread: changing status from %i to %i", ID_STATUS_CONNECTING, m_iDesiredStatus); + } + else + { + BootstrapNode(m_iStatus); + if (m_iStatus++ > MAX_CONNECT_RETRIES) + { + SetStatus(ID_STATUS_OFFLINE); + ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)NULL, LOGINERR_NONETWORK); + debugLogA("CToxProto::PollingThread: failed to connect to DHT"); + } + } +} + +void CToxProto::CheckConnection(int &retriesCount) +{ + if (!isConnected) + { + TryConnect(); + } + else + { + if (tox_isconnected(tox)) + { + retriesCount = TOX_MAX_DISCONNECT_RETRIES; + } + else if (!(--retriesCount)) + { + isConnected = false; + debugLogA("CToxProto::PollingThread: disconnected from DHT"); + SetStatus(ID_STATUS_OFFLINE); + } + } +} + +void CToxProto::DoTox() +{ + { + mir_cslock lock(toxLock); + tox_do(tox); + } + uint32_t interval = tox_do_interval(tox); + Sleep(interval); +} + +void CToxProto::PollingThread(void*) +{ + debugLogA("CToxProto::PollingThread: entering"); + + if (!InitToxCore()) + { + SetStatus(ID_STATUS_OFFLINE); + ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)NULL, LOGINERR_WRONGPASSWORD); + debugLogA("CToxProto::PollingThread: leaving"); + return; + } + + int retriesCount = TOX_MAX_DISCONNECT_RETRIES; + isConnected = false; + + while (!isTerminated) + { + CheckConnection(retriesCount); + DoTox(); + } + + UninitToxCore(); + isConnected = false; + + debugLogA("CToxProto::PollingThread: leaving"); +} \ No newline at end of file diff --git a/protocols/Tox/src/tox_options.cpp b/protocols/Tox/src/tox_options.cpp index 49b4ddb06a..518f87afde 100644 --- a/protocols/Tox/src/tox_options.cpp +++ b/protocols/Tox/src/tox_options.cpp @@ -121,78 +121,67 @@ INT_PTR CToxProto::MainOptionsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l void CreateList(HWND hwndList) { - SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); - - LVCOLUMN lvc = { 0 }; - // Initialize the LVCOLUMN structure. - // The mask specifies that the format, width, text, and - // subitem members of the structure are valid. + LVCOLUMNA lvc = { 0 }; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.iSubItem = 0; - lvc.pszText = TranslateT("IPv4"); - lvc.cx = 100; // width of column in pixels - ListView_InsertColumn(hwndList, 0, &lvc); + lvc.pszText = Translate("IPv4"); + lvc.cx = 100; + SendMessage(hwndList, LVM_INSERTCOLUMNA, 0, (LPARAM)&lvc); lvc.iSubItem = 1; - lvc.pszText = TranslateT("IPv6"); - lvc.cx = 100; // width of column in pixels - ListView_InsertColumn(hwndList, 1, &lvc); + lvc.pszText = Translate("IPv6"); + lvc.cx = 100; + SendMessage(hwndList, LVM_INSERTCOLUMNA, 1, (LPARAM)&lvc); lvc.iSubItem = 2; - lvc.pszText = TranslateT("Port"); - lvc.cx = 100; // width of column in pixels - ListView_InsertColumn(hwndList, 2, &lvc); + lvc.pszText = Translate("Port"); + lvc.cx = 50; + SendMessage(hwndList, LVM_INSERTCOLUMNA, 2, (LPARAM)&lvc); lvc.iSubItem = 3; - lvc.pszText = TranslateT("Client ID"); - lvc.cx = 100; // width of column in pixels - ListView_InsertColumn(hwndList, 3, &lvc); + lvc.pszText = Translate("Public key"); + lvc.cx = 150; + SendMessage(hwndList, LVM_INSERTCOLUMNA, 3, (LPARAM)&lvc); + + SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); } void UpdateList(HWND hwndList) { - LVITEM lvI = { 0 }; + LVITEMA lvI = { 0 }; + char setting[MAX_PATH]; - int NodeCount = db_get_b(NULL, "TOX", "NodeCount", 0); - - for (int i = 0; i < NodeCount; i++) { + int nodeCount = db_get_w(NULL, "TOX", TOX_SETTINGS_NODE_COUNT, 0); + for (int i = 0; i < nodeCount; i++) + { UpdateListFlag = true; lvI.mask = LVIF_TEXT; + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV4, i + 1); + lvI.pszText = db_get_sa(NULL, "TOX", setting); lvI.iSubItem = 0; - char buff[MAX_PATH]; - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv4", i + 1); - TCHAR *ptszIPv4 = db_get_tsa(NULL, "TOX", buff); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv6", i + 1); - TCHAR *ptszIPv6 = db_get_tsa(NULL, "TOX", buff); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_ClientID", i + 1); - TCHAR *ptszClientID = db_get_tsa(NULL, "TOX", buff); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_Port", i + 1); - DWORD PortNum = db_get_dw(NULL, "TOX", buff, 0); - TCHAR ptszPort[10]; - _itot(PortNum, ptszPort, 10); - if (ptszIPv4 && ptszIPv6 && ptszClientID && ptszPort) { - lvI.pszText = ptszIPv4; - lvI.iItem = i; - ListView_InsertItem(hwndList, &lvI); - - lvI.iSubItem = 1; - lvI.pszText = ptszIPv6; - ListView_SetItem(hwndList, &lvI); - - lvI.iSubItem = 2; - lvI.pszText = ptszPort; - ListView_SetItem(hwndList, &lvI); - - lvI.iSubItem = 3; - lvI.pszText = ptszClientID; - ListView_SetItem(hwndList, &lvI); - - mir_free(ptszIPv4); - mir_free(ptszIPv6); - mir_free(ptszClientID); - } + lvI.iItem = i; + SendMessage(hwndList, LVM_INSERTITEMA, 0, (LPARAM)&lvI); + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV6, i + 1); + lvI.iSubItem = 1; + lvI.pszText = db_get_sa(NULL, "TOX", setting); + SendMessage(hwndList, LVM_SETITEMA, 0, (LPARAM)&lvI); + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PORT, i + 1); + int port = db_get_w(NULL, "TOX", setting, 0); + char portNum[10]; + _itoa(port, portNum, 10); + lvI.iSubItem = 2; + lvI.pszText = portNum; + SendMessage(hwndList, LVM_SETITEMA, 0, (LPARAM)&lvI); + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PKEY, i + 1); + lvI.iSubItem = 3; + lvI.pszText = db_get_sa(NULL, "TOX", setting); + SendMessage(hwndList, LVM_SETITEMA, 0, (LPARAM)&lvI); } UpdateListFlag = false; } @@ -215,43 +204,45 @@ INT_PTR CALLBACK AddNodeDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: - TCHAR str[MAX_PATH]; { - if (!GetDlgItemText(hwndDlg, IDC_IPV4, str, SIZEOF(str))) { + char value[MAX_PATH]; + + if (!GetDlgItemTextA(hwndDlg, IDC_IPV4, value, SIZEOF(value))) { MessageBox(hwndDlg, TranslateT("Enter IPv4"), TranslateT("Error"), MB_OK); break; } - if (!GetDlgItemText(hwndDlg, IDC_IPV6, str, SIZEOF(str))) { + /*if (!GetDlgItemTextA(hwndDlg, IDC_IPV6, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter IPv6"), TranslateT("Error"), MB_OK); break; - } + }*/ if (!GetDlgItemInt(hwndDlg, IDC_PORT, NULL, false)) { MessageBox(hwndDlg, TranslateT("Enter port"), TranslateT("Error"), MB_OK); break; } - if (!GetDlgItemText(hwndDlg, IDC_CLIENTID, str, SIZEOF(str))) { - MessageBox(hwndDlg, TranslateT("Enter client ID"), TranslateT("Error"), MB_OK); + if (!GetDlgItemTextA(hwndDlg, IDC_CLIENTID, value, SIZEOF(value))) { + MessageBox(hwndDlg, TranslateT("Enter public key"), TranslateT("Error"), MB_OK); break; } - int NodeCount = db_get_b(NULL, "TOX", "NodeCount", 0); - char buff[MAX_PATH]; - GetDlgItemText(hwndDlg, IDC_IPV4, str, SIZEOF(str)); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv4", NodeCount + 1); - db_set_ts(NULL, "TOX", buff, str); + char setting[MAX_PATH]; + int nodeCount = db_get_b(NULL, "TOX", "NodeCount", 0); - GetDlgItemText(hwndDlg, IDC_IPV6, str, SIZEOF(str)); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv6", NodeCount + 1); - db_set_ts(NULL, "TOX", buff, str); + GetDlgItemTextA(hwndDlg, IDC_IPV4, value, SIZEOF(value)); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV4, nodeCount + 1); + db_set_s(NULL, "TOX", setting, value); - GetDlgItemText(hwndDlg, IDC_CLIENTID, str, SIZEOF(str)); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_ClientID", NodeCount + 1); - db_set_ts(NULL, "TOX", buff, str); + GetDlgItemTextA(hwndDlg, IDC_IPV6, value, SIZEOF(value)); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV6, nodeCount + 1); + db_set_s(NULL, "TOX", setting, value); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_Port", NodeCount + 1); - db_set_dw(NULL, "TOX", buff, (DWORD)GetDlgItemInt(hwndDlg, IDC_PORT, NULL, false)); + GetDlgItemTextA(hwndDlg, IDC_CLIENTID, value, SIZEOF(value)); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PKEY, nodeCount + 1); + db_set_s(NULL, "TOX", setting, value); + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PORT, nodeCount + 1); + db_set_w(NULL, "TOX", setting, (DWORD)GetDlgItemInt(hwndDlg, IDC_PORT, NULL, false)); - db_set_b(NULL, "TOX", "NodeCount", NodeCount + 1); + db_set_w(NULL, "TOX", TOX_SETTINGS_NODE_COUNT, nodeCount + 1); HWND hwndList = (HWND)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); DeleteAllItems(hwndList); @@ -289,30 +280,27 @@ INT_PTR CALLBACK ChangeNodeDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)nSelItem); SetWindowText(hwndDlg, TranslateT("Change node")); - char buff[MAX_PATH]; - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv4", SelItem.SelNumber + 1); - ptrT dbIPv4(db_get_tsa(NULL, "TOX", buff)); - if (dbIPv4 == NULL) + char setting[MAX_PATH]; + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV4, SelItem.SelNumber + 1); + ptrA addressIPv4(db_get_sa(NULL, "TOX", setting)); + if (addressIPv4 == NULL) break; - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv6", SelItem.SelNumber + 1); - ptrT dbIPv6(db_get_tsa(NULL, "TOX", buff)); - if (dbIPv6 == NULL) - break; + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV6, SelItem.SelNumber + 1); + ptrA addressIPv6(db_get_sa(NULL, "TOX", setting)); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_ClientID", SelItem.SelNumber + 1); - ptrT dbClientID(db_get_tsa(NULL, "TOX", buff)); - if (dbClientID == NULL) - break; + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PORT, SelItem.SelNumber + 1); + int port = db_get_dw(NULL, "TOX", setting, 33445); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_Port", SelItem.SelNumber + 1); - DWORD Port = db_get_dw(NULL, "TOX", buff, 0); - if (Port == 0) + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PKEY, SelItem.SelNumber + 1); + ptrA pubKey(db_get_sa(NULL, "TOX", setting)); + if (pubKey == NULL) break; - SetDlgItemText(hwndDlg, IDC_IPV4, dbIPv4); - SetDlgItemText(hwndDlg, IDC_IPV6, dbIPv6); - SetDlgItemText(hwndDlg, IDC_CLIENTID, dbClientID); - SetDlgItemInt(hwndDlg, IDC_PORT, Port, TRUE); + + SetDlgItemTextA(hwndDlg, IDC_IPV4, addressIPv4); + SetDlgItemTextA(hwndDlg, IDC_IPV6, addressIPv6); + SetDlgItemInt(hwndDlg, IDC_PORT, port, TRUE); + SetDlgItemTextA(hwndDlg, IDC_CLIENTID, pubKey); Utils_RestoreWindowPositionNoSize(hwndDlg, NULL, MODULE, "ChangeNodeDlg"); } @@ -329,33 +317,33 @@ INT_PTR CALLBACK ChangeNodeDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM MessageBox(hwndDlg, TranslateT("Enter IPv4"), TranslateT("Error"), MB_OK); break; } - if (!GetDlgItemText(hwndDlg, IDC_IPV6, str, SIZEOF(str))) { + /*if (!GetDlgItemText(hwndDlg, IDC_IPV6, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter IPv6"), TranslateT("Error"), MB_OK); break; - } + }*/ if (!GetDlgItemInt(hwndDlg, IDC_PORT, NULL, false)) { MessageBox(hwndDlg, TranslateT("Enter port"), TranslateT("Error"), MB_OK); break; } if (!GetDlgItemText(hwndDlg, IDC_CLIENTID, str, SIZEOF(str))) { - MessageBox(hwndDlg, TranslateT("Enter client ID"), TranslateT("Error"), MB_OK); + MessageBox(hwndDlg, TranslateT("Enter public key"), TranslateT("Error"), MB_OK); break; } char buff[MAX_PATH]; GetDlgItemText(hwndDlg, IDC_IPV4, str, SIZEOF(str)); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv4", SelItem->SelNumber + 1); + mir_snprintf(buff, SIZEOF(buff), TOX_SETTINGS_NODE_IPV4, SelItem->SelNumber + 1); db_set_ts(NULL, "TOX", buff, str); GetDlgItemText(hwndDlg, IDC_IPV6, str, SIZEOF(str)); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv6", SelItem->SelNumber + 1); + mir_snprintf(buff, SIZEOF(buff), TOX_SETTINGS_NODE_IPV6, SelItem->SelNumber + 1); db_set_ts(NULL, "TOX", buff, str); GetDlgItemText(hwndDlg, IDC_CLIENTID, str, SIZEOF(str)); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_ClientID", SelItem->SelNumber + 1); + mir_snprintf(buff, SIZEOF(buff), TOX_SETTINGS_NODE_PKEY, SelItem->SelNumber + 1); db_set_ts(NULL, "TOX", buff, str); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_Port", SelItem->SelNumber + 1); + mir_snprintf(buff, SIZEOF(buff), TOX_SETTINGS_NODE_PORT, SelItem->SelNumber + 1); db_set_dw(NULL, "TOX", buff, (DWORD)GetDlgItemInt(hwndDlg, IDC_PORT, NULL, false)); DeleteAllItems(SelItem->hwndList); @@ -414,50 +402,43 @@ INT_PTR CALLBACK ToxNodesOptionsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR return FALSE; case IDC_REMOVE: - if (MessageBox(hwndDlg, TranslateT("Are you sure?"), TranslateT("Node deleting"), MB_YESNO | MB_ICONWARNING) == IDYES) { + if (MessageBox(hwndDlg, TranslateT("Are you sure?"), TranslateT("Node deleting"), MB_YESNO | MB_ICONWARNING) == IDYES) + { + char setting[MAX_PATH]; int sel = ListView_GetSelectionMark(hwndList); - char buff[MAX_PATH]; - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv4", sel + 1); - db_unset(NULL, "TOX", buff); - - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv6", sel + 1); - db_unset(NULL, "TOX", buff); - - mir_snprintf(buff, SIZEOF(buff), "Node_%d_ClientID", sel + 1); - db_unset(NULL, "TOX", buff); - - mir_snprintf(buff, SIZEOF(buff), "Node_%d_Port", sel + 1); - db_unset(NULL, "TOX", buff); - - int NodeCount = db_get_b(NULL, "TOX", "NodeCount", 0); - - for (int i = sel + 1; i < NodeCount; i++) { - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv4", i + 1); - TCHAR *ptszIPv4 = db_get_tsa(NULL, "TOX", buff); - db_unset(NULL, "TOX", buff); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv4", i); - db_set_ts(NULL, "TOX", buff, ptszIPv4); - - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv6", i + 1); - TCHAR *ptszIPv6 = db_get_tsa(NULL, "TOX", buff); - db_unset(NULL, "TOX", buff); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_IPv6", i); - db_set_ts(NULL, "TOX", buff, ptszIPv6); - - mir_snprintf(buff, SIZEOF(buff), "Node_%d_ClientID", i + 1); - TCHAR *ptszClientID = db_get_tsa(NULL, "TOX", buff); - db_unset(NULL, "TOX", buff); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_ClientID", i); - db_set_ts(NULL, "TOX", buff, ptszClientID); - - mir_snprintf(buff, SIZEOF(buff), "Node_%d_Port", i + 1); - DWORD Port = db_get_dw(NULL, "TOX", buff, 0); - db_unset(NULL, "TOX", buff); - mir_snprintf(buff, SIZEOF(buff), "Node_%d_Port", i); - db_set_dw(NULL, "TOX", buff, Port); + int nodeCount = db_get_b(NULL, "TOX", "NodeCount", 0); + for (int i = sel + 1; i < nodeCount; i++) + { + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV4, i + 1); + ptrA addressIPv4(db_get_sa(NULL, "TOX", setting)); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV4, i); + db_set_s(NULL, "TOX", setting, addressIPv4); + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV6, i + 1); + ptrA addressIPv6(db_get_sa(NULL, "TOX", setting)); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV6, i); + db_set_s(NULL, "TOX", setting, addressIPv6); + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PORT, i + 1); + int port = db_get_w(NULL, "TOX", setting, 0); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PORT, i); + db_set_w(NULL, "TOX", setting, port); + + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PKEY, i + 1); + ptrA pubKey(db_get_sa(NULL, "TOX", setting)); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PKEY, i); + db_set_s(NULL, "TOX", setting, setting); } - - db_set_b(NULL, "TOX", "NodeCount", NodeCount - 1); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV4, nodeCount); + db_unset(NULL, "TOX", setting); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_IPV6, nodeCount); + db_unset(NULL, "TOX", setting); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PORT, nodeCount); + db_unset(NULL, "TOX", setting); + mir_snprintf(setting, SIZEOF(setting), TOX_SETTINGS_NODE_PKEY, nodeCount); + db_unset(NULL, "TOX", setting); + + db_set_b(NULL, "TOX", TOX_SETTINGS_NODE_COUNT, nodeCount - 1); ListView_DeleteItem(hwndList, sel); } diff --git a/protocols/Tox/src/tox_proto.h b/protocols/Tox/src/tox_proto.h index 03fdfa1a78..404b037350 100644 --- a/protocols/Tox/src/tox_proto.h +++ b/protocols/Tox/src/tox_proto.h @@ -72,39 +72,40 @@ private: bool isTerminated, isConnected; CTransferList *transfers; - // tox - bool InitToxCore(); - void UninitToxCore(); - - // ??? - void DoBootstrap(); - void DoTox(); - - void __cdecl PollingThread(void*); - // tox profile std::tstring GetToxProfilePath(); static std::tstring CToxProto::GetToxProfilePath(const TCHAR *accountName); bool LoadToxProfile(); void SaveToxProfile(); - + static INT_PTR CALLBACK ToxProfileImportProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK ToxProfilePasswordProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + // tox core + bool InitToxCore(); + void UninitToxCore(); + + // tox network + bool IsOnline(); + void BootstrapNode(int index); + void TryConnect(); + void CheckConnection(int &retriesCount); + void DoTox(); + + void __cdecl PollingThread(void*); + // accounts static LIST accounts; static int CompareAccounts(const CToxProto *p1, const CToxProto *p2); + int __cdecl OnAccountLoaded(WPARAM, LPARAM); + int __cdecl OnAccountRenamed(WPARAM, LPARAM); + // netlib void InitNetlib(); void UninitNetlib(); - // account - bool IsOnline(); - int __cdecl OnAccountLoaded(WPARAM, LPARAM); - int __cdecl OnAccountRenamed(WPARAM, LPARAM); - // options static INT_PTR CALLBACK MainOptionsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int __cdecl OnOptionsInit(WPARAM wParam, LPARAM lParam); diff --git a/protocols/Tox/src/tox_transfer.cpp b/protocols/Tox/src/tox_transfer.cpp index be0159dcdc..16e6694b5f 100644 --- a/protocols/Tox/src/tox_transfer.cpp +++ b/protocols/Tox/src/tox_transfer.cpp @@ -50,7 +50,7 @@ HANDLE __cdecl CToxProto::FileAllow(MCONTACT hContact, HANDLE hTransfer, const P { if (!transfer->OpenFile(_T("wb"))) { - debugLogA("CToxProto::FileAllow: cannot to open file (%d)", transfer->fileNumber); + debugLogA("CToxProto::FileAllow: failed to open file (%d)", transfer->fileNumber); transfer->status = FAILED; tox_file_send_control(tox, transfer->friendNumber, transfer->GetDirection(), transfer->fileNumber, TOX_FILECONTROL_KILL, NULL, 0); transfers->Remove(transfer); @@ -79,20 +79,17 @@ int __cdecl CToxProto::FileResume(HANDLE hTransfer, int *action, const PROTOCHAR { case FILERESUME_RENAME: transfer->ChangeName(*szFilename); + case FILERESUME_OVERWRITE: result = transfer->OpenFile(_T("wb")); break; - case FILERESUME_OVERWRITE: - result = transfer->OpenFile(_T("wb")); + case FILERESUME_RESUME: + result = transfer->OpenFile(_T("ab")); break; case FILERESUME_SKIP: result = false; break; - - case FILERESUME_RESUME: - result = transfer->OpenFile(_T("ab")); - break; } if (result) diff --git a/protocols/Tox/src/tox_transfer.h b/protocols/Tox/src/tox_transfer.h index a73b86bef6..643dc418f9 100644 --- a/protocols/Tox/src/tox_transfer.h +++ b/protocols/Tox/src/tox_transfer.h @@ -21,7 +21,7 @@ struct FileTransferParam int friendNumber; int fileNumber; - FileTransferParam(int friendNumber, int fileNumber, const TCHAR* fileName, uint64_t fileSize) + FileTransferParam(int friendNumber, int fileNumber, const TCHAR *fileName, uint64_t fileSize) { status = NONE; hFile = NULL; -- cgit v1.2.3