#if !defined(AFX_MRA_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_)
#define AFX_MRA_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define _CRT_SECURE_NO_WARNINGS

#pragma warning(disable:4267)

//#define CRTDLL

#include "resource.h"
#include "..\xstatus_MRA\src\resource.h"
#include <SystemHeaders.h>
#include <Wincrypt.h>
#include <Ntsecapi.h>
#include <Commdlg.h>
#include <malloc.h>
#include <stdio.h>
#include <time.h>
#include <DebugFunctions.h>
#include <commctrl.h>
#include <uxtheme.h>
#include <SocketFunctions.h>

#define bzero(pvDst, count) memset(pvDst, 0, count)
#include <timefuncs.h>

#include "../../plugins/zlib/src/zlib.h"

#define MIRANDA_VER 0x0A00

#include <newpluginapi.h>
#include <m_system.h>
#include <m_system_cpp.h>
#include <m_protocols.h>
#include <m_clist.h>
#include <m_cluiframes.h>
#include <m_clui.h>
#include <m_genmenu.h>
#include <m_ignore.h>
#include <m_message.h>
#include <m_options.h>
#include <m_protomod.h>
#include <m_protosvc.h>
#include <m_protoint.h>
#include <m_skin.h>
#include <m_userinfo.h>
#include <m_utils.h>
#include <m_database.h>
#include <m_langpack.h>
#include <m_netlib.h>
#include <m_icolib.h>
#include <win2k.h>
#include <m_popup.h>
#include <m_nudge.h>
#include <m_folders.h>
#include <m_avatars.h>
#include <m_chat.h>
#include <m_extraicons.h>
#include <m_music.h>
#include <m_xstatus.h>
#include <m_proto_listeningto.h>


#include <MemoryFind.h>
#include <MemoryFindByte.h>
#include <MemoryCompare.h>
#include <MemoryReplace.h>
#include <BuffToLowerCase.h>
#include <StrToNum.h>
#include <StrToNum.h>
#include <StrHexToNum.h>
#include <Base64.h>
#include <InternetTime.h>
#include <ListMT.h>
#include <FIFOMT.h>
#include <RC4.h>
#include <SHA1.h>


// LPS
typedef struct
{
	size_t	dwSize;

	union {
		LPSTR	lpszData;
		LPWSTR	lpwszData;
	};
} MRA_LPS;


// GUID
typedef struct
{
	DWORD	id[4];
} MRA_GUID;



struct MRA_ADDR_LIST_ITEM
{
	DWORD	dwPort;
	DWORD	dwAddr;
};

struct MRA_ADDR_LIST
{
	DWORD				dwAddrCount;
	MRA_ADDR_LIST_ITEM	*pmaliAddress;
};

#include "MraConstans.h"
#include "MraProto.h"

// ��������� ���������� ���������� �� ���������� ���� ��� ���������� ������
struct GUI_DISPLAY_ITEM
{
	LPSTR       lpszName;    // ��� �������, ��� �� ��� � �������
	LPWSTR      lpwszDescr;  // ��������� �������� ������������ �����
	LONG        defIcon;     // ������ �� ��������
	ServiceFunc	lpFunc;      // ������� ���������� ����
	HANDLE      hIconHandle;
};

// ��������� ���������� ���������� � ��������/��������
struct SERVICE_ITEM
{
	LPSTR			lpszName;		// ��� �������, ��� �� ��� � �������
	ServiceFunc	lpFunc;			// ������� ����������
};

extern GUI_DISPLAY_ITEM gdiMenuItems[];
extern GUI_DISPLAY_ITEM gdiContactMenuItems[];
extern GUI_DISPLAY_ITEM gdiExtraStatusIconsItems[];

#include "proto.h"
#include "MraSendCommand.h"
#include "MraMRIMProxy.h"
#include "MraSendQueue.h"
#include "MraFilesQueue.h"
#include "MraPopup.h"
#include "MraAvatars.h"
#include "MraIcons.h"
#include "MraSelectEMail.h"
#include "MraAntiSpam.h"
#include "MraMPop.h"
#include "MraChat.h"


#ifdef MRA_EXPORTS
	#define MRA_API __declspec(dllexport)
#else
	#define MRA_API
	// __declspec(dllimport)
	#pragma comment(lib, "MRALib.lib")
#endif

/////////////////////////////////////////////////////////////////////////////////////////
//	plugin options

typedef struct
{
	HANDLE                hHeap;
	HINSTANCE             hInstance;
	HMODULE               hDLLXStatusIcons;

	DWORD                 dwGlobalPluginRunning;
	BOOL                  bChatExist;

	size_t                dwMirWorkDirPathLen;
	WCHAR                 szMirWorkDirPath[MAX_FILEPATH];
} MRA_SETTINGS;


