diff options
Diffstat (limited to 'plugins/Db_autobackups/main.c')
-rw-r--r-- | plugins/Db_autobackups/main.c | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/plugins/Db_autobackups/main.c b/plugins/Db_autobackups/main.c new file mode 100644 index 0000000000..7390bd9dc7 --- /dev/null +++ b/plugins/Db_autobackups/main.c @@ -0,0 +1,262 @@ +#include "headers.h"
+#include "version.h"
+#include "m_trigger.h"
+
+struct MM_INTERFACE mmi;
+HINSTANCE hInst;
+PLUGINLINK *pluginLink;
+int hLangpack;
+
+HANDLE hFolder;
+HANDLE hHooks[4];
+HANDLE hServices[3];
+
+PLUGININFOEX pluginInfo={
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME,
+ __VERSION_DWORD,
+ __PLUGIN_DESC,
+ "chaos.persei, sje, Kildor, Billy_Bons",
+ "chaos.persei@gmail.com",
+ __COPYRIGHTS,
+ "http://mods.mirandaim.ru/",
+ UNICODE_AWARE,
+ 0, //doesn't replace anything built-in
+ // Generate your own unique id for your plugin.
+ // Do not use this UUID!
+ // Use uuidgen.exe to generate the uuuid
+ // {81C220A6-0226-4ad6-BFCA-217B17A16053}
+ { 0x81c220a6, 0x226, 0x4ad6, { 0xbf, 0xca, 0x21, 0x7b, 0x17, 0xa1, 0x60, 0x53 } }
+};
+
+#define MIID_DB_AUTOBACKUPS { 0x81c220a6, 0x226, 0x4ad6, { 0xbf, 0xca, 0x21, 0x7b, 0x17, 0xa1, 0x60, 0x53 } }
+
+struct
+{
+ TCHAR* szDescr;
+ char* szName;
+ int defIconID;
+}
+static const iconList[] = {
+ { _T("Backup Profile"), "backup", IDI_ICON1 },
+ { _T("Save Profile As..."), "saveas", IDI_ICON1 }
+};
+
+INT_PTR BackupServiceTrgr(WPARAM wParam, LPARAM lParam)
+{
+ if(wParam & ACT_PERFORM) {
+ return Backup(NULL);
+ }
+ return 0;
+}
+
+static int FoldersGetBackupPath(WPARAM wParam, LPARAM lParam)
+{
+ FoldersGetCustomPathT(hFolder, options.folder, MAX_PATH, DIR SUB_DIR);
+ return 0;
+}
+
+static int FoldersInit(void)
+{
+ hFolder = (HANDLE) FoldersRegisterCustomPathT("Database Backups", "Backup Folder", DIR SUB_DIR);
+ hHooks[0] = HookEvent(ME_FOLDERS_PATH_CHANGED, FoldersGetBackupPath);
+ FoldersGetBackupPath(0, 0);
+ return 0;
+}
+
+static void IcoLibInit(void)
+{
+ int i;
+ SKINICONDESC sid = {0};
+ TCHAR tszFile[MAX_PATH];
+ GetModuleFileName(hInst, tszFile, MAX_PATH);
+
+ sid.cbSize = sizeof(SKINICONDESC);
+ sid.ptszDefaultFile = tszFile;
+ sid.ptszSection = _T("Database/Database Backups");
+ sid.flags = SIDF_ALL_TCHAR;
+
+ for ( i = 0; i < SIZEOF(iconList); i++ ) {
+ sid.pszName = iconList[i].szName;
+ sid.ptszDescription = iconList[i].szDescr;
+ sid.iDefaultIndex = -iconList[i].defIconID;
+ CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid);
+ }
+}
+
+static void MenuInit(void)
+{
+ CLISTMENUITEM menu = {0};
+ menu.cbSize = sizeof(menu);
+ menu.flags = CMIF_TCHAR;
+ menu.hIcon=(HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"backup");
+ menu.ptszPopupName = LPGENT("Database");
+
+ menu.ptszName = LPGENT("Backup Profile");
+ menu.pszService = MS_AB_BACKUP;
+ menu.position = 500100000;
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&menu);
+
+ menu.hIcon=(HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"saveas");
+ menu.ptszName = LPGENT("Save Profile As...");
+ menu.pszService = MS_AB_SAVEAS;
+ menu.position = 500100001;
+ CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&menu);
+}
+
+static void TriggerActionInit(void)
+{
+ ACTIONREGISTER ar = {0};
+ ar.cbSize = sizeof(ACTIONREGISTER);
+ ar.pszName = "Backup Database";
+ ar.pszService = MS_AB_BACKUPTRGR;
+
+ CallService(MS_TRIGGER_REGISTERACTION, 0, (LPARAM)&ar);
+}
+
+static int ModulesLoad(WPARAM wParam, LPARAM lParam)
+{
+ profilePath = Utils_ReplaceVarsT(_T("%miranda_userdata%"));
+
+ IcoLibInit();
+ if(ServiceExists(MS_FOLDERS_REGISTER_PATH))
+ FoldersInit();
+ LoadOptions();
+ MenuInit();
+
+ // register trigger action for triggerplugin
+ if(ServiceExists(MS_TRIGGER_REGISTERACTION))
+ TriggerActionInit();
+
+ hHooks[1] = HookEvent(ME_OPT_INITIALISE, OptionsInit);
+ if(options.backup_types & BT_START)
+ Backup(NULL);
+ return 0;
+}
+
+// can't do this on unload, since other plugins will be have already been unloaded, but their hooks
+// for setting changed event not cleared. the backup on exit function will write to the db, calling those hooks.
+int PreShutdown(WPARAM wParam, LPARAM lParam) {
+ if(options.backup_types & BT_EXIT)
+ {
+ options.disable_popups = 1; // Don't try to show popups on exit
+ Backup(NULL);
+ }
+ return 0;
+}
+
+void SysInit()
+{
+ mir_getMMI( &mmi );
+ mir_getLP( &pluginInfo );
+ OleInitialize(0);
+
+ hServices[0] = CreateServiceFunction(MS_AB_BACKUP, ABService);
+ hServices[1] = CreateServiceFunction(MS_AB_BACKUPTRGR, BackupServiceTrgr);
+ hServices[2] = CreateServiceFunction(MS_AB_SAVEAS, DBSaveAs);
+
+ hHooks[2] = HookEvent(ME_SYSTEM_PRESHUTDOWN, PreShutdown);
+ hHooks[3] = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoad);
+}
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hInst=hinstDLL;
+ return TRUE;
+}
+
+__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ if ( mirandaVersion < PLUGIN_MAKE_VERSION(0,8,1,0)) {
+ MessageBox( NULL, _T("The ") _T(__PLUGIN_NAME_BASE) _T(" plugin cannot be loaded. It requires Miranda IM 0.8.1 or later."), _T(__PLUGIN_NAME_BASE), MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_TOPMOST );
+ return NULL;
+ }
+ return &pluginInfo;
+}
+
+static const MUUID interfaces[] = {MIID_DB_AUTOBACKUPS, MIID_LAST};
+__declspec(dllexport) const MUUID* MirandaPluginInterfaces(void)
+{
+ return interfaces;
+}
+
+int __declspec(dllexport) Load(PLUGINLINK *link)
+{
+ pluginLink=link;
+ SysInit();
+ return 0;
+}
+
+int __declspec(dllexport) Unload(void)
+{
+ int i;
+
+ OleUninitialize();
+
+ for (i=0; i<SIZEOF(hHooks); ++i)
+ {
+ if (hHooks[i])
+ UnhookEvent(hHooks[i]);
+ }
+ for (i=0; i<SIZEOF(hServices); ++i)
+ {
+ if (hServices[i])
+ DestroyServiceFunction(hServices[i]);
+ }
+
+ return 0;
+}
+
+void ShowPopup(TCHAR* text, TCHAR* header)
+{
+ POPUPDATAT ppd = {0};
+
+ lstrcpy(ppd.lptzText, text);
+ lstrcpy(ppd.lptzContactName, header);
+ ppd.lchIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)"backup");
+
+ PUAddPopUpT(&ppd);
+}
+
+int CreateDirectoryTree(TCHAR *szDir)
+{
+ TCHAR *pszLastBackslash, szTestDir[ MAX_PATH ];
+
+ lstrcpyn( szTestDir, szDir, SIZEOF( szTestDir ));
+ pszLastBackslash = _tcsrchr( szTestDir, '\\' );
+ if ( pszLastBackslash == NULL )
+ return 0;
+
+ *pszLastBackslash = '\0';
+ CreateDirectoryTree( szTestDir );
+ *pszLastBackslash = '\\';
+ return ( CreateDirectory( szTestDir, NULL ) == 0 ) ? GetLastError() : 0;
+}
+
+HWND CreateToolTip(HWND hwndParent, LPTSTR ptszText, LPTSTR ptszTitle)
+{
+ TOOLINFO ti = { 0 };
+ HWND hwndTT;
+ hwndTT = CreateWindowEx(WS_EX_TOPMOST,
+ TOOLTIPS_CLASS, NULL,
+ WS_POPUP | TTS_NOPREFIX,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ hwndParent, NULL, hInst, NULL);
+
+ SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+
+ ti.cbSize = sizeof(TOOLINFO);
+ ti.uFlags = TTF_SUBCLASS | TTF_CENTERTIP;
+ ti.hwnd = hwndParent;
+ ti.hinst = hInst;
+ ti.lpszText = ptszText;
+ GetClientRect (hwndParent, &ti.rect);
+ ti.rect.left -= 80;
+
+ SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
+ SendMessage(hwndTT, TTM_SETTITLE, 1, (LPARAM)ptszTitle);
+ SendMessage(hwndTT, TTM_SETMAXTIPWIDTH, 0, (LPARAM)700);
+ return hwndTT;
+}
|