summaryrefslogtreecommitdiff
path: root/plugins/SendScreenshotPlus/Main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/SendScreenshotPlus/Main.cpp')
-rw-r--r--plugins/SendScreenshotPlus/Main.cpp406
1 files changed, 406 insertions, 0 deletions
diff --git a/plugins/SendScreenshotPlus/Main.cpp b/plugins/SendScreenshotPlus/Main.cpp
new file mode 100644
index 0000000000..f2a355a524
--- /dev/null
+++ b/plugins/SendScreenshotPlus/Main.cpp
@@ -0,0 +1,406 @@
+/*
+
+Miranda IM: the free IM client for Microsoft* Windows*
+Copyright 2000-2009 Miranda ICQ/IM project,
+
+This file is part of Send Screenshot Plus, a Miranda IM plugin.
+Copyright (c) 2010 Ing.U.Horn
+
+Parts of this file based on original sorce code
+(c) 2004-2006 Srgio Vieira Rolanski (portet from Borland C++)
+
+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.
+
+File name : $HeadURL: http://merlins-miranda.googlecode.com/svn/trunk/miranda/plugins/SendSSPlus/Main.cpp $
+Revision : $Revision: 22 $
+Last change on : $Date: 2010-05-02 21:25:02 +0400 (Вс, 02 май 2010) $
+Last change by : $Author: ing.u.horn $
+
+*/
+
+//---------------------------------------------------------------------------
+#include "main.h"
+
+// Prototypes ///////////////////////////////////////////////////////////////////////////
+MM_INTERFACE mmi;
+UTF8_INTERFACE utfi;
+//LIST_INTERFACE li;
+FI_INTERFACE *FIP = 0;
+HINSTANCE hInst; //!< Global reference to the application
+MGLOBAL myGlobals;
+
+
+PLUGINLINK *pluginLink; //!< Link between Miranda and this plugin
+//Information gathered by Miranda, displayed in the plugin pane of the Option Dialog
+PLUGININFOEX pluginInfo={
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME, // altered here and on file listing, so as not to match original
+ PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
+ __DESC,
+ __AUTHOR,
+ __AUTHOREMAIL,
+ __COPYRIGHT,
+ __AUTHORWEB,
+ UNICODE_AWARE,
+ 0, //doesn't replace anything built-in
+ MIID_PLUGIN
+};
+
+//static char szSendSS[]=SZ_SENDSS;
+
+HANDLE hsvc_SendScreenshot=0;
+HANDLE hsvc_SendDesktop=0;
+HANDLE hsvc_EditBitmap=0;
+HANDLE hsvc_Send2ImageShack=0;
+
+HANDLE hNetlibUser = 0; //!< Netlib Register User
+HANDLE hFolderScreenshot=0;
+
+HANDLE hhook_ModulesLoad=0;
+HANDLE hhook_SystemPShutdown=0;
+
+
+// Functions ////////////////////////////////////////////////////////////////////////////
+
+/*---------------------------------------------------------------------------
+* DLL entry point - Required to store the instance handle
+*/
+extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
+ hInst = hinstDLL;
+ // Freeing some unneeded resources
+ DisableThreadLibraryCalls(GetModuleHandle(_T("sendss.dll")));
+
+ return TRUE;
+}
+
+/*---------------------------------------------------------------------------
+* Called by Miranda to get the information associated to this plugin.
+* It only returns the PLUGININFO structure, without any test on the version
+* @param mirandaVersion The version of the application calling this function
+*/
+extern "C" __declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion) {
+ pluginInfo.cbSize = sizeof(PLUGININFO);
+ return (PLUGININFO*) &pluginInfo;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) {
+ pluginInfo.cbSize = sizeof(PLUGININFOEX);
+ myGlobals.mirandaVersion = mirandaVersion;
+ return &pluginInfo;
+}
+
+static const MUUID interfaces[] = { MIID_PLUGIN, MIID_LAST };
+extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) {
+ return interfaces;
+}
+
+/*---------------------------------------------------------------------------
+* Initializes the services provided and the link to those needed
+* Called when the plugin is loaded into Miranda
+*/
+extern "C" int __declspec(dllexport) Load(PLUGINLINK *link) {
+ pluginLink = link;
+ INT_PTR result = CALLSERVICE_NOTFOUND;
+
+ if(ServiceExists(MS_IMG_GETINTERFACE))
+ result = CallService(MS_IMG_GETINTERFACE, FI_IF_VERSION, (LPARAM)&FIP);
+
+ if(FIP == NULL || result != S_OK) {
+ MessageBoxEx(NULL, TranslateT("Fatal error, image services not found. Send Screenshot will be disabled."), _T("Error"), MB_OK | MB_ICONERROR | MB_APPLMODAL, 0);
+ return 1;
+ }
+
+ mmi.cbSize = sizeof(mmi);
+ mir_getMMI(&mmi);
+ utfi.cbSize = sizeof(utfi);
+ mir_getUTFI(&utfi);
+
+ // load icon library (use UserInfoEx icon Pack)
+ IcoLib_LoadModule();
+
+ hhook_ModulesLoad = HookEvent(ME_SYSTEM_MODULESLOADED, hook_ModulesLoaded);
+ //hhook_options_init = HookEvent(ME_OPT_INITIALISE, hook_options_init);
+ //hhook_OkToExit = HookEvent(ME_SYSTEM_OKTOEXIT, hook_OkToExit);
+ hhook_SystemPShutdown = HookEvent(ME_SYSTEM_PRESHUTDOWN, hook_SystemPShutdown);
+
+ AddMenuItems();
+ RegisterServices();
+
+ return 0;
+}
+
+int hook_ModulesLoaded(WPARAM, LPARAM) {
+
+ myGlobals.PopUpExist = ServiceExists(MS_POPUP_ADDPOPUP);
+ myGlobals.PopUpActionsExist = ServiceExists(MS_POPUP_REGISTERACTIONS);
+ myGlobals.PluginHTTPExist = ServiceExists(MS_HTTP_ACCEPT_CONNECTIONS);
+ myGlobals.PluginFTPExist = ServiceExists(MS_FTPFILE_SHAREFILE);
+// myGlobals.PluginUserinfoEx = ServiceExists(MS_USERINFO_VCARD_EXPORT);
+
+ // Netlib register
+ if (!NetlibInit()){
+ ;
+ }
+
+ // load my button class
+ if(!ServiceExists("UserInfo/vCard/Export")) {
+ CtrlButtonLoadModule();
+ }
+
+ // Folders plugin support
+ if (ServiceExists(MS_FOLDERS_REGISTER_PATH)) {
+ hFolderScreenshot = (HANDLE) FoldersRegisterCustomPathT("SendSS", "Screenshots",
+ _T(PROFILE_PATH)_T("\\")_T(CURRENT_PROFILE)_T("\\Screenshots"));
+ }
+ // updater plugin support
+ if(ServiceExists(MS_UPDATE_REGISTER)) {
+ Update update = {0};
+ char szVersion[16];
+ update.cbSize = sizeof(Update);
+ update.szComponentName = pluginInfo.shortName;
+ update.pbVersion = (BYTE *)CreateVersionStringPluginEx(&pluginInfo, szVersion);
+ update.cpbVersion = (int)strlen((char *)update.pbVersion);
+
+ update.szVersionURL = __FLVersionURL;
+ update.pbVersionPrefix = (BYTE *)__FLVersionPrefix;
+ update.cpbVersionPrefix = (int)strlen((char *)update.pbVersionPrefix);
+ update.szUpdateURL = __FLUpdateURL;
+ // update.szUpdateURL = UPDATER_AUTOREGISTER;
+
+ update.szBetaVersionURL = __BetaVersionURL;
+ // bytes occuring in VersionURL before the version, used to locate the version information within the URL data
+ update.pbBetaVersionPrefix = (BYTE *)__BetaVersionPrefix;
+ update.cpbBetaVersionPrefix = (int)strlen((char *)update.pbBetaVersionPrefix);
+ update.szBetaUpdateURL = __BetaUpdateURL;
+
+ // url for displaying changelog for beta versions
+ update.szBetaChangelogURL = __BetaChangelogURL;
+
+ CallService(MS_UPDATE_REGISTER, 0, (WPARAM)&update);
+ }
+
+ return 0;
+}
+
+/*---------------------------------------------------------------------------
+* Prepare the plugin to stop
+* Called by Miranda when it will exit or when the plugin gets deselected
+*/
+extern "C" int __declspec(dllexport) Unload(void) {
+ UnhookEvent(hhook_SystemPShutdown);
+
+ DestroyServiceFunction(MS_SENDSS_OPENDIALOG);
+ DestroyServiceFunction(MS_SENDSS_EDITBITMAP);
+ DestroyServiceFunction(MS_SENDSS_SENDDESKTOP);
+ DestroyServiceFunction(MS_SENDSS_SEND2IMAGESHACK);
+ return 0;
+}
+
+int hook_SystemPShutdown(WPARAM wParam, LPARAM lParam) {
+ UnhookEvent(hhook_ModulesLoad);
+
+ // Netlib unregister
+ NetlibClose();
+
+ // uninitialize classes
+ CtrlButtonUnloadModule();
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+// Netlib
+HANDLE NetlibInit(void) {
+ NETLIBUSER nlu = {0};
+ nlu.cbSize = sizeof(nlu);
+ nlu.szSettingsModule = (char*)PLUGNAME;
+ nlu.szDescriptiveName = Translate("SendSS HTTP connections");
+ nlu.flags = NUF_OUTGOING|NUF_HTTPCONNS; //|NUF_NOHTTPSOPTION;
+ hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu);
+ return hNetlibUser;
+}
+
+void NetlibClose(void) {
+ Netlib_CloseHandle(hNetlibUser);
+}
+
+
+//---------------------------------------------------------------------------
+// Callback function of service
+// 1. Send a screenshot of the desktop to the selected contact
+// wParam = contact handle
+// lParam = 0
+// 2. Open the capture dialog in take screenshot only mode (it will not be sent)
+// wParam = 0
+// lParam = anything but 0
+INT_PTR service_CaptureAndSendDesktop(WPARAM wParam, LPARAM lParam) {
+ LPTSTR pszPath = NULL;
+ LPSTR pszProto = NULL;
+ bool bChatRoom;
+
+ TfrmMain *frmMain=new TfrmMain();
+ if (!frmMain) {
+ MessageBoxEx(NULL, TranslateT("Could not create main dialog."), TranslateT("Error"), MB_OK | MB_ICONERROR | MB_APPLMODAL, 0);
+ return -1;
+ }
+ pszPath = GetCustomPath();
+
+ pszProto = (LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,wParam,0);
+ bChatRoom = DBGetContactSettingByte((HANDLE)wParam, pszProto, "ChatRoom", 0) != 0;
+ frmMain->m_opt_chkTimed = false;
+ frmMain->m_opt_tabCapture = 1;
+ frmMain->m_opt_cboxDesktop = 0;
+ frmMain->m_opt_chkEditor = false;
+ frmMain->m_opt_cboxSendBy = bChatRoom ? SS_IMAGESHACK:SS_FILESEND;
+ frmMain->Init(pszPath, (HANDLE)wParam); // this method create the window hidden.
+ frmMain->btnCaptureClick(); // this method will call Close()
+ mir_free(pszPath);
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+// Callback function of service for contact menu and main menu
+// wParam = contact handle
+// lParam = 0
+INT_PTR service_OpenCaptureDialog(WPARAM wParam, LPARAM lParam) {
+ LPTSTR pszPath = NULL;
+
+ TfrmMain *frmMain=new TfrmMain();
+ if (!frmMain) {
+ MessageBoxEx(NULL, TranslateT("Could not create main dialog."), TranslateT("Error"), MB_OK | MB_ICONERROR | MB_APPLMODAL, 0);
+ return -1;
+ }
+
+ pszPath = GetCustomPath();
+ frmMain->Init(pszPath, (HANDLE)wParam);
+ mir_free(pszPath);
+ frmMain->Show();
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+// Edit a in-memory bitmap on the edit window
+// wParam = (SENDSSCB) callback function address to call when editing is done
+// lParam = (HBITMAP) bitmap handle, a copy is made so the calling function can free this handle after the service function returns
+// Returns:
+INT_PTR service_EditBitmap(WPARAM wParam, LPARAM lParam) {
+/* TfrmEdit *frmEdit=new TfrmEdit(NULL);
+ if (!frmEdit)
+ return -1;
+
+ Graphics::TBitmap *bitmap=new Graphics::TBitmap();
+ if (!bitmap)
+ return -2;
+
+ bitmap->Handle = (void*)lParam;
+ frmEdit->InitEditor(bitmap); // a copy of the bitmap is made inside this function
+ frmEdit->Show();
+ delete bitmap;
+*/
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+// Callback function of service for sending image to imageshack.us
+// wParam = (char*)filename
+// lParam = (HANDLE)contact (can be null)
+INT_PTR service_Send2ImageShack(WPARAM wParam, LPARAM lParam) {
+ LPSTR result = NULL;
+ CSendImageShack* cSend = new CSendImageShack(NULL, (HANDLE)lParam, false);
+ cSend->m_pszFile = mir_a2t((char*)wParam);
+ cSend->m_bDeleteAfterSend = FALSE;
+ if (lParam != NULL) {
+ cSend->Send();
+ return 0;
+ }
+ cSend->SendSync(TRUE);
+ cSend->Send();
+ if (cSend->GetURL()) {
+ result = mir_strdup(cSend->GetURL());
+ }
+ else {
+ result = cSend->GetError();
+ }
+ delete cSend;
+ return (INT_PTR)result;
+}
+
+//---------------------------------------------------------------------------
+// Add SendSS menu item in contact menu
+void AddMenuItems(void) {
+ CLISTMENUITEM mi={0};
+
+ // Common
+ mi.cbSize = sizeof(mi);
+ // support new genmenu style
+ mi.flags = CMIF_ROOTHANDLE|CMIF_UNICODE;
+ mi.hParentMenu = HGENMENU_ROOT;
+
+ // Add item to contact menu
+ mi.position = 1000000;
+ mi.ptszName = LPGENT("Send Screenshot");
+ mi.hIcon = IcoLib_GetIcon(ICO_PLUG_SSWINDOW2);
+ mi.pszService = MS_SENDSS_OPENDIALOG;
+ CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
+
+ // Add item to contact menu
+ mi.position = 1000001;
+ mi.ptszName = LPGENT("Send desktop screenshot");
+ mi.hIcon = IcoLib_GetIcon(ICO_PLUG_SSWINDOW2);
+ mi.pszService = MS_SENDSS_SENDDESKTOP;
+ CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
+
+ // Add item to main menu
+ mi.position = 1000001;
+ mi.ptszName = LPGENT("Take a screenshot");
+ mi.hIcon = IcoLib_GetIcon(ICO_PLUG_SSWINDOW2);
+ mi.pszService = MS_SENDSS_OPENDIALOG;
+ CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM)&mi);
+}
+
+//---------------------------------------------------------------------------
+// Register Send screenshot services
+int RegisterServices(void) {
+ hsvc_SendScreenshot = CreateServiceFunction(MS_SENDSS_OPENDIALOG, service_OpenCaptureDialog);
+ if (!hsvc_SendScreenshot)
+ MessageBoxEx(NULL, TranslateT("Could not register miranda service."), _T("MS_SENDSS_OPENDIALOG"), MB_OK | MB_ICONERROR | MB_APPLMODAL, 0);
+
+ hsvc_SendDesktop = CreateServiceFunction(MS_SENDSS_SENDDESKTOP, service_CaptureAndSendDesktop);
+ if (!hsvc_SendDesktop)
+ MessageBoxEx(NULL, TranslateT("Could not register miranda service."), _T("MS_SENDSS_SENDDESKTOP"), MB_OK | MB_ICONERROR | MB_APPLMODAL, 0);
+
+ hsvc_EditBitmap = CreateServiceFunction(MS_SENDSS_EDITBITMAP, service_EditBitmap);
+ if (!hsvc_EditBitmap)
+ MessageBoxEx(NULL, TranslateT("Could not register miranda service."), _T("MS_SENDSS_EDITBITMAP"), MB_OK | MB_ICONERROR | MB_APPLMODAL, 0);
+
+ hsvc_Send2ImageShack = CreateServiceFunction(MS_SENDSS_SEND2IMAGESHACK, service_Send2ImageShack);
+ if (!hsvc_Send2ImageShack)
+ MessageBoxEx(NULL, TranslateT("Could not register miranda service."), _T("MS_SENDSS_SEND2IMAGESHACK"), MB_OK | MB_ICONERROR | MB_APPLMODAL, 0);
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+LPTSTR GetCustomPath() {
+ LPTSTR pszPath = NULL;
+ pszPath = Utils_ReplaceVarsT(_T("%miranda_userdata%\\Screenshots"));
+ if (hFolderScreenshot) {
+ TCHAR szPath[1024] = {'\0'};
+ FoldersGetCustomPathT(hFolderScreenshot, szPath, 1024, pszPath);
+ mir_freeAndNil(pszPath);
+ pszPath = mir_tstrdup(szPath);
+ }
+ return pszPath;
+}