From 9f631693a3094124ac7f34f1fa34008116ba6afc Mon Sep 17 00:00:00 2001 From: Maciej Wycik Date: Mon, 3 Jun 2013 11:17:43 +0000 Subject: based on IM 0.0.3.4 Exchange plugin +Unicode support git-svn-id: http://svn.miranda-ng.org/main/trunk@4870 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Exchange/Exchange_10.vcxproj | 225 ++++++ plugins/Exchange/Exchange_10.vcxproj.filters | 90 +++ plugins/Exchange/docs/exchange_readme.txt | 149 ++++ plugins/Exchange/docs/exchange_readme_NG.txt | 43 ++ plugins/Exchange/res/exchange.rc | 67 ++ plugins/Exchange/res/mail.ico | Bin 0 -> 1406 bytes plugins/Exchange/res/unread.ico | Bin 0 -> 23558 bytes plugins/Exchange/res/version.rc | 101 +++ plugins/Exchange/src/MirandaExchange.cpp | 1011 ++++++++++++++++++++++++++ plugins/Exchange/src/MirandaExchange.h | 241 ++++++ plugins/Exchange/src/StdAfx.cpp | 8 + plugins/Exchange/src/StdAfx.h | 24 + plugins/Exchange/src/commonheaders.h | 71 ++ plugins/Exchange/src/dlg_handlers.cpp | 514 +++++++++++++ plugins/Exchange/src/dlg_handlers.h | 32 + plugins/Exchange/src/emails.cpp | 424 +++++++++++ plugins/Exchange/src/emails.h | 96 +++ plugins/Exchange/src/exchange.cpp | 99 +++ plugins/Exchange/src/hooked_events.cpp | 176 +++++ plugins/Exchange/src/hooked_events.h | 49 ++ plugins/Exchange/src/resource.h | 29 + plugins/Exchange/src/services.cpp | 50 ++ plugins/Exchange/src/services.h | 35 + plugins/Exchange/src/utils.cpp | 276 +++++++ plugins/Exchange/src/utils.h | 52 ++ plugins/Exchange/src/version.h | 45 ++ 26 files changed, 3907 insertions(+) create mode 100644 plugins/Exchange/Exchange_10.vcxproj create mode 100644 plugins/Exchange/Exchange_10.vcxproj.filters create mode 100644 plugins/Exchange/docs/exchange_readme.txt create mode 100644 plugins/Exchange/docs/exchange_readme_NG.txt create mode 100644 plugins/Exchange/res/exchange.rc create mode 100644 plugins/Exchange/res/mail.ico create mode 100644 plugins/Exchange/res/unread.ico create mode 100644 plugins/Exchange/res/version.rc create mode 100644 plugins/Exchange/src/MirandaExchange.cpp create mode 100644 plugins/Exchange/src/MirandaExchange.h create mode 100644 plugins/Exchange/src/StdAfx.cpp create mode 100644 plugins/Exchange/src/StdAfx.h create mode 100644 plugins/Exchange/src/commonheaders.h create mode 100644 plugins/Exchange/src/dlg_handlers.cpp create mode 100644 plugins/Exchange/src/dlg_handlers.h create mode 100644 plugins/Exchange/src/emails.cpp create mode 100644 plugins/Exchange/src/emails.h create mode 100644 plugins/Exchange/src/exchange.cpp create mode 100644 plugins/Exchange/src/hooked_events.cpp create mode 100644 plugins/Exchange/src/hooked_events.h create mode 100644 plugins/Exchange/src/resource.h create mode 100644 plugins/Exchange/src/services.cpp create mode 100644 plugins/Exchange/src/services.h create mode 100644 plugins/Exchange/src/utils.cpp create mode 100644 plugins/Exchange/src/utils.h create mode 100644 plugins/Exchange/src/version.h (limited to 'plugins') diff --git a/plugins/Exchange/Exchange_10.vcxproj b/plugins/Exchange/Exchange_10.vcxproj new file mode 100644 index 0000000000..130b7de772 --- /dev/null +++ b/plugins/Exchange/Exchange_10.vcxproj @@ -0,0 +1,225 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exchange + {B6FC188B-8E54-4197-9444-8BADE9AA75E2} + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + true + Unicode + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)\Plugins\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Plugins\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + true + + + + Disabled + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + EditAndContinue + 4996;%(DisableSpecificWarnings) + NotUsing + false + + + + + true + Windows + false + $(IntDir)$(TargetName).lib + $(ProfileDir)..\..\bin10\lib + mapi32.lib;ws2_32.lib;%(AdditionalDependencies) + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Full + OnlyExplicitInline + Size + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + false + Fast + Level3 + 4996;%(DisableSpecificWarnings) + NotUsing + false + + + + + true + Windows + true + true + false + $(IntDir)$(TargetName).lib + $(ProfileDir)..\..\bin10\lib + /PDBALTPATH:%_PDB% + mapi32.lib;ws2_32.lib;%(AdditionalDependencies) + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + Full + OnlyExplicitInline + Size + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Level3 + NotUsing + false + + + + + true + true + $(IntDir)$(TargetName).lib + true + Windows + false + $(ProfileDir)..\..\bin10\lib + /PDBALTPATH:%_PDB% + mapi32.lib;ws2_32.lib;%(AdditionalDependencies) + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + EnableFastChecks + MultiThreadedDebugDLL + ..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + Disabled + Level3 + NotUsing + false + + + + + $(IntDir)$(TargetName).lib + false + true + Windows + $(ProfileDir)..\..\bin10\lib + mapi32.lib;ws2_32.lib;%(AdditionalDependencies) + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\include\msapi + + + + + + \ No newline at end of file diff --git a/plugins/Exchange/Exchange_10.vcxproj.filters b/plugins/Exchange/Exchange_10.vcxproj.filters new file mode 100644 index 0000000000..9e3b1007cb --- /dev/null +++ b/plugins/Exchange/Exchange_10.vcxproj.filters @@ -0,0 +1,90 @@ + + + + + {24d86034-8014-45b2-83d7-5b0f0dcd7302} + + + {db8d9eca-31e8-4d72-b8bf-f83f663d6fd4} + + + {bd7eb20f-c543-40d6-9556-32b3c127a442} + + + + + Header files + + + Header files + + + Header files + + + Header files + + + Header files + + + Header files + + + Header files + + + Header files + + + Header files + + + Header files + + + + + Source files + + + Source files + + + Source files + + + Source files + + + Source files + + + Source files + + + Source files + + + Source files + + + + + Resource files + + + Resource files + + + + + Resource files + + + Resource files + + + + + \ No newline at end of file diff --git a/plugins/Exchange/docs/exchange_readme.txt b/plugins/Exchange/docs/exchange_readme.txt new file mode 100644 index 0000000000..cba731781a --- /dev/null +++ b/plugins/Exchange/docs/exchange_readme.txt @@ -0,0 +1,149 @@ +Exchange mail notifier plugin v.0.0.3.3 +Copyright © 2006-2009 Cristian Libotean, Attila Vajda + +This plugin notifies you if you have unread emails on an exchange server. + +You need to have an Exchange server present that accepts SMTP connections. You need to have Outlook +installed (mapi dll hell :) ) and a recent miranda version ( > 0.4). +You enter your email account, your password (you can leave this blank if you want - if you don't +enter it exchange will ask for your password and you'll have an option to remember it). Enter the +Exchange server ip or hostname and the port which accepts SMTP connections. The port is not needed +for the actual connection but it is needed in order to check that the server is available - if the server +is blocking the port you won't get notified as the plugin will think it can't connect to the server. + +Changes: + ++ : new feature +* : changed +! : bufgix +- : feature removed or disabled because of pending bugs + +v. 0.0.3.3 - 2009/06/05 + + Added support for core variables for user name field. + +v. 0.0.3.2 - 2009/01/28 + * Added unicode aware flag + ! Manually initiated checks were treated the same as automatic checks + +v. 0.0.3.1 - 2008/01/24 + * Changed beta versions server. + +v. 0.0.3.0 - 2007/08/30 + * Check mailbox in separate thread. + +v. 0.0.2.0 - 2007/03/06 + + Added UUID ( {2fd0df15-7098-41ce-aa92-ff621806e38b} ). + + Added EXCHANGE interface. + +v. 0.0.1.12 - 2007/02/06 + ! Fixed a crash that occured sometimes when moving emails in Outlook and then trying to mark them as read with the plugin. + +v. 0.0.1.11 - 2007/01/31 + * Changed beta URL. + +v. 0.0.1.10 - 2007/01/07 + + New version resource file. + +v. 0.0.1.9 - 2006/11/26 + + Added dll version info. + * Changed controls tab order. + +v. 0.0.1.8 - 2006/10/20 + ! Fixed maximum number of automatic connection attempts. + +v. 0.0.1.7 - 2006/10/02 + + Added how to make it work info to readme file. + + Option to disable server port check. + ! Don't try to connect if server not configured. + * Removed dependency on msvcr80 (file size doubled :( ) + +v. 0.0.1.6 - 2006/09/26 + ! Miranda will exit a lot sooner :) + * Changed popup title to "Exchange notifier" + +v. 0.0.1.4 - 2006/09/26 + + Updater support (beta versions) + ! In certain circumstances plugin reported 0 emails. + * Some other things i don't know :) + +v. 0.0.1.3 - 2006/09/19 + ! Don't show "cannot connect" popup too often + +v. 0.0.1.2 - 2006/09/14 + + Rebased dll (0x2F010000). + + Option to reconnect every x minutes (logout and then login again - without this Exchange server might block the connection after a while). + * Check for email after Miranda starts. + ! Fixed bug which made the plugin lose its connection with the Exchange server and always report 0 emails. + +v. 0.0.1.1 - 2006/09/01 + + Added option to disable automatic checking. + ! Miranda won't hang on exit anymore. + +v. 0.0.1.0 - 2006/08/23 + * Use miranda pre shutdown event to disconnect from exchange server. + + Added icon to emails dialog. + * Emails dialog is only created when needed. + ! Marking events as read and then clicking the popup again would crash Miranda. + * Disable the popups checkbox if no popup module is present. + ! Apply button is now disabled when options dialog is created. + * Don't show emails window if no emails are available. + +v. 0.0.0.9 - 2006/06/01 + * Some minor changes. + +v. 0.0.0.8 - 2006/05/xx + + Internal build. + +v. 0.0.0.7 - 2006/05/18 + + First release on miranda's File Listing. + + +Translation strings - last update v0.0.1.8: +[Check exchange mailbox] +;Options +[Plugins] +[Exchange notify] +;Options dialog +[Username :] +[Password :] +[Server :] +[Connection] +[Preferences] +[Show email notifications using popup module] +[Check server before trying to connect] +[Try to connect] +[times before giving up.] +;Unread emails window +[Unread emails] +[Mark as read] +[Close] +[Entry ID] +[Subject] +[Sender] +;Popups/message boxes +[You have %d unread emails ...] +[You have one unread email ...] +[Exchange email] +[Do you want to see the email headers ?] +[Server is not configured ...] +[Server not available] +[Cannot connect to Exchange server ...] +[Connecting to Exchange ...] +[Forcefully reconnecting to Exchange server ...] + + + + +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. diff --git a/plugins/Exchange/docs/exchange_readme_NG.txt b/plugins/Exchange/docs/exchange_readme_NG.txt new file mode 100644 index 0000000000..0f89f4e681 --- /dev/null +++ b/plugins/Exchange/docs/exchange_readme_NG.txt @@ -0,0 +1,43 @@ +Exchange mail notifier plugin v.0.1.3.4 +Copyright © 2006-2009 Cristian Libotean, Attila Vajda, MaKaR + +This plugin notifies you if you have unread emails on an exchange server. + +This miranda NG version is based on Miranda IM exchange plugin (0.0.3.3). +Base sources dowloaded from (http://eblis.tla.ro/projects/miranda/Exchange/Exchange src 0.0.3.3.zip) + +You need to have an Exchange server present that accepts SMTP connections. You need to have Outlook +installed (mapi dll hell :) ) and a recent miranda NG version. +You enter your email account, your password (you can leave this blank if you want - if you don't +enter it exchange will ask for your password and you'll have an option to remember it). Enter the +Exchange server ip or hostname and the port which accepts SMTP connections. The port is not needed +for the actual connection but it is needed in order to check that the server is available - if the server +is blocking the port you won't get notified as the plugin will think it can't connect to the server. + +For 64bit miranda both windows and office must be 64bit (not tested) +Changes: + ++ : new feature +* : changed +! : bufgix +- : feature removed or disabled because of pending bugs + +v. 0.1.3.4 - 2013/05/29 + * Ported to Miranda NG + * Unicode support + + + +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. diff --git a/plugins/Exchange/res/exchange.rc b/plugins/Exchange/res/exchange.rc new file mode 100644 index 0000000000..a466a56cc8 --- /dev/null +++ b/plugins/Exchange/res/exchange.rc @@ -0,0 +1,67 @@ +// Generated by ResEdit 1.5.11 +// Copyright (C) 2006-2012 +// http://www.resedit.net + +#include +#include +#include +#include "src\resource.h" + + + + +// +// Dialog resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT +IDD_EMAILS DIALOGEX 0, 0, 306, 149 +STYLE DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_THICKFRAME | WS_SYSMENU +CAPTION "Unread emails" +FONT 8, "MS Shell Dlg", 400, 0, 1 +{ + DEFPUSHBUTTON "Close", IDC_CLOSE, 249, 128, 50, 14 + CONTROL "", IDC_EMAILS_LIST, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT, 7, 7, 292, 115 + PUSHBUTTON "Mark as read", IDC_MARK_READ, 7, 128, 50, 14 +} + + + +LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT +IDD_OPT_EXCHANGE DIALOGEX 0, 0, 187, 155 +STYLE DS_CONTROL | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU +CAPTION "Dialog" +FONT 8, "MS Shell Dlg", 400, 0, 1 +{ + GROUPBOX "Connection", IDC_STATIC, 4, 4, 179, 65 + LTEXT "Username :", IDC_STATIC, 7, 21, 58, 8, SS_LEFT + EDITTEXT IDC_USER_EDIT, 65, 16, 113, 14, ES_AUTOHSCROLL + LTEXT "Password :", IDC_STATIC, 7, 36, 58, 8, SS_LEFT + EDITTEXT IDC_PASSWORD_EDIT, 65, 32, 113, 14, ES_AUTOHSCROLL | ES_PASSWORD + LTEXT "Server :", IDC_STATIC, 7, 54, 27, 8, SS_LEFT + EDITTEXT IDC_SERVER_EDIT, 65, 51, 83, 14, ES_AUTOHSCROLL + EDITTEXT IDC_PORT_EDIT, 150, 51, 28, 14, ES_AUTOHSCROLL + GROUPBOX "Preferences", IDC_STATIC, 4, 69, 179, 81 + AUTOCHECKBOX "Check every", IDC_CHECK_EMAILS, 9, 80, 64, 9 + EDITTEXT IDC_INTERVAL_EDIT, 108, 76, 27, 14, ES_AUTOHSCROLL + LTEXT "seconds.", IDC_STATIC, 143, 80, 35, 8, SS_LEFT + AUTOCHECKBOX "Force reconnect every", IDC_RECONNECT, 9, 95, 88, 9 + EDITTEXT IDC_RECONNECT_INTERVAL, 108, 93, 27, 14, ES_AUTOHSCROLL + LTEXT "minutes.", IDC_STATIC, 143, 96, 34, 8, SS_LEFT + AUTOCHECKBOX "Check server before trying to connect", IDC_USE_PORTCHECK, 9, 110, 169, 10 + LTEXT "Try to connect", IDC_STATIC, 9, 124, 52, 8, SS_LEFT + EDITTEXT IDC_MAX_RETRIES, 62, 121, 20, 14, ES_AUTOHSCROLL + LTEXT "times before giving up.", IDC_STATIC, 86, 124, 92, 8, SS_LEFT + AUTOCHECKBOX "Show email notifications using popup module", IDC_USE_POPUPS, 9, 137, 169, 10 +} + + + +// +// Icon resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT +IDI_MAIL ICON "res\\mail.ico" + + +LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT +IDI_UNREAD ICON "res\\unread.ico" diff --git a/plugins/Exchange/res/mail.ico b/plugins/Exchange/res/mail.ico new file mode 100644 index 0000000000..3fd311bf13 Binary files /dev/null and b/plugins/Exchange/res/mail.ico differ diff --git a/plugins/Exchange/res/unread.ico b/plugins/Exchange/res/unread.ico new file mode 100644 index 0000000000..18e06ddedc Binary files /dev/null and b/plugins/Exchange/res/unread.ico differ diff --git a/plugins/Exchange/res/version.rc b/plugins/Exchange/res/version.rc new file mode 100644 index 0000000000..5b6f331f5a --- /dev/null +++ b/plugins/Exchange/res/version.rc @@ -0,0 +1,101 @@ +// Microsoft Visual C++ generated resource script. +// +#include "src\resource.h" +#include "src\version.h" +#include "windows.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +//#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource1.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION __PLUGINVERSION_STRING + PRODUCTVERSION __PLUGINVERSION_STRING + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Author", __AUTHOR + VALUE "FileDescription", __DESC + VALUE "FileVersion", __VERSION_STRING + VALUE "InternalName", __PLUGIN_DISPLAY_NAME + VALUE "LegalCopyright", __COPYRIGHT + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/Exchange/src/MirandaExchange.cpp b/plugins/Exchange/src/MirandaExchange.cpp new file mode 100644 index 0000000000..b0fad31eb1 --- /dev/null +++ b/plugins/Exchange/src/MirandaExchange.cpp @@ -0,0 +1,1011 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +/******************************************************************** + created: 2006/04/11 + created: 11:4:2006 17:28 + filename: MirandaExchange.cpp + file base: MirandaExchange + file ext: cpp + author: Attila Vajda + + purpose: Miranda Exchange Plugin +*********************************************************************/ + +#include "stdafx.h" +#include "MirandaExchange.h" +#include "commonheaders.h" +#include "utils.h" + +#include + +#ifndef NO_EXCHANGE_TEST + +////////////////////////////////////////////////////////////////////////// +HRESULT HrMAPIFindDefaultMsgStore( // RETURNS: return code + IN LPMAPISESSION lplhSession, // session pointer + OUT ULONG *lpcbeid, // count of bytes in entry ID + OUT LPENTRYID *lppeid) // entry ID of default store +{ + HRESULT hr = NOERROR; + HRESULT hrT = NOERROR; + SCODE sc = 0; + LPMAPITABLE lpTable = NULL; + LPSRowSet lpRows = NULL; + LPENTRYID lpeid = NULL; + ULONG cbeid = 0; + ULONG cRows = 0; + ULONG i = 0; + + SizedSPropTagArray(2, rgPropTagArray)={2,{PR_DEFAULT_STORE,PR_ENTRYID}}; + + // Get the list of available message stores from MAPI + hrT = MAPICALL(lplhSession)->GetMsgStoresTable( 0, &lpTable); + + if(!FAILED(hrT)) + { + // Get the row count for the message recipient table + hrT = MAPICALL(lpTable)->GetRowCount(0, &cRows); + if(!FAILED(hrT)) + { + // Set the columns to return + hrT = MAPICALL(lpTable)->SetColumns((LPSPropTagArray)&rgPropTagArray, 0); + if(!FAILED(hrT)) + { + // Go to the beginning of the recipient table for the envelope + hrT = MAPICALL(lpTable)->SeekRow( BOOKMARK_BEGINNING, 0, NULL); + if(!FAILED(hrT)) + { + // Read all the rows of the table + hrT = MAPICALL(lpTable)->QueryRows( cRows, 0, &lpRows); + if(SUCCEEDED(hrT) && (lpRows != NULL) && (lpRows->cRows == 0)) + { + FreeProws(lpRows); + lpRows = NULL; + hrT = MAPI_E_NOT_FOUND; + } + } + } + } + } + + if( !FAILED(hrT) ) + { + bool bGetOut = false; + for(i = 0; (i < cRows) && (!bGetOut); i++) + { + if(lpRows->aRow[i].lpProps[0].Value.b == TRUE) + { + cbeid = lpRows->aRow[i].lpProps[1].Value.bin.cb; + + sc = MAPIAllocateBuffer(cbeid, (void **)&lpeid); + + if(FAILED(sc)) + { + cbeid = 0; + lpeid = NULL; + bGetOut = true; + } + else + { + // Copy entry ID of message store + CopyMemory(lpeid,lpRows->aRow[i].lpProps[1].Value.bin.lpb,cbeid); + bGetOut = true; + } + } + } + } + + if(lpRows != NULL) + { + FreeProws(lpRows); + } + + UlRelease(lpTable); + *lpcbeid = cbeid; + *lppeid = lpeid; + return hr; +} + + +CKeeper::CKeeper( LPTSTR szSender, LPTSTR szSubject, LPSTR szEntryID) +{ + m_szSender = NULL ; + m_szSubject = NULL ; + m_szEntryID = NULL ; + m_nSizeSender = 0 ; + m_nSizeSubject = 0 ; + m_nSizeEntryID = 0 ; + + if (NULL != szSender ) + { + m_nSizeSender = _tcslen ( szSender ) +1; + m_szSender = new TCHAR[ m_nSizeSender ]; + memset ( m_szSender, 0, m_nSizeSender * sizeof(TCHAR) ); + _tcscpy( m_szSender, szSender); + } + + if ( NULL != szSubject ) + { + m_nSizeSubject = _tcslen( szSubject ) +1; + m_szSubject = new TCHAR[m_nSizeSubject]; + memset ( m_szSubject, 0, m_nSizeSubject * sizeof(TCHAR) ); + _tcscpy( m_szSubject, szSubject ); + } + + if ( NULL != szEntryID ) + { + m_nSizeEntryID = strlen( szEntryID ) +1; + m_szEntryID = new char[m_nSizeEntryID]; + memset ( m_szEntryID, 0, m_nSizeEntryID * sizeof(char) ); + strcpy( m_szEntryID, szEntryID ); + } +} + +CKeeper::~CKeeper() +{ + if ( m_nSizeSender>0 && NULL != m_szSender ) + { + m_nSizeSender =0; + delete[] m_szSender; + m_szSender = NULL; + } + + if ( m_nSizeSubject>0 && NULL != m_szSubject ) + { + m_nSizeSender =0; + delete[] m_szSubject; + m_szSubject = NULL; + } + + if ( m_nSizeEntryID>0 && NULL != m_szEntryID ) + { + m_nSizeEntryID = 0; + delete[] m_szEntryID; + m_szEntryID = NULL; + } +} + +CMirandaExchange::CMirandaExchange() +{ + UINT nSize = 0; + short nSizeOfTCHAR = sizeof( TCHAR ); + + m_szUsername = NULL ; + m_szPassword = NULL ; + m_szExchangeServer = NULL ; + m_lpMAPISession = NULL ; + m_lpInbox = NULL ; + m_lpMDB = NULL; + m_bLoginOK = false ; + m_bFolderInboxOK = false ; + m_nNumberOfHeaders = 0 ; +} + +CMirandaExchange::~CMirandaExchange() +{ + if ( NULL != m_szUsername ) + { + delete[] m_szUsername; + m_szUsername = NULL; + } + + if ( NULL != m_szPassword ) + { + delete[] m_szPassword; + m_szPassword = NULL; + } + + if ( NULL != m_szExchangeServer ) + { + delete[] m_szExchangeServer; + m_szExchangeServer = NULL; + } + + if ( NULL != m_lpInbox ) + { + UlRelease(m_lpInbox); + m_lpInbox = NULL; + } + + if ( NULL != m_lpMDB ) + { + UlRelease(m_lpMDB ); + m_lpMDB = NULL; + } + + if( NULL!= m_lpMAPISession ) + { + m_lpMAPISession->Logoff(NULL,NULL,NULL); + UlRelease(m_lpMAPISession ); + m_lpMAPISession = NULL; + } + + if ( m_nNumberOfHeaders>0 && NULL != m_HeadersKeeper ) + { + for( UINT i=0; iOpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulFlags, + &ulObjType, + &lpUnk); + if (MAPI_E_UNKNOWN_FLAGS == hRes && ulNoCacheFlags) + { + hRes = S_OK; + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + (lpMDB->OpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulNoCacheFlags, + &ulObjType, + &lpUnk)); + } + if (FAILED(hRes)) + { + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + } + } + if (lpAB && !lpUnk) + { + hRes = S_OK; + //Log(_T("CallOpenEntry: Calling OpenEntry on AB with ulFlags = 0x%X\n"),ulFlags); + (lpAB->OpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulFlags, + &ulObjType, + &lpUnk)); + if (MAPI_E_UNKNOWN_FLAGS == hRes && ulNoCacheFlags) + { + hRes = S_OK; + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + (lpAB->OpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulNoCacheFlags, + &ulObjType, + &lpUnk)); + } + if (FAILED(hRes)) + { + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + } + } + + if (lpContainer && !lpUnk) + { + hRes = S_OK; + //Log(_T("CallOpenEntry: Calling OpenEntry on Container with ulFlags = 0x%X\n"),ulFlags); + (lpContainer->OpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulFlags, + &ulObjType, + &lpUnk)); + if (MAPI_E_UNKNOWN_FLAGS == hRes && ulNoCacheFlags) + { + hRes = S_OK; + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + (lpContainer->OpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulNoCacheFlags, + &ulObjType, + &lpUnk)); + } + if (FAILED(hRes)) + { + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + } + } + + if (lpMAPISession && !lpUnk) + { + hRes = S_OK; + //Log(_T("CallOpenEntry: Calling OpenEntry on Session with ulFlags = 0x%X\n"),ulFlags); + (lpMAPISession->OpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulFlags, + &ulObjType, + &lpUnk)); + if (MAPI_E_UNKNOWN_FLAGS == hRes && ulNoCacheFlags) + { + hRes = S_OK; + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + (lpMAPISession->OpenEntry( + cbEntryID, + lpEntryID, + NULL,//no interface + ulNoCacheFlags, + &ulObjType, + &lpUnk)); + } + if (FAILED(hRes)) + { + if (lpUnk) (lpUnk)->Release(); + lpUnk = NULL; + } + } + + if (lpUnk) + { + //Log(_T("OnOpenEntryID: Got object (0x%08X) of type 0x%08X = %s\n"),lpUnk,ulObjType,ObjectTypeToString(ulObjType)); + *lppUnk = lpUnk; + } + if (ulObjTypeRet) *ulObjTypeRet = ulObjType; + return hRes; +} + +HRESULT CallOpenEntry( LPMDB lpMDB, LPADRBOOK lpAB, LPMAPICONTAINER lpContainer, LPMAPISESSION lpMAPISession, + LPSBinary lpSBinary, ULONG ulFlags, ULONG* ulObjTypeRet, LPUNKNOWN* lppUnk) +{ + return CallOpenEntry( lpMDB, lpAB, lpContainer, lpMAPISession, lpSBinary?lpSBinary->cb:0, + (LPENTRYID)(lpSBinary?lpSBinary->lpb:0), ulFlags, ulObjTypeRet, lppUnk); +} + +HRESULT CMirandaExchange::InitializeAndLogin( LPCTSTR szUsername, LPCTSTR szPassword, LPCTSTR szExchangeServer ) +{ + _popupUtil("Connecting to Exchange ..."); + UINT nSize = 0; + short nSizeOfTCHAR = sizeof( TCHAR ); + + if ( ( m_szUsername == NULL ) && ( NULL != szUsername ) ) + { + nSize = _tcslen(szUsername); + if (nSize>0) + { + nSize++; + m_szUsername = new TCHAR[ nSize ]; + memset ( m_szUsername, 0, nSize * nSizeOfTCHAR ); + _tcscpy( m_szUsername, szUsername ); + } + } + + if ( ( m_szPassword == NULL ) && ( NULL != szPassword ) ) + { + nSize = _tcslen( szPassword ); + if ( nSize>0 ) + { + nSize++; + m_szPassword = new TCHAR[ nSize ]; + memset ( m_szPassword, 0, nSize * nSizeOfTCHAR ); + _tcscpy( m_szPassword, szPassword ); + } + } + + if ( ( m_szExchangeServer == NULL ) && ( NULL != szExchangeServer ) ) + { + nSize = _tcslen(szExchangeServer); + if ( nSize>0 ) + { + nSize++; + m_szExchangeServer = new TCHAR[ nSize ]; + memset ( m_szExchangeServer, 0, nSize * nSizeOfTCHAR ); + _tcscpy( m_szExchangeServer, szExchangeServer ); + } + } + + if ( !m_bLoginOK || m_lpInbox || NULL == m_lpMAPISession ) + { + HRESULT hr = S_OK; + LPMDB lpMDB = NULL; + MAPIINIT_0 mapiInit = { MAPI_INIT_VERSION , MAPI_MULTITHREAD_NOTIFICATIONS }; + + if( !m_bNoInitAgain) + { + m_bNoInitAgain = true; + hr = MAPIInitialize( &mapiInit) ; + } + + if( FAILED(hr) ) + { + //Log("Failed to initialize MAPI\n"); + } + else + { + TCHAR szPIDandName[128]; + TCHAR szPID[20]; + + _tstrtime( szPID ); + _tcscpy(szPIDandName,m_szUsername); + _tcscat(szPIDandName,szPID ); + + hr = CreateProfile( szPIDandName); + if ( HR_FAILED(hr ) ) + { + //Log("Create profile failed: 0x%08X", hr); + return hr; + } + + DWORD dwFlags = MAPI_EXPLICIT_PROFILE|MAPI_EXTENDED|MAPI_NEW_SESSION|MAPI_NO_MAIL ; + + hr = MAPILogonEx( 0, szPIDandName, m_szPassword, dwFlags, &m_lpMAPISession ); + + if (FAILED(hr)) + { + //Log( _T("MAPI Logon failed: 0x%08X"), hr ); + return hr; + } + + LPPROFADMIN pProfAdmin = NULL; + hr = MAPIAdminProfiles( 0, &pProfAdmin ); + + if ((FAILED(hr)) || (NULL == pProfAdmin)) + { + //Log("Admin profile interface creation failed: 0x%08X", hr); + } + else + { + hr = pProfAdmin->DeleteProfile( szPIDandName, 0 ); + + if ( FAILED(hr) ) + { + //Log( "Failed to delete the profile: 0x%08X", hr ); + } + } + + if (pProfAdmin) + { + pProfAdmin->Release(); + } + + ULONG cbDefStoreEid = 0; + + CMAPIBuffer< LPENTRYID> pDefStoreEid = NULL; + hr = HrMAPIFindDefaultMsgStore(m_lpMAPISession, &cbDefStoreEid, &pDefStoreEid ); + if (FAILED(hr)) + { + return hr; + } + + // Open default message store + LPMDB pDefMsgStore = NULL; + hr = m_lpMAPISession->OpenMsgStore(0, cbDefStoreEid, pDefStoreEid, NULL, + MAPI_BEST_ACCESS, &pDefMsgStore); + + HRESULT hRes = S_OK; + ULONG cbInboxEID = NULL; + CMAPIBuffer< LPENTRYID> lpInboxEID = NULL; + + if (NULL == pDefMsgStore ) + { + return hr; + } + + hRes = pDefMsgStore->GetReceiveFolder( _T("IPM"), NULL, &cbInboxEID, &lpInboxEID, NULL); + m_lpMDB = pDefMsgStore; + if (cbInboxEID && lpInboxEID) + { + hRes = CallOpenEntry( pDefMsgStore, NULL, NULL, NULL, cbInboxEID, lpInboxEID, MAPI_BEST_ACCESS, NULL, (LPUNKNOWN*)&m_lpInbox); + + if ( m_lpInbox && hRes == S_OK) + { + m_bFolderInboxOK = true; + } + } + } + } + + return S_OK; +} + +HRESULT CMirandaExchange::CreateProfile( LPTSTR szProfileName ) +{ + //TCHAR sz[200];_stprintf(sz, "Create Profile('%s', '%s', '%s')", szProfileName, m_szUsername, m_szExchangeServer);Log(sz); + + HRESULT hr = S_OK; + CMAPIInterface pProfAdmin = NULL; + CMAPIInterface pMsgSvcAdmin = NULL; + CMAPIInterface pMsgSvcTable = NULL; + LPSRowSet pRows = NULL; + + enum {iSvcName, iSvcUID, cptaSvc}; + + SizedSPropTagArray(cptaSvc, sptCols) = + { + cptaSvc, + PR_SERVICE_NAME, + PR_SERVICE_UID + }; + + hr = MAPIAdminProfiles(0, &pProfAdmin); + + if (!(FAILED(hr)) || (pProfAdmin)) + { + hr = pProfAdmin->CreateProfile(szProfileName, NULL, NULL, 0); + + if (!FAILED(hr)) + { + hr = pProfAdmin->AdminServices( szProfileName, NULL, NULL, 0, &pMsgSvcAdmin); + + if ( !(FAILED(hr)) || (pMsgSvcAdmin) ) + { + hr = pMsgSvcAdmin->CreateMsgService((LPTSTR)"MSEMS", (LPTSTR)""/*"Microsoft Exchange Server"*/, NULL, 0); + + if (!FAILED(hr)) + { + hr = pMsgSvcAdmin->GetMsgServiceTable(0, &pMsgSvcTable); + if ( !(FAILED(hr)) || ( pMsgSvcTable) ) + { + SRestriction sres; + sres.rt = RES_CONTENT; + sres.res.resContent.ulFuzzyLevel = FL_FULLSTRING; + sres.res.resContent.ulPropTag = PR_SERVICE_NAME_A; + SPropValue spv; + sres.res.resContent.lpProp = &spv; + spv.ulPropTag = PR_SERVICE_NAME_A; + spv.Value.lpszA = (LPSTR)"MSEMS"; + + hr = HrQueryAllRows(pMsgSvcTable, + (LPSPropTagArray) &sptCols, + &sres, + NULL, + 0, + &pRows); + + if (!FAILED(hr)) + { + UINT nSize = _tcslen(m_szUsername)+2; + + TCHAR* szUniqName = new TCHAR[nSize]; + + memset( szUniqName, 0, nSize*sizeof(TCHAR) ); + _tcscpy( szUniqName,_T("=")); + _tcscat( szUniqName, m_szUsername); + + // Set values for PR_PROFILE_UNRESOLVED_NAME and PR_PROFILE_UNRESOLVED_SERVER + SPropValue spval[2]; + spval[0].ulPropTag = PR_PROFILE_UNRESOLVED_NAME; + spval[0].Value.lpszA = mir_t2a(szUniqName); + spval[1].ulPropTag = PR_PROFILE_UNRESOLVED_SERVER; + spval[1].Value.lpszA = mir_t2a(m_szExchangeServer); + + + // Configure msg service + /*hr =*/ pMsgSvcAdmin->ConfigureMsgService( + (LPMAPIUID) pRows->aRow->lpProps[iSvcUID].Value.bin.lpb, + 0, NULL, 2, spval); + + if (NULL!=szUniqName) + { + delete[] szUniqName; + } + } + } + } + } + } + else + { + pProfAdmin->DeleteProfile(szProfileName, 0); + } + } + + if (pRows) + { + FreeProws(pRows); + } + + return hr; +} + +HRESULT CMirandaExchange::isMapiSessionOK( LPMAPISESSION lpSession ) +{ + return S_OK; +} + +HRESULT CMirandaExchange::CheckForNewMails( int &nNewMails) +{ + HRESULT hRes; + if ( m_nNumberOfHeaders>0 && NULL != m_HeadersKeeper ) + { + for( UINT i=0; iLogoff( NULL, NULL, NULL ); + m_lpMAPISession->Release(); + m_lpMAPISession = NULL; + } + + if ( m_nNumberOfHeaders>0 && NULL != m_HeadersKeeper ) + { + for( UINT i=0; iSetReadFlag( 0 ); + hr = lpMessage->SaveChanges(FORCE_SAVE); + + lpMessage->Release(); + lpMessage = NULL; + } + + return 0; +} + + +HRESULT CMirandaExchange::CheckInFolder( LPMAPIFOLDER lpFolder ) +{ + HRESULT hr = NOERROR; + + if ( lpFolder != NULL && m_bFolderInboxOK ) + { + + CMAPIInterface lpTable = NULL ; + LPSRowSet lpRow = NULL ; + LPSPropValue lpRowProp = NULL ; + ULONG i = 0L ; + ULONG *lpcbeid = 0 ; + + SizedSPropTagArray(5,sptaDETAILS) = + { + 5, + { + PR_ENTRYID, + PR_MESSAGE_FLAGS, + PR_SENDER_NAME, + PR_ORIGINAL_SENDER_EMAIL_ADDRESS, + PR_SUBJECT + } + }; + + CMAPIInterface lpMessageTable; + + hr = lpFolder->GetContentsTable( 0, &lpMessageTable ); + if( HR_FAILED( hr ) ) + { + return -1; + } + + LPSRowSet lpRowsR = NULL; + + ////////////////////////////////////////////////////////////////////////// + SRestriction srRoot; + srRoot.rt = RES_BITMASK; + srRoot.res.resBitMask.relBMR = BMR_EQZ; + srRoot.res.resBitMask.ulPropTag = PR_MESSAGE_FLAGS; + srRoot.res.resBitMask.ulMask = MSGFLAG_READ; + + SizedSSortOrderSet( 1, sso ) = { 1, 0, 0, { PR_MESSAGE_DELIVERY_TIME, TABLE_SORT_DESCEND } }; + + hr = HrQueryAllRows( lpMessageTable, (LPSPropTagArray) &sptaDETAILS,&srRoot,(LPSSortOrderSet) & sso,0L, &lpRowsR ); + + ////////////////////////////////////////////////////////////////////////// + + if( HR_FAILED( hr ) ) + { + return -1; + } + else + { + TCHAR* szSenderName = NULL; + TCHAR* szSubject = NULL; + LPSTR szEntryID = NULL; + + for( i = 0; ( i < lpRowsR->cRows) && ( m_nNumberOfHeaders < MAX_NUMBER_OF_HEADERS ); ++i ) + { + if ( !(lpRowsR->aRow[ i ].lpProps[ 1 ].Value.l & MSGFLAG_READ) ) + { + + if( !FAILED(lpRowsR->aRow[i].lpProps[2].Value.err) ) + { + szSenderName = lpRowsR->aRow[i].lpProps[2].Value.lpszW; + } + + if ( NULL == szSenderName) + { + if( !FAILED(lpRowsR->aRow[i].lpProps[3].Value.err)) + { + szSenderName = lpRowsR->aRow[i].lpProps[3].Value.lpszW; + } + } + + + if( !FAILED(lpRowsR->aRow[i].lpProps[4].Value.err) ) + { + szSubject = lpRowsR->aRow[i].lpProps[4].Value.lpszW; + } + + szEntryID = BinToHex( lpRowsR->aRow[i].lpProps[0].Value.bin.cb, lpRowsR->aRow[i].lpProps[0].Value.bin.lpb ); + m_HeadersKeeper[m_nNumberOfHeaders] = new CKeeper( szSenderName, szSubject, szEntryID ); + m_nNumberOfHeaders++; + + delete[] szEntryID; + + szEntryID = NULL; + szSubject = NULL; + szSenderName = NULL; + } + } + + if (lpRowsR) + { + FreeProws(lpRowsR); + } + } + + if (m_nNumberOfHeadersGetHierarchyTable( MAPI_DEFERRED_ERRORS, &lpTable); + if (!FAILED(hr)) + { + hr = HrQueryAllRows( lpTable, (LPSPropTagArray)&rgColProps, NULL, NULL, 0L, &lpRow); + if (!FAILED(hr)) + { + for(i = 0; i < lpRow->cRows; i++) + { + lpRowProp = lpRow->aRow[i].lpProps; + CMAPIInterface lpSubFolder = NULL; + hr = CallOpenEntry( m_lpMDB, NULL, NULL, NULL, lpRowProp[IENTRYID].Value.bin.cb, (LPENTRYID)lpRowProp[IENTRYID].Value.bin.lpb, MAPI_BEST_ACCESS, NULL, (LPUNKNOWN*)&lpSubFolder ); + if( !FAILED(hr) ) + { + hr = CheckInFolder( lpSubFolder ); + //if (FAILED(hr) ){//Log("failed checkinfolder for %s\n",lpRowProp[IDISPNAME].Value.lpszA );} + } + } + } + + if (NULL != lpRow) + { + FreeProws(lpRow); + lpRow = NULL; + } + } + } + } + + return hr; +} + +HRESULT CMirandaExchange::OpenTheMessage( LPTSTR szEntryID ) +{ + //(Default)//// HKEY_CLASSES_ROOT\mailto\shell\open\command + HKEY hTheKey; + HRESULT hRes = E_FAIL; + + TCHAR szRegValue[ 512 ]; + DWORD dwLength = 512 ; + DWORD dwType = REG_SZ; + + if( RegOpenKeyEx(HKEY_CLASSES_ROOT, + _T("mailto\\shell\\open\\command"), + 0, + KEY_ALL_ACCESS | KEY_EXECUTE | KEY_QUERY_VALUE , + &hTheKey) == ERROR_SUCCESS + ) + { + LONG lResult = RegQueryValueEx( hTheKey, NULL, NULL, (LPDWORD)&dwType, (LPBYTE)szRegValue, &dwLength); + RegCloseKey( hTheKey ); + + if( lResult != ERROR_SUCCESS ) + { + hRes = E_FAIL; + } + else + { + + TCHAR* szTheEnd = _tcsstr( szRegValue,_T(".EXE") ); + + if( NULL != szTheEnd ) + { + szRegValue[ _tcslen(szRegValue) - _tcslen(szTheEnd) +5 ] = _T('\0'); + _tcscat( szRegValue, _T(" /recycle") ); + STARTUPINFO si; + PROCESS_INFORMATION pi; + + DWORD dwCode = 0; + + ZeroMemory ( &si, sizeof ( STARTUPINFO)); + + si.cb = sizeof ( STARTUPINFO); + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = SW_SHOWNORMAL; + + if( CreateProcess ( NULL, + szRegValue, + NULL, + NULL, + 0, + NORMAL_PRIORITY_CLASS, + NULL, + NULL, + &si, + &pi + )) + { + hRes = S_OK; + } + } + } + } + else + { + hRes = E_FAIL; + } + + return hRes; + +} +#endif //NO_EXCHANGE_TEST \ No newline at end of file diff --git a/plugins/Exchange/src/MirandaExchange.h b/plugins/Exchange/src/MirandaExchange.h new file mode 100644 index 0000000000..47f76d2107 --- /dev/null +++ b/plugins/Exchange/src/MirandaExchange.h @@ -0,0 +1,241 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +/******************************************************************** + created: 2006/04/11 + created: 11:4:2006 17:27 + filename: MirandaExchange.h + file base: MirandaExchange + file ext: h + author: Attila Vajda + + purpose: Miranda Exchange Plugin +*********************************************************************/ + +//define if you want to test only the miranda part, and not the exchange one. +//#define NO_EXCHANGE_TEST + +#ifndef NO_EXCHANGE_TEST + +#if !defined(MIRANDAEXCHANGE_H__INCLUDED_) +#define MIRANDAEXCHANGE_H__INCLUDED_ + +#undef _DEBUG +#undef DEBUG + +#include +#include + +#define _DEBUG +#define DEBUG + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define MAX_NUMBER_OF_HEADERS 512 + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define MAPICALL(x) (x)->lpVtbl +#else +#define MAPICALL(x) (x) +#endif + +#define FREEPROWS(x) \ +{ \ + FreeProws((x)); \ + (x) = NULL; \ +} + + +#define pidFolderMin 0x6638 +#define pidProfileMin 0x6600 +#define PR_PROFILE_UNRESOLVED_NAME PROP_TAG( PT_STRING8, pidProfileMin+0x07) +#define PR_PROFILE_UNRESOLVED_SERVER PROP_TAG( PT_STRING8, pidProfileMin+0x08) +#define PR_FOLDER_CHILD_COUNT PROP_TAG( PT_LONG, pidFolderMin) + +// ----------------------------------------------------------------------------- +// Helpers.h: Template Class that wraps MAPI buffers or interfaces so that you +// don't have to concern yourself with freeing or releasing them. +// +// Copyright (C) Microsoft Corp. 1986 - 2000. All Rights Reserved. +// ----------------------------------------------------------------------------- + +#ifndef _HELPERS_H_ +#define _HELPERS_H_ + +// ----------------------------------------------------------------------------- +// Use this class to wrap a pointer to a mapi buffer. It will automaticly get +// freed when it goes out of scope. Use the instance of this just as you would +// its base type. Example: +// CMAPIBuffer< LPENTRYID> lpeid; +// HRESULT hr = HrMAPIFindDefaultMsgStore( m_pMAPISession, &cbeid, &lpeid); +// hr = m_pMAPISession->OpenMsgStore( 0, cbeid, lpeid, ... +// +// The intended use of this class is for declaring mapi buffer pointers on the +// stack or inside of another class or structure. There is NO value in creating +// an instance of this class on the heap with new(). It's sole purpose in life +// is to keep you from having to remember to free the buffer. +// +// If you need to reuse the pointer be sure to call MAPIFREEBUFFER before +// reusing it. Example: +// CMAPIBuffer< LPENTRYID> lpeid; +// HRESULT hr = HrMAPIFindDefaultMsgStore( m_pMAPISession, &cbeid, &lpeid); +// ... // Do some other work... +// MAPIFREEBUFFER( lpeid); +// hr = HrGetSomeOtherEID( &cbeid, &lpeid); +// ----------------------------------------------------------------------------- + +template< class TYPE> +class CMAPIBuffer +{ +public: + CMAPIBuffer( TYPE ptr = NULL) { m_ptr = ptr;} + ~CMAPIBuffer() { MAPIFREEBUFFER( m_ptr);} + + // Returns a pointer to the TYPE by just specifying the object. + operator TYPE() {return( m_ptr);} + + // Returns the address of the object correct for the base type. + TYPE* operator &() {return( &m_ptr);} + + void operator =(LPVOID lpv) {m_ptr = (TYPE) lpv;} + +protected: + TYPE m_ptr; +}; + +// ----------------------------------------------------------------------------- +// Use this class to wrap a pointer to a mapi interface. It is nearly identical +// to the above class except that it releases the interface pointer when the +// instance of the object goes out of scope. +// +// The intended use of this class is for declaring mapi interface pointers on the +// stack or inside of another class or structure. There is NO value in creating +// an instance of this class on the heap with new(). It's sole purpose in life +// is to keep you from having to remember to release the interface. +// ----------------------------------------------------------------------------- + +template< class TYPE> +class CMAPIInterface +{ +public: + CMAPIInterface( TYPE ptr = NULL) { m_ptr = ptr;} + ~CMAPIInterface() { UlRelease( m_ptr);} + + // Returns a pointer to the TYPE by just specifying the object. + operator TYPE() {return( m_ptr);} + + // Returns the address of the object correct for the base type. + TYPE* operator &() {return( &m_ptr);} + + // Returns a pointer to the TYPE for -> operations. + TYPE operator ->() {return( m_ptr);} + + void operator =(LPVOID lpv) {m_ptr = (TYPE) lpv;} + +protected: + TYPE m_ptr; +}; + +// $--CMAPIIsInitialized-------------------------------------------------------- +// Initialize MAPI using MAPIInitialize(). If it is successful then create an +// instance of this object which will uninitialize MAPI at destruction. +// ----------------------------------------------------------------------------- + +class CMAPIIsInitialized +{ +public: + ~CMAPIIsInitialized() {MAPIUninitialize();} +}; + +// $--CMAPISession-------------------------------------------------------------- +// Works just like CMAPIInterface but it also Logs off at destruction. +// ----------------------------------------------------------------------------- + +class CMAPISession : public CMAPIInterface< LPMAPISESSION> +{ +public: + // DESTRUCTOR logs off of the MAPI session and releases the session handle. + ~CMAPISession() + { + if( m_ptr) + m_ptr->Logoff( 0L, 0L, 0L); + } +}; + +// ----------------------------------------------------------------------------- + +#endif // _HELPERS_H_ + +class CKeeper +{ +public: + CKeeper ( LPTSTR szSender, LPTSTR szSubject, LPSTR szEntryID ); + ~CKeeper (); + +public: + UINT m_nSizeSender ; + UINT m_nSizeSubject; + UINT m_nSizeEntryID; + + LPTSTR m_szSender ; + LPTSTR m_szSubject ; + LPSTR m_szEntryID ; +}; + + +class CMirandaExchange +{ +public: + + CMirandaExchange(); + //CMirandaExchange ( LPCTSTR szUsername, LPCTSTR szPassword, LPCTSTR szExchangeServer ); + virtual ~CMirandaExchange (); + + HRESULT CheckForNewMails ( int &nNewMails ); + HRESULT CreateProfile ( LPTSTR szProcessID ); + HRESULT InitializeAndLogin ( LPCTSTR szUsername, LPCTSTR szPassword, LPCTSTR szExchangeServer ); + HRESULT CheckInFolder ( LPMAPIFOLDER lpFolder ); + HRESULT MarkAsRead ( LPTSTR szEntryID ); + HRESULT LogOFF (); + HRESULT OpenTheMessage ( LPTSTR szEntryID ); + HRESULT isMapiSessionOK ( LPMAPISESSION lpSession ); + CKeeper* m_HeadersKeeper[MAX_NUMBER_OF_HEADERS+1]; + +private: + LPTSTR m_szUsername; + LPTSTR m_szPassword; + LPTSTR m_szExchangeServer; + LPMAPISESSION m_lpMAPISession; + LPMAPIFOLDER m_lpInbox; + LPMDB m_lpMDB; + bool m_bLoginOK; + bool m_bFolderInboxOK; + + bool m_bNoInitAgain; + UINT m_nNumberOfHeaders; + CRITICAL_SECTION m_myCritical; + +}; + +#endif // !defined(MIRANDAEXCHANGE_H__INCLUDED_) +#endif //NO_EXCHANGE_TEST diff --git a/plugins/Exchange/src/StdAfx.cpp b/plugins/Exchange/src/StdAfx.cpp new file mode 100644 index 0000000000..4e991b8f0d --- /dev/null +++ b/plugins/Exchange/src/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// exchange.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/plugins/Exchange/src/StdAfx.h b/plugins/Exchange/src/StdAfx.h new file mode 100644 index 0000000000..82627ab92d --- /dev/null +++ b/plugins/Exchange/src/StdAfx.h @@ -0,0 +1,24 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__B170AF8E_BA64_4233_BF83_B4F0D1F3B775__INCLUDED_) +#define AFX_STDAFX_H__B170AF8E_BA64_4233_BF83_B4F0D1F3B775__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +// Insert your headers here +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include + +// TODO: reference additional headers your program requires here + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__B170AF8E_BA64_4233_BF83_B4F0D1F3B775__INCLUDED_) diff --git a/plugins/Exchange/src/commonheaders.h b/plugins/Exchange/src/commonheaders.h new file mode 100644 index 0000000000..bbfdcc9b59 --- /dev/null +++ b/plugins/Exchange/src/commonheaders.h @@ -0,0 +1,71 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ +#ifndef M_EXCHANGE_COMMONHEADERS_H +#define M_EXCHANGE_COMMONHEADERS_H +#if !defined(MIID_EXCHANGE) + #define MIID_EXCHANGE {0xcfd79a89, 0x9959, 0x4e65, {0xb0, 0x76, 0x41, 0x3f, 0x98, 0xfe, 0x0d, 0x15}} +#endif + +#define EXCHANGE_PORT 25 +#define DEFAULT_INTERVAL 60 //in seconds +#define DEFAULT_RECONNECT_INTERVAL 10 //in minutes + +#include +//#include +#include +#include + + +#include "resource.h" + +#include "version.h" +#include "utils.h" +#include "emails.h" +#include "services.h" +#include "hooked_events.h" +//#include "mirandaMem.h" + +//#include "forkthread.h" + +#include +#include +#include +#include +#include +//#include "m_skin.h" +#include +#include +#include +//#include "m_history.h" +//#include "m_contacts.h" +//#include "m_fontservice.h" + +#include "m_utils.h" + +//#include "m_updater.h" + +extern char ModuleName[]; +extern HINSTANCE hInstance; +extern HICON hiMailIcon; +extern HWND hEmailsDlg; + + + +#endif //M_EXCHANGE_COMMONHEADERS_H \ No newline at end of file diff --git a/plugins/Exchange/src/dlg_handlers.cpp b/plugins/Exchange/src/dlg_handlers.cpp new file mode 100644 index 0000000000..1e291b9ce5 --- /dev/null +++ b/plugins/Exchange/src/dlg_handlers.cpp @@ -0,0 +1,514 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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 "dlg_handlers.h" + +#define MIN_EMAILS_WIDTH 300 +#define MIN_EMAILS_HEIGHT 250 + +static WNDPROC OldListProc; + +BOOL CALLBACK DlgProcOptions(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static int bInitializing; //true when dialog is being created + + switch (msg) + { + case WM_INITDIALOG: + { + TCHAR buffer[4096]; + long port; + long interval; + int bCheck; + int portCheck; + int retries; + bInitializing = 1; + DBVARIANT dbv = {0}; + + + dbv.type = DBVT_ASCIIZ; + + TranslateDialogDefault(hWnd); + + bCheck = db_get_b(NULL, ModuleName, "Check", 1); + GetStringFromDatabase("Username", _T(""), buffer, sizeof(buffer)); + SetWindowText(GetDlgItem(hWnd, IDC_USER_EDIT), buffer); + GetStringFromDatabase("Password", _T(""), buffer, sizeof(buffer)); + CallService(MS_DB_CRYPT_DECODESTRING, sizeof(buffer), (LPARAM) buffer); + SetWindowText(GetDlgItem(hWnd, IDC_PASSWORD_EDIT), buffer); + GetStringFromDatabase("Server", _T(""), buffer, sizeof(buffer)); + SetWindowText(GetDlgItem(hWnd, IDC_SERVER_EDIT), buffer); + + port = db_get_dw(NULL, ModuleName, "Port", EXCHANGE_PORT); + //_itoa(port, buffer, 10); + //SetWindowText(GetDlgItem(hWnd, IDC_PORT_EDIT), buffer); + SetDlgItemInt(hWnd,IDC_PORT_EDIT,port,FALSE); + + interval = db_get_dw(NULL, ModuleName, "Interval", DEFAULT_INTERVAL); + //_itoa(interval, buffer, 10); + //SetWindowText(GetDlgItem(hWnd, IDC_INTERVAL_EDIT), buffer); + SetDlgItemInt(hWnd,IDC_INTERVAL_EDIT,interval,FALSE); + + CheckDlgButton(hWnd, IDC_RECONNECT, (db_get_b(NULL, ModuleName, "Reconnect", 0)) ? BST_CHECKED : BST_UNCHECKED); + + interval = db_get_dw(NULL, ModuleName, "ReconnectInterval", DEFAULT_RECONNECT_INTERVAL); + //_itoa(interval, buffer, 10); + //SetWindowText(GetDlgItem(hWnd, IDC_RECONNECT_INTERVAL), buffer); + SetDlgItemInt(hWnd,IDC_RECONNECT_INTERVAL,interval,FALSE); + CheckDlgButton(hWnd, IDC_USE_POPUPS, (BOOL) db_get_b(NULL, ModuleName, "UsePopups", 0) ? BST_CHECKED : BST_UNCHECKED); + EnableWindow(GetDlgItem(hWnd, IDC_USE_POPUPS), ServiceExists(MS_POPUP_ADDPOPUP)); //disable the popups checkbox if no popup module is present + + CheckDlgButton(hWnd, IDC_CHECK_EMAILS, (bCheck) ? BST_CHECKED : BST_UNCHECKED); + EnableWindow(GetDlgItem(hWnd, IDC_INTERVAL_EDIT), bCheck); + + portCheck = (BOOL) db_get_b(NULL, ModuleName, "UsePortCheck", 1); + CheckDlgButton(hWnd, IDC_USE_PORTCHECK, (portCheck) ? BST_CHECKED : BST_UNCHECKED); + EnableWindow(GetDlgItem(hWnd, IDC_PORT_EDIT), portCheck); + + //_itoa(db_get_b(NULL, ModuleName, "MaxRetries", MAX_EXCHANGE_CONNECT_RETRIES), buffer, 10); + //SetWindowText(GetDlgItem(hWnd, IDC_MAX_RETRIES), buffer); + retries=db_get_b(NULL, ModuleName, "MaxRetries", MAX_EXCHANGE_CONNECT_RETRIES); + SetDlgItemInt(hWnd,IDC_MAX_RETRIES,retries,FALSE); + + EnableWindow(GetDlgItem(hWnd, IDC_RECONNECT_INTERVAL), IsDlgButtonChecked(hWnd, IDC_RECONNECT)); + + bInitializing = 0; + + return TRUE; + } + + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDC_USER_EDIT: + case IDC_PASSWORD_EDIT: + case IDC_SERVER_EDIT: + case IDC_PORT_EDIT: + case IDC_INTERVAL_EDIT: + case IDC_RECONNECT_INTERVAL: + case IDC_MAX_RETRIES: + { + if ((!bInitializing) && (HIWORD(wParam) == EN_CHANGE))// || (HIWORD(wParam) == CBN_SELENDOK)) + { + SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); + } + + break; + } + case IDC_USE_POPUPS: + case IDC_CHECK_EMAILS: + case IDC_RECONNECT: + case IDC_USE_PORTCHECK: + { + int portCheck = IsDlgButtonChecked(hWnd, IDC_USE_PORTCHECK); + SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); + + EnableWindow(GetDlgItem(hWnd, IDC_INTERVAL_EDIT), IsDlgButtonChecked(hWnd, IDC_CHECK_EMAILS)); + EnableWindow(GetDlgItem(hWnd, IDC_RECONNECT_INTERVAL), IsDlgButtonChecked(hWnd, IDC_RECONNECT)); + EnableWindow(GetDlgItem(hWnd, IDC_PORT_EDIT), portCheck); + //EnableWindow(GetDlgItem(hWnd, IDC_MAX_RETRIES), portCheck); + + break; + } + } + + break; + } + + case WM_NOTIFY: + { + switch(((LPNMHDR)lParam)->idFrom) + { + case 0: + { + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + { + TCHAR buffer[4096]; + long port = 0; + long interval = DEFAULT_INTERVAL; + int bCheck = IsDlgButtonChecked(hWnd, IDC_CHECK_EMAILS); + int retries = MAX_EXCHANGE_CONNECT_RETRIES; + + db_set_b(NULL, ModuleName, "Check", bCheck); + GetWindowText(GetDlgItem(hWnd, IDC_USER_EDIT), buffer, sizeof(buffer)); + db_set_ts(NULL, ModuleName, "Username", buffer); + GetWindowText(GetDlgItem(hWnd, IDC_PASSWORD_EDIT), buffer, sizeof(buffer)); + CallService(MS_DB_CRYPT_ENCODESTRING, sizeof(buffer), (LPARAM) buffer); + db_set_ts(NULL, ModuleName, "Password", buffer); + GetWindowText(GetDlgItem(hWnd, IDC_SERVER_EDIT), buffer, sizeof(buffer)); + db_set_ts(NULL, ModuleName, "Server", buffer); + GetWindowText(GetDlgItem(hWnd, IDC_PORT_EDIT), buffer, sizeof(buffer)); + //port = atoi(buffer); + //db_set_dw(NULL, ModuleName, "Port", port); + db_set_dw(NULL, ModuleName, "Port", GetDlgItemInt(hWnd,IDC_PORT_EDIT,NULL,FALSE)); + + //GetWindowText(GetDlgItem(hWnd, IDC_INTERVAL_EDIT), buffer, sizeof(buffer)); + //interval = atoi(buffer); + interval=GetDlgItemInt(hWnd,IDC_INTERVAL_EDIT,NULL,FALSE); + db_set_dw(NULL, ModuleName, "Interval", interval); + + db_set_b(NULL, ModuleName, "Reconnect", IsDlgButtonChecked(hWnd, IDC_RECONNECT)); + + GetWindowText(GetDlgItem(hWnd, IDC_RECONNECT_INTERVAL), buffer, sizeof(buffer)); + //interval = atoi(buffer); + interval=GetDlgItemInt(hWnd,IDC_RECONNECT_INTERVAL,NULL,FALSE); + db_set_dw(NULL, ModuleName, "ReconnectInterval", interval); + + db_set_b(NULL, ModuleName, "UsePopups", IsDlgButtonChecked(hWnd, IDC_USE_POPUPS)); + db_set_b(NULL, ModuleName, "UsePortCheck", IsDlgButtonChecked(hWnd, IDC_USE_PORTCHECK)); + + //GetWindowText(GetDlgItem(hWnd, IDC_MAX_RETRIES), buffer, sizeof(buffer)); + //retries = atoi(buffer); + retries=GetDlgItemInt(hWnd,IDC_MAX_RETRIES,NULL,FALSE); + db_set_b(NULL, ModuleName, "MaxRetries", retries); + + + exchangeServer.Reconnect(); //login info may be changed + UpdateTimers(); //interval might get changed + + break; + } + } + + break; + } + } + + break; + } + } + + return 0; +} + +#include "commctrl.h" + +void AddAnchorWindowToDeferList(HDWP &hdWnds, HWND window, RECT *rParent, WINDOWPOS *wndPos, int anchors) +{ + RECT rChild = AnchorCalcPos(window, rParent, wndPos, anchors); + hdWnds = DeferWindowPos(hdWnds, window, HWND_NOTOPMOST, rChild.left, rChild.top, rChild.right - rChild.left, rChild.bottom - rChild.top, SWP_NOZORDER); +} + +void SavePosition(HWND hWnd) +{ + RECT rWnd; + GetWindowRect(hWnd, &rWnd); + db_set_dw(0, ModuleName, "PosX", rWnd.left); + db_set_dw(0, ModuleName, "PosY", rWnd.top); + //DBWriteContactSettingDword(0, ModuleName, "Width", rWnd.right - rWnd.left); + //DBWriteContactSettingDword(0, ModuleName, "Height", rWnd.bottom - rWnd.top); +} + +void LoadPosition(HWND hWnd) +{ + int x, y; + int width = 500, height = 300; + x = db_get_dw(0, ModuleName, "PosX", 0); + y = db_get_dw(0, ModuleName, "PosY", 0); + //width = DBGetContactSettingDword(0, ModuleName, "Width", 500); + //height = DBGetContactSettingDword(0, ModuleName, "Height", 300); + SetWindowPos(hWnd, NULL, x, y, width, height, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSIZE); +} + +int CALLBACK ListSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_KEYUP: + { + if (wParam == VK_ESCAPE) + { + SendMessage(GetParent(hWnd), WM_CLOSE, 0, 0); + } + + break; + } + + case WM_SYSKEYDOWN: + { + if (wParam == 'X') + { + SendMessage(GetParent(hWnd), WM_CLOSE, 0, 0); + } + + break; + } + + case WM_LBUTTONDBLCLK: + { + int i; + int count = ListView_GetItemCount(hWnd); + for (i = 0; i < count; i++) + { + if (ListView_GetItemState(hWnd, i, LVIS_SELECTED)) + { + TCHAR emailID[4096]; //uhh + ListView_GetItemText(hWnd, i, 2, emailID, sizeof(emailID)); + exchangeServer.OpenMessage(emailID); + } + } + + break; + } + } + + return CallWindowProc(OldListProc, hWnd, msg, wParam, lParam); +} + +BOOL CALLBACK DlgProcEmails(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hWnd); + + SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM) hiMailIcon); + + LVCOLUMN col = {0}; + HWND hList = GetDlgItem(hWnd, IDC_EMAILS_LIST); + OldListProc = (WNDPROC) SetWindowLong(hList, GWLP_WNDPROC, (LONG) ListSubclassProc); + ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); + col.mask = LVCF_TEXT | LVCF_WIDTH; + col.cx = 100; + col.pszText = TranslateT("Entry ID"); + col.cchTextMax = _tcslen(col.pszText) + 1; + ListView_InsertColumn(hList, 0, &col); + col.pszText = TranslateT("Subject"); + col.cx = 300; + col.cchTextMax = _tcslen(col.pszText) + 1; + ListView_InsertColumn(hList, 0, &col); + col.cx = 200; + col.iSubItem = 1; + col.pszText = TranslateT("Sender"); + col.cchTextMax = _tcslen(col.pszText) + 1; + ListView_InsertColumn(hList, 0, &col); + + //LoadPosition(hWnd); + + return TRUE; + break; + } + + case WM_DESTROY: + { + hEmailsDlg = NULL; + + break; + } + + case WM_CLOSE: + { + //ShowWindow(hWnd, SW_HIDE); + DestroyWindow(hWnd); //close the window - no need to keep it in memory + //SavePosition(hWnd); + + break; + } + + case EXM_UPDATE_EMAILS: + { + HWND hList = GetDlgItem(hWnd, IDC_EMAILS_LIST); + ListView_DeleteAllItems(hList); + int i; + int count = GetWindowLong(hWnd, GWLP_USERDATA); + LVITEM item = {0}; + TEmailHeader email = {0}; + email.cbSize = sizeof(TEmailHeader); + TCHAR sender[1024] = _T(""); + TCHAR subject[1024] = _T(""); + //char buffer[4096]; + email.cSender = sizeof(sender); + email.cSubject = sizeof(subject); + email.szSender = sender; + email.szSubject = subject; + item.mask = LVIF_TEXT; + + for (i = 0; i < count; i++) + { + exchangeServer.GetEmailHeader(i, &email); + item.iItem = i; + item.iSubItem = 0; + item.pszText = email.szSender; + ListView_InsertItem(hList, &item); + ListView_SetItemText(hList, i, 1, email.szSubject); + ListView_SetItemText(hList, i, 2, mir_a2t(email.emailID)); + } + SetFocus(hList); + + break; + } + + case WM_SHOWWINDOW: + { + if (wParam) + { + SendMessage(hWnd, EXM_UPDATE_EMAILS, 0, 0); + } + + break; + } + + case WM_KEYUP: + { + if (wParam == VK_ESCAPE) + { + SendMessage(hWnd, WM_CLOSE, 0, 0); + } + + break; + } + + case WM_SYSKEYDOWN: + { + if (wParam == 'X') + { + SendMessage(hWnd, WM_CLOSE, 0, 0); + } + + break; + } + + case WM_WINDOWPOSCHANGING: + { + HDWP hdWnds = BeginDeferWindowPos(3); + RECT rParent; + WINDOWPOS *wndPos = (WINDOWPOS *) lParam; + + if ((!wndPos) || (wndPos->flags & SWP_NOSIZE)) + { + break; + } + GetWindowRect(hWnd, &rParent); + if (wndPos->cx < MIN_EMAILS_WIDTH) + { + wndPos->cx = MIN_EMAILS_WIDTH; + } + if (wndPos->cy < MIN_EMAILS_HEIGHT) + { + wndPos->cy = MIN_EMAILS_HEIGHT; + } + AddAnchorWindowToDeferList(hdWnds, GetDlgItem(hWnd, IDC_EMAILS_LIST), &rParent, wndPos, ANCHOR_ALL); + AddAnchorWindowToDeferList(hdWnds, GetDlgItem(hWnd, IDC_CLOSE), &rParent, wndPos, ANCHOR_BOTTOM | ANCHOR_RIGHT); + AddAnchorWindowToDeferList(hdWnds, GetDlgItem(hWnd, IDC_MARK_READ), &rParent, wndPos, ANCHOR_BOTTOM | ANCHOR_LEFT); + + EndDeferWindowPos(hdWnds); + + break; + } + + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDC_CLOSE: + { + SendMessage(hWnd, WM_CLOSE, 0, 0); + //HWND hList = GetDlgItem(hWnd, IDC_EMAILS_LIST); + //ListView_SetItemState(hList, -1, LVIS_SELECTED, LVIS_SELECTED); + //SetFocus(hList); + + break; + } + + case IDC_MARK_READ: + { + HWND hList = GetDlgItem(hWnd, IDC_EMAILS_LIST); + int i; + int count = ListView_GetItemCount(hList); + for (i = 0; i < count; i++) + { + if (ListView_GetCheckState(hList, i)) + { + //char sender[1024]; //nooo + TCHAR emailID[2048]; //uhh ohh + LVITEM item = {0}; + item.iItem = i; + item.mask = LVIF_TEXT; + //item.pszText = sender; + //item.cchTextMax = sizeof(sender); + //ListView_GetItem(hList, &item); + + item.iSubItem = 2; + item.cchTextMax = sizeof(emailID); + item.pszText = emailID; + ListView_GetItem(hList, &item); + exchangeServer.MarkEmailAsRead(emailID); + } + } + count = exchangeServer.GetUnreadEmailsCount(); + if (count > 0) + { + SetWindowLong(hWnd, GWLP_USERDATA, count); + SendMessage(hWnd, EXM_UPDATE_EMAILS, 0, 0); + } + else{ + SendMessage(hWnd, WM_CLOSE, 0, 0); + } + + break; + } + } + + break; + } + default: + + break; + } + + return 0; +} + +BOOL CALLBACK DlgProcPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_COMMAND: + { + switch (HIWORD(wParam)) + { + case STN_CLICKED: + { + //HWND hParent = FindWindow(MIRANDACLASS, NULL); + //CreateDialog(hInstance, MAKEINTRESOURCE(IDD_EMAILS), hParent, DlgProcEmails); + int count = (int) PUGetPluginData(hWnd); + ShowEmailsWindow(count); + PUDeletePopup(hWnd); + + break; + } + } + + break; + } + case WM_CONTEXTMENU: + { + PUDeletePopup(hWnd); + + break; + } + } + return DefWindowProc(hWnd, msg, wParam, lParam); +} \ No newline at end of file diff --git a/plugins/Exchange/src/dlg_handlers.h b/plugins/Exchange/src/dlg_handlers.h new file mode 100644 index 0000000000..3aa2550604 --- /dev/null +++ b/plugins/Exchange/src/dlg_handlers.h @@ -0,0 +1,32 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +#ifndef M_EXCHANGE_DIALOG_HANDLERS_H +#define M_EXCHANGE_DIALOG_HANDLERS_H + +#include "commonheaders.h" + +#define EXM_UPDATE_EMAILS WM_USER + 101 + +BOOL CALLBACK DlgProcOptions(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK DlgProcEmails(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK DlgProcPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +#endif //M_EXCHANGE_DIALOG_HANDLERS_H \ No newline at end of file diff --git a/plugins/Exchange/src/emails.cpp b/plugins/Exchange/src/emails.cpp new file mode 100644 index 0000000000..1ee8a90688 --- /dev/null +++ b/plugins/Exchange/src/emails.cpp @@ -0,0 +1,424 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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 "emails.h" + +CExchangeServer::CExchangeServer() +{ + bConnected = 0; //not connected + bTryConnect = 1; //try to connect + cConnections = 0; //first attempt +} + +CExchangeServer::~CExchangeServer() +{ + Disconnect(); +} + +int CExchangeServer::Connect(int bForceConnect) +{ + int maxRetries = db_get_b(NULL, ModuleName, "MaxRetries", MAX_EXCHANGE_CONNECT_RETRIES); + if (bForceConnect) + { + bTryConnect = 1; + cConnections = 0; + } + + if (cConnections >= maxRetries) + { + bTryConnect = 0; + cConnections = 0; + _popupUtil("Maximum number of retries reached.\nPlugin will stop trying to connect automatically."); + } + if (bTryConnect) + { + cConnections++; + } + + if ((bTryConnect) && !IsServerAvailable()) + { + bTryConnect = 0; + _popupUtil("Server not available"); + } + + if ((!IsConnected()) && (bTryConnect)) + { + TCHAR user[1024]; //lovely + TCHAR password[1024]; //i know + TCHAR server[1024]; + int port; + + GetStringFromDatabase("Username", _T(""), user, _countof(user)); + if (ServiceExists(MS_UTILS_REPLACEVARS)) + { + TCHAR *tmpUser = Utils_ReplaceVarsT(user); + + _tcsncpy(user, tmpUser, _countof(user)); + mir_free(tmpUser); + } + + GetStringFromDatabase("Password", _T(""), password, _countof(password)); + CallService(MS_DB_CRYPT_DECODESTRING, sizeof(password), (LPARAM) password); + GetStringFromDatabase("Server", _T(""), server, _countof(server)); + port = db_get_dw(NULL, ModuleName, "Port", EXCHANGE_PORT); + if (_tcslen(server) > 0) //only connect if there's a server to connect to + { + return DoConnect(user, password, server, port); + } + else { + _popupUtil("Server is not configured ..."); + } + } + return -1; //0 on success, != 0 otherwise +} + +int CExchangeServer::Reconnect() +{ + Disconnect(); + Connect(); + return 0; +} + +int CExchangeServer::Disconnect() +{ +// if (IsConnected()) +// { + return DoDisconnect(); +// } +// return -1; //0 on success, != 0 otherwise +} + +int CExchangeServer::DoConnect(TCHAR *user, TCHAR *password, TCHAR *server, int port) +{ + + if (bTryConnect) + { + bConnected = 0; +#ifndef NO_EXCHANGE_TEST + if ( InitializeAndLogin( user, password, server )== S_OK) + { + bConnected = 1; + cConnections = 0; //restart connection attempts counter + } + +#endif + } + + return !bConnected; //0 on success, != 0 otherwise +} + +int CExchangeServer::DoDisconnect() +{ +#ifndef NO_EXCHANGE_TEST + LogOFF(); +#endif + bConnected = 0; + return bConnected; //0 on success, != 0 otherwise +} + +int CExchangeServer::IsConnected() +{ +#ifndef NO_EXCHANGE_TEST + return bConnected; +#else + return true; +#endif +} + +void InitSocketAddr(sockaddr_in *addrServer, char *szServer) +{ + hostent *hp; + hp = gethostbyname(szServer); + addrServer->sin_family = AF_INET; + if (hp == NULL) + { + addrServer->sin_addr.s_addr = inet_addr(szServer); + } + else{ + memcpy(&(addrServer->sin_addr), hp->h_addr, hp->h_length); + } + int port = db_get_dw(NULL, ModuleName, "Port", EXCHANGE_PORT); + addrServer->sin_port = htons(port); +} + +int CExchangeServer::IsServerAvailable() +{ + int check = db_get_b(NULL, ModuleName, "UsePortCheck", 1); + if (check) + { + SOCKET sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (sServer == INVALID_SOCKET) + { + return 0; //server is not available + } + TCHAR szServer[1024]; + GetStringFromDatabase("Server", _T(""), szServer, sizeof(szServer)); + sockaddr_in addrServer; + InitSocketAddr(&addrServer, mir_t2a(szServer)); + int res = connect(sServer, (sockaddr *) &addrServer, sizeof(addrServer)); + int bAvailable = 0; + if (!res) + {//if connected then close smtp connection by sending a quit message + bAvailable = 1; + char message[] = "quit\n"; + res = send(sServer, message, strlen(message), 0); + } + res = closesocket(sServer); //close the socket + return bAvailable; + } + else{ + return 1; //if we're not using port check assume the server is available. + } +} + +int CExchangeServer::GetUnreadEmailsCount() +{ + int nCount = -1; + +#ifndef NO_EXCHANGE_TEST + HRESULT hRes = CheckForNewMails(nCount); + + if (hRes!=S_OK) + { + Reconnect(); + + if (IsConnected()) + { + hRes = CheckForNewMails(nCount); + } + else { + nCount = -1; + } + } +#else + nCount = 3; +#endif + + return nCount; +} + +int CExchangeServer::GetEmailHeader(int iUnreadEmail, TEmailHeader *emailInfo) +{ + if (!IsConnected()) + { + //Connect(); + return -1; + } + if (emailInfo->cbSize != sizeof(TEmailHeader)) + { + return -1; + } + +#ifndef NO_EXCHANGE_TEST + + if(NULL!=m_HeadersKeeper[iUnreadEmail]) + { + TCHAR* szSender = m_HeadersKeeper[iUnreadEmail]->m_szSender; + TCHAR* szSubject = m_HeadersKeeper[iUnreadEmail]->m_szSubject; + + if( NULL == szSender) + { + szSender = _T(""); + } + + if( NULL == szSubject) + { + szSubject = _T(""); + } + + emailInfo->szSender = szSender; + emailInfo->szSubject = szSubject; + emailInfo->emailID = (NULL!=m_HeadersKeeper[iUnreadEmail]->m_szEntryID)?m_HeadersKeeper[iUnreadEmail]->m_szEntryID:""; + + } + else { + return -1; + } + + +#else + emailInfo->szSender = ""; + emailInfo->szSubject = ""; + emailInfo->emailID = "123"; +#endif + + return 0; +} + +int CExchangeServer::MarkEmailAsRead(TCHAR *emailID) +{ + if (!IsConnected()) + { + return -1; + } + +#ifndef NO_EXCHANGE_TEST + MarkAsRead( emailID ); +#endif + + return 0; +} + +int CExchangeServer::OpenMessage(TCHAR *emailID) +{ + if (!IsConnected()) + { + return -1; + } + +#ifndef NO_EXCHANGE_TEST + OpenTheMessage( emailID ); +#endif + + return 0; +} + +int CExchangeServer::Check(int bNoEmailsNotify) +{ + + int count = -1; + if (IsConnected()) + { + count = GetUnreadEmailsCount(); + + if (count==-1) + { + Reconnect(); + if (IsConnected()) + { + count = GetUnreadEmailsCount(); + } + else { + return -1; + } + } + + } + else { + Reconnect(); + if (IsConnected()) + { + count = GetUnreadEmailsCount(); + } + else { + return -1; + } + + if (count==-1) + { + return -1; + } + } + + if( ( (count > 0) || ((bNoEmailsNotify) && (count >= 0)) )&& (count!=-1)) + { + TCHAR buffer[1024]; + if (count != 1) + { + mir_sntprintf(buffer,_countof(buffer), TranslateT("You have %d unread emails ..."), count); + } + else { + mir_sntprintf(buffer, _countof(buffer),TranslateT("You have one unread email ...")); + } + + ShowMessage(buffer, count); + /*int i; + TEmailHeader emailInfo = {0}; + char sender[1024]; + char subject[1024]; + emailInfo.cbSize = sizeof(emailInfo); + emailInfo.szSender = sender; + emailInfo.szSubject = subject; + emailInfo.cSender = sizeof(sender); + emailInfo.cSubject = sizeof(subject); + for (i = 0; i < count; i++) + { + GetEmailHeader(i, &emailInfo); + sprintf(buffer, "Unread email #%d:\nSender :%s\nSubject :%s", i + 1, sender, subject); + ShowMessage(buffer); + }*/ + } + + if (count==-1) + { + _popupUtil("Cannot connect to Exchange server ..."); + } + + return count; +} + +int ShowMessage(TCHAR *message, int cUnreadEmails) +{ + int usePopups = ServiceExists(MS_POPUP_ADDPOPUP) ? db_get_b(NULL, ModuleName, "UsePopups", 0) : 0; + if (usePopups) + { + return ShowPopupMessage(TranslateT("Exchange email"), message, cUnreadEmails); + } + else{ + return ShowMessageBoxMessage(TranslateT("Do you want to see the email headers ?"), message, cUnreadEmails); + } + + return 0; +} + +int ShowPopupMessage(TCHAR *title, TCHAR *message, int cUnreadEmails) +{ + POPUPDATAT popup = {0}; + popup.lchContact = NULL; + popup.colorBack = NULL; + popup.colorText = NULL; + popup.lchIcon = hiMailIcon; + _tcsncpy(popup.lptzContactName, title,_tcslen(title)); + _tcsncpy(popup.lptzText, message,_tcslen(message)); + popup.PluginWindowProc = (WNDPROC) DlgProcPopup; + popup.PluginData = (int *) cUnreadEmails; + return PUAddPopupT(&popup); +} + +int ShowMessageBoxMessage(TCHAR *title, TCHAR *message, int cUnreadEmails) +{ + if (MessageBox(0, message, title, MB_YESNO) == IDYES) + { + ShowEmailsWindow(cUnreadEmails); + } + + return 0; +} + +int ShowEmailsWindow(int cUnreadEmails) +{ + if (cUnreadEmails > 0) //show window only if there are unread emails + { + if (!hEmailsDlg) + { + hEmailsDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_EMAILS), NULL, (DLGPROC)DlgProcEmails); + } + + SetWindowLong(hEmailsDlg, GWLP_USERDATA, cUnreadEmails); + if (IsWindowVisible(hEmailsDlg)) + { + SendMessage(hEmailsDlg, EXM_UPDATE_EMAILS, 0, 0); + } + else { + ShowWindow(hEmailsDlg, SW_SHOW); + } + } + return 0; +} \ No newline at end of file diff --git a/plugins/Exchange/src/emails.h b/plugins/Exchange/src/emails.h new file mode 100644 index 0000000000..24f63ab233 --- /dev/null +++ b/plugins/Exchange/src/emails.h @@ -0,0 +1,96 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +#ifndef M_EXCHANGE_EMAILS_H +#define M_EXCHANGE_EMAILS_H + +//define if you want to test only the miranda part, and not the exchange one. +//#define NO_EXCHANGE_TEST + +#include "commonheaders.h" + +#ifndef NO_EXCHANGE_TEST +#include "MirandaExchange.h" +#endif + +#define MAX_EXCHANGE_CONNECT_RETRIES 15 + +struct TEmailHeader{ + int cbSize; + DWORD flags; //flags + TCHAR *szSender; //pointer to string that receives the sender name + int cSender; //size of szSender buffer + TCHAR *szSubject; //pointer to string that receives the email subject + int cSubject; //size of szSubject buffer + char *emailID; +}; + +#ifndef NO_EXCHANGE_TEST +class CExchangeServer: public CMirandaExchange{ +#else +class CExchangeServer{ +#endif + protected: + int bConnected; //are we connected + int cConnections; //number of connection attempts + int bTryConnect; + + int DoConnect(TCHAR *user, TCHAR *password, TCHAR *server, int port); + int DoDisconnect(); + + public: + CExchangeServer(); + ~CExchangeServer(); + + int Connect(int bRestartCounter = 0); + int Disconnect(); + int Reconnect(); + + int IsConnected(); + int IsServerAvailable(); + + /* + Returns the number of unread emails. + */ + int GetUnreadEmailsCount(); + /* + iUnreadEmail - the index of the unread email, 0 = the oldest unread email, = the newest unread email. + emailInfo - will be filled with the relevant info (sender and subject). cbSize will be set before the call to the function; the caller also has to allocate memory for the sender and subject + */ + int GetEmailHeader(int iUnreadEmail, TEmailHeader *emailInfo); + + /* + */ + int MarkEmailAsRead(TCHAR *emailID); + + int OpenMessage(TCHAR *emailID); + + int Check(int bNoEmailsNotify = FALSE); +}; + +extern CExchangeServer &exchangeServer; + +int ShowMessage(TCHAR *message, int cUnreadEmails); +int ShowPopupMessage(TCHAR *title, TCHAR *message, int cUnreadEmails); +int ShowMessageBoxMessage(TCHAR *title, TCHAR *message, int cUnreadEmails); + +int ShowEmailsWindow(int cUnreadEmails); + +#endif //M_EXCHANGE_EMAILS_H diff --git a/plugins/Exchange/src/exchange.cpp b/plugins/Exchange/src/exchange.cpp new file mode 100644 index 0000000000..6d789db56f --- /dev/null +++ b/plugins/Exchange/src/exchange.cpp @@ -0,0 +1,99 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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" + +char ModuleName[] = "ExchangeNotify"; +HINSTANCE hInstance; +HICON hiMailIcon = NULL; +HWND hEmailsDlg = NULL; +int hLangpack=0; + +CExchangeServer &exchangeServer = CExchangeServer(); + +//PLUGINLINK *pluginLink; + +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + __PLUGIN_DISPLAY_NAME, + VERSION, + __DESC, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + {0x2fd0df15, 0x7098, 0x41ce, {0xaa, 0x92, 0xff, 0x62, 0x18, 0x06, 0xe3, 0x8b}} //{2fd0df15-7098-41ce-aa92-ff621806e38b} +}; //not used + +//OLD_MIRANDAPLUGININFO_SUPPORT; + +extern "C" __declspec(dllexport) PLUGININFOEX *MirandaPluginInfoEx(DWORD mirandaVersion) +{ +// Log("%s", "Entering function " __FUNCTION__); +// Log("%s", "Leaving function " __FUNCTION__); + return &pluginInfo; +} + +static const MUUID interfaces[] = {MIID_EXCHANGE, MIID_LAST}; + +extern "C" __declspec(dllexport) const MUUID *MirandaPluginInterfaces() +{ + return interfaces; +} + +extern "C" int __declspec(dllexport) Load() +{ +// Log("%s", "Entering function " __FUNCTION__); + //pluginLink = link; + mir_getLP( &pluginInfo ); +// Log("%s", "Initialising miranda memory functions"); +// InitializeMirandaMemFunctions(); + hiMailIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIL)); +// Log("%s", "Creating service functions ..."); + InitServices(); +// Log("%s", "Hooking events ..."); + HookEvents(); + return 0; +} + +extern "C" int __declspec(dllexport) Unload() +{ +// Log("%s", "Entering function " __FUNCTION__); +// Log("%s", "Unhooking events ..."); + +// Log("%s", "Destroying service functions ..."); + DestroyServices(); +// DestroyEvents(); + UnhookEvents(); + +// Log("%s", "Leaving function " __FUNCTION__); + return 0; +} + +extern "C" bool WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) +{ + hInstance = hinstDLL; //save global instance + if (fdwReason == DLL_PROCESS_ATTACH) + { + DisableThreadLibraryCalls(hinstDLL); + } + return TRUE; +} \ No newline at end of file diff --git a/plugins/Exchange/src/hooked_events.cpp b/plugins/Exchange/src/hooked_events.cpp new file mode 100644 index 0000000000..f3eb3b60bc --- /dev/null +++ b/plugins/Exchange/src/hooked_events.cpp @@ -0,0 +1,176 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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 "hooked_events.h" + +HANDLE hModulesLoaded; +HANDLE hOptionsInitialise; +HANDLE hPreShutdown; + +UINT_PTR hCheckTimer = NULL; +UINT_PTR hReconnectTimer = NULL; +UINT_PTR hFirstCheckTimer = NULL; + +#define HOST "http://eblis.tla.ro/projects" + +#define EXCHANGE_VERSION_URL HOST "/miranda/Exchange/updater/Exchange.html" +#define EXCHANGE_UPDATE_URL HOST "/miranda/Exchange/updater/Exchange.zip" +#define EXCHANGE_VERSION_PREFIX "Exchange notifier plugin version " + +int HookEvents() +{ + hModulesLoaded = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); + hOptionsInitialise = HookEvent(ME_OPT_INITIALISE, OnOptionsInitialise); + hPreShutdown = HookEvent(ME_SYSTEM_PRESHUTDOWN, OnSystemPreShutdown); + + return 0; +} + +int UnhookEvents() +{ + UnhookEvent(hModulesLoaded); + UnhookEvent(hOptionsInitialise); + UnhookEvent(hPreShutdown); + + KillTimers(); + + return 0; +} + +int OnModulesLoaded(WPARAM wParam, LPARAM lParam) +{ + + UpdateTimers(); + CLISTMENUITEM cl = {0}; + cl.cbSize = sizeof(CLISTMENUITEM); + cl.hIcon = hiMailIcon; + cl.position = 10000000; + cl.pszService = MS_EXCHANGE_CHECKEMAIL; + cl.pszName = Translate("Check exchange mailbox"); + Menu_AddMainMenuItem (&cl); + + hEmailsDlg = NULL; //CreateDialog(hInstance, MAKEINTRESOURCE(IDD_EMAILS), NULL, DlgProcEmails); //create emails window + FirstTimeCheck(); +// CheckEmail(); + return 0; +} + +//add the exchange options dialog to miranda +int OnOptionsInitialise(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = {0}; + + odp.cbSize = sizeof(odp); + odp.position = 100000000; + odp.hInstance = hInstance; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_EXCHANGE); + odp.ptszTitle = LPGENT("Exchange notify"); + odp.ptszGroup = LPGENT("Plugins"); + odp.groupPosition = 910000000; + odp.flags=ODPF_BOLDGROUPS|ODPF_TCHAR; + odp.pfnDlgProc = (DLGPROC)DlgProcOptions; + //CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); + Options_AddPage(wParam, &odp); + return 0; +} + +int OnSystemPreShutdown(WPARAM wParam, LPARAM lParam) +{ + if (hEmailsDlg) + { + SendMessage(hEmailsDlg, WM_CLOSE, 0, 0); //close the window if it's opened + } + + exchangeServer.Disconnect(); + + return 0; +} + +void FirstTimeCheck() +{ + hFirstCheckTimer = SetTimer(NULL, 0, 5 * 1000, OnFirstCheckTimer); +} + +int UpdateTimers() +{ + KillTimers(); + int interval; + interval = db_get_dw(NULL, ModuleName, "Interval", DEFAULT_INTERVAL); + interval *= 1000; //go from miliseconds to seconds + hCheckTimer = SetTimer(NULL, 0, interval, (TIMERPROC) OnCheckTimer); + + int bReconnect = db_get_b(NULL, ModuleName, "Reconnect", 0); + if (bReconnect) //user wants to forcefully reconnect every x minutes + { + interval = db_get_dw(NULL, ModuleName, "ReconnectInterval", DEFAULT_RECONNECT_INTERVAL); + interval *= 1000 * 60; //go from miliseconds to seconds to minutes + hReconnectTimer = SetTimer(NULL, 0, interval, (TIMERPROC) OnReconnectTimer); + } + + return 0; +} + +int KillTimers() +{ + if (hCheckTimer) + { + KillTimer(NULL, hCheckTimer); + hCheckTimer = NULL; + } + if (hReconnectTimer) + { + KillTimer(NULL, hReconnectTimer); + hReconnectTimer = NULL; + } + return 0; +} + +VOID CALLBACK OnCheckTimer(HWND hWnd, UINT msg, UINT_PTR idEvent, DWORD dwTime) +{ + /*if (exchangeServer.IsConnected()) + { + exchangeServer.Check(); + } + else{ + exchangeServer.Connect(); + }*/ + int bCheck = db_get_b(NULL, ModuleName, "Check", 1); + + if (bCheck) //only check if we were told to + { + ThreadCheckEmail(FALSE); + } +} + +VOID CALLBACK OnReconnectTimer(HWND hWnd, UINT msg, UINT_PTR idEvent, DWORD dwTime) +{ + + _popupUtil("Forcefully reconnecting to Exchange server ..."); + + exchangeServer.Reconnect(); //reconnect +} + +VOID CALLBACK OnFirstCheckTimer(HWND hWnd, UINT msg, UINT_PTR idEvent, DWORD dwTime) +{ + KillTimer(NULL, hFirstCheckTimer); + OnCheckTimer(hWnd, msg, idEvent, dwTime); + + hFirstCheckTimer = NULL; +} \ No newline at end of file diff --git a/plugins/Exchange/src/hooked_events.h b/plugins/Exchange/src/hooked_events.h new file mode 100644 index 0000000000..064e11c4a9 --- /dev/null +++ b/plugins/Exchange/src/hooked_events.h @@ -0,0 +1,49 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +#ifndef M_EXCHANGE_HOOKED_EVENTS_H +#define M_EXCHANGE_HOOKED_EVENTS_H + +#include "commonheaders.h" +#include "dlg_handlers.h" + +extern HANDLE hModulesLoaded; +extern HANDLE hOptionsInitialise; +extern HANDLE hPreShutdown; + +extern UINT_PTR hCheckTimer; +extern UINT_PTR hReconnectTimer; + +int HookEvents(); +int UnhookEvents(); + +void FirstTimeCheck(); + +int OnModulesLoaded(WPARAM wParam, LPARAM lParam); +int OnOptionsInitialise(WPARAM wParam, LPARAM lParam); +int OnSystemPreShutdown(WPARAM wParam, LPARAM lParam); + +int UpdateTimers(); +int KillTimers(); +VOID CALLBACK OnCheckTimer(HWND hWnd, UINT msg, UINT_PTR idEvent, DWORD dwTime); +VOID CALLBACK OnReconnectTimer(HWND hWnd, UINT msg, UINT_PTR idEvent, DWORD dwTime); +VOID CALLBACK OnFirstCheckTimer(HWND hWnd, UINT msg, UINT_PTR idEvent, DWORD dwTime); + +#endif \ No newline at end of file diff --git a/plugins/Exchange/src/resource.h b/plugins/Exchange/src/resource.h new file mode 100644 index 0000000000..866688bd70 --- /dev/null +++ b/plugins/Exchange/src/resource.h @@ -0,0 +1,29 @@ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_OPT_EXCHANGE 101 +#define IDI_MAIL 104 +#define IDD_EMAILS 105 +#define IDI_ICON1 107 +#define IDI_UNREAD 108 +#define IDC_USER_EDIT 1001 +#define IDC_PASSWORD_EDIT 1002 +#define IDC_SERVER_EDIT 1003 +#define IDC_PORT_EDIT 1004 +#define IDC_EDIT5 1005 +#define IDC_USE_POPUPS 1005 +#define IDC_EDIT6 1006 +#define IDC_INTERVAL_EDIT 1006 +#define IDC_EMAILS_LIST 1008 +#define IDC_CLOSE 1009 +#define IDC_BUTTON1 1010 +#define IDC_MARK_READ 1010 +#define IDC_CHECKEMAILS 1010 +#define IDC_CHECK_EMAILS 1010 +#define IDC_RECONNECT 1011 +#define IDC_EDIT1 1012 +#define IDC_RECONNECT_INTERVAL 1012 +#define IDC_USE_PORTCHECK 1013 +#define IDC_EDIT2 1014 +#define IDC_MAX_RETRIES 1014 diff --git a/plugins/Exchange/src/services.cpp b/plugins/Exchange/src/services.cpp new file mode 100644 index 0000000000..b15e25d734 --- /dev/null +++ b/plugins/Exchange/src/services.cpp @@ -0,0 +1,50 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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 "services.h" + +CRITICAL_SECTION csCheck; + +int InitServices() +{ + CreateServiceFunction(MS_EXCHANGE_CHECKEMAIL, (MIRANDASERVICE) CheckEmailService); + InitializeCriticalSection(&csCheck); + + return 0; +} + +int DestroyServices() +{ + DestroyServiceFunction(MS_EXCHANGE_CHECKEMAIL); + DeleteCriticalSection(&csCheck); + + return 0; +} + +int CheckEmailService(WPARAM wParam, LPARAM lParam) +{ +/* + if (!exchangeServer.IsConnected()) + { + exchangeServer.Connect(1); //force connection attempt + } + return exchangeServer.Check(TRUE); */ + return ThreadCheckEmail(TRUE); +} \ No newline at end of file diff --git a/plugins/Exchange/src/services.h b/plugins/Exchange/src/services.h new file mode 100644 index 0000000000..4640f6bed6 --- /dev/null +++ b/plugins/Exchange/src/services.h @@ -0,0 +1,35 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +#ifndef M_EXCHANGE_SERVICES_H +#define M_EXCHANGE_SERVICES_H + +#define MS_EXCHANGE_CHECKEMAIL "Exchange/CheckEmail" + +#include "commonheaders.h" + +extern CRITICAL_SECTION csCheck; + +int InitServices(); +int DestroyServices(); + +int CheckEmailService(WPARAM wParam, LPARAM lParam); + +#endif //M_EXCHANGE_SERVICES_H \ No newline at end of file diff --git a/plugins/Exchange/src/utils.cpp b/plugins/Exchange/src/utils.cpp new file mode 100644 index 0000000000..97aed40a68 --- /dev/null +++ b/plugins/Exchange/src/utils.cpp @@ -0,0 +1,276 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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 "utils.h" + +#define ___DEB + +int LogInit() +{ +#ifdef ___DEBUGG + FILE *fout = fopen(LOG_FILE, "wt"); + fclose(fout); +#endif + return 0; +} + +int Log(char *format, ...) +{ +#ifdef ___DEBUGG + char str[4096]; + va_list vararg; + int tBytes; + FILE *fout = fopen(LOG_FILE, "at"); + if (!fout) + { +// MessageBox(0, "can't open file", NULL, MB_OK); + return -1; + } + + va_start(vararg, format); + + tBytes = _vsnprintf(str, sizeof(str), format, vararg); + if (tBytes > 0) + { + str[tBytes] = 0; + } + + va_end(vararg); + if (str[strlen(str) - 1] != '\n') + { + strcat(str, "\n"); + } + fputs(str, fout); + fclose(fout); +#endif + return 0; +} + +int Info(char *title, char *format, ...) +{ + char str[4096]; + va_list vararg; + int tBytes; + va_start(vararg, format); + tBytes = _vsnprintf(str, sizeof(str), format, vararg); + if (tBytes > 0) + { + str[tBytes] = 0; + } + va_end(vararg); + return MessageBoxA(0, str, title, MB_OK | MB_ICONINFORMATION); +} + +#define HEX_SIZE 8 + +char *BinToHex(int size, PBYTE data) +{ + char *szresult = NULL; + char buffer[32] = {0}; //should be more than enough + int maxSize = size * 2 + HEX_SIZE + 1; + szresult = (char *) new char[ maxSize ]; + memset(szresult, 0, maxSize); + sprintf(buffer, "%0*X", HEX_SIZE, size); + strcpy(szresult, buffer); + int i; + for (i = 0; i < size; i++) + { + sprintf(buffer, "%02X", data[i]); + strcpy(szresult + (HEX_SIZE + i * 2), buffer); + } + return szresult; +} +/* +TCHAR *BinToHex(int size, PBYTE data) +{ + TCHAR *szresult = NULL; + TCHAR buffer[32] = {0}; //should be more than enough + int maxSize = size * 2 + HEX_SIZE + 1; + szresult = (TCHAR *) new TCHAR[ maxSize ]; + memset(szresult, 0, maxSize); + mir_sntprintf(buffer,_countof(buffer), _T("%0*X"), HEX_SIZE, size); + _tcsncpy(szresult, buffer,_countof(buffer)); + int i; + for (i = 0; i < size; i++) + { + mir_sntprintf(buffer, _countof(buffer),_T("%02X"), data[i]); + _tcsncpy(szresult + (HEX_SIZE + i * 2), buffer,_countof(buffer)); + } + return szresult; +} +*/ + +void HexToBin(TCHAR *inData, ULONG &size, LPBYTE &outData) +{ + TCHAR buffer[32] = {0}; + _tcsncpy(buffer, _T("0x"),_countof(_T("0x"))); + _tcsncpy(buffer + 2, inData, HEX_SIZE); + _stscanf(buffer, _T("%x"), &size); + outData = (unsigned char*)new char[size*2]; + UINT i; + //size = i; + TCHAR *tmp = inData + HEX_SIZE; + buffer[4] = '\0'; //mark the end of the string + for (i = 0; i < size; i++) + { + _tcsncpy(buffer + 2, &tmp[i * 2], 2); + _stscanf(buffer, _T("%x"), &outData[i]); + } + i = size; +} + +int GetStringFromDatabase(char *szSettingName, TCHAR *szError, TCHAR *szResult, int size) +{ + DBVARIANT dbv = {0}; + int res = 1; + int len; + dbv.type = DBVT_ASCIIZ; + if (db_get_ts(NULL, ModuleName, szSettingName, &dbv) == 0) + { + res = 0; + int tmp = _tcslen(dbv.ptszVal); + len = (tmp < size - 1) ? tmp : size - 1; + _tcsncpy(szResult, dbv.ptszVal, len); + szResult[len] = '\0'; + mir_free(dbv.ptszVal); + } + else{ + res = 1; + int tmp = _tcslen(szError); + len = (tmp < size - 1) ? tmp : size - 1; + _tcsncpy(szResult, szError, len); + szResult[len] = '\0'; + } + return res; +} + +void ScreenToClient(HWND hWnd, LPRECT rect) +{ + POINT pt; + int cx = rect->right - rect->left; + int cy = rect->bottom - rect->top; + pt.x = rect->left; + pt.y = rect->top; + ScreenToClient(hWnd, &pt); + rect->left = pt.x; + rect->top = pt.y; + rect->right = pt.x + cx; + rect->bottom = pt.y + cy; +} + +void AnchorMoveWindow(HWND window, const WINDOWPOS *parentPos, int anchors) +{ + RECT rParent; + RECT rChild; + + if (parentPos->flags & SWP_NOSIZE) + { + return; + } + GetWindowRect(parentPos->hwnd, &rParent); + rChild = AnchorCalcPos(window, &rParent, parentPos, anchors); + MoveWindow(window, rChild.left, rChild.top, rChild.right - rChild.left, rChild.bottom - rChild.top, FALSE); +} + +RECT AnchorCalcPos(HWND window, const RECT *rParent, const WINDOWPOS *parentPos, int anchors) +{ + RECT rChild; + RECT rTmp; + + GetWindowRect(window, &rChild); + ScreenToClient(parentPos->hwnd, &rChild); + + int cx = rParent->right - rParent->left; + int cy = rParent->bottom - rParent->top; + if ((cx == parentPos->cx) && (cy == parentPos->cy)) + { + return rChild; + } + if (parentPos->flags & SWP_NOSIZE) + { + return rChild; + } + + rTmp.left = parentPos->x - rParent->left; + rTmp.right = (parentPos->x + parentPos->cx) - rParent->right; + rTmp.bottom = (parentPos->y + parentPos->cy) - rParent->bottom; + rTmp.top = parentPos->y - rParent->top; + + cx = (rTmp.left) ? -rTmp.left : rTmp.right; + cy = (rTmp.top) ? -rTmp.top : rTmp.bottom; + + rChild.right += cx; + rChild.bottom += cy; + //expanded the window accordingly, now we need to enforce the anchors + if ((anchors & ANCHOR_LEFT) && (!(anchors & ANCHOR_RIGHT))) + { + rChild.right -= cx; + } + if ((anchors & ANCHOR_TOP) && (!(anchors & ANCHOR_BOTTOM))) + { + rChild.bottom -= cy; + } + if ((anchors & ANCHOR_RIGHT) && (!(anchors & ANCHOR_LEFT))) + { + rChild.left += cx; + } + if ((anchors & ANCHOR_BOTTOM) && (!(anchors & ANCHOR_TOP))) + { + rChild.top += cy; + } + return rChild; +} + +DWORD WINAPI CheckEmailWorkerThread(LPVOID data) +{ + EnterCriticalSection(&csCheck); + + int bForceAttempt = (int) data; + + if (!exchangeServer.IsConnected()) + { + exchangeServer.Connect(bForceAttempt); + } + exchangeServer.Check(bForceAttempt); + + LeaveCriticalSection(&csCheck); + + return 0; +} + +int ThreadCheckEmail(int bForceAttempt) +{ + DWORD idThread; + HANDLE hCheckThread = CreateThread(NULL, NULL, CheckEmailWorkerThread, (void *) bForceAttempt, 0, &idThread); + CloseHandle(hCheckThread); + + return 0; +} + +void _popupUtil(char* szMsg) +{ + POPUPDATAT ppd = {0}; + ppd.lchIcon = hiMailIcon; + _tcscpy(ppd.lptzContactName, _T("Exchange notifier")); + _tcscpy(ppd.lptzText, mir_a2t(szMsg)); + PUAddPopupT(&ppd); //show a popup to tell the user what we're doing. + + +} diff --git a/plugins/Exchange/src/utils.h b/plugins/Exchange/src/utils.h new file mode 100644 index 0000000000..a1ad15fe43 --- /dev/null +++ b/plugins/Exchange/src/utils.h @@ -0,0 +1,52 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +#ifndef M_EXCHANGE_UTILS_H +#define M_EXCHANGE_UTILS_H + +#include +#include "commonheaders.h" + +#define LOG_FILE "exchange.log" + +#define ANCHOR_LEFT 0x000001 +#define ANCHOR_RIGHT 0x000002 +#define ANCHOR_TOP 0x000004 +#define ANCHOR_BOTTOM 0x000008 +#define ANCHOR_ALL ANCHOR_LEFT | ANCHOR_RIGHT | ANCHOR_TOP | ANCHOR_BOTTOM + +int LogInit(); +int Log(char *format, ...); +int Info(char *title, char *format, ...); + +char *BinToHex(int size, PBYTE data); +void HexToBin(TCHAR *inData, ULONG &size, PBYTE &outData); + + +void ScreenToClient(HWND hWnd, LPRECT rect); +void AnchorMoveWindow(HWND window, const WINDOWPOS *parentPos, int anchors); +RECT AnchorCalcPos(HWND window, const RECT *rParent, const WINDOWPOS *parentPos, int anchors); + +int GetStringFromDatabase(char *szSettingName, TCHAR *szError, TCHAR *szResult, int size); + +int ThreadCheckEmail(int bForceAttempt); + +void _popupUtil(char* szMsg); +#endif \ No newline at end of file diff --git a/plugins/Exchange/src/version.h b/plugins/Exchange/src/version.h new file mode 100644 index 0000000000..6ca2653b57 --- /dev/null +++ b/plugins/Exchange/src/version.h @@ -0,0 +1,45 @@ +/* +Exchange notifier plugin for Miranda IM + +Copyright © 2006 Cristian Libotean, Attila Vajda + +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. +*/ + +#ifndef M_EXCHANGE_VERSION_H +#define M_EXCHANGE_VERSION_H + +#define __MAJOR_VERSION 0 +#define __MINOR_VERSION 1 +#define __RELEASE_NUM 3 +#define __BUILD_NUM 4 + +#define VERSION PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM) + +#define __PLUGINVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM +#define __PLUGINVERSION_STRING_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM +#define __STRINGIFY_(x) #x +#define __STRINGIFY(x) __STRINGIFY_(x) +#define __VERSION_STRING __STRINGIFY(__PLUGINVERSION_STRING_DOTS) + +#define __DESC "Notifies you if you have unread email on an exchange server." +#define __AUTHOR "Cristian Libotean, Attila Vajda, MaKaR (NG)" +#define __AUTHOREMAIL "makar@poczta.of.pl" +#define __COPYRIGHT "© 2006-2013 Cristian Libotean and Attila Vajda" +#define __AUTHORWEB "http://maciej.wycik.pl/miranda" + +#define __PLUGIN_DISPLAY_NAME "Exchange notifier plugin" + +#endif //M_EXCHANGE_VERSION_H -- cgit v1.2.3