summaryrefslogtreecommitdiff
path: root/plugins/Alarms/alarms.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Alarms/alarms.cpp')
-rw-r--r--plugins/Alarms/alarms.cpp339
1 files changed, 339 insertions, 0 deletions
diff --git a/plugins/Alarms/alarms.cpp b/plugins/Alarms/alarms.cpp
new file mode 100644
index 0000000000..d95979ef74
--- /dev/null
+++ b/plugins/Alarms/alarms.cpp
@@ -0,0 +1,339 @@
+/*
+Miranda plugin template, originally by Richard Hughes
+http://miranda-icq.sourceforge.net/
+
+This file is placed in the public domain. Anybody is free to use or
+modify it as they wish with no restriction.
+There is no warranty.
+*/
+
+#include "common.h"
+#include "alarms.h"
+
+struct MM_INTERFACE mmi;
+
+#define SERVICENAME "mp"
+#define COMMANDPREFIX "/" SERVICENAME
+
+#define WMP_PAUSE 32808
+#define WMP_NEXT 0x497B
+
+char szGamePrefix[] = COMMANDPREFIX;
+
+HINSTANCE hInst;
+PLUGINLINK *pluginLink;
+int hLangpack;
+
+HANDLE hTopToolbarButton;
+
+typedef LRESULT (CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM);
+
+//bool right_window = false;
+WNDPROC old_clist_wndproc;
+
+PLUGININFOEX pluginInfo={
+ sizeof(PLUGININFOEX),
+ "Alarms",
+ PLUGIN_MAKE_VERSION(0,4,0,5),
+ "Set once-off, daily, weekly and weekday alarms.",
+ "Scott Ellis",
+ "mail@scottellis.com.au",
+ "© 2005 Scott Ellis",
+ "http://www.scottellis.com.au",
+ 0, //not transient
+ 0, //doesn't replace anything built-in
+ { 0x4dd7762b, 0xd612, 0x4f84, { 0xaa, 0x86, 0x6, 0x8f, 0x17, 0x85, 0x9b, 0x6d } } // {4DD7762B-D612-4f84-AA86-068F17859B6D}
+};
+
+extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hInst=hinstDLL;
+ return TRUE;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfo;
+}
+
+extern "C" __declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion)
+{
+ pluginInfo.cbSize = sizeof(PLUGININFO);
+ return (PLUGININFO*)&pluginInfo;
+}
+
+static const MUUID interfaces[] = {MIID_ALARMS, MIID_LAST};
+extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void)
+{
+ return interfaces;
+}
+
+
+
+static int CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch(message) {
+ case WM_COMMAND:
+ if (HIWORD(wParam) == STN_CLICKED) { //It was a click on the Popup.
+ PUDeletePopUp(hWnd);
+ return TRUE;
+ }
+ break;
+ case UM_FREEPLUGINDATA: {
+ //MY_PLUGIN_DATA * mpd = NULL;
+ //mpd = (MY_PLUGIN_DATA*)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd,(LPARAM)mpd);
+ //if (mdp > 0) free(mpd);
+ return TRUE; //TRUE or FALSE is the same, it gets ignored.
+ }
+ default:
+ break;
+ }
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
+void ShowPopup(HANDLE hContact, const char *msg) {
+ if(ServiceExists(MS_POPUP_ADDPOPUP)) {
+ POPUPDATAEX ppd;
+ char *lpzContactName;
+
+ ZeroMemory(&ppd, sizeof(ppd)); //This is always a good thing to do.
+ ppd.lchContact = hContact; //Be sure to use a GOOD handle, since this will not be checked.
+ ppd.lchIcon = LoadSkinnedIcon(SKINICON_EVENT_MESSAGE);
+
+ lpzContactName = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME,(WPARAM)hContact,0);
+
+ lstrcpy(ppd.lpzContactName, lpzContactName);
+ lstrcpy(ppd.lpzText, msg);
+ ppd.colorBack = GetSysColor(COLOR_BTNFACE);;
+ ppd.colorText = RGB(0,0,0);
+ ppd.PluginWindowProc = (WNDPROC)PopupDlgProc;
+ ppd.PluginData = 0;
+ ppd.iSeconds = 3;
+
+ //Now that every field has been filled, we want to see the popup.
+ CallService(MS_POPUP_ADDPOPUPEX, (WPARAM)&ppd, 0);
+ }
+}
+
+static int PluginSendMessage(WPARAM wParam,LPARAM lParam) {
+ CCSDATA css;
+ css.hContact = (HANDLE)wParam;
+ css.szProtoService = PSS_MESSAGE;
+ css.wParam = 0;
+ css.lParam = lParam;
+
+ CallService(MS_PROTO_CALLCONTACTSERVICE, 0, (LPARAM)&css);
+ return 0;
+}
+
+static int PluginMessageReceived(WPARAM wParam,LPARAM lParam)
+{
+ CCSDATA *pccsd = (CCSDATA *)lParam;
+ PROTORECVEVENT *ppre = ( PROTORECVEVENT * )pccsd->lParam;
+ char *savedMsg;
+ HWND hWnd;
+ char response[256];
+
+ char msg[1024], buff[1024];
+
+ if(strncmp(ppre->szMessage, szGamePrefix, strlen(szGamePrefix)))
+ return CallService( MS_PROTO_CHAINRECV, wParam, lParam );
+
+ strcpy(msg, ppre->szMessage + strlen(szGamePrefix));
+
+ savedMsg = ppre->szMessage;
+
+ if(!strcmp(msg, " ffw")) {
+ sprintf(buff, "Fast forward!");
+
+ hWnd = FindWindow(0, "Windows Media Player");
+ PostMessage(hWnd, WM_COMMAND, WMP_NEXT, 0);
+ } else {
+ sprintf(buff, "Unknown command issued: \"%s\"", msg);
+ }
+
+ /*
+ ppre->szMessage = (char *)Translate(buff);
+ retval = CallService( MS_PROTO_CHAINRECV, wParam, lParam );
+ ppre->szMessage = savedMsg;
+ */
+
+ ShowPopup(pccsd->hContact, buff);
+
+ strcpy(response, buff);
+ PluginSendMessage((WPARAM)pccsd->hContact, (LPARAM)response);
+
+ return 0;
+}
+
+HBITMAP LoadBmpFromIcon(int IdRes)
+{
+ HBITMAP hBmp, hoBmp;
+ HDC hdc, hdcMem;
+ HBRUSH hBkgBrush;
+ HICON hIcon;
+
+ hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IdRes));
+
+ RECT rc;
+ BITMAPINFOHEADER bih = {0};
+ int widthBytes;
+
+ hBkgBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+ bih.biSize = sizeof(bih);
+ bih.biBitCount = 24;
+ bih.biPlanes = 1;
+ bih.biCompression = BI_RGB;
+ bih.biHeight = 16;
+ bih.biWidth = 20;
+ widthBytes = ((bih.biWidth*bih.biBitCount + 31) >> 5) * 4;
+ rc.top = rc.left = 0;
+ rc.right = bih.biWidth;
+ rc.bottom = bih.biHeight;
+ hdc = GetDC(NULL);
+ hBmp = CreateCompatibleBitmap(hdc, bih.biWidth, bih.biHeight);
+ hdcMem = CreateCompatibleDC(hdc);
+ hoBmp = (HBITMAP)SelectObject(hdcMem, hBmp);
+ FillRect(hdcMem, &rc, hBkgBrush);
+ DrawIconEx(hdcMem, 2, 0, hIcon, 16, 16, 0, NULL, DI_NORMAL);
+
+
+ SelectObject(hdcMem, hoBmp);
+ DeleteDC(hdcMem);
+ ReleaseDC(NULL, hdc);
+ DeleteObject(hBkgBrush);
+
+ DeleteObject(hIcon);
+
+ return hBmp;
+}
+
+static int InitTopToolbarButton(WPARAM wParam, LPARAM lParam) {
+ TTBButton ttb = {0};
+
+ ttb.cbSize = sizeof(ttb);
+ ttb.hbBitmapUp = LoadBmpFromIcon(IDI_TBUP); //LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CLOCK));
+ ttb.hbBitmapDown = LoadBmpFromIcon(IDI_TBDN); //LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CLOCK));
+ ttb.pszServiceDown = MODULE "/NewAlarm";
+ ttb.dwFlags = TTBBF_VISIBLE;// | TTBBF_DRAWBORDER;
+ ttb.name = Translate("Set Alarm");
+
+ hTopToolbarButton = (HANDLE)CallService(MS_TTB_ADDBUTTON, (WPARAM)&ttb, 0);
+ CallService(MS_TTB_SETBUTTONSTATE, (WPARAM)hTopToolbarButton, (LPARAM)TTBST_RELEASED);
+
+ return 0;
+}
+
+static int MainInit(WPARAM wparam,LPARAM lparam) {
+ if(ServiceExists(MS_UPDATE_REGISTER)) {
+ // register with updater
+ Update update = {0};
+ char szVersion[16];
+
+ update.cbSize = sizeof(Update);
+
+ update.szComponentName = pluginInfo.shortName;
+ update.pbVersion = (BYTE *)CreateVersionString(pluginInfo.version, szVersion);
+ update.cpbVersion = strlen((char *)update.pbVersion);
+
+ update.szUpdateURL = UPDATER_AUTOREGISTER;
+
+ // these are the three lines that matter - the archive, the page containing the version string, and the text (or data)
+ // before the version that we use to locate it on the page
+ // (note that if the update URL and the version URL point to standard file listing entries, the backend xml
+ // data will be used to check for updates rather than the actual web page - this is not true for beta urls)
+ update.szBetaUpdateURL = "http://www.scottellis.com.au/miranda_plugins/alarms.zip";
+ update.szBetaVersionURL = "http://www.scottellis.com.au/miranda_plugins/ver_alarms.html";
+ update.pbBetaVersionPrefix = (BYTE *)" version ";
+
+ update.cpbBetaVersionPrefix = strlen((char *)update.pbBetaVersionPrefix);
+
+ CallService(MS_UPDATE_REGISTER, 0, (WPARAM)&update);
+ }
+
+ /*
+ PROTOCOLDESCRIPTOR pd;
+ HANDLE hContact;
+
+ memset( &pd, 0, sizeof( PROTOCOLDESCRIPTOR ));
+ pd.cbSize = sizeof( PROTOCOLDESCRIPTOR );
+ pd.szName = SERVICENAME;
+ //pd.type = PROTOTYPE_ENCRYPTION - 9;
+ pd.type = PROTOTYPE_FILTER;
+ CallService( MS_PROTO_REGISTERMODULE, 0, ( LPARAM ) &pd );
+
+ CreateServiceFunction( SERVICENAME PSR_MESSAGE, PluginMessageReceived );
+
+ hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 );
+
+ while( hContact )
+ {
+ if( !CallService( MS_PROTO_ISPROTOONCONTACT, ( WPARAM )hContact, ( LPARAM )SERVICENAME ))
+ CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hContact, ( LPARAM )SERVICENAME );
+
+ hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM )hContact, 0 );
+ }
+ */
+
+ // initialize icons
+ InitIcons();
+
+ // Hotkey
+ /*
+ SKINHOTKEYDESCEX hk;
+ hk.cbSize = sizeof(hk);
+ hk.pszName = Translate("Set Alarm");
+ hk.pszDescription = Translate("Set a new alarm");
+ hk.pszSection = Translate("Alarms");
+ hk.pszService = MODULE "/NewAlarm";
+ hk.DefHotKey = (WORD)'A' + HOTKEYF_ALT * 256;
+ CallService(MS_SKIN_ADDHOTKEY, 0, (LPARAM)&hk);
+ */
+
+ // TopToolbar support
+ HookEvent(ME_TTB_MODULELOADED, InitTopToolbarButton);
+
+ InitFrames();
+
+ // TriggerPlugin support
+ LoadTriggerSupport();
+
+ return 0;
+}
+
+static int MainDeInit(WPARAM wParam, LPARAM lParam) {
+ DeinitFrames();
+ DeinitList();
+ DeinitIcons();
+ return 0;
+}
+
+extern "C" int __declspec(dllexport) Load(PLUGINLINK *link)
+{
+ pluginLink = link;
+
+ mir_getLP(&pluginInfo);
+ mir_getMMI(&mmi);
+
+ // ensure datetime picker is loaded
+ INITCOMMONCONTROLSEX ccx;
+ ccx.dwSize = sizeof(ccx);
+ ccx.dwICC = ICC_DATE_CLASSES;
+ InitCommonControlsEx(&ccx);
+
+ HookEvent(ME_SYSTEM_MODULESLOADED,MainInit);
+ HookEvent(ME_SYSTEM_PRESHUTDOWN, MainDeInit);
+
+ LoadOptions();
+ InitList();
+
+ HookEvent(ME_OPT_INITIALISE, OptInit );
+
+ return 0;
+}
+
+extern "C" int __declspec(dllexport) Unload(void)
+{
+ return 0;
+}
+