diff options
-rw-r--r-- | plugins/SendScreenshotPlus/src/CSend.cpp | 750 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/CSend.h | 202 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/CSendEmail.cpp | 430 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/CSendHTTPServer.cpp | 270 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/CSendHTTPServer.h | 114 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/CSendImageShack.cpp | 572 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/CSendImageShack.h | 131 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/UAboutForm.cpp | 10 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/UMainForm.cpp | 151 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/UMainForm.h | 24 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/Utils.cpp | 915 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/Utils.h | 142 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/ctrl_button.cpp | 40 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/global.h | 289 | ||||
-rw-r--r-- | plugins/SendScreenshotPlus/src/mir_icolib.h | 138 |
15 files changed, 2057 insertions, 2121 deletions
diff --git a/plugins/SendScreenshotPlus/src/CSend.cpp b/plugins/SendScreenshotPlus/src/CSend.cpp index 9c20a086f3..e7c1638360 100644 --- a/plugins/SendScreenshotPlus/src/CSend.cpp +++ b/plugins/SendScreenshotPlus/src/CSend.cpp @@ -1,375 +1,375 @@ -/*
-
-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 Sérgio 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.
-*/
-
-#include "global.h"
-
-//---------------------------------------------------------------------------
-CSend::CSend(HWND Owner, HANDLE hContact, bool bFreeOnExit) {
- m_hWndO = Owner;
- m_bFreeOnExit = bFreeOnExit;
- m_pszFile = NULL;
- m_pszFileDesc = NULL;
- m_pszProto = NULL;
- m_ChatRoom = NULL;
- m_PFflag = NULL;
- m_hContact = NULL;
- if (hContact) SetContact(hContact);
- m_hOnSend = NULL;
- m_szEventMsg = NULL;
- m_szEventMsgT = NULL;
- m_pszSendTyp = NULL;
-
- m_ErrorMsg = NULL;
- m_ErrorTitle = NULL;
-}
-
-CSend::~CSend(){
- mir_free(m_pszFile);
- mir_free(m_pszFileDesc);
- mir_free(m_szEventMsg);
- mir_free(m_szEventMsgT);
- mir_free(m_ErrorMsg);
- mir_free(m_ErrorTitle);
- if (m_hOnSend) UnhookEvent(m_hOnSend);
-}
-
-//---------------------------------------------------------------------------
-void CSend::SetContact(HANDLE hContact) {
- m_hContact = hContact;
- m_pszProto = GetContactProto(hContact);
- m_ChatRoom = db_get_b(hContact, m_pszProto, "ChatRoom", 0);
- m_PFflag = hasCap(PF1_URLSEND);
- m_PFflag = hasCap(PF1_CHAT);
- m_PFflag = hasCap(PF1_IMSEND);
-}
-
-//---------------------------------------------------------------------------
-bool CSend::hasCap(unsigned int Flag) {
- return (Flag & CallContactService(m_hContact, PS_GETCAPS, PFLAGNUM_1, NULL)) == Flag;
-}
-
-//---------------------------------------------------------------------------
-void CSend::svcSendMsg(const char* szMessage) {
- mir_freeAndNil(m_szEventMsg);
- m_cbEventMsg=lstrlenA(szMessage)+1;
- m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg);
- ZeroMemory(m_szEventMsg, m_cbEventMsg);
- lstrcpyA(m_szEventMsg,szMessage);
- if (m_pszFileDesc && m_pszFileDesc[0] != NULL) {
- char *temp = mir_t2a(m_pszFileDesc);
- mir_stradd(m_szEventMsg, "\r\n");
- mir_stradd(m_szEventMsg, temp);
- m_cbEventMsg = lstrlenA(m_szEventMsg)+1;
- mir_free(temp);
- }
- //create a HookEventObj on ME_PROTO_ACK
- if (!m_hOnSend) {
- int (__cdecl CSend::*hookProc)(WPARAM, LPARAM);
- hookProc = &CSend::OnSend;
- m_hOnSend = HookEventObj(ME_PROTO_ACK, (MIRANDAHOOKOBJ)*(void **)&hookProc, this);
- }
- //start PSS_MESSAGE service
- m_hSend = (HANDLE)CallContactService(m_hContact, PSS_MESSAGE, NULL, (LPARAM)m_szEventMsg);
- // check we actually got an ft handle back from the protocol
- if (!m_hSend) {
- Unhook();
- Error(SS_ERR_INIT, m_pszSendTyp);
- Exit(ACKRESULT_FAILED);
- }
-}
-
-void CSend::svcSendUrl(const char* url) {
-//szMessage should be encoded as the URL followed by the description, the
-//separator being a single nul (\0). If there is no description, do not forget
-//to end the URL with two nuls.
- mir_freeAndNil(m_szEventMsg)
- m_cbEventMsg=lstrlenA(url)+2;
- m_szEventMsg=(char*)mir_realloc(m_szEventMsg, m_cbEventMsg);
- ZeroMemory(m_szEventMsg, m_cbEventMsg);
- lstrcpyA(m_szEventMsg,url);
- if (m_pszFileDesc && m_pszFileDesc[0] != NULL) {
- char *temp = mir_t2a(m_pszFileDesc);
- m_cbEventMsg += lstrlenA(temp);
- m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg);
- lstrcpyA(m_szEventMsg+lstrlenA(url)+1,temp);
- m_szEventMsg[m_cbEventMsg-1] = 0;
- mir_free(temp);
- }
- //create a HookEventObj on ME_PROTO_ACK
- if (!m_hOnSend) {
- int (__cdecl CSend::*hookProc)(WPARAM, LPARAM);
- hookProc = &CSend::OnSend;
- m_hOnSend = HookEventObj(ME_PROTO_ACK, (MIRANDAHOOKOBJ)*(void **)&hookProc, this);
- }
- //start PSS_URL service
- m_hSend = (HANDLE)CallContactService(m_hContact, PSS_URL, NULL, (LPARAM)m_szEventMsg);
- // check we actually got an ft handle back from the protocol
- if (!m_hSend) {
- //SetFtStatus(hwndDlg, LPGENT("Unable to initiate transfer."), FTS_TEXT);
- //dat->waitingForAcceptance=0;
- Unhook();
- }
-}
-
-void CSend::svcSendChat() {
- GC_INFO gci = {0};
- int res = GC_RESULT_NOSESSION;
- int cnt = (int)CallService(MS_GC_GETSESSIONCOUNT, 0, (LPARAM)m_pszProto);
-
- //loop on all gc session to get the right (save) ptszID for the chatroom from m_hContact
- gci.pszModule = m_pszProto;
- for (int i = 0; i < cnt ; i++ ) {
- gci.iItem = i;
- gci.Flags = BYINDEX | HCONTACT | ID;
- CallService(MS_GC_GETINFO, 0, (LPARAM) &gci);
- if (gci.hContact == m_hContact) {
- GCDEST gcd = {0};
- gcd.pszModule = m_pszProto;
- gcd.iType = GC_EVENT_SENDMESSAGE;
- gcd.ptszID = gci.pszID;
-
- GCEVENT gce = {0};
- gce.cbSize = sizeof(GCEVENT);
- gce.pDest = &gcd;
- gce.bIsMe = TRUE;
- gce.dwFlags = GC_TCHAR|GCEF_ADDTOLOG;
- gce.ptszText = m_szEventMsgT;
- gce.time = time(NULL);
-
- //* returns 0 on success or error code on failure
- res = 200 + (int)CallService(MS_GC_EVENT, 0, (LPARAM) &gce);
- break;
- }
- }
- Exit(res);
-}
-
-void CSend::svcSendChat(const char* szMessage) {
- if (!m_ChatRoom) {
- svcSendMsg(szMessage);
- return;
- }
- mir_freeAndNil(m_szEventMsgT);
- m_szEventMsgT = mir_a2t(szMessage);
- if (m_pszFileDesc) {
- mir_tcsadd(m_szEventMsgT, _T("\r\n"));
- mir_tcsadd(m_szEventMsgT, m_pszFileDesc);
- }
- svcSendChat();
-}
-
-void CSend::svcSendFile() {
-//szMessage should be encoded as the File followed by the description, the
-//separator being a single nul (\0). If there is no description, do not forget
-//to end the File with two nuls.
- mir_freeAndNil(m_szEventMsg)
- char *szFile = mir_t2a(m_pszFile);
- m_cbEventMsg=lstrlenA(szFile)+2;
- m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg);
- ZeroMemory(m_szEventMsg, m_cbEventMsg);
- lstrcpyA(m_szEventMsg,szFile);
- if (m_pszFileDesc && m_pszFileDesc[0] != NULL) {
- char* temp = mir_t2a(m_pszFileDesc);
- m_cbEventMsg += lstrlenA(temp);
- m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg);
- lstrcpyA(m_szEventMsg+lstrlenA(szFile)+1,temp);
- m_szEventMsg[m_cbEventMsg-1] = 0;
- mir_freeAndNil(temp);
- }
- mir_freeAndNil(szFile);
-
- //create a HookEventObj on ME_PROTO_ACK
- if (!m_hOnSend) {
- int (__cdecl CSend::*hookProc)(WPARAM, LPARAM);
- hookProc = &CSend::OnSend;
- m_hOnSend = HookEventObj(ME_PROTO_ACK, (MIRANDAHOOKOBJ)*(void **)&hookProc, this);
- }
-
- // Start miranda PSS_FILE based on mir ver (T)
- TCHAR *ppFile[2]={0,0};
- TCHAR *pDesc = mir_tstrdup(m_pszFileDesc);
- ppFile[0] = mir_tstrdup (m_pszFile);
- ppFile[1] = NULL;
- m_hSend = (HANDLE)CallContactService(m_hContact, PSS_FILET, (WPARAM)pDesc, (LPARAM)ppFile);
- mir_free(pDesc);
- mir_free(ppFile[0]);
-
- // check we actually got an ft handle back from the protocol
- if (!m_hSend) {
- Unhook();
- Error(SS_ERR_INIT, m_pszSendTyp);
- Exit(ACKRESULT_FAILED);
- }
-}
-
-//---------------------------------------------------------------------------
-int __cdecl CSend::OnSend(WPARAM wParam, LPARAM lParam){
- ACKDATA *ack=(ACKDATA*)lParam;
- if(ack->hProcess!= m_hSend) return 0;
- /* if(dat->waitingForAcceptance) {
- SetTimer(hwndDlg,1,1000,NULL);
- dat->waitingForAcceptance=0;
- }
- */
-
- switch(ack->result) {
- case ACKRESULT_INITIALISING: //SetFtStatus(hwndDlg, LPGENT("Initialising..."), FTS_TEXT); break;
- case ACKRESULT_CONNECTING: //SetFtStatus(hwndDlg, LPGENT("Connecting..."), FTS_TEXT); break;
- case ACKRESULT_CONNECTPROXY: //SetFtStatus(hwndDlg, LPGENT("Connecting to proxy..."), FTS_TEXT); break;
- case ACKRESULT_LISTENING: //SetFtStatus(hwndDlg, LPGENT("Waiting for connection..."), FTS_TEXT); break;
- case ACKRESULT_CONNECTED: //SetFtStatus(hwndDlg, LPGENT("Connected"), FTS_TEXT); break;
- case ACKRESULT_SENTREQUEST: //SetFtStatus(hwndDlg, LPGENT("Decision sent"), FTS_TEXT); break;
- case ACKRESULT_NEXTFILE: //SetFtStatus(hwndDlg, LPGENT("Moving to next file..."), FTS_TEXT);
- case ACKRESULT_FILERESUME: //
- case ACKRESULT_DATA: //transfer is on progress
- break;
- case ACKRESULT_DENIED:
- Unhook();
- Exit(ack->result);
- break;
- case ACKRESULT_FAILED:
- Unhook();
- Exit(ack->result);
- //type=ACKTYPE_MESSAGE, result=success/failure, (char*)lParam=error message or NULL.
- //type=ACKTYPE_URL, result=success/failure, (char*)lParam=error message or NULL.
- //type=ACKTYPE_FILE, result=ACKRESULT_FAILED then lParam=(LPARAM)(const char*)szReason
- break;
- case ACKRESULT_SUCCESS:
- Unhook();
- switch(ack->type) {
- case ACKTYPE_CHAT:
- break;
- case ACKTYPE_MESSAGE:
- DB_EventAdd((WORD)EVENTTYPE_MESSAGE);
- break;
- case ACKTYPE_URL:
- DB_EventAdd((WORD)EVENTTYPE_URL);
- break;
- case ACKTYPE_FILE:
- m_szEventMsg = (char*) mir_realloc(m_szEventMsg, sizeof(DWORD) + m_cbEventMsg);
- memmove(m_szEventMsg+sizeof(DWORD), m_szEventMsg, m_cbEventMsg);
- m_cbEventMsg += sizeof(DWORD);
- DB_EventAdd((WORD)EVENTTYPE_FILE);
- break;
- default:
- break;
- }
- Exit(ack->result);
- break;
- default:
- return 0;
- break;
- }
- return 0;
-}
-
-void CSend::DB_EventAdd(WORD EventType)
-{
- DBEVENTINFO dbei = { sizeof(dbei) };
- dbei.szModule = m_pszProto;
- dbei.eventType = EventType;
- dbei.flags = DBEF_SENT;
- dbei.timestamp = time(NULL);
- dbei.flags |= DBEF_UTF;
- dbei.cbBlob= m_cbEventMsg;
- dbei.pBlob = (PBYTE)m_szEventMsg;
- db_event_add(m_hContact, &dbei);
-}
-
-//---------------------------------------------------------------------------
-void CSend::AfterSendDelete() {
- if (m_pszFile && m_bDeleteAfterSend && (m_EnableItem & SS_DLG_DELETEAFTERSSEND) == SS_DLG_DELETEAFTERSSEND) {
- DeleteFile(m_pszFile);
- }
-}
-
-//---------------------------------------------------------------------------
-void CSend::Exit(unsigned int Result) {
- bool err = true;
- if (m_hWndO && IsWindow(m_hWndO)){
- ;
- }
- switch(Result) {
- case ACKRESULT_SUCCESS:
- case GC_RESULT_SUCCESS:
- SkinPlaySound("FileDone");
- err = false;
- break;
- case ACKRESULT_DENIED:
- SkinPlaySound("FileDenied");
- Error(_T("%s (%i):\nFile transfer denied."),TranslateTS(m_pszSendTyp),Result);
- MsgBoxService(NULL, (LPARAM)&m_box);
- err = false;
- break;
- case GC_RESULT_WRONGVER: //.You appear to be using the wrong version of GC API.
- Error(_T("%s (%i):\nYou appear to be using the wrong version of GC API"),TranslateT("GCHAT error"),Result);
- break;
- case GC_RESULT_ERROR: // An internal GC error occurred.
- Error(_T("%s (%i):\nAn internal GC error occurred."),TranslateT("GCHAT error"),Result);
- break;
- case GC_RESULT_NOSESSION: // contact has no open GC session
- Error(_T("%s (%i):\nContact has no open GC session."),TranslateT("GCHAT error"),Result);
- break;
- case ACKRESULT_FAILED:
- default:
- err = false;
- break;
- }
- if (err){
- SkinPlaySound("FileFailed");
- if(m_ErrorMsg && m_ErrorMsg[0] != 0) MsgBoxService(NULL, (LPARAM)&m_box);
- else MsgErr(NULL, LPGENT("An unknown error has occurred."));
- }
-
- AfterSendDelete();
- if(m_bFreeOnExit) delete this;
-}
-
-void CSend::Error(LPCTSTR pszFormat, ...) {
- if(!pszFormat) return;
-
- TCHAR tszTemp[MAX_SECONDLINE];
- va_list vl;
-
- mir_sntprintf(tszTemp, SIZEOF(tszTemp),_T("%s - %s") ,_T(MODNAME), TranslateT("Error"));
- mir_freeAndNil(m_ErrorTitle);
- m_ErrorTitle = mir_tstrdup(tszTemp);
-
- va_start(vl, pszFormat);
- mir_vsntprintf(tszTemp, SIZEOF(tszTemp), TranslateTS(pszFormat), vl);
- va_end(vl);
- mir_freeAndNil(m_ErrorMsg);
- m_ErrorMsg = mir_tstrdup(tszTemp);
-
- ZeroMemory(&m_box, sizeof(m_box));
- m_box.cbSize = sizeof(MSGBOX);
- m_box.hParent = NULL;
- m_box.hiLogo = IcoLib_GetIcon(ICO_PLUG_SSWINDOW1);
- m_box.hiMsg = NULL;
- m_box.ptszTitle = m_ErrorTitle;
- m_box.ptszMsg = m_ErrorMsg;
- m_box.uType = MB_OK|MB_ICON_ERROR;
-}
+/* + +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 Sérgio 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. +*/ + +#include "global.h" + +//--------------------------------------------------------------------------- +CSend::CSend(HWND Owner, HANDLE hContact, bool bFreeOnExit) { + m_hWndO = Owner; + m_bFreeOnExit = bFreeOnExit; + m_pszFile = NULL; + m_pszFileDesc = NULL; + m_pszProto = NULL; + m_ChatRoom = NULL; + m_PFflag = NULL; + m_hContact = NULL; + if (hContact) SetContact(hContact); + m_hOnSend = NULL; + m_szEventMsg = NULL; + m_szEventMsgT = NULL; + m_pszSendTyp = NULL; + + m_ErrorMsg = NULL; + m_ErrorTitle = NULL; +} + +CSend::~CSend(){ + mir_free(m_pszFile); + mir_free(m_pszFileDesc); + mir_free(m_szEventMsg); + mir_free(m_szEventMsgT); + mir_free(m_ErrorMsg); + mir_free(m_ErrorTitle); + if (m_hOnSend) UnhookEvent(m_hOnSend); +} + +//--------------------------------------------------------------------------- +void CSend::SetContact(HANDLE hContact) { + m_hContact = hContact; + m_pszProto = GetContactProto(hContact); + m_ChatRoom = db_get_b(hContact, m_pszProto, "ChatRoom", 0); + m_PFflag = hasCap(PF1_URLSEND); + m_PFflag = hasCap(PF1_CHAT); + m_PFflag = hasCap(PF1_IMSEND); +} + +//--------------------------------------------------------------------------- +bool CSend::hasCap(unsigned int Flag) { + return (Flag & CallContactService(m_hContact, PS_GETCAPS, PFLAGNUM_1, NULL)) == Flag; +} + +//--------------------------------------------------------------------------- +void CSend::svcSendMsg(const char* szMessage) { + mir_freeAndNil(m_szEventMsg); + m_cbEventMsg=lstrlenA(szMessage)+1; + m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg); + ZeroMemory(m_szEventMsg, m_cbEventMsg); + lstrcpyA(m_szEventMsg,szMessage); + if (m_pszFileDesc && m_pszFileDesc[0] != NULL) { + char *temp = mir_t2a(m_pszFileDesc); + mir_stradd(m_szEventMsg, "\r\n"); + mir_stradd(m_szEventMsg, temp); + m_cbEventMsg = lstrlenA(m_szEventMsg)+1; + mir_free(temp); + } + //create a HookEventObj on ME_PROTO_ACK + if (!m_hOnSend) { + int (__cdecl CSend::*hookProc)(WPARAM, LPARAM); + hookProc = &CSend::OnSend; + m_hOnSend = HookEventObj(ME_PROTO_ACK, (MIRANDAHOOKOBJ)*(void **)&hookProc, this); + } + //start PSS_MESSAGE service + m_hSend = (HANDLE)CallContactService(m_hContact, PSS_MESSAGE, NULL, (LPARAM)m_szEventMsg); + // check we actually got an ft handle back from the protocol + if (!m_hSend) { + Unhook(); + Error(SS_ERR_INIT, m_pszSendTyp); + Exit(ACKRESULT_FAILED); + } +} +/* +void CSend::svcSendUrl(const char* url) { +//szMessage should be encoded as the URL followed by the description, the +//separator being a single nul (\0). If there is no description, do not forget +//to end the URL with two nuls. + mir_freeAndNil(m_szEventMsg) + m_cbEventMsg=lstrlenA(url)+2; + m_szEventMsg=(char*)mir_realloc(m_szEventMsg, m_cbEventMsg); + ZeroMemory(m_szEventMsg, m_cbEventMsg); + lstrcpyA(m_szEventMsg,url); + if (m_pszFileDesc && m_pszFileDesc[0] != NULL) { + char *temp = mir_t2a(m_pszFileDesc); + m_cbEventMsg += lstrlenA(temp); + m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg); + lstrcpyA(m_szEventMsg+lstrlenA(url)+1,temp); + m_szEventMsg[m_cbEventMsg-1] = 0; + mir_free(temp); + } + //create a HookEventObj on ME_PROTO_ACK + if (!m_hOnSend) { + int (__cdecl CSend::*hookProc)(WPARAM, LPARAM); + hookProc = &CSend::OnSend; + m_hOnSend = HookEventObj(ME_PROTO_ACK, (MIRANDAHOOKOBJ)*(void **)&hookProc, this); + } + //start PSS_URL service + m_hSend = (HANDLE)CallContactService(m_hContact, PSS_URL, NULL, (LPARAM)m_szEventMsg); + // check we actually got an ft handle back from the protocol + if (!m_hSend) { + //SetFtStatus(hwndDlg, LPGENT("Unable to initiate transfer."), FTS_TEXT); + //dat->waitingForAcceptance=0; + Unhook(); + } +}*/ + +void CSend::svcSendChat() { + GC_INFO gci = {0}; + int res = GC_RESULT_NOSESSION; + int cnt = (int)CallService(MS_GC_GETSESSIONCOUNT, 0, (LPARAM)m_pszProto); + + //loop on all gc session to get the right (save) ptszID for the chatroom from m_hContact + gci.pszModule = m_pszProto; + for (int i = 0; i < cnt ; i++ ) { + gci.iItem = i; + gci.Flags = BYINDEX | HCONTACT | ID; + CallService(MS_GC_GETINFO, 0, (LPARAM) &gci); + if (gci.hContact == m_hContact) { + GCDEST gcd = {0}; + gcd.pszModule = m_pszProto; + gcd.iType = GC_EVENT_SENDMESSAGE; + gcd.ptszID = gci.pszID; + + GCEVENT gce = {0}; + gce.cbSize = sizeof(GCEVENT); + gce.pDest = &gcd; + gce.bIsMe = TRUE; + gce.dwFlags = GC_TCHAR|GCEF_ADDTOLOG; + gce.ptszText = m_szEventMsgT; + gce.time = time(NULL); + + //* returns 0 on success or error code on failure + res = 200 + (int)CallService(MS_GC_EVENT, 0, (LPARAM) &gce); + break; + } + } + Exit(res); +} + +void CSend::svcSendChat(const char* szMessage) { + if (!m_ChatRoom) { + svcSendMsg(szMessage); + return; + } + mir_freeAndNil(m_szEventMsgT); + m_szEventMsgT = mir_a2t(szMessage); + if (m_pszFileDesc) { + mir_tcsadd(m_szEventMsgT, _T("\r\n")); + mir_tcsadd(m_szEventMsgT, m_pszFileDesc); + } + svcSendChat(); +} + +void CSend::svcSendFile() { +//szMessage should be encoded as the File followed by the description, the +//separator being a single nul (\0). If there is no description, do not forget +//to end the File with two nuls. + mir_freeAndNil(m_szEventMsg) + char *szFile = mir_t2a(m_pszFile); + m_cbEventMsg=lstrlenA(szFile)+2; + m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg); + ZeroMemory(m_szEventMsg, m_cbEventMsg); + lstrcpyA(m_szEventMsg,szFile); + if (m_pszFileDesc && m_pszFileDesc[0] != NULL) { + char* temp = mir_t2a(m_pszFileDesc); + m_cbEventMsg += lstrlenA(temp); + m_szEventMsg=(char*)mir_realloc(m_szEventMsg, sizeof(char)*m_cbEventMsg); + lstrcpyA(m_szEventMsg+lstrlenA(szFile)+1,temp); + m_szEventMsg[m_cbEventMsg-1] = 0; + mir_freeAndNil(temp); + } + mir_freeAndNil(szFile); + + //create a HookEventObj on ME_PROTO_ACK + if (!m_hOnSend) { + int (__cdecl CSend::*hookProc)(WPARAM, LPARAM); + hookProc = &CSend::OnSend; + m_hOnSend = HookEventObj(ME_PROTO_ACK, (MIRANDAHOOKOBJ)*(void **)&hookProc, this); + } + + // Start miranda PSS_FILE based on mir ver (T) + TCHAR *ppFile[2]={0,0}; + TCHAR *pDesc = mir_tstrdup(m_pszFileDesc); + ppFile[0] = mir_tstrdup (m_pszFile); + ppFile[1] = NULL; + m_hSend = (HANDLE)CallContactService(m_hContact, PSS_FILET, (WPARAM)pDesc, (LPARAM)ppFile); + mir_free(pDesc); + mir_free(ppFile[0]); + + // check we actually got an ft handle back from the protocol + if (!m_hSend) { + Unhook(); + Error(SS_ERR_INIT, m_pszSendTyp); + Exit(ACKRESULT_FAILED); + } +} + +//--------------------------------------------------------------------------- +int __cdecl CSend::OnSend(WPARAM wParam, LPARAM lParam){ + ACKDATA *ack=(ACKDATA*)lParam; + if(ack->hProcess!= m_hSend) return 0; + /* if(dat->waitingForAcceptance) { + SetTimer(hwndDlg,1,1000,NULL); + dat->waitingForAcceptance=0; + } + */ + + switch(ack->result) { + case ACKRESULT_INITIALISING: //SetFtStatus(hwndDlg, LPGENT("Initialising..."), FTS_TEXT); break; + case ACKRESULT_CONNECTING: //SetFtStatus(hwndDlg, LPGENT("Connecting..."), FTS_TEXT); break; + case ACKRESULT_CONNECTPROXY: //SetFtStatus(hwndDlg, LPGENT("Connecting to proxy..."), FTS_TEXT); break; + case ACKRESULT_LISTENING: //SetFtStatus(hwndDlg, LPGENT("Waiting for connection..."), FTS_TEXT); break; + case ACKRESULT_CONNECTED: //SetFtStatus(hwndDlg, LPGENT("Connected"), FTS_TEXT); break; + case ACKRESULT_SENTREQUEST: //SetFtStatus(hwndDlg, LPGENT("Decision sent"), FTS_TEXT); break; + case ACKRESULT_NEXTFILE: //SetFtStatus(hwndDlg, LPGENT("Moving to next file..."), FTS_TEXT); + case ACKRESULT_FILERESUME: // + case ACKRESULT_DATA: //transfer is on progress + break; + case ACKRESULT_DENIED: + Unhook(); + Exit(ack->result); + break; + case ACKRESULT_FAILED: + Unhook(); + Exit(ack->result); + //type=ACKTYPE_MESSAGE, result=success/failure, (char*)lParam=error message or NULL. + //type=ACKTYPE_URL, result=success/failure, (char*)lParam=error message or NULL. + //type=ACKTYPE_FILE, result=ACKRESULT_FAILED then lParam=(LPARAM)(const char*)szReason + break; + case ACKRESULT_SUCCESS: + Unhook(); + switch(ack->type) { + case ACKTYPE_CHAT: + break; + case ACKTYPE_MESSAGE: + DB_EventAdd((WORD)EVENTTYPE_MESSAGE); + break; + case ACKTYPE_URL: + DB_EventAdd((WORD)EVENTTYPE_URL); + break; + case ACKTYPE_FILE: + m_szEventMsg = (char*) mir_realloc(m_szEventMsg, sizeof(DWORD) + m_cbEventMsg); + memmove(m_szEventMsg+sizeof(DWORD), m_szEventMsg, m_cbEventMsg); + m_cbEventMsg += sizeof(DWORD); + DB_EventAdd((WORD)EVENTTYPE_FILE); + break; + default: + break; + } + Exit(ack->result); + break; + default: + return 0; + break; + } + return 0; +} + +void CSend::DB_EventAdd(WORD EventType) +{ + DBEVENTINFO dbei = { sizeof(dbei) }; + dbei.szModule = m_pszProto; + dbei.eventType = EventType; + dbei.flags = DBEF_SENT; + dbei.timestamp = time(NULL); + dbei.flags |= DBEF_UTF; + dbei.cbBlob= m_cbEventMsg; + dbei.pBlob = (PBYTE)m_szEventMsg; + db_event_add(m_hContact, &dbei); +} + +//--------------------------------------------------------------------------- +void CSend::AfterSendDelete() { + if (m_pszFile && m_bDeleteAfterSend && (m_EnableItem & SS_DLG_DELETEAFTERSSEND) == SS_DLG_DELETEAFTERSSEND) { + DeleteFile(m_pszFile); + } +} + +//--------------------------------------------------------------------------- +void CSend::Exit(unsigned int Result) { + bool err = true; + if (m_hWndO && IsWindow(m_hWndO)){ + ; + } + switch(Result) { + case ACKRESULT_SUCCESS: + case GC_RESULT_SUCCESS: + SkinPlaySound("FileDone"); + err = false; + break; + case ACKRESULT_DENIED: + SkinPlaySound("FileDenied"); + Error(_T("%s (%i):\nFile transfer denied."),TranslateTS(m_pszSendTyp),Result); + MsgBoxService(NULL, (LPARAM)&m_box); + err = false; + break; + case GC_RESULT_WRONGVER: //.You appear to be using the wrong version of GC API. + Error(_T("%s (%i):\nYou appear to be using the wrong version of GC API"),TranslateT("GCHAT error"),Result); + break; + case GC_RESULT_ERROR: // An internal GC error occurred. + Error(_T("%s (%i):\nAn internal GC error occurred."),TranslateT("GCHAT error"),Result); + break; + case GC_RESULT_NOSESSION: // contact has no open GC session + Error(_T("%s (%i):\nContact has no open GC session."),TranslateT("GCHAT error"),Result); + break; + case ACKRESULT_FAILED: + default: + err = false; + break; + } + if (err){ + SkinPlaySound("FileFailed"); + if(m_ErrorMsg && m_ErrorMsg[0] != 0) MsgBoxService(NULL, (LPARAM)&m_box); + else MsgErr(NULL, LPGENT("An unknown error has occurred.")); + } + + AfterSendDelete(); + if(m_bFreeOnExit) delete this; +} + +void CSend::Error(LPCTSTR pszFormat, ...) { + if(!pszFormat) return; + + TCHAR tszTemp[MAX_SECONDLINE]; + va_list vl; + + mir_sntprintf(tszTemp, SIZEOF(tszTemp),_T("%s - %s") ,_T(MODNAME), TranslateT("Error")); + mir_freeAndNil(m_ErrorTitle); + m_ErrorTitle = mir_tstrdup(tszTemp); + + va_start(vl, pszFormat); + mir_vsntprintf(tszTemp, SIZEOF(tszTemp), TranslateTS(pszFormat), vl); + va_end(vl); + mir_freeAndNil(m_ErrorMsg); + m_ErrorMsg = mir_tstrdup(tszTemp); + + ZeroMemory(&m_box, sizeof(m_box)); + m_box.cbSize = sizeof(MSGBOX); + m_box.hParent = NULL; + m_box.hiLogo = IcoLib_GetIcon(ICO_PLUG_SSWINDOW1); + m_box.hiMsg = NULL; + m_box.ptszTitle = m_ErrorTitle; + m_box.ptszMsg = m_ErrorMsg; + m_box.uType = MB_OK|MB_ICON_ERROR; +} diff --git a/plugins/SendScreenshotPlus/src/CSend.h b/plugins/SendScreenshotPlus/src/CSend.h index da8cb16cac..9b491258d0 100644 --- a/plugins/SendScreenshotPlus/src/CSend.h +++ b/plugins/SendScreenshotPlus/src/CSend.h @@ -1,101 +1,101 @@ -/*
-
-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 Sérgio 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.
-*/
-
-#ifndef _CSEND_H
-#define _CSEND_H
-
-//---------------------------------------------------------------------------
-#define SS_AUTOSEND 1
-#define SS_DELETEAFTERSSEND 2
-
-#define SS_DLG_AUTOSEND 1 //Button_Enable(GetDlgItem(Owner, ID_chkEmulateClick), TRUE);
-#define SS_DLG_DELETEAFTERSSEND 2 //Button_Enable(GetDlgItem(Owner, ID_btnDeleteAfterSend), TRUE);
-#define SS_DLG_DESCRIPTION 4 //Button_Enable(GetDlgItem(Owner, ID_btnDesc), TRUE);
-
-#define GC_RESULT_SUCCESS 200
-#define GC_RESULT_WRONGVER 201
-#define GC_RESULT_ERROR 202
-#define GC_RESULT_NOSESSION 209
-
-#define SS_ERR_INIT LPGENT("Unable to initiate %s.")
-#define SS_ERR_MAPI LPGENT("MAPI error (%i):\n%s.")
-
-//---------------------------------------------------------------------------
-class CSend {
- public:
- CSend(HWND Owner, HANDLE hContact, bool bFreeOnExit); // oder (TfrmMain & Owner)
- virtual ~CSend();
-
- virtual void Send() = 0;
- void SendSync(bool Sync) {m_SendSync = Sync;};
- bool m_bFreeOnExit; // need to "delete object;" on exit ?
- void SetContact(HANDLE hContact);
- BYTE GetEnableItem() {return m_EnableItem;};
- LPTSTR GetErrorMsg() {return m_ErrorMsg;};
-
- LPTSTR m_pszFile;
- LPTSTR m_pszFileDesc;
-
- BOOL m_bDeleteAfterSend;
-
- private:
-
- protected:
- LPTSTR m_pszSendTyp; //hold string for error mess
- HWND m_hWndO; //window handle of caller
- HANDLE m_hContact; //Contact handle
- char* m_pszProto; //Contact Proto Modul
- BYTE m_EnableItem; //hold flag for send type
- void AfterSendDelete();
- BYTE m_ChatRoom; //is Contact chatroom
- bool m_SendSync; //send sync / async
-
- bool hasCap(unsigned int Flag);
- unsigned int m_PFflag;
-
- void svcSendFile();
- void svcSendUrl (const char* url);
- void svcSendMsg (const char* szMessage);
- void svcSendChat(); //main GC service
- void svcSendChat(const char* szMessage); //GC ansi wrapper
-
- DWORD m_cbEventMsg; //sizeof EventMsg(T) buffer
- char* m_szEventMsg; //EventMsg char*
- LPTSTR m_szEventMsgT; //EventMsg TCHAR*
- HANDLE m_hSend; //protocol send handle
- HANDLE m_hOnSend; //HookEventObj on ME_PROTO_ACK
- int __cdecl OnSend(WPARAM wParam, LPARAM lParam);
- void Unhook(){if(m_hOnSend) {UnhookEvent(m_hOnSend);m_hOnSend = NULL;}}
- void DB_EventAdd(WORD EventType);
- void Exit(unsigned int Result);
-
- MSGBOX m_box;
- LPTSTR m_ErrorMsg;
- LPTSTR m_ErrorTitle;
- void Error(LPCTSTR pszFormat, ...);
-};
-
-#endif
+/* + +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 Sérgio 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. +*/ + +#ifndef _CSEND_H +#define _CSEND_H + +//--------------------------------------------------------------------------- +#define SS_AUTOSEND 1 +#define SS_DELETEAFTERSSEND 2 + +#define SS_DLG_AUTOSEND 1 //Button_Enable(GetDlgItem(Owner, ID_chkEmulateClick), TRUE); +#define SS_DLG_DELETEAFTERSSEND 2 //Button_Enable(GetDlgItem(Owner, ID_btnDeleteAfterSend), TRUE); +#define SS_DLG_DESCRIPTION 4 //Button_Enable(GetDlgItem(Owner, ID_btnDesc), TRUE); + +#define GC_RESULT_SUCCESS 200 +#define GC_RESULT_WRONGVER 201 +#define GC_RESULT_ERROR 202 +#define GC_RESULT_NOSESSION 209 + +#define SS_ERR_INIT LPGENT("Unable to initiate %s.") +#define SS_ERR_MAPI LPGENT("MAPI error (%i):\n%s.") + +//--------------------------------------------------------------------------- +class CSend { + public: + CSend(HWND Owner, HANDLE hContact, bool bFreeOnExit); // oder (TfrmMain & Owner) + virtual ~CSend(); + + virtual void Send() = 0; +// void SendSync(bool Sync) {m_SendSync = Sync;}; + bool m_bFreeOnExit; // need to "delete object;" on exit ? + void SetContact(HANDLE hContact); + BYTE GetEnableItem() {return m_EnableItem;}; + LPTSTR GetErrorMsg() {return m_ErrorMsg;}; + + LPTSTR m_pszFile; + LPTSTR m_pszFileDesc; + + BOOL m_bDeleteAfterSend; + + private: + + protected: + LPTSTR m_pszSendTyp; //hold string for error mess + HWND m_hWndO; //window handle of caller + HANDLE m_hContact; //Contact handle + char* m_pszProto; //Contact Proto Modul + BYTE m_EnableItem; //hold flag for send type + void AfterSendDelete(); + BYTE m_ChatRoom; //is Contact chatroom +// bool m_SendSync; //send sync / async + + bool hasCap(unsigned int Flag); + unsigned int m_PFflag; + + void svcSendFile(); + void svcSendUrl (const char* url); + void svcSendMsg (const char* szMessage); + void svcSendChat(); //main GC service + void svcSendChat(const char* szMessage); //GC ansi wrapper + + DWORD m_cbEventMsg; //sizeof EventMsg(T) buffer + char* m_szEventMsg; //EventMsg char* + LPTSTR m_szEventMsgT; //EventMsg TCHAR* + HANDLE m_hSend; //protocol send handle + HANDLE m_hOnSend; //HookEventObj on ME_PROTO_ACK + int __cdecl OnSend(WPARAM wParam, LPARAM lParam); + void Unhook(){if(m_hOnSend) {UnhookEvent(m_hOnSend);m_hOnSend = NULL;}} + void DB_EventAdd(WORD EventType); + void Exit(unsigned int Result); + + MSGBOX m_box; + LPTSTR m_ErrorMsg; + LPTSTR m_ErrorTitle; + void Error(LPCTSTR pszFormat, ...); +}; + +#endif diff --git a/plugins/SendScreenshotPlus/src/CSendEmail.cpp b/plugins/SendScreenshotPlus/src/CSendEmail.cpp index f2988e4c4f..79f848f68c 100644 --- a/plugins/SendScreenshotPlus/src/CSendEmail.cpp +++ b/plugins/SendScreenshotPlus/src/CSendEmail.cpp @@ -1,215 +1,215 @@ -/*
-
-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 Sérgio 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.
-*/
-
-//---------------------------------------------------------------------------
-#include "global.h"
-
-//---------------------------------------------------------------------------
-CSendEmail::CSendEmail(HWND Owner, HANDLE hContact, bool bFreeOnExit)
-: CSend(Owner, hContact, bFreeOnExit){
- m_EnableItem = SS_DLG_DELETEAFTERSSEND | SS_DLG_DESCRIPTION; // SS_DLG_AUTOSEND | ;
- m_pszSendTyp = _T("Email transfer");
- m_pszFileA = NULL;
- m_pszFileName = NULL;
- m_Email = NULL;
- m_FriendlyName = NULL;
- m_Subject = NULL;
-}
-
-CSendEmail::~CSendEmail(){
- mir_free(m_pszFileA);
- mir_free(m_pszFileName);
- mir_free(m_Email);
- mir_free(m_FriendlyName);
- mir_free(m_Subject);
-}
-
-//---------------------------------------------------------------------------
-void CSendEmail::Send() {
-
- mir_freeAndNil(m_pszFileName);
- m_pszFileName = (LPSTR)GetFileName(m_pszFile, DBVT_ASCIIZ);
-
- mir_freeAndNil(m_pszFileA);
- m_pszFileA = mir_t2a(m_pszFile);
-
-
-// AnsiString Email, Subject, FriendlyName;
- CONTACTINFO ci={0};
- ci.cbSize = sizeof(ci);
- ci.hContact = m_hContact;
- ci.szProto = m_pszProto;
- //ci.dwFlag = CNF_TCHAR;
-
- ci.dwFlag = CNF_EMAIL | CNF_TCHAR;
- CallService(MS_CONTACT_GETCONTACTINFO,0,(LPARAM)&ci);
- m_Email = mir_t2a(ci.pszVal);
-
- ci.dwFlag = CNF_DISPLAY | CNF_TCHAR;
- CallService(MS_CONTACT_GETCONTACTINFO,0,(LPARAM)&ci);
- m_FriendlyName = mir_t2a(ci.pszVal);
-
- mir_free(ci.pszVal);
-
- m_Subject = mir_t2a(m_pszFileDesc);
-
- //SendByEmail(m_pszFileA, "", m_FriendlyName, m_Email, m_Subject);
-
- //start Send thread
- m_bFreeOnExit = TRUE;
- mir_forkthread(&CSendEmail::SendThreadWrapper, this);
-}
-
-void CSendEmail::SendThread() {
- //This code based on SentTo.exe application.
- //The default mail client for Simple MAPI or MAPI calls is defined by the
- //HKLM\Software\Clients\Mail::(default) registry value.
-
- LPTSTR err = NULL;
- MapiFileDesc arrfileDesc[1];
-
- typedef ULONG (FAR PASCAL *MAPIFUNC)(LHANDLE,ULONG,lpMapiMessage,FLAGS,ULONG);
- MapiMessage Msg;
- MAPIFUNC lpMAPISendMail;
-
- HINSTANCE hMAPILib = ::LoadLibrary(_T("MAPI32.DLL"));
- if (hMAPILib == NULL) {
- //return -1;
- Error(SS_ERR_INIT, m_pszSendTyp);
- Exit(ACKRESULT_FAILED);
- }
-
- lpMAPISendMail = (MAPIFUNC)GetProcAddress(hMAPILib, "MAPISendMail");
- if (lpMAPISendMail == NULL) {
- ::FreeLibrary(hMAPILib);
- //return -2;
- Error(SS_ERR_INIT, m_pszSendTyp);
- Exit(ACKRESULT_FAILED);
- }
-
- memset(&Msg, 0, sizeof(Msg));
-
- arrfileDesc[0].ulReserved = 0;
- arrfileDesc[0].flFlags = 0;
- arrfileDesc[0].lpFileType = NULL;
- arrfileDesc[0].nPosition = -1;
- arrfileDesc[0].lpszPathName = m_pszFileA;
- arrfileDesc[0].lpszFileName = NULL;
-
- Msg.nFileCount = 1;
- Msg.lpFiles = arrfileDesc;
- Msg.lpszNoteText = ""; //body
- Msg.lpszSubject = m_Subject; //subject
-
- Msg.nRecipCount = 1;
- MapiRecipDesc recip;
- recip.ulReserved = 0;
- recip.ulRecipClass = MAPI_TO;
-
- if (m_FriendlyName && m_FriendlyName[0]!= NULL) {
- recip.lpszName = m_FriendlyName; //friendly name set to contact's name
- }
- else {
- recip.lpszName = m_Email; //friendly name set to contact's email
- }
-
- recip.lpszAddress = m_Email; //email
- recip.ulEIDSize = 0;
- recip.lpEntryID = NULL;
- Msg.lpRecips = &recip;
-
- try {
- int res = lpMAPISendMail(NULL, NULL, &Msg, MAPI_LOGON_UI|MAPI_DIALOG, 0);
- ::FreeLibrary(hMAPILib);
-
- switch (res) {
- case SUCCESS_SUCCESS:
- //The call succeeded and the message was sent.
- Exit(ACKRESULT_SUCCESS);
- return;
-
- // No message was sent
- case MAPI_E_AMBIGUOUS_RECIPIENT:
- err = LPGENT("A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set");
- break;
- case MAPI_E_ATTACHMENT_NOT_FOUND:
- err = LPGENT("The specified attachment was not found");
- break;
- case MAPI_E_ATTACHMENT_OPEN_FAILURE:
- err = LPGENT("The specified attachment could not be opened");
- break;
- case MAPI_E_BAD_RECIPTYPE:
- err = LPGENT("The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC");
- break;
- case MAPI_E_FAILURE:
- err = LPGENT("One or more unspecified errors occurred");
- break;
- case MAPI_E_INSUFFICIENT_MEMORY:
- err = LPGENT("There was insufficient memory to proceed");
- break;
- case MAPI_E_INVALID_RECIPS:
- err = LPGENT("One or more recipients were invalid or did not resolve to any address");
- break;
- case MAPI_E_LOGIN_FAILURE:
- err = LPGENT("There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed");
- break;
- case MAPI_E_TEXT_TOO_LARGE:
- err = LPGENT("The text in the message was too large");
- break;
- case MAPI_E_TOO_MANY_FILES:
- err = LPGENT("There were too many file attachments");
- break;
- case MAPI_E_TOO_MANY_RECIPIENTS:
- err = LPGENT("There were too many recipients");
- break;
- case MAPI_E_UNKNOWN_RECIPIENT:
- err = LPGENT("A recipient did not appear in the address list");
- break;
- case MAPI_E_USER_ABORT:
- err = LPGENT("The user canceled one of the dialog boxes");
- break;
- default:
- err = LPGENT("Unknown Error");
- break;
- }
- Error(SS_ERR_MAPI, res, err);
- Exit(ACKRESULT_FAILED);
-
- } catch (...) {
- ::FreeLibrary(hMAPILib);
- Error(SS_ERR_INIT, m_pszSendTyp);
- Exit(ACKRESULT_FAILED);
- //return -3;
- return;
- }
-}
-
-void CSendEmail::SendThreadWrapper(void * Obj) {
- reinterpret_cast<CSendEmail*>(Obj)->SendThread();
-}
-
-//---------------------------------------------------------------------------
-
+/* + +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 Sérgio 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. +*/ + +//--------------------------------------------------------------------------- +#include "global.h" + +//--------------------------------------------------------------------------- +CSendEmail::CSendEmail(HWND Owner, HANDLE hContact, bool bFreeOnExit) +: CSend(Owner, hContact, bFreeOnExit){ + m_EnableItem = SS_DLG_DELETEAFTERSSEND | SS_DLG_DESCRIPTION; // SS_DLG_AUTOSEND | ; + m_pszSendTyp = _T("Email transfer"); + m_pszFileA = NULL; + m_pszFileName = NULL; + m_Email = NULL; + m_FriendlyName = NULL; + m_Subject = NULL; +} + +CSendEmail::~CSendEmail(){ + mir_free(m_pszFileA); + mir_free(m_pszFileName); + mir_free(m_Email); + mir_free(m_FriendlyName); + mir_free(m_Subject); +} + +//--------------------------------------------------------------------------- +void CSendEmail::Send() { + + mir_freeAndNil(m_pszFileName); + m_pszFileName = (LPSTR)GetFileName(m_pszFile, DBVT_ASCIIZ); + + mir_freeAndNil(m_pszFileA); + m_pszFileA = mir_t2a(m_pszFile); + + +// AnsiString Email, Subject, FriendlyName; + CONTACTINFO ci={0}; + ci.cbSize = sizeof(ci); + ci.hContact = m_hContact; + ci.szProto = m_pszProto; + //ci.dwFlag = CNF_TCHAR; + + ci.dwFlag = CNF_EMAIL | CNF_TCHAR; + CallService(MS_CONTACT_GETCONTACTINFO,0,(LPARAM)&ci); + m_Email = mir_t2a(ci.pszVal); + + ci.dwFlag = CNF_DISPLAY | CNF_TCHAR; + CallService(MS_CONTACT_GETCONTACTINFO,0,(LPARAM)&ci); + m_FriendlyName = mir_t2a(ci.pszVal); + + mir_free(ci.pszVal); + + m_Subject = mir_t2a(m_pszFileDesc); + + //SendByEmail(m_pszFileA, "", m_FriendlyName, m_Email, m_Subject); + + //start Send thread + m_bFreeOnExit = TRUE; + mir_forkthread(&CSendEmail::SendThreadWrapper, this); +} + +void CSendEmail::SendThread() { + //This code based on SentTo.exe application. + //The default mail client for Simple MAPI or MAPI calls is defined by the + //HKLM\Software\Clients\Mail::(default) registry value. + + MapiFileDesc arrfileDesc[1]; + + typedef ULONG (FAR PASCAL *MAPIFUNC)(LHANDLE,ULONG,lpMapiMessage,FLAGS,ULONG); + MapiMessage Msg; + MAPIFUNC lpMAPISendMail; + + HINSTANCE hMAPILib = ::LoadLibrary(_T("MAPI32.DLL")); + if (hMAPILib == NULL) { + //return -1; + Error(SS_ERR_INIT, m_pszSendTyp); + Exit(ACKRESULT_FAILED); + } + + lpMAPISendMail = (MAPIFUNC)GetProcAddress(hMAPILib, "MAPISendMail"); + if (lpMAPISendMail == NULL) { + ::FreeLibrary(hMAPILib); + //return -2; + Error(SS_ERR_INIT, m_pszSendTyp); + Exit(ACKRESULT_FAILED); + } + + memset(&Msg, 0, sizeof(Msg)); + + arrfileDesc[0].ulReserved = 0; + arrfileDesc[0].flFlags = 0; + arrfileDesc[0].lpFileType = NULL; + arrfileDesc[0].nPosition = -1; + arrfileDesc[0].lpszPathName = m_pszFileA; + arrfileDesc[0].lpszFileName = NULL; + + Msg.nFileCount = 1; + Msg.lpFiles = arrfileDesc; + Msg.lpszNoteText = ""; //body + Msg.lpszSubject = m_Subject; //subject + + Msg.nRecipCount = 1; + MapiRecipDesc recip; + recip.ulReserved = 0; + recip.ulRecipClass = MAPI_TO; + + if (m_FriendlyName && m_FriendlyName[0]!= NULL) { + recip.lpszName = m_FriendlyName; //friendly name set to contact's name + } + else { + recip.lpszName = m_Email; //friendly name set to contact's email + } + + recip.lpszAddress = m_Email; //email + recip.ulEIDSize = 0; + recip.lpEntryID = NULL; + Msg.lpRecips = &recip; + + try { + int res = lpMAPISendMail(NULL, NULL, &Msg, MAPI_LOGON_UI|MAPI_DIALOG, 0); + ::FreeLibrary(hMAPILib); + + LPTSTR err; + switch (res) { + case SUCCESS_SUCCESS: + //The call succeeded and the message was sent. + Exit(ACKRESULT_SUCCESS); + return; + + // No message was sent + case MAPI_E_AMBIGUOUS_RECIPIENT: + err = LPGENT("A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set"); + break; + case MAPI_E_ATTACHMENT_NOT_FOUND: + err = LPGENT("The specified attachment was not found"); + break; + case MAPI_E_ATTACHMENT_OPEN_FAILURE: + err = LPGENT("The specified attachment could not be opened"); + break; + case MAPI_E_BAD_RECIPTYPE: + err = LPGENT("The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC"); + break; + case MAPI_E_FAILURE: + err = LPGENT("One or more unspecified errors occurred"); + break; + case MAPI_E_INSUFFICIENT_MEMORY: + err = LPGENT("There was insufficient memory to proceed"); + break; + case MAPI_E_INVALID_RECIPS: + err = LPGENT("One or more recipients were invalid or did not resolve to any address"); + break; + case MAPI_E_LOGIN_FAILURE: + err = LPGENT("There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed"); + break; + case MAPI_E_TEXT_TOO_LARGE: + err = LPGENT("The text in the message was too large"); + break; + case MAPI_E_TOO_MANY_FILES: + err = LPGENT("There were too many file attachments"); + break; + case MAPI_E_TOO_MANY_RECIPIENTS: + err = LPGENT("There were too many recipients"); + break; + case MAPI_E_UNKNOWN_RECIPIENT: + err = LPGENT("A recipient did not appear in the address list"); + break; + case MAPI_E_USER_ABORT: + err = LPGENT("The user canceled one of the dialog boxes"); + break; + default: + err = LPGENT("Unknown Error"); + break; + } + Error(SS_ERR_MAPI, res, err); + Exit(ACKRESULT_FAILED); + + } catch (...) { + ::FreeLibrary(hMAPILib); + Error(SS_ERR_INIT, m_pszSendTyp); + Exit(ACKRESULT_FAILED); + //return -3; + return; + } +} + +void CSendEmail::SendThreadWrapper(void * Obj) { + reinterpret_cast<CSendEmail*>(Obj)->SendThread(); +} + +//--------------------------------------------------------------------------- + diff --git a/plugins/SendScreenshotPlus/src/CSendHTTPServer.cpp b/plugins/SendScreenshotPlus/src/CSendHTTPServer.cpp index bd8a543d05..f89c12e74a 100644 --- a/plugins/SendScreenshotPlus/src/CSendHTTPServer.cpp +++ b/plugins/SendScreenshotPlus/src/CSendHTTPServer.cpp @@ -1,135 +1,135 @@ -/*
-
-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 Sérgio 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.
-*/
-
-//---------------------------------------------------------------------------
-#include "global.h"
-
-INT_PTR (*g_MirCallService)(const char *, WPARAM, LPARAM)=NULL;
-//INT_PTR (*CallService)(const char *,WPARAM,LPARAM);
-
-
-//---------------------------------------------------------------------------
-CSendHTTPServer::CSendHTTPServer(HWND Owner, HANDLE hContact, bool bFreeOnExit)
-: CSend(Owner, hContact, bFreeOnExit){
- m_EnableItem = SS_DLG_DESCRIPTION ; //| SS_DLG_AUTOSEND | SS_DLG_DELETEAFTERSSEND;
- m_pszSendTyp = _T("HTTPServer transfer");
- m_pszFileName = NULL;
- m_URL = NULL;
- m_fsi_pszSrvPath = NULL;
- m_fsi_pszRealPath = NULL;
-}
-
-CSendHTTPServer::~CSendHTTPServer(){
- mir_free(m_pszFileName);
- mir_free(m_URL);
- mir_free(m_fsi_pszSrvPath);
- mir_free(m_fsi_pszRealPath);
-}
-
-//---------------------------------------------------------------------------
-void CSendHTTPServer::Send() {
-
- if (CallService(MS_HTTP_ACCEPT_CONNECTIONS, (WPARAM)true, 0) != 0) {
- Error(NULL, TranslateT("Could not start the HTTP Server plugin."));
- return;
- }
-
- if (!m_pszFileName) {
- m_pszFileName = (LPSTR)GetFileName(m_pszFile, DBVT_ASCIIZ);
- }
- mir_freeAndNil(m_fsi_pszSrvPath);
- mir_stradd(m_fsi_pszSrvPath, "/");
- mir_stradd(m_fsi_pszSrvPath, m_pszFileName);
-
- mir_freeAndNil(m_fsi_pszRealPath);
- m_fsi_pszRealPath = mir_t2a(m_pszFile);
-
- ZeroMemory(&m_fsi, sizeof(m_fsi));
- m_fsi.lStructSize = sizeof(STFileShareInfo);
- m_fsi.pszSrvPath = m_fsi_pszSrvPath;
- m_fsi.nMaxDownloads = -1; // -1 = infinite
- m_fsi.pszRealPath = m_fsi_pszRealPath;
- //m_fsi.dwOptions = NULL; //OPT_SEND_LINK only work on single chat;
-
- //start Send thread
- m_bFreeOnExit = TRUE;
- mir_forkthread(&CSendHTTPServer::SendThreadWrapper, this);
-}
-
-void CSendHTTPServer::SendThread() {
- INT_PTR ret;
- mir_freeAndNil(m_URL);
-
- if (ServiceExists(MS_HTTP_GET_LINK)) {
- //patched plugin version
- ret = CallService(MS_HTTP_ADD_CHANGE_REMOVE, (WPARAM)m_hContact, (LPARAM)&m_fsi);
- if (!ret) {
- m_URL = (LPSTR)CallService(MS_HTTP_GET_LINK, (WPARAM)m_fsi.pszSrvPath, NULL);
- }
- }
- else {
- //original plugin
- m_fsi.dwOptions = OPT_SEND_LINK;
-
- //send DATA and wait for reply
- ret = CallService(MS_HTTP_ADD_CHANGE_REMOVE, (WPARAM)m_hContact, (LPARAM)&m_fsi);
- }
-
- if (ret != 0) {
- Error(TranslateT("%s (%i):\nCould not add a share to the HTTP Server plugin."),TranslateTS(m_pszSendTyp),ret);
- Exit(ret);
- }
-
- //Share the file by HTTP Server plugin, SendSS does not own the file anymore = auto-delete won't work
- m_bDeleteAfterSend = false;
-
- if (m_URL && m_URL[0]!= NULL) {
- m_ChatRoom ? svcSendChat(m_URL) : svcSendMsg(m_URL);
- return;
- }
- Exit(ACKRESULT_FAILED);
-}
-
-void CSendHTTPServer::SendThreadWrapper(void * Obj) {
- reinterpret_cast<CSendHTTPServer*>(Obj)->SendThread();
-}
-
-//---------------------------------------------------------------------------
-CSendHTTPServer::CContactMapping CSendHTTPServer::_CContactMapping;
-
-INT_PTR CSendHTTPServer::MyCallService(const char *name, WPARAM wParam, LPARAM lParam) {
- CContactMapping::iterator Contact(_CContactMapping.end());
-/*
- if ( wParam == m_hContact && (
- (strcmp(name, MS_MSG_SENDMESSAGE)== 0) ||
- (strcmp(name, "SRMsg/LaunchMessageWindow")== 0) ))
- {
- m_URL= mir_strdup((char*)lParam);
- return 0;
- }*/
- return g_MirCallService(name, wParam, lParam);
-}
-
+/* + +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 Sérgio 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. +*/ + +//--------------------------------------------------------------------------- +#include "global.h" + +INT_PTR (*g_MirCallService)(const char *, WPARAM, LPARAM)=NULL; +//INT_PTR (*CallService)(const char *,WPARAM,LPARAM); + + +//--------------------------------------------------------------------------- +CSendHTTPServer::CSendHTTPServer(HWND Owner, HANDLE hContact, bool bFreeOnExit) +: CSend(Owner, hContact, bFreeOnExit){ + m_EnableItem = SS_DLG_DESCRIPTION ; //| SS_DLG_AUTOSEND | SS_DLG_DELETEAFTERSSEND; + m_pszSendTyp = _T("HTTPServer transfer"); + m_pszFileName = NULL; + m_URL = NULL; + m_fsi_pszSrvPath = NULL; + m_fsi_pszRealPath = NULL; +} + +CSendHTTPServer::~CSendHTTPServer(){ + mir_free(m_pszFileName); + mir_free(m_URL); + mir_free(m_fsi_pszSrvPath); + mir_free(m_fsi_pszRealPath); +} + +//--------------------------------------------------------------------------- +void CSendHTTPServer::Send() { + + if (CallService(MS_HTTP_ACCEPT_CONNECTIONS, (WPARAM)true, 0) != 0) { + Error(NULL, TranslateT("Could not start the HTTP Server plugin.")); + return; + } + + if (!m_pszFileName) { + m_pszFileName = (LPSTR)GetFileName(m_pszFile, DBVT_ASCIIZ); + } + mir_freeAndNil(m_fsi_pszSrvPath); + mir_stradd(m_fsi_pszSrvPath, "/"); + mir_stradd(m_fsi_pszSrvPath, m_pszFileName); + + mir_freeAndNil(m_fsi_pszRealPath); + m_fsi_pszRealPath = mir_t2a(m_pszFile); + + ZeroMemory(&m_fsi, sizeof(m_fsi)); + m_fsi.lStructSize = sizeof(STFileShareInfo); + m_fsi.pszSrvPath = m_fsi_pszSrvPath; + m_fsi.nMaxDownloads = -1; // -1 = infinite + m_fsi.pszRealPath = m_fsi_pszRealPath; + //m_fsi.dwOptions = NULL; //OPT_SEND_LINK only work on single chat; + + //start Send thread + m_bFreeOnExit = TRUE; + mir_forkthread(&CSendHTTPServer::SendThreadWrapper, this); +} + +void CSendHTTPServer::SendThread() { + INT_PTR ret; + mir_freeAndNil(m_URL); + + if (ServiceExists(MS_HTTP_GET_LINK)) { + //patched plugin version + ret = CallService(MS_HTTP_ADD_CHANGE_REMOVE, (WPARAM)m_hContact, (LPARAM)&m_fsi); + if (!ret) { + m_URL = (LPSTR)CallService(MS_HTTP_GET_LINK, (WPARAM)m_fsi.pszSrvPath, NULL); + } + } + else { + //original plugin + m_fsi.dwOptions = OPT_SEND_LINK; + + //send DATA and wait for reply + ret = CallService(MS_HTTP_ADD_CHANGE_REMOVE, (WPARAM)m_hContact, (LPARAM)&m_fsi); + } + + if (ret != 0) { + Error(TranslateT("%s (%i):\nCould not add a share to the HTTP Server plugin."),TranslateTS(m_pszSendTyp),ret); + Exit(ret); + } + + //Share the file by HTTP Server plugin, SendSS does not own the file anymore = auto-delete won't work + m_bDeleteAfterSend = false; + + if (m_URL && m_URL[0]!= NULL) { + m_ChatRoom ? svcSendChat(m_URL) : svcSendMsg(m_URL); + return; + } + Exit(ACKRESULT_FAILED); +} + +void CSendHTTPServer::SendThreadWrapper(void * Obj) { + reinterpret_cast<CSendHTTPServer*>(Obj)->SendThread(); +} + +//--------------------------------------------------------------------------- +/* +CSendHTTPServer::CContactMapping CSendHTTPServer::_CContactMapping; +INT_PTR CSendHTTPServer::MyCallService(const char *name, WPARAM wParam, LPARAM lParam) { +/ * + CContactMapping::iterator Contact(_CContactMapping.end()); + if ( wParam == m_hContact && ( + (strcmp(name, MS_MSG_SENDMESSAGE)== 0) || + (strcmp(name, "SRMsg/LaunchMessageWindow")== 0) )) + { + m_URL= mir_strdup((char*)lParam); + return 0; + }* / + return g_MirCallService(name, wParam, lParam); +}*/ + diff --git a/plugins/SendScreenshotPlus/src/CSendHTTPServer.h b/plugins/SendScreenshotPlus/src/CSendHTTPServer.h index e4008e152e..b8740e0a2b 100644 --- a/plugins/SendScreenshotPlus/src/CSendHTTPServer.h +++ b/plugins/SendScreenshotPlus/src/CSendHTTPServer.h @@ -1,57 +1,57 @@ -/*
-
-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 Sérgio 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.
-*/
-
-#ifndef _CSEND_HTTP_SERVER_H
-#define _CSEND_HTTP_SERVER_H
-
-//---------------------------------------------------------------------------
-class CSendHTTPServer : public CSend {
- public:
- // Deklaration Standardkonstruktor/Standarddestructor
- CSendHTTPServer(HWND Owner, HANDLE hContact, bool bFreeOnExit);
- ~CSendHTTPServer();
-
- void Send();
-
- protected:
- LPSTR m_pszFileName;
- LPSTR m_URL;
- STFileShareInfo m_fsi;
- LPSTR m_fsi_pszSrvPath;
- LPSTR m_fsi_pszRealPath;
- void SendThread();
- static void SendThreadWrapper(void * Obj);
-
- typedef std::map<HANDLE, CSendHTTPServer *> CContactMapping;
- static CContactMapping _CContactMapping;
-
- static INT_PTR MyCallService(const char *name, WPARAM wParam, LPARAM lParam);
-
-};
-
-//---------------------------------------------------------------------------
-
-#endif
+/* + +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 Sérgio 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. +*/ + +#ifndef _CSEND_HTTP_SERVER_H +#define _CSEND_HTTP_SERVER_H + +//--------------------------------------------------------------------------- +class CSendHTTPServer : public CSend { + public: + // Deklaration Standardkonstruktor/Standarddestructor + CSendHTTPServer(HWND Owner, HANDLE hContact, bool bFreeOnExit); + ~CSendHTTPServer(); + + void Send(); + + protected: + LPSTR m_pszFileName; + LPSTR m_URL; + STFileShareInfo m_fsi; + LPSTR m_fsi_pszSrvPath; + LPSTR m_fsi_pszRealPath; + void SendThread(); + static void SendThreadWrapper(void * Obj); + + typedef std::map<HANDLE, CSendHTTPServer *> CContactMapping; + static CContactMapping _CContactMapping; + +// static INT_PTR MyCallService(const char *name, WPARAM wParam, LPARAM lParam); + +}; + +//--------------------------------------------------------------------------- + +#endif diff --git a/plugins/SendScreenshotPlus/src/CSendImageShack.cpp b/plugins/SendScreenshotPlus/src/CSendImageShack.cpp index 6396315d03..72fb4795c6 100644 --- a/plugins/SendScreenshotPlus/src/CSendImageShack.cpp +++ b/plugins/SendScreenshotPlus/src/CSendImageShack.cpp @@ -1,288 +1,284 @@ -/*
-
-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 Sérgio 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.
-*/
-
-//---------------------------------------------------------------------------
-#include "global.h"
-
-//---------------------------------------------------------------------------
-CSendImageShack::CSendImageShack(HWND Owner, HANDLE hContact, bool bFreeOnExit)
-: CSend(Owner, hContact, bFreeOnExit) {
- m_EnableItem = SS_DLG_AUTOSEND | SS_DLG_DELETEAFTERSSEND | SS_DLG_DESCRIPTION;
- m_pszSendTyp = _T("Image upload");
- m_pszFileName = NULL;
- m_pszContentType = NULL;
- m_MFDRboundary = NULL;
- m_nlreply = NULL;
- m_SendSync = false;
- m_Url = NULL;
-}
-
-CSendImageShack::~CSendImageShack(){
- mir_free(m_pszFileName);
- mir_free(m_MFDRboundary);
- // FREEHTTPREQUESTSTRUCT*
- if (m_nlreply) CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM) m_nlreply);
- mir_free(m_Url);
-};
-
-//---------------------------------------------------------------------------
-void CSendImageShack::Send() {
- // check Netlib
- if( !hNetlibUser ) {
- //PrintError(1,TRUE);
- return;
- }
- if (!m_pszFileName) {
- m_pszFileName = (LPSTR)GetFileName(m_pszFile, DBVT_ASCIIZ);
- }
- if (!m_pszContentType) GetContentType();
-
- // create new boundary
- MFDR_Reset();
-
- // initialize the netlib request
- ZeroMemory(&m_nlhr, sizeof(m_nlhr));
- m_nlhr.cbSize = sizeof(m_nlhr);
- m_nlhr.requestType = REQUEST_POST;
- m_nlhr.flags = NLHRF_HTTP11; //NLHRF_DUMPASTEXT;
- m_nlhr.szUrl = "http://www.imageshack.us/upload_api.php";
- m_nlhr.headersCount = 6;
- { //NETLIBHTTPHEADER start
- m_nlhr.headers=(NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*m_nlhr.headersCount);
- m_nlhr.headers[0].szName = "Referer";
- m_nlhr.headers[0].szValue = "http://www.imageshack.us/upload_api.php";
- m_nlhr.headers[1].szName = "Connection";
- m_nlhr.headers[1].szValue = "Keep-alive";
- m_nlhr.headers[2].szName = "AcceptLanguage";
- m_nlhr.headers[2].szValue = "en-us, pt-br";
- m_nlhr.headers[3].szName = "Host";
- m_nlhr.headers[3].szValue = "imageshack.us";
- m_nlhr.headers[4].szName = "User-Agent";
- m_nlhr.headers[4].szValue = __USER_AGENT_STRING; //szAgent; /;
- //nlhr.headers[x].szName = "Authorization";
- //nlhr.headers[x].szValue = auth; //Basic base-64-authorization
-
- //$header .= "Content-type: multipart/form-data; boundary=" . part::getBoundary() . "\r\n";
- mir_snprintf(m_nlheader_ContentType, SIZEOF(m_nlheader_ContentType), "multipart/form-data; boundary=%s", m_MFDRboundary);
- m_nlhr.headers[m_nlhr.headersCount-1].szName = "Content-Type";
- m_nlhr.headers[m_nlhr.headersCount-1].szValue = m_nlheader_ContentType;
- } //NETLIBHTTPHEADER end
-
-//POST DATA file-header, init DATA with MultipartFormDataRequest
- //$params[] = new filepart('fileupload', $file, basename($file), $contentType, 'iso-8859-1');
- //($this->sendStart($h);)
- AppendToData("--");
- AppendToData(m_MFDRboundary);
- AppendToData("\r\n");
- //($this->sendDispositionHeader($h);)
- AppendToData("Content-Disposition: form-data; name=\"");
- AppendToData("fileupload");
- AppendToData("\"; filename=\"");
- AppendToData(m_pszFileName);
- AppendToData("\"");
- AppendToData("\r\n");
- //($this->sendContentTypeHeader($h);)
- AppendToData("Content-Type: ");
- AppendToData(m_pszContentType);
- AppendToData("; charset=");
- AppendToData("iso-8859-1");
- //($this->sendEndOfHeader($h);)
- AppendToData("\r\n");
- AppendToData("\r\n");
- //Now we add the file binary ($this->sendData($h))
- FILE * fileId = _tfsopen(m_pszFile, _T("rb"), _SH_DENYWR );
- if( !fileId) {
- //PrintError(1,TRUE);
- return;
- }
- fseek(fileId, NULL, SEEK_END);
- size_t lenFile = ftell(fileId);
- size_t sizeDest = sizeof(char)*(m_nlhr.dataLength + lenFile + 1);
- m_nlhr.pData = (char *) mir_realloc(m_nlhr.pData, sizeDest);
- fseek(fileId, NULL, SEEK_SET );
- int i;
- int ch = fgetc( fileId );
- for( i=0; (i < (int)lenFile ) && ( feof( fileId ) == 0 ); i++ ) {
- m_nlhr.pData[m_nlhr.dataLength+i] = (char)ch;
- ch = fgetc( fileId );
- }
- m_nlhr.pData[sizeDest-1] = 0; //NULL Termination for binary data
- m_nlhr.dataLength = (int)sizeDest - 1;
- fclose(fileId);
- //($this->sendEnd($h);)
- AppendToData("\r\n");
-
-//POST DATA footer (for "optimage", 1)
-//POST DATA footer (for "optsize", optsize)
-
-//POST DATA footer (for "tags", tags)
-//POST DATA footer (for "rembar", "yes" : "no")
-//POST DATA footer (for "public", "yes" : "no")
-//POST DATA footer (for "cookie", cookie)
-
-//POST DATA footer (for "key", DEVKEY_IMAGESHACK)
- //($this->sendStart($h);)
- AppendToData("--");
- AppendToData(m_MFDRboundary);
- AppendToData("\r\n");
- //($this->sendDispositionHeader($h);)
- AppendToData("Content-Disposition: form-data; name=\"");
- AppendToData("key");
- AppendToData("\"");
- //($this->sendTransferEncodingHeader($h); )
- AppendToData("\r\n");
- AppendToData("Content-Transfer-Encoding: ");
- AppendToData("8bit"); //??"binary"
- //($this->sendEndOfHeader($h);)
- AppendToData("\r\n");
- AppendToData("\r\n");
- //($this->sendData($h);)
- AppendToData(DEVKEY_IMAGESHACK);
- //($this->sendEnd($h);)
- AppendToData("\r\n");
-
-//POST DATA Exit
- //$postdata = "--" . part::getBoundary() . "--\r\n";
- AppendToData("--");
- AppendToData(m_MFDRboundary);
- AppendToData("--\r\n");
-
-//start upload thread
- if (m_SendSync) {
- m_bFreeOnExit = FALSE;
- SendThread();
- return;
- }
- m_bFreeOnExit = TRUE;
- mir_forkthread(&CSendImageShack::SendThreadWrapper, this);
-}
-
-void CSendImageShack::SendThread() {
- //send DATA and wait for m_nlreply
- m_nlreply = (NETLIBHTTPREQUEST *) CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM) hNetlibUser, (LPARAM) &m_nlhr);
- mir_freeAndNil(m_nlhr.pData);
- mir_freeAndNil(m_nlhr.headers);
- if(m_nlreply){
- if( m_nlreply->resultCode >= 200 && m_nlreply->resultCode < 300 ){
- m_nlreply->pData[m_nlreply->dataLength] = 0;// make sure its null terminated
- const char* URL = NULL;
- LPTSTR err = NULL;
- URL = GetTagContent(m_nlreply->pData, "<image_link>", "</image_link>");
- if (URL && URL[0]!= NULL) {
- m_Url = mir_strdup(URL);
- if(m_SendSync) {
- Exit(ACKRESULT_SUCCESS);
- return;
- }
- m_ChatRoom ? svcSendChat(URL) : svcSendMsg(URL);
- return;
- }
- else{ //check error mess from server
- err = mir_a2t(GetTagContent(m_nlreply->pData, "<error ", "</error>"));
- if (err && err[0]!= NULL) { //parsed err messege
- Error(NULL, err);
- }
- else{ //fallback to server response mess
- mir_freeAndNil(err);
- err = mir_a2t(m_nlreply->pData);
- }
- mir_free(err);
- }
- }
- else {
- Error(NULL, TranslateT("Upload server did not respond timely."));
- }
- CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM) m_nlreply);
- m_nlreply = NULL;
- }
- else {
- Error(SS_ERR_INIT, m_pszSendTyp);
- }
- Exit(ACKRESULT_FAILED);
-}
-
-void CSendImageShack::SendThreadWrapper(void * Obj) {
- reinterpret_cast<CSendImageShack*>(Obj)->SendThread();
-}
-
-//---------------------------------------------------------------------------
-void CSendImageShack::MFDR_Reset() {
- char Temp[64];
- DWORD dwBoundaryRand1 = GetTickCount();
- DWORD dwBoundaryRand2 = rand();
-
- mir_freeAndNil(m_MFDRboundary);
- mir_snprintf(Temp, SIZEOF(Temp), "B-O-U-N-D-A-R-Y%u%u", dwBoundaryRand1, dwBoundaryRand2);
- mir_stradd(m_MFDRboundary,Temp);
-}
-
-void CSendImageShack::GetContentType() {
- if (m_pszContentType) mir_freeAndNil(m_pszContentType);
- LPSTR FileExtension = (LPSTR)GetFileExt(m_pszFile, DBVT_ASCIIZ);
-
- if ((strcmp(FileExtension, ".jpeg")==0) || (strcmp(FileExtension, ".jpe")==0) || (strcmp(FileExtension ,".jpg")==0))
- m_pszContentType="image/jpeg";
- else if (strcmp(FileExtension, ".bmp")==0)
- m_pszContentType="image/bmp";
- else if (strcmp(FileExtension, ".png")==0)
- m_pszContentType="image/png";
- else if (strcmp(FileExtension, ".gif")==0)
- m_pszContentType="image/gif";
- else if ((strcmp(FileExtension, ".tif")==0) || (strcmp(FileExtension, ".tiff")==0))
- m_pszContentType="image/tiff";
- else
- m_pszContentType="application/octet-stream";
-
- mir_free(FileExtension);
- return;
-}
-
-void CSendImageShack::AppendToData(const char *pszVal) {
- if (!m_nlhr.pData) {
- m_nlhr.pData = mir_strdup(pszVal);
- m_nlhr.dataLength = (int)strlen(pszVal);
- }
- else {
- size_t lenVal = strlen(pszVal);
- size_t sizeNew = sizeof(char)*(m_nlhr.dataLength + lenVal + 1);
- m_nlhr.pData = (char*) mir_realloc(m_nlhr.pData, sizeNew);
-
- strcpy(m_nlhr.pData + sizeof(char)*m_nlhr.dataLength, pszVal);
- m_nlhr.pData[sizeNew-1] = 0;
- m_nlhr.dataLength = (int)sizeNew -1;
- }
-}
-
-//---------------------------------------------------------------------------
-const char * CSendImageShack::GetTagContent(char * pszSource, const char * pszTagStart, const char * pszTagEnd) {
- char * b = strstr(pszSource, pszTagStart);
- if (!b) return NULL;
- b += strlen(pszTagStart);
- char * e = strstr(b, pszTagEnd);
- if (e) *e = 0;
- return b;
-}
-
+/* + +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 Sérgio 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. +*/ + +//--------------------------------------------------------------------------- +#include "global.h" + +//--------------------------------------------------------------------------- +CSendImageShack::CSendImageShack(HWND Owner, HANDLE hContact, bool bFreeOnExit) +: CSend(Owner, hContact, bFreeOnExit) { + m_EnableItem = SS_DLG_AUTOSEND | SS_DLG_DELETEAFTERSSEND | SS_DLG_DESCRIPTION; + m_pszSendTyp = _T("Image upload"); + m_pszFileName = NULL; + m_pszContentType = NULL; + m_MFDRboundary = NULL; + m_nlreply = NULL; + m_SendSync = false; + m_Url = NULL; +} + +CSendImageShack::~CSendImageShack(){ + mir_free(m_pszFileName); + mir_free(m_MFDRboundary); + // FREEHTTPREQUESTSTRUCT* + if (m_nlreply) CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM) m_nlreply); + mir_free(m_Url); +}; + +//--------------------------------------------------------------------------- +void CSendImageShack::Send() { + // check Netlib + if( !hNetlibUser ) { + //PrintError(1,TRUE); + return; + } + if (!m_pszFileName) { + m_pszFileName = (LPSTR)GetFileName(m_pszFile, DBVT_ASCIIZ); + } + if (!m_pszContentType) GetContentType(); + + // create new boundary + MFDR_Reset(); + + // initialize the netlib request + ZeroMemory(&m_nlhr, sizeof(m_nlhr)); + m_nlhr.cbSize = sizeof(m_nlhr); + m_nlhr.requestType = REQUEST_POST; + m_nlhr.flags = NLHRF_HTTP11; //NLHRF_DUMPASTEXT; + m_nlhr.szUrl = "http://www.imageshack.us/upload_api.php"; + m_nlhr.headersCount = 6; + { //NETLIBHTTPHEADER start + m_nlhr.headers=(NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*m_nlhr.headersCount); + m_nlhr.headers[0].szName = "Referer"; + m_nlhr.headers[0].szValue = "http://www.imageshack.us/upload_api.php"; + m_nlhr.headers[1].szName = "Connection"; + m_nlhr.headers[1].szValue = "Keep-alive"; + m_nlhr.headers[2].szName = "AcceptLanguage"; + m_nlhr.headers[2].szValue = "en-us, pt-br"; + m_nlhr.headers[3].szName = "Host"; + m_nlhr.headers[3].szValue = "imageshack.us"; + m_nlhr.headers[4].szName = "User-Agent"; + m_nlhr.headers[4].szValue = __USER_AGENT_STRING; //szAgent; /; + //nlhr.headers[x].szName = "Authorization"; + //nlhr.headers[x].szValue = auth; //Basic base-64-authorization + + //$header .= "Content-type: multipart/form-data; boundary=" . part::getBoundary() . "\r\n"; + mir_snprintf(m_nlheader_ContentType, SIZEOF(m_nlheader_ContentType), "multipart/form-data; boundary=%s", m_MFDRboundary); + m_nlhr.headers[m_nlhr.headersCount-1].szName = "Content-Type"; + m_nlhr.headers[m_nlhr.headersCount-1].szValue = m_nlheader_ContentType; + } //NETLIBHTTPHEADER end + +//POST DATA file-header, init DATA with MultipartFormDataRequest + //$params[] = new filepart('fileupload', $file, basename($file), $contentType, 'iso-8859-1'); + //($this->sendStart($h);) + AppendToData("--"); + AppendToData(m_MFDRboundary); + AppendToData("\r\n"); + //($this->sendDispositionHeader($h);) + AppendToData("Content-Disposition: form-data; name=\""); + AppendToData("fileupload"); + AppendToData("\"; filename=\""); + AppendToData(m_pszFileName); + AppendToData("\""); + AppendToData("\r\n"); + //($this->sendContentTypeHeader($h);) + AppendToData("Content-Type: "); + AppendToData(m_pszContentType); + AppendToData("; charset="); + AppendToData("iso-8859-1"); + //($this->sendEndOfHeader($h);) + AppendToData("\r\n"); + AppendToData("\r\n"); + //Now we add the file binary ($this->sendData($h)) + FILE * fileId = _tfsopen(m_pszFile, _T("rb"), _SH_DENYWR ); + if( !fileId) { + //PrintError(1,TRUE); + return; + } + fseek(fileId, NULL, SEEK_END); + size_t lenFile = ftell(fileId); + size_t sizeDest = sizeof(char)*(m_nlhr.dataLength + lenFile + 1); + m_nlhr.pData = (char *) mir_realloc(m_nlhr.pData, sizeDest); + fseek(fileId, NULL, SEEK_SET ); + int i; + int ch = fgetc( fileId ); + for( i=0; (i < (int)lenFile ) && ( feof( fileId ) == 0 ); i++ ) { + m_nlhr.pData[m_nlhr.dataLength+i] = (char)ch; + ch = fgetc( fileId ); + } + m_nlhr.pData[sizeDest-1] = 0; //NULL Termination for binary data + m_nlhr.dataLength = (int)sizeDest - 1; + fclose(fileId); + //($this->sendEnd($h);) + AppendToData("\r\n"); + +//POST DATA footer (for "optimage", 1) +//POST DATA footer (for "optsize", optsize) + +//POST DATA footer (for "tags", tags) +//POST DATA footer (for "rembar", "yes" : "no") +//POST DATA footer (for "public", "yes" : "no") +//POST DATA footer (for "cookie", cookie) + +//POST DATA footer (for "key", DEVKEY_IMAGESHACK) + //($this->sendStart($h);) + AppendToData("--"); + AppendToData(m_MFDRboundary); + AppendToData("\r\n"); + //($this->sendDispositionHeader($h);) + AppendToData("Content-Disposition: form-data; name=\""); + AppendToData("key"); + AppendToData("\""); + //($this->sendTransferEncodingHeader($h); ) + AppendToData("\r\n"); + AppendToData("Content-Transfer-Encoding: "); + AppendToData("8bit"); //??"binary" + //($this->sendEndOfHeader($h);) + AppendToData("\r\n"); + AppendToData("\r\n"); + //($this->sendData($h);) + AppendToData(DEVKEY_IMAGESHACK); + //($this->sendEnd($h);) + AppendToData("\r\n"); + +//POST DATA Exit + //$postdata = "--" . part::getBoundary() . "--\r\n"; + AppendToData("--"); + AppendToData(m_MFDRboundary); + AppendToData("--\r\n"); + +//start upload thread + if (m_SendSync) { + m_bFreeOnExit = FALSE; + SendThread(); + return; + } + m_bFreeOnExit = TRUE; + mir_forkthread(&CSendImageShack::SendThreadWrapper, this); +} + +void CSendImageShack::SendThread() { + //send DATA and wait for m_nlreply + m_nlreply = (NETLIBHTTPREQUEST *) CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM) hNetlibUser, (LPARAM) &m_nlhr); + mir_freeAndNil(m_nlhr.pData); + mir_freeAndNil(m_nlhr.headers); + if(m_nlreply){ + if( m_nlreply->resultCode >= 200 && m_nlreply->resultCode < 300 ){ + m_nlreply->pData[m_nlreply->dataLength] = 0;// make sure its null terminated + const char* URL = NULL; + URL = GetTagContent(m_nlreply->pData, "<image_link>", "</image_link>"); + if (URL && URL[0]!= NULL) { + m_Url = mir_strdup(URL); + if(m_SendSync) { + Exit(ACKRESULT_SUCCESS); + return; + } + m_ChatRoom ? svcSendChat(URL) : svcSendMsg(URL); + return; + }else{//check error mess from server + LPTSTR err = mir_a2t(GetTagContent(m_nlreply->pData, "<error ", "</error>")); + if (!err || !*err){//fallback to server response mess + mir_freeAndNil(err); + err = mir_a2t(m_nlreply->pData); + } + Error(NULL, err); + mir_free(err); + } + } + else { + Error(NULL, TranslateT("Upload server did not respond timely.")); + } + CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM) m_nlreply); + m_nlreply = NULL; + } + else { + Error(SS_ERR_INIT, m_pszSendTyp); + } + Exit(ACKRESULT_FAILED); +} + +void CSendImageShack::SendThreadWrapper(void * Obj) { + reinterpret_cast<CSendImageShack*>(Obj)->SendThread(); +} + +//--------------------------------------------------------------------------- +void CSendImageShack::MFDR_Reset() { + char Temp[64]; + DWORD dwBoundaryRand1 = GetTickCount(); + DWORD dwBoundaryRand2 = rand(); + + mir_freeAndNil(m_MFDRboundary); + mir_snprintf(Temp, SIZEOF(Temp), "B-O-U-N-D-A-R-Y%u%u", dwBoundaryRand1, dwBoundaryRand2); + mir_stradd(m_MFDRboundary,Temp); +} + +void CSendImageShack::GetContentType() { + if (m_pszContentType) mir_freeAndNil(m_pszContentType); + LPSTR FileExtension = (LPSTR)GetFileExt(m_pszFile, DBVT_ASCIIZ); + + if ((strcmp(FileExtension, ".jpeg")==0) || (strcmp(FileExtension, ".jpe")==0) || (strcmp(FileExtension ,".jpg")==0)) + m_pszContentType="image/jpeg"; + else if (strcmp(FileExtension, ".bmp")==0) + m_pszContentType="image/bmp"; + else if (strcmp(FileExtension, ".png")==0) + m_pszContentType="image/png"; + else if (strcmp(FileExtension, ".gif")==0) + m_pszContentType="image/gif"; + else if ((strcmp(FileExtension, ".tif")==0) || (strcmp(FileExtension, ".tiff")==0)) + m_pszContentType="image/tiff"; + else + m_pszContentType="application/octet-stream"; + + mir_free(FileExtension); + return; +} + +void CSendImageShack::AppendToData(const char *pszVal) { + if (!m_nlhr.pData) { + m_nlhr.pData = mir_strdup(pszVal); + m_nlhr.dataLength = (int)strlen(pszVal); + } + else { + size_t lenVal = strlen(pszVal); + size_t sizeNew = sizeof(char)*(m_nlhr.dataLength + lenVal + 1); + m_nlhr.pData = (char*) mir_realloc(m_nlhr.pData, sizeNew); + + strcpy(m_nlhr.pData + sizeof(char)*m_nlhr.dataLength, pszVal); + m_nlhr.pData[sizeNew-1] = 0; + m_nlhr.dataLength = (int)sizeNew -1; + } +} + +//--------------------------------------------------------------------------- +const char * CSendImageShack::GetTagContent(char * pszSource, const char * pszTagStart, const char * pszTagEnd) { + char * b = strstr(pszSource, pszTagStart); + if (!b) return NULL; + b += strlen(pszTagStart); + char * e = strstr(b, pszTagEnd); + if (e) *e = 0; + return b; +} + diff --git a/plugins/SendScreenshotPlus/src/CSendImageShack.h b/plugins/SendScreenshotPlus/src/CSendImageShack.h index d5343c711a..c5077e437f 100644 --- a/plugins/SendScreenshotPlus/src/CSendImageShack.h +++ b/plugins/SendScreenshotPlus/src/CSendImageShack.h @@ -1,66 +1,65 @@ -/*
-
-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 Sérgio 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.
-*/
-
-#ifndef _CSEND_IMAGESHACK_H
-#define _CSEND_IMAGESHACK_H
-
-//---------------------------------------------------------------------------
-class CSendImageShack : public CSend {
- public:
- // Deklaration Standardkonstruktor/Standarddestructor
- CSendImageShack(HWND Owner, HANDLE hContact, bool bFreeOnExit);
- ~CSendImageShack();
-
- void Send();
- void SendSync(bool Sync) {m_SendSync = Sync;};
- LPSTR GetURL(){return m_Url;};
- LPSTR GetError(){return mir_t2a(m_ErrorMsg);};
-
- protected:
- LPSTR m_pszFileName;
- NETLIBHTTPREQUEST m_nlhr;
- NETLIBHTTPREQUEST* m_nlreply;
- NETLIBHTTPHEADER* m_nlheader;
- char m_nlheader_ContentType[64];
- LPSTR m_Url;
-
- void AppendToData(const char *pszVal); //append to netlib DATA
- LPSTR m_pszContentType; //hold mimeType (does not need free)
- void GetContentType(); //get mimeType
- const char * GetTagContent(char * pszSource, const char * pszTagStart, const char * pszTagEnd);
-
- char* m_MFDRboundary;
- void MFDR_Reset();
-
- bool m_SendSync;
- void SendThread();
- static void SendThreadWrapper(void * Obj);
-
-};
-
-//---------------------------------------------------------------------------
-
-#endif
+/* + +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 Sérgio 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. +*/ + +#ifndef _CSEND_IMAGESHACK_H +#define _CSEND_IMAGESHACK_H + +//--------------------------------------------------------------------------- +class CSendImageShack : public CSend { + public: + // Deklaration Standardkonstruktor/Standarddestructor + CSendImageShack(HWND Owner, HANDLE hContact, bool bFreeOnExit); + ~CSendImageShack(); + + void Send(); + void SendSync(bool Sync) {m_SendSync = Sync;}; + LPSTR GetURL(){return m_Url;}; + LPSTR GetError(){return mir_t2a(m_ErrorMsg);}; + + protected: + LPSTR m_pszFileName; + NETLIBHTTPREQUEST m_nlhr; + NETLIBHTTPREQUEST* m_nlreply; + char m_nlheader_ContentType[64]; + LPSTR m_Url; + + void AppendToData(const char *pszVal); //append to netlib DATA + LPSTR m_pszContentType; //hold mimeType (does not need free) + void GetContentType(); //get mimeType + const char * GetTagContent(char * pszSource, const char * pszTagStart, const char * pszTagEnd); + + char* m_MFDRboundary; + void MFDR_Reset(); + + bool m_SendSync; + void SendThread(); + static void SendThreadWrapper(void * Obj); + +}; + +//--------------------------------------------------------------------------- + +#endif diff --git a/plugins/SendScreenshotPlus/src/UAboutForm.cpp b/plugins/SendScreenshotPlus/src/UAboutForm.cpp index 98a533d4ab..5007deda1f 100644 --- a/plugins/SendScreenshotPlus/src/UAboutForm.cpp +++ b/plugins/SendScreenshotPlus/src/UAboutForm.cpp @@ -63,10 +63,8 @@ INT_PTR CALLBACK TfrmAbout::DlgTfrmAbout(HWND hWnd, UINT msg, WPARAM wParam, LPA reinterpret_cast<TfrmAbout*>(lParam)->m_hWnd = hWnd; return wnd->second->wmInitdialog(wParam, lParam); } - else { - wnd = _HandleMapping.find(hWnd); - } - if (wnd == _HandleMapping.end()) { // something screwed up + wnd=_HandleMapping.find(hWnd); + if (wnd==_HandleMapping.end()) { // something screwed up return FALSE; //dialog! do not use ::DefWindowProc(hWnd, msg, wParam, lParam); } @@ -148,9 +146,7 @@ LRESULT TfrmAbout::wmInitdialog(WPARAM wParam, LPARAM lParam) { LRESULT TfrmAbout::wmCommand(WPARAM wParam, LPARAM lParam) { //--------------------------------------------------------------------------- if (HIWORD(wParam) == BN_CLICKED) { - int IDControl = LOWORD(wParam); - HWND hCtrl = (HWND)lParam; - switch(IDControl) { + switch(LOWORD(wParam)) { case IDCANCEL: case IDCLOSE: break; diff --git a/plugins/SendScreenshotPlus/src/UMainForm.cpp b/plugins/SendScreenshotPlus/src/UMainForm.cpp index b925da9f52..16c6dac8c4 100644 --- a/plugins/SendScreenshotPlus/src/UMainForm.cpp +++ b/plugins/SendScreenshotPlus/src/UMainForm.cpp @@ -66,11 +66,9 @@ INT_PTR CALLBACK TfrmMain::DlgProc_CaptureWindow(HWND hDlg, UINT uMsg, WPARAM wP //SetBkMode((HDC)wParam,OPAQUE); //return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); return (LRESULT)GetStockObject(WHITE_BRUSH); - break; default: SetBkMode((HDC)wParam, TRANSPARENT); return (LRESULT)GetStockObject(NULL_BRUSH); - break; } break; //this return false case WM_COMMAND: @@ -110,11 +108,9 @@ INT_PTR CALLBACK TfrmMain::DlgProc_CaptureDesktop(HWND hDlg, UINT uMsg, WPARAM w SetBkColor((HDC)wParam,GetSysColor(COLOR_WINDOW)); SetTextColor((HDC)wParam,GetSysColor(COLOR_WINDOWTEXT)); return (LRESULT)GetStockObject(WHITE_BRUSH); - break; default: SetBkMode((HDC)wParam, TRANSPARENT); return (LRESULT)GetStockObject(NULL_BRUSH); - break; } break; case WM_COMMAND: @@ -142,59 +138,53 @@ LRESULT CALLBACK TfrmMain::DlgTfrmMain(HWND hWnd, UINT msg, WPARAM wParam, LPARA SetTextColor((HDC)wParam,GetSysColor(COLOR_WINDOWTEXT)); break; default: - return FALSE; + return 0; } SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); return (LRESULT)GetStockObject(WHITE_BRUSH); //GetSysColorBrush(COLOR_WINDOW); } - CHandleMapping::iterator wnd(_HandleMapping.end()); - if (msg == WM_INITDIALOG) { + CHandleMapping::iterator wnd; + if(msg==WM_INITDIALOG) { wnd = _HandleMapping.insert(CHandleMapping::value_type(hWnd, reinterpret_cast<TfrmMain*>(lParam))).first; - reinterpret_cast<TfrmMain*>(lParam)->m_hWnd = hWnd; - return wnd->second->wmInitdialog(wParam, lParam); + wnd->second->m_hWnd = hWnd; + wnd->second->wmInitdialog(wParam, lParam); + return 0; } - else { - wnd = _HandleMapping.find(hWnd); - } - if (wnd == _HandleMapping.end()) { // something screwed up - return FALSE; //dialog! do not use ::DefWindowProc(hWnd, msg, wParam, lParam); + wnd=_HandleMapping.find(hWnd); + if(wnd==_HandleMapping.end()) { //something screwed up dialog! + return 0; //do not use ::DefWindowProc(hWnd, msg, wParam, lParam); } - switch (msg) - { - // case WM_INITDIALOG: done on top + switch (msg){ case WM_COMMAND: - return wnd->second->wmCommand(wParam, lParam); + wnd->second->wmCommand(wParam, lParam); break; case WM_CLOSE: - return wnd->second->wmClose(wParam, lParam); + wnd->second->wmClose(wParam, lParam); break; case WM_DESTROY: delete wnd->second; break; - case UM_TAB1: - return wnd->second->UMTab1(wParam, lParam); - break; case WM_NOTIFY: - return wnd->second->wmNotify(wParam, lParam); + wnd->second->wmNotify(wParam, lParam); break; case WM_TIMER: - return wnd->second->wmTimer(wParam, lParam); + wnd->second->wmTimer(wParam, lParam); break; case UM_CLOSING: - return wnd->second->UMClosing(wParam, lParam); + wnd->second->UMClosing(wParam, lParam); break; case UM_EVENT: - return wnd->second->UMevent(wParam, lParam); + wnd->second->UMevent(wParam, lParam); break; } - return FALSE; + return 0; } //--------------------------------------------------------------------------- //WM_INITDIALOG: -LRESULT TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { +void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { HWND hCtrl; //Taskbar and Window icon SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW1, true)); @@ -372,11 +362,10 @@ LRESULT TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { // CheckDlgButton(m_hWnd,ID_chkEditor, m_opt_chkEditor ? BST_CHECKED : BST_UNCHECKED); TranslateDialogDefault(m_hWnd); - return FALSE; } //WM_COMMAND: -LRESULT TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) { +void TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) { //--------------------------------------------------------------------------- int IDControl = LOWORD(wParam); switch (HIWORD(wParam)) { @@ -385,7 +374,6 @@ LRESULT TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) { case IDCANCEL: case IDCLOSE: break; - case ID_chkTimed: m_opt_chkTimed = (BYTE)Button_GetCheck((HWND)lParam); TfrmMain::chkTimedClick(); @@ -408,13 +396,11 @@ LRESULT TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) { case ID_btnExplore: TfrmMain::btnExploreClick(); break; - case ID_btnDesc: - { + case ID_btnDesc:{ m_opt_btnDesc = (m_opt_btnDesc == 0); HICON hIcon = IcoLib_GetIcon(m_opt_btnDesc ? ICO_PLUG_SSDESKON : ICO_PLUG_SSDESKOFF); SendMessage((HWND)lParam, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); - } - break; + break;} case ID_btnDeleteAfterSend: { m_opt_btnDeleteAfterSend = (m_opt_btnDeleteAfterSend == 0); @@ -470,23 +456,22 @@ LRESULT TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) { default: break; } - return FALSE; } //WM_CLOSE: -LRESULT TfrmMain::wmClose(WPARAM wParam, LPARAM lParam) { +void TfrmMain::wmClose(WPARAM wParam, LPARAM lParam) { DestroyWindow(m_hWnd); - return FALSE; + return; } //WM_TIMER: -LRESULT TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam) { +void TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam) {// @todo : improve this if (wParam == ID_bvlTarget) { // Timer for Target selector if (m_hCursor) { //imgTarget is activ //LmouseButton = false if (!GetLmouse()) { TfrmMain::imgTargetMouseUp(); - return FALSE; + return; } //Timer action if LmouseButton = true m_hLastWin = m_hTargetWindow; @@ -517,7 +502,7 @@ LRESULT TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam) { DrawBorderInverted(hCurrentWin); m_hTargetWindow = hCurrentWin; } - return FALSE; + return; } //imgTarget is not activ (check if cursor is over ID_bvlTarget control) RECT rc; @@ -545,23 +530,23 @@ LRESULT TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam) { m_bCapture = true; switch (m_opt_tabCapture) { case 0: - m_Screenshot = CaptureWindow(m_hTargetWindow, (BOOL)m_opt_chkClientArea); + m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea); break; case 1: m_Screenshot = CaptureMonitor((m_opt_cboxDesktop > 0) ? m_Monitors[m_opt_cboxDesktop-1].szDevice : NULL); break; default: - KillTimer(m_hWnd,wParam); + KillTimer(m_hWnd,ID_chkTimed); m_bCapture = false; #ifdef _DEBUG OutputDebugStringA("SS Bitmap Timer Stop (no tabCapture)\r\n" ); #endif - return FALSE; + return; } if (!m_Screenshot) m_bCapture = false; } if (m_Screenshot) { - KillTimer(m_hWnd,wParam); + KillTimer(m_hWnd,ID_chkTimed); m_bCapture = false; #ifdef _DEBUG OutputDebugStringA("SS Bitmap Timer Stop (CaptureDone)\r\n" ); @@ -569,11 +554,10 @@ LRESULT TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam) { SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone); } } - return FALSE; } //WM_NOTIFY: -LRESULT TfrmMain::wmNotify(WPARAM wParam, LPARAM lParam) { +void TfrmMain::wmNotify(WPARAM wParam, LPARAM lParam) { switch(((LPNMHDR)lParam)->idFrom) { case IDC_CAPTURETAB: //TabControl IDC_CAPTURETAB switch (((LPNMHDR)lParam)->code) { @@ -609,11 +593,10 @@ LRESULT TfrmMain::wmNotify(WPARAM wParam, LPARAM lParam) { default: break; } - return FALSE; } //UM_CLOSING: -LRESULT TfrmMain::UMClosing(WPARAM wParam, LPARAM lParam) { +void TfrmMain::UMClosing(WPARAM wParam, LPARAM lParam) { HWND hWnd = (HWND)wParam; switch (lParam) { case IDD_UAboutForm: @@ -625,7 +608,6 @@ LRESULT TfrmMain::UMClosing(WPARAM wParam, LPARAM lParam) { default: break; } - return FALSE; } //UM_TAB1: @@ -644,7 +626,7 @@ LRESULT TfrmMain::UMTab1(WPARAM wParam, LPARAM lParam) { } //UM_EVENT: -LRESULT TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) { +void TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) { //HWND hWnd = (HWND)wParam; switch (lParam) { case EVT_CaptureDone: @@ -652,7 +634,7 @@ LRESULT TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) { TCHAR *err = TranslateT("Can't create a Screenshot"); MessageBox(m_hWnd,err,ERROR_TITLE,MB_OK|MB_ICONWARNING); Show(); - return FALSE; + return; } if (m_opt_chkEditor) { /* TfrmEdit *frmEdit=new TfrmEdit(this); @@ -666,7 +648,7 @@ LRESULT TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) { delete Screenshot; // This way we can delete it after the method returns Screenshot = NULL; */ - return FALSE; + return; } else { FormClose(); @@ -682,8 +664,7 @@ LRESULT TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) { } m_hTargetWindow = m_hLastWin = NULL; Show(); - } - else { + }else{ // Saving Options and close SaveOptions(); Close(); @@ -692,7 +673,6 @@ LRESULT TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) { default: break; } - return FALSE; } //--------------------------------------------------------------------------- @@ -798,14 +778,14 @@ void TfrmMain::Init(LPTSTR DestFolder, HANDLE Contact) { void TfrmMain::btnCaptureClick() { m_bFormEdit = false; //until UEditForm is includet - if (m_opt_tabCapture == 0 && m_hTargetWindow == 0) { + if(m_opt_tabCapture==1) m_hTargetWindow=GetDesktopWindow(); + else if(!m_hTargetWindow) { TCHAR *err = TranslateT("Select a target window."); MessageBox(m_hWnd,err,ERROR_TITLE,MB_OK|MB_ICONWARNING); return; } TfrmMain::Hide(); - if (!m_hTargetWindow) m_hTargetWindow = GetDesktopWindow(); if (m_opt_chkTimed) { SetTimer(m_hWnd, ID_chkTimed, m_opt_edtTimed ? m_opt_edtTimed*1000 : 500, NULL); @@ -815,7 +795,7 @@ void TfrmMain::btnCaptureClick() { SetTimer(m_hWnd, ID_chkTimed, 500, NULL); } else { - m_Screenshot = CaptureWindow(m_hTargetWindow, (BOOL)(m_opt_chkClientArea)); + m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea); SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone); } } @@ -887,12 +867,12 @@ void TfrmMain::cboxSendByChange() { itemFlag = m_cSend->GetEnableItem(); m_cSend->m_bDeleteAfterSend = m_opt_btnDeleteAfterSend; } - bState = ((itemFlag & SS_DLG_DELETEAFTERSSEND) == SS_DLG_DELETEAFTERSSEND); + bState = (itemFlag & SS_DLG_DELETEAFTERSSEND); hIcon = IcoLib_GetIcon(m_opt_btnDeleteAfterSend ? ICO_PLUG_SSDELON : ICO_PLUG_SSDELOFF); SendMessage(GetDlgItem(m_hWnd, ID_btnDeleteAfterSend), BM_SETIMAGE, IMAGE_ICON, (LPARAM)(bState ? hIcon : 0)); Button_Enable(GetDlgItem(m_hWnd, ID_btnDeleteAfterSend), bState); - bState = ((itemFlag & SS_DLG_DESCRIPTION) == SS_DLG_DESCRIPTION); + bState = (itemFlag & SS_DLG_DESCRIPTION); hIcon = IcoLib_GetIcon(m_opt_btnDesc ? ICO_PLUG_SSDESKON : ICO_PLUG_SSDESKOFF); SendMessage(GetDlgItem(m_hWnd, ID_btnDesc), BM_SETIMAGE, IMAGE_ICON, (LPARAM)(bState ? hIcon : 0)); Button_Enable(GetDlgItem(m_hWnd, ID_btnDesc), bState); @@ -959,7 +939,7 @@ void TfrmMain::edtSizeUpdate(RECT rect, HWND hTarget, UINT Ctrl) { INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { //generate File name FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; - LPTSTR ret = NULL; + LPTSTR ret; LPTSTR path = NULL; LPTSTR pszFilename = NULL; LPTSTR pszFileDesc = NULL; @@ -968,8 +948,8 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { //Generate FileName mir_tcsadd(path, m_FDestFolder); if (path[_tcslen(path)-1] != _T('\\')) mir_tcsadd(path, _T("\\")); - mir_tcsadd(path, _T("shot%.5ld")); - int FileNumber=db_get_dw(NULL, SZ_SENDSS, "FileNumber", 0) + 1; + mir_tcsadd(path, _T("shot%.5u")); + unsigned FileNumber=db_get_dw(NULL, SZ_SENDSS, "FileNumber", 0) + 1; // '00000'-'%.5ld'=0 (add more or less len if differ from 5 size_t len = (_tcslen(path)+0+1); pszFilename = (LPTSTR)mir_alloc(sizeof(TCHAR)*(len)); @@ -1013,18 +993,9 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { break; } - - if ((FIP->FI_GetICCProfile(dib_new)->flags & FIICC_COLOR_IS_CMYK) == FIICC_COLOR_IS_CMYK) { - // we are in CMYK colour space - bool bDummy = false; - } - else { - // we are in RGB colour space - bool bDummy = true; - } +// bool bDummy = !(FIP->FI_GetICCProfile(dib_new)->flags & FIICC_COLOR_IS_CMYK); - FIBITMAP *dib32 = NULL; - FIBITMAP *dib24 = NULL; + FIBITMAP *dib32,*dib24; HWND hwndCombo = GetDlgItem(m_hWnd, ID_cboxFormat); switch (ComboBox_GetItemData(hwndCombo, ComboBox_GetCurSel(hwndCombo))) { case 0: //PNG @@ -1042,18 +1013,18 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { */ dib32 = FIP->FI_Composite(dib_new,FALSE,&m_AlphaColor,NULL); dib24 = FIP->FI_ConvertTo24Bits(dib32); - FIP->FI_Unload(dib32); dib32 = NULL; + FIP->FI_Unload(dib32); ret = SaveImage(fif,dib24, pszFilename, _T("jpg")); - FIP->FI_Unload(dib24); dib24 = NULL; + FIP->FI_Unload(dib24); break; case 2: //BMP // ret = SaveImage(FIF_BMP,dib_new, pszFilename, _T("bmp")); //32bit alpha BMP dib32 = FIP->FI_Composite(dib_new,FALSE,&m_AlphaColor,NULL); dib24 = FIP->FI_ConvertTo24Bits(dib32); - FIP->FI_Unload(dib32); dib32 = NULL; + FIP->FI_Unload(dib32); ret = SaveImage(FIF_BMP,dib24, pszFilename, _T("bmp")); - FIP->FI_Unload(dib24); dib24 = NULL; + FIP->FI_Unload(dib24); break; case 3: //TIFF (miranda freeimage interface do not support save tiff, we udse GDI+) @@ -1064,11 +1035,12 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { dib32 = FIP->FI_Composite(dib_new,FALSE,&m_AlphaColor,NULL); dib24 = FIP->FI_ConvertTo24Bits(dib32); - FIP->FI_Unload(dib32); dib32 = NULL; + FIP->FI_Unload(dib32); HBITMAP hBmp = FIP->FI_CreateHBITMAPFromDIB(dib24); - FIP->FI_Unload(dib24); dib24 = NULL; - ret = SaveTIF(hBmp, pszFile) ? NULL : pszFile; + FIP->FI_Unload(dib24); + SaveTIF(hBmp, pszFile); + ret=pszFile; DeleteObject(hBmp); } break; @@ -1077,13 +1049,13 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { { //dib24 = FIP->FI_ConvertTo8Bits(dib_new); //ret = SaveImage(FIF_GIF,dib24, pszFilename, _T("gif")); - //FIP->FI_Unload(dib24); dib24 = NULL; + //FIP->FI_Unload(dib24); LPTSTR pszFile = NULL; mir_tcsadd(pszFile, pszFilename); mir_tcsadd(pszFile, _T(".gif")); HBITMAP hBmp = FIP->FI_CreateHBITMAPFromDIB(dib_new); SaveGIF(hBmp, pszFile); - ret = pszFile; + ret=pszFile; DeleteObject(hBmp); } break; @@ -1111,18 +1083,17 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { FIP->FI_Unload(dib_save); dib_save = NULL; } }*/ - FIP->FI_Unload(dib_new); dib_new = NULL; + FIP->FI_Unload(dib_new); mir_freeAndNil(pszFilename); if (ret) { - db_set_dw(NULL, SZ_SENDSS, "FileNumber", (DWORD)FileNumber); + db_set_dw(NULL, SZ_SENDSS, "FileNumber", FileNumber); mir_freeAndNil(m_pszFile); mir_freeAndNil(m_pszFileDesc); m_pszFile = ret; if (IsWindowEnabled(GetDlgItem(m_hWnd, ID_btnDesc)) && m_opt_btnDesc) { m_pszFileDesc = pszFileDesc; - } - else { + }else{ mir_tcsadd(m_pszFileDesc, _T("")); } @@ -1132,10 +1103,10 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) { m_cSend->m_pszFile = mir_tstrdup(m_pszFile); m_cSend->m_pszFileDesc = mir_tstrdup(m_pszFileDesc); } + mir_free(ret); return 0; //OK } - mir_freeAndNil(ret); - mir_freeAndNil(pszFileDesc); + mir_free(pszFileDesc); return 1; //error } diff --git a/plugins/SendScreenshotPlus/src/UMainForm.h b/plugins/SendScreenshotPlus/src/UMainForm.h index f49aa546ff..9ad0a146e7 100644 --- a/plugins/SendScreenshotPlus/src/UMainForm.h +++ b/plugins/SendScreenshotPlus/src/UMainForm.h @@ -84,8 +84,8 @@ class TfrmMain{ LPTSTR m_FDestFolder; LPTSTR m_pszFile; LPTSTR m_pszFileDesc; - FIBITMAP* m_Screenshot; //Graphics::TBitmap *Screenshot; - RGBQUAD m_AlphaColor; // + FIBITMAP* m_Screenshot;//Graphics::TBitmap *Screenshot; + RGBQUAD m_AlphaColor; HCURSOR m_hCursor; CSend* m_cSend; @@ -114,24 +114,24 @@ class TfrmMain{ BYTE m_opt_cboxFormat; //TComboBox *cboxFormat; BYTE m_opt_edtTimed; //TLabeledEdit *edtTimed; bool m_bCapture; //is capture activ + HWND m_hwndTab; //TabControl handle + HWND m_hwndTabPage; //TabControl activ page handle + HIMAGELIST m_himlTab; //TabControl imagelist typedef std::map<HWND, TfrmMain *> CHandleMapping; static CHandleMapping _HandleMapping; static LRESULT CALLBACK DlgTfrmMain(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - LRESULT wmInitdialog(WPARAM wParam, LPARAM lParam); - LRESULT wmCommand(WPARAM wParam, LPARAM lParam); - LRESULT wmClose(WPARAM wParam, LPARAM lParam); - LRESULT wmNotify(WPARAM wParam, LPARAM lParam); - LRESULT wmTimer(WPARAM wParam, LPARAM lParam); + void wmInitdialog(WPARAM wParam, LPARAM lParam); + void wmCommand(WPARAM wParam, LPARAM lParam); + void wmClose(WPARAM wParam, LPARAM lParam); + void wmNotify(WPARAM wParam, LPARAM lParam); + void wmTimer(WPARAM wParam, LPARAM lParam); - LRESULT UMevent(WPARAM wParam, LPARAM lParam); - LRESULT UMClosing(WPARAM wParam, LPARAM lParam); + void UMevent(WPARAM wParam, LPARAM lParam); + void UMClosing(WPARAM wParam, LPARAM lParam); LRESULT UMTab1(WPARAM wParam, LPARAM lParam); - HWND m_hwndTab; //TabControl handle - HWND m_hwndTabPage; //TabControl activ page handle - HIMAGELIST m_himlTab; //TabControl imagelist static INT_PTR CALLBACK DlgProc_CaptureWindow (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK DlgProc_CaptureDesktop(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // LRESULT CALLBACK DlgProc_UseLastFile (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); diff --git a/plugins/SendScreenshotPlus/src/Utils.cpp b/plugins/SendScreenshotPlus/src/Utils.cpp index 63affd0132..b56d953d79 100644 --- a/plugins/SendScreenshotPlus/src/Utils.cpp +++ b/plugins/SendScreenshotPlus/src/Utils.cpp @@ -1,171 +1,162 @@ -/*
-
-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 Sérgio 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.
-*/
-
-#include "global.h"
-
-//---------------------------------------------------------------------------
-//Workaround for MS bug ComboBox_SelectItemData
-int ComboBox_SelectItemData(HWND hwndCtl, int indexStart, LPARAM data) {
- int i = 0;
- for ( i ; i < ComboBox_GetCount(hwndCtl); i++) {
- if(data == ComboBox_GetItemData(hwndCtl, i)) {
- ComboBox_SetCurSel (hwndCtl,i);
- return i;
- }
- }
- return CB_ERR;
-}
-
-//---------------------------------------------------------------------------
-// MonitorInfoEnum
-size_t MonitorInfoEnum(MONITORINFOEX* & myMonitors, RECT & virtualScreen) {
- MONITORS tmp = {0,0};
- if (EnumDisplayMonitors(NULL, NULL, MonitorInfoEnumProc, (LPARAM)&tmp)){
- myMonitors = tmp.info;
- memset(&virtualScreen, 0, sizeof(virtualScreen));
- for (size_t i = 0; i < tmp.count; ++i) {
- UnionRect(&virtualScreen, &virtualScreen, &tmp.info[i].rcMonitor);
- }
- return tmp.count;
- }
- else {
- if (tmp.info) mir_free(tmp.info);
- }
- return 0;
-}
-
-// MonitorInfoEnumProc - CALLBACK for MonitorInfoEnum
-BOOL CALLBACK MonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {
- MONITORS* monitors = (MONITORS*)dwData;
- monitors->count++;
- monitors->info = (MONITORINFOEX*)mir_realloc(monitors->info, sizeof(MONITORINFOEX)*monitors->count);
- monitors->info[monitors->count-1].cbSize = sizeof(MONITORINFOEX);
- if(!GetMonitorInfo(hMonitor, (LPMONITORINFO)(monitors->info + monitors->count-1))) {
- return FALSE; // stop enumeration if error
- }
- return TRUE;
-}
-
-//---------------------------------------------------------------------------
-// capture window as FIBITMAP - caller must FIP->FI_Unload(dib)
-FIBITMAP* CaptureWindow (HWND hCapture, BOOL ClientArea) {
- FIBITMAP *dib = NULL;
- HWND hForegroundWin = NULL;
- HDC hScrDC; // screen DC
- RECT rect= {0}; // screen RECT
- SIZE size; // DIB width and height = window resolution
-
- if (!hCapture || !IsWindow(hCapture)) return 0;
- hForegroundWin = GetForegroundWindow(); //Saving foreground window
- BringWindowToTop(hCapture); // This window bring the target window to the top of all others
- SetForegroundWindow(hCapture); // Make sure the target window is the foreground one
- // redraw window to prevent runtime artefact in picture
- UpdateWindow(hCapture);
-
- hScrDC = GetWindowDC(hCapture);
-
- // get window resolution
- GetWindowRect(hCapture, &rect);
- size.cx = ABS(rect.right - rect.left);
- size.cy = ABS(rect.bottom - rect.top);
-
- //capture window and get FIBITMAP
- dib = CaptureScreen(hScrDC, size, hCapture);
-
- if(ClientArea) {
- RECT rectCA = {0};
- POINT pt = {0};
- GetClientRect (hCapture, &rectCA);
- ClientToScreen(hCapture, &pt);
- //crop the window to ClientArea
- FIBITMAP* dibClient = FIP->FI_Copy(dib,
- pt.x - rect.left,
- pt.y - rect.top,
- pt.x - rect.left + rectCA.right -1,
- pt.y - rect.top + rectCA.bottom -1);
- FIP->FI_Unload(dib);
- dib = dibClient;
- }
-
- ReleaseDC(NULL, hScrDC);
-
- // Restoring foreground window
- if (hForegroundWin) {
- SetForegroundWindow(hForegroundWin);
- }
-
- return dib;
-}
-
-FIBITMAP* CaptureMonitor (LPTSTR szDevice) {
- SIZE size;
- HDC hScrDC;
- FIBITMAP *dib = NULL;
- // get screen resolution
- if(!szDevice) {
- hScrDC = GetDC(NULL); /*Get full virtualscreen*/
- size.cx = GetSystemMetrics(SM_CXVIRTUALSCREEN);
- size.cy = GetSystemMetrics(SM_CYVIRTUALSCREEN);
- }
- else {
- hScrDC = CreateDC(szDevice, NULL, NULL, NULL);
- size.cx = GetDeviceCaps(hScrDC, HORZRES);
- size.cy = GetDeviceCaps(hScrDC, VERTRES);
- }
- dib = CaptureScreen (hScrDC, size);
- ReleaseDC(NULL, hScrDC);
- return dib;
-}
-
-FIBITMAP* CaptureScreen (HDC hDC, SIZE size, HWND hCapture) {
-//HDC GetDC (NULL) entire desktp
-//HDC GetDC (HWND hWnd) client area of the specified window.
-//HDC GetWindowDC (HWND hWnd) entire window.
- FIBITMAP *dib = NULL;
- HBITMAP hBitmap; // handles to device-dependent bitmaps
- HDC hScrDC, hMemDC; // screen DC and memory DC
-
- // create a DC for the screen and create
- // a memory DC compatible to screen DC
- hScrDC = hDC ? hDC : GetDC(NULL/*Get full screen*/);
- hMemDC = CreateCompatibleDC(hScrDC);
- // create a bitmap compatible with the screen DC
- hBitmap = CreateCompatibleBitmap(hScrDC, size.cx, size.cy);
-
- // select new bitmap into memory DC
- HBITMAP hOld = (HBITMAP) SelectObject(hMemDC, hBitmap);
-
- if(hCapture) {
- PrintWindow(hCapture, hMemDC, 0/*PW_CLIENTONLY is buggy*/);
- }
- else {
- // bitblt screen DC to memory DC
- BitBlt(hMemDC, 0, 0, size.cx, size.cy, hScrDC, 0, 0, CAPTUREBLT|SRCCOPY);
- }
-
+/* + +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 Sérgio 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. +*/ + +#include "global.h" + +//--------------------------------------------------------------------------- +//Workaround for MS bug ComboBox_SelectItemData +int ComboBox_SelectItemData(HWND hwndCtl, int indexStart, LPARAM data) { + int i = 0; + for ( i ; i < ComboBox_GetCount(hwndCtl); i++) { + if(data == ComboBox_GetItemData(hwndCtl, i)) { + ComboBox_SetCurSel (hwndCtl,i); + return i; + } + } + return CB_ERR; +} + +//--------------------------------------------------------------------------- +// MonitorInfoEnum +size_t MonitorInfoEnum(MONITORINFOEX* & myMonitors, RECT & virtualScreen) { + MONITORS tmp = {0,0}; + if (EnumDisplayMonitors(NULL, NULL, MonitorInfoEnumProc, (LPARAM)&tmp)){ + myMonitors = tmp.info; + memset(&virtualScreen, 0, sizeof(virtualScreen)); + for (size_t i = 0; i < tmp.count; ++i) { + UnionRect(&virtualScreen, &virtualScreen, &tmp.info[i].rcMonitor); + } + return tmp.count; + } + else { + if (tmp.info) mir_free(tmp.info); + } + return 0; +} + +// MonitorInfoEnumProc - CALLBACK for MonitorInfoEnum +BOOL CALLBACK MonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { + MONITORS* monitors = (MONITORS*)dwData; + ++monitors->count; + monitors->info = (MONITORINFOEX*)mir_realloc(monitors->info, sizeof(MONITORINFOEX)*monitors->count); + monitors->info[monitors->count-1].cbSize = sizeof(MONITORINFOEX); + if(!GetMonitorInfo(hMonitor, (LPMONITORINFO)(monitors->info + monitors->count-1))) { + return FALSE; // stop enumeration if error + } + return TRUE; +} + +//--------------------------------------------------------------------------- +// capture window as FIBITMAP - caller must FIP->FI_Unload(dib) +FIBITMAP* CaptureWindow (HWND hCapture, BOOL ClientArea) { + FIBITMAP *dib; + HWND hForegroundWin; + HDC hScrDC; // screen DC + RECT rect; // screen RECT + SIZE size; // DIB width and height = window resolution + + if (!hCapture || !IsWindow(hCapture)) return 0; + hForegroundWin = GetForegroundWindow(); //Saving foreground window + BringWindowToTop(hCapture); // This window bring the target window to the top of all others + SetForegroundWindow(hCapture); // Make sure the target window is the foreground one + // redraw window to prevent runtime artefact in picture + UpdateWindow(hCapture); + + hScrDC = GetWindowDC(hCapture); + + // get window resolution + GetWindowRect(hCapture, &rect); + size.cx=ABS(rect.right-rect.left); + size.cy=ABS(rect.bottom-rect.top); + //capture window and get FIBITMAP + dib = CaptureScreen(hScrDC,size,hCapture); + ReleaseDC(hCapture,hScrDC); + if(ClientArea) { + RECT rectCA = {0}; + POINT pt = {0}; + GetClientRect (hCapture, &rectCA); + ClientToScreen(hCapture, &pt); + //crop the window to ClientArea + FIBITMAP* dibClient = FIP->FI_Copy(dib, + pt.x - rect.left, + pt.y - rect.top, + pt.x - rect.left + rectCA.right, + pt.y - rect.top + rectCA.bottom); + FIP->FI_Unload(dib); + dib = dibClient; + } + // Restoring foreground window + if(hForegroundWin){ + SetForegroundWindow(hForegroundWin); + } + return dib; +} + +FIBITMAP* CaptureMonitor (LPTSTR szDevice) { + SIZE size; + HDC hScrDC; + FIBITMAP *dib = NULL; + // get screen resolution + if(!szDevice) { + hScrDC = GetDC(NULL); /*Get full virtualscreen*/ + size.cx = GetSystemMetrics(SM_CXVIRTUALSCREEN); + size.cy = GetSystemMetrics(SM_CYVIRTUALSCREEN); + } + else { + hScrDC = CreateDC(szDevice, NULL, NULL, NULL); + size.cx = GetDeviceCaps(hScrDC, HORZRES); + size.cy = GetDeviceCaps(hScrDC, VERTRES); + } + dib = CaptureScreen (hScrDC, size); + ReleaseDC(NULL, hScrDC); + return dib; +} + +FIBITMAP* CaptureScreen (HDC hDC,SIZE size,HWND hCapture){ +//HDC GetDC (NULL) entire desktp +//HDC GetDC (HWND hWnd) client area of the specified window. (may include artifacts) +//HDC GetWindowDC (HWND hWnd) entire window. + FIBITMAP *dib = NULL; + HBITMAP hBitmap; // handles to device-dependent bitmaps + HDC hScrDC, hMemDC; // screen DC and memory DC + + // create a DC for the screen and create + // a memory DC compatible to screen DC + if(!(hScrDC=hDC)) hScrDC=GetDC(hCapture); + hMemDC = CreateCompatibleDC(hScrDC); + // create a bitmap compatible with the screen DC + hBitmap = CreateCompatibleBitmap(hScrDC,size.cx,size.cy); + // select new bitmap into memory DC + SelectObject(hMemDC, hBitmap); + + if(hCapture) { + PrintWindow(hCapture,hMemDC,0); + }else{// bitblt screen DC to memory DC + BitBlt(hMemDC,0,0,size.cx,size.cy,hScrDC,0,0,CAPTUREBLT|SRCCOPY); + } dib = FIP->FI_CreateDIBFromHBITMAP(hBitmap);
//alpha channel from window is always wrong,
@@ -241,299 +232,295 @@ FIBITMAP* CaptureScreen (HDC hDC, SIZE size, HWND hCapture) { if(!hDC) ReleaseDC(NULL, hScrDC);
DeleteObject(hBitmap);
- #ifdef _DEBUG
- switch (FIP->FI_GetImageType(dib)){
- case FIT_UNKNOWN:
- OutputDebugStringA("FIBITMAP Typ: FIT_UNKNOWN\r\n" );
- break;
- case FIT_BITMAP:
- OutputDebugStringA("FIBITMAP Typ: FIT_BITMAP\r\n" );
- break;
- case FIT_UINT16:
- OutputDebugStringA("FIBITMAP Typ: FIT_UINT16\r\n" );
- break;
- case FIT_INT16:
- OutputDebugStringA("FIBITMAP Typ: FIT_INT16\r\n" );
- break;
- case FIT_UINT32:
- OutputDebugStringA("FIBITMAP Typ: FIT_UINT32\r\n" );
- break;
- case FIT_INT32:
- OutputDebugStringA("FIBITMAP Typ: FIT_INT32\r\n" );
- break;
- case FIT_FLOAT:
- OutputDebugStringA("FIBITMAP Typ: FIT_FLOAT\r\n" );
- break;
- case FIT_DOUBLE:
- OutputDebugStringA("FIBITMAP Typ: FIT_DOUBLE\r\n" );
- break;
- case FIT_COMPLEX:
- OutputDebugStringA("FIBITMAP Typ: FIT_COMPLEX\r\n" );
- break;
- case FIT_RGB16:
- OutputDebugStringA("FIBITMAP Typ: FIT_RGB16\r\n" );
- break;
- case FIT_RGBA16:
- OutputDebugStringA("FIBITMAP Typ: FIT_RGBA16\r\n" );
- break;
- case FIT_RGBF:
- OutputDebugStringA("FIBITMAP Typ: FIT_RGBF\r\n" );
- break;
- case FIT_RGBAF:
- OutputDebugStringA("FIBITMAP Typ: FIT_RGBAF\r\n" );
- break;
- default:
- OutputDebugStringA("FIBITMAP Typ: nicht feststellbar\r\n" );
- break;
- }
- BOOL inf = FIP->FI_IsTransparent(dib);
- OutputDebugStringA(inf ? "FIBITMAP Transparent: true\r\n" : "FIBITMAP Transparent: fase\r\n");
- #endif
-
- return dib;
-}
-
-FIBITMAP* CaptureDesktop/*emulate print screen*/() {
- FIBITMAP *dib = NULL;
- HBITMAP hBitmap; // handles to device-dependent bitmaps
- BOOL bBitmap = false;
- int i = 0;
- keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
- keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
- do {//Clipboard need time to get bitmap from keybd_event,
- i++; //we use a counter to get this time.
- bBitmap = IsClipboardFormatAvailable(CF_BITMAP);
- if(i == 500) return (FIBITMAP*)0; //emergency exit if something go wrong
- } while (!bBitmap);
- #ifdef _DEBUG
- char mess[120] = {0};
- LPSTR pszMess = mess;
- mir_snprintf(pszMess,120,"SS Bitmap counter: %i\r\n",i);
- OutputDebugStringA( pszMess );
- #endif
- //get clipboard data
- OpenClipboard(NULL);
- hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
-
- //create FIBITMAP * from HBITMAP
- FIP->FI_CorrectBitmap32Alpha(hBitmap, FALSE);
- dib = FIP->FI_CreateDIBFromHBITMAP(hBitmap);
- CloseClipboard();
-
- return dib;
-}
-
-LPTSTR SaveImage(FREE_IMAGE_FORMAT fif, FIBITMAP* dib, LPTSTR pszFilename, LPTSTR pszExt, int flag) {
- int ret=0;
- LPTSTR pszFile = NULL;
- LPTSTR FileExt = (LPTSTR)GetFileExt (pszFilename, DBVT_TCHAR);
- if(!FileExt) {
- if(!pszExt) return NULL;
- mir_tcsadd(pszFile, pszFilename);
- mir_tcsadd(pszFile, _T("."));
- mir_tcsadd(pszFile, pszExt);
- }
- else {
- mir_tcsadd(pszFile, pszFilename);
- }
-
- if(fif==FIF_UNKNOWN) {
- fif = FIP->FI_GetFIFFromFilenameU(pszFile);
- }
- if(FIP->FI_FIFSupportsICCProfiles(fif)) {
- bool bDummy = true;
- }
-
- ret = FIP->FI_SaveU(fif, dib, pszFile, flag);
-
-
- mir_free(FileExt);
-
- if(ret) return pszFile;
- mir_free(pszFile);
- return NULL;
-}
-
-//---------------------------------------------------------------------------
-//Draws a selection border on the window under cursor
-void DrawBorderInverted(HWND hWindow) {
- if (!hWindow){
- return;
- }
- HDC hDC=GetWindowDC(hWindow);
- RECT rect={0};
- GetWindowRect(hWindow, &rect);
-
- int dcSave = SaveDC(hDC);
-
- SetROP2(hDC, R2_NOT);
-
- HPEN hPen=0;
- hPen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));
-
- SelectObject(hDC, &hPen);
- SelectObject(hDC, GetStockObject(NULL_BRUSH));
-
- Rectangle(hDC, 0, 0, rect.right-rect.left, rect.bottom-rect.top);
- Rectangle(hDC, 1, 1, rect.right-rect.left-1, rect.bottom-rect.top-1);
- Rectangle(hDC, 2, 2, rect.right-rect.left-2, rect.bottom-rect.top-2);
-
- RestoreDC(hDC, dcSave);
-}
-
-//---------------------------------------------------------------------------
-//is left mouse button down
-BOOL GetLmouse() {
- SHORT temp = GetAsyncKeyState((GetSystemMetrics(SM_SWAPBUTTON)) ? VK_RBUTTON : VK_LBUTTON);
- if ((temp & 0x8000) == 0x8000) { // LBUTTON down
- return TRUE;
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-INT_PTR GetFileName(LPTSTR pszPath, UINT typ) {
- /*DBVT_ASCIIZ, DBVT_WCHAR, DBVT_TCHAR*/
- LPTSTR slash = _tcsrchr(pszPath,_T('\\'));
- if (slash) {
- switch (typ) {
- case DBVT_ASCIIZ:
- return (INT_PTR)mir_t2a(slash+1);
- case DBVT_WCHAR:
- return (INT_PTR)mir_t2u(slash+1);
- default:
- return 0;
- }
- }
- else {
- switch (typ) {
- case DBVT_ASCIIZ:
- return (INT_PTR)mir_t2a(pszPath);
- case DBVT_WCHAR:
- return (INT_PTR)mir_t2u(pszPath);
- default:
- return 0;
- }
- }
-}
-
-INT_PTR GetFileExt (LPTSTR pszPath, UINT typ) {
- /*DBVT_ASCIIZ, DBVT_WCHAR, DBVT_TCHAR*/
- LPTSTR slash = _tcsrchr(pszPath,_T('.'));
- if (slash) {
- switch (typ) {
- case DBVT_ASCIIZ:
- return (INT_PTR)mir_t2a(slash);
- case DBVT_WCHAR:
- return (INT_PTR)mir_t2u(slash);
- default:
- return 0;
- }
- }
- else {
- return NULL;
- }
-}
-
-//---------------------------------------------------------------------------
-BOOL GetEncoderClsid(wchar_t *wchMimeType, CLSID& clsidEncoder) {
- UINT uiNum = 0;
- UINT uiSize = 0;
- BOOL bOk = FALSE;
- Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
- Gdiplus::GetImageEncodersSize(&uiNum, &uiSize);
- if( uiSize > 0 ) {
- pImageCodecInfo = (Gdiplus::ImageCodecInfo *)new char[uiSize];
- if( pImageCodecInfo ) {
- Gdiplus::GetImageEncoders(uiNum, uiSize, pImageCodecInfo);
- for( UINT i = 0; i < uiNum; i++ ) {
- if( wcscmp(pImageCodecInfo[i].MimeType, wchMimeType) == 0 ) {
- clsidEncoder = pImageCodecInfo[i].Clsid;
- bOk = TRUE;
- }
- }
- }
- delete pImageCodecInfo;
- }
- return bOk;
-}
-
-INT_PTR SavePNG(HBITMAP hBmp, LPTSTR szFilename) {
- Gdiplus::GdiplusStartupInput gdiplusStartupInput;
- ULONG_PTR gdiplusToken;
- Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
-
- Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromHBITMAP(hBmp, (HPALETTE)GetStockObject(DEFAULT_PALETTE) );
- if( pBitmap ) {
- // Get the CLSID of the PNG encoder.
- CLSID clsidEncoder;
- if( GetEncoderClsid(L"image/png", clsidEncoder)) {
- LPWSTR pswFile = mir_t2u(szFilename);
- pBitmap->Save((const WCHAR*)pswFile, &clsidEncoder, NULL);
- mir_free(pswFile);
- }
- delete pBitmap;
- }
- Gdiplus::GdiplusShutdown(gdiplusToken);
- return 0;
-}
-
-INT_PTR SaveGIF(HBITMAP hBmp, LPTSTR szFilename) {
- Gdiplus::GdiplusStartupInput gdiplusStartupInput;
- ULONG_PTR gdiplusToken;
- Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
-
- Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromHBITMAP(hBmp, (HPALETTE)GetStockObject(DEFAULT_PALETTE) );
- if( pBitmap ) {
- // Get the CLSID of the GIF encoder.
- CLSID clsidEncoder;
- if( GetEncoderClsid(L"image/gif", clsidEncoder)) {
- LPWSTR pswFile = mir_t2u(szFilename);
- pBitmap->Save((const WCHAR*)pswFile, &clsidEncoder, NULL);
- mir_free(pswFile);
- }
- delete pBitmap;
- }
- Gdiplus::GdiplusShutdown(gdiplusToken);
- return 0;
-}
-
-INT_PTR SaveTIF(HBITMAP hBmp, LPTSTR szFilename) {
-//http://www.codeproject.com/Messages/1406708/How-to-reduce-the-size-of-an-Image-using-GDIplus.aspx
- ULONG_PTR gdiplusToken;
- Gdiplus::GdiplusStartupInput gdiplusStartupInput;
- Gdiplus::Status stat;
- Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
-
- Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromHBITMAP(hBmp, (HPALETTE)GetStockObject(DEFAULT_PALETTE) );
- if( pBitmap ) {
- // Get the CLSID of the GIF encoder.
- CLSID EncCLSID;
- if( GetEncoderClsid(L"image/tiff", EncCLSID)) {
- //--- Create a 2-parameter array, for Compression and for Color Bit depth
- Gdiplus::EncoderParameters* EncParams = (Gdiplus::EncoderParameters*) malloc(sizeof(Gdiplus::EncoderParameters) + 1 * sizeof(Gdiplus::EncoderParameter));
- // Gdiplus::EncoderParameters pEncoderParameters;
- //--- Use LZW Compression instead of Group 4, since it works for color and G4 doesn't
- ULONG ulCompression = Gdiplus::EncoderValueCompressionLZW ;
- ULONG ulColorDepth = 24L ;
-
- EncParams->Count = 2 ;
- EncParams->Parameter[0].Guid = Gdiplus::EncoderCompression ;
- EncParams->Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong ;
- EncParams->Parameter[0].NumberOfValues = 1 ;
- EncParams->Parameter[0].Value = &ulCompression ;
- EncParams->Parameter[1].Guid = Gdiplus::EncoderColorDepth ;
- EncParams->Parameter[1].Type = Gdiplus::EncoderParameterValueTypeLong ;
- EncParams->Parameter[1].NumberOfValues = 1 ;
- EncParams->Parameter[1].Value = &ulColorDepth ;
-
- LPWSTR pswFile = mir_t2u(szFilename);
- stat = pBitmap->Save((const WCHAR*)pswFile, &EncCLSID, EncParams);
- mir_free(pswFile);
- free(EncParams);
- }
- delete pBitmap;
- }
- Gdiplus::GdiplusShutdown(gdiplusToken);
- return 0;
-}
+ #ifdef _DEBUG + switch (FIP->FI_GetImageType(dib)){ + case FIT_UNKNOWN: + OutputDebugStringA("FIBITMAP Typ: FIT_UNKNOWN\r\n" ); + break; + case FIT_BITMAP: + OutputDebugStringA("FIBITMAP Typ: FIT_BITMAP\r\n" ); + break; + case FIT_UINT16: + OutputDebugStringA("FIBITMAP Typ: FIT_UINT16\r\n" ); + break; + case FIT_INT16: + OutputDebugStringA("FIBITMAP Typ: FIT_INT16\r\n" ); + break; + case FIT_UINT32: + OutputDebugStringA("FIBITMAP Typ: FIT_UINT32\r\n" ); + break; + case FIT_INT32: + OutputDebugStringA("FIBITMAP Typ: FIT_INT32\r\n" ); + break; + case FIT_FLOAT: + OutputDebugStringA("FIBITMAP Typ: FIT_FLOAT\r\n" ); + break; + case FIT_DOUBLE: + OutputDebugStringA("FIBITMAP Typ: FIT_DOUBLE\r\n" ); + break; + case FIT_COMPLEX: + OutputDebugStringA("FIBITMAP Typ: FIT_COMPLEX\r\n" ); + break; + case FIT_RGB16: + OutputDebugStringA("FIBITMAP Typ: FIT_RGB16\r\n" ); + break; + case FIT_RGBA16: + OutputDebugStringA("FIBITMAP Typ: FIT_RGBA16\r\n" ); + break; + case FIT_RGBF: + OutputDebugStringA("FIBITMAP Typ: FIT_RGBF\r\n" ); + break; + case FIT_RGBAF: + OutputDebugStringA("FIBITMAP Typ: FIT_RGBAF\r\n" ); + break; + default: + OutputDebugStringA("FIBITMAP Typ: non detectable image type (error)\r\n" ); + break; + } + BOOL inf = FIP->FI_IsTransparent(dib); + OutputDebugStringA(inf ? "FIBITMAP Transparent: true\r\n" : "FIBITMAP Transparent: fase\r\n"); + #endif + + return dib; +} +/* +FIBITMAP* CaptureDesktop() {//emulate print screen + FIBITMAP *dib = NULL; + HBITMAP hBitmap; // handles to device-dependent bitmaps + BOOL bBitmap = false; + int i = 0; + keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); + keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); + do {//Clipboard need time to get bitmap from keybd_event, + i++; //we use a counter to get this time. + bBitmap = IsClipboardFormatAvailable(CF_BITMAP); + if(i == 500) return (FIBITMAP*)0; //emergency exit if something go wrong + } while (!bBitmap); + #ifdef _DEBUG + char mess[120] = {0}; + LPSTR pszMess = mess; + mir_snprintf(pszMess,120,"SS Bitmap counter: %i\r\n",i); + OutputDebugStringA( pszMess ); + #endif + //get clipboard data + OpenClipboard(NULL); + hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP); + + //create FIBITMAP * from HBITMAP + FIP->FI_CorrectBitmap32Alpha(hBitmap, FALSE); + dib = FIP->FI_CreateDIBFromHBITMAP(hBitmap); + CloseClipboard(); + + return dib; +}*/ + +LPTSTR SaveImage(FREE_IMAGE_FORMAT fif, FIBITMAP* dib, LPTSTR pszFilename, LPTSTR pszExt, int flag) { + int ret=0; + LPTSTR pszFile = NULL; + LPTSTR FileExt = (LPTSTR)GetFileExt (pszFilename, DBVT_TCHAR); + if(!FileExt) { + if(!pszExt) return NULL; + mir_tcsadd(pszFile, pszFilename); + mir_tcsadd(pszFile, _T(".")); + mir_tcsadd(pszFile, pszExt); + } + else { + mir_tcsadd(pszFile, pszFilename); + } + + if(fif==FIF_UNKNOWN) { + fif = FIP->FI_GetFIFFromFilenameU(pszFile); + } + + ret = FIP->FI_SaveU(fif, dib, pszFile, flag); + + + mir_free(FileExt); + + if(ret) return pszFile; + mir_free(pszFile); + return NULL; +} + +//--------------------------------------------------------------------------- +//Draws a selection border on the window under cursor +void DrawBorderInverted(HWND hWindow) { + if (!hWindow){ + return; + } + HDC hDC=GetWindowDC(hWindow); + RECT rect={0}; + GetWindowRect(hWindow, &rect); + + int dcSave = SaveDC(hDC); + + SetROP2(hDC, R2_NOT); + + HPEN hPen=0; + hPen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0)); + + SelectObject(hDC, &hPen); + SelectObject(hDC, GetStockObject(NULL_BRUSH)); + + Rectangle(hDC, 0, 0, rect.right-rect.left, rect.bottom-rect.top); + Rectangle(hDC, 1, 1, rect.right-rect.left-1, rect.bottom-rect.top-1); + Rectangle(hDC, 2, 2, rect.right-rect.left-2, rect.bottom-rect.top-2); + + RestoreDC(hDC, dcSave); +} + +//--------------------------------------------------------------------------- +//is left mouse button down +BOOL GetLmouse() { + SHORT temp = GetAsyncKeyState((GetSystemMetrics(SM_SWAPBUTTON)) ? VK_RBUTTON : VK_LBUTTON); + if ((temp & 0x8000) == 0x8000) { // LBUTTON down + return TRUE; + } + return FALSE; +} + +//--------------------------------------------------------------------------- +INT_PTR GetFileName(LPTSTR pszPath, UINT typ) { + /*DBVT_ASCIIZ, DBVT_WCHAR, DBVT_TCHAR*/ + LPTSTR slash = _tcsrchr(pszPath,_T('\\')); + if (slash) { + switch (typ) { + case DBVT_ASCIIZ: + return (INT_PTR)mir_t2a(slash+1); + case DBVT_WCHAR: + return (INT_PTR)mir_t2u(slash+1); + default: + return 0; + } + } + else { + switch (typ) { + case DBVT_ASCIIZ: + return (INT_PTR)mir_t2a(pszPath); + case DBVT_WCHAR: + return (INT_PTR)mir_t2u(pszPath); + default: + return 0; + } + } +} + +INT_PTR GetFileExt (LPTSTR pszPath, UINT typ) { + /*DBVT_ASCIIZ, DBVT_WCHAR, DBVT_TCHAR*/ + LPTSTR slash = _tcsrchr(pszPath,_T('.')); + if (slash) { + switch (typ) { + case DBVT_ASCIIZ: + return (INT_PTR)mir_t2a(slash); + case DBVT_WCHAR: + return (INT_PTR)mir_t2u(slash); + default: + return 0; + } + } + else { + return NULL; + } +} + +//--------------------------------------------------------------------------- +BOOL GetEncoderClsid(wchar_t *wchMimeType, CLSID& clsidEncoder) { + UINT uiNum=0; + UINT uiSize=0; + BOOL bOk=FALSE; + Gdiplus::GetImageEncodersSize(&uiNum,&uiSize); + if(uiSize>0){ + Gdiplus::ImageCodecInfo* pImageCodecInfo=(Gdiplus::ImageCodecInfo *)new char[uiSize]; + if(pImageCodecInfo){ + Gdiplus::GetImageEncoders(uiNum,uiSize,pImageCodecInfo); + for( UINT i=0; i<uiNum; ++i){ + if(!wcscmp(pImageCodecInfo[i].MimeType,wchMimeType)){ + clsidEncoder=pImageCodecInfo[i].Clsid; + bOk=TRUE; + } + } + } + delete pImageCodecInfo; + } + return bOk; +} +/* +INT_PTR SavePNG(HBITMAP hBmp, LPTSTR szFilename) { + Gdiplus::GdiplusStartupInput gdiplusStartupInput; + ULONG_PTR gdiplusToken; + Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + + Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromHBITMAP(hBmp, (HPALETTE)GetStockObject(DEFAULT_PALETTE) ); + if( pBitmap ) { + // Get the CLSID of the PNG encoder. + CLSID clsidEncoder; + if( GetEncoderClsid(L"image/png", clsidEncoder)) { + LPWSTR pswFile = mir_t2u(szFilename); + pBitmap->Save((const WCHAR*)pswFile, &clsidEncoder, NULL); + mir_free(pswFile); + } + delete pBitmap; + } + Gdiplus::GdiplusShutdown(gdiplusToken); + return 0; +}*/ + +INT_PTR SaveGIF(HBITMAP hBmp, LPTSTR szFilename) { + Gdiplus::GdiplusStartupInput gdiplusStartupInput; + ULONG_PTR gdiplusToken; + Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + + Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromHBITMAP(hBmp, (HPALETTE)GetStockObject(DEFAULT_PALETTE) ); + if( pBitmap ) { + // Get the CLSID of the GIF encoder. + CLSID clsidEncoder; + if( GetEncoderClsid(L"image/gif", clsidEncoder)) { + LPWSTR pswFile = mir_t2u(szFilename); + pBitmap->Save((const WCHAR*)pswFile, &clsidEncoder, NULL); + mir_free(pswFile); + } + delete pBitmap; + } + Gdiplus::GdiplusShutdown(gdiplusToken); + return 0; +} + +INT_PTR SaveTIF(HBITMAP hBmp, LPTSTR szFilename) { +//http://www.codeproject.com/Messages/1406708/How-to-reduce-the-size-of-an-Image-using-GDIplus.aspx + ULONG_PTR gdiplusToken; + Gdiplus::GdiplusStartupInput gdiplusStartupInput; + Gdiplus::Status stat; + Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + + Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromHBITMAP(hBmp, (HPALETTE)GetStockObject(DEFAULT_PALETTE) ); + if( pBitmap ) { + // Get the CLSID of the GIF encoder. + CLSID EncCLSID; + if( GetEncoderClsid(L"image/tiff", EncCLSID)) { + //--- Create a 2-parameter array, for Compression and for Color Bit depth + Gdiplus::EncoderParameters* EncParams = (Gdiplus::EncoderParameters*) malloc(sizeof(Gdiplus::EncoderParameters) + 1 * sizeof(Gdiplus::EncoderParameter)); + // Gdiplus::EncoderParameters pEncoderParameters; + //--- Use LZW Compression instead of Group 4, since it works for color and G4 doesn't + ULONG ulCompression = Gdiplus::EncoderValueCompressionLZW ; + ULONG ulColorDepth = 24L ; + + EncParams->Count = 2 ; + EncParams->Parameter[0].Guid = Gdiplus::EncoderCompression ; + EncParams->Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong ; + EncParams->Parameter[0].NumberOfValues = 1 ; + EncParams->Parameter[0].Value = &ulCompression ; + EncParams->Parameter[1].Guid = Gdiplus::EncoderColorDepth ; + EncParams->Parameter[1].Type = Gdiplus::EncoderParameterValueTypeLong ; + EncParams->Parameter[1].NumberOfValues = 1 ; + EncParams->Parameter[1].Value = &ulColorDepth ; + + LPWSTR pswFile = mir_t2u(szFilename); + stat = pBitmap->Save((const WCHAR*)pswFile, &EncCLSID, EncParams); + mir_free(pswFile); + free(EncParams); + } + delete pBitmap; + } + Gdiplus::GdiplusShutdown(gdiplusToken); + return 0; +} diff --git a/plugins/SendScreenshotPlus/src/Utils.h b/plugins/SendScreenshotPlus/src/Utils.h index 4b539bb896..da9e13eff3 100644 --- a/plugins/SendScreenshotPlus/src/Utils.h +++ b/plugins/SendScreenshotPlus/src/Utils.h @@ -1,71 +1,71 @@ -/*
-
-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 Sérgio 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.
-*/
-
-#ifndef UTILSH
-#define UTILSH
-
-#define SPP_USERPANE 1
-
-extern FI_INTERFACE *FIP;
-
-#define ABS(x) ((x)<0?-(x):(x))
-
-typedef struct TEnumDataTemp {
-size_t count;
-MONITORINFOEX* info;
-}MONITORS;
-
-extern HWND g_hCapture;
-extern HBITMAP g_hBitmap, g_hbmMask;
-
-//---------------------------------------------------------------------------
-int ComboBox_SelectItemData(HWND hwndCtl, int indexStart, LPARAM data);
-
-size_t MonitorInfoEnum(MONITORINFOEX* & myMonitors, RECT & virtualScreen);
-BOOL CALLBACK MonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData);
-
-FIBITMAP* CaptureWindow(HWND hCapture, BOOL ClientArea);
-FIBITMAP* CaptureMonitor(LPTSTR szDevice);
-FIBITMAP* CaptureScreen(HDC hDC, SIZE size, HWND hCapture=0);
-FIBITMAP* CaptureDesktop(); /*emulate print screen (not used)*/
-LPTSTR SaveImage(FREE_IMAGE_FORMAT fif, FIBITMAP* dib, LPTSTR pszFilename, LPTSTR pszExt, int flag=0);
-
-void DrawBorderInverted(HWND hWindow);
-BOOL GetLmouse();
-INT_PTR GetFileName(LPTSTR pszPath, UINT typ);
-INT_PTR GetFileExt (LPTSTR pszPath, UINT typ);
-
-BOOL GetEncoderClsid(wchar_t *wchMimeType, CLSID& clsidEncoder);
-INT_PTR SavePNG(HBITMAP hBmp, LPTSTR szFilename);
-INT_PTR SaveGIF(HBITMAP hBmp, LPTSTR szFilename);
-INT_PTR SaveTIF(HBITMAP hBmp, LPTSTR szFilename);
-
-//---------------------------------------------------------------------------
-/* Old stuff from Borland C++
-//void ShowPopup(char *title, char *text);
-
-*/
-#endif
+/* + +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 Sérgio 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. +*/ + +#ifndef UTILSH +#define UTILSH + +#define SPP_USERPANE 1 + +extern FI_INTERFACE *FIP; + +#define ABS(x) ((x)<0?-(x):(x)) + +typedef struct TEnumDataTemp { +size_t count; +MONITORINFOEX* info; +}MONITORS; + +extern HWND g_hCapture; +extern HBITMAP g_hBitmap, g_hbmMask; + +//--------------------------------------------------------------------------- +int ComboBox_SelectItemData(HWND hwndCtl, int indexStart, LPARAM data); + +size_t MonitorInfoEnum(MONITORINFOEX* & myMonitors, RECT & virtualScreen); +BOOL CALLBACK MonitorInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData); + +FIBITMAP* CaptureWindow(HWND hCapture, BOOL ClientArea); +FIBITMAP* CaptureMonitor(LPTSTR szDevice); +FIBITMAP* CaptureScreen(HDC hDC, SIZE size, HWND hCapture=0); +//FIBITMAP* CaptureDesktop(); /*emulate print screen (not used)*/ +LPTSTR SaveImage(FREE_IMAGE_FORMAT fif, FIBITMAP* dib, LPTSTR pszFilename, LPTSTR pszExt, int flag=0); + +void DrawBorderInverted(HWND hWindow); +BOOL GetLmouse(); +INT_PTR GetFileName(LPTSTR pszPath, UINT typ); +INT_PTR GetFileExt (LPTSTR pszPath, UINT typ); + +BOOL GetEncoderClsid(wchar_t *wchMimeType, CLSID& clsidEncoder); +//INT_PTR SavePNG(HBITMAP hBmp, LPTSTR szFilename); +INT_PTR SaveGIF(HBITMAP hBmp, LPTSTR szFilename); +INT_PTR SaveTIF(HBITMAP hBmp, LPTSTR szFilename); + +//--------------------------------------------------------------------------- +/* Old stuff from Borland C++ +//void ShowPopup(char *title, char *text); + +*/ +#endif diff --git a/plugins/SendScreenshotPlus/src/ctrl_button.cpp b/plugins/SendScreenshotPlus/src/ctrl_button.cpp index 3552517c67..62154334a5 100644 --- a/plugins/SendScreenshotPlus/src/ctrl_button.cpp +++ b/plugins/SendScreenshotPlus/src/ctrl_button.cpp @@ -189,13 +189,11 @@ static VOID __fastcall PaintThemeButton(BTNCTRL *ctl, HDC hdcMem, LPRECT rcClien // calculate text rect { - RECT sizeText; - HFONT hOldFont; ccText = GetWindowTextW(ctl->hwnd, wszText, sizeof(wszText) / sizeof(WCHAR)); - if (ccText > 0) { - hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); + RECT sizeText; + HFONT hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); GetThemeTextExtent( ctl->hThemeButton, @@ -298,13 +296,11 @@ static VOID __fastcall PaintButton(BTNCTRL *ctl, HDC hdcMem, LPRECT rcClient) } // calculate text rect { - SIZE sizeText; - HFONT hOldFont; ccText = GetWindowText(ctl->hwnd, szText, SIZEOF(szText)); - if (ccText > 0) { - hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); + SIZE sizeText; + HFONT hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); GetTextExtentPoint32(hdcMem, szText, ccText, &sizeText); if (ctl->cHot) { SIZE sizeHot; @@ -445,16 +441,11 @@ static LRESULT CALLBACK Button_WndProc(HWND hwndBtn, UINT uMsg, WPARAM wParam, L { PAINTSTRUCT ps; HDC hdcPaint; - HDC hdcMem; - HBITMAP hbmMem; - HDC hOld; - RECT rcClient; - if (hdcPaint = BeginPaint(hwndBtn, &ps)) { - GetClientRect(bct->hwnd, &rcClient); - hdcMem = CreateCompatibleDC(hdcPaint); - hbmMem = CreateCompatibleBitmap(hdcPaint, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top); - hOld = (HDC)SelectObject(hdcMem, hbmMem); + RECT rcClient; GetClientRect(bct->hwnd, &rcClient); + HDC hdcMem = CreateCompatibleDC(hdcPaint); + HBITMAP hbmMem = CreateCompatibleBitmap(hdcPaint, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top); + HDC hOld = (HDC)SelectObject(hdcMem, hbmMem); // If its a push button, check to see if it should stay pressed if ((bct->dwStyle & MBS_PUSHBUTTON) && bct->pbState) bct->stateId = PBS_PRESSED; @@ -611,14 +602,13 @@ static LRESULT CALLBACK Button_WndProc(HWND hwndBtn, UINT uMsg, WPARAM wParam, L case WM_TIMER: // use a timer to check if they have did a mouseout if (wParam == BUTTON_POLLID) { RECT rc; - POINT pt; - - GetWindowRect(hwndBtn, &rc); - GetCursorPos(&pt); - if (!PtInRect(&rc, pt)) { // mouse must be gone, trigger mouse leave - PostMessage(hwndBtn, WM_MOUSELEAVE, 0, 0L); - KillTimer(hwndBtn, BUTTON_POLLID); - } + POINT pt; + GetWindowRect(hwndBtn,&rc); + GetCursorPos(&pt); + if(!PtInRect(&rc,pt)){ // mouse must be gone, trigger mouse leave + PostMessage(hwndBtn,WM_MOUSELEAVE,0,0L); + KillTimer(hwndBtn,BUTTON_POLLID); + } } break; case WM_ERASEBKGND: diff --git a/plugins/SendScreenshotPlus/src/global.h b/plugins/SendScreenshotPlus/src/global.h index 60a9cc05c6..5cceba5f3d 100644 --- a/plugins/SendScreenshotPlus/src/global.h +++ b/plugins/SendScreenshotPlus/src/global.h @@ -1,146 +1,143 @@ -/*
-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 Sérgio 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.
-*/
-
-#ifndef _GLOBAL_H_
-#define _GLOBAL_H_
-
-#define WINVER 0x0700
-#define _WIN32_WINNT 0x0700
-#define _WIN32_IE 0x0601
-
-#define _CRT_SECURE_NO_WARNINGS
-#define OEMRESOURCE
-
-#include <windows.h>
-#include <Windowsx.h>
-#include <commctrl.h>
-#include <time.h>
-#include <Shlwapi.h>
-#include <gdiplus.h>
-#include <mapi.h>
-#include <UxTheme.h>
-
-#include <map>
-#include <string>
-using namespace std;
-
-#ifdef ComboBox_SelectItemData
- // use Workaround for MS bug ComboBox_SelectItemData;
- #undef ComboBox_SelectItemData
-#endif
-
-#include <win2k.h>
-#include <msapi/vsstyle.h>
-#include <msapi/vssym32.h>
-#include <newpluginapi.h>
-#include <m_button.h>
-#include <m_chat.h>
-#include <m_clist.h>
-#include <m_contacts.h>
-#include <m_database.h>
-#include <m_imgsrvc.h>
-#include <m_langpack.h>
-#include <m_netlib.h>
-#include <m_protosvc.h>
-#include <m_skin.h>
-#include <m_popup.h>
-#include <m_icolib.h>
-
-#include <m_folders.h>
-#include <m_HTTPServer.h>
-#include <m_ftpfile.h>
-#include <m_popup2.h>
-#include <m_sendss.h>
-#include <m_userinfoex.h>
-
-#include "mir_string.h"
-#include "mir_icolib.h"
-#include "ctrl_button.h"
-#include "dlg_msgbox.h"
-#include "resource.h"
-#include "version.h"
-#include "main.h"
-#include "CSend.h"
-#include "CSendEmail.h"
-#include "CSendFile.h"
-#include "CSendFTPFile.h"
-#include "CSendHTTPServer.h"
-#include "CSendImageShack.h"
-#include "DevKey.h"
-#include "UMainForm.h"
-#include "UAboutForm.h"
-#include "Utils.h"
-
-#define UM_CLOSING WM_USER+1
-#define UM_EVENT WM_USER+2
-#define UM_TAB1 WM_USER+11
-
-// Generic Message Box for Errors
-#define MSGERROR(text) MessageBox(NULL, text, _T("SendSS"), MB_OK | MB_ICONERROR)
-#define MSGINFO (text) MessageBox(NULL, text, _T("SendSS"), MB_OK | MB_ICONINFORMATION)
-
-typedef struct _MGLOBAL {
- DWORD mirandaVersion; // mirandaVersion
- BOOLEAN PopupExist : 1; // Popup or MS_POPUP_ADDPOPUP exist
- BOOLEAN PopupActionsExist : 1; // Popup++ or MS_POPUP_REGISTERACTIONS exist
- BOOLEAN PluginHTTPExist : 1; // HTTPServer or MS_HTTP_ACCEPT_CONNECTIONS exist
- BOOLEAN PluginFTPExist : 1; // FTPFile or MS_FTPFILE_SHAREFILE exist
-
-} MGLOBAL, *LPMGLOBAL;
-
-//---------------------------------------------------------------------------
-#define ERROR_TITLE TranslateT("SendScreenshot - Error")
-
-// Miranda Database Key
-#define SZ_SENDSS "SendSS"
-#define MODNAME "SendSS"
-
-extern HINSTANCE hInst;
-extern MGLOBAL myGlobals;
-extern HANDLE hNetlibUser;
-
-#define PtrIsValid(p) (((p)!=0)&&(((HANDLE)(p))!=INVALID_HANDLE_VALUE))
-
-template<class _Elem>
-std::basic_string<_Elem> replace(const std::basic_string<_Elem> & Origninal, const std::basic_string<_Elem> & What, const std::basic_string<_Elem> & With)
-{
- std::basic_string<_Elem> res;
- size_t l = 0;
- size_t p = 0;
-
- for (size_t p = Origninal.find(What.c_str(), 0); p != std::basic_string<_Elem>::npos; p = Origninal.find(What.c_str(), l))
- {
- if (l != p)
- res.append(Origninal.c_str() + l, p - l);
- res.append(With);
- l = p + What.length();
- }
- if (l < Origninal.length())
- res.append(Origninal.c_str() + l);
-
- return res;
-}
-
-#endif
+/* +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 Sérgio 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. +*/ +#ifndef _GLOBAL_H_ +#define _GLOBAL_H_ + +#define WINVER 0x0700 +#define _WIN32_WINNT 0x0700 +#define _WIN32_IE 0x0601 + +#define _CRT_SECURE_NO_WARNINGS +#define OEMRESOURCE + +#include <windows.h> +#include <Windowsx.h> +#include <commctrl.h> +#include <time.h> +#include <Shlwapi.h> +#include <gdiplus.h> +#include <mapi.h> +#include <UxTheme.h> + +#include <map> +#include <string> +using namespace std; + +#ifdef ComboBox_SelectItemData + // use Workaround for MS bug ComboBox_SelectItemData; + #undef ComboBox_SelectItemData +#endif + +#include <win2k.h> +#include <msapi/vsstyle.h> +#include <msapi/vssym32.h> +#include <newpluginapi.h> +#include <m_button.h> +#include <m_chat.h> +#include <m_clist.h> +#include <m_contacts.h> +#include <m_database.h> +#include <m_imgsrvc.h> +#include <m_langpack.h> +#include <m_netlib.h> +#include <m_protosvc.h> +#include <m_skin.h> +#include <m_popup.h> +#include <m_icolib.h> + +#include <m_folders.h> +#include <m_HTTPServer.h> +#include <m_ftpfile.h> +#include <m_popup2.h> +#include <m_sendss.h> +#include <m_userinfoex.h> + +#include "mir_string.h" +#include "mir_icolib.h" +#include "ctrl_button.h" +#include "dlg_msgbox.h" +#include "resource.h" +#include "version.h" +#include "main.h" +#include "CSend.h" +#include "CSendEmail.h" +#include "CSendFile.h" +#include "CSendFTPFile.h" +#include "CSendHTTPServer.h" +#include "CSendImageShack.h" +#include "DevKey.h" +#include "UMainForm.h" +#include "UAboutForm.h" +#include "Utils.h" + +#define UM_CLOSING WM_USER+1 +#define UM_EVENT WM_USER+2 +#define UM_TAB1 WM_USER+11 + +// Generic Message Box for Errors +#define MSGERROR(text) MessageBox(NULL, text, _T("SendSS"), MB_OK | MB_ICONERROR) +#define MSGINFO (text) MessageBox(NULL, text, _T("SendSS"), MB_OK | MB_ICONINFORMATION) + +typedef struct _MGLOBAL { + DWORD mirandaVersion; // mirandaVersion + BOOLEAN PopupExist : 1; // Popup or MS_POPUP_ADDPOPUP exist + BOOLEAN PopupActionsExist : 1; // Popup++ or MS_POPUP_REGISTERACTIONS exist + BOOLEAN PluginHTTPExist : 1; // HTTPServer or MS_HTTP_ACCEPT_CONNECTIONS exist + BOOLEAN PluginFTPExist : 1; // FTPFile or MS_FTPFILE_SHAREFILE exist + +} MGLOBAL, *LPMGLOBAL; + +//--------------------------------------------------------------------------- +#define ERROR_TITLE TranslateT("SendScreenshot - Error") + +// Miranda Database Key +#define SZ_SENDSS "SendSS" +#define MODNAME "SendSS" + +extern HINSTANCE hInst; +extern MGLOBAL myGlobals; +extern HANDLE hNetlibUser; + +#define PtrIsValid(p) (((p)!=0)&&(((HANDLE)(p))!=INVALID_HANDLE_VALUE)) + +template<class _Elem> +std::basic_string<_Elem> replace(const std::basic_string<_Elem> & Origninal, const std::basic_string<_Elem> & What, const std::basic_string<_Elem> & With) +{ + std::basic_string<_Elem> res; + size_t l = 0; + for (size_t p = Origninal.find(What.c_str(), 0); p != std::basic_string<_Elem>::npos; p = Origninal.find(What.c_str(), l)) + { + if (l != p) + res.append(Origninal.c_str() + l, p - l); + res.append(With); + l = p + What.length(); + } + if (l < Origninal.length()) + res.append(Origninal.c_str() + l); + + return res; +} + +#endif diff --git a/plugins/SendScreenshotPlus/src/mir_icolib.h b/plugins/SendScreenshotPlus/src/mir_icolib.h index 937b67bff0..35eb2cf272 100644 --- a/plugins/SendScreenshotPlus/src/mir_icolib.h +++ b/plugins/SendScreenshotPlus/src/mir_icolib.h @@ -1,69 +1,69 @@ -/*
-
-Miranda IM: the free IM client for Microsoft* Windows*
-
-Copyright 2000-2009 Miranda ICQ/IM project,
-all portions of this codebase are copyrighted to the people
-listed in contributors.txt.
-
-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.
-
-*/
-#ifndef _UINFOEX_ICONS_H_INCLUDED_
-#define _UINFOEX_ICONS_H_INCLUDED_ 1
-
-// sections
-#define SECT_COMMON MODNAME
-#define SECT_BUTTONS MODNAME"/"LPGEN("Buttons")
-#define SECT_OVERLAY MODNAME"/"LPGEN("overlays")
-
-// icons
-#define ICO_PLUG_SSWINDOW1 MODNAME"_plug_SSwindow1"
-#define ICO_PLUG_SSWINDOW2 MODNAME"_plug_SSwindow2"
-#define ICO_PLUG_SSMONITOR MODNAME"_plug_SSmonitor"
-#define ICO_PLUG_SSDEFAULT MODNAME"_plug_SSdefault"
-#define ICO_PLUG_SSTARGET MODNAME"_plug_SSTarget"
-#define ICO_PLUG_SSHELP MODNAME"_plug_SSHelp"
-#define ICO_PLUG_SSFOLDERO MODNAME"_plug_SSFolderOpen"
-#define ICO_PLUG_ARROWL MODNAME"_plug_SSArrowL"
-#define ICO_PLUG_ARROWR MODNAME"_plug_SSArrowR"
-#define ICO_PLUG_SSDESKOFF MODNAME"_plug_SSDeskOff"
-#define ICO_PLUG_SSDESKON MODNAME"_plug_SSDeskOn"
-#define ICO_PLUG_SSDELOFF MODNAME"_plug_SSDelOff"
-#define ICO_PLUG_SSDELON MODNAME"_plug_SSDelOn"
-#define ICO_PLUG_UPDATE MODNAME"_plug_update"
-#define ICO_PLUG_OK MODNAME"_plug_ok"
-#define ICO_PLUG_CANCEL MODNAME"_plug_cancel"
-#define ICO_PLUG_APPLY MODNAME"_plug_apply"
-#define ICO_PLUG_EDIT MODNAME"_plug_edit"
-#define ICO_PLUG_DOWNARROW MODNAME"_plug_downarrow"
-
-#define ICO_PLUG_OVERLAYOFF MODNAME"_plug_SSOverlayOff"
-#define ICO_PLUG_OVERLAYON MODNAME"_plug_SSOverlayOn"
-
-#define ICO_DLG_DETAILS MODNAME"_dlg_details"
-
-typedef struct TIconCtrl
-{
- LPCSTR pszIcon;
- UINT Message;
- WORD idCtrl;
-} ICONCTRL, *LPICONCTRL;
-
-HICON IcoLib_GetIcon(LPCSTR pszIcon, bool big = false);
-
-VOID IcoLib_LoadModule();
-
-#endif /* _UINFOEX_ICONS_H_INCLUDED_ */
+/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2009 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +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. + +*/ +#ifndef _UINFOEX_ICONS_H_INCLUDED_ +#define _UINFOEX_ICONS_H_INCLUDED_ 1 + +// sections +#define SECT_COMMON MODNAME +#define SECT_BUTTONS MODNAME"/"LPGEN("Buttons") +#define SECT_OVERLAY MODNAME"/"LPGEN("overlays") + +// icons +#define ICO_PLUG_SSWINDOW1 MODNAME"_plug_SSwindow1" +#define ICO_PLUG_SSWINDOW2 MODNAME"_plug_SSwindow2" +#define ICO_PLUG_SSMONITOR MODNAME"_plug_SSmonitor" +#define ICO_PLUG_SSDEFAULT MODNAME"_plug_SSdefault" +#define ICO_PLUG_SSTARGET MODNAME"_plug_SSTarget" +#define ICO_PLUG_SSHELP MODNAME"_plug_SSHelp" +#define ICO_PLUG_SSFOLDERO MODNAME"_plug_SSFolderOpen" +#define ICO_PLUG_ARROWL MODNAME"_plug_SSArrowL" +#define ICO_PLUG_ARROWR MODNAME"_plug_SSArrowR" +#define ICO_PLUG_SSDESKOFF MODNAME"_plug_SSDeskOff" +#define ICO_PLUG_SSDESKON MODNAME"_plug_SSDeskOn" +#define ICO_PLUG_SSDELOFF MODNAME"_plug_SSDelOff" +#define ICO_PLUG_SSDELON MODNAME"_plug_SSDelOn" +#define ICO_PLUG_UPDATE MODNAME"_plug_update" +#define ICO_PLUG_OK MODNAME"_plug_ok" +#define ICO_PLUG_CANCEL MODNAME"_plug_cancel" +#define ICO_PLUG_APPLY MODNAME"_plug_apply" +#define ICO_PLUG_EDIT MODNAME"_plug_edit" +#define ICO_PLUG_DOWNARROW MODNAME"_plug_downarrow" + +#define ICO_PLUG_OVERLAYOFF MODNAME"_plug_SSOverlayOff" +#define ICO_PLUG_OVERLAYON MODNAME"_plug_SSOverlayOn" + +#define ICO_DLG_DETAILS MODNAME"_dlg_details" + +/*typedef struct TIconCtrl +{ + LPCSTR pszIcon; + UINT Message; + WORD idCtrl; +} ICONCTRL, *LPICONCTRL;*/ + +HICON IcoLib_GetIcon(LPCSTR pszIcon, bool big = false); + +VOID IcoLib_LoadModule(); + +#endif /* _UINFOEX_ICONS_H_INCLUDED_ */ |