summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/commonheaders.h107
-rw-r--r--src/core/miranda.cpp422
-rw-r--r--src/core/miranda.h199
-rw-r--r--src/core/modules.cpp184
-rw-r--r--src/core/stdafx.cpp19
5 files changed, 931 insertions, 0 deletions
diff --git a/src/core/commonheaders.h b/src/core/commonheaders.h
new file mode 100644
index 0000000000..3c60da9b96
--- /dev/null
+++ b/src/core/commonheaders.h
@@ -0,0 +1,107 @@
+/*
+
+Miranda NG: the free IM client for Microsoft* Windows*
+
+Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
+Copyright (c) 2000-12 Miranda IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#define _ALPHA_BASE_ 1 // defined for CVS builds
+#define _ALPHA_FUSE_ 1 // defined for fuse powered core
+
+#define INCL_WINSOCK_API_TYPEDEFS 1
+
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include <windows.h>
+#include <windowsx.h>
+#include <shlobj.h>
+#include <uxtheme.h>
+#include <commctrl.h>
+#include <vssym32.h>
+#include <Shlwapi.h>
+#include <Richedit.h>
+
+#ifdef _DEBUG
+#include <crtdbg.h>
+#endif
+
+#include <assert.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <math.h>
+#include <time.h>
+#include <stddef.h>
+#include <process.h>
+#include <io.h>
+#include <limits.h>
+#include <string.h>
+#include <locale.h>
+#include <direct.h>
+
+#include <win2k.h>
+
+#include <m_system.h>
+#include <m_system_cpp.h>
+#include <m_string.h>
+#include <m_core.h>
+#include <newpluginapi.h>
+#include <m_database.h>
+#include <m_db_int.h>
+#include <m_clc.h>
+#include <m_clui.h>
+#include <m_crypto.h>
+#include <m_langpack.h>
+#include <m_clist.h>
+#include <m_clistint.h>
+#include <m_avatars.h>
+#include <m_button.h>
+#include <m_protosvc.h>
+#include <m_protomod.h>
+#include <m_protocols.h>
+#include <m_protoint.h>
+#include <m_options.h>
+#include <m_skin.h>
+#include <m_contacts.h>
+#include <m_message.h>
+#include <m_userinfo.h>
+#include <m_addcontact.h>
+#include <m_findadd.h>
+#include <m_file.h>
+#include <m_awaymsg.h>
+#include <m_ignore.h>
+#include <m_icolib.h>
+#include <m_modernopt.h>
+#include <m_timezones.h>
+#include <m_extraicons.h>
+#include <m_xstatus.h>
+#include <m_metacontacts.h>
+#include <m_gui.h>
+
+#include "miranda.h"
+#include "stdplug.h"
+
+#include <m_ssl.h>
+#include <m_netlib.h>
+#include <m_xml.h>
+
+typedef struct GlobalLogSettingsBase GlobalLogSettings;
+#include <m_chat_int.h>
+
+#include "../resource.h" \ No newline at end of file
diff --git a/src/core/miranda.cpp b/src/core/miranda.cpp
new file mode 100644
index 0000000000..b5b65f8d40
--- /dev/null
+++ b/src/core/miranda.cpp
@@ -0,0 +1,422 @@
+/*
+
+Miranda NG: the free IM client for Microsoft* Windows*
+
+Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
+Copyright (c) 2000-12 Miranda IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include "commonheaders.h"
+
+#define MMI_SIZE_V1 (4*sizeof(void*))
+#define MMI_SIZE_V2 (7*sizeof(void*))
+
+int LoadDefaultModules(void);
+void UnloadNewPluginsModule(void);
+void UnloadDefaultModules(void);
+
+pfnDrawThemeTextEx drawThemeTextEx;
+pfnSetWindowThemeAttribute setWindowThemeAttribute;
+pfnBufferedPaintInit bufferedPaintInit;
+pfnBufferedPaintUninit bufferedPaintUninit;
+pfnBeginBufferedPaint beginBufferedPaint;
+pfnEndBufferedPaint endBufferedPaint;
+pfnGetBufferedPaintBits getBufferedPaintBits;
+
+pfnDwmExtendFrameIntoClientArea dwmExtendFrameIntoClientArea;
+pfnDwmIsCompositionEnabled dwmIsCompositionEnabled;
+
+ITaskbarList3 * pTaskbarInterface;
+
+HANDLE hOkToExitEvent, hModulesLoadedEvent;
+HANDLE hShutdownEvent, hPreShutdownEvent;
+static HANDLE hWaitObjects[MAXIMUM_WAIT_OBJECTS-1];
+static char *pszWaitServices[MAXIMUM_WAIT_OBJECTS-1];
+static int waitObjectCount = 0;
+HANDLE hMirandaShutdown;
+HINSTANCE hInst;
+DWORD hMainThreadId;
+int hLangpack = 0;
+bool bModulesLoadedFired = false;
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// exception handling
+
+static INT_PTR srvGetExceptionFilter(WPARAM, LPARAM)
+{
+ return (INT_PTR)GetExceptionFilter();
+}
+
+static INT_PTR srvSetExceptionFilter(WPARAM, LPARAM lParam)
+{
+ return (INT_PTR)SetExceptionFilter((pfnExceptionFilter)lParam);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+typedef LONG(WINAPI *pNtQIT)(HANDLE, LONG, PVOID, ULONG, PULONG);
+#define ThreadQuerySetWin32StartAddress 9
+
+INT_PTR MirandaIsTerminated(WPARAM, LPARAM)
+{
+ return WaitForSingleObject(hMirandaShutdown, 0) == WAIT_OBJECT_0;
+}
+
+static void __cdecl compactHeapsThread(void*)
+{
+ Thread_SetName("compactHeapsThread");
+
+ while (!Miranda_Terminated()) {
+ HANDLE hHeaps[256];
+ DWORD hc;
+ SleepEx((1000 * 60) * 5, TRUE); // every 5 minutes
+ hc = GetProcessHeaps(255, (PHANDLE)&hHeaps);
+ if (hc != 0 && hc < 256) {
+ DWORD j;
+ for (j = 0; j < hc; j++)
+ HeapCompact(hHeaps[j], 0);
+ }
+ } //while
+}
+
+void(*SetIdleCallback) (void) = NULL;
+
+static INT_PTR SystemSetIdleCallback(WPARAM, LPARAM lParam)
+{
+ if (lParam && SetIdleCallback == NULL) {
+ SetIdleCallback = (void(*)(void))lParam;
+ return 1;
+ }
+ return 0;
+}
+
+static DWORD dwEventTime = 0;
+void checkIdle(MSG * msg)
+{
+ switch (msg->message) {
+ case WM_MOUSEACTIVATE:
+ case WM_MOUSEMOVE:
+ case WM_CHAR:
+ dwEventTime = GetTickCount();
+ }
+}
+
+static INT_PTR SystemGetIdle(WPARAM, LPARAM lParam)
+{
+ if (lParam) *(DWORD*)lParam = dwEventTime;
+ return 0;
+}
+
+static int SystemShutdownProc(WPARAM, LPARAM)
+{
+ UnloadDefaultModules();
+ return 0;
+}
+
+#define MIRANDA_PROCESS_WAIT_TIMEOUT 60000
+#define MIRANDA_PROCESS_WAIT_RESOLUTION 1000
+#define MIRANDA_PROCESS_WAIT_STEPS (MIRANDA_PROCESS_WAIT_TIMEOUT/MIRANDA_PROCESS_WAIT_RESOLUTION)
+static INT_PTR CALLBACK WaitForProcessDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwnd);
+ SetWindowLongPtr(hwnd, GWLP_USERDATA, lParam);
+ SendDlgItemMessage(hwnd, IDC_PROGRESSBAR, PBM_SETRANGE, 0, MAKELPARAM(0, MIRANDA_PROCESS_WAIT_STEPS));
+ SendDlgItemMessage(hwnd, IDC_PROGRESSBAR, PBM_SETSTEP, 1, 0);
+ SetTimer(hwnd, 1, MIRANDA_PROCESS_WAIT_RESOLUTION, NULL);
+ break;
+
+ case WM_TIMER:
+ if (SendDlgItemMessage(hwnd, IDC_PROGRESSBAR, PBM_STEPIT, 0, 0) == MIRANDA_PROCESS_WAIT_STEPS)
+ EndDialog(hwnd, 0);
+ if (WaitForSingleObject((HANDLE)GetWindowLongPtr(hwnd, GWLP_USERDATA), 1) != WAIT_TIMEOUT) {
+ SendDlgItemMessage(hwnd, IDC_PROGRESSBAR, PBM_SETPOS, MIRANDA_PROCESS_WAIT_STEPS, 0);
+ EndDialog(hwnd, 0);
+ }
+ break;
+
+ case WM_COMMAND:
+ if (LOWORD(wParam) == IDCANCEL) {
+ SendDlgItemMessage(hwnd, IDC_PROGRESSBAR, PBM_SETPOS, MIRANDA_PROCESS_WAIT_STEPS, 0);
+ EndDialog(hwnd, 1);
+ }
+ break;
+ }
+ return FALSE;
+}
+
+INT_PTR CheckRestart()
+{
+ LPCTSTR tszPID = CmdLine_GetOption(_T("restart"));
+ if (tszPID) {
+ HANDLE hProcess = OpenProcess(SYNCHRONIZE, FALSE, _ttol(tszPID));
+ if (hProcess) {
+ INT_PTR result = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_WAITRESTART), NULL, WaitForProcessDlgProc, (LPARAM)hProcess);
+ CloseHandle(hProcess);
+ return result;
+ }
+ }
+ return 0;
+}
+
+static void crtErrorHandler(const wchar_t*, const wchar_t*, const wchar_t*, unsigned, uintptr_t)
+{}
+
+
+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR cmdLine, int)
+{
+ hInst = hInstance;
+ hMainThreadId = GetCurrentThreadId();
+
+ _set_invalid_parameter_handler(&crtErrorHandler);
+#ifdef _DEBUG
+ _CrtSetReportMode(_CRT_ASSERT, 0);
+#endif
+
+ CmdLine_Parse(cmdLine);
+ setlocale(LC_ALL, "");
+
+#ifdef _DEBUG
+ if (CmdLine_GetOption(_T("memdebug")))
+ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
+#endif
+
+ HMODULE hDwmApi, hThemeAPI;
+ if (IsWinVerVistaPlus()) {
+ hDwmApi = LoadLibrary(_T("dwmapi.dll"));
+ if (hDwmApi) {
+ dwmExtendFrameIntoClientArea = (pfnDwmExtendFrameIntoClientArea)GetProcAddress(hDwmApi, "DwmExtendFrameIntoClientArea");
+ dwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled)GetProcAddress(hDwmApi, "DwmIsCompositionEnabled");
+ }
+ hThemeAPI = LoadLibrary(_T("uxtheme.dll"));
+ if (hThemeAPI) {
+ drawThemeTextEx = (pfnDrawThemeTextEx)GetProcAddress(hThemeAPI, "DrawThemeTextEx");
+ setWindowThemeAttribute = (pfnSetWindowThemeAttribute)GetProcAddress(hThemeAPI, "SetWindowThemeAttribute");
+ bufferedPaintInit = (pfnBufferedPaintInit)GetProcAddress(hThemeAPI, "BufferedPaintInit");
+ bufferedPaintUninit = (pfnBufferedPaintUninit)GetProcAddress(hThemeAPI, "BufferedPaintUninit");
+ beginBufferedPaint = (pfnBeginBufferedPaint)GetProcAddress(hThemeAPI, "BeginBufferedPaint");
+ endBufferedPaint = (pfnEndBufferedPaint)GetProcAddress(hThemeAPI, "EndBufferedPaint");
+ getBufferedPaintBits = (pfnGetBufferedPaintBits)GetProcAddress(hThemeAPI, "GetBufferedPaintBits");
+ }
+ }
+ else hDwmApi = hThemeAPI = 0;
+
+ if (bufferedPaintInit)
+ bufferedPaintInit();
+
+ OleInitialize(NULL);
+
+ if (IsWinVer7Plus())
+ CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&pTaskbarInterface);
+
+ int result = 0;
+ if (LoadDefaultModules()) {
+ SetEvent(hMirandaShutdown);
+ NotifyEventHooks(hPreShutdownEvent, 0, 0);
+ NotifyEventHooks(hShutdownEvent, 0, 0);
+ UnloadDefaultModules();
+
+ result = 1;
+ }
+ else {
+ InitPathVar();
+ NotifyEventHooks(hModulesLoadedEvent, 0, 0);
+ bModulesLoadedFired = true;
+
+ // ensure that the kernel hooks the SystemShutdownProc() after all plugins
+ HookEvent(ME_SYSTEM_SHUTDOWN, SystemShutdownProc);
+
+ forkthread(compactHeapsThread, 0, NULL);
+ CreateServiceFunction(MS_SYSTEM_SETIDLECALLBACK, SystemSetIdleCallback);
+ CreateServiceFunction(MS_SYSTEM_GETIDLE, SystemGetIdle);
+ dwEventTime = GetTickCount();
+ DWORD myPid = GetCurrentProcessId();
+
+ bool messageloop = true;
+ while (messageloop) {
+ MSG msg;
+ BOOL dying = FALSE;
+ DWORD rc = MsgWaitForMultipleObjectsEx(waitObjectCount, hWaitObjects, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
+ if (rc < WAIT_OBJECT_0 + waitObjectCount) {
+ rc -= WAIT_OBJECT_0;
+ CallService(pszWaitServices[rc], (WPARAM)hWaitObjects[rc], 0);
+ }
+ //
+ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
+ if (msg.message != WM_QUIT) {
+ HWND h = GetForegroundWindow();
+ DWORD pid = 0;
+ checkIdle(&msg);
+ if (h != NULL && GetWindowThreadProcessId(h, &pid) && pid == myPid && GetClassLongPtr(h, GCW_ATOM) == 32770)
+ if (h != NULL && IsDialogMessage(h, &msg)) /* Wine fix. */
+ continue;
+
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ if (SetIdleCallback != NULL)
+ SetIdleCallback();
+ }
+ else if (!dying) {
+ dying++;
+ SetEvent(hMirandaShutdown);
+ NotifyEventHooks(hPreShutdownEvent, 0, 0);
+
+ // this spins and processes the msg loop, objects and APC.
+ Thread_Wait();
+ NotifyEventHooks(hShutdownEvent, 0, 0);
+ // if the hooks generated any messages, it'll get processed before the second WM_QUIT
+ PostQuitMessage(0);
+ }
+ else if (dying)
+ messageloop = false;
+ }
+ }
+ }
+
+ UnloadNewPluginsModule();
+ UnloadCoreModule();
+ CloseHandle(hMirandaShutdown);
+ FreeLibrary(hDwmApi);
+ FreeLibrary(hThemeAPI);
+
+ if (pTaskbarInterface)
+ pTaskbarInterface->Release();
+
+ OleUninitialize();
+
+ if (bufferedPaintUninit)
+ bufferedPaintUninit();
+ return result;
+}
+
+static INT_PTR OkToExit(WPARAM, LPARAM)
+{
+ return NotifyEventHooks(hOkToExitEvent, 0, 0) == 0;
+}
+
+static INT_PTR GetMirandaVersion(WPARAM, LPARAM)
+{
+ TCHAR filename[MAX_PATH];
+ GetModuleFileName(NULL, filename, SIZEOF(filename));
+
+ DWORD unused, verInfoSize = GetFileVersionInfoSize(filename, &unused);
+ PVOID pVerInfo = _alloca(verInfoSize);
+ GetFileVersionInfo(filename, 0, verInfoSize, pVerInfo);
+
+ UINT blockSize;
+ VS_FIXEDFILEINFO *vsffi;
+ VerQueryValue(pVerInfo, _T("\\"), (PVOID*)&vsffi, &blockSize);
+ DWORD ver = (((vsffi->dwProductVersionMS >> 16) & 0xFF) << 24) |
+ ((vsffi->dwProductVersionMS & 0xFF) << 16) |
+ (((vsffi->dwProductVersionLS >> 16) & 0xFF) << 8) |
+ (vsffi->dwProductVersionLS & 0xFF);
+ return (INT_PTR)ver;
+}
+
+static INT_PTR GetMirandaFileVersion(WPARAM, LPARAM lParam)
+{
+ TCHAR filename[MAX_PATH];
+ GetModuleFileName(NULL, filename, SIZEOF(filename));
+
+ DWORD unused, verInfoSize = GetFileVersionInfoSize(filename, &unused);
+ PVOID pVerInfo = _alloca(verInfoSize);
+ GetFileVersionInfo(filename, 0, verInfoSize, pVerInfo);
+
+ UINT blockSize;
+ VS_FIXEDFILEINFO *vsffi;
+ VerQueryValue(pVerInfo, _T("\\"), (PVOID*)&vsffi, &blockSize);
+
+ WORD* p = (WORD*)lParam;
+ p[0] = HIWORD(vsffi->dwProductVersionMS);
+ p[1] = LOWORD(vsffi->dwProductVersionMS);
+ p[2] = HIWORD(vsffi->dwProductVersionLS);
+ p[3] = LOWORD(vsffi->dwProductVersionLS);
+ return 0;
+}
+
+static INT_PTR GetMirandaVersionText(WPARAM wParam, LPARAM lParam)
+{
+ TCHAR filename[MAX_PATH], *productVersion;
+ GetModuleFileName(NULL, filename, SIZEOF(filename));
+
+ DWORD unused, verInfoSize = GetFileVersionInfoSize(filename, &unused);
+ PVOID pVerInfo = _alloca(verInfoSize);
+ GetFileVersionInfo(filename, 0, verInfoSize, pVerInfo);
+
+ UINT blockSize;
+ VerQueryValue(pVerInfo, _T("\\StringFileInfo\\000004b0\\ProductVersion"), (LPVOID*)&productVersion, &blockSize);
+ strncpy((char*)lParam, _T2A(productVersion), wParam);
+#if defined(_WIN64)
+ strcat_s((char*)lParam, wParam, " x64");
+#endif
+ return 0;
+}
+
+INT_PTR WaitOnHandle(WPARAM wParam, LPARAM lParam)
+{
+ if (waitObjectCount >= MAXIMUM_WAIT_OBJECTS - 1)
+ return 1;
+
+ hWaitObjects[waitObjectCount] = (HANDLE)wParam;
+ pszWaitServices[waitObjectCount] = (char*)lParam;
+ waitObjectCount++;
+ return 0;
+}
+
+static INT_PTR RemoveWait(WPARAM wParam, LPARAM)
+{
+ int i;
+
+ for (i = 0; i < waitObjectCount; i++)
+ if (hWaitObjects[i] == (HANDLE)wParam)
+ break;
+
+ if (i == waitObjectCount)
+ return 1;
+
+ waitObjectCount--;
+ memmove(&hWaitObjects[i], &hWaitObjects[i + 1], sizeof(HANDLE)*(waitObjectCount - i));
+ memmove(&pszWaitServices[i], &pszWaitServices[i + 1], sizeof(char*)*(waitObjectCount - i));
+ return 0;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+int LoadSystemModule(void)
+{
+ hMirandaShutdown = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ hShutdownEvent = CreateHookableEvent(ME_SYSTEM_SHUTDOWN);
+ hPreShutdownEvent = CreateHookableEvent(ME_SYSTEM_PRESHUTDOWN);
+ hModulesLoadedEvent = CreateHookableEvent(ME_SYSTEM_MODULESLOADED);
+ hOkToExitEvent = CreateHookableEvent(ME_SYSTEM_OKTOEXIT);
+
+ CreateServiceFunction(MS_SYSTEM_TERMINATED, MirandaIsTerminated);
+ CreateServiceFunction(MS_SYSTEM_OKTOEXIT, OkToExit);
+ CreateServiceFunction(MS_SYSTEM_GETVERSION, GetMirandaVersion);
+ CreateServiceFunction(MS_SYSTEM_GETFILEVERSION, GetMirandaFileVersion);
+ CreateServiceFunction(MS_SYSTEM_GETVERSIONTEXT, GetMirandaVersionText);
+ CreateServiceFunction(MS_SYSTEM_WAITONHANDLE, WaitOnHandle);
+ CreateServiceFunction(MS_SYSTEM_REMOVEWAIT, RemoveWait);
+ CreateServiceFunction(MS_SYSTEM_GETEXCEPTFILTER, srvGetExceptionFilter);
+ CreateServiceFunction(MS_SYSTEM_SETEXCEPTFILTER, srvSetExceptionFilter);
+ return 0;
+}
diff --git a/src/core/miranda.h b/src/core/miranda.h
new file mode 100644
index 0000000000..2609052789
--- /dev/null
+++ b/src/core/miranda.h
@@ -0,0 +1,199 @@
+/*
+
+Miranda NG: the free IM client for Microsoft* Windows*
+
+Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
+Copyright (c) 2000-12 Miranda IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+typedef HRESULT (STDAPICALLTYPE *pfnDrawThemeTextEx)(HTHEME, HDC, int, int, LPCWSTR, int, DWORD, LPRECT, const struct _DTTOPTS *);
+typedef HRESULT (STDAPICALLTYPE *pfnSetWindowThemeAttribute)(HWND, enum WINDOWTHEMEATTRIBUTETYPE, PVOID, DWORD);
+typedef HRESULT (STDAPICALLTYPE *pfnBufferedPaintInit)(void);
+typedef HRESULT (STDAPICALLTYPE *pfnBufferedPaintUninit)(void);
+typedef HANDLE (STDAPICALLTYPE *pfnBeginBufferedPaint)(HDC, RECT *, BP_BUFFERFORMAT, BP_PAINTPARAMS *, HDC *);
+typedef HRESULT (STDAPICALLTYPE *pfnEndBufferedPaint)(HANDLE, BOOL);
+typedef HRESULT (STDAPICALLTYPE *pfnGetBufferedPaintBits)(HANDLE, RGBQUAD **, int *);
+
+extern pfnDrawThemeTextEx drawThemeTextEx;
+extern pfnSetWindowThemeAttribute setWindowThemeAttribute;
+extern pfnBufferedPaintInit bufferedPaintInit;
+extern pfnBufferedPaintUninit bufferedPaintUninit;
+extern pfnBeginBufferedPaint beginBufferedPaint;
+extern pfnEndBufferedPaint endBufferedPaint;
+extern pfnGetBufferedPaintBits getBufferedPaintBits;
+
+extern ITaskbarList3 * pTaskbarInterface;
+
+typedef HRESULT (STDAPICALLTYPE *pfnDwmExtendFrameIntoClientArea)(HWND hwnd, const MARGINS *margins);
+typedef HRESULT (STDAPICALLTYPE *pfnDwmIsCompositionEnabled)(BOOL *);
+
+extern pfnDwmExtendFrameIntoClientArea dwmExtendFrameIntoClientArea;
+extern pfnDwmIsCompositionEnabled dwmIsCompositionEnabled;
+
+/**** database.cpp *********************************************************************/
+
+extern MIDatabase* currDb;
+extern DATABASELINK* currDblink;
+extern LIST<DATABASELINK> arDbPlugins;
+
+int InitIni(void);
+void UninitIni(void);
+
+/**** extraicons.cpp *******************************************************************/
+
+void KillModuleExtraIcons(int hLangpack);
+
+/**** fontService.cpp ******************************************************************/
+
+void KillModuleFonts(int hLangpack);
+void KillModuleColours(int hLangpack);
+void KillModuleEffects(int hLangpack);
+void KillModuleHotkeys(int hLangpack);
+void KillModuleSounds(int hLangpack);
+
+/**** miranda.cpp **********************************************************************/
+
+extern HINSTANCE hInst;
+extern DWORD hMainThreadId;
+extern HANDLE hOkToExitEvent, hModulesLoadedEvent, hevLoadModule, hevUnloadModule;
+extern TCHAR mirandabootini[MAX_PATH];
+
+/**** newplugins.cpp *******************************************************************/
+
+char* GetPluginNameByInstance(HINSTANCE hInstance);
+int GetPluginFakeId(const MUUID &uuid, int hLangpack);
+int LoadStdPlugins(void);
+
+/**** path.cpp *************************************************************************/
+
+void InitPathVar(void);
+
+/**** srmm.cpp *************************************************************************/
+
+void KillModuleSrmmIcons(int hLangpack);
+
+/**** utf.cpp **************************************************************************/
+
+__forceinline char* Utf8DecodeA(const char* src)
+{
+ char* tmp = mir_strdup(src);
+ Utf8Decode(tmp, NULL);
+ return tmp;
+}
+
+#pragma optimize("", on)
+
+/**** options.cpp **********************************************************************/
+
+HTREEITEM FindNamedTreeItemAtRoot(HWND hwndTree, const TCHAR* name);
+
+/**** skin2icons.cpp *******************************************************************/
+
+void KillModuleIcons(int hLangpack);
+
+/**** skinicons.cpp ********************************************************************/
+
+HICON LoadIconEx(HINSTANCE hInstance, LPCTSTR lpIconName, BOOL bShared);
+int ImageList_AddIcon_NotShared(HIMAGELIST hIml, LPCTSTR szResource);
+int ImageList_ReplaceIcon_NotShared(HIMAGELIST hIml, int iIndex, HINSTANCE hInstance, LPCTSTR szResource);
+
+int ImageList_AddIcon_IconLibLoaded(HIMAGELIST hIml, int iconId);
+int ImageList_AddIcon_ProtoIconLibLoaded(HIMAGELIST hIml, const char *szProto, int iconId);
+int ImageList_ReplaceIcon_IconLibLoaded(HIMAGELIST hIml, int nIndex, HICON hIcon);
+
+#define Safe_DestroyIcon(hIcon) if (hIcon) DestroyIcon(hIcon)
+
+/**** clistmenus.cpp ********************************************************************/
+
+extern HANDLE hMainMenuObject, hContactMenuObject, hStatusMenuObject;
+extern HANDLE hPreBuildMainMenuEvent, hPreBuildContactMenuEvent;
+extern HANDLE hShutdownEvent, hPreShutdownEvent;
+
+extern const int statusModeList[ MAX_STATUS_COUNT ];
+extern const int skinIconStatusList[ MAX_STATUS_COUNT ];
+extern const int skinIconStatusFlags[ MAX_STATUS_COUNT ];
+
+int TryProcessDoubleClick(MCONTACT hContact);
+
+void KillModuleMenus(int hLangpack);
+
+/**** protocols.cpp *********************************************************************/
+
+#define OFFSET_PROTOPOS 200
+#define OFFSET_VISIBLE 400
+#define OFFSET_ENABLED 600
+#define OFFSET_NAME 800
+
+extern LIST<PROTOACCOUNT> accounts;
+
+PROTOACCOUNT* Proto_CreateAccount(const char *szModuleName, const char *szBaseProto, const TCHAR *tszAccountName);
+
+PROTOACCOUNT* __fastcall Proto_GetAccount(const char *accName);
+PROTOACCOUNT* __fastcall Proto_GetAccount(MCONTACT hContact);
+
+bool __fastcall Proto_IsAccountEnabled(PROTOACCOUNT *pa);
+bool __fastcall Proto_IsAccountLocked(PROTOACCOUNT *pa);
+
+PROTO_INTERFACE* AddDefaultAccount(const char *szProtoName);
+int FreeDefaultAccount(PROTO_INTERFACE* ppi);
+
+BOOL ActivateAccount(PROTOACCOUNT *pa);
+void EraseAccount(const char *pszProtoName);
+void DeactivateAccount(PROTOACCOUNT *pa, bool bIsDynamic, bool bErase);
+void UnloadAccount(PROTOACCOUNT *pa, bool bIsDynamic, bool bErase);
+void OpenAccountOptions(PROTOACCOUNT *pa);
+
+void LoadDbAccounts(void);
+void WriteDbAccounts(void);
+
+INT_PTR CallProtoServiceInt(MCONTACT hContact, const char* szModule, const char* szService, WPARAM wParam, LPARAM lParam);
+
+/**** utils.cpp ************************************************************************/
+
+void HotkeyToName(TCHAR *buf, int size, BYTE shift, BYTE key);
+WORD GetHotkeyValue(INT_PTR idHotkey);
+int AssertInsideScreen(RECT &rc);
+
+HBITMAP ConvertIconToBitmap(HICON hIcon, HIMAGELIST hIml, int iconId);
+
+class StrConvA
+{
+private:
+ char* m_body;
+
+public:
+ StrConvA(const wchar_t* pSrc) :
+ m_body(mir_u2a(pSrc)) {}
+
+ ~StrConvA() { mir_free(m_body); }
+ operator const char* () const { return m_body; }
+ operator const wchar_t* () const { return (wchar_t*)m_body; } // type cast to fake the interface definition
+ operator const LPARAM () const { return (LPARAM)m_body; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+extern "C"
+{
+ MIR_CORE_DLL(int) Langpack_MarkPluginLoaded(PLUGININFOEX* pInfo);
+ MIR_CORE_DLL(int) GetSubscribersCount(HANDLE hHook);
+ MIR_CORE_DLL(void) db_setCurrent(MIDatabase* _db);
+
+ MIR_CORE_DLL(PROTOCOLDESCRIPTOR*) Proto_RegisterModule(PROTOCOLDESCRIPTOR *pd);
+};
diff --git a/src/core/modules.cpp b/src/core/modules.cpp
new file mode 100644
index 0000000000..21824566ed
--- /dev/null
+++ b/src/core/modules.cpp
@@ -0,0 +1,184 @@
+/*
+
+Miranda NG: the free IM client for Microsoft* Windows*
+
+Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
+Copyright (c) 2000-12 Miranda IM project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+#include "commonheaders.h"
+
+#include "../modules/plugins/plugins.h"
+#include "../modules/langpack/langpack.h"
+#include "../modules/chat/chat.h"
+
+INT_PTR CheckRestart(); // core: IDD_WAITRESTART
+
+int LoadSystemModule(void); // core: m_system.h services
+int LoadNewPluginsModuleInfos(void); // core: preloading plugins
+int LoadNewPluginsModule(void); // core: N.O. plugins
+int LoadNetlibModule(void); // core: network
+int LoadSslModule(void);
+int LoadLangpackModule(void); // core: translation
+int LoadProtocolsModule(void); // core: protocol manager
+int LoadAccountsModule(void); // core: account manager
+int LoadIgnoreModule(void); // protocol filter: ignore
+int LoadDbintfModule(void);
+int LoadEventsModule(void);
+int LoadSrmmModule(void);
+
+int LoadContactsModule(void);
+int LoadContactListModule(void);// ui: clist
+int LoadDatabaseModule(void);
+int LoadMetacontacts(void);
+int LoadOptionsModule(void); // ui: options dialog
+int LoadFindAddModule(void); // ui: search/add users
+int LoadSkinIcons(void);
+int LoadSkinSounds(void);
+int LoadSkinHotkeys(void);
+int LoadUserInfoModule(void); // ui: user info
+int LoadVisibilityModule(void); // ui: visibility control
+
+int LoadPluginOptionsModule(void); // ui: plugin viewer
+int LoadAddContactModule(void); // ui: authcontrol contacts
+int LoadUtilsModule(void); // ui: utils (has a few window classes, like HyperLink)
+int LoadCLCModule(void); // window class: CLC control
+int LoadButtonModule(void); // window class: button class
+int LoadFontserviceModule(void); // ui: font manager
+int LoadIcoLibModule(void); // ui: icons manager
+int LoadServiceModePlugin(void);
+int LoadDefaultServiceModePlugin(void);
+int LoadErrorsModule(void);
+
+void UnloadAccountsModule(void);
+void UnloadClcModule(void);
+void UnloadContactListModule(void);
+void UnloadDatabase(void);
+void UnloadErrorsModule(void);
+void UnloadEventsModule(void);
+void UnloadExtraIconsModule(void);
+void UnloadIcoLibModule(void);
+void UnloadMetacontacts(void);
+void UnloadNetlibModule(void);
+void UnloadNewPlugins(void);
+void UnloadProtocolsModule(void);
+void UnloadSkinSounds(void);
+void UnloadSkinHotkeys(void);
+void UnloadSrmmModule(void);
+void UnloadUtilsModule(void);
+
+int LoadIcoTabsModule();
+int LoadHeaderbarModule();
+int LoadDescButtonModule();
+
+int LoadDefaultModules(void)
+{
+ // load order is very important for these
+ if (LoadSystemModule()) return 1;
+ if (LoadLangpackModule()) return 1; // langpack will be a system module in the new order so this is moved here
+ if (CheckRestart()) return 1;
+ if (LoadUtilsModule()) return 1; //order not important for this, but no dependencies and no point in pluginising
+ if (LoadIcoTabsModule()) return 1;
+ if (LoadHeaderbarModule()) return 1;
+ if (LoadDbintfModule()) return 1;
+ if (LoadEventsModule()) return 1;
+
+ // load database drivers & service plugins without executing their Load()
+ if (LoadNewPluginsModuleInfos()) return 1;
+
+ switch (LoadDefaultServiceModePlugin()) {
+ case SERVICE_CONTINUE: // continue loading Miranda normally
+ case SERVICE_ONLYDB: // load database and go to the message cycle
+ break;
+ case SERVICE_MONOPOLY: // unload database and go to the message cycle
+ return 0;
+ default: // smth went wrong, terminating
+ return 1;
+ }
+
+ // the database will select which db plugin to use, or fail if no profile is selected
+ if (LoadDatabaseModule()) return 1;
+
+ // database is available here
+ if (LoadButtonModule()) return 1;
+ if (LoadIcoLibModule()) return 1;
+ if (LoadSkinIcons()) return 1;
+
+ // if (LoadErrorsModule()) return 1;
+
+ switch (LoadServiceModePlugin()) {
+ case SERVICE_CONTINUE: // continue loading Miranda normally
+ break;
+ case SERVICE_ONLYDB: // load database and go to the message cycle
+ return 0;
+ case SERVICE_MONOPOLY: // unload database and go to the message cycle
+ UnloadDatabase();
+ return 0;
+ default: // smth went wrong, terminating
+ return 1;
+ }
+
+ if (LoadSkinSounds()) return 1;
+ if (LoadSkinHotkeys()) return 1;
+ if (LoadFontserviceModule()) return 1;
+ if (LoadSrmmModule()) return 1;
+ if (LoadChatModule()) return 1;
+ if (LoadDescButtonModule()) return 1;
+ if (LoadOptionsModule()) return 1;
+ if (LoadNetlibModule()) return 1;
+ if (LoadSslModule()) return 1;
+ if (LoadProtocolsModule()) return 1;
+ LoadDbAccounts(); // retrieves the account array from a database
+ if (LoadContactsModule()) return 1;
+ if (LoadContactListModule()) return 1; // prepare contact list interface
+ if (LoadAddContactModule()) return 1;
+ if (LoadMetacontacts()) return 1;
+
+ if (LoadNewPluginsModule()) return 1; // will call Load(void) on everything, clist will load first
+
+ Langpack_SortDuplicates();
+
+ if (LoadAccountsModule()) return 1;
+
+ //order becomes less important below here
+ if (LoadFindAddModule()) return 1;
+ if (LoadIgnoreModule()) return 1;
+ if (LoadVisibilityModule()) return 1;
+ if (LoadStdPlugins()) return 1;
+ return 0;
+}
+
+void UnloadDefaultModules(void)
+{
+ UnloadChatModule();
+ UnloadAccountsModule();
+ UnloadMetacontacts();
+ UnloadNewPlugins();
+ UnloadProtocolsModule();
+ UnloadSkinSounds();
+ UnloadSkinHotkeys();
+ UnloadSrmmModule();
+ // UnloadErrorsModule();
+ UnloadIcoLibModule();
+ UnloadUtilsModule();
+ UnloadExtraIconsModule();
+ UnloadClcModule();
+ UnloadContactListModule();
+ UnloadEventsModule();
+ UnloadNetlibModule();
+}
diff --git a/src/core/stdafx.cpp b/src/core/stdafx.cpp
new file mode 100644
index 0000000000..288f19664b
--- /dev/null
+++ b/src/core/stdafx.cpp
@@ -0,0 +1,19 @@
+/*
+
+Copyright (C) 2012-15 Miranda NG team (http://miranda-ng.org)
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation version 2
+of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "commonheaders.h" \ No newline at end of file