/* 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. Description ----------- This plugin for Miranda-IM doesn't add any functionality on itself. It provides basically three services for retrieving: a) a BSD Fortune message from a random file, b) a BSD Fortune message from a protocol-defined file, and c) a BSD Fortune message from a status-defined file. So, hopefully, the only thing plugin developers will have to do is define three variables like %fortunemsg%, %protofortunemsg% and %statusfortunemsg% and call the corresponding service in this plugin in order to retrieve the fortune msgs. Options ------- Options page Options->Status->Fortune Messages. Thanks ------ - UnregistereD for help, ideas and support in variables plugin - Leecher for encouraging and providing with the necessary tools - Blabla for kindly sending me the sources of the original fortune plugin (from which I took completely the random file selection code) - Harven for discussion and support to this plugin - JDGordon/Targaff for helping with the Endianism thing - Amp from the forums who provided a patched version compatible with latest Variables - simpleaway, ieview, messagesound and skype plugins' authors for part of their code I use in the Options page - Miranda IM developers for this amazing program - all other people from Miranda community */ // System includes #include #include #include #include // Miranda Includes #include #include #include #include #include #include #include "m_variables.h" #include "m_updater.h" // Fortune include #include "fortune.h" #include "m_fortunemsg.h" // Prototypes static int ModulesLoaded(WPARAM, LPARAM); static int GetFortune(WPARAM, LPARAM); static int GetProtoFortune(WPARAM, LPARAM); static int GetStatusFortune(WPARAM, LPARAM); static int FreeAllocatedMemory(WPARAM, LPARAM); static int CalledFromVariables(WPARAM, LPARAM); char *StatusModeToDbSetting(int, const char *); extern int InitOptions(WPARAM, LPARAM); // Program globals HINSTANCE hInst; PLUGINLINK *pluginLink; HANDLE hModulesLoaded, hInitOptions, hGetFortune, hGetProtoFortune, hGetStatusFortune, hFreeAllocatedMemory, hCalledFromVariables; PLUGININFOEX pluginInfo = { sizeof(PLUGININFO), "FortuneAwayMsg", PLUGIN_MAKE_VERSION(0,0,0,10), "Fortune Messages for the AwayMessages", "tioduke", "tioduke@yahoo.ca", "© 2005-2008 TioDuke", "http://addons.miranda-im.org/details.php?action=viewfile&id=1933", 0, 0, {0x9c00ab77, 0x41ce, 0x4e93, {0x9a, 0x83, 0xf9, 0xa8, 0x20, 0x5c, 0xa9, 0x1b}} //{9c00ab77-41ce-4e93-9a83-f9a8205ca91b} }; // DLL Stuff // __declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion) { pluginInfo.cbSize = sizeof(PLUGININFO); return (PLUGININFO*)&pluginInfo; } __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) { pluginInfo.cbSize = sizeof(PLUGININFOEX); return &pluginInfo; } #define MIID_FORTUNEAWAYMSG {0x9c00ab77, 0x41ce, 0x4e93, {0x9a, 0x83, 0xf9, 0xa8, 0x20, 0x5c, 0xa9, 0x1b}} static const MUUID interfaces[] = {MIID_FORTUNEAWAYMSG, MIID_LAST}; __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) { return interfaces; } BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { hInst=hinstDLL; DisableThreadLibraryCalls(hInst); return TRUE; } int __declspec(dllexport) Load(PLUGINLINK *link) { pluginLink=link; hModulesLoaded = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded); return 0; } int __declspec(dllexport) Unload(void) { UnhookEvent(hModulesLoaded); UnhookEvent(hInitOptions); DestroyServiceFunction(hGetFortune); DestroyServiceFunction(hGetProtoFortune); DestroyServiceFunction(hGetStatusFortune); DestroyServiceFunction(hFreeAllocatedMemory); DestroyServiceFunction(hCalledFromVariables); return 0; } // Hooked events static int ModulesLoaded(WPARAM wParam, LPARAM lParam) { hInitOptions = HookEvent(ME_OPT_INITIALISE, InitOptions); hGetFortune = CreateServiceFunction(MS_FORTUNEMSG_GETMESSAGE, GetFortune); hGetProtoFortune = CreateServiceFunction(MS_FORTUNEMSG_GETPROTOMSG, GetProtoFortune); hGetStatusFortune = CreateServiceFunction(MS_FORTUNEMSG_GETSTATUSMSG, GetStatusFortune); hFreeAllocatedMemory = CreateServiceFunction(MS_FORTUNEMSG_FREEMEMORY, FreeAllocatedMemory); hCalledFromVariables = CreateServiceFunction(MS_FORTUNEMSG_FROMVARIABLES, CalledFromVariables); if (ServiceExists(MS_VARS_REGISTERTOKEN)) { TOKENREGISTER vr; ZeroMemory(&vr, sizeof(vr)); vr.cbSize = sizeof(TOKENREGISTER); vr.szTokenString = "fortunemsg"; vr.szService = MS_FORTUNEMSG_FROMVARIABLES; vr.szCleanupService = MS_FORTUNEMSG_FREEMEMORY; vr.szHelpText = "retrieves a random fortune string"; vr.memType = TR_MEM_OWNER; vr.flags = TRF_CLEANUP; CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM)&vr); } if (ServiceExists("DBEditorpp/RegisterSingleModule")) CallService("DBEditorpp/RegisterSingleModule", (WPARAM)MODULE_NAME, 0); if (ServiceExists(MS_UPDATE_REGISTERFL)) CallService(MS_UPDATE_REGISTERFL, (WPARAM)1933, (LPARAM)&pluginInfo); return 0; } // Services static int GetFortune(WPARAM wParam, LPARAM lParam) { char datFilename[MAX_PATH+1], fortuneMsg[FORTUNE_BUFSIZE]; char *returnMsg = (char *)lParam; if (selectRandomFile(datFilename)) DBWriteContactSettingString(NULL, MODULE_NAME, "RandomFile", datFilename); if (!readFortune("RandomFile", fortuneMsg, MAX_FORTUNEMSG)) return 0; if (!returnMsg) if (!(returnMsg = malloc(strlen(fortuneMsg)+1))) return 0; strcpy(returnMsg, fortuneMsg); return (int)returnMsg; } static int GetProtoFortune(WPARAM wParam, LPARAM lParam) { unsigned int maxFortuneMsg; char dbSetting[MAX_PATH+1], fortuneMsg[FORTUNE_BUFSIZE]; char *protoName = (char *)wParam; char *returnMsg = (char *)lParam; if (!protoName) //Harven asked me for this, as sometimes SimpleAway doesn't know which protocol return CallService(MS_FORTUNEMSG_GETMESSAGE, 0, 0); _snprintf(dbSetting, MAX_PATH, "%sLength", protoName); maxFortuneMsg = (unsigned int) DBGetContactSettingWord(NULL, MODULE_NAME, dbSetting, MAX_FORTUNEMSG); if (maxFortuneMsg > MAX_FORTUNEMSG) maxFortuneMsg = MAX_FORTUNEMSG; _snprintf(dbSetting, MAX_PATH, "%sFile", protoName); if (!readFortune(dbSetting, fortuneMsg, maxFortuneMsg)) return 0; if (!returnMsg) if (!(returnMsg = malloc(strlen(fortuneMsg)+1))) return 0; strcpy(returnMsg, fortuneMsg); return (int)returnMsg; } static int GetStatusFortune(WPARAM wParam, LPARAM lParam) { char fortuneMsg[FORTUNE_BUFSIZE]; int status = (int)wParam; char *returnMsg = (char *)lParam; if (status < ID_STATUS_OFFLINE || status > ID_STATUS_OUTTOLUNCH) return 0; if (!readFortune(StatusModeToDbSetting(status, "File"), fortuneMsg, MAX_FORTUNEMSG)) return 0; if (!returnMsg) if (!(returnMsg = malloc(strlen(fortuneMsg)+1))) return 0; strcpy(returnMsg, fortuneMsg); return (int)returnMsg; } static int FreeAllocatedMemory(WPARAM wParam, LPARAM lParam) { void *lPtr = (void *)lParam; if (!lPtr) return -1; free(lPtr); return 0; } static int CalledFromVariables(WPARAM wParam, LPARAM lParam) { return CallService(MS_FORTUNEMSG_GETMESSAGE, 0, 0); } // helpers from awaymsg.c char *StatusModeToDbSetting(int status, const char *suffix) { char *prefix; static char str[MAX_PATH+1]; switch(status) { case ID_STATUS_OFFLINE: prefix="Off"; break; case ID_STATUS_ONLINE: prefix="On"; break; case ID_STATUS_AWAY: prefix="Away"; break; case ID_STATUS_NA: prefix="Na"; break; case ID_STATUS_OCCUPIED: prefix="Occupied"; break; case ID_STATUS_DND: prefix="Dnd"; break; case ID_STATUS_FREECHAT: prefix="FreeChat"; break; case ID_STATUS_INVISIBLE: prefix="Inv"; break; case ID_STATUS_ONTHEPHONE: prefix="Otp"; break; case ID_STATUS_OUTTOLUNCH: prefix="Otl"; break; default: return NULL; } strcpy(str, prefix); strcat(str, suffix); return str; }