summaryrefslogtreecommitdiff
path: root/protocols/Tox/src
diff options
context:
space:
mode:
authorAlexander Lantsev <aunsane@gmail.com>2015-09-14 19:34:42 +0000
committerAlexander Lantsev <aunsane@gmail.com>2015-09-14 19:34:42 +0000
commitdda141f0798b79cfa71e78934ed1b968fcc20f53 (patch)
tree327942389d763f66201e47d49ad3253e0c0fe1d1 /protocols/Tox/src
parent98a324d2fb4babc09e94a10fef819f3409477eb2 (diff)
Tox: fixed tox thread management
git-svn-id: http://svn.miranda-ng.org/main/trunk@15354 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Tox/src')
-rw-r--r--protocols/Tox/src/stdafx.h1
-rw-r--r--protocols/Tox/src/tox_core.cpp30
-rw-r--r--protocols/Tox/src/tox_network.cpp18
-rw-r--r--protocols/Tox/src/tox_options.cpp5
-rw-r--r--protocols/Tox/src/tox_proto.h22
-rw-r--r--protocols/Tox/src/tox_thread.h32
-rw-r--r--protocols/Tox/src/tox_transfer.cpp11
7 files changed, 61 insertions, 58 deletions
diff --git a/protocols/Tox/src/stdafx.h b/protocols/Tox/src/stdafx.h
index d8a31e85c9..537f414662 100644
--- a/protocols/Tox/src/stdafx.h
+++ b/protocols/Tox/src/stdafx.h
@@ -54,6 +54,7 @@ struct CToxProto;
#include "resource.h"
#include "tox_menus.h"
#include "tox_logger.h"
+#include "tox_thread.h"
#include "tox_address.h"
#include "tox_dialogs.h"
#include "tox_profile.h"
diff --git a/protocols/Tox/src/tox_core.cpp b/protocols/Tox/src/tox_core.cpp
index 929c0c2536..225e04b7df 100644
--- a/protocols/Tox/src/tox_core.cpp
+++ b/protocols/Tox/src/tox_core.cpp
@@ -41,7 +41,7 @@ Tox_Options* CToxProto::GetToxOptions()
return options;
}
-bool CToxProto::InitToxCore(ToxThreadData *toxThread)
+bool CToxProto::InitToxCore(CToxThread *toxThread)
{
logger->Log(__FUNCTION__": initializing tox core");
@@ -112,34 +112,18 @@ bool CToxProto::InitToxCore(ToxThreadData *toxThread)
return false;
}
-void CToxProto::UninitToxCore(ToxThreadData *toxThread)
+void CToxProto::UninitToxCore()
{
+ if (toxThread->toxAv)
+ toxav_kill(toxThread->toxAv);
+
if (toxThread->tox)
{
- for (size_t i = 0; i < transfers.Count(); i++)
- {
- FileTransferParam *transfer = transfers.GetAt(i);
- tox_file_control(toxThread->tox, transfer->friendNumber, transfer->fileNumber, TOX_FILE_CONTROL_CANCEL, NULL);
- ProtoBroadcastAck(transfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DENIED, (HANDLE)transfer, 0);
- transfers.Remove(transfer);
- }
-
- //if (IsToxCoreInited())
- //{
- // ptrA nickname(mir_utf8encodeW(ptrT(getTStringA("Nick"))));
- // tox_set_name(tox, (uint8_t*)(char*)nickname, mir_strlen(nickname));
-
- // //temporary
- // ptrA statusmes(mir_utf8encodeW(ptrT(getTStringA("StatusMsg"))));
- // tox_set_status_message(tox, (uint8_t*)(char*)statusmes, mir_strlen(statusmes));
- //}
-
- if (toxThread->toxAv)
- toxav_kill(toxThread->toxAv);
+ CancelAllTransfers();
SaveToxProfile();
tox_kill(toxThread->tox);
- toxThread = NULL;
+ this->toxThread = NULL;
}
} \ No newline at end of file
diff --git a/protocols/Tox/src/tox_network.cpp b/protocols/Tox/src/tox_network.cpp
index 956378d9c4..0071d9b3f8 100644
--- a/protocols/Tox/src/tox_network.cpp
+++ b/protocols/Tox/src/tox_network.cpp
@@ -141,21 +141,9 @@ void CToxProto::CheckConnection(int &retriesCount)
}
}
-void DoTox(ToxThreadData &toxThread)
-{
- {
- mir_cslock lock(toxThread.toxLock);
- tox_iterate(toxThread.tox);
- if (toxThread.toxAv)
- toxav_do(toxThread.toxAv);
- }
- uint32_t interval = tox_iteration_interval(toxThread.tox);
- Sleep(interval);
-}
-
void CToxProto::PollingThread(void*)
{
- ToxThreadData toxThread;
+ CToxThread toxThread;
this->toxThread = &toxThread;
logger->Log(__FUNCTION__": entering");
@@ -175,10 +163,10 @@ void CToxProto::PollingThread(void*)
while (!toxThread.isTerminated)
{
CheckConnection(retriesCount);
- DoTox(toxThread);
+ toxThread.Do();
}
- UninitToxCore(&toxThread);
+ UninitToxCore();
toxThread.isConnected = false;
logger->Log(__FUNCTION__": leaving");
diff --git a/protocols/Tox/src/tox_options.cpp b/protocols/Tox/src/tox_options.cpp
index a547cb3871..9d9cebee7b 100644
--- a/protocols/Tox/src/tox_options.cpp
+++ b/protocols/Tox/src/tox_options.cpp
@@ -62,7 +62,7 @@ void CToxOptionsMain::ToxAddressCopy_OnClick(CCtrlButton*)
void CToxOptionsMain::ProfileCreate_OnClick(CCtrlButton*)
{
- ToxThreadData toxThread;
+ CToxThread toxThread;
ptrT profilePath(m_proto->GetToxProfilePath());
if (!m_proto->IsFileExists(profilePath))
@@ -91,7 +91,8 @@ void CToxOptionsMain::ProfileCreate_OnClick(CCtrlButton*)
Clist_CreateGroup(0, group);
m_proto->LoadFriendList(NULL);
- m_proto->UninitToxCore(&toxThread);
+ m_proto->SaveToxProfile();
+ tox_kill(toxThread.tox);
m_toxAddress.Enable();
m_toxAddress.SetTextA(ptrA(m_proto->getStringA(TOX_SETTINGS_ID)));
diff --git a/protocols/Tox/src/tox_proto.h b/protocols/Tox/src/tox_proto.h
index f465dcd713..f9efa6a059 100644
--- a/protocols/Tox/src/tox_proto.h
+++ b/protocols/Tox/src/tox_proto.h
@@ -1,21 +1,6 @@
#ifndef _TOX_PROTO_H_
#define _TOX_PROTO_H_
-struct ToxThreadData
-{
- Tox *tox;
- ToxAv *toxAv;
- bool isConnected;
- bool isTerminated;
-
- mir_cs toxLock;
-
- ToxThreadData() : tox(NULL), toxAv(NULL),
- isConnected(false), isTerminated(false) { }
-
- void Stop() { isTerminated = true; }
-};
-
struct CToxProto : public PROTO<CToxProto>
{
friend CToxPasswordEditor;
@@ -82,7 +67,7 @@ public:
static int OnModulesLoaded(WPARAM, LPARAM);
private:
- ToxThreadData *toxThread;
+ CToxThread *toxThread;
mir_cs profileLock;
TCHAR *accountName;
HANDLE hNetlib, hPollingThread;
@@ -102,8 +87,8 @@ private:
// tox core
Tox_Options* GetToxOptions();
- bool InitToxCore(ToxThreadData *toxThread);
- void UninitToxCore(ToxThreadData *toxThread);
+ bool InitToxCore(CToxThread *toxThread);
+ void UninitToxCore();
// tox network
bool IsOnline();
@@ -247,6 +232,7 @@ private:
void PauseOutgoingTransfers(uint32_t friendNumber);
void ResumeIncomingTransfers(uint32_t friendNumber);
+ void CancelAllTransfers();
// avatars
TCHAR* GetAvatarFilePath(MCONTACT hContact = NULL);
diff --git a/protocols/Tox/src/tox_thread.h b/protocols/Tox/src/tox_thread.h
new file mode 100644
index 0000000000..892322b11c
--- /dev/null
+++ b/protocols/Tox/src/tox_thread.h
@@ -0,0 +1,32 @@
+#ifndef _TOX_THREAD_H_
+#define _TOX_THREAD_H_
+
+class CToxThread
+{
+public:
+ Tox *tox;
+ ToxAv *toxAv;
+ bool isConnected;
+ bool isTerminated;
+
+ mir_cs toxLock;
+
+ CToxThread() : tox(NULL), toxAv(NULL),
+ isConnected(false), isTerminated(false) { }
+
+ void Do()
+ {
+ {
+ mir_cslock lock(toxLock);
+ tox_iterate(tox);
+ if (toxAv)
+ toxav_do(toxAv);
+ }
+ uint32_t interval = tox_iteration_interval(tox);
+ Sleep(interval);
+ }
+
+ void Stop() { isTerminated = true; }
+};
+
+#endif //_TOX_THREAD_H_ \ No newline at end of file
diff --git a/protocols/Tox/src/tox_transfer.cpp b/protocols/Tox/src/tox_transfer.cpp
index fb6e6f7a48..fef6258058 100644
--- a/protocols/Tox/src/tox_transfer.cpp
+++ b/protocols/Tox/src/tox_transfer.cpp
@@ -348,6 +348,17 @@ void CToxProto::ResumeIncomingTransfers(uint32_t friendNumber)
}
}
+void CToxProto::CancelAllTransfers()
+{
+ for (size_t i = 0; i < transfers.Count(); i++)
+ {
+ FileTransferParam *transfer = transfers.GetAt(i);
+ tox_file_control(toxThread->tox, transfer->friendNumber, transfer->fileNumber, TOX_FILE_CONTROL_CANCEL, NULL);
+ ProtoBroadcastAck(transfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DENIED, (HANDLE)transfer, 0);
+ transfers.Remove(transfer);
+ }
+}
+
void CToxProto::OnFileRequest(Tox*, uint32_t friendNumber, uint32_t fileNumber, TOX_FILE_CONTROL control, void *arg)
{
CToxProto *proto = (CToxProto*)arg;