/*
 * YAMN plugin main file
 * Miranda homepage: http://miranda-icq.sourceforge.net/
 * YAMN homepage: http://www.majvan.host.sk/Projekty/YAMN
 *
 * initializes all variables for further work
 *
 * (c) majvan 2002-2004
 */

#include "stdafx.h"

 //--------------------------------------------------------------------------------------------------

wchar_t ProfileName[MAX_PATH];
wchar_t UserDirectory[MAX_PATH];

wchar_t szMirandaDir[MAX_PATH];
wchar_t szProfileDir[MAX_PATH];

BOOL UninstallPlugins;

HANDLE hAccountFolder;

MWindowList MessageWnds, NewMailAccountWnd;
bool g_bShutdown = false;

CMPlugin	g_plugin;

HANDLE hNewMailHook;
HANDLE NoWriterEV;

UINT SecTimer;

#define FIXED_TAB_SIZE 100                  // default value for fixed width tabs

/////////////////////////////////////////////////////////////////////////////////////////

extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOCOL, MIID_LAST };

/////////////////////////////////////////////////////////////////////////////////////////

PLUGININFOEX pluginInfoEx = {
	sizeof(PLUGININFOEX),
	__PLUGIN_NAME,
	PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
	__DESCRIPTION,
	__AUTHOR,
	__COPYRIGHT,
	__AUTHORWEB,
	UNICODE_AWARE,
	// {B047A7E5-027A-4CFC-8B18-EDA8345D2790}
	{ 0xb047a7e5, 0x27a, 0x4cfc, { 0x8b, 0x18, 0xed, 0xa8, 0x34, 0x5d, 0x27, 0x90 } }
};

CMPlugin::CMPlugin() :
	PLUGIN<CMPlugin>(YAMN_DBMODULE, pluginInfoEx),
	bForceCheck(YAMN_DBMODULE, "ForceCheck", false)
{
	RegisterProtocol(PROTOTYPE_VIRTUAL);
	SetUniqueId("Id");
}

/////////////////////////////////////////////////////////////////////////////////////////
// The callback function

BOOL CALLBACK EnumSystemCodePagesProc(LPTSTR cpStr)
{
	// Convert code page string to number
	UINT cp = _wtoi(cpStr);
	if (!IsValidCodePage(cp))
		return TRUE;

	// Get Code Page name
	CPINFOEX info;
	if (GetCPInfoEx(cp, 0, &info)) {
		for (int i = 1; i < CPLENALL; i++)
			if (CodePageNamesAll[i].CP == cp) {
				CodePageNamesAll[i].isValid = TRUE;
				CPLENSUPP++;
				break;
			}
	}
	return TRUE;
}

int SystemModulesLoaded(WPARAM, LPARAM)
{
	// Insert "Check mail (YAMN)" item to Miranda's menu
	CMenuItem mi(&g_plugin);

	SET_UID(mi, 0xa01ff3d9, 0x53cb, 0x4406, 0x85, 0xd9, 0xf1, 0x90, 0x3a, 0x94, 0xed, 0xf4);
	mi.position = 0xb0000000;
	mi.hIcolibItem = g_plugin.getIconHandle(IDI_CHECKMAIL);
	mi.name.a = LPGEN("Check &mail (All Account)");
	mi.pszService = MS_YAMN_FORCECHECK;
	Menu_AddMainMenuItem(&mi);

	SET_UID(mi, 0xfe22191f, 0x40c8, 0x479f, 0x93, 0x5d, 0xa5, 0x17, 0x1f, 0x57, 0x2f, 0xcb);
	mi.name.a = LPGEN("Check &mail (This Account)");
	mi.pszService = MS_YAMN_CLISTCONTEXT;
	Menu_AddContactMenuItem(&mi, YAMN_DBMODULE);

	SET_UID(mi, 0x147c7800, 0x12d0, 0x4209, 0xab, 0xcc, 0xfa, 0x64, 0xc6, 0xb0, 0xa6, 0xeb);
	mi.hIcolibItem = g_plugin.getIconHandle(IDI_LAUNCHAPP);
	mi.name.a = LPGEN("Launch application");
	mi.pszService = MS_YAMN_CLISTCONTEXTAPP;
	Menu_AddContactMenuItem(&mi, YAMN_DBMODULE);

	if (hAccountFolder = FoldersRegisterCustomPathW(LPGEN("YAMN"), LPGEN("YAMN Account Folder"), UserDirectory))
		FoldersGetCustomPathW(hAccountFolder, UserDirectory, MAX_PATH, UserDirectory);

	RegisterPOP3Plugin(0, 0);
	return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////

static IconItem iconList[] =
{
	{ LPGEN("Check mail"), "YAMN_Check", IDI_CHECKMAIL },
	{ LPGEN("Launch application"), "YAMN_Launch", IDI_LAUNCHAPP },
	{ LPGEN("New Mail"), "YAMN_NewMail", IDI_NEWMAIL },
	{ LPGEN("Connect Fail"), "YAMN_ConnectFail", IDI_BADCONNECT },
};

void LoadIcons()
{
	g_plugin.registerIcon(LPGEN("YAMN"), iconList);
}

int CMPlugin::Load()
{
	//	we get the Miranda Root Path
	PathToAbsoluteW(L".", szMirandaDir);

	// retrieve the current profile name
	Profile_GetNameW(_countof(ProfileName), ProfileName);
	if (wchar_t *fc = wcsrchr(ProfileName, '.'))
		*fc = 0;

	//	we get the user path where our yamn-account.book.ini is stored from mirandaboot.ini file
	mir_wstrncpy(UserDirectory, VARSW(L"%miranda_userdata%"), _countof(UserDirectory));

	// Enumerate all the code pages available for the System Locale
	EnumSystemCodePages(EnumSystemCodePagesProc, CP_INSTALLED);
	CodePageNamesSupp = new _tcptable[CPLENSUPP];
	for (int i = 0, k = 0; i < CPLENALL; i++)
		if (CodePageNamesAll[i].isValid) {
			CodePageNamesSupp[k] = CodePageNamesAll[i];
			k++;
		}

	if (nullptr == (NoWriterEV = CreateEvent(nullptr, TRUE, TRUE, nullptr)))
		return 1;
	if (nullptr == (WriteToFileEV = CreateEvent(nullptr, FALSE, FALSE, nullptr)))
		return 1;
	if (nullptr == (ExitEV = CreateEvent(nullptr, TRUE, FALSE, nullptr)))
		return 1;

	PosX = g_plugin.getDword(YAMN_DBPOSX, 0);
	PosY = g_plugin.getDword(YAMN_DBPOSY, 0);
	SizeX = g_plugin.getDword(YAMN_DBSIZEX, 800);
	SizeY = g_plugin.getDword(YAMN_DBSIZEY, 200);

	HeadPosX = g_plugin.getDword(YAMN_DBMSGPOSX, 0);
	HeadPosY = g_plugin.getDword(YAMN_DBMSGPOSY, 0);
	HeadSizeX = g_plugin.getDword(YAMN_DBMSGSIZEX, 690);
	HeadSizeY = g_plugin.getDword(YAMN_DBMSGSIZEY, 300);
	HeadSplitPos = g_plugin.getWord(YAMN_DBMSGPOSSPLIT, 250);

	optDateTime = g_plugin.getByte(YAMN_DBTIMEOPTIONS, optDateTime);

	// Create new window queues for broadcast messages
	MessageWnds = WindowList_Create();
	NewMailAccountWnd = WindowList_Create();

	hCurSplitNS = LoadCursor(nullptr, IDC_SIZENS);
	hCurSplitWE = LoadCursor(nullptr, IDC_SIZEWE);

	#ifdef _DEBUG
	InitDebug();
	#endif

	CreateServiceFunctions();

	g_plugin.addSound(YAMN_NEWMAILSOUND, L"YAMN", YAMN_NEWMAILSNDDESC);
	g_plugin.addSound(YAMN_CONNECTFAILSOUND, L"YAMN", YAMN_CONNECTFAILSNDDESC);

	HookEvents();

	LoadIcons();

	HOTKEYDESC hkd = {};
	hkd.pszName = "YAMN_hotkey";
	hkd.pszService = MS_YAMN_FORCECHECK;
	hkd.szSection.a = YAMN_DBMODULE;
	hkd.szDescription.a = LPGEN("Check mail");
	hkd.DefHotKey = HOTKEYCODE(HOTKEYF_CONTROL, VK_F11);
	g_plugin.addHotkey(&hkd);

	//Create thread that will be executed every second
	if (!(SecTimer = SetTimer(nullptr, 0, 1000, TimerProc)))
		return 1;

	return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////

int CMPlugin::Unload()
{
	#ifdef _DEBUG
	UnInitDebug();
	#endif

	WindowList_Destroy(MessageWnds);
	WindowList_Destroy(NewMailAccountWnd);

	DestroyCursor(hCurSplitNS);
	DestroyCursor(hCurSplitWE);

	CloseHandle(NoWriterEV);
	CloseHandle(WriteToFileEV);
	CloseHandle(ExitEV);

	delete[] CodePageNamesSupp;
	return 0;
}