diff options
Diffstat (limited to 'plugins/SendScreenshotPlus/Main.cpp')
| -rw-r--r-- | plugins/SendScreenshotPlus/Main.cpp | 406 | 
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;
 +}
  | 