/////////////////////////////////////////////////////////////////////////////////////////
//	External variables
extern MRA_SETTINGS masMraSettings;
extern LIST<CMraProto> g_Instances;

extern HANDLE hXStatusAdvancedStatusIcons[];

INT_PTR LoadModules();
void    UnloadModules();
void    InitExtraIcons();

DWORD   MraGetSelfVersionString(LPSTR lpszSelfVersion, size_t dwSelfVersionSize, size_t *pdwSelfVersionSizeRet);

#define GetContactNameA(Contact) (LPSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)Contact, 0)
#define GetContactNameW(Contact) (LPWSTR)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)Contact, GCDNF_UNICODE)

#define GetStatusModeDescriptionA(Status) (LPSTR)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)Status, 0)
#define GetStatusModeDescriptionW(Status) (LPWSTR)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)Status, GSMDF_UNICODE)

#define SetBit(bytes, bitpos) bytes |= (1<<bitpos)
#define GetBit(bytes, bitpos) ((bytes&(1<<bitpos))? TRUE:FALSE)

#define IsXStatusValid(XStatus) (((XStatus) && (XStatus)<MRA_XSTATUS_COUNT))

#define SEND_DLG_ITEM_MESSAGEW(hDlg, nIDDlgItem, Msg, wParam, lParam)	SendMessageW(GetDlgItem(hDlg, nIDDlgItem), Msg, wParam, lParam)
#define SEND_DLG_ITEM_MESSAGEA(hDlg, nIDDlgItem, Msg, wParam, lParam)	SendMessageA(GetDlgItem(hDlg, nIDDlgItem), Msg, wParam, lParam)
#define SEND_DLG_ITEM_MESSAGE(hDlg, nIDDlgItem, Msg, wParam, lParam)	SendMessage(GetDlgItem(hDlg, nIDDlgItem), Msg, wParam, lParam)

#define IS_DLG_BUTTON_CHECKED(hDlg, nIDDlgItem)						SEND_DLG_ITEM_MESSAGE(hDlg, nIDDlgItem, BM_GETCHECK, NULL, NULL)
#define CHECK_DLG_BUTTON(hDlg, nIDDlgItem, uCheck)					SEND_DLG_ITEM_MESSAGE(hDlg, nIDDlgItem, BM_SETCHECK, (WPARAM)uCheck, NULL)

#define SET_DLG_ITEM_TEXTW(hDlg, nIDDlgItem, lpString)				SEND_DLG_ITEM_MESSAGEW(hDlg, nIDDlgItem, WM_SETTEXT, 0, (LPARAM)lpString)
#define SET_DLG_ITEM_TEXTA(hDlg, nIDDlgItem, lpString)				SEND_DLG_ITEM_MESSAGEA(hDlg, nIDDlgItem, WM_SETTEXT, 0, (LPARAM)lpString)
#define SET_DLG_ITEM_TEXT(hDlg, nIDDlgItem, lpString)					SEND_DLG_ITEM_MESSAGE(hDlg, nIDDlgItem, WM_SETTEXT, 0, (LPARAM)lpString)

#define GET_DLG_ITEM_TEXTW(hDlg, nIDDlgItem, lpString, nMaxCount)		SEND_DLG_ITEM_MESSAGEW(hDlg, nIDDlgItem, WM_GETTEXT, (WPARAM)nMaxCount, (LPARAM)lpString)
#define GET_DLG_ITEM_TEXTA(hDlg, nIDDlgItem, lpString, nMaxCount)		SEND_DLG_ITEM_MESSAGEA(hDlg, nIDDlgItem, WM_GETTEXT, (WPARAM)nMaxCount, (LPARAM)lpString)
#define GET_DLG_ITEM_TEXT(hDlg, nIDDlgItem, lpString, nMaxCount)		SEND_DLG_ITEM_MESSAGE(hDlg, nIDDlgItem, WM_GETTEXT, (WPARAM)nMaxCount, (LPARAM)lpString)

#define GET_DLG_ITEM_TEXT_LENGTH(hDlg, nIDDlgItem)					SEND_DLG_ITEM_MESSAGE(hDlg, nIDDlgItem, WM_GETTEXTLENGTH, NULL, NULL)
#define GET_WINDOW_TEXT_LENGTH(hDlg)								SendMessage(hDlg, WM_GETTEXTLENGTH, NULL, NULL)

#define GET_CURRENT_COMBO_DATA(hWndDlg, ControlID)					SEND_DLG_ITEM_MESSAGE(hWndDlg, ControlID, CB_GETITEMDATA, SEND_DLG_ITEM_MESSAGE(hWndDlg, ControlID, CB_GETCURSEL, 0, 0), 0)


#define IsFileExist(FileName) (GetFileAttributes(FileName) != INVALID_FILE_ATTRIBUTES)
#define IsFileExistA(FileName) (GetFileAttributesA(FileName) != INVALID_FILE_ATTRIBUTES)
#define IsFileExistW(FileName) (GetFileAttributesW(FileName) != INVALID_FILE_ATTRIBUTES)


#define IsThreadAlive(hThread) (GetThreadPriority(hThread) != THREAD_PRIORITY_ERROR_RETURN)

void   MraAddrListFree(MRA_ADDR_LIST *pmalAddrList);
DWORD  MraAddrListGetFromBuff(LPSTR lpszAddreses, size_t dwAddresesSize, MRA_ADDR_LIST *pmalAddrList);
DWORD  MraAddrListGetToBuff(MRA_ADDR_LIST *pmalAddrList, LPSTR lpszBuff, size_t dwBuffSize, size_t *pdwBuffSizeRet);

void   InitXStatusIcons();
void   DestroyXStatusIcons();

DWORD  MraGetVersionStringFromFormatted (LPSTR dwUserAgentFormatted, size_t dwUserAgentFormattedSize, LPSTR lpszVersion, size_t dwVersionSize, size_t *pdwVersionSizeRet);
BOOL   IsUnicodeEnv                    ();
BOOL   IsHTTPSProxyUsed                (HANDLE hNetlibUser);
BOOL   IsContactMraProto               (HANDLE hContact);
BOOL   IsEMailMR                       (LPSTR lpszEMail, size_t dwEMailSize);
BOOL   GetEMailFromString              (LPSTR lpszBuff, size_t dwBuffSize, LPSTR *plpszEMail, size_t *pdwEMailSize);

DWORD  CreateBlobFromContact           (HANDLE hContact, LPWSTR lpwszRequestReason, size_t dwRequestReasonSize, LPBYTE lpbBuff, size_t dwBuffSize, size_t *pdwBuffSizeRet);
size_t CopyNumber                      (LPCVOID lpcOutBuff, LPCVOID lpcBuff, size_t dwLen);
BOOL   IsPhone                         (LPSTR lpszString, size_t dwStringSize);
BOOL   IsContactPhone                  (HANDLE hContact, LPSTR lpszPhone, size_t dwPhoneSize);
HANDLE MraHContactFromPhone            (LPSTR lpszPhone, size_t dwPhoneSize, BOOL bAddIfNeeded, BOOL bTemporary, BOOL *pbAdded);
void   EnableControlsArray             (HWND hWndDlg, WORD *pwControlsList, size_t dwControlsListCount, BOOL bEnabled);
BOOL   MraRequestXStatusDetails        (DWORD dwXStatus);
BOOL   MraSendReplyBlogStatus          (HANDLE hContact);
DWORD  GetYears                        (CONST PSYSTEMTIME pcstSystemTime);
DWORD  FindFile                        (LPWSTR lpszFolder, DWORD dwFolderLen, LPWSTR lpszFileName, DWORD dwFileNameLen, LPWSTR lpszRetFilePathName, DWORD dwRetFilePathLen, DWORD *pdwRetFilePathLen);
DWORD  MemFillRandom                   (LPVOID lpBuff, size_t dwBuffSize);
DWORD  DecodeXML                       (LPTSTR lptszMessage, size_t dwMessageSize, LPTSTR lptszMessageConverted, size_t dwMessageConvertedBuffSize, size_t *pdwMessageConvertedSize);
DWORD  EncodeXML                       (LPTSTR lptszMessage, size_t dwMessageSize, LPTSTR lptszMessageConverted, size_t dwMessageConvertedBuffSize, size_t *pdwMessageConvertedSize);

DWORD  GetMraStatusFromMiradaStatus    (DWORD dwMirandaStatus, DWORD dwXStatusMir, DWORD *pdwXStatusMra);
DWORD  GetMiradaStatusFromMraStatus    (DWORD dwMraStatus, DWORD dwXStatusMra, DWORD *pdwXStatusMir);
DWORD  GetMraXStatusIDFromMraUriStatus (LPSTR lpszStatusUri, size_t dwStatusUriSize);

INT_PTR CALLBACK DlgProcAccount(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);

#endif // !defined(AFX_MRA_H__F58D13FF_F6F2_476C_B8F0_7B9E9357CF48__INCLUDED_)