summaryrefslogtreecommitdiff
path: root/Plugins/notification_log/notification_log.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Plugins/notification_log/notification_log.cpp')
-rw-r--r--Plugins/notification_log/notification_log.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/Plugins/notification_log/notification_log.cpp b/Plugins/notification_log/notification_log.cpp
new file mode 100644
index 0000000..b6e2ab0
--- /dev/null
+++ b/Plugins/notification_log/notification_log.cpp
@@ -0,0 +1,203 @@
+/*
+Copyright (C) 2005 Ricardo Pescuma Domenecci
+Based on work by tweety, nullbyte
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+
+#include "notification_log.h"
+
+
+#define FOLDER_LOGSW PROFILE_PATHW L"\\" CURRENT_PROFILEW L"\\logs"
+
+#ifdef _UNICODE
+# define FOLDER_LOGST FOLDER_LOGSW
+#else
+# define FOLDER_LOGST FOLDER_LOGS
+#endif
+
+
+// Prototypes /////////////////////////////////////////////////////////////////////////////////////
+
+
+
+HINSTANCE hInst;
+PLUGINLINK *pluginLink;
+MNOTIFYLINK *notifyLink;
+
+PLUGININFO pluginInfo = {
+ sizeof(PLUGININFO),
+ "Log Notification",
+ PLUGIN_MAKE_VERSION(0,0,0,1),
+ "Notification type that log to a file",
+ "Ricardo Pescuma Domenecci",
+ "",
+ "© 2006 Ricardo Pescuma Domenecci",
+ "http://www.miranda-im.org/",
+ 0, //not transient
+ 0 //doesn't replace anything built-in
+};
+
+
+HANDLE hhkNotificationShow = NULL;
+HANDLE hhkModulesLoaded = NULL;
+HANDLE hLogFolder = 0;
+TCHAR szLogPath[MAX_PATH]; // database profile path (read at startup only)
+
+
+int ModulesLoaded(WPARAM wParam,LPARAM lParam);
+void LoadNotifyImp();
+void UnloadNotifyImp();
+
+int LogShow(WPARAM wParam, LPARAM lParam);
+
+
+
+// Functions //////////////////////////////////////////////////////////////////////////////////////
+
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hInst = hinstDLL;
+ return TRUE;
+}
+
+
+__declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion)
+{
+ return &pluginInfo;
+}
+
+
+int __declspec(dllexport) Load(PLUGINLINK *link)
+{
+ // Copy data
+ pluginLink = link;
+
+ init_mir_malloc();
+
+ hhkModulesLoaded = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded);
+
+ return 0;
+}
+
+
+int __declspec(dllexport) Unload(void)
+{
+ UnloadNotifyImp();
+ UnhookEvent(hhkModulesLoaded);
+ return 0;
+}
+
+
+int ModulesLoaded(WPARAM wParam,LPARAM lParam)
+{
+ MNotifyGetLink();
+ LoadNotifyImp();
+ InitOptions();
+
+ // Folders plugin support
+ if (ServiceExists(MS_FOLDERS_REGISTER_PATH))
+ {
+ hLogFolder = (HANDLE) FoldersRegisterCustomPathT("Logs", "Logs Path", FOLDER_LOGST);
+ }
+ else
+ {
+ char path[MAX_PATH];
+ CallService(MS_DB_GETPROFILEPATH, MAX_PATH, (LPARAM)path);
+
+#ifdef _UNICODE
+ mir_sntprintf(szLogPath, sizeof(szLogPath), L"%S\\Logs", path);
+#else
+ mir_sntprintf(szLogPath, sizeof(szLogPath), "%s\\Logs", path);
+#endif
+ }
+
+
+ return 0;
+}
+
+
+
+void LoadNotifyImp()
+{
+ hhkNotificationShow = HookEvent(ME_NOTIFY_SHOW, LogShow);
+
+ CreateServiceFunction(MS_LOG_SHOW, LogShow);
+}
+
+
+void UnloadNotifyImp()
+{
+ UnhookEvent(hhkNotificationShow);
+}
+
+
+int LogShow(WPARAM wParam, LPARAM lParam)
+{
+ HANDLE hNotify = (HANDLE)lParam;
+
+ if (!MNotifyGetByte(hNotify, NFOPT_LOG_ENABLED, 0))
+ return 0;
+
+ TCHAR defFile[1024];
+ mir_sntprintf(defFile, MAX_REGS(defFile), _T("%s_log.txt"),
+ MNotifyGetTString(hNotify, NFOPT_TYPENAME, _T("notifications")));
+ const TCHAR *filename = MNotifyGetTString(hNotify, NFOPT_LOG_FILENAMET, defFile);
+
+ if (filename == NULL)
+ return 0;
+
+ TCHAR defLine[1024];
+ mir_sntprintf(defLine, MAX_REGS(defLine), _T("%s: %s"),
+ MNotifyGetTTemplate(hNotify, NFOPT_DEFTEMPL_TITLET, _T("%title%")),
+ MNotifyGetTTemplate(hNotify, NFOPT_DEFTEMPL_TEXTT, _T("%text%")));
+
+ // Get text
+ TCHAR *log_text = MNotifyGetTParsedTemplate(hNotify, NFOPT_LOG_TEMPLATE_LINET, defLine);
+
+ if (log_text != NULL)
+ {
+ TCHAR fullFilename[2048];
+
+ if (_tcschr(filename, ':') == NULL)
+ {
+ TCHAR path[MAX_PATH];
+ FoldersGetCustomPathT(hLogFolder, path, MAX_PATH, szLogPath);
+ mir_sntprintf(fullFilename, MAX_REGS(fullFilename), _T("%s\\%s"), path, filename);
+ }
+ else
+ {
+ lstrcpyn(fullFilename, filename, MAX_REGS(fullFilename));
+ }
+
+ unsigned long dwBytesWritten = 0;
+ HANDLE hFile = CreateFile(fullFilename, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ if (hFile != NULL)
+ {
+ SetFilePointer(hFile, 0, 0, FILE_END);
+ WriteFile(hFile, log_text, lstrlen(log_text) * sizeof(TCHAR), &dwBytesWritten, NULL);
+ WriteFile(hFile, _T("\r\n"), 2 * sizeof(TCHAR), &dwBytesWritten, NULL);
+ CloseHandle(hFile);
+ }
+
+ mir_free(log_text);
+ }
+
+ return 0;
+}