summaryrefslogtreecommitdiff
path: root/plugins/HistorySweeperLight
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2012-05-15 10:38:20 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2012-05-15 10:38:20 +0000
commit48540940b6c28bb4378abfeb500ec45a625b37b6 (patch)
tree2ef294c0763e802f91d868bdef4229b6868527de /plugins/HistorySweeperLight
parent5c350913f011e119127baeb32a6aedeb4f0d33bc (diff)
initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/HistorySweeperLight')
-rw-r--r--plugins/HistorySweeperLight/act1.icobin0 -> 1150 bytes
-rw-r--r--plugins/HistorySweeperLight/act2.icobin0 -> 1150 bytes
-rw-r--r--plugins/HistorySweeperLight/actDel.icobin0 -> 1150 bytes
-rw-r--r--plugins/HistorySweeperLight/actG.icobin0 -> 1150 bytes
-rw-r--r--plugins/HistorySweeperLight/historysweeperlight.c256
-rw-r--r--plugins/HistorySweeperLight/historysweeperlight.h68
-rw-r--r--plugins/HistorySweeperLight/historysweeperlight.rc83
-rw-r--r--plugins/HistorySweeperLight/historysweeperlight.vcproj309
-rw-r--r--plugins/HistorySweeperLight/historysweeperlight_10.sln19
-rw-r--r--plugins/HistorySweeperLight/historysweeperlight_10.vcxproj113
-rw-r--r--plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters44
-rw-r--r--plugins/HistorySweeperLight/main.c189
-rw-r--r--plugins/HistorySweeperLight/options.c356
-rw-r--r--plugins/HistorySweeperLight/resource.h18
-rw-r--r--plugins/HistorySweeperLight/version.h23
15 files changed, 1478 insertions, 0 deletions
diff --git a/plugins/HistorySweeperLight/act1.ico b/plugins/HistorySweeperLight/act1.ico
new file mode 100644
index 0000000000..0557c177a1
--- /dev/null
+++ b/plugins/HistorySweeperLight/act1.ico
Binary files differ
diff --git a/plugins/HistorySweeperLight/act2.ico b/plugins/HistorySweeperLight/act2.ico
new file mode 100644
index 0000000000..957572de2b
--- /dev/null
+++ b/plugins/HistorySweeperLight/act2.ico
Binary files differ
diff --git a/plugins/HistorySweeperLight/actDel.ico b/plugins/HistorySweeperLight/actDel.ico
new file mode 100644
index 0000000000..748ab4b65e
--- /dev/null
+++ b/plugins/HistorySweeperLight/actDel.ico
Binary files differ
diff --git a/plugins/HistorySweeperLight/actG.ico b/plugins/HistorySweeperLight/actG.ico
new file mode 100644
index 0000000000..1273d332ae
--- /dev/null
+++ b/plugins/HistorySweeperLight/actG.ico
Binary files differ
diff --git a/plugins/HistorySweeperLight/historysweeperlight.c b/plugins/HistorySweeperLight/historysweeperlight.c
new file mode 100644
index 0000000000..ee99f0d5c6
--- /dev/null
+++ b/plugins/HistorySweeperLight/historysweeperlight.c
@@ -0,0 +1,256 @@
+/*
+Miranda IM History Sweeper Light plugin
+Copyright (C) 2002-2003 Sergey V. Gershovich
+Copyright (C) 2006-2009 Boris Krasnovskiy
+Copyright (C) 2010, 2011 tico-tico
+
+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 "historysweeperlight.h"
+
+#ifdef VC6BUILD
+#define _____TIMEPROC time
+#else
+#define _____TIMEPROC _time32
+#endif
+
+_CRTIMP __time32_t __cdecl _____TIMEPROC(_Out_opt_ __time32_t * _Time);
+
+typedef struct
+{
+ time_t time;
+ int keep;
+} CriteriaStruct;
+
+// build criteria
+time_t BuildCriteria(int dwti)
+{
+ time_t tim = _____TIMEPROC(NULL);
+
+ switch (dwti)
+ {
+ case 0:
+ tim -= 1 * 24 * 3600;
+ break;
+ case 1:
+ tim -= 3 * 24 * 3600;
+ break;
+ case 2:
+ tim -= 7 * 24 * 3600;
+ break;
+ case 3:
+ tim -= 14 * 24 * 3600;
+ break;
+ case 4:
+ tim -= 30 * 24 * 3600;
+ break;
+ case 5:
+ tim -= 90 * 24 * 3600;
+ break;
+ case 6:
+ tim -= 180 * 24 * 3600;
+ break;
+ default:
+ tim -= 365 * 24 * 3600;
+ }
+ return tim;
+}
+
+// keep criteria
+int KeepCriteria(int dwti)
+{
+ switch (dwti)
+ {
+ case 0:
+ return 1;
+ case 1:
+ return 2;
+ case 2:
+ return 5;
+ case 3:
+ return 10;
+ case 4:
+ return 20;
+ default:
+ return 50;
+ }
+}
+
+typedef struct
+{
+ HANDLE hDBEvent;
+ DWORD CRC32;
+ DWORD Timestamp;
+} BEventData;
+
+static int CompareBookmarks( const void* p1, const void* p2 )
+{
+ return (BYTE*)((BEventData*)p1)->hDBEvent - (BYTE*)((BEventData*)p2)->hDBEvent;
+}
+
+static void GetBookmarks(HANDLE hContact, BEventData** books, size_t* bookcnt )
+{
+ DBVARIANT dbv;
+ DBCONTACTGETSETTING cgs;
+
+ *books = NULL;
+ *bookcnt = 0;
+
+ cgs.szModule = "HistoryPlusPlus";
+ cgs.szSetting = "Bookmarks";
+ cgs.pValue = &dbv;
+ if (CallService(MS_DB_CONTACT_GETSETTING, (WPARAM)hContact, (LPARAM)&cgs) == 0)
+ {
+ if (dbv.cpbVal > 2 && *(WORD*)dbv.pbVal >= sizeof(BEventData))
+ {
+ size_t recSize = *(WORD*)dbv.pbVal;
+ size_t numb = (dbv.cpbVal - sizeof(WORD)) / recSize;
+
+ BEventData* tbooks = mir_alloc(sizeof(BEventData)*numb);
+ size_t tbookcnt = 0;
+
+ size_t i;
+ BYTE* evs = dbv.pbVal + sizeof(WORD);
+
+ for (i=0; i<numb; ++i)
+ {
+ tbooks[tbookcnt++] = *(BEventData*)evs;
+ evs += recSize;
+ }
+ if (tbookcnt != 0)
+ {
+ qsort(tbooks, tbookcnt, sizeof(BEventData), CompareBookmarks);
+ *bookcnt = tbookcnt;
+ *books = tbooks;
+ }
+ else
+ mir_free(tbooks);
+ }
+
+ DBFreeVariant(&dbv);
+ }
+}
+
+//Sweep history from specified contact
+void SweepHistoryFromContact(HANDLE hContact, CriteriaStruct Criteria, BOOL keepUnread)
+{
+ int lPolicy, eventsCnt;
+
+ if (hContact == NULL) // for system history
+ lPolicy = DBGetContactSettingByte(NULL, ModuleName, "SweepSHistory", 0);
+ else // for contact history (or "SweepHistory" - default action)
+ lPolicy = DBGetContactSettingByte(hContact, ModuleName, "SweepHistory", DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0));
+
+ if (lPolicy == 0) return; // nothing to do
+
+ eventsCnt = CallService(MS_DB_EVENT_GETCOUNT, (WPARAM)hContact, 0);
+
+ if (eventsCnt != 0)
+ {
+ BOOL doDelete, unsafe = DBGetContactSettingByte(NULL, ModuleName, "UnsafeMode", 0);
+ HANDLE hDBEvent, hDBEventNext; BEventData *books, *item, ev = { 0 };
+ DBEVENTINFO dbei; size_t bookcnt, btshift;
+
+ SetCursor(LoadCursor(0, IDC_WAIT));
+
+ // switch off SAFETYMODE if necessary
+ if (unsafe) CallService(MS_DB_SETSAFETYMODE, 0, 0);
+
+ GetBookmarks(hContact, &books, &bookcnt);
+
+ //Get first event
+ hDBEvent = (HANDLE)CallService(MS_DB_EVENT_FINDFIRST, (WPARAM)hContact, 0);
+
+ while (hDBEvent != NULL)
+ {
+ ZeroMemory(&dbei, sizeof(dbei));
+ dbei.cbSize = sizeof(dbei);
+
+ CallService(MS_DB_EVENT_GET, (WPARAM)hDBEvent, (LPARAM)&dbei);
+
+ // should we stop processing?
+ // lPolicy == 1 - for time criterion, lPolicy == 2 - keep N last events, lPolicy == 3 - delete all events
+ if ( (lPolicy == 1 && (unsigned)Criteria.time < dbei.timestamp) || (lPolicy == 2 && Criteria.keep > --eventsCnt) ) break;
+
+ doDelete = TRUE;
+
+ if (!(dbei.flags & (DBEF_SENT | DBEF_READ)) && keepUnread) doDelete = FALSE; // keep unread events
+
+ if (bookcnt != 0) // keep bookmarks
+ {
+ ev.hDBEvent = hDBEvent;
+ item = (BEventData*)bsearch( &ev, books, bookcnt, sizeof(BEventData), CompareBookmarks);
+ if (item != NULL)
+ if (item->Timestamp == dbei.timestamp)
+ {
+ doDelete = FALSE;
+ btshift = (--bookcnt - (item - books))*sizeof(BEventData);
+ if (btshift) memmove(item, item+1, btshift);
+ }
+ }
+
+ // find next event
+ hDBEventNext = (HANDLE)CallService(MS_DB_EVENT_FINDNEXT, (WPARAM)hDBEvent, 0);
+
+ if (doDelete) CallService(MS_DB_EVENT_DELETE, (WPARAM)hContact, (LPARAM)hDBEvent);
+
+ hDBEvent = hDBEventNext;
+ } // while (hDBEvent != NULL)
+
+ mir_free(books);
+
+ // switch ON safety mode as fast as we can to avoid DB corruption
+ if (unsafe) CallService(MS_DB_SETSAFETYMODE, 1, 0);
+
+ SetCursor(LoadCursor(0, IDC_ARROW));
+ } // if (eventsCnt != 0)
+}
+
+// shutdown action
+void ShutdownAction(void)
+{
+ CriteriaStruct Criteria;
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+
+ Criteria.keep = KeepCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0));
+ Criteria.time = BuildCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0));
+
+ SweepHistoryFromContact(NULL, Criteria, FALSE); // sweep system history, keepunread==0
+
+ while ( hContact != NULL )
+ {
+ SweepHistoryFromContact(hContact, Criteria, TRUE); // sweep contact history, keepunread==1
+
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); // go to next contact
+ }
+}
+
+int OnWindowEvent(WPARAM wParam, LPARAM lParam)
+{
+ MessageWindowEventData* msgEvData = (MessageWindowEventData*)lParam;
+
+ if (msgEvData->uType == MSG_WINDOW_EVT_CLOSE && DBGetContactSettingByte(NULL, ModuleName, "SweepOnClose", 0))
+ {
+ CriteriaStruct Criteria;
+
+ Criteria.keep = KeepCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0));
+ Criteria.time = BuildCriteria(DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0));
+
+ SweepHistoryFromContact(msgEvData->hContact, Criteria, TRUE);
+ }
+
+ return 0;
+}
diff --git a/plugins/HistorySweeperLight/historysweeperlight.h b/plugins/HistorySweeperLight/historysweeperlight.h
new file mode 100644
index 0000000000..db86672ff5
--- /dev/null
+++ b/plugins/HistorySweeperLight/historysweeperlight.h
@@ -0,0 +1,68 @@
+/*
+Miranda IM History Sweeper Light plugin
+Copyright (C) 2002-2003 Sergey V. Gershovich
+Copyright (C) 2006-2009 Boris Krasnovskiy
+Copyright (C) 2010, 2011 tico-tico
+
+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 __HISTORYSWEEPERLIGHT_H__
+#define __HISTORYSWEEPERLIGHT_H__
+
+#define MIRANDA_VER 0x0800
+
+#define _USE_32BIT_TIME_T
+
+#include <windows.h>
+#include <commctrl.h>
+
+#include <win2k.h>
+#include <newpluginapi.h>
+#include <m_clc.h>
+#include <m_database.h>
+#include <m_langpack.h>
+#include <m_options.h>
+#include <m_message.h>
+#include <m_icolib.h>
+#include <m_clistint.h>
+#include <m_skin.h>
+
+#include "resource.h"
+
+// Plugin name
+#define ModuleName "History Sweeper Light"
+
+// Plugin UUID for New plugin loader
+// req. 0.7.18+ core
+// {1D9BF74A-44A8-4b3f-A6E5-73069D3A8979}
+#define MIID_HISTORYSWEEPERLIGHT { 0x1d9bf74a, 0x44a8, 0x4b3f, { 0xa6, 0xe5, 0x73, 0x6, 0x9d, 0x3a, 0x89, 0x79 } }
+
+// main.c
+extern HINSTANCE hInst;
+
+// options.c
+extern const char* time_stamp_strings[];
+extern const char* keep_strings[];
+int HSOptInitialise(WPARAM wParam, LPARAM lParam);
+void InitIcons(void);
+void ReleaseIconEx(const char* name);
+HICON LoadIconEx(const char* name);
+HANDLE GetIconHandle(const char* name);
+
+// historysweeper.c
+void ShutdownAction(void);
+int OnWindowEvent(WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/plugins/HistorySweeperLight/historysweeperlight.rc b/plugins/HistorySweeperLight/historysweeperlight.rc
new file mode 100644
index 0000000000..31129587ca
--- /dev/null
+++ b/plugins/HistorySweeperLight/historysweeperlight.rc
@@ -0,0 +1,83 @@
+// Generated by ResEdit 1.4.13
+// Copyright (C) 2006-2010
+// http://www.resedit.net
+
+#include <windows.h>
+#include "resource.h"
+#include "version.h"
+
+
+
+//
+// Dialog resources
+//
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+IDD_OPT_HISTORYSWEEPER DIALOGEX 0, 0, 313, 240
+STYLE DS_SHELLFONT | WS_VISIBLE | WS_CHILDWINDOW
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 1
+{
+ GROUPBOX "History Sweeper Light", IDC_STATIC, 0, 0, 313, 240
+ LTEXT "Sweep history for this contacts:", IDC_STATIC, 8, 12, 296, 10
+ CONTROL "", IDC_LIST, "CListControl", 0x500101D2, 8, 22, 297, 139, 0x00000200
+ ICON "", IDC_ACT1, 8, 164, 21, 20, SS_ICON
+ LTEXT "Action 1", IDC_STATIC, 22, 164, 118, 10
+ COMBOBOX IDC_SSOLDER, 8, 177, 140, 70, WS_TABSTOP | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST
+ ICON "", IDC_ACT2, 165, 164, 21, 20, SS_ICON
+ LTEXT "Action 2", IDC_STATIC, 179, 164, 118, 10
+ COMBOBOX IDC_SSKEEP, 165, 177, 140, 70, WS_TABSTOP | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST
+ AUTOCHECKBOX "Sweep on closing message window", IDC_SWEEPONCLOSE, 8, 197, 294, 10
+ AUTOCHECKBOX "Clicking on the icon in the status bar will change settings", IDC_HISTMW, 8, 211, 294, 10
+ AUTOCHECKBOX "Use UNSAFE mode (sweep fastest as possible, but dangerous for DB)", IDC_UNSAFEMODE, 8, 225, 294, 10
+}
+
+
+
+//
+// Icon resources
+//
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+IDI_ACT1 ICON "act1.ico"
+
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+IDI_ACT2 ICON "act2.ico"
+
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+IDI_ACTG ICON "actG.ico"
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+IDI_ACTDEL ICON "actDel.ico"
+
+//
+// Version Information resources
+//
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION __FILEVERSION_STRING
+ PRODUCTVERSION __FILEVERSION_STRING
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+ FILEFLAGSMASK 0x00000017
+ FILEFLAGS 0x00000000
+{
+ BLOCK "StringFileInfo"
+ {
+ BLOCK "040904b0"
+ {
+ VALUE "FileDescription", "History Sweeper Light Miranda IM Plugin"
+ VALUE "FileVersion", __VERSION_STRING
+ VALUE "InternalName", "History Sweeper Light"
+ VALUE "LegalCopyright", "Copyright (C) Boris Krasnovskiy 2006-2009, (C) 2010, 2011 tico-tico"
+ VALUE "OriginalFilename", "historysweeperlight.dll"
+ VALUE "ProductName", "History Sweeper Light Miranda IM Plugin"
+ VALUE "ProductVersion", __VERSION_STRING
+ }
+ }
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 0x0409, 0x04B0
+ }
+}
diff --git a/plugins/HistorySweeperLight/historysweeperlight.vcproj b/plugins/HistorySweeperLight/historysweeperlight.vcproj
new file mode 100644
index 0000000000..46b54e5ec9
--- /dev/null
+++ b/plugins/HistorySweeperLight/historysweeperlight.vcproj
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="historysweeperlight"
+ ProjectGUID="{9DE1F0B0-B9D1-4681-82E7-13CC3E047445}"
+ RootNamespace="historysweeperlight"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="comctl32.lib"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release Unicode|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="1"
+ EnableIntrinsicFunctions="false"
+ FavorSizeOrSpeed="2"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="comctl32.lib"
+ LinkIncremental="1"
+ GenerateDebugInformation="false"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release Unicode vc6|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="3"
+ InlineFunctionExpansion="2"
+ EnableIntrinsicFunctions="true"
+ FavorSizeOrSpeed="2"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS;VC6BUILD"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="0"
+ FloatingPointModel="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="comctl32.lib ..\vc6libs\msvcrt.lib ..\vc6libs\msvcrt_winxp.obj"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ IgnoreAllDefaultLibraries="true"
+ GenerateDebugInformation="false"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\historysweeperlight.c"
+ >
+ </File>
+ <File
+ RelativePath=".\main.c"
+ >
+ </File>
+ <File
+ RelativePath=".\options.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\historysweeperlight.h"
+ >
+ </File>
+ <File
+ RelativePath=".\resource.h"
+ >
+ </File>
+ <File
+ RelativePath=".\version.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath=".\historysweeperlight.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/plugins/HistorySweeperLight/historysweeperlight_10.sln b/plugins/HistorySweeperLight/historysweeperlight_10.sln
new file mode 100644
index 0000000000..17ed71fab7
--- /dev/null
+++ b/plugins/HistorySweeperLight/historysweeperlight_10.sln
@@ -0,0 +1,19 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "historysweeperlight", "historysweeperlight_10.vcxproj", "{9DE1F0B0-B9D1-4681-82E7-13CC3E047445}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug Unicode|Win32 = Debug Unicode|Win32
+ Release Unicode|Win32 = Release Unicode|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9DE1F0B0-B9D1-4681-82E7-13CC3E047445}.Debug Unicode|Win32.ActiveCfg = Debug Unicode|Win32
+ {9DE1F0B0-B9D1-4681-82E7-13CC3E047445}.Debug Unicode|Win32.Build.0 = Debug Unicode|Win32
+ {9DE1F0B0-B9D1-4681-82E7-13CC3E047445}.Release Unicode|Win32.ActiveCfg = Release Unicode|Win32
+ {9DE1F0B0-B9D1-4681-82E7-13CC3E047445}.Release Unicode|Win32.Build.0 = Release Unicode|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj
new file mode 100644
index 0000000000..0b15229cd5
--- /dev/null
+++ b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug Unicode|Win32">
+ <Configuration>Debug Unicode</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release Unicode|Win32">
+ <Configuration>Release Unicode</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>historysweeperlight</ProjectName>
+ <ProjectGuid>{9DE1F0B0-B9D1-4681-82E7-13CC3E047445}</ProjectGuid>
+ <RootNamespace>historysweeperlight</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">$(SolutionDir)$(Configuration)/Plugins\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">$(SolutionDir)$(Configuration)/Obj/$(ProjectName)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Unicode|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>../../include;../ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Unicode|Win32'">
+ <ClCompile>
+ <Optimization>Full</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <IntrinsicFunctions>false</IntrinsicFunctions>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;HISTORYSWEEPERLIGHT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>../../include;../ExternalAPI;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="historysweeperlight.c" />
+ <ClCompile Include="main.c" />
+ <ClCompile Include="options.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="historysweeperlight.h" />
+ <ClInclude Include="resource.h" />
+ <ClInclude Include="version.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="historysweeperlight.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters
new file mode 100644
index 0000000000..feb246208c
--- /dev/null
+++ b/plugins/HistorySweeperLight/historysweeperlight_10.vcxproj.filters
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="historysweeperlight.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="main.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="options.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="historysweeperlight.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="version.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="historysweeperlight.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/plugins/HistorySweeperLight/main.c b/plugins/HistorySweeperLight/main.c
new file mode 100644
index 0000000000..e658b19015
--- /dev/null
+++ b/plugins/HistorySweeperLight/main.c
@@ -0,0 +1,189 @@
+/*
+Miranda IM History Sweeper Light plugin
+Copyright (C) 2002-2003 Sergey V. Gershovich
+Copyright (C) 2006-2009 Boris Krasnovskiy
+Copyright (C) 2010, 2011 tico-tico
+
+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 "historysweeperlight.h"
+#include "version.h"
+
+HINSTANCE hInst;
+PLUGINLINK *pluginLink;
+
+struct MM_INTERFACE mmi;
+
+static HANDLE hHooks[5];
+
+static PLUGININFOEX pluginInfoEx =
+{
+ // about plugin
+ sizeof(PLUGININFOEX),
+ "History Sweeper Light Unicode",
+ __VERSION_DWORD,
+ "This plugin can sweep system history, history from all contacts or only from chosen; also it may sweep history older than certain time; and may do it at Miranda IM startup/shutdown.",
+ "Sergey V. Gershovich a.k.a. Jazzy$, Boris Krasnovskiy, tico-tico",
+ "",
+ "© 2002-2003 Sergey V. Gershovich a.k.a. Jazzy$, 2006-2009 Boris Krasnovskiy, 2010, 2011 tico-tico",
+ "",
+ UNICODE_AWARE,
+ 0,
+ MIID_HISTORYSWEEPERLIGHT
+};
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hInst=hinstDLL;
+ return TRUE;
+}
+
+int OnIconPressed(WPARAM wParam, LPARAM lParam)
+{
+ StatusIconClickData *sicd = (StatusIconClickData *)lParam;
+
+ if ( !(sicd->flags & MBCF_RIGHTBUTTON) && !lstrcmpA(sicd->szModule, ModuleName)
+ && DBGetContactSettingByte(NULL, ModuleName, "ChangeInMW", 0) )
+ {
+ int nh = sicd->dwId; HANDLE hContact = (HANDLE)wParam; StatusIconData sid = {0};
+
+ sid.cbSize = sizeof(sid);
+ sid.szModule = ModuleName;
+ sid.dwId = nh;
+ sid.flags = MBF_HIDDEN;
+ CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid);
+
+ nh = (nh + 1) % 4;
+ DBWriteContactSettingByte((HANDLE)wParam, ModuleName, "SweepHistory", (BYTE)nh);
+
+ sid.dwId = nh;
+ sid.flags = 0;
+ CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid);
+ }
+ return 0;
+}
+
+
+int OnModulesLoaded(WPARAM wParam, LPARAM lParam)
+{
+ StatusIconData sid = {0};
+ int i, sweep = DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0);
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+
+ sid.cbSize = sizeof(sid);
+ sid.szModule = ModuleName;
+
+ sid.hIcon = LoadIconEx("actG");
+ if (sweep == 0)
+ sid.szTooltip = Translate("Keep all events");
+ else if (sweep == 1)
+ {
+ sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]);
+ }
+ else if (sweep == 2)
+ {
+ sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]);
+ }
+ else if (sweep == 3)
+ {
+ sid.szTooltip = Translate("Delete all events");
+ }
+ sid.flags = MBF_HIDDEN;
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+
+ sid.dwId = 1;
+ sid.hIcon = LoadIconEx("act1");
+ sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]);
+ sid.flags = MBF_HIDDEN;
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+
+ sid.dwId = 2;
+ sid.hIcon = LoadIconEx("act2");
+ sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]);
+ sid.flags = MBF_HIDDEN;
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+
+ sid.dwId = 3;
+ sid.hIcon = LoadIconEx("actDel");
+ sid.szTooltip = Translate("Delete all events");
+ sid.flags = MBF_HIDDEN;
+ CallService(MS_MSG_ADDICON, 0, (LPARAM)&sid);
+
+ // for new contacts
+ while ( hContact != NULL )
+ {
+ ZeroMemory(&sid,sizeof(sid));
+
+ sweep = DBGetContactSettingByte(hContact, ModuleName, "SweepHistory", 0);
+
+ sid.cbSize = sizeof(sid);
+ sid.szModule = ModuleName;
+
+ for(i = 0; i < 4; i++)
+ {
+ sid.dwId = i;
+ sid.flags = (sweep == i) ? 0 : MBF_HIDDEN;
+ CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid);
+ }
+
+ hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
+ }
+
+ hHooks[2] = HookEvent(ME_MSG_WINDOWEVENT, OnWindowEvent);
+ hHooks[3] = HookEvent(ME_MSG_ICONPRESSED, OnIconPressed);
+
+ return 0;
+}
+
+__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfoEx;
+}
+
+static const MUUID interfaces[] = {MIID_HISTORYSWEEPERLIGHT, MIID_LAST};
+__declspec(dllexport) const MUUID* MirandaPluginInterfaces(void)
+{
+ return interfaces;
+}
+
+int __declspec(dllexport) Load(PLUGINLINK *link)
+{
+ pluginLink = link;
+
+ mir_getMMI(&mmi);
+
+ hHooks[0] = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded);
+ hHooks[1] = HookEvent(ME_OPT_INITIALISE, HSOptInitialise);
+
+ InitIcons();
+
+ return 0;
+}
+
+int __declspec(dllexport) Unload(void)
+{
+ int i;
+
+ ShutdownAction();
+
+ for (i = 0; i < SIZEOF(hHooks); i++)
+ {
+ if (hHooks[i])
+ UnhookEvent(hHooks[i]);
+ }
+
+ return 0;
+}
diff --git a/plugins/HistorySweeperLight/options.c b/plugins/HistorySweeperLight/options.c
new file mode 100644
index 0000000000..eb32f12b83
--- /dev/null
+++ b/plugins/HistorySweeperLight/options.c
@@ -0,0 +1,356 @@
+/*
+Miranda IM History Sweeper Light plugin
+Copyright (C) 2002-2003 Sergey V. Gershovich
+Copyright (C) 2006-2009 Boris Krasnovskiy
+Copyright (C) 2010, 2011 tico-tico
+
+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 "historysweeperlight.h"
+
+// Time Stamps strings
+const char* time_stamp_strings[] =
+{
+ "Delete older than 1 day",
+ "Delete older than 3 days",
+ "Delete older than 7 days",
+ "Delete older than 2 weeks (14 days)",
+ "Delete older than 1 month (30 days)",
+ "Delete older than 3 months (90 days)",
+ "Delete older than 6 months (180 days)",
+ "Delete older than 1 year (365 days)"
+};
+
+const char* keep_strings[] =
+{
+ "Keep 1 last event",
+ "Keep 2 last events",
+ "Keep 5 last events",
+ "Keep 10 last events",
+ "Keep 20 last events",
+ "Keep 50 last events"
+};
+
+struct
+{
+ char* szDescr;
+ char* szName;
+ int defIconID;
+}
+static const iconList[] =
+{
+ { "Default Action", "actG", IDI_ACTG },
+ { "Action 1", "act1", IDI_ACT1 },
+ { "Action 2", "act2", IDI_ACT2 },
+ { "Delete All", "actDel", IDI_ACTDEL }
+};
+
+static HANDLE hIconLibItem[SIZEOF(iconList)];
+
+void InitIcons(void)
+{
+ int i; char szSettingName[100]; SKINICONDESC sid = {0}; TCHAR szFile[MAX_PATH];
+
+ GetModuleFileName(hInst, szFile, SIZEOF(szFile));
+
+ sid.cbSize = sizeof(SKINICONDESC);
+ sid.ptszDefaultFile = szFile;
+ sid.cx = sid.cy = 16;
+ sid.pszName = szSettingName;
+ sid.pszSection = ModuleName;
+ sid.flags = SIDF_PATH_TCHAR;
+
+ for (i = 0; i < SIZEOF(iconList); i++)
+ {
+ mir_snprintf(szSettingName, SIZEOF(szSettingName), "%s_%s", ModuleName, iconList[i].szName);
+
+ sid.pszDescription = (char*)iconList[i].szDescr;
+ sid.iDefaultIndex = -iconList[i].defIconID;
+ hIconLibItem[i] = (HANDLE)CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid);
+ }
+}
+
+HICON LoadIconEx(const char* name)
+{
+ char szSettingName[100];
+ mir_snprintf(szSettingName, sizeof(szSettingName), "%s_%s", ModuleName, name);
+ return (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)szSettingName);
+}
+
+HANDLE GetIconHandle(const char* name)
+{
+ int i;
+
+ for (i=0; i < SIZEOF(iconList); i++)
+ if (lstrcmpA(iconList[i].szName, name) == 0)
+ return hIconLibItem[i];
+
+ return NULL;
+}
+
+void ReleaseIconEx(const char* name)
+{
+ char szSettingName[100];
+ mir_snprintf(szSettingName, sizeof(szSettingName), "%s_%s", ModuleName, name);
+ CallService(MS_SKIN2_RELEASEICON, 0, (LPARAM)szSettingName);
+}
+
+HANDLE hAllContacts, hSystemHistory;
+
+void ResetListOptions(HWND hwndList)
+{
+ int i;
+
+ SendMessage(hwndList, CLM_SETBKBITMAP, 0, 0);
+ SendMessage(hwndList, CLM_SETBKCOLOR, GetSysColor(COLOR_WINDOW), 0);
+ SendMessage(hwndList, CLM_SETGREYOUTFLAGS, 0, 0);
+ SendMessage(hwndList, CLM_SETLEFTMARGIN, 4, 0);
+ SendMessage(hwndList, CLM_SETINDENT, 10, 0);
+
+ for (i=0; i<=FONTID_MAX; i++)
+ SendMessage(hwndList, CLM_SETTEXTCOLOR, i, GetSysColor(COLOR_WINDOWTEXT));
+}
+
+static void ShowAllContactIcons(HWND hwndList)
+{
+ HANDLE hContact, hItem;
+
+ SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hAllContacts,
+ MAKELPARAM(0, DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0)));
+ SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hSystemHistory,
+ MAKELPARAM(0, DBGetContactSettingByte(NULL, ModuleName, "SweepSHistory", 0)));
+
+ for (hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); hContact;
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0))
+ {
+ hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0);
+ SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem,
+ MAKELPARAM(0, DBGetContactSettingByte(hContact, ModuleName, "SweepHistory", 0)));
+ }
+}//ShowAllContactIcons
+
+void LoadSettings(HWND hwndDlg)
+{
+ int i; CLCINFOITEM cii = {0}; HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST);
+
+ cii.cbSize = sizeof(cii);
+ cii.flags = CLCIIF_GROUPFONT;
+
+ cii.pszText = TranslateT("*** Defaut Action ***");
+ hAllContacts = (HANDLE)SendMessage(hwndList, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
+
+ cii.pszText = TranslateT("*** System History ***");
+ hSystemHistory = (HANDLE)SendMessage(hwndList, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
+
+ ShowAllContactIcons(hwndList);
+
+ SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_RESETCONTENT, 0, 0);
+ SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_RESETCONTENT, 0, 0);
+
+ for (i = 0; i < SIZEOF(time_stamp_strings); i++)
+ {
+ TCHAR* ptszTimeStr = (TCHAR*)CallService(MS_LANGPACK_PCHARTOTCHAR, 0, (LPARAM)time_stamp_strings[i]);
+ SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_ADDSTRING, 0, (LPARAM)ptszTimeStr);
+ mir_free(ptszTimeStr);
+ }
+
+ for (i = 0; i < SIZEOF(keep_strings); i++)
+ {
+ TCHAR* ptszTimeStr = (TCHAR*)CallService(MS_LANGPACK_PCHARTOTCHAR, 0, (LPARAM)keep_strings[i]);
+ SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_ADDSTRING, 0, (LPARAM)ptszTimeStr);
+ mir_free(ptszTimeStr);
+ }
+
+ SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_SETCURSEL, DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0), 0);
+ SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_SETCURSEL, DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0), 0);
+
+ CheckDlgButton(hwndDlg, IDC_UNSAFEMODE, DBGetContactSettingByte(NULL, ModuleName, "UnsafeMode", 0));
+ CheckDlgButton(hwndDlg, IDC_SWEEPONCLOSE, DBGetContactSettingByte(NULL, ModuleName, "SweepOnClose", 0));
+ CheckDlgButton(hwndDlg, IDC_HISTMW, DBGetContactSettingByte(NULL, ModuleName, "ChangeInMW", 0));
+}//LoadSettings
+
+
+void SaveSettings(HWND hwndDlg)
+{
+ int st, i; StatusIconData sid = {0}; HANDLE hContact, hItem; HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST);
+
+ DBWriteContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SSOLDER, CB_GETCURSEL, 0, 0));
+ DBWriteContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", (BYTE)SendDlgItemMessage(hwndDlg, IDC_SSKEEP, CB_GETCURSEL, 0, 0));
+ DBWriteContactSettingByte(NULL, ModuleName, "UnsafeMode", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_UNSAFEMODE));
+ DBWriteContactSettingByte(NULL, ModuleName, "SweepOnClose", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SWEEPONCLOSE));
+ DBWriteContactSettingByte(NULL, ModuleName, "ChangeInMW", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_HISTMW));
+
+ sid.cbSize = sizeof(sid);
+ sid.szModule = ModuleName;
+
+ DBWriteContactSettingByte(NULL, ModuleName, "SweepHistory",
+ (BYTE)SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hAllContacts, 0));
+ DBWriteContactSettingByte(NULL, ModuleName, "SweepSHistory",
+ (BYTE)SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hSystemHistory, 0));
+
+ for (hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); hContact;
+ hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0))
+ {
+ hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0);
+
+ st = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, 0);
+ if ( st != 0 ) DBWriteContactSettingByte(hContact, ModuleName, "SweepHistory", (BYTE)st);
+ else DBDeleteContactSetting(hContact, ModuleName, "SweepHistory");
+
+ // set per-contact icons in status bar
+ for(i = 0; i < 4; i++)
+ {
+ sid.dwId = i;
+ sid.flags = (st == i) ? 0 : MBF_HIDDEN;
+ CallService(MS_MSG_MODIFYICON, (WPARAM)hContact, (LPARAM)&sid);
+ }
+ }
+
+ // set tooltips
+ st = DBGetContactSettingByte(NULL, ModuleName, "SweepHistory", 0);
+
+ sid.dwId = 0;
+ if (st == 0) sid.szTooltip = Translate("Keep all events");
+ else if (st == 1) sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]);
+ else if (st == 2) sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]);
+ else if (st == 3) sid.szTooltip = Translate("Delete all events");
+ CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid);
+
+ sid.dwId = 1;
+ sid.szTooltip = Translate(time_stamp_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownOlder", 0)]);
+ CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid);
+
+ sid.dwId = 2;
+ sid.szTooltip = Translate(keep_strings[DBGetContactSettingByte(NULL, ModuleName, "StartupShutdownKeep", 0)]);
+ CallService(MS_MSG_MODIFYICON, 0, (LPARAM)&sid);
+}//SaveSettings
+
+INT_PTR CALLBACK DlgProcHSOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ HIMAGELIST hIml = ImageList_Create( GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
+ ILC_MASK | (IsWinVerXPPlus() ? ILC_COLOR32 : ILC_COLOR16 ), 2, 2 );
+
+ HICON hIcon = LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT);
+ ImageList_AddIcon(hIml, hIcon);
+ CallService(MS_SKIN2_RELEASEICON, (WPARAM)hIcon, 0);
+
+ hIcon = LoadIconEx("act1");
+ ImageList_AddIcon(hIml, hIcon);
+ SendDlgItemMessage(hwndDlg, IDC_ACT1, STM_SETICON, (WPARAM)hIcon, 0);
+
+ hIcon = LoadIconEx("act2");
+ ImageList_AddIcon(hIml, hIcon);
+ SendDlgItemMessage(hwndDlg, IDC_ACT2, STM_SETICON, (WPARAM)hIcon, 0);
+
+ hIcon = LoadIconEx("actDel");
+ ImageList_AddIcon(hIml, hIcon);
+
+ SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml);
+ SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRACOLUMNS, 1, 0);
+
+ TranslateDialogDefault(hwndDlg);
+ ResetListOptions(GetDlgItem(hwndDlg, IDC_LIST));
+ LoadSettings(hwndDlg);
+ }
+ return TRUE;
+
+ case WM_DESTROY:
+ {
+ HIMAGELIST hIml = (HIMAGELIST)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGELIST, 0, 0);
+ ImageList_Destroy(hIml);
+ ReleaseIconEx("act1");
+ ReleaseIconEx("act2");
+ ReleaseIconEx("actDel");
+ }
+ break;
+
+ case WM_COMMAND:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); // Send message to activate "Apply" button
+ return TRUE;
+
+ case WM_NOTIFY:
+ {
+ NMCLISTCONTROL* nmc = (NMCLISTCONTROL*)lParam;
+ if ( nmc->hdr.idFrom == 0 && nmc->hdr.code == (unsigned)PSN_APPLY )
+ {
+ SaveSettings(hwndDlg);
+ }
+ else if (nmc->hdr.idFrom == IDC_LIST)
+ {
+ switch (nmc->hdr.code)
+ {
+ case CLN_NEWCONTACT:
+ case CLN_LISTREBUILT:
+ ShowAllContactIcons(nmc->hdr.hwndFrom);
+ break;
+
+ case CLN_OPTIONSCHANGED:
+ ResetListOptions(nmc->hdr.hwndFrom);
+ break;
+
+ case NM_CLICK:
+ {
+ HANDLE hItem; DWORD hitFlags; int iImage;
+
+ if ( nmc->iColumn == -1 )
+ break;
+
+ // Find clicked item
+ hItem = (HANDLE)SendMessage(nmc->hdr.hwndFrom, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nmc->pt.x,nmc->pt.y));
+ // Nothing was clicked
+ if (hItem == NULL || !(IsHContactContact(hItem) || IsHContactInfo(hItem)))
+ break;
+
+ // It was not our extended icon
+ if (!(hitFlags & CLCHT_ONITEMEXTRA))
+ break;
+
+ iImage = SendMessage(nmc->hdr.hwndFrom, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, 0));
+ SendMessage(nmc->hdr.hwndFrom, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nmc->iColumn, (iImage + 1) % 4));
+
+ // Activate Apply button
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ break;
+ }
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
+
+int HSOptInitialise(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp = {0};
+
+ odp.cbSize = sizeof(odp);
+ odp.position = 0;
+ odp.hInstance = hInst;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_HISTORYSWEEPER);
+ odp.ptszTitle = _T(ModuleName);
+ odp.ptszGroup = _T("History");
+ odp.pfnDlgProc = DlgProcHSOpts;
+ odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR;
+
+ CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp);
+
+ return 0;
+}
diff --git a/plugins/HistorySweeperLight/resource.h b/plugins/HistorySweeperLight/resource.h
new file mode 100644
index 0000000000..bfa91d1d4e
--- /dev/null
+++ b/plugins/HistorySweeperLight/resource.h
@@ -0,0 +1,18 @@
+#ifndef IDC_STATIC
+#define IDC_STATIC (-1)
+#endif
+
+#define IDD_OPT_HISTORYSWEEPER 101
+#define IDI_ACTG 102
+#define IDI_ACT1 103
+#define IDI_ACT2 104
+#define IDI_ACTDEL 105
+#define IDC_LIST 106
+#define IDC_SSOLDER 107
+#define IDC_UNSAFEMODE 108
+#define IDC_SWEEPONCLOSE 109
+#define IDC_SSKEEP 110
+#define IDC_HISTMW 111
+#define IDC_ACT1 112
+#define IDC_ACT2 113
+
diff --git a/plugins/HistorySweeperLight/version.h b/plugins/HistorySweeperLight/version.h
new file mode 100644
index 0000000000..245200a539
--- /dev/null
+++ b/plugins/HistorySweeperLight/version.h
@@ -0,0 +1,23 @@
+/*
+Plugin of Miranda IM for communicating with users of the MSN Messenger protocol.
+Copyright (c) 2008-2009 Boris Krasnovskiy.
+Copyright (C) 2010, 2011 tico-tico
+
+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, see <http://www.gnu.org/licenses/>.
+*/
+
+#define __FILEVERSION_STRING 0,0,0,7
+#define __VERSION_STRING "0.0.0.7"
+#define __VERSION_DWORD PLUGIN_MAKE_VERSION(0, 0, 0, 7)
+