summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/SmileyAdd/src/download.cpp60
-rw-r--r--plugins/SmileyAdd/src/main.cpp6
-rw-r--r--plugins/SmileyAdd/src/options.cpp2
-rw-r--r--plugins/SmileyAdd/src/services.cpp8
-rw-r--r--plugins/SmileyAdd/src/stdafx.h2
5 files changed, 45 insertions, 33 deletions
diff --git a/plugins/SmileyAdd/src/download.cpp b/plugins/SmileyAdd/src/download.cpp
index f6a02f1643..4235e312b2 100644
--- a/plugins/SmileyAdd/src/download.cpp
+++ b/plugins/SmileyAdd/src/download.cpp
@@ -27,14 +27,14 @@ struct QueueElem
CMStringW fname;
bool needext;
- QueueElem(CMStringW &purl, CMStringW &pfname, bool ne)
- : url(purl), fname(pfname), needext(ne)
+ QueueElem(const CMStringW &purl, const CMStringW &pfname, bool ne) :
+ url(purl), fname(pfname), needext(ne)
{
}
};
-static HANDLE g_hDlMutex;
-static OBJLIST<QueueElem> dlQueue(10);
+static mir_cs csQueue;
+static LIST<QueueElem> dlQueue(10);
static wchar_t g_wszCachePath[MAX_PATH];
static bool threadRunning;
@@ -123,34 +123,48 @@ void __cdecl SmileyDownloadThread(void*)
bool needext = false;
HNETLIBCONN hHttpDwnl = nullptr;
- WaitForSingleObject(g_hDlMutex, 3000);
- while (!Miranda_IsTerminated() && dlQueue.getCount()) {
- ReleaseMutex(g_hDlMutex);
- if (_waccess(dlQueue[0].fname.c_str(), 0) != 0) {
- InternetDownloadFile(_T2A(dlQueue[0].url.c_str()), _T2A(dlQueue[0].fname.c_str()), hHttpDwnl);
- WaitForSingleObject(g_hDlMutex, 3000);
-
- CMStringW fname(dlQueue[0].fname);
- if (dlQueue[0].needext) {
+
+ while (!Miranda_IsTerminated()) {
+ QueueElem *pItem = nullptr;
+ {
+ mir_cslock lck(csQueue);
+ if (dlQueue.getCount()) {
+ pItem = dlQueue[0];
+ dlQueue.remove(int(0));
+ }
+ }
+
+ if (pItem == nullptr) {
+ SleepEx(3000, TRUE);
+ continue;
+ }
+
+ if (_waccess(pItem->fname.c_str(), 0) != 0) {
+ InternetDownloadFile(_T2A(pItem->url.c_str()), _T2A(pItem->fname.c_str()), hHttpDwnl);
+
+ CMStringW fname(pItem->fname);
+ if (pItem->needext) {
fname += ProtoGetAvatarExtension(ProtoGetAvatarFileFormat(fname));
needext = true;
}
- _wrename(dlQueue[0].fname.c_str(), fname.c_str());
+ _wrename(pItem->fname.c_str(), fname.c_str());
}
- else WaitForSingleObject(g_hDlMutex, 3000);
- dlQueue.remove(0);
+ delete pItem;
}
+
+ for (auto &it : dlQueue)
+ delete it;
dlQueue.destroy();
+
Netlib_CloseHandle(hHttpDwnl);
threadRunning = false;
- ReleaseMutex(g_hDlMutex);
if (!Miranda_IsTerminated()) {
if (needext)
CallServiceSync(MS_SMILEYADD_RELOAD, 0, 0);
else
- NotifyEventHooks(hEvent1, 0, 0);
+ NotifyEventHooks(g_hevOptionsChanged, 0, 0);
}
}
@@ -199,9 +213,10 @@ bool GetSmileyFile(CMStringW &url, const CMStringW &packstr)
filename += L".";
}
- WaitForSingleObject(g_hDlMutex, 3000);
- dlQueue.insert(new QueueElem(url, filename, iExtIdx == -1));
- ReleaseMutex(g_hDlMutex);
+ {
+ mir_cslock lck(csQueue);
+ dlQueue.insert(new QueueElem(url, filename, iExtIdx == -1));
+ }
if (!threadRunning) {
threadRunning = true;
@@ -241,12 +256,9 @@ void DownloadInit(void)
wcsncpy_s(g_wszCachePath, VARSW(L"%miranda_userdata%\\SmileyCache"), _TRUNCATE);
wcsncpy_s(g_plugin.wszDefaultPath, VARSW(L"%miranda_path%\\"), _TRUNCATE);
}
-
- g_hDlMutex = CreateMutex(nullptr, FALSE, nullptr);
}
void DownloadClose(void)
{
- CloseHandle(g_hDlMutex);
Netlib_CloseHandle(hNetlibUser);
}
diff --git a/plugins/SmileyAdd/src/main.cpp b/plugins/SmileyAdd/src/main.cpp
index c8ecf447dd..08c0f6924a 100644
--- a/plugins/SmileyAdd/src/main.cpp
+++ b/plugins/SmileyAdd/src/main.cpp
@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
// globals
-HANDLE hEvent1;
+HANDLE g_hevOptionsChanged;
HGENMENU hContactMenuItem;
CMPlugin g_plugin;
@@ -94,7 +94,7 @@ int CMPlugin::Load()
opt.Load();
// create smiley events
- hEvent1 = CreateHookableEvent(ME_SMILEYADD_OPTIONSCHANGED);
+ g_hevOptionsChanged = CreateHookableEvent(ME_SMILEYADD_OPTIONSCHANGED);
HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded);
HookEvent(ME_SYSTEM_PRESHUTDOWN, MirandaShutdown);
@@ -126,7 +126,7 @@ int CMPlugin::Unload()
{
RemoveDialogBoxHook();
- DestroyHookableEvent(hEvent1);
+ DestroyHookableEvent(g_hevOptionsChanged);
RichEditData_Destroy();
diff --git a/plugins/SmileyAdd/src/options.cpp b/plugins/SmileyAdd/src/options.cpp
index f4f5299ed6..bcd1b16574 100644
--- a/plugins/SmileyAdd/src/options.cpp
+++ b/plugins/SmileyAdd/src/options.cpp
@@ -127,7 +127,7 @@ class COptionsBaseDialog : public CDlgBase
opt.Save();
- NotifyEventHooks(hEvent1, 0, 0);
+ NotifyEventHooks(g_hevOptionsChanged, 0, 0);
ProcessAllInputAreas(false);
}
diff --git a/plugins/SmileyAdd/src/services.cpp b/plugins/SmileyAdd/src/services.cpp
index b94bdd48ad..f14cef58ae 100644
--- a/plugins/SmileyAdd/src/services.cpp
+++ b/plugins/SmileyAdd/src/services.cpp
@@ -217,7 +217,7 @@ INT_PTR CustomCatMenu(WPARAM hContact, LPARAM lParam)
if (lParam == 1) empty = L"<None>";
opt.WriteContactCategory(hContact, empty);
}
- NotifyEventHooks(hEvent1, hContact, 0);
+ NotifyEventHooks(g_hevOptionsChanged, hContact, 0);
}
for (auto &it : menuHandleArray)
@@ -315,7 +315,7 @@ INT_PTR ReloadPack(WPARAM, LPARAM lParam)
g_SmileyCategories.ClearAndLoadAll();
}
- NotifyEventHooks(hEvent1, 0, 0);
+ NotifyEventHooks(g_hevOptionsChanged, 0, 0);
return 0;
}
@@ -326,12 +326,12 @@ INT_PTR LoadContactSmileys(WPARAM, LPARAM lParam)
switch (cont->type) {
case 0:
g_SmileyPackCStore.AddSmileyPack(cont->pszModule, cont->path);
- NotifyEventHooks(hEvent1, (WPARAM)cont->pszModule, 0);
+ NotifyEventHooks(g_hevOptionsChanged, (WPARAM)cont->pszModule, 0);
break;
case 1:
g_SmileyPackCStore.AddSmiley(cont->pszModule, cont->path);
- NotifyEventHooks(hEvent1, (WPARAM)cont->pszModule, 0);
+ NotifyEventHooks(g_hevOptionsChanged, (WPARAM)cont->pszModule, 0);
break;
case 2:
diff --git a/plugins/SmileyAdd/src/stdafx.h b/plugins/SmileyAdd/src/stdafx.h
index 9b0df601a5..c3f6cae5dc 100644
--- a/plugins/SmileyAdd/src/stdafx.h
+++ b/plugins/SmileyAdd/src/stdafx.h
@@ -86,7 +86,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "smltool.h"
extern HNETLIBUSER hNetlibUser;
-extern HANDLE hEvent1;
+extern HANDLE g_hevOptionsChanged;
extern HGENMENU hContactMenuItem;
extern SmileyCategoryListType g_SmileyCategories;
extern SmileyPackListType g_SmileyPacks;