From 1ed1296853c671fc557599c6daf5fba88d52a21f Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 6 Jul 2012 14:44:59 +0000 Subject: + stdauth + stdfile; NEWSTR_ALLOCA / NEWTSTR_ALLOCA / NEWWSTR_ALLOCA moved to m_system.h git-svn-id: http://svn.miranda-ng.org/main/trunk@792 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- include/m_system.h | 5 +- plugins/Clist_nicer/INCLUDE/clist.h | 9 +- plugins/Db3x/commonheaders.h | 2 - plugins/Db3x_mmap/commonheaders.h | 2 - plugins/Dbx_mmap_SA/Import_SA/miranda.cpp | 6 +- plugins/Dbx_mmap_SA/commonheaders.h | 2 - plugins/IEView/HistoryHTMLBuilder.cpp | 12 +- plugins/Import/miranda.cpp | 2 - plugins/Variables/contact.cpp | 2 - protocols/AimOscar/aim.h | 4 - protocols/IRCG/irc.h | 11 +- protocols/JabberG/jabber.h | 3 - protocols/MSN/msn_global.h | 19 +- protocols/Yahoo/yahoo.h | 13 +- src/core/miranda.h | 7 - src/core/modules.cpp | 7 +- src/core/stdauth/auth.cpp | 122 +++++ src/core/stdauth/authdialogs.cpp | 299 +++++++++++ src/core/stdauth/commonheaders.cpp | 2 + src/core/stdauth/commonheaders.h | 93 ++++ src/core/stdauth/main.cpp | 72 +++ src/core/stdauth/resource.rc | 107 ++++ src/core/stdauth/stdauth_10.vcxproj | 217 ++++++++ src/core/stdauth/stdauth_10.vcxproj.filters | 47 ++ src/core/stdauth/version.h | 14 + src/core/stdauth/version.rc | 38 ++ src/core/stdfile/commonheaders.cpp | 2 + src/core/stdfile/commonheaders.h | 100 ++++ src/core/stdfile/file.cpp | 487 ++++++++++++++++++ src/core/stdfile/file.h | 115 +++++ src/core/stdfile/fileexistsdlg.cpp | 341 ++++++++++++ src/core/stdfile/fileopts.cpp | 247 +++++++++ src/core/stdfile/filerecvdlg.cpp | 442 ++++++++++++++++ src/core/stdfile/filesenddlg.cpp | 358 +++++++++++++ src/core/stdfile/filexferdlg.cpp | 768 ++++++++++++++++++++++++++++ src/core/stdfile/ftmanager.cpp | 533 +++++++++++++++++++ src/core/stdfile/main.cpp | 88 ++++ src/core/stdfile/resource.rc | 293 +++++++++++ src/core/stdfile/stdfile_10.vcxproj | 223 ++++++++ src/core/stdfile/stdfile_10.vcxproj.filters | 65 +++ src/core/stdfile/version.h | 14 + src/core/stdfile/version.rc | 38 ++ src/mir_core/miranda.h | 11 +- src/miranda32_10.vcxproj | 28 - src/miranda32_10.vcxproj.filters | 36 -- src/modules/database/database.cpp | 1 - src/modules/database/dbini.cpp | 1 - src/modules/netlib/netliblog.cpp | 1 - src/modules/protocols/protocols.cpp | 89 ---- src/modules/protocols/protoint.cpp | 20 +- src/modules/srauth/auth.cpp | 129 ----- src/modules/srauth/authdialogs.cpp | 312 ----------- src/modules/srfile/file.cpp | 368 ------------- src/modules/srfile/file.h | 115 ----- src/modules/srfile/fileexistsdlg.cpp | 344 ------------- src/modules/srfile/fileopts.cpp | 247 --------- src/modules/srfile/filerecvdlg.cpp | 442 ---------------- src/modules/srfile/filesenddlg.cpp | 358 ------------- src/modules/srfile/filexferdlg.cpp | 768 ---------------------------- src/modules/srfile/ftmanager.cpp | 592 --------------------- src/modules/utils/path.cpp | 1 - src/resource.rc | 276 ---------- 62 files changed, 5181 insertions(+), 4189 deletions(-) create mode 100644 src/core/stdauth/auth.cpp create mode 100644 src/core/stdauth/authdialogs.cpp create mode 100644 src/core/stdauth/commonheaders.cpp create mode 100644 src/core/stdauth/commonheaders.h create mode 100644 src/core/stdauth/main.cpp create mode 100644 src/core/stdauth/resource.rc create mode 100644 src/core/stdauth/stdauth_10.vcxproj create mode 100644 src/core/stdauth/stdauth_10.vcxproj.filters create mode 100644 src/core/stdauth/version.h create mode 100644 src/core/stdauth/version.rc create mode 100644 src/core/stdfile/commonheaders.cpp create mode 100644 src/core/stdfile/commonheaders.h create mode 100644 src/core/stdfile/file.cpp create mode 100644 src/core/stdfile/file.h create mode 100644 src/core/stdfile/fileexistsdlg.cpp create mode 100644 src/core/stdfile/fileopts.cpp create mode 100644 src/core/stdfile/filerecvdlg.cpp create mode 100644 src/core/stdfile/filesenddlg.cpp create mode 100644 src/core/stdfile/filexferdlg.cpp create mode 100644 src/core/stdfile/ftmanager.cpp create mode 100644 src/core/stdfile/main.cpp create mode 100644 src/core/stdfile/resource.rc create mode 100644 src/core/stdfile/stdfile_10.vcxproj create mode 100644 src/core/stdfile/stdfile_10.vcxproj.filters create mode 100644 src/core/stdfile/version.h create mode 100644 src/core/stdfile/version.rc delete mode 100644 src/modules/srauth/auth.cpp delete mode 100644 src/modules/srauth/authdialogs.cpp delete mode 100644 src/modules/srfile/file.cpp delete mode 100644 src/modules/srfile/file.h delete mode 100644 src/modules/srfile/fileexistsdlg.cpp delete mode 100644 src/modules/srfile/fileopts.cpp delete mode 100644 src/modules/srfile/filerecvdlg.cpp delete mode 100644 src/modules/srfile/filesenddlg.cpp delete mode 100644 src/modules/srfile/filexferdlg.cpp delete mode 100644 src/modules/srfile/ftmanager.cpp diff --git a/include/m_system.h b/include/m_system.h index 7d9e508f55..bac3721493 100644 --- a/include/m_system.h +++ b/include/m_system.h @@ -47,8 +47,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #pragma warning(disable:4244 4245) #endif -#include +#define NEWSTR_ALLOCA(A) (A == NULL)?NULL:strcpy((char*)alloca(strlen(A)+1), A) +#define NEWWSTR_ALLOCA(A) ((A==NULL)?NULL:wcscpy((wchar_t*)alloca(sizeof(wchar_t)*(wcslen(A)+1)),A)) +#define NEWTSTR_ALLOCA(A) (A == NULL)?NULL:_tcscpy((TCHAR*)alloca((_tcslen(A)+1)* sizeof(TCHAR)), A) +#include //miranda/system/modulesloaded //called after all modules have been successfully initialised diff --git a/plugins/Clist_nicer/INCLUDE/clist.h b/plugins/Clist_nicer/INCLUDE/clist.h index f4cabd2419..1969039350 100644 --- a/plugins/Clist_nicer/INCLUDE/clist.h +++ b/plugins/Clist_nicer/INCLUDE/clist.h @@ -2,8 +2,8 @@ Miranda IM: the free IM client for Microsoft* Windows* -Copyright 2000-2003 Miranda ICQ/IM project, -all portions of this codebase are copyrighted to the people +Copyright 2000-2003 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 @@ -25,8 +25,6 @@ int IconFromStatusMode(const char *szProto, int status, HANDLE hContact, HICON * HTREEITEM GetTreeItemByHContact(HANDLE hContact); void SortContacts(void); -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)_alloca(strlen(A)+1),A) - #define CLUIINTM_REDRAW (WM_USER+100) #define CLUIINTM_STATUSBARUPDATE (WM_USER+101) #define CLUIINTM_REMOVEFROMTASKBAR (WM_USER+102) @@ -48,6 +46,3 @@ void SortContacts(void); #define CLVM_USELASTMSG 16 #define CLVM_MODULE "CLVM_W" - - - diff --git a/plugins/Db3x/commonheaders.h b/plugins/Db3x/commonheaders.h index 0391366b60..84fc492046 100644 --- a/plugins/Db3x/commonheaders.h +++ b/plugins/Db3x/commonheaders.h @@ -62,8 +62,6 @@ extern char szDbPath[MAX_PATH]; #define mir_i64(x) (x##i64) #endif -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) - #ifndef MODULAR void Encrypt(char*msg,BOOL up); #endif diff --git a/plugins/Db3x_mmap/commonheaders.h b/plugins/Db3x_mmap/commonheaders.h index 6e1d4bcc28..0d319af5a3 100644 --- a/plugins/Db3x_mmap/commonheaders.h +++ b/plugins/Db3x_mmap/commonheaders.h @@ -62,5 +62,3 @@ extern HANDLE hDbFile; #else #define mir_i64(x) (x##i64) #endif - -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) diff --git a/plugins/Dbx_mmap_SA/Import_SA/miranda.cpp b/plugins/Dbx_mmap_SA/Import_SA/miranda.cpp index 21ece87022..c0d56d1bf7 100644 --- a/plugins/Dbx_mmap_SA/Import_SA/miranda.cpp +++ b/plugins/Dbx_mmap_SA/Import_SA/miranda.cpp @@ -56,8 +56,6 @@ static HANDLE ImportContact(HANDLE hDbFile, struct DBContact Contact); static void ImportHistory(HANDLE hDbFile, struct DBContact Contact, PROTOCOLDESCRIPTOR **protocol, int protoCount); static int ImportGroups(HANDLE hDbFile, struct DBHeader *pdbHeader); -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) - // Comment: The Find* functions only return a file offset. // The Get* functions actually reads the requested // data from the file and gives you a pointer to a structure @@ -529,7 +527,7 @@ int CheckFileFormat(HANDLE hDbFile) AddMessage(LPGEN("Secured MMAP: authorization successful")); bEncrypted = TRUE; } - else + else { AddMessage(LPGEN("You are not authorized for access to Database")); return DB_INVALID; @@ -1046,7 +1044,7 @@ int ImportGroups(HANDLE hDbFile, struct DBHeader* pdbHeader) pSetting = GetNextSetting(pSetting); } free(pDbSettings); - + /*if (bEncrypted) EncodeMemory(pDbSettings->blob, pDbSettings->cbBlob);*/ } diff --git a/plugins/Dbx_mmap_SA/commonheaders.h b/plugins/Dbx_mmap_SA/commonheaders.h index 2fb92e5399..b4c913a694 100644 --- a/plugins/Dbx_mmap_SA/commonheaders.h +++ b/plugins/Dbx_mmap_SA/commonheaders.h @@ -98,8 +98,6 @@ BOOL CALLBACK DlgStdNewPass(HWND hDlg, UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL CALLBACK DlgChangePass(HWND hDlg, UINT uMsg,WPARAM wParam,LPARAM lParam); void xModifyMenu(HANDLE hMenu,long flags,const TCHAR* name, HICON hIcon); -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) - typedef struct{ void* (__stdcall *GenerateKey)(char* pwd); void (__stdcall *FreeKey)(void* key); diff --git a/plugins/IEView/HistoryHTMLBuilder.cpp b/plugins/IEView/HistoryHTMLBuilder.cpp index 3bce0d8749..bf0c68c8dd 100644 --- a/plugins/IEView/HistoryHTMLBuilder.cpp +++ b/plugins/IEView/HistoryHTMLBuilder.cpp @@ -235,16 +235,16 @@ void HistoryHTMLBuilder::appendEventNonTemplate(IEView *view, IEVIEWEVENT *event || eventData->iType == IEED_EVENT_URL || eventData->iType == IEED_EVENT_FILE) { char *szName = NULL; char *szText = NULL; - if (eventData->dwFlags & IEEDF_UNICODE_NICK) { + if (eventData->dwFlags & IEEDF_UNICODE_NICK) szName = encodeUTF8(event->hContact, szRealProto, eventData->pszNickW, ENF_NAMESMILEYS, true); - } else { + else szName = encodeUTF8(event->hContact, szRealProto, eventData->pszNick, ENF_NAMESMILEYS, true); - } - if (eventData->dwFlags & IEEDF_UNICODE_TEXT) { + + if (eventData->dwFlags & IEEDF_UNICODE_TEXT) szText = encodeUTF8(event->hContact, szRealProto, eventData->pszTextW, eventData->iType == IEED_EVENT_MESSAGE ? ENF_ALL : 0, isSent); - } else { + else szText = encodeUTF8(event->hContact, szRealProto, eventData->pszText, event->codepage, eventData->iType == IEED_EVENT_MESSAGE ? ENF_ALL : 0, isSent); - } + /* History++-specific formatting */ const char *className = NULL; const char *iconFile = NULL; diff --git a/plugins/Import/miranda.cpp b/plugins/Import/miranda.cpp index e83eaae869..4f616fb714 100644 --- a/plugins/Import/miranda.cpp +++ b/plugins/Import/miranda.cpp @@ -57,8 +57,6 @@ static HANDLE ImportContact(HANDLE hDbFile, struct DBContact Contact); static void ImportHistory(HANDLE hDbFile, struct DBContact Contact, PROTOCOLDESCRIPTOR **protocol, int protoCount); static int ImportGroups(HANDLE hDbFile, struct DBHeader *pdbHeader); -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) - // Comment: The Find* functions only return a file offset. // The Get* functions actually reads the requested // data from the file and gives you a pointer to a structure diff --git a/plugins/Variables/contact.cpp b/plugins/Variables/contact.cpp index 029f9bf818..9e2f08c83e 100644 --- a/plugins/Variables/contact.cpp +++ b/plugins/Variables/contact.cpp @@ -73,8 +73,6 @@ static builtinCnfs[] = { CCNF_PROTOID, _T(STR_PROTOID) } }; -#define NEWTSTR_ALLOCA(A) (A==NULL)?NULL:_tcscpy((TCHAR*)alloca(sizeof(TCHAR)*(_tcslen(A)+1)),A) - typedef struct { TCHAR* tszContact; HANDLE hContact; diff --git a/protocols/AimOscar/aim.h b/protocols/AimOscar/aim.h index b986fa280d..a6d7e737e7 100644 --- a/protocols/AimOscar/aim.h +++ b/protocols/AimOscar/aim.h @@ -333,10 +333,6 @@ extern char AIM_CAP_MIRANDA[]; //Miranda cap EXTERN extern HINSTANCE hInstance; //plugin dll instance -#define NEWSTR_ALLOCA(A) ((A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A)) -#define NEWWSTR_ALLOCA(A) ((A==NULL)?NULL:wcscpy((wchar_t*)alloca(sizeof(wchar_t)*(wcslen(A)+1)),A)) -#define NEWTSTR_ALLOCA(A) ((A==NULL)?NULL:_tcscpy((TCHAR*)alloca(sizeof(TCHAR)*(_tcslen(A)+1)),A)) - #define _strlens(a) (a ? strlen(a) : 0) #define _strcmps(a,b) (a != b && (!a || !b || strcmp(a, b))) diff --git a/protocols/IRCG/irc.h b/protocols/IRCG/irc.h index 41591b388a..4580243385 100644 --- a/protocols/IRCG/irc.h +++ b/protocols/IRCG/irc.h @@ -407,7 +407,7 @@ struct CIrcProto : public PROTO_INTERFACE, public CCallocBase CWhoisDlg* m_whoisDlg; CQuickDlg* m_quickDlg; CIgnorePrefsDlg* m_ignoreDlg; - + int m_noOfChannels, m_manualWhoisCount; String sChannelModes, sUserModes; CMString sChannelPrefixes, sUserModePrefixes, WhoisAwayReply; @@ -424,7 +424,7 @@ struct CIrcProto : public PROTO_INTERFACE, public CCallocBase BOOL CList_AddDCCChat(const CMString& name, const CMString& hostmask, unsigned long adr, int port) ; //commandmonitor.cpp - UINT_PTR IdentTimer, InitTimer, KeepAliveTimer, OnlineNotifTimer, OnlineNotifTimer3; + UINT_PTR IdentTimer, InitTimer, KeepAliveTimer, OnlineNotifTimer, OnlineNotifTimer3; int AddOutgoingMessageToDB(HANDLE hContact, TCHAR* msg); bool DoOnConnect(const CIrcMessage *pmsg); @@ -561,14 +561,14 @@ struct CIrcProto : public PROTO_INTERFACE, public CCallocBase void AddDCCSession(DCCINFO* pdci, CDccSession* dcc); void RemoveDCCSession(HANDLE hContact); void RemoveDCCSession(DCCINFO* pdci); - + CDccSession* FindDCCSession(HANDLE hContact); CDccSession* FindDCCSession(DCCINFO* pdci); CDccSession* FindDCCSendByPort(int iPort); CDccSession* FindDCCRecvByPortAndName(int iPort, const TCHAR* szName); CDccSession* FindPassiveDCCSend(int iToken); CDccSession* FindPassiveDCCRecv(CMString sName, CMString sToken); - + void DisconnectAllDCCSessions(bool Shutdown); void CheckDCCTimeout(void); @@ -731,9 +731,6 @@ TCHAR* __stdcall DoColorCodes (const TCHAR* text, bool bStrip, bool bRepla String& __stdcall ReplaceString (String& text, const char* replaceme, const char* newword); String __stdcall GetWord(const char* text, int index); -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) -#define NEWTSTR_ALLOCA(A) (A==NULL)?NULL:_tcscpy((TCHAR*)alloca(sizeof(TCHAR)*(_tcslen(A)+1)),A) - #pragma comment(lib,"comctl32.lib") #endif diff --git a/protocols/JabberG/jabber.h b/protocols/JabberG/jabber.h index 3958213fdd..4fd50d6d78 100644 --- a/protocols/JabberG/jabber.h +++ b/protocols/JabberG/jabber.h @@ -32,9 +32,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "m_stdhdr.h" -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) -#define NEWTSTR_ALLOCA(A) (A==NULL)?NULL:_tcscpy((TCHAR*)alloca(sizeof(TCHAR)*(_tcslen(A)+1)),A) - #define LISTFOREACH(var__, obj__, list__) \ for (int var__ = 0; (var__ = obj__->ListFindNext(list__, var__)) >= 0; ++var__) #define LISTFOREACH_NODEF(var__, obj__, list__) \ diff --git a/protocols/MSN/msn_global.h b/protocols/MSN/msn_global.h index 2b2ef91a70..1c446112f6 100644 --- a/protocols/MSN/msn_global.h +++ b/protocols/MSN/msn_global.h @@ -150,9 +150,6 @@ extern const char sttVoidUid[]; struct CMsnProto; -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) -#define NEWTSTR_ALLOCA(A) (A==NULL)?NULL:_tcscpy((TCHAR*)alloca(sizeof(TCHAR)*(_tcslen(A)+1)),A) - #define MSN_ALLOW_MSGBOX 1 #define MSN_ALLOW_ENTER 2 #define MSN_HOTMAIL_POPUP 4 @@ -245,12 +242,12 @@ struct STRLIST : public LIST { static int compare(const char* p1, const char* p2) { return _stricmp(p1, p2); } - + STRLIST() : LIST(2, compare) {} ~STRLIST() { destroy(); } void destroy( void ) - { + { for (int i=0; i < count; i++) mir_free(items[i]); @@ -258,7 +255,7 @@ struct STRLIST : public LIST } int insertn(const char* p) { return insert(mir_strdup(p)); } - + int remove(int idx) { mir_free(items[idx]); @@ -360,7 +357,7 @@ struct filetransfer bool bCanceled; // flag to interrupt a transfer bool bCompleted; // was a FT ever completed? bool bAccepted; // was a FT ever completed? - + int fileId; // handle of file being transferring (r/w) HANDLE hLockHandle; @@ -422,7 +419,7 @@ struct directconnection typedef struct _tag_HFileContext { - unsigned len; + unsigned len; unsigned ver; unsigned __int64 dwSize; unsigned type; @@ -457,7 +454,7 @@ struct P2P_Header : P2PB_Header char* parseMsg(char *buf) { memcpy(&mSessionID, buf, 48); return buf + 48; } char* createMsg(char *buf, const char* wlid, CMsnProto *ppro); - bool isV2Hdr(void) { return false; } + bool isV2Hdr(void) { return false; } void logHeader(CMsnProto *ppro); } ; @@ -478,7 +475,7 @@ struct P2PV2_Header : P2PB_Header char* parseMsg(char *buf); char* createMsg(char *buf, const char* wlid, CMsnProto *ppro); - bool isV2Hdr(void) { return true; } + bool isV2Hdr(void) { return true; } void logHeader(CMsnProto *ppro); }; @@ -878,7 +875,7 @@ struct InviteChatParam TCHAR* id; HANDLE hContact; CMsnProto* ppro; - + InviteChatParam(const TCHAR* id, HANDLE hContact, CMsnProto* ppro) : id(mir_tstrdup(id)), hContact(hContact), ppro(ppro) {} diff --git a/protocols/Yahoo/yahoo.h b/protocols/Yahoo/yahoo.h index efe3b9cf2f..ed90bf8756 100644 --- a/protocols/Yahoo/yahoo.h +++ b/protocols/Yahoo/yahoo.h @@ -1,9 +1,9 @@ /* * $Id: yahoo.h 14085 2012-02-13 10:55:56Z george.hazan $ * - * myYahoo Miranda Plugin + * myYahoo Miranda Plugin * - * Authors: Gennady Feldman (aka Gena01) + * Authors: Gennady Feldman (aka Gena01) * Laurent Marechal (aka Peorth) * * This code is under GPL and is based on AIM, MSN and Miranda source code. @@ -27,7 +27,7 @@ #include -/* +/* * Yahoo Services */ #define USE_STRUCT_CALLBACKS @@ -69,8 +69,8 @@ extern "C" #define YAHOO_CHECKMAIL "CheckMail" #define YAHOO_CUSTSTATDB "CustomStat" #define YAHOO_DEFAULT_PORT 5050 -#define YAHOO_DEFAULT_LOGIN_SERVER "mcs.msg.yahoo.com" -#define YAHOO_DEFAULT_JAPAN_LOGIN_SERVER "cs.yahoo.co.jp" +#define YAHOO_DEFAULT_LOGIN_SERVER "mcs.msg.yahoo.com" +#define YAHOO_DEFAULT_JAPAN_LOGIN_SERVER "cs.yahoo.co.jp" #define YAHOO_CUSTOM_STATUS 99 #define YAHOO_DEBUGLOG DebugLog @@ -81,7 +81,7 @@ extern int do_yahoo_debug; YAHOO_DEBUGLOG x; \ YAHOO_DEBUGLOG(" ");} -#define YAHOO_SET_CUST_STAT "/SetCustomStatCommand" +#define YAHOO_SET_CUST_STAT "/SetCustomStatCommand" #define YAHOO_EDIT_MY_PROFILE "/YahooEditMyProfileCommand" #define YAHOO_SHOW_PROFILE "/YahooShowProfileCommand" #define YAHOO_SHOW_MY_PROFILE "/YahooShowMyProfileCommand" @@ -95,7 +95,6 @@ extern int do_yahoo_debug; #define STYLE_DEFAULTBGCOLOUR RGB(173,206,247) #define LocalEventUnhook(hook) if(hook) UnhookEvent(hook) -#define NEWSTR_ALLOCA(A) (A==NULL)?NULL:strcpy((char*)alloca(strlen(A)+1),A) struct _conn { unsigned int tag; diff --git a/src/core/miranda.h b/src/core/miranda.h index c1dcb75f95..7c356dab6d 100644 --- a/src/core/miranda.h +++ b/src/core/miranda.h @@ -23,9 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define OPTIONPAGE_OLD_SIZE offsetof(OPTIONSDIALOGPAGE,hLangpack) -#define NEWSTR_ALLOCA(A) (A == NULL)?NULL:strcpy((char*)alloca(strlen(A)+1), A) -#define NEWTSTR_ALLOCA(A) (A == NULL)?NULL:_tcscpy((TCHAR*)alloca((_tcslen(A)+1)* sizeof(TCHAR)), A) - typedef HMONITOR (WINAPI *pfnMyMonitorFromPoint)(POINT, DWORD); extern pfnMyMonitorFromPoint MyMonitorFromPoint; @@ -111,10 +108,6 @@ extern LPFN_FREEADDRINFO MyFreeaddrinfo; extern LPFN_WSASTRINGTOADDRESSA MyWSAStringToAddress; extern LPFN_WSAADDRESSTOSTRINGA MyWSAAddressToString; -/**** file.cpp *************************************************************************/ - -void PushFileEvent(HANDLE hContact, HANDLE hdbe, LPARAM lParam); - /**** fontService.cpp ******************************************************************/ void KillModuleFonts(int hLangpack); diff --git a/src/core/modules.cpp b/src/core/modules.cpp index 8fa59f8a4d..2077e9ab36 100644 --- a/src/core/modules.cpp +++ b/src/core/modules.cpp @@ -42,9 +42,6 @@ int LoadProtocolsModule(void); // core: protocol manager int LoadAccountsModule(void); // core: account manager int LoadIgnoreModule(void); // protocol filter: ignore -int LoadSendRecvAuthModule(void); //send/recv -int LoadSendRecvFileModule(void); //send/recv - int LoadContactListModule(void);// ui: clist int LoadOptionsModule(void); // ui: options dialog int LoadFindAddModule(void); // ui: search/add users @@ -144,7 +141,7 @@ int LoadDefaultModules(void) if ( LoadIgnoreModule()) return 1; if ( LoadVisibilityModule()) return 1; - for (int i=0; i < 3; i++) { + for (int i=0; i < 5; i++) { if ( pluginDefault[i].pImpl ) continue; @@ -152,8 +149,6 @@ int LoadDefaultModules(void) return 1; } - if ( !pluginDefault[ 3].pImpl) if ( LoadSendRecvAuthModule()) return 1; - if ( !pluginDefault[ 4].pImpl) if ( LoadSendRecvFileModule()) return 1; if ( !pluginDefault[ 5].pImpl) if ( LoadHelpModule()) return 1; if ( !pluginDefault[ 6].pImpl) if ( LoadHistoryModule()) return 1; if ( !pluginDefault[ 7].pImpl) if ( LoadIdleModule()) return 1; diff --git a/src/core/stdauth/auth.cpp b/src/core/stdauth/auth.cpp new file mode 100644 index 0000000000..9146653db8 --- /dev/null +++ b/src/core/stdauth/auth.cpp @@ -0,0 +1,122 @@ +/* + +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. +*/ +#include "commonheaders.h" + +#define MS_AUTH_SHOWREQUEST "Auth/ShowRequest" +#define MS_AUTH_SHOWADDED "Auth/ShowAdded" + +INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); + +INT_PTR ShowReqWindow(WPARAM, LPARAM lParam) +{ + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_AUTHREQ), NULL, DlgProcAuthReq, (LPARAM)((CLISTEVENT *)lParam)->hDbEvent); + return 0; +} + +INT_PTR ShowAddedWindow(WPARAM, LPARAM lParam) +{ + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ADDED), NULL, DlgProcAdded, (LPARAM)((CLISTEVENT *)lParam)->hDbEvent); + return 0; +} + +static int AuthEventAdded(WPARAM, LPARAM lParam) +{ + TCHAR szUid[128] = _T(""); + TCHAR szTooltip[256]; + const HANDLE hDbEvent = (HANDLE)lParam; + + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + CallService(MS_DB_EVENT_GET, (WPARAM)lParam, (LPARAM)&dbei); + if (dbei.flags & (DBEF_SENT | DBEF_READ) || (dbei.eventType != EVENTTYPE_AUTHREQUEST && dbei.eventType != EVENTTYPE_ADDED)) + return 0; + + dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, lParam, 0); + dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); + CallService(MS_DB_EVENT_GET, lParam, (LPARAM)&dbei); + + HANDLE hContact = *(PHANDLE)(dbei.pBlob + sizeof(DWORD)); + + CLISTEVENT cli = {0}; + cli.cbSize = sizeof(cli); + cli.hContact = hContact; + cli.ptszTooltip = szTooltip; + cli.flags = CLEF_TCHAR; + cli.lParam = lParam; + cli.hDbEvent = hDbEvent; + + CONTACTINFO ci = {0}; + ci.cbSize = sizeof(ci); + ci.hContact = hContact; + ci.szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + ci.dwFlag = CNF_UNIQUEID | CNF_TCHAR; + if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) { + switch (ci.type) { + case CNFT_ASCIIZ: + mir_sntprintf(szUid, SIZEOF(szUid), _T("%s"), ci.pszVal); + mir_free(ci.pszVal); + break; + + case CNFT_DWORD: + mir_sntprintf(szUid, SIZEOF(szUid), _T("%u"), ci.dVal); + break; + } + } + + if (dbei.eventType == EVENTTYPE_AUTHREQUEST) { + SkinPlaySound("AuthRequest"); + if (szUid[0]) + mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%s requests authorization"), szUid); + else + mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%u requests authorization"), *((PDWORD)dbei.pBlob)); + + cli.hIcon = LoadSkinIcon(SKINICON_OTHER_MIRANDA); + cli.pszService = MS_AUTH_SHOWREQUEST; + CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cli); + } + else if (dbei.eventType == EVENTTYPE_ADDED) { + SkinPlaySound("AddedEvent"); + if (szUid[0]) + mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%s added you to their contact list"), szUid); + else + mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%u added you to their contact list"), *((PDWORD)dbei.pBlob)); + + cli.hIcon = LoadSkinIcon(SKINICON_OTHER_MIRANDA); + cli.pszService = MS_AUTH_SHOWADDED; + CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cli); + } + return 0; +} + +int LoadSendRecvAuthModule(void) +{ + CreateServiceFunction(MS_AUTH_SHOWREQUEST, ShowReqWindow); + CreateServiceFunction(MS_AUTH_SHOWADDED, ShowAddedWindow); + HookEvent(ME_DB_EVENT_ADDED, AuthEventAdded); + + SkinAddNewSoundEx("AuthRequest", LPGEN("Alerts"), LPGEN("Authorization request")); + SkinAddNewSoundEx("AddedEvent", LPGEN("Alerts"), LPGEN("Added event")); + + return 0; +} diff --git a/src/core/stdauth/authdialogs.cpp b/src/core/stdauth/authdialogs.cpp new file mode 100644 index 0000000000..f9aaee1e28 --- /dev/null +++ b/src/core/stdauth/authdialogs.cpp @@ -0,0 +1,299 @@ +/* + +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. +*/ + +#include "commonheaders.h" + +INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HANDLE hDbEvent = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (msg) { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User's Details")); + Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add Contact Permanently to List")); + + hDbEvent = (HANDLE)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + //blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ) + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hDbEvent, 0); + dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); + CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); + + DWORD uin = *(PDWORD)dbei.pBlob; + HANDLE hContact = *(HANDLE*)(dbei.pBlob + sizeof(DWORD)); + char* nick = (char *)(dbei.pBlob + sizeof(DWORD) + sizeof(HANDLE)); + char* first = nick + strlen(nick) + 1; + char* last = first + strlen(first) + 1; + char* email = last + strlen(last) + 1; + + SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0)); + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0)); + + PROTOACCOUNT* acc = ProtoGetAccount(dbei.szModule); + + TCHAR* lastT = dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last); + TCHAR* firstT = dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first); + TCHAR* nickT = dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick); + TCHAR* emailT = dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email); + + TCHAR name[128] = _T(""); + int off = 0; + if (firstT[0] && lastT[0]) + off = mir_sntprintf(name, SIZEOF(name), _T("%s %s"), firstT, lastT); + else if (firstT[0]) + off = mir_sntprintf(name, SIZEOF(name), _T("%s"), firstT); + else if (lastT[0]) + off = mir_sntprintf(name, SIZEOF(name), _T("%s"), lastT); + if (nickT[0]) + { + if (off) + mir_sntprintf(name + off, SIZEOF(name) - off, _T(" (%s)"), nickT); + else + mir_sntprintf(name, SIZEOF(name), _T("%s"), nickT); + } + if ( !name[0]) + _tcscpy(name, TranslateT("")); + + TCHAR hdr[256]; + if (uin && emailT[0]) + mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u (%s) on %s"), name, uin, emailT, acc->tszAccountName); + else if (uin) + mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u on %s"), name, uin, acc->tszAccountName); + else + mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%s on %s"), name, emailT[0] ? emailT : TranslateT("(Unknown)"), acc->tszAccountName); + + SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr); + + mir_free(lastT); + mir_free(firstT); + mir_free(nickT); + mir_free(emailT); + + SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact); + + if (hContact == INVALID_HANDLE_VALUE || !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) + ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); + } + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDC_ADD: + { + ADDCONTACTSTRUCT acs = {0}; + acs.handle = hDbEvent; + acs.handleType = HANDLE_EVENT; + acs.szProto = ""; + CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); + + HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); + if ((hContact == INVALID_HANDLE_VALUE) || !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) + ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); + break; + } + case IDC_DETAILS: + { + HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); + CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); + break; + } + + case IDOK: + { + ADDCONTACTSTRUCT acs = {0}; + acs.handle = hDbEvent; + acs.handleType = HANDLE_EVENT; + acs.szProto = ""; + CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); + } + //fall through + case IDCANCEL: + DestroyWindow(hwndDlg); + break; + } + break; + + case WM_DESTROY: + Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); + Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); + DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); + DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); + break; + } + return FALSE; +} + +INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HANDLE hDbEvent = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User Details")); + Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add Contact Permanently to List")); + { + hDbEvent = (HANDLE)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + //blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ), reason(ASCIIZ) + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hDbEvent, 0); + dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); + CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); + + DWORD uin = *(PDWORD)dbei.pBlob; + HANDLE hContact = *(HANDLE*)(dbei.pBlob + sizeof(DWORD)); + char *nick = (char *)(dbei.pBlob + sizeof(DWORD) + sizeof(HANDLE)); + char *first = nick + strlen(nick) + 1; + char *last = first + strlen(first) + 1; + char *email = last + strlen(last) + 1; + char *reason = email + strlen(email) + 1; + + SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0)); + SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0)); + + PROTOACCOUNT* acc = ProtoGetAccount(dbei.szModule); + + TCHAR* lastT = dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last); + TCHAR* firstT = dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first); + TCHAR* nickT = dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick); + TCHAR* emailT = dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email); + TCHAR* reasonT = dbei.flags & DBEF_UTF ? Utf8DecodeT(reason) : mir_a2t(reason); + + TCHAR name[128] = _T(""); + int off = 0; + if (firstT[0] && lastT[0]) + off = mir_sntprintf(name, SIZEOF(name), _T("%s %s"), firstT, lastT); + else if (firstT[0]) + off = mir_sntprintf(name, SIZEOF(name), _T("%s"), firstT); + else if (lastT[0]) + off = mir_sntprintf(name, SIZEOF(name), _T("%s"), lastT); + if (nickT[0]) { + if (off) + mir_sntprintf(name + off, SIZEOF(name) - off, _T(" (%s)"), nickT); + else + mir_sntprintf(name, SIZEOF(name), _T("%s"), nickT); + } + if ( !name[0]) + _tcscpy(name, TranslateT("")); + + TCHAR hdr[256]; + if (uin && emailT[0]) + mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%u (%s) on %s"), name, uin, emailT, acc->tszAccountName); + else if (uin) + mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%u on %s"), name, uin, acc->tszAccountName); + else + mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%s on %s"), name, emailT[0] ? emailT : TranslateT("(Unknown)"), acc->tszAccountName); + + SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr); + SetDlgItemText(hwndDlg, IDC_REASON, reasonT); + + mir_free(lastT); + mir_free(firstT); + mir_free(nickT); + mir_free(emailT); + mir_free(reasonT); + + if (hContact == INVALID_HANDLE_VALUE || !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) + ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); + + SendDlgItemMessage(hwndDlg, IDC_DENYREASON, EM_LIMITTEXT, 255, 0); + if (CallProtoService(dbei.szModule, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_NOAUTHDENYREASON) { + EnableWindow(GetDlgItem(hwndDlg, IDC_DENYREASON), FALSE); + SetDlgItemText(hwndDlg, IDC_DENYREASON, TranslateT("Feature is not supported by protocol")); + } + if ( !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) { + EnableWindow(GetDlgItem(hwndDlg, IDC_ADDCHECK), FALSE); + CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_UNCHECKED); + } + else CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_CHECKED); + + SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact); + } + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDC_DETAILS: + CallService(MS_USERINFO_SHOWDIALOG, GetWindowLongPtr((HWND)lParam, GWLP_USERDATA), 0); + break; + + case IDC_DECIDELATER: + DestroyWindow(hwndDlg); + break; + + case IDOK: + { + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); + CallProtoService(dbei.szModule, PS_AUTHALLOW, (WPARAM)hDbEvent, 0); + + if (IsDlgButtonChecked(hwndDlg, IDC_ADDCHECK)) + { + ADDCONTACTSTRUCT acs = {0}; + acs.handle = hDbEvent; + acs.handleType = HANDLE_EVENT; + acs.szProto = ""; + CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); + } + } + DestroyWindow(hwndDlg); + break; + + case IDCANCEL: + { + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); + + if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_DENYREASON))) + { + TCHAR szReason[256]; + GetDlgItemText(hwndDlg, IDC_DENYREASON, szReason, SIZEOF(szReason)); + CallProtoService(dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, (LPARAM)szReason); + } + else + CallProtoService(dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, 0); + } + DestroyWindow(hwndDlg); + break;; + } + break; + + case WM_DESTROY: + Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); + Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); + DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); + DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); + break; + } + return FALSE; +} diff --git a/src/core/stdauth/commonheaders.cpp b/src/core/stdauth/commonheaders.cpp new file mode 100644 index 0000000000..95b2201163 --- /dev/null +++ b/src/core/stdauth/commonheaders.cpp @@ -0,0 +1,2 @@ +#include "commonheaders.h" + diff --git a/src/core/stdauth/commonheaders.h b/src/core/stdauth/commonheaders.h new file mode 100644 index 0000000000..c9ed5a65d2 --- /dev/null +++ b/src/core/stdauth/commonheaders.h @@ -0,0 +1,93 @@ +/* + +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. +*/ + +// to enable all 0.9.0 core functions +#define MIRANDA_VER 0x0A00 + +#define WINVER 0x0700 +#define _WIN32_WINNT 0x0700 +#define _WIN32_IE 0x0601 + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "version.h" + +#include "../../resource.h" +#include "../stdplug.h" + +extern HINSTANCE hInst; diff --git a/src/core/stdauth/main.cpp b/src/core/stdauth/main.cpp new file mode 100644 index 0000000000..cdb8d8e17b --- /dev/null +++ b/src/core/stdauth/main.cpp @@ -0,0 +1,72 @@ +/* + +Standard URL plugin for Myranda IM + +Copyright (C) 2012 George Hazan + +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., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "commonheaders.h" + +int LoadSendRecvAuthModule(void); + +HINSTANCE hInst; +int hLangpack; + +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + MIRANDA_VERSION_DWORD, + __DESCRIPTION, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + /* 8d0a046d-8ea9-4c55-b568-38da520564fd */ + { 0x8d0a046d, 0x8ea9, 0x4c55, {0xb5, 0x68, 0x38, 0xda, 0x52, 0x05, 0x64, 0xfd}} +}; + +static const MUUID interfaces[] = { MIID_SRURL, MIID_LAST }; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + hInst = hinstDLL; + return TRUE; +} + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) +{ + return interfaces; +} + +extern "C" int __declspec(dllexport) Load(void) +{ + mir_getLP(&pluginInfo); + + LoadSendRecvAuthModule(); + return 0; +} + +extern "C" int __declspec(dllexport) Unload(void) +{ + return 0; +} diff --git a/src/core/stdauth/resource.rc b/src/core/stdauth/resource.rc new file mode 100644 index 0000000000..3f7ef0c552 --- /dev/null +++ b/src/core/stdauth/resource.rc @@ -0,0 +1,107 @@ +// Microsoft Visual C++ generated resource script. +// +#include "..\..\resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_AUTHREQ DIALOGEX 0, 0, 271, 197 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Authorization Request" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_HEADERBAR,"MHeaderbarCtrl",0x0,0,0,271,25 + DEFPUSHBUTTON "&Authorize",IDOK,17,176,50,14 + PUSHBUTTON "&Deny",IDCANCEL,97,176,50,14 + PUSHBUTTON "Decide &Later",IDC_DECIDELATER,175,176,74,14 + CONTROL "&I",IDC_DETAILS,"MButtonClass",WS_TABSTOP,248,29,16,14,WS_EX_NOACTIVATE | 0x10000000L + LTEXT "Reason:",IDC_STATIC,7,39,101,10,SS_CENTERIMAGE + EDITTEXT IDC_REASON,7,50,257,54,ES_MULTILINE | ES_READONLY | NOT WS_BORDER | WS_VSCROLL | WS_HSCROLL,WS_EX_STATICEDGE + LTEXT "Denial Reason:",IDC_STATIC,7,111,89,10,SS_CENTERIMAGE | SS_REALSIZECONTROL + EDITTEXT IDC_DENYREASON,7,124,257,32,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_BORDER,WS_EX_STATICEDGE + CONTROL "Add to contact list if authorized",IDC_ADDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,239,10 +END + +IDD_ADDED DIALOGEX 0, 0, 241, 70 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "You Were Added" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_HEADERBAR,"MHeaderbarCtrl",0x0,0,0,241,25 + PUSHBUTTON "&Close",IDCANCEL,90,51,60,14 + CONTROL "&I",IDC_DETAILS,"MButtonClass",WS_TABSTOP,217,29,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&U",IDC_ADD,"MButtonClass",WS_TABSTOP,197,29,16,14,WS_EX_NOACTIVATE | 0x10000000L +END + +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED + IDD_AUTHREQ, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 264 + BOTTOMMARGIN, 190 + END + + IDD_ADDED, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 233 + TOPMARGIN, 3 + BOTTOMMARGIN, 65 + END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "..\..\resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \r\n" + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED diff --git a/src/core/stdauth/stdauth_10.vcxproj b/src/core/stdauth/stdauth_10.vcxproj new file mode 100644 index 0000000000..1e21ce83a0 --- /dev/null +++ b/src/core/stdauth/stdauth_10.vcxproj @@ -0,0 +1,217 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + stdauth + {86E0715E-C769-11E1-A41D-6CED6188709B} + + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Configuration)\Core\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)\Core\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Core\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Core\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + true + + + + Full + OnlyExplicitInline + Size + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + true + false + true + Fast + Level3 + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda32.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + true + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + Disabled + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + false + true + EnableFastChecks + MultiThreadedDebugDLL + true + Level3 + EditAndContinue + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda32.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + Full + OnlyExplicitInline + Size + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + true + false + true + Fast + Level3 + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda64.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + true + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + Disabled + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + false + true + EnableFastChecks + MultiThreadedDebugDLL + true + Level3 + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda64.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/core/stdauth/stdauth_10.vcxproj.filters b/src/core/stdauth/stdauth_10.vcxproj.filters new file mode 100644 index 0000000000..cb87b64c31 --- /dev/null +++ b/src/core/stdauth/stdauth_10.vcxproj.filters @@ -0,0 +1,47 @@ + + + + + {5c074c9e-6c66-4233-bbd3-a50170fccf47} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {e30af2c4-42d4-4342-8eb9-2dbca157c6bb} + h;hpp;hxx;hm;inl + + + {9208a050-ffae-47fa-bc98-4ca4f79d37d7} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/src/core/stdauth/version.h b/src/core/stdauth/version.h new file mode 100644 index 0000000000..140b61ff66 --- /dev/null +++ b/src/core/stdauth/version.h @@ -0,0 +1,14 @@ + +#include + +#define __FILEVERSION_STRING MIRANDA_VERSION_FILEVERSION +#define __VERSION_STRING MIRANDA_VERSION_STRING + +#define __PLUGIN_NAME "stdauth" +#define __INTERNAL_NAME "stdauth" +#define __FILENAME "stdauth.dll" +#define __DESCRIPTION "Core module for sending/receiving auth requests." +#define __AUTHOR "Myranda team" +#define __AUTHOREMAIL "" +#define __AUTHORWEB "http://nightly.miranda.im" +#define __COPYRIGHT "© 2012 Myranda team" diff --git a/src/core/stdauth/version.rc b/src/core/stdauth/version.rc new file mode 100644 index 0000000000..e637f0cb33 --- /dev/null +++ b/src/core/stdauth/version.rc @@ -0,0 +1,38 @@ +// Microsoft Visual C++ generated resource script. +// +#include "afxres.h" +#include "version.h" + +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#endif //_WIN32 + +VS_VERSION_INFO VERSIONINFO + FILEVERSION __FILEVERSION_STRING + PRODUCTVERSION __FILEVERSION_STRING + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x0L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "FileDescription", __DESCRIPTION + VALUE "InternalName", __PLUGIN_NAME + VALUE "LegalCopyright", __COPYRIGHT + VALUE "OriginalFilename", __FILENAME + VALUE "ProductName", __PLUGIN_NAME + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END diff --git a/src/core/stdfile/commonheaders.cpp b/src/core/stdfile/commonheaders.cpp new file mode 100644 index 0000000000..95b2201163 --- /dev/null +++ b/src/core/stdfile/commonheaders.cpp @@ -0,0 +1,2 @@ +#include "commonheaders.h" + diff --git a/src/core/stdfile/commonheaders.h b/src/core/stdfile/commonheaders.h new file mode 100644 index 0000000000..b1593709c8 --- /dev/null +++ b/src/core/stdfile/commonheaders.h @@ -0,0 +1,100 @@ +/* + +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. +*/ + +// to enable all 0.9.0 core functions +#define MIRANDA_VER 0x0A00 + +#define WINVER 0x0700 +#define _WIN32_WINNT 0x0700 +#define _WIN32_IE 0x0601 + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "version.h" + +#include "../../resource.h" +#include "../stdplug.h" + +extern HINSTANCE hInst; + +extern ITaskbarList3 * pTaskbarInterface; + +typedef HRESULT (STDAPICALLTYPE *pfnSHAutoComplete)(HWND, DWORD); +extern pfnSHAutoComplete shAutoComplete; diff --git a/src/core/stdfile/file.cpp b/src/core/stdfile/file.cpp new file mode 100644 index 0000000000..45a84aaeaf --- /dev/null +++ b/src/core/stdfile/file.cpp @@ -0,0 +1,487 @@ +/* + +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. +*/ + +#include "commonheaders.h" +#include "file.h" + +TCHAR* PFTS_StringToTchar(int flags, const PROTOCHAR* s); +int PFTS_CompareWithTchar(PROTOFILETRANSFERSTATUS* ft, const PROTOCHAR* s, TCHAR* r); + +static HANDLE hSRFileMenuItem; + +TCHAR *GetContactID(HANDLE hContact) +{ + TCHAR *theValue = {0}; + char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if (DBGetContactSettingByte(hContact, szProto, "ChatRoom", 0) == 1) { + DBVARIANT dbv; + if ( !DBGetContactSettingTString(hContact, szProto, "ChatRoomID", &dbv)) { + theValue = (TCHAR *)mir_tstrdup(dbv.ptszVal); + DBFreeVariant(&dbv); + return theValue; + } } + else { + CONTACTINFO ci = {0}; + ci.cbSize = sizeof(ci); + ci.hContact = hContact; + ci.szProto = szProto; + ci.dwFlag = CNF_UNIQUEID | CNF_TCHAR; + if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { + switch (ci.type) { + case CNFT_ASCIIZ: + return (TCHAR *)ci.pszVal; + break; + case CNFT_DWORD: + return _itot(ci.dVal, (TCHAR *)mir_alloc(sizeof(TCHAR)*32), 10); + break; + } } } + return NULL; +} + +static INT_PTR SendFileCommand(WPARAM wParam, LPARAM) +{ + struct FileSendData fsd; + fsd.hContact = (HANDLE)wParam; + fsd.ppFiles = NULL; + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd); + return 0; +} + +static INT_PTR SendSpecificFiles(WPARAM wParam, LPARAM lParam) +{ + FileSendData fsd; + fsd.hContact = (HANDLE)wParam; + + char** ppFiles = (char**)lParam; + int count = 0; + while (ppFiles[count] != NULL) + count++; + + fsd.ppFiles = (const TCHAR**)alloca((count+1) * sizeof(void*)); + for (int i=0; i < count; i++) + fsd.ppFiles[i] = (const TCHAR*)mir_a2t(ppFiles[i]); + fsd.ppFiles[ count ] = NULL; + + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd); + for (int j = 0; j < count; j++) + mir_free((void*)fsd.ppFiles[j]); + return 0; +} + +static INT_PTR SendSpecificFilesT(WPARAM wParam, LPARAM lParam) +{ + FileSendData fsd; + fsd.hContact = (HANDLE)wParam; + fsd.ppFiles = (const TCHAR**)lParam; + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd); + return 0; +} + +static INT_PTR GetReceivedFilesFolder(WPARAM wParam, LPARAM lParam) +{ + TCHAR buf[MAX_PATH]; + GetContactReceivedFilesDir((HANDLE)wParam, buf, MAX_PATH, TRUE); + char* dir = mir_t2a(buf); + lstrcpynA((char*)lParam, dir, MAX_PATH); + mir_free(dir); + return 0; +} + +static INT_PTR RecvFileCommand(WPARAM, LPARAM lParam) +{ + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, lParam); + return 0; +} + +void PushFileEvent(HANDLE hContact, HANDLE hdbe, LPARAM lParam) +{ + CLISTEVENT cle = {0}; + cle.cbSize = sizeof(cle); + cle.hContact = hContact; + cle.hDbEvent = hdbe; + cle.lParam = lParam; + if (DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0) && !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) { + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, (LPARAM)&cle); + } + else { + SkinPlaySound("RecvFile"); + + TCHAR szTooltip[256]; + mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("File from %s"), pcli->pfnGetContactDisplayName(hContact, 0)); + cle.ptszTooltip = szTooltip; + + cle.flags |= CLEF_TCHAR; + cle.hIcon = LoadSkinIcon(SKINICON_EVENT_FILE); + cle.pszService = "SRFile/RecvFile"; + CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle); +} } + +static int FileEventAdded(WPARAM wParam, LPARAM lParam) +{ + DWORD dwSignature; + + DBEVENTINFO dbei = {0}; + dbei.cbSize = sizeof(dbei); + dbei.cbBlob = sizeof(DWORD); + dbei.pBlob = (PBYTE)&dwSignature; + CallService(MS_DB_EVENT_GET, lParam, (LPARAM)&dbei); + if (dbei.flags&(DBEF_SENT|DBEF_READ) || dbei.eventType != EVENTTYPE_FILE || dwSignature == 0) + return 0; + + PushFileEvent((HANDLE)wParam, (HANDLE)lParam, 0); + return 0; +} + +int SRFile_GetRegValue(HKEY hKeyBase, const TCHAR *szSubKey, const TCHAR *szValue, TCHAR *szOutput, int cbOutput) +{ + HKEY hKey; + DWORD cbOut = cbOutput; + + if (RegOpenKeyEx(hKeyBase, szSubKey, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) + return 0; + + if (RegQueryValueEx(hKey, szValue, NULL, NULL, (PBYTE)szOutput, &cbOut) != ERROR_SUCCESS) { + RegCloseKey(hKey); + return 0; + } + + RegCloseKey(hKey); + return 1; +} + +void GetSensiblyFormattedSize(__int64 size, TCHAR *szOut, int cchOut, int unitsOverride, int appendUnits, int *unitsUsed) +{ + if ( !unitsOverride) { + if (size<1000) unitsOverride = UNITS_BYTES; + else if (size<100*1024) unitsOverride = UNITS_KBPOINT1; + else if (size<1024*1024) unitsOverride = UNITS_KBPOINT0; + else if (size<1024*1024*1024) unitsOverride = UNITS_MBPOINT2; + else unitsOverride = UNITS_GBPOINT3; + } + if (unitsUsed) *unitsUsed = unitsOverride; + switch(unitsOverride) { + case UNITS_BYTES: mir_sntprintf(szOut, cchOut, _T("%u%s%s"), (int)size, appendUnits?_T(" "):_T(""), appendUnits?TranslateT("bytes"):_T("")); break; + case UNITS_KBPOINT1: mir_sntprintf(szOut, cchOut, _T("%.1lf%s"), size/1024.0, appendUnits?_T(" KB"):_T("")); break; + case UNITS_KBPOINT0: mir_sntprintf(szOut, cchOut, _T("%u%s"), (int)(size/1024), appendUnits?_T(" KB"):_T("")); break; + case UNITS_GBPOINT3: mir_sntprintf(szOut, cchOut, _T("%.3f%s"), (size >> 20)/1024.0, appendUnits?_T(" GB"):_T("")); break; + default: mir_sntprintf(szOut, cchOut, _T("%.2lf%s"), size/1048576.0, appendUnits?_T(" MB"):_T("")); break; + } +} + +// Tripple redirection sucks but is needed to nullify the array pointer +void FreeFilesMatrix(TCHAR ***files) +{ + if (*files == NULL) + return; + + // Free each filename in the pointer array + TCHAR **pFile = *files; + while (*pFile != NULL) + { + mir_free(*pFile); + *pFile = NULL; + pFile++; + } + + // Free the array itself + mir_free(*files); + *files = NULL; +} + +void FreeProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *fts) +{ + mir_free(fts->tszCurrentFile); + if (fts->ptszFiles) { + for (int i=0;itotalFiles;i++) mir_free(fts->ptszFiles[i]); + mir_free(fts->ptszFiles); + } + mir_free(fts->tszWorkingDir); +} + +void CopyProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src) +{ + *dest = *src; + if (src->tszCurrentFile) dest->tszCurrentFile = PFTS_StringToTchar(src->flags, src->tszCurrentFile); + if (src->ptszFiles) { + dest->ptszFiles = (TCHAR**)mir_alloc(sizeof(TCHAR*)*src->totalFiles); + for (int i=0; i < src->totalFiles; i++) + dest->ptszFiles[i] = PFTS_StringToTchar(src->flags, src->ptszFiles[i]); + } + if (src->tszWorkingDir) dest->tszWorkingDir = PFTS_StringToTchar(src->flags, src->tszWorkingDir); + dest->flags &= ~PFTS_UTF; + dest->flags |= PFTS_TCHAR; +} + +void UpdateProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src) +{ + dest->hContact = src->hContact; + dest->flags = src->flags; + if (dest->totalFiles != src->totalFiles) { + for (int i=0;itotalFiles;i++) mir_free(dest->ptszFiles[i]); + mir_free(dest->ptszFiles); + dest->ptszFiles = NULL; + dest->totalFiles = src->totalFiles; + } + if (src->ptszFiles) { + if ( !dest->ptszFiles) + dest->ptszFiles = (TCHAR**)mir_calloc(sizeof(TCHAR*)*src->totalFiles); + for (int i=0; i < src->totalFiles; i++) + if ( !dest->ptszFiles[i] || !src->ptszFiles[i] || PFTS_CompareWithTchar(src, src->ptszFiles[i], dest->ptszFiles[i])) { + mir_free(dest->ptszFiles[i]); + if (src->ptszFiles[i]) + dest->ptszFiles[i] = PFTS_StringToTchar(src->flags, src->ptszFiles[i]); + else + dest->ptszFiles[i] = NULL; + } + } + else if (dest->ptszFiles) { + for (int i=0; i < dest->totalFiles; i++) + mir_free(dest->ptszFiles[i]); + mir_free(dest->ptszFiles); + dest->ptszFiles = NULL; + } + + dest->currentFileNumber = src->currentFileNumber; + dest->totalBytes = src->totalBytes; + dest->totalProgress = src->totalProgress; + if (src->tszWorkingDir && ( !dest->tszWorkingDir || PFTS_CompareWithTchar(src, src->tszWorkingDir, dest->tszWorkingDir))) { + mir_free(dest->tszWorkingDir); + if (src->tszWorkingDir) + dest->tszWorkingDir = PFTS_StringToTchar(src->flags, src->tszWorkingDir); + else + dest->tszWorkingDir = NULL; + } + + if ( !dest->tszCurrentFile || !src->tszCurrentFile || PFTS_CompareWithTchar(src, src->tszCurrentFile, dest->tszCurrentFile)) { + mir_free(dest->tszCurrentFile); + if (src->tszCurrentFile) + dest->tszCurrentFile = PFTS_StringToTchar(src->flags, src->tszCurrentFile); + else + dest->tszCurrentFile = NULL; + } + dest->currentFileSize = src->currentFileSize; + dest->currentFileProgress = src->currentFileProgress; + dest->currentFileTime = src->currentFileTime; + dest->flags &= ~PFTS_UTF; + dest->flags |= PFTS_TCHAR; +} + +static void RemoveUnreadFileEvents(void) +{ + DBEVENTINFO dbei = {0}; + HANDLE hDbEvent, hContact; + + dbei.cbSize = sizeof(dbei); + hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); + while (hContact) { + hDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDFIRSTUNREAD, (WPARAM)hContact, 0); + while (hDbEvent) { + dbei.cbBlob = 0; + CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); + if ( !(dbei.flags&(DBEF_SENT|DBEF_READ)) && dbei.eventType == EVENTTYPE_FILE) + CallService(MS_DB_EVENT_MARKREAD, (WPARAM)hContact, (LPARAM)hDbEvent); + hDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDNEXT, (WPARAM)hDbEvent, 0); + } + hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); + } +} + +static int SRFilePreBuildMenu(WPARAM wParam, LPARAM) +{ + CLISTMENUITEM mi = { 0 }; + mi.cbSize = sizeof(mi); + mi.flags = CMIM_FLAGS | CMIF_HIDDEN; + + char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, wParam, 0); + if (szProto != NULL) { + if ( CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_FILESEND) { + if ( CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_OFFLINEFILES) + mi.flags = CMIM_FLAGS; + else if (DBGetContactSettingWord((HANDLE)wParam, szProto, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) + mi.flags = CMIM_FLAGS; + } } + + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hSRFileMenuItem, (LPARAM)&mi); + return 0; +} + +static int SRFileModulesLoaded(WPARAM, LPARAM) +{ + CLISTMENUITEM mi = { 0 }; + mi.cbSize = sizeof(mi); + mi.position = -2000020000; + mi.icolibItem = GetSkinIconHandle(SKINICON_EVENT_FILE); + mi.pszName = LPGEN("&File"); + mi.pszService = MS_FILE_SENDFILE; + mi.flags = CMIF_ICONFROMICOLIB; + hSRFileMenuItem = Menu_AddContactMenuItem(&mi); + + RemoveUnreadFileEvents(); + return 0; +} + +INT_PTR FtMgrShowCommand(WPARAM, LPARAM) +{ + FtMgr_Show(true, true); + return 0; +} + +INT_PTR openContRecDir(WPARAM wparam, LPARAM) +{ + TCHAR szContRecDir[MAX_PATH]; + HANDLE hContact = (HANDLE)wparam; + GetContactReceivedFilesDir(hContact, szContRecDir, SIZEOF(szContRecDir), TRUE); + ShellExecute(0, _T("open"), szContRecDir, 0, 0, SW_SHOW); + return 0; +} + +INT_PTR openRecDir(WPARAM, LPARAM) +{ + TCHAR szContRecDir[MAX_PATH]; + GetReceivedFilesDir(szContRecDir, SIZEOF(szContRecDir)); + ShellExecute(0, _T("open"), szContRecDir, 0, 0, SW_SHOW); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +static void sttRecvCreateBlob(DBEVENTINFO& dbei, int fileCount, char** pszFiles, char* szDescr) +{ + dbei.cbBlob = sizeof(DWORD); + { + for (int i=0; i < fileCount; i++) + dbei.cbBlob += lstrlenA(pszFiles[i]) + 1; + } + + dbei.cbBlob += lstrlenA(szDescr) + 1; + + if ((dbei.pBlob = (BYTE*)mir_alloc(dbei.cbBlob)) == 0) + return; + + *(DWORD*)dbei.pBlob = 0; + BYTE* p = dbei.pBlob + sizeof(DWORD); + for (int i=0; i < fileCount; i++) { + strcpy((char*)p, pszFiles[i]); + p += lstrlenA(pszFiles[i]) + 1; + } + strcpy((char*)p, (szDescr == NULL) ? "" : szDescr); +} + +static INT_PTR Proto_RecvFile(WPARAM, LPARAM lParam) +{ + CCSDATA* ccs = (CCSDATA*)lParam; + PROTORECVEVENT* pre = (PROTORECVEVENT*)ccs->lParam; + char* szFile = pre->szMessage + sizeof(DWORD); + char* szDescr = szFile + strlen(szFile) + 1; + + // Suppress the standard event filter + if (pre->lParam != NULL) + *(DWORD*)pre->szMessage = 0; + + DBEVENTINFO dbei = { 0 }; + dbei.cbSize = sizeof(dbei); + dbei.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)ccs->hContact, 0); + dbei.timestamp = pre->timestamp; + dbei.flags = (pre->flags & PREF_CREATEREAD) ? DBEF_READ : 0; + dbei.flags |= (pre->flags & PREF_UTF) ? DBEF_UTF : 0; + dbei.eventType = EVENTTYPE_FILE; + dbei.cbBlob = (DWORD)(sizeof(DWORD) + strlen(szFile) + strlen(szDescr) + 2); + dbei.pBlob = (PBYTE)pre->szMessage; + HANDLE hdbe = (HANDLE)CallService(MS_DB_EVENT_ADD, (WPARAM)ccs->hContact, (LPARAM)&dbei); + + if (pre->lParam != NULL) + PushFileEvent(ccs->hContact, hdbe, pre->lParam); + return 0; +} + +static INT_PTR Proto_RecvFileT(WPARAM, LPARAM lParam) +{ + CCSDATA* ccs = (CCSDATA*)lParam; + PROTORECVFILET* pre = (PROTORECVFILET*)ccs->lParam; + if (pre->fileCount == 0) + return 0; + + DBEVENTINFO dbei = { 0 }; + dbei.cbSize = sizeof(dbei); + dbei.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)ccs->hContact, 0); + dbei.timestamp = pre->timestamp; + dbei.flags = (pre->flags & PREF_CREATEREAD) ? DBEF_READ : 0; + dbei.eventType = EVENTTYPE_FILE; + + char** pszFiles = (char**)alloca(pre->fileCount * sizeof(char*)); + { + for (int i=0; i < pre->fileCount; i++) + pszFiles[i] = Utf8EncodeT(pre->ptszFiles[i]); + } + char* szDescr = Utf8EncodeT(pre->tszDescription); + dbei.flags |= DBEF_UTF; + sttRecvCreateBlob(dbei, pre->fileCount, pszFiles, szDescr); + { + for (int i=0; i < pre->fileCount; i++) + mir_free(pszFiles[i]); + } + mir_free(szDescr); + + HANDLE hdbe = (HANDLE)CallService(MS_DB_EVENT_ADD, (WPARAM)ccs->hContact, (LPARAM)&dbei); + + PushFileEvent(ccs->hContact, hdbe, pre->lParam); + mir_free(dbei.pBlob); + return 0; +} + +int LoadSendRecvFileModule(void) +{ + CreateServiceFunction("FtMgr/Show", FtMgrShowCommand); + + CLISTMENUITEM mi = { 0 }; + mi.cbSize = sizeof(mi); + mi.flags = CMIF_ICONFROMICOLIB; + mi.icolibItem = GetSkinIconHandle(SKINICON_EVENT_FILE); + mi.position = 1900000000; + mi.pszName = LPGEN("File &Transfers..."); + mi.pszService = "FtMgr/Show"; //MS_PROTO_SHOWFTMGR; + Menu_AddMainMenuItem(&mi); + + HookEvent(ME_SYSTEM_MODULESLOADED, SRFileModulesLoaded); + HookEvent(ME_DB_EVENT_ADDED, FileEventAdded); + HookEvent(ME_OPT_INITIALISE, FileOptInitialise); + HookEvent(ME_CLIST_PREBUILDCONTACTMENU, SRFilePreBuildMenu); + + CreateServiceFunction(MS_PROTO_RECVFILE, Proto_RecvFile); + CreateServiceFunction(MS_PROTO_RECVFILET, Proto_RecvFileT); + + CreateServiceFunction(MS_FILE_SENDFILE, SendFileCommand); + CreateServiceFunction(MS_FILE_SENDSPECIFICFILES, SendSpecificFiles); + CreateServiceFunction(MS_FILE_SENDSPECIFICFILEST, SendSpecificFilesT); + CreateServiceFunction(MS_FILE_GETRECEIVEDFILESFOLDER, GetReceivedFilesFolder); + CreateServiceFunction("SRFile/RecvFile", RecvFileCommand); + + CreateServiceFunction("SRFile/OpenContRecDir", openContRecDir); + CreateServiceFunction("SRFile/OpenRecDir", openRecDir); + + SkinAddNewSoundEx("RecvFile", LPGEN("File"), LPGEN("Incoming")); + SkinAddNewSoundEx("FileDone", LPGEN("File"), LPGEN("Complete")); + SkinAddNewSoundEx("FileFailed", LPGEN("File"), LPGEN("Error")); + SkinAddNewSoundEx("FileDenied", LPGEN("File"), LPGEN("Denied")); + return 0; +} diff --git a/src/core/stdfile/file.h b/src/core/stdfile/file.h new file mode 100644 index 0000000000..d814e99ab4 --- /dev/null +++ b/src/core/stdfile/file.h @@ -0,0 +1,115 @@ +/* + +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. +*/ + +#define VIRUSSCAN_DISABLE 0 +#define VIRUSSCAN_AFTERDL 1 +#define VIRUSSCAN_DURINGDL 2 + +#define FILERESUME_ASK 0 +//1, 2, 3, 4: resume, overwrite, rename, skip: from proto library +#define FILERESUMEF_ALL 0x80 +#define FILERESUME_RESUMEALL (FILERESUME_RESUME|FILERESUMEF_ALL) +#define FILERESUME_OVERWRITEALL (FILERESUME_OVERWRITE|FILERESUMEF_ALL) +#define FILERESUME_RENAMEALL (FILERESUME_RENAME|FILERESUMEF_ALL) +#define FILERESUME_CANCEL 0xFFFFFFFF + +#define M_FILEEXISTSDLGREPLY (WM_USER+200) +#define M_PRESHUTDOWN (WM_USER+201) + +struct FileSendData { + HANDLE hContact; + const TCHAR **ppFiles; +}; + +#define BYTESRECVEDHISTORYCOUNT 10 //the number of bytes recved is sampled once a second and the last 10 are used to get the transfer speed +struct FileDlgData { + HWND hwndTransfer; + HANDLE fs; + HANDLE hContact; + HANDLE hDbEvent; + HANDLE hNotifyEvent; + TCHAR **files; + int send; + int closeIfFileChooseCancelled; + int resumeBehaviour; + int bytesRecvedHistory[BYTESRECVEDHISTORYCOUNT]; + int bytesRecvedHistorySize; + int waitingForAcceptance; + PROTOFILETRANSFERSTATUS transferStatus; + int *fileVirusScanned; + HANDLE hPreshutdownEvent; + DWORD dwTicks; + + TCHAR szSavePath[MAX_PATH]; + TCHAR szMsg[450], szFilenames[1024]; + HICON hIcon, hIconFolder; +}; + +//file.c +#define UNITS_BYTES 1 // 0 <= size<1000: "%d bytes" +#define UNITS_KBPOINT1 2 // 1000 <= size<100*1024: "%.1f KB" +#define UNITS_KBPOINT0 3 // 100*1024 <= size<1024*1024: "%d KB" +#define UNITS_MBPOINT2 4 // 1024*1024 <= size: "%.2f MB" +#define UNITS_GBPOINT3 5 // 1024*1024*1024 <= size: "%.3f GB" + +void GetSensiblyFormattedSize(__int64 size, TCHAR *szOut, int cchOut, int unitsOverride, int appendUnits, int *unitsUsed); +void FreeFilesMatrix(TCHAR ***files); //loving that triple indirection +void FreeProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *fts); +void CopyProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src); +void UpdateProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src); +int SRFile_GetRegValue(HKEY hKeyBase, const TCHAR *szSubKey, const TCHAR *szValue, TCHAR *szOutput, int cbOutput); +//filesenddlg.c +INT_PTR CALLBACK DlgProcSendFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +//filerecv.c +INT_PTR CALLBACK DlgProcRecvFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +void RemoveInvalidFilenameChars(TCHAR *tszString); +void RemoveInvalidPathChars(TCHAR *tszString); +void GetContactReceivedFilesDir(HANDLE hContact, TCHAR *szDir, int cchDir, BOOL substVars); +void GetReceivedFilesDir(TCHAR *szDir, int cchDir); +int BrowseForFolder(HWND hwnd, TCHAR *szPath); +//fileexistsdlg.c +struct TDlgProcFileExistsParam +{ + HWND hwndParent; + PROTOFILETRANSFERSTATUS *fts; +}; +INT_PTR CALLBACK DlgProcFileExists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +//filexferdlg.c +INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +//fileopts.c +int FileOptInitialise(WPARAM wParam, LPARAM lParam); +//ftmanager.c +#define WM_FT_ADD (WM_USER+701) +#define WM_FT_RESIZE (WM_USER+702) +#define WM_FT_REMOVE (WM_USER+703) +#define WM_FT_SELECTPAGE (WM_USER+704) +#define WM_FT_CLEANUP (WM_USER+705) +#define WM_FT_COMPLETED (WM_USER+706) + +HWND FtMgr_Show(bool bForceActivate, bool bFromMenu); +void FtMgr_Destroy(); +HWND FtMgr_AddTransfer(struct FileDlgData *dat); + +void FreeFileDlgData(FileDlgData* dat); + +TCHAR *GetContactID(HANDLE hContact); diff --git a/src/core/stdfile/fileexistsdlg.cpp b/src/core/stdfile/fileexistsdlg.cpp new file mode 100644 index 0000000000..c0592c8b39 --- /dev/null +++ b/src/core/stdfile/fileexistsdlg.cpp @@ -0,0 +1,341 @@ +/* + +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. +*/ +#include "commonheaders.h" +#include "file.h" + +static void SetControlToUnixTime(HWND hwndDlg, UINT idCtrl, time_t unixTime) +{ + LARGE_INTEGER liFiletime; + FILETIME filetime; + SYSTEMTIME st; + char szTime[64], szDate[64], szOutput[128]; + + liFiletime.QuadPart = (BIGI(11644473600)+(__int64)unixTime)*10000000; + filetime.dwHighDateTime = liFiletime.HighPart; + filetime.dwLowDateTime = liFiletime.LowPart; + FileTimeToSystemTime(&filetime, &st); + GetTimeFormatA(LOCALE_USER_DEFAULT, 0, &st, NULL, szTime, SIZEOF(szTime)); + GetDateFormatA(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, szDate, SIZEOF(szDate)); + mir_snprintf(szOutput, SIZEOF(szOutput), "%s %s", szDate, szTime); + SetDlgItemTextA(hwndDlg, idCtrl, szOutput); +} + +#define C_CONTEXTMENU 0 +#define C_PROPERTIES 1 +// not defined in VC++ 6.0 SE +#ifndef CMF_EXTENDEDVERBS +#define CMF_EXTENDEDVERBS 0x00000100 +#endif +static void DoAnnoyingShellCommand(HWND hwnd, const TCHAR *szFilename, int cmd, POINT *ptCursor) +{ + IShellFolder *pDesktopFolder; + if (SHGetDesktopFolder(&pDesktopFolder) == NOERROR) { + ITEMIDLIST *pCurrentIdl; + WCHAR* wszFilename = (LPWSTR)szFilename; + + if (pDesktopFolder->ParseDisplayName(NULL, NULL, wszFilename, NULL, &pCurrentIdl, NULL) == NOERROR) { + if (pCurrentIdl->mkid.cb) { + ITEMIDLIST *pidl, *pidlNext, *pidlFilename; + IShellFolder *pFileFolder; + + for (pidl = pCurrentIdl;;) { + pidlNext = (ITEMIDLIST*)((PBYTE)pidl+pidl->mkid.cb); + if (pidlNext->mkid.cb == 0) { + pidlFilename = (ITEMIDLIST*)CoTaskMemAlloc(pidl->mkid.cb+sizeof(pidl->mkid.cb)); + CopyMemory(pidlFilename, pidl, pidl->mkid.cb+sizeof(pidl->mkid.cb)); + pidl->mkid.cb = 0; + break; + } + pidl = pidlNext; + } + if (pDesktopFolder->BindToObject(pCurrentIdl, NULL, IID_IShellFolder, (void**)&pFileFolder) == NOERROR) { + IContextMenu *pContextMenu; + if (pFileFolder->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&pidlFilename, IID_IContextMenu, NULL, (void**)&pContextMenu) == NOERROR) { + switch(cmd) { + case C_PROPERTIES: + { CMINVOKECOMMANDINFO ici = {0}; + ici.cbSize = sizeof(ici); + ici.hwnd = hwnd; + ici.lpVerb = "properties"; + ici.nShow = SW_SHOW; + pContextMenu->InvokeCommand(&ici); + break; + } + case C_CONTEXTMENU: + { HMENU hMenu; + hMenu = CreatePopupMenu(); + if (SUCCEEDED(pContextMenu->QueryContextMenu(hMenu, 0, 1000, 65535, (GetKeyState(VK_SHIFT)&0x8000?CMF_EXTENDEDVERBS:0)|CMF_NORMAL))) { + int cmd; + cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, ptCursor->x, ptCursor->y, 0, hwnd, NULL); + if (cmd) { + CMINVOKECOMMANDINFO ici = {0}; + ici.cbSize = sizeof(ici); + ici.hwnd = hwnd; + ici.lpVerb = MAKEINTRESOURCEA(cmd-1000); + ici.nShow = SW_SHOW; + pContextMenu->InvokeCommand(&ici); + } + } + DestroyMenu(hMenu); + break; + } + } + pContextMenu->Release(); + } + pFileFolder->Release(); + } + CoTaskMemFree(pidlFilename); + } + CoTaskMemFree(pCurrentIdl); + } + pDesktopFolder->Release(); + } +} + +static WNDPROC pfnIconWindowProc; +static LRESULT CALLBACK IconCtrlSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PROTOFILETRANSFERSTATUS* pft = (PROTOFILETRANSFERSTATUS*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); + + switch(msg) { + case WM_LBUTTONDBLCLK: + ShellExecute(hwnd, NULL, pft->tszCurrentFile, NULL, NULL, SW_SHOW); + break; + case WM_RBUTTONUP: + { POINT pt; + pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); + ClientToScreen(hwnd, &pt); + DoAnnoyingShellCommand(hwnd, pft->tszCurrentFile, C_CONTEXTMENU, &pt); + return 0; + } + } + return CallWindowProc(pfnIconWindowProc, hwnd, msg, wParam, lParam); +} + +struct loadiconsstartinfo { + HWND hwndDlg; + TCHAR *szFilename; +}; + +void __cdecl LoadIconsAndTypesThread(void* param) +{ + loadiconsstartinfo *info = (loadiconsstartinfo*)param; + SHFILEINFO fileInfo; + + if (SHGetFileInfo(info->szFilename, 0, &fileInfo, sizeof(fileInfo), SHGFI_TYPENAME|SHGFI_ICON|SHGFI_LARGEICON)) { + TCHAR *pszExtension, *pszFilename; + TCHAR szExtension[64]; + TCHAR szIconFile[MAX_PATH]; + + pszFilename = _tcsrchr(info->szFilename, '\\'); + if (pszFilename == NULL) + pszFilename = info->szFilename; + + pszExtension = _tcsrchr(pszFilename, '.'); + if (pszExtension) + lstrcpyn(szExtension, pszExtension+1, SIZEOF(szExtension)); + else { + pszExtension = _T("."); + szExtension[0] = '\0'; + } + CharUpper(szExtension); + if (fileInfo.szTypeName[0] == '\0') + mir_sntprintf(fileInfo.szTypeName, SIZEOF(fileInfo.szTypeName), TranslateT("%s File"), szExtension); + SetDlgItemText(info->hwndDlg, IDC_EXISTINGTYPE, fileInfo.szTypeName); + SetDlgItemText(info->hwndDlg, IDC_NEWTYPE, fileInfo.szTypeName); + SendDlgItemMessage(info->hwndDlg, IDC_EXISTINGICON, STM_SETICON, (WPARAM)fileInfo.hIcon, 0); + szIconFile[0] = '\0'; + if ( !lstrcmp(szExtension, _T("EXE"))) + SRFile_GetRegValue(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons"), _T("2"), szIconFile, SIZEOF(szIconFile)); + else { + TCHAR szTypeName[MAX_PATH]; + if (SRFile_GetRegValue(HKEY_CLASSES_ROOT, pszExtension, NULL, szTypeName, SIZEOF(szTypeName))) { + lstrcat(szTypeName, _T("\\DefaultIcon")); + if (SRFile_GetRegValue(HKEY_CLASSES_ROOT, szTypeName, NULL, szIconFile, SIZEOF(szIconFile))) { + if (_tcsstr(szIconFile, _T("%1"))) + SRFile_GetRegValue(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons"), _T("0"), szIconFile, SIZEOF(szIconFile)); + else szIconFile[0] = '\0'; + } } } + + if (szIconFile[0]) { + TCHAR *pszComma = _tcsrchr(szIconFile, ','); + int iconIndex = (pszComma == NULL) ? 0 :_ttoi(pszComma+1); *pszComma = '\0'; + HICON hIcon = ExtractIcon(hInst, szIconFile, iconIndex); + if (hIcon) + fileInfo.hIcon = hIcon; + } + SendDlgItemMessage(info->hwndDlg, IDC_NEWICON, STM_SETICON, (WPARAM)fileInfo.hIcon, 0); + } + mir_free(info->szFilename); + mir_free(info); +} + +INT_PTR CALLBACK DlgProcFileExists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PROTOFILETRANSFERSTATUS *fts; + + fts = (PROTOFILETRANSFERSTATUS*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + switch(msg) { + case WM_INITDIALOG: + { + TCHAR szSize[64]; + struct _stati64 statbuf; + HWND hwndFocus; + struct TDlgProcFileExistsParam *dat = (struct TDlgProcFileExistsParam *)lParam; + + SetPropA(hwndDlg, "Miranda.Preshutdown", HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN)); + SetPropA(hwndDlg, "Miranda.ParentWnd", dat->hwndParent); + + TranslateDialogDefault(hwndDlg); + fts = (PROTOFILETRANSFERSTATUS*)mir_alloc(sizeof(PROTOFILETRANSFERSTATUS)); + CopyProtoFileTransferStatus(fts, dat->fts); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)fts); + SetDlgItemText(hwndDlg, IDC_FILENAME, fts->tszCurrentFile); + SetControlToUnixTime(hwndDlg, IDC_NEWDATE, fts->currentFileTime); + GetSensiblyFormattedSize(fts->currentFileSize, szSize, SIZEOF(szSize), 0, 1, NULL); + SetDlgItemText(hwndDlg, IDC_NEWSIZE, szSize); + + pfnIconWindowProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_EXISTINGICON), GWLP_WNDPROC, (LONG_PTR)IconCtrlSubclassProc); + + hwndFocus = GetDlgItem(hwndDlg, IDC_RESUME); + if (_tstati64(fts->tszCurrentFile, &statbuf) == 0) { + SetControlToUnixTime(hwndDlg, IDC_EXISTINGDATE, statbuf.st_mtime); + GetSensiblyFormattedSize(statbuf.st_size, szSize, SIZEOF(szSize), 0, 1, NULL); + SetDlgItemText(hwndDlg, IDC_EXISTINGSIZE, szSize); + if (statbuf.st_size>(int)fts->currentFileSize) { + EnableWindow(GetDlgItem(hwndDlg, IDC_RESUME), FALSE); + hwndFocus = GetDlgItem(hwndDlg, IDC_OVERWRITE); + } } + + loadiconsstartinfo *lisi = (loadiconsstartinfo*)mir_alloc(sizeof(loadiconsstartinfo)); + lisi->hwndDlg = hwndDlg; + lisi->szFilename = mir_tstrdup(fts->tszCurrentFile); + //can be a little slow, so why not? + forkthread(LoadIconsAndTypesThread, 0, lisi); + SetFocus(hwndFocus); + SetWindowLongPtr(hwndFocus, GWL_STYLE, GetWindowLongPtr(hwndFocus, GWL_STYLE)|BS_DEFPUSHBUTTON); + return FALSE; + } + case WM_COMMAND: + { + PROTOFILERESUME pfr = {0}; + switch(LOWORD(wParam)) { + case IDC_OPENFILE: + ShellExecute(hwndDlg, NULL, fts->tszCurrentFile, NULL, NULL, SW_SHOW); + return FALSE; + + case IDC_OPENFOLDER: + { + TCHAR szFile[MAX_PATH]; + lstrcpyn(szFile, fts->tszCurrentFile, SIZEOF(szFile)); + TCHAR* pszLastBackslash = _tcsrchr(szFile, '\\'); + if (pszLastBackslash) + *pszLastBackslash = '\0'; + ShellExecute(hwndDlg, NULL, szFile, NULL, NULL, SW_SHOW); + return FALSE; + } + case IDC_PROPERTIES: + DoAnnoyingShellCommand(hwndDlg, fts->tszCurrentFile, C_PROPERTIES, NULL); + return FALSE; + case IDC_RESUME: + pfr.action = FILERESUME_RESUME; + break; + case IDC_RESUMEALL: + pfr.action = FILERESUME_RESUMEALL; + break; + case IDC_OVERWRITE: + pfr.action = FILERESUME_OVERWRITE; + break; + case IDC_OVERWRITEALL: + pfr.action = FILERESUME_OVERWRITEALL; + break; + + case IDC_AUTORENAME: + pfr.action = FILERESUME_RENAMEALL; + break; + + case IDC_SAVEAS: + { + OPENFILENAME ofn = {0}; + TCHAR filter[512], *pfilter; + TCHAR str[MAX_PATH]; + + lstrcpyn(str, fts->tszCurrentFile, SIZEOF(str)); + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; + _tcscpy(filter, TranslateT("All Files")); + _tcscat(filter, _T(" (*)")); + pfilter = filter + _tcslen(filter) + 1; + _tcscpy(pfilter, _T("*")); + pfilter = pfilter + _tcslen(pfilter) + 1; + *pfilter = '\0'; + ofn.lpstrFilter = filter; + ofn.lpstrFile = str; + ofn.nMaxFile = SIZEOF(str); + ofn.nMaxFileTitle = MAX_PATH; + if ( !GetSaveFileName(&ofn)) + return FALSE; + + pfr.szFilename = mir_tstrdup(str); + pfr.action = FILERESUME_RENAME; + break; + } + case IDC_SKIP: + pfr.action = FILERESUME_SKIP; + break; + case IDCANCEL: + pfr.action = FILERESUME_CANCEL; + break; + default: + return FALSE; + } + { PROTOFILERESUME *pfrCopy; + pfrCopy = (PROTOFILERESUME*)mir_alloc(sizeof(pfr)); + CopyMemory(pfrCopy, &pfr, sizeof(pfr)); + PostMessage((HWND)GetPropA(hwndDlg, "Miranda.ParentWnd"), M_FILEEXISTSDLGREPLY, (WPARAM)mir_tstrdup(fts->tszCurrentFile), (LPARAM)pfrCopy); + DestroyWindow(hwndDlg); + } + break; + } + + case WM_CLOSE: + PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDCANCEL)); + break; + + case M_PRESHUTDOWN: + PostMessage(hwndDlg, WM_CLOSE, 0, 0); + break; + + case WM_DESTROY: + UnhookEvent(GetPropA(hwndDlg, "Miranda.Preshutdown")); // GetProp() will return NULL if it couldnt find anything + RemovePropA(hwndDlg, "Miranda.Preshutdown"); + RemovePropA(hwndDlg, "Miranda.ParentWnd"); + DestroyIcon((HICON)SendDlgItemMessage(hwndDlg, IDC_EXISTINGICON, STM_GETICON, 0, 0)); + DestroyIcon((HICON)SendDlgItemMessage(hwndDlg, IDC_NEWICON, STM_GETICON, 0, 0)); + FreeProtoFileTransferStatus(fts); + mir_free(fts); + break; + } + return FALSE; +} diff --git a/src/core/stdfile/fileopts.cpp b/src/core/stdfile/fileopts.cpp new file mode 100644 index 0000000000..f24ce4af12 --- /dev/null +++ b/src/core/stdfile/fileopts.cpp @@ -0,0 +1,247 @@ +/* + +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. +*/ +#include "commonheaders.h" +#include "file.h" + +#define VSCAN_MCAFEE 1 +#define VSCAN_DRSOLOMON 2 +#define VSCAN_NORTON 3 +#define VSCAN_CA 4 + +struct virusscannerinfo { + const TCHAR *szProductName; + const TCHAR *szExeRegPath; + const TCHAR *szExeRegValue; + const TCHAR *szCommandLine; +}; + +static const struct virusscannerinfo virusScanners[] = { + {_T("Network Associates/McAfee VirusScan"), _T("SOFTWARE\\McAfee\\VirusScan"), _T("Scan32EXE"), _T("\"%s\" %%f /nosplash /comp /autoscan /autoexit /noboot")}, + {_T("Dr Solomon's VirusScan (Network Associates)"), _T("SOFTWARE\\Network Associates\\TVD\\VirusScan\\AVConsol\\General"), _T("szScannerExe"), _T("\"%s\" %%f /uinone /noboot /comp /prompt /autoexit")}, + {_T("Norton AntiVirus"), _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Navw32.exe"), NULL, _T("\"%s\" %%f /b- /m- /s+ /noresults")}, + {_T("Computer Associates/Inoculate IT"), _T("Software\\Antivirus"), _T("ImageFilename"), _T("\"%s\" %%f /display = progress /exit")}, + {_T("Computer Associates eTrust"), _T("SOFTWARE\\ComputerAssociates\\Anti-Virus\\Resident"), _T("VetPath"), _T("\"%s\" %%f /display = progress /exit")}, + {_T("Kaspersky Anti-Virus"), _T("SOFTWARE\\KasperskyLab\\Components\\101"), _T("EXEName"), _T("\"%s\" /S /Q %%f")}, + {_T("Kaspersky Anti-Virus"), _T("SOFTWARE\\KasperskyLab\\SetupFolders"), _T("KAV8"), _T("\"%savp.exe\" SCAN %%f")}, + {_T("Kaspersky Anti-Virus"), _T("SOFTWARE\\KasperskyLab\\SetupFolders"), _T("KAV9"), _T("\"%savp.exe\" SCAN %%f")}, + {_T("AntiVir PersonalEdition Classic"), _T("SOFTWARE\\Avira\\AntiVir PersonalEdition Classic"), _T("Path"), _T("\"%savscan.exe\" /GUIMODE = 2 /PATH = \"%%f\"")}, + {_T("ESET NOD32 Antivirus"), _T("SOFTWARE\\ESET\\ESET Security\\CurrentVersion\\Info"), _T("InstallDir"), _T("\"%secls.exe\" /log-all /aind /no-boots /adware /sfx /unsafe /unwanted /heur /adv-heur /action = clean \"%%f\"")}, +}; + +#define M_UPDATEENABLING (WM_USER+100) +#define M_SCANCMDLINESELCHANGE (WM_USER+101) + +#ifndef SHACF_FILESYS_DIRS + #define SHACF_FILESYS_DIRS 0x00000020 +#endif + +static INT_PTR CALLBACK DlgProcFileOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + + if (shAutoComplete) + shAutoComplete(GetDlgItem(hwndDlg, IDC_FILEDIR), SHACF_FILESYS_DIRS); + + { + TCHAR str[MAX_PATH]; + GetContactReceivedFilesDir(NULL, str, SIZEOF(str), FALSE); + SetDlgItemText(hwndDlg, IDC_FILEDIR, str); + } + + CheckDlgButton(hwndDlg, IDC_AUTOACCEPT, DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_AUTOMIN, DBGetContactSettingByte(NULL, "SRFile", "AutoMin", 0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_AUTOCLOSE, DBGetContactSettingByte(NULL, "SRFile", "AutoClose", 0) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_AUTOCLEAR, DBGetContactSettingByte(NULL, "SRFile", "AutoClear", 1) ? BST_CHECKED : BST_UNCHECKED); + switch(DBGetContactSettingByte(NULL, "SRFile", "UseScanner", VIRUSSCAN_DISABLE)) { + case VIRUSSCAN_AFTERDL: CheckDlgButton(hwndDlg, IDC_SCANAFTERDL, BST_CHECKED); break; + case VIRUSSCAN_DURINGDL: CheckDlgButton(hwndDlg, IDC_SCANDURINGDL, BST_CHECKED); break; + default: CheckDlgButton(hwndDlg, IDC_NOSCANNER, BST_CHECKED); break; + } + CheckDlgButton(hwndDlg, IDC_WARNBEFOREOPENING, DBGetContactSettingByte(NULL, "SRFile", "WarnBeforeOpening", 1) ? BST_CHECKED : BST_UNCHECKED); + + { TCHAR szScanExe[MAX_PATH]; + int i, iItem; + for (i=0; i < SIZEOF(virusScanners); i++) { + if (SRFile_GetRegValue(HKEY_LOCAL_MACHINE, virusScanners[i].szExeRegPath, virusScanners[i].szExeRegValue, szScanExe, SIZEOF(szScanExe))) { + iItem = SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_ADDSTRING, 0, (LPARAM)virusScanners[i].szProductName); + SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_SETITEMDATA, iItem, i); + } + } + if (SendDlgItemMessageA(hwndDlg, IDC_SCANCMDLINE, CB_GETCOUNT, 0, 0) == 0) + { + iItem = SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_ADDSTRING, 0, (LPARAM)_T("")); + SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_SETITEMDATA, iItem, (LPARAM)-1); + } + } + + DBVARIANT dbv; + if (DBGetContactSettingTString(NULL, "SRFile", "ScanCmdLine", &dbv) == 0) { + SetDlgItemText(hwndDlg, IDC_SCANCMDLINE, dbv.ptszVal); + DBFreeVariant(&dbv); + } + else { + if (SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_GETCOUNT, 0, 0)) { + SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_SETCURSEL, 0, 0); + PostMessage(hwndDlg, M_SCANCMDLINESELCHANGE, 0, 0); + } + } + switch(DBGetContactSettingByte(NULL, "SRFile", "IfExists", FILERESUME_ASK)) { + case FILERESUME_RESUMEALL: CheckDlgButton(hwndDlg, IDC_RESUME, BST_CHECKED); break; + case FILERESUME_OVERWRITEALL: CheckDlgButton(hwndDlg, IDC_OVERWRITE, BST_CHECKED); break; + case FILERESUME_RENAMEALL: CheckDlgButton(hwndDlg, IDC_RENAME, BST_CHECKED); break; + default: CheckDlgButton(hwndDlg, IDC_ASK, BST_CHECKED); break; + } + SendMessage(hwndDlg, M_UPDATEENABLING, 0, 0); + return TRUE; + } + case M_UPDATEENABLING: + { int on = !IsDlgButtonChecked(hwndDlg, IDC_NOSCANNER); + EnableWindow(GetDlgItem(hwndDlg, IDC_ST_CMDLINE), on); + EnableWindow(GetDlgItem(hwndDlg, IDC_SCANCMDLINE), on); + EnableWindow(GetDlgItem(hwndDlg, IDC_SCANCMDLINEBROWSE), on); + EnableWindow(GetDlgItem(hwndDlg, IDC_ST_CMDLINEHELP), on); + EnableWindow(GetDlgItem(hwndDlg, IDC_AUTOMIN), IsDlgButtonChecked(hwndDlg, IDC_AUTOACCEPT)); + break; + } + case M_SCANCMDLINESELCHANGE: + { TCHAR str[512]; + TCHAR szScanExe[MAX_PATH]; + int iScanner = SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_GETCURSEL, 0, 0), 0); + if (iScanner >= SIZEOF(virusScanners) || iScanner<0) break; + str[0] = '\0'; + if (SRFile_GetRegValue(HKEY_LOCAL_MACHINE, virusScanners[iScanner].szExeRegPath, virusScanners[iScanner].szExeRegValue, szScanExe, SIZEOF(szScanExe))) + mir_sntprintf(str, SIZEOF(str), virusScanners[iScanner].szCommandLine, szScanExe); + SetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str); + break; + } + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDC_FILEDIR: + if ((HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) return 0; + break; + case IDC_FILEDIRBROWSE: + { TCHAR str[MAX_PATH]; + GetDlgItemText(hwndDlg, IDC_FILEDIR, str, SIZEOF(str)); + if (BrowseForFolder(hwndDlg, str)) + SetDlgItemText(hwndDlg, IDC_FILEDIR, str); + break; + } + case IDC_AUTOACCEPT: + case IDC_NOSCANNER: + case IDC_SCANAFTERDL: + case IDC_SCANDURINGDL: + SendMessage(hwndDlg, M_UPDATEENABLING, 0, 0); + break; + case IDC_SCANCMDLINE: + if (HIWORD(wParam) == CBN_SELCHANGE) PostMessage(hwndDlg, M_SCANCMDLINESELCHANGE, 0, 0); + else if (HIWORD(wParam) != CBN_EDITCHANGE) return 0; + break; + case IDC_SCANCMDLINEBROWSE: + { TCHAR str[MAX_PATH+2]; + OPENFILENAME ofn = {0}; + TCHAR filter[512], *pfilter; + + GetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str, SIZEOF(str)); + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_DONTADDTORECENT; + _tcscpy(filter, TranslateT("Executable Files")); + _tcscat(filter, _T(" (*.exe)")); + pfilter = filter + _tcslen(filter) + 1; + _tcscpy(pfilter, _T("*.exe")); + pfilter = pfilter + _tcslen(pfilter)+1; + _tcscpy(pfilter, TranslateT("All Files")); + _tcscat(pfilter, _T(" (*)")); + pfilter = pfilter + _tcslen(pfilter) + 1; + _tcscpy(pfilter, _T("*")); + pfilter = pfilter + _tcslen(pfilter) + 1; + *pfilter = 0; + ofn.lpstrFilter = filter; + ofn.lpstrFile = str; + ofn.nMaxFile = SIZEOF(str)-2; + if (str[0] == '"') { + TCHAR *pszQuote = _tcschr(str + 1, '"'); + if (pszQuote) *pszQuote = 0; + MoveMemory(str, str + 1, _tcslen(str) * sizeof(TCHAR)); + } + else { + TCHAR *pszSpace = _tcschr(str, ' '); + if (pszSpace) *pszSpace = 0; + } + ofn.nMaxFileTitle = MAX_PATH; + if ( !GetOpenFileName(&ofn)) break; + if (_tcschr(str, ' ') != NULL) { + MoveMemory(str+1, str, SIZEOF(str) - 2 * sizeof(TCHAR)); + str[0] = '"'; + _tcscat(str, _T("\"")); + } + SetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str); + break; + } + } + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + { TCHAR str[512]; + GetDlgItemText(hwndDlg, IDC_FILEDIR, str, SIZEOF(str)); + RemoveInvalidPathChars(str); + DBWriteContactSettingTString(NULL, "SRFile", "RecvFilesDirAdv", str); + DBWriteContactSettingByte(NULL, "SRFile", "AutoAccept", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOACCEPT)); + DBWriteContactSettingByte(NULL, "SRFile", "AutoMin", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOMIN)); + DBWriteContactSettingByte(NULL, "SRFile", "AutoClose", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOCLOSE)); + DBWriteContactSettingByte(NULL, "SRFile", "AutoClear", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOCLEAR)); + DBWriteContactSettingByte(NULL, "SRFile", "UseScanner", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_SCANAFTERDL)?VIRUSSCAN_AFTERDL:(IsDlgButtonChecked(hwndDlg, IDC_SCANDURINGDL)?VIRUSSCAN_DURINGDL:VIRUSSCAN_DISABLE))); + GetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str, SIZEOF(str)); + DBWriteContactSettingTString(NULL, "SRFile", "ScanCmdLine", str); + DBWriteContactSettingByte(NULL, "SRFile", "WarnBeforeOpening", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_WARNBEFOREOPENING)); + DBWriteContactSettingByte(NULL, "SRFile", "IfExists", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ASK)?FILERESUME_ASK:(IsDlgButtonChecked(hwndDlg, IDC_RESUME)?FILERESUME_RESUMEALL:(IsDlgButtonChecked(hwndDlg, IDC_OVERWRITE)?FILERESUME_OVERWRITEALL:FILERESUME_RENAMEALL)))); + return TRUE; + } + } + break; + } + return FALSE; +} + +int FileOptInitialise(WPARAM wParam, LPARAM) +{ + OPTIONSDIALOGPAGE odp = {0}; + odp.cbSize = sizeof(odp); + odp.position = 900000000; + odp.hInstance = hInst; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_FILETRANSFER); + odp.pszTitle = LPGEN("File Transfers"); + odp.pszGroup = LPGEN("Events"); + odp.pfnDlgProc = DlgProcFileOpts; + odp.flags = ODPF_BOLDGROUPS; + odp.nIDBottomSimpleControl = IDC_VIRUSSCANNERGROUP; + Options_AddPage(wParam, &odp); + return 0; +} + diff --git a/src/core/stdfile/filerecvdlg.cpp b/src/core/stdfile/filerecvdlg.cpp new file mode 100644 index 0000000000..33a27d80ff --- /dev/null +++ b/src/core/stdfile/filerecvdlg.cpp @@ -0,0 +1,442 @@ +/* + +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. +*/ +#include "commonheaders.h" +#include "file.h" + +#define MAX_MRU_DIRS 5 + +static BOOL CALLBACK ClipSiblingsChildEnumProc(HWND hwnd, LPARAM) +{ + SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE)|WS_CLIPSIBLINGS); + return TRUE; +} + +static void GetLowestExistingDirName(const TCHAR *szTestDir, TCHAR *szExistingDir, int cchExistingDir) +{ + DWORD dwAttributes; + TCHAR *pszLastBackslash; + + lstrcpyn(szExistingDir, szTestDir, cchExistingDir); + while ((dwAttributes = GetFileAttributes(szExistingDir)) != INVALID_FILE_ATTRIBUTES && !(dwAttributes&FILE_ATTRIBUTE_DIRECTORY)) { + pszLastBackslash = _tcsrchr(szExistingDir, '\\'); + if (pszLastBackslash == NULL) {*szExistingDir = '\0'; break;} + *pszLastBackslash = '\0'; + } + if (szExistingDir[0] == '\0') GetCurrentDirectory(cchExistingDir, szExistingDir); +} + +static const TCHAR InvalidFilenameChars[] = _T("\\/:*?\"<>|"); +void RemoveInvalidFilenameChars(TCHAR *tszString) +{ + size_t i; + if (tszString) { + for (i = _tcscspn(tszString, InvalidFilenameChars); tszString[i]; i+=_tcscspn(tszString+i+1, InvalidFilenameChars)+1) + if (tszString[i] >= 0) + tszString[i] = _T('_'); + } +} + +static const TCHAR InvalidPathChars[] = _T("*?\"<>|"); // "\/:" are excluded as they are allowed in file path +void RemoveInvalidPathChars(TCHAR *tszString) +{ + size_t i; + if (tszString) { + for (i = _tcscspn(tszString, InvalidPathChars); tszString[i]; i+=_tcscspn(tszString+i+1, InvalidPathChars)+1) + if (tszString[i] >= 0) + tszString[i] = _T('_'); + } +} + +static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) +{ + TCHAR szDir[MAX_PATH]; + switch(uMsg) { + case BFFM_INITIALIZED: + SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); + break; + case BFFM_SELCHANGED: + if (SHGetPathFromIDList((LPITEMIDLIST) lp , szDir)) + SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szDir); + break; + } + return 0; +} + +int BrowseForFolder(HWND hwnd, TCHAR *szPath) +{ + BROWSEINFO bi = {0}; + LPITEMIDLIST pidlResult; + + bi.hwndOwner = hwnd; + bi.pszDisplayName = szPath; + bi.lpszTitle = TranslateT("Select Folder"); + bi.ulFlags = BIF_NEWDIALOGSTYLE|BIF_EDITBOX|BIF_RETURNONLYFSDIRS; // Use this combo instead of BIF_USENEWUI + bi.lpfn = BrowseCallbackProc; + bi.lParam = (LPARAM)szPath; + + pidlResult = SHBrowseForFolder(&bi); + if (pidlResult) { + SHGetPathFromIDList(pidlResult, szPath); + lstrcat(szPath, _T("\\")); + CoTaskMemFree(pidlResult); + } + return pidlResult != NULL; +} + +static REPLACEVARSARRAY sttVarsToReplace[] = +{ + { (TCHAR*)"///", (TCHAR*)"//" }, + { (TCHAR*)"//", (TCHAR*)"/" }, + { (TCHAR*)"()", (TCHAR*)"" }, + { NULL, NULL } +}; + +static void patchDir(TCHAR* str, size_t strSize) +{ + REPLACEVARSDATA dat = { 0 }; + dat.cbSize = sizeof(dat); + dat.dwFlags = RVF_TCHAR; + dat.variables = sttVarsToReplace; + + TCHAR* result = (TCHAR*)CallService(MS_UTILS_REPLACEVARS, (WPARAM)str, (LPARAM)&dat); + if (result) { + _tcsncpy(str, result, strSize); + mir_free(result); + } + + size_t len = lstrlen(str); + if (len+1 < strSize && str[len-1] != '\\') + lstrcpy(str+len, _T("\\")); +} + +void GetContactReceivedFilesDir(HANDLE hContact, TCHAR *szDir, int cchDir, BOOL patchVars) +{ + DBVARIANT dbv; + TCHAR szTemp[MAX_PATH]; + szTemp[0] = 0; + + if ( !DBGetContactSettingTString(NULL, "SRFile", "RecvFilesDirAdv", &dbv)) { + if (lstrlen(dbv.ptszVal) > 0) + lstrcpyn(szTemp, dbv.ptszVal, SIZEOF(szTemp)); + DBFreeVariant(&dbv); + } + + if ( !szTemp[0]) + + mir_sntprintf(szTemp, SIZEOF(szTemp), _T("%%mydocuments%%\\%s\\%%userid%%"), TranslateT("My Received Files")); + + + if (hContact) { + REPLACEVARSDATA dat = { 0 }; + REPLACEVARSARRAY rvaVarsToReplace[4]; + rvaVarsToReplace[0].lptzKey = _T("nick"); + rvaVarsToReplace[0].lptzValue = mir_tstrdup((TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR)); + rvaVarsToReplace[1].lptzKey = _T("userid"); + rvaVarsToReplace[1].lptzValue = GetContactID(hContact); + rvaVarsToReplace[2].lptzKey = _T("proto"); + rvaVarsToReplace[2].lptzValue = mir_a2t((char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0)); + rvaVarsToReplace[3].lptzKey = NULL; + rvaVarsToReplace[3].lptzValue = NULL; + for (int i=0; i < (SIZEOF(rvaVarsToReplace)-1);i++) + RemoveInvalidFilenameChars(rvaVarsToReplace[i].lptzValue); + + dat.cbSize = sizeof(dat); + dat.dwFlags = RVF_TCHAR; + dat.variables = rvaVarsToReplace; + dat.hContact = hContact; + TCHAR* result = (TCHAR*)CallService(MS_UTILS_REPLACEVARS, (WPARAM)szTemp, (LPARAM)&dat); + if (result) { + _tcsncpy(szTemp, result, SIZEOF(szTemp)); + mir_free(result); + for (int i=0; i < (SIZEOF(rvaVarsToReplace)-1);i++) + mir_free(rvaVarsToReplace[i].lptzValue); + } } + + if (patchVars) + patchDir(szTemp, SIZEOF(szTemp)); + RemoveInvalidPathChars(szTemp); + lstrcpyn(szDir, szTemp, cchDir); +} + +void GetReceivedFilesDir(TCHAR *szDir, int cchDir) +{ + DBVARIANT dbv; + TCHAR szTemp[MAX_PATH]; + szTemp[0] = 0; + + if ( !DBGetContactSettingTString(NULL, "SRFile", "RecvFilesDirAdv", &dbv)) { + if (lstrlen(dbv.ptszVal) > 0) + lstrcpyn(szTemp, dbv.ptszVal, SIZEOF(szTemp)); + DBFreeVariant(&dbv); + } + + if ( !szTemp[0]) + + mir_sntprintf(szTemp, SIZEOF(szTemp), _T("%%mydocuments%%\\%s"), TranslateT("My Received Files")); + + + patchDir(szTemp, SIZEOF(szTemp)); + RemoveInvalidPathChars(szTemp); + lstrcpyn(szDir, szTemp, cchDir); +} + +INT_PTR CALLBACK DlgProcRecvFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct FileDlgData *dat; + + dat = (struct FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + switch (msg) { + case WM_INITDIALOG: { + TCHAR *contactName; + TCHAR szPath[450]; + CLISTEVENT* cle = (CLISTEVENT*)lParam; + + TranslateDialogDefault(hwndDlg); + + dat = (struct FileDlgData*)mir_calloc(sizeof(struct FileDlgData)); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); + dat->hContact = cle->hContact; + dat->hDbEvent = cle->hDbEvent; + dat->hPreshutdownEvent = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN); + dat->dwTicks = GetTickCount(); + + EnumChildWindows(hwndDlg, ClipSiblingsChildEnumProc, 0); + + Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_FILE); + Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add Contact Permanently to List")); + Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User's Details")); + Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View User's History")); + Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User Menu")); + + contactName = pcli->pfnGetContactDisplayName(dat->hContact, 0); + SetDlgItemText(hwndDlg, IDC_FROM, contactName); + GetContactReceivedFilesDir(dat->hContact, szPath, SIZEOF(szPath), TRUE); + SetDlgItemText(hwndDlg, IDC_FILEDIR, szPath); + { + int i; + char idstr[32]; + DBVARIANT dbv; + + if (shAutoComplete) + shAutoComplete(GetWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), GW_CHILD), 1); + + for (i=0;ihContact, (LPARAM)dat->hDbEvent); + { + DBEVENTINFO dbei = {0}; + TCHAR datetimestr[64]; + char buf[540]; + + dbei.cbSize = sizeof(dbei); + dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)dat->hDbEvent, 0); + dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); + CallService(MS_DB_EVENT_GET, (WPARAM)dat->hDbEvent, (LPARAM)&dbei); + dat->fs = cle->lParam ? (HANDLE)cle->lParam : (HANDLE)*(PDWORD)dbei.pBlob; + lstrcpynA(buf, (char*)dbei.pBlob+4, min(dbei.cbBlob+1, SIZEOF(buf))); + TCHAR* ptszFileName = DbGetEventStringT(&dbei, buf); + SetDlgItemText(hwndDlg, IDC_FILENAMES, ptszFileName); + mir_free(ptszFileName); + lstrcpynA(buf, (char*)dbei.pBlob+4+strlen((char*)dbei.pBlob+4)+1, min((int)(dbei.cbBlob-4-strlen((char*)dbei.pBlob+4)), SIZEOF(buf))); + TCHAR* ptszDescription = DbGetEventStringT(&dbei, buf); + SetDlgItemText(hwndDlg, IDC_MSG, ptszDescription); + mir_free(ptszDescription); + mir_free(dbei.pBlob); + + tmi.printTimeStamp(NULL, dbei.timestamp, _T("t d"), datetimestr, SIZEOF(datetimestr), 0); + SetDlgItemText(hwndDlg, IDC_DATE, datetimestr); + } + { + char* szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); + if (szProto) { + CONTACTINFO ci; + int hasName = 0; + char buf[128]; + ZeroMemory(&ci, sizeof(ci)); + + ci.cbSize = sizeof(ci); + ci.hContact = dat->hContact; + ci.szProto = szProto; + ci.dwFlag = CNF_UNIQUEID; + if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) { + switch(ci.type) { + case CNFT_ASCIIZ: + hasName = 1; + mir_snprintf(buf, SIZEOF(buf), "%s", ci.pszVal); + mir_free(ci.pszVal); + break; + case CNFT_DWORD: + hasName = 1; + mir_snprintf(buf, SIZEOF(buf), "%u", ci.dVal); + break; + } } + if (hasName) + SetDlgItemTextA(hwndDlg, IDC_NAME, buf); + else + SetDlgItemText(hwndDlg, IDC_NAME, contactName); + } } + + if (DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) { + RECT rcBtn1, rcBtn2, rcDateCtrl; + GetWindowRect(GetDlgItem(hwndDlg, IDC_ADD), &rcBtn1); + GetWindowRect(GetDlgItem(hwndDlg, IDC_USERMENU), &rcBtn2); + GetWindowRect(GetDlgItem(hwndDlg, IDC_DATE), &rcDateCtrl); + SetWindowPos(GetDlgItem(hwndDlg, IDC_DATE), 0, 0, 0, rcDateCtrl.right-rcDateCtrl.left-(rcBtn2.left-rcBtn1.left), rcDateCtrl.bottom-rcDateCtrl.top, SWP_NOZORDER|SWP_NOMOVE); + } + else if (DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0)) { + //don't check auto-min here to fix BUG#647620 + PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDOK)); + } + if ( !DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) + ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); + return TRUE; + } + + case WM_MEASUREITEM: + return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); + + case WM_DRAWITEM: + { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; + if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) { + char *szProto; + + szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); + if (szProto) { + HICON hIcon; + + hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); + if (hIcon) { + DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); + DestroyIcon(hIcon); + } } } } + return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); + + case WM_COMMAND: + if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) + break; + + switch (LOWORD(wParam)) { + case IDC_FILEDIRBROWSE: + { + TCHAR szDirName[MAX_PATH], szExistingDirName[MAX_PATH]; + + GetDlgItemText(hwndDlg, IDC_FILEDIR, szDirName, SIZEOF(szDirName)); + GetLowestExistingDirName(szDirName, szExistingDirName, SIZEOF(szExistingDirName)); + if (BrowseForFolder(hwndDlg, szExistingDirName)) + SetDlgItemText(hwndDlg, IDC_FILEDIR, szExistingDirName); + } + break; + + case IDOK: + { //most recently used directories + TCHAR szRecvDir[MAX_PATH], szDefaultRecvDir[MAX_PATH]; + GetDlgItemText(hwndDlg, IDC_FILEDIR, szRecvDir, SIZEOF(szRecvDir)); + RemoveInvalidPathChars(szRecvDir); + GetContactReceivedFilesDir(NULL, szDefaultRecvDir, SIZEOF(szDefaultRecvDir), TRUE); + if (_tcsnicmp(szRecvDir, szDefaultRecvDir, lstrlen(szDefaultRecvDir))) { + char idstr[32]; + int i; + DBVARIANT dbv; + for (i = MAX_MRU_DIRS-2;i>=0;i--) { + mir_snprintf(idstr, SIZEOF(idstr), "MruDir%d", i); + if (DBGetContactSettingTString(NULL, "SRFile", idstr, &dbv)) continue; + mir_snprintf(idstr, SIZEOF(idstr), "MruDir%d", i+1); + DBWriteContactSettingTString(NULL, "SRFile", idstr, dbv.ptszVal); + DBFreeVariant(&dbv); + } + DBWriteContactSettingTString(NULL, "SRFile", idstr, szRecvDir); + } + } + EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAMES), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_MSG), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIRBROWSE), FALSE); + + GetDlgItemText(hwndDlg, IDC_FILEDIR, dat->szSavePath, SIZEOF(dat->szSavePath)); + GetDlgItemText(hwndDlg, IDC_FILE, dat->szFilenames, SIZEOF(dat->szFilenames)); + GetDlgItemText(hwndDlg, IDC_MSG, dat->szMsg, SIZEOF(dat->szMsg)); + dat->hwndTransfer = FtMgr_AddTransfer(dat); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); + //check for auto-minimize here to fix BUG#647620 + if (DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0) && DBGetContactSettingByte(NULL, "SRFile", "AutoMin", 0)) { + ShowWindow(hwndDlg, SW_HIDE); + ShowWindow(hwndDlg, SW_SHOWMINNOACTIVE); + } + DestroyWindow(hwndDlg); + break; + + case IDCANCEL: + if (dat->fs) CallContactService(dat->hContact, PSS_FILEDENYT, (WPARAM)dat->fs, (LPARAM)TranslateT("Cancelled")); + dat->fs = NULL; /* the protocol will free the handle */ + DestroyWindow(hwndDlg); + break; + + case IDC_ADD: + { ADDCONTACTSTRUCT acs = {0}; + + acs.handle = dat->hContact; + acs.handleType = HANDLE_CONTACT; + acs.szProto = ""; + CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); + if ( !DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) + ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); + } + break; + + case IDC_USERMENU: + { RECT rc; + HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)dat->hContact, 0); + GetWindowRect((HWND)lParam, &rc); + TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); + DestroyMenu(hMenu); + } + break; + + case IDC_DETAILS: + CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)dat->hContact, 0); + break; + + case IDC_HISTORY: + CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)dat->hContact, 0); + break; + } + break; + + case WM_DESTROY: + Window_FreeIcon_IcoLib(hwndDlg); + Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); + Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); + Button_FreeIcon_IcoLib(hwndDlg, IDC_HISTORY); + Button_FreeIcon_IcoLib(hwndDlg, IDC_USERMENU); + + if (dat) FreeFileDlgData(dat); + break; + } + return FALSE; +} diff --git a/src/core/stdfile/filesenddlg.cpp b/src/core/stdfile/filesenddlg.cpp new file mode 100644 index 0000000000..3551078176 --- /dev/null +++ b/src/core/stdfile/filesenddlg.cpp @@ -0,0 +1,358 @@ +/* + +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. +*/ +#include "commonheaders.h" +#include +#include +#include "file.h" + +static void SetFileListAndSizeControls(HWND hwndDlg, struct FileDlgData *dat) +{ + int fileCount = 0, dirCount = 0, totalSize = 0, i; + struct _stat statbuf; + TCHAR str[64]; + + for (i=0; dat->files[i]; i++) { + if (_tstat(dat->files[i], &statbuf) == 0) { + if (statbuf.st_mode & _S_IFDIR) + dirCount++; + else + fileCount++; + totalSize += statbuf.st_size; + } } + + GetSensiblyFormattedSize(totalSize, str, SIZEOF(str), 0, 1, NULL); + SetDlgItemText(hwndDlg, IDC_TOTALSIZE, str); + if (i>1) { + TCHAR szFormat[32]; + if (fileCount && dirCount) { + mir_sntprintf(szFormat, SIZEOF(szFormat), _T("%s, %s"), TranslateTS(fileCount == 1?_T("%d file"):_T("%d files")), TranslateTS(dirCount == 1?_T("%d directory"):_T("%d directories"))); + mir_sntprintf(str, SIZEOF(str), szFormat, fileCount, dirCount); + } + else if (fileCount) { + lstrcpy(szFormat, TranslateT("%d files")); + mir_sntprintf(str, SIZEOF(str), szFormat, fileCount); + } + else { + lstrcpy(szFormat, TranslateT("%d directories")); + mir_sntprintf(str, SIZEOF(str), szFormat, dirCount); + } + SetDlgItemText(hwndDlg, IDC_FILE, str); + } + else SetDlgItemText(hwndDlg, IDC_FILE, dat->files[0]); + + EnableWindow(GetDlgItem(hwndDlg, IDOK), fileCount || dirCount); +} + +static void FilenameToFileList(HWND hwndDlg, struct FileDlgData* dat, const TCHAR* buf) +{ + DWORD dwFileAttributes; + + // Make sure that the file matrix is empty (the user may select files several times) + FreeFilesMatrix(&dat->files); + + // Get the file attributes of selection + dwFileAttributes = GetFileAttributes(buf); + if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) + return; + + // Check if the selection is a directory or a file + if (GetFileAttributes(buf) & FILE_ATTRIBUTE_DIRECTORY) { + const TCHAR* pBuf; + int nNumberOfFiles = 0; + int nTemp; + int fileOffset; + + // :NOTE: The first string in the buffer is the directory, followed by a + // NULL separated list of all files + + // fileOffset is the offset to the first file. + fileOffset = lstrlen(buf) + 1; + + // Count number of files + pBuf = buf + fileOffset; + while (*pBuf) { + pBuf += lstrlen(pBuf) + 1; + nNumberOfFiles++; + } + + // Allocate memory for a pointer array + if ((dat->files = (TCHAR* *)mir_alloc((nNumberOfFiles + 1) * sizeof(TCHAR*))) == NULL) + return; + + // Fill the array + pBuf = buf + fileOffset; + nTemp = 0; + while (*pBuf) + { + // Allocate space for path+filename + int cbFileNameLen = lstrlen(pBuf); + dat->files[nTemp] = (TCHAR*)mir_alloc(sizeof(TCHAR)*(fileOffset + cbFileNameLen + 1)); + + // Add path to filename and copy into array + CopyMemory(dat->files[nTemp], buf, (fileOffset-1)*sizeof(TCHAR)); + dat->files[nTemp][fileOffset-1] = '\\'; + _tcscpy(dat->files[nTemp] + fileOffset - (buf[fileOffset-2] == '\\'?1:0), pBuf); + + // Move pointers to next file... + pBuf += cbFileNameLen + 1; + nTemp++; + } + // Terminate array + dat->files[nNumberOfFiles] = NULL; + } + // ...the selection is a single file + else + { + if ((dat->files = (TCHAR **)mir_alloc(2 * sizeof(TCHAR*))) == NULL) // Leaks when aborted + return; + + dat->files[0] = mir_tstrdup(buf); + dat->files[1] = NULL; + } + + // Update dialog text with new file selection + SetFileListAndSizeControls(hwndDlg, dat); +} + +#define M_FILECHOOSEDONE (WM_USER+100) +void __cdecl ChooseFilesThread(void* param) +{ + HWND hwndDlg = (HWND)param; + TCHAR filter[128], *pfilter; + TCHAR* buf = (TCHAR*)mir_alloc(sizeof(TCHAR)*32767); + if (buf == NULL) + PostMessage(hwndDlg, M_FILECHOOSEDONE, 0, (LPARAM)(TCHAR*)NULL); + else { + OPENFILENAME ofn = {0}; + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + lstrcpy(filter, TranslateT("All Files")); + lstrcat(filter, _T(" (*)")); + pfilter = filter + lstrlen(filter)+1; + lstrcpy(pfilter, _T("*")); + pfilter = filter + lstrlen(filter)+1; + pfilter[ 0 ] = '\0'; + ofn.lpstrFilter = filter; + ofn.lpstrFile = buf; *buf = 0; + ofn.nMaxFile = 32767; + ofn.Flags = OFN_NOCHANGEDIR | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_DONTADDTORECENT; + if (GetOpenFileName(&ofn)) + PostMessage(hwndDlg, M_FILECHOOSEDONE, 0, (LPARAM)buf); + else { + mir_free(buf); + PostMessage(hwndDlg, M_FILECHOOSEDONE, 0, (LPARAM)(TCHAR*)NULL); +} } } + +static BOOL CALLBACK ClipSiblingsChildEnumProc(HWND hwnd, LPARAM) +{ + SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE)|WS_CLIPSIBLINGS); + return TRUE; +} + +static WNDPROC OldSendEditProc; +static LRESULT CALLBACK SendEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_CHAR: + if (wParam == '\n' && GetKeyState(VK_CONTROL)&0x8000) { + PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); + return 0; + } + break; + case WM_SYSCHAR: + if ((wParam == 's' || wParam == 'S') && GetKeyState(VK_MENU)&0x8000) { + PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); + return 0; + } + break; + } + return CallWindowProc(OldSendEditProc, hwnd, msg, wParam, lParam); +} + +INT_PTR CALLBACK DlgProcSendFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct FileDlgData *dat; + + dat = (struct FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + switch (msg) { + case WM_INITDIALOG: + { + struct FileSendData *fsd = (struct FileSendData*)lParam; + + dat = (struct FileDlgData*)mir_calloc(sizeof(struct FileDlgData)); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); + dat->hContact = fsd->hContact; + dat->send = 1; + dat->hPreshutdownEvent = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN); + dat->fs = NULL; + dat->dwTicks = GetTickCount(); + + TranslateDialogDefault(hwndDlg); + EnumChildWindows(hwndDlg, ClipSiblingsChildEnumProc, 0); + OldSendEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_MSG), GWLP_WNDPROC, (LONG_PTR)SendEditSubclassProc); + + Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_FILE); + Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User's Details")); + Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View User's History")); + Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User Menu")); + + EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); + + if (fsd->ppFiles != NULL && fsd->ppFiles[0] != NULL) { + int totalCount, i; + for (totalCount = 0;fsd->ppFiles[totalCount];totalCount++); + dat->files = (TCHAR**)mir_alloc(sizeof(TCHAR*)*(totalCount+1)); // Leaks + for (i=0;ifiles[i] = mir_tstrdup(fsd->ppFiles[i]); + dat->files[totalCount] = NULL; + SetFileListAndSizeControls(hwndDlg, dat); + } + { + char *szProto; + TCHAR* contactName = pcli->pfnGetContactDisplayName(dat->hContact, 0); + SetDlgItemText(hwndDlg, IDC_TO, contactName); + + szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); + if (szProto) { + CONTACTINFO ci; + int hasName = 0; + char buf[128]; + ZeroMemory(&ci, sizeof(ci)); + + ci.cbSize = sizeof(ci); + ci.hContact = dat->hContact; + ci.szProto = szProto; + ci.dwFlag = CNF_UNIQUEID; + if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) { + switch(ci.type) { + case CNFT_ASCIIZ: + hasName = 1; + mir_snprintf(buf, SIZEOF(buf), "%s", ci.pszVal); + mir_free(ci.pszVal); + break; + case CNFT_DWORD: + hasName = 1; + mir_snprintf(buf, SIZEOF(buf), "%u", ci.dVal); + break; + } } + + if (hasName) + SetDlgItemTextA(hwndDlg, IDC_NAME, buf); + else + SetDlgItemText(hwndDlg, IDC_NAME, contactName); + } } + + if (fsd->ppFiles == NULL) { + EnableWindow(hwndDlg, FALSE); + dat->closeIfFileChooseCancelled = 1; + PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_CHOOSE, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDC_CHOOSE)); + } + return TRUE; + } + + case WM_MEASUREITEM: + return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); + + case WM_DRAWITEM: + { + LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; + if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) { + char *szProto; + + szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); + if (szProto) { + HICON hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); + if (hIcon) { + DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); + DestroyIcon(hIcon); + } } } } + return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); + + case M_FILECHOOSEDONE: + if (lParam != 0) { + FilenameToFileList(hwndDlg, dat, (TCHAR*)lParam); + mir_free((TCHAR*)lParam); + dat->closeIfFileChooseCancelled = 0; + } + else if (dat->closeIfFileChooseCancelled) DestroyWindow(hwndDlg); + EnableWindow(hwndDlg, TRUE); + break; + + case WM_COMMAND: + if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) + break; + switch (LOWORD(wParam)) + { + case IDC_CHOOSE: + EnableWindow(hwndDlg, FALSE); + //GetOpenFileName() creates its own message queue which prevents any incoming events being processed + forkthread(ChooseFilesThread, 0, hwndDlg); + break; + case IDOK: + EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_MSG), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_CHOOSE), FALSE); + + GetDlgItemText(hwndDlg, IDC_FILEDIR, dat->szSavePath, SIZEOF(dat->szSavePath)); + GetDlgItemText(hwndDlg, IDC_FILE, dat->szFilenames, SIZEOF(dat->szFilenames)); + GetDlgItemText(hwndDlg, IDC_MSG, dat->szMsg, SIZEOF(dat->szMsg)); + dat->hwndTransfer = FtMgr_AddTransfer(dat); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); + DestroyWindow(hwndDlg); + return TRUE; + + case IDCANCEL: + DestroyWindow(hwndDlg); + return TRUE; + + case IDC_USERMENU: + { RECT rc; + HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)dat->hContact, 0); + GetWindowRect((HWND)lParam, &rc); + TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); + DestroyMenu(hMenu); + break; + } + case IDC_DETAILS: + CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)dat->hContact, 0); + return TRUE; + case IDC_HISTORY: + CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)dat->hContact, 0); + return TRUE; + } + break; + + case WM_DESTROY: + Window_FreeIcon_IcoLib(hwndDlg); + Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); + Button_FreeIcon_IcoLib(hwndDlg, IDC_HISTORY); + Button_FreeIcon_IcoLib(hwndDlg, IDC_USERMENU); + + if (dat) + FreeFileDlgData(dat); + + SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_MSG), GWLP_WNDPROC, (LONG_PTR)OldSendEditProc); + return TRUE; + } + return FALSE; +} diff --git a/src/core/stdfile/filexferdlg.cpp b/src/core/stdfile/filexferdlg.cpp new file mode 100644 index 0000000000..09b2807201 --- /dev/null +++ b/src/core/stdfile/filexferdlg.cpp @@ -0,0 +1,768 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2010 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. +*/ +#include "commonheaders.h" +#include +#include "file.h" + +#define HM_RECVEVENT (WM_USER+10) + +static int CheckVirusScanned(HWND hwnd, struct FileDlgData *dat, int i) +{ + if (dat->send) return 1; + if (dat->fileVirusScanned == NULL) return 0; + if (dat->fileVirusScanned[i]) return 1; + if (DBGetContactSettingByte(NULL, "SRFile", "WarnBeforeOpening", 1) == 0) return 1; + return IDYES == MessageBox(hwnd, TranslateT("This file has not yet been scanned for viruses. Are you certain you want to open it?"), TranslateT("File Received"), MB_YESNO|MB_DEFBUTTON2); +} + +#define M_VIRUSSCANDONE (WM_USER+100) +struct virusscanthreadstartinfo { + TCHAR *szFile; + int returnCode; + HWND hwndReply; +}; + +TCHAR* PFTS_StringToTchar(int flags, const PROTOCHAR* s) +{ + if (flags & PFTS_UTF) + return Utf8DecodeW((char*)s); + else if (flags & PFTS_UNICODE) + return mir_tstrdup(s); + else + return mir_a2t((char*)s); +} + +int PFTS_CompareWithTchar(PROTOFILETRANSFERSTATUS* ft, const PROTOCHAR* s, TCHAR* r) +{ + if (ft->flags & PFTS_UTF) { + TCHAR* ts = Utf8DecodeW((char*)s); + int res = _tcscmp(ts, r); + mir_free(ts); + return res; + } + else if (ft->flags & PFTS_UNICODE) + return _tcscmp(s, r); + else { + TCHAR* ts = mir_a2t((char*)s); + int res = _tcscmp(ts, r); + mir_free(ts); + return res; + } +} + +static void SetOpenFileButtonStyle(HWND hwndButton, int enabled) +{ + EnableWindow(hwndButton, enabled); +} + +void FillSendData(FileDlgData* dat, DBEVENTINFO& dbei) +{ + dbei.cbSize = sizeof(dbei); + dbei.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); + dbei.eventType = EVENTTYPE_FILE; + dbei.flags = DBEF_SENT; + dbei.timestamp = time(NULL); + char *szFileNames = Utf8EncodeT(dat->szFilenames), *szMsg = Utf8EncodeT(dat->szMsg); + dbei.flags |= DBEF_UTF; + + dbei.cbBlob = sizeof(DWORD) + lstrlenA(szFileNames)+lstrlenA(szMsg)+2; + dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); + *(PDWORD)dbei.pBlob = 0; + lstrcpyA((char*)dbei.pBlob+sizeof(DWORD), szFileNames); + lstrcpyA((char*)dbei.pBlob+sizeof(DWORD)+lstrlenA(szFileNames)+1, szMsg); + + mir_free(szFileNames), mir_free(szMsg); + +} + +static void __cdecl RunVirusScannerThread(struct virusscanthreadstartinfo *info) +{ + PROCESS_INFORMATION pi; + STARTUPINFO si = {0}; + DBVARIANT dbv; + TCHAR szCmdLine[768]; + + if ( !DBGetContactSettingTString(NULL, "SRFile", "ScanCmdLine", &dbv)) + { + if (dbv.ptszVal[0]) + { + TCHAR *pszReplace; + si.cb = sizeof(si); + pszReplace = _tcsstr(dbv.ptszVal, _T("%f")); + if (pszReplace) + { + if (info->szFile[_tcslen(info->szFile) - 1] == '\\') + info->szFile[_tcslen(info->szFile) - 1] = '\0'; + *pszReplace = 0; + mir_sntprintf(szCmdLine, SIZEOF(szCmdLine), _T("%s\"%s\"%s"), dbv.ptszVal, info->szFile, pszReplace+2); + } + else lstrcpyn(szCmdLine, dbv.ptszVal, SIZEOF(szCmdLine)); + if (CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + if (WaitForSingleObject(pi.hProcess, 3600*1000) == WAIT_OBJECT_0) + PostMessage(info->hwndReply, M_VIRUSSCANDONE, info->returnCode, 0); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + DBFreeVariant(&dbv); + } + mir_free(info->szFile); + mir_free(info); +} + +static void SetFilenameControls(HWND hwndDlg, struct FileDlgData *dat, PROTOFILETRANSFERSTATUS *fts) +{ + TCHAR msg[MAX_PATH]; + TCHAR *fnbuf = NULL, *fn = NULL; + SHFILEINFO shfi = {0}; + + if (fts->tszCurrentFile) { + fnbuf = mir_tstrdup(fts->tszCurrentFile); + if ((fn = _tcsrchr(fnbuf, '\\')) == NULL) + fn = fnbuf; + else fn++; + } + + if (dat->hIcon) DestroyIcon(dat->hIcon); dat->hIcon = NULL; + + if (fn && (fts->totalFiles > 1)) { + mir_sntprintf(msg, SIZEOF(msg), _T("%s: %s (%d %s %d)"), + pcli->pfnGetContactDisplayName(fts->hContact, 0), + fn, fts->currentFileNumber+1, TranslateT("of"), fts->totalFiles); + + SHGetFileInfo(fn, FILE_ATTRIBUTE_DIRECTORY, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES|SHGFI_ICON|SHGFI_SMALLICON); + dat->hIcon = shfi.hIcon; + } + else if (fn) { + mir_sntprintf(msg, SIZEOF(msg), _T("%s: %s"), pcli->pfnGetContactDisplayName(fts->hContact, 0), fn); + + SHGetFileInfo(fn, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES|SHGFI_ICON|SHGFI_SMALLICON); + dat->hIcon = shfi.hIcon; + } + else { + lstrcpyn(msg, pcli->pfnGetContactDisplayName(fts->hContact, 0), SIZEOF(msg)); + HICON hIcon = LoadSkinIcon(SKINICON_OTHER_DOWNARROW); + dat->hIcon = CopyIcon(hIcon); + IcoLib_ReleaseIcon(hIcon, NULL); + } + + mir_free(fnbuf); + + SendDlgItemMessage(hwndDlg, IDC_FILEICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)dat->hIcon); + SetDlgItemText(hwndDlg, IDC_CONTACTNAME, msg); +} + +enum { FTS_TEXT, FTS_PROGRESS, FTS_OPEN }; +static void SetFtStatus(HWND hwndDlg, TCHAR *text, int mode) +{ + SetDlgItemText(hwndDlg, IDC_STATUS, TranslateTS(text)); + SetDlgItemText(hwndDlg, IDC_TRANSFERCOMPLETED, TranslateTS(text)); + + ShowWindow(GetDlgItem(hwndDlg, IDC_STATUS), (mode == FTS_TEXT)?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_ALLFILESPROGRESS), (mode == FTS_PROGRESS)?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_TRANSFERCOMPLETED), (mode == FTS_OPEN)?SW_SHOW:SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_FILEICON), (mode == FTS_OPEN)?SW_SHOW:SW_HIDE); +} + +static void HideProgressControls(HWND hwndDlg) +{ + RECT rc; + char buf[64]; + + GetWindowRect(GetDlgItem(hwndDlg, IDC_ALLPRECENTS), &rc); + MapWindowPoints(NULL, hwndDlg, (LPPOINT)&rc, 2); + SetWindowPos(hwndDlg, NULL, 0, 0, 100, rc.bottom+3, SWP_NOMOVE|SWP_NOZORDER); + ShowWindow(GetDlgItem(hwndDlg, IDC_ALLTRANSFERRED), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_ALLSPEED), SW_HIDE); + + _strtime(buf); + SetDlgItemTextA(hwndDlg, IDC_ALLPRECENTS, buf); + + PostMessage(GetParent(hwndDlg), WM_FT_RESIZE, 0, (LPARAM)hwndDlg); +} + +static int FileTransferDlgResizer(HWND, LPARAM, UTILRESIZECONTROL *urc) +{ + switch(urc->wId) { + case IDC_CONTACTNAME: + case IDC_STATUS: + case IDC_ALLFILESPROGRESS: + case IDC_TRANSFERCOMPLETED: + return RD_ANCHORX_WIDTH|RD_ANCHORY_TOP; + case IDC_FRAME: + return RD_ANCHORX_WIDTH|RD_ANCHORY_BOTTOM; + case IDC_ALLPRECENTS: + case IDCANCEL: + case IDC_OPENFILE: + case IDC_OPENFOLDER: + return RD_ANCHORX_RIGHT|RD_ANCHORY_TOP; + + case IDC_ALLTRANSFERRED: + urc->rcItem.right = urc->rcItem.left + (urc->rcItem.right - urc->rcItem.left - urc->dlgOriginalSize.cx + urc->dlgNewSize.cx) / 3; + return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; + + case IDC_ALLSPEED: + urc->rcItem.right = urc->rcItem.right - urc->dlgOriginalSize.cx + urc->dlgNewSize.cx; + urc->rcItem.left = urc->rcItem.left + (urc->rcItem.right - urc->rcItem.left) / 3; + return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; + } + return RD_ANCHORX_LEFT|RD_ANCHORY_TOP; +} + +INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + FileDlgData *dat = (FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (msg) + { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + dat = (FileDlgData*)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); + dat->hNotifyEvent = HookEventMessage(ME_PROTO_ACK, hwndDlg, HM_RECVEVENT); + dat->transferStatus.currentFileNumber = -1; + if (dat->send) { + dat->fs = (HANDLE)CallContactService(dat->hContact, PSS_FILET, (WPARAM)dat->szMsg, (LPARAM)dat->files); + SetFtStatus(hwndDlg, LPGENT("Request sent, waiting for acceptance..."), FTS_TEXT); + SetOpenFileButtonStyle(GetDlgItem(hwndDlg, IDC_OPENFILE), 1); + dat->waitingForAcceptance = 1; + // hide "open" button since it may cause potential access violations... + ShowWindow(GetDlgItem(hwndDlg, IDC_OPENFILE), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_OPENFOLDER), SW_HIDE); + } + else { //recv + CreateDirectoryTreeT(dat->szSavePath); + dat->fs = (HANDLE)CallContactService(dat->hContact, PSS_FILEALLOWT, (WPARAM)dat->fs, (LPARAM)dat->szSavePath); + dat->transferStatus.tszWorkingDir = mir_tstrdup(dat->szSavePath); + if (DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) dat->resumeBehaviour = FILERESUME_ASK; + else dat->resumeBehaviour = DBGetContactSettingByte(NULL, "SRFile", "IfExists", FILERESUME_ASK); + SetFtStatus(hwndDlg, LPGENT("Waiting for connection..."), FTS_TEXT); + } + { + /* check we actually got an fs handle back from the protocol */ + if ( !dat->fs) { + SetFtStatus(hwndDlg, LPGENT("Unable to initiate transfer."), FTS_TEXT); + dat->waitingForAcceptance = 0; + } + } + { LOGFONT lf; + HFONT hFont; + hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_CONTACTNAME, WM_GETFONT, 0, 0); + GetObject(hFont, sizeof(lf), &lf); + lf.lfWeight = FW_BOLD; + hFont = CreateFontIndirect(&lf); + SendDlgItemMessage(hwndDlg, IDC_CONTACTNAME, WM_SETFONT, (WPARAM)hFont, 0); + } + + { SHFILEINFO shfi = {0}; + SHGetFileInfo(_T(""), FILE_ATTRIBUTE_DIRECTORY, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES|SHGFI_ICON|SHGFI_SMALLICON); + dat->hIconFolder = shfi.hIcon; + } + + dat->hIcon = NULL; + + SendDlgItemMessage(hwndDlg, IDC_CONTACT, BM_SETIMAGE, IMAGE_ICON, + (LPARAM)LoadSkinnedProtoIcon((char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0), ID_STATUS_ONLINE)); + SendDlgItemMessage(hwndDlg, IDC_CONTACT, BUTTONADDTOOLTIP, (WPARAM)LPGEN("Contact menu"), 0); + SendDlgItemMessage(hwndDlg, IDC_CONTACT, BUTTONSETASFLATBTN, TRUE, 0); + + Button_SetIcon_IcoLib(hwndDlg, IDC_OPENFILE, SKINICON_OTHER_DOWNARROW, LPGEN("Open...")); + SendDlgItemMessage(hwndDlg, IDC_OPENFILE, BUTTONSETASPUSHBTN, TRUE, 0); + + SendDlgItemMessage(hwndDlg, IDC_OPENFOLDER, BM_SETIMAGE, IMAGE_ICON, (LPARAM)dat->hIconFolder); + SendDlgItemMessage(hwndDlg, IDC_OPENFOLDER, BUTTONADDTOOLTIP, (WPARAM)LPGEN("Open folder"), 0); + SendDlgItemMessage(hwndDlg, IDC_OPENFOLDER, BUTTONSETASFLATBTN, TRUE, 0); + + Button_SetIcon_IcoLib(hwndDlg, IDCANCEL, SKINICON_OTHER_DELETE, LPGEN("Cancel")); + + SetDlgItemText(hwndDlg, IDC_CONTACTNAME, pcli->pfnGetContactDisplayName(dat->hContact, 0)); + + if ( !dat->waitingForAcceptance) SetTimer(hwndDlg, 1, 1000, NULL); + return TRUE; + case WM_TIMER: + MoveMemory(dat->bytesRecvedHistory+1, dat->bytesRecvedHistory, sizeof(dat->bytesRecvedHistory)-sizeof(dat->bytesRecvedHistory[0])); + dat->bytesRecvedHistory[0] = dat->transferStatus.totalProgress; + if (dat->bytesRecvedHistorySize < SIZEOF(dat->bytesRecvedHistory)) + dat->bytesRecvedHistorySize++; + + { TCHAR szSpeed[32], szTime[32], szDisplay[96]; + SYSTEMTIME st; + ULARGE_INTEGER li; + FILETIME ft; + + GetSensiblyFormattedSize((dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1])/dat->bytesRecvedHistorySize, szSpeed, SIZEOF(szSpeed), 0, 1, NULL); + if (dat->bytesRecvedHistory[0] == dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]) + lstrcpy(szTime, _T("??:??:??")); + else { + li.QuadPart = BIGI(10000000)*(dat->transferStatus.currentFileSize-dat->transferStatus.currentFileProgress)*dat->bytesRecvedHistorySize/(dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]); + ft.dwHighDateTime = li.HighPart; ft.dwLowDateTime = li.LowPart; + FileTimeToSystemTime(&ft, &st); + GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT|TIME_NOTIMEMARKER, &st, NULL, szTime, SIZEOF(szTime)); + } + if (dat->bytesRecvedHistory[0] != dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]) { + li.QuadPart = BIGI(10000000)*(dat->transferStatus.totalBytes-dat->transferStatus.totalProgress)*dat->bytesRecvedHistorySize/(dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]); + ft.dwHighDateTime = li.HighPart; ft.dwLowDateTime = li.LowPart; + FileTimeToSystemTime(&ft, &st); + GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT|TIME_NOTIMEMARKER, &st, NULL, szTime, SIZEOF(szTime)); + } + + mir_sntprintf(szDisplay, SIZEOF(szDisplay), _T("%s/%s (%s %s)"), szSpeed, TranslateT("sec"), szTime, TranslateT("remaining")); + SetDlgItemText(hwndDlg, IDC_ALLSPEED, szDisplay); + } + break; + + case WM_MEASUREITEM: + return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); + + case WM_DRAWITEM: + return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); + + case WM_FT_CLEANUP: + if ( !dat->fs) + { + PostMessage(GetParent(hwndDlg), WM_FT_REMOVE, 0, (LPARAM)hwndDlg); + DestroyWindow(hwndDlg); + } + break; + + case WM_COMMAND: + if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) + break; + + switch (LOWORD(wParam)) + { + case IDOK: + case IDCANCEL: + PostMessage(GetParent(hwndDlg), WM_FT_REMOVE, 0, (LPARAM)hwndDlg); + DestroyWindow(hwndDlg); + break; + + case IDC_CONTACT: + { RECT rc; + HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)dat->hContact, 0); + GetWindowRect((HWND)lParam, &rc); + TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); + DestroyMenu(hMenu); + break; + } + + case IDC_TRANSFERCOMPLETED: + if (dat->transferStatus.currentFileNumber <= 1 && CheckVirusScanned(hwndDlg, dat, 0)) + { + ShellExecute(NULL, NULL, dat->files[0], NULL, NULL, SW_SHOW); + break; + } + + case IDC_OPENFOLDER: + if (dat) + { + TCHAR* path = dat->transferStatus.tszWorkingDir; + if ( !path || !path[0]) + { + path = NEWTSTR_ALLOCA(dat->transferStatus.tszCurrentFile); + TCHAR* p = _tcsrchr(path, '\\'); if (p) *p = 0; + } + + if (path) ShellExecute(NULL, _T("open"), path, NULL, NULL, SW_SHOW); + } + break; + + case IDC_OPENFILE: + { + TCHAR **files; + HMENU hMenu; + RECT rc; + int ret; + + if (dat->send) + if (dat->files == NULL) + files = dat->transferStatus.ptszFiles; + else + files = dat->files; + else + files = dat->files; + + hMenu = CreatePopupMenu(); + AppendMenu(hMenu, MF_STRING, 1, TranslateT("Open folder")); + AppendMenu(hMenu, MF_SEPARATOR, 0, 0); + + if (files && *files) + { + int i, limit; + TCHAR *pszFilename, *pszNewFileName; + + if (dat->send) + limit = dat->transferStatus.totalFiles; + else + limit = dat->transferStatus.currentFileNumber; + + // Loop over all transfered files and add them to the menu + for (i=0; i < limit; i++) { + pszFilename = _tcsrchr(files[i], '\\'); + if (pszFilename == NULL) + pszFilename = files[i]; + else + pszFilename++; + { + if (pszFilename) { + size_t cbFileNameLen = _tcslen(pszFilename); + + pszNewFileName = (TCHAR*)mir_alloc(cbFileNameLen*2*sizeof(TCHAR)); + TCHAR *p = pszNewFileName; + for (size_t pszlen = 0; pszlen < cbFileNameLen; pszlen++) { + *p++=pszFilename[pszlen]; + if (pszFilename[pszlen] == '&') + *p++='&'; + } + *p = '\0'; + AppendMenu(hMenu, MF_STRING, i+10, pszNewFileName); + mir_free(pszNewFileName); + } + } + } + } + + GetWindowRect((HWND)lParam, &rc); + CheckDlgButton(hwndDlg, IDC_OPENFILE, BST_CHECKED); + ret = TrackPopupMenu(hMenu, TPM_RETURNCMD|TPM_RIGHTALIGN, rc.right, rc.bottom, 0, hwndDlg, NULL); + CheckDlgButton(hwndDlg, IDC_OPENFILE, BST_UNCHECKED); + DestroyMenu(hMenu); + + if (ret == 1) + { + TCHAR* path = dat->transferStatus.tszWorkingDir; + if ( !path || !path[0]) + { + path = NEWTSTR_ALLOCA(dat->transferStatus.tszCurrentFile); + TCHAR* p = _tcsrchr(path, '\\'); if (p) *p = 0; + } + + if (path) ShellExecute(NULL, _T("open"), path, NULL, NULL, SW_SHOW); + } + else if (ret && CheckVirusScanned(hwndDlg, dat, ret)) + ShellExecute(NULL, NULL, files[ret-10], NULL, NULL, SW_SHOW); + + break; + } + } + break; + case M_FILEEXISTSDLGREPLY: + { PROTOFILERESUME *pfr = (PROTOFILERESUME*)lParam; + TCHAR *szOriginalFilename = (TCHAR*)wParam; + char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); + + EnableWindow(hwndDlg, TRUE); + switch(pfr->action) { + case FILERESUME_CANCEL: + if (dat->fs) CallContactService(dat->hContact, PSS_FILECANCEL, (WPARAM)dat->fs, 0); + dat->fs = NULL; + mir_free(szOriginalFilename); + if (pfr->szFilename) mir_free((char*)pfr->szFilename); + mir_free(pfr); + return 0; + case FILERESUME_RESUMEALL: + case FILERESUME_OVERWRITEALL: + dat->resumeBehaviour = pfr->action; + pfr->action&=~FILERESUMEF_ALL; + break; + case FILERESUME_RENAMEALL: + pfr->action = FILERESUME_RENAME; + { TCHAR *pszExtension, *pszFilename; + int i; + if ((pszFilename = _tcsrchr(szOriginalFilename, '\\')) == NULL) pszFilename = szOriginalFilename; + if ((pszExtension = _tcsrchr(pszFilename+1, '.')) == NULL) pszExtension = pszFilename+lstrlen(pszFilename); + if (pfr->szFilename) mir_free((TCHAR*)pfr->szFilename); + pfr->szFilename = (TCHAR*)mir_alloc(sizeof(TCHAR)*((pszExtension-szOriginalFilename)+21+lstrlen(pszExtension))); + for (i = 1;;i++) { + _stprintf((TCHAR*)pfr->szFilename, _T("%.*s (%u)%s"), pszExtension-szOriginalFilename, szOriginalFilename, i, pszExtension); + if (_taccess(pfr->szFilename, 0) != 0) + break; + } + } + break; + } + mir_free(szOriginalFilename); + CallProtoService(szProto, PS_FILERESUMET, (WPARAM)dat->fs, (LPARAM)pfr); + if (pfr->szFilename) mir_free((char*)pfr->szFilename); + mir_free(pfr); + break; + } + case HM_RECVEVENT: + { ACKDATA *ack = (ACKDATA*)lParam; + if (ack->hProcess != dat->fs) break; /* icq abuses this sometimes */ + if (ack->hContact != dat->hContact) break; + if (ack->type != ACKTYPE_FILE) break; + + if (dat->waitingForAcceptance) { + SetTimer(hwndDlg, 1, 1000, NULL); + dat->waitingForAcceptance = 0; + } + switch(ack->result) { + case ACKRESULT_SENTREQUEST: SetFtStatus(hwndDlg, LPGENT("Decision sent"), 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_CONNECTED: SetFtStatus(hwndDlg, LPGENT("Connected"), FTS_TEXT); break; + case ACKRESULT_LISTENING: SetFtStatus(hwndDlg, LPGENT("Waiting for connection..."), FTS_TEXT); break; + case ACKRESULT_INITIALISING: SetFtStatus(hwndDlg, LPGENT("Initialising..."), FTS_TEXT); break; + case ACKRESULT_NEXTFILE: + SetFtStatus(hwndDlg, LPGENT("Moving to next file..."), FTS_TEXT); + SetDlgItemTextA(hwndDlg, IDC_FILENAME, ""); + if (dat->transferStatus.currentFileNumber == 1 && dat->transferStatus.totalFiles>1 && !dat->send) + SetOpenFileButtonStyle(GetDlgItem(hwndDlg, IDC_OPENFILE), 1); + if (dat->transferStatus.currentFileNumber != -1 && dat->files && !dat->send && DBGetContactSettingByte(NULL, "SRFile", "UseScanner", VIRUSSCAN_DISABLE) == VIRUSSCAN_DURINGDL) { + if (GetFileAttributes(dat->files[dat->transferStatus.currentFileNumber])&FILE_ATTRIBUTE_DIRECTORY) + PostMessage(hwndDlg, M_VIRUSSCANDONE, dat->transferStatus.currentFileNumber, 0); + else { + virusscanthreadstartinfo *vstsi; + vstsi = (struct virusscanthreadstartinfo*)mir_alloc(sizeof(struct virusscanthreadstartinfo)); + vstsi->hwndReply = hwndDlg; + vstsi->szFile = mir_tstrdup(dat->files[dat->transferStatus.currentFileNumber]); + vstsi->returnCode = dat->transferStatus.currentFileNumber; + forkthread((void (*)(void*))RunVirusScannerThread, 0, vstsi); + } + } + break; + case ACKRESULT_FILERESUME: + { + UpdateProtoFileTransferStatus(&dat->transferStatus, (PROTOFILETRANSFERSTATUS*)ack->lParam); + PROTOFILETRANSFERSTATUS *fts = &dat->transferStatus; + + SetFilenameControls(hwndDlg, dat, fts); + int res = _taccess(fts->tszCurrentFile, 0); + if (res) + break; + + SetFtStatus(hwndDlg, LPGENT("File already exists"), FTS_TEXT); + if (dat->resumeBehaviour == FILERESUME_ASK) { + TDlgProcFileExistsParam param = { hwndDlg, fts }; + ShowWindow(hwndDlg, SW_SHOWNORMAL); + CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILEEXISTS), hwndDlg, DlgProcFileExists, (LPARAM)¶m); + EnableWindow(hwndDlg, FALSE); + } + else { + PROTOFILERESUME *pfr; + pfr = (PROTOFILERESUME*)mir_alloc(sizeof(PROTOFILERESUME)); + pfr->action = dat->resumeBehaviour; + pfr->szFilename = NULL; + PostMessage(hwndDlg, M_FILEEXISTSDLGREPLY, (WPARAM)mir_tstrdup(fts->tszCurrentFile), (LPARAM)pfr); + } + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, 1); + return TRUE; + } + case ACKRESULT_DATA: + { + PROTOFILETRANSFERSTATUS *fts = (PROTOFILETRANSFERSTATUS*)ack->lParam; + TCHAR str[64], str2[64], szSizeDone[32], szSizeTotal[32];//, *contactName; + int units; + + if (dat->fileVirusScanned == NULL) + dat->fileVirusScanned = (int*)mir_calloc(sizeof(int) * fts->totalFiles); + + // This needs to be here - otherwise we get holes in the files array + if ( !dat->send) { + if (dat->files == NULL) + dat->files = (TCHAR**)mir_calloc((fts->totalFiles + 1) * sizeof(TCHAR*)); + if (fts->currentFileNumber < fts->totalFiles && dat->files[fts->currentFileNumber] == NULL) + dat->files[fts->currentFileNumber] = PFTS_StringToTchar(fts->flags, fts->tszCurrentFile); + } + + /* HACK: for 0.3.3, limit updates to around 1.1 ack per second */ + if (fts->totalProgress != fts->totalBytes && GetTickCount() < (dat->dwTicks + 650)) break; // the last update was less than a second ago! + dat->dwTicks = GetTickCount(); + + // Update local transfer status with data from protocol + UpdateProtoFileTransferStatus(&dat->transferStatus, fts); + fts = &dat->transferStatus; + + bool firstTime = false; + if ((GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_ALLFILESPROGRESS), GWL_STYLE) & WS_VISIBLE) == 0) + { + SetFtStatus(hwndDlg, (fts->flags & PFTS_SENDING) ? LPGENT("Sending...") : LPGENT("Receiving..."), FTS_PROGRESS); + SetFilenameControls(hwndDlg, dat, fts); + firstTime = true; + } + + const unsigned long lastPos = SendDlgItemMessage(hwndDlg, IDC_ALLFILESPROGRESS, PBM_GETPOS, 0, 0); + const unsigned long nextPos = fts->totalBytes ? (BIGI(100) * fts->totalProgress / fts->totalBytes) : 0; + if (lastPos != nextPos || firstTime) + { + SendDlgItemMessage(hwndDlg, IDC_ALLFILESPROGRESS, PBM_SETPOS, nextPos, 0); + mir_sntprintf(str, SIZEOF(str), _T("%u%%"), nextPos); + SetDlgItemText(hwndDlg, IDC_ALLPRECENTS, str); + } + + GetSensiblyFormattedSize(fts->totalBytes, szSizeTotal, SIZEOF(szSizeTotal), 0, 1, &units); + GetSensiblyFormattedSize(fts->totalProgress, szSizeDone, SIZEOF(szSizeDone), units, 0, NULL); + mir_sntprintf(str, SIZEOF(str), _T("%s/%s"), szSizeDone, szSizeTotal); + str2[0] = 0; + GetDlgItemText(hwndDlg, IDC_ALLTRANSFERRED, str2, SIZEOF(str2)); + if (_tcscmp(str, str2)) SetDlgItemText(hwndDlg, IDC_ALLTRANSFERRED, str); + break; + } + + case ACKRESULT_SUCCESS: + case ACKRESULT_FAILED: + case ACKRESULT_DENIED: + { + + HideProgressControls(hwndDlg); + KillTimer(hwndDlg, 1); + if ( !dat->send) + SetOpenFileButtonStyle(GetDlgItem(hwndDlg, IDC_OPENFILE), 1); + SetDlgItemText(hwndDlg, IDCANCEL, TranslateT("Close")); + if (dat->hNotifyEvent) + UnhookEvent(dat->hNotifyEvent); + dat->hNotifyEvent = NULL; + + if (ack->result == ACKRESULT_DENIED) + { + dat->fs = NULL; /* protocol will free structure */ + SkinPlaySound("FileDenied"); + SetFtStatus(hwndDlg, LPGENT("File transfer denied"), FTS_TEXT); + } else if (ack->result == ACKRESULT_FAILED) + { + dat->fs = NULL; /* protocol will free structure */ + SkinPlaySound("FileFailed"); + SetFtStatus(hwndDlg, LPGENT("File transfer failed"), FTS_TEXT); + } else { + SkinPlaySound("FileDone"); + if (dat->send) + { + dat->fs = NULL; /* protocol will free structure */ + SetFtStatus(hwndDlg, LPGENT("Transfer completed."), FTS_TEXT); + + DBEVENTINFO dbei = {0}; + FillSendData(dat, dbei); + CallService(MS_DB_EVENT_ADD, (WPARAM)dat->hContact, (LPARAM)&dbei); + if (dbei.pBlob) + mir_free(dbei.pBlob); + dat->files = NULL; //protocol library frees this + + } else { + SetFtStatus(hwndDlg, + (dat->transferStatus.totalFiles == 1) ? + LPGENT("Transfer completed, open file.") : + LPGENT("Transfer completed, open folder."), + FTS_OPEN); + + int useScanner = DBGetContactSettingByte(NULL, "SRFile", "UseScanner", VIRUSSCAN_DISABLE); + if (useScanner != VIRUSSCAN_DISABLE) { + struct virusscanthreadstartinfo *vstsi; + vstsi = (struct virusscanthreadstartinfo*)mir_alloc(sizeof(struct virusscanthreadstartinfo)); + vstsi->hwndReply = hwndDlg; + if (useScanner == VIRUSSCAN_DURINGDL) { + vstsi->returnCode = dat->transferStatus.currentFileNumber; + if (GetFileAttributes(dat->files[dat->transferStatus.currentFileNumber])&FILE_ATTRIBUTE_DIRECTORY) { + PostMessage(hwndDlg, M_VIRUSSCANDONE, vstsi->returnCode, 0); + mir_free(vstsi); + vstsi = NULL; + } + else vstsi->szFile = mir_tstrdup(dat->files[dat->transferStatus.currentFileNumber]); + } + else { + vstsi->szFile = mir_tstrdup(dat->transferStatus.tszWorkingDir); + vstsi->returnCode = -1; + } + SetFtStatus(hwndDlg, LPGENT("Scanning for viruses..."), FTS_TEXT); + if (vstsi) + forkthread((void (*)(void*))RunVirusScannerThread, 0, vstsi); + } + else dat->fs = NULL; /* protocol will free structure */ + + dat->transferStatus.currentFileNumber = dat->transferStatus.totalFiles; + } // else dat->send + + } // else ack->result + + PostMessage(GetParent(hwndDlg), WM_FT_COMPLETED, ack->result, (LPARAM)hwndDlg); + break; + } + break; + } // switch ack->result + } break; // case HM_RECVEVENT + case M_VIRUSSCANDONE: + { int done = 1, i; + if ((int)wParam == -1) { + for (i=0;itransferStatus.totalFiles;i++) dat->fileVirusScanned[i] = 1; + } + else { + dat->fileVirusScanned[wParam] = 1; + for (i=0;itransferStatus.totalFiles;i++) if ( !dat->fileVirusScanned[i]) {done = 0; break;} + } + if (done) + { + dat->fs = NULL; /* protocol will free structure */ + SetFtStatus(hwndDlg, LPGENT("Transfer and virus scan complete"), FTS_TEXT); + } + break; + } + case WM_SIZE: + { + UTILRESIZEDIALOG urd = {0}; + urd.cbSize = sizeof(urd); + urd.hwndDlg = hwndDlg; + urd.hInstance = hInst; + urd.lpTemplate = MAKEINTRESOURCEA(IDD_FILETRANSFERINFO); + urd.pfnResizer = FileTransferDlgResizer; + CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd); + + RedrawWindow(GetDlgItem(hwndDlg, IDC_ALLTRANSFERRED), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); + RedrawWindow(GetDlgItem(hwndDlg, IDC_ALLSPEED), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); + RedrawWindow(GetDlgItem(hwndDlg, IDC_CONTACTNAME), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); + RedrawWindow(GetDlgItem(hwndDlg, IDC_STATUS), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); + break; + } + case WM_DESTROY: + KillTimer(hwndDlg, 1); + + HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_CONTACTNAME, WM_GETFONT, 0, 0); + DeleteObject(hFont); + + Button_FreeIcon_IcoLib(hwndDlg, IDC_CONTACT); + Button_FreeIcon_IcoLib(hwndDlg, IDC_OPENFILE); + Button_FreeIcon_IcoLib(hwndDlg, IDCANCEL); + + FreeFileDlgData(dat); + break; + } + return FALSE; +} + +void FreeFileDlgData(FileDlgData* dat) +{ + if (dat->fs) + CallContactService(dat->hContact, PSS_FILECANCEL, (WPARAM)dat->fs, 0); + dat->fs = NULL; + + if (dat->hPreshutdownEvent) UnhookEvent(dat->hPreshutdownEvent); + if (dat->hNotifyEvent) UnhookEvent(dat->hNotifyEvent); + dat->hNotifyEvent = NULL; + + FreeProtoFileTransferStatus(&dat->transferStatus); + FreeFilesMatrix(&dat->files); + + mir_free(dat->fileVirusScanned); + if (dat->hIcon) DestroyIcon(dat->hIcon); + if (dat->hIconFolder) DestroyIcon(dat->hIconFolder); + mir_free(dat); +} diff --git a/src/core/stdfile/ftmanager.cpp b/src/core/stdfile/ftmanager.cpp new file mode 100644 index 0000000000..216798ded7 --- /dev/null +++ b/src/core/stdfile/ftmanager.cpp @@ -0,0 +1,533 @@ +/* + +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. +*/ +#include "commonheaders.h" +#include "file.h" + +static HWND hwndFtMgr = NULL; + +struct TFtMgrData +{ + HWND hwndIncoming; + HWND hwndOutgoing; + + HANDLE hhkPreshutdown; + TBPFLAG errorState; +}; + +#define M_CALCPROGRESS (WM_USER + 200) + +struct TFtProgressData +{ + unsigned int init, run, scan; + unsigned __int64 totalBytes, totalProgress; +}; + +struct TLayoutWindowInfo +{ + HWND hwnd; + RECT rc; +}; + +struct TLayoutWindowList +{ + struct TLayoutWindowInfo **items; + int realCount, limit, increment; + FSortFunc sortFunc; +}; + +struct TFtPageData +{ + struct TLayoutWindowList *wnds; + int runningCount; + int height, dataHeight, scrollPos; +}; + +static void LayoutTransfers(HWND hwnd, struct TFtPageData *dat) +{ + int top = 0; + RECT rc; + GetClientRect(hwnd, &rc); + + dat->scrollPos = GetScrollPos(hwnd, SB_VERT); + dat->height = rc.bottom - rc.top; + + if (dat->wnds->realCount) { + HDWP hdwp = BeginDeferWindowPos(dat->wnds->realCount); + top -= dat->scrollPos; + for (int i=0; i < dat->wnds->realCount; ++i) + { + int height = dat->wnds->items[i]->rc.bottom - dat->wnds->items[i]->rc.top; + hdwp = DeferWindowPos(hdwp, dat->wnds->items[i]->hwnd, NULL, 0, top, rc.right, height, SWP_NOZORDER); + top += height; + } + top += dat->scrollPos; + EndDeferWindowPos(hdwp); + } + + dat->dataHeight = top; + + SCROLLINFO si = {0}; + si.cbSize = sizeof(si); + si.fMask = SIF_DISABLENOSCROLL|SIF_PAGE|SIF_RANGE; + si.nPage = dat->height; + si.nMin = 0; + si.nMax = dat->dataHeight; + SetScrollInfo(hwnd, SB_VERT, &si, TRUE); +} + +static INT_PTR CALLBACK FtMgrPageDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct TFtPageData *dat = (struct TFtPageData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + int i; + + switch (msg) { + case WM_INITDIALOG: + { + // Force scrollbar visibility + SCROLLINFO si = {0}; + si.cbSize = sizeof(si); + si.fMask = SIF_DISABLENOSCROLL; + SetScrollInfo(hwnd, SB_VERT, &si, TRUE); + + dat = (struct TFtPageData *)mir_alloc(sizeof(struct TFtPageData)); + dat->wnds = (struct TLayoutWindowList *)List_Create(0, 1); + dat->scrollPos = 0; + dat->runningCount = 0; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)dat); + } + break; + + case WM_FT_ADD: + { + TLayoutWindowInfo *wnd = (struct TLayoutWindowInfo *)mir_alloc(sizeof(struct TLayoutWindowInfo)); + wnd->hwnd = (HWND)lParam; + GetWindowRect(wnd->hwnd, &wnd->rc); + List_Insert((SortedList *)dat->wnds, wnd, dat->wnds->realCount); + LayoutTransfers(hwnd, dat); + dat->runningCount++; + PostMessage(GetParent(hwnd), WM_TIMER, 1, NULL); + } + break; + + case WM_FT_RESIZE: + for (i=0; i < dat->wnds->realCount; ++i) + if (dat->wnds->items[i]->hwnd == (HWND)lParam) { + GetWindowRect(dat->wnds->items[i]->hwnd, &dat->wnds->items[i]->rc); + break; + } + LayoutTransfers(hwnd, dat); + break; + + case WM_FT_REMOVE: + for (i=0; i < dat->wnds->realCount; ++i) + if (dat->wnds->items[i]->hwnd == (HWND)lParam) { + mir_free(dat->wnds->items[i]); + List_Remove((SortedList *)dat->wnds, i); + break; + } + LayoutTransfers(hwnd, dat); + break; + + case WM_FT_COMPLETED: + //wParam: { ACKRESULT_SUCCESS | ACKRESULT_FAILED | ACKRESULT_DENIED } + dat->runningCount--; + for (i=0; i < dat->wnds->realCount; i++) { + // no error when canceling (WM_FT_REMOVE is send first, check if hwnd is still registered) + if (dat->wnds->items[i]->hwnd == (HWND)lParam) { + SendMessage(GetParent(hwnd), WM_TIMER, 1, (LPARAM)wParam); + break; + } + } + if (i == dat->wnds->realCount) + PostMessage(GetParent(hwnd), WM_TIMER, 1, NULL); + + if(dat->runningCount == 0 && (int)wParam == ACKRESULT_SUCCESS && DBGetContactSettingByte(NULL, "SRFile", "AutoClose", 0)) + ShowWindow(hwndFtMgr, SW_HIDE); + break; + + case WM_FT_CLEANUP: + for (i=0; i < dat->wnds->realCount; ++i) + SendMessage(dat->wnds->items[i]->hwnd, WM_FT_CLEANUP, wParam, lParam); + break; + + case WM_SIZE: + LayoutTransfers(hwnd, dat); + break; + + case WM_MOUSEWHEEL: + { + int zDelta = GET_WHEEL_DELTA_WPARAM(wParam); + if (zDelta) { + int nScrollLines = 0; + SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, (void*)&nScrollLines, 0); + for (i=0; i < (nScrollLines + 1) / 2; i++) + SendMessage(hwnd, WM_VSCROLL, (zDelta < 0) ? SB_LINEDOWN : SB_LINEUP, 0); + } + + SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0); + return TRUE; + } + + case WM_VSCROLL: + { + int pos = dat->scrollPos; + switch (LOWORD(wParam)) { + case SB_LINEDOWN: + pos += 15; + break; + case SB_LINEUP: + pos -= 15; + break; + case SB_PAGEDOWN: + pos += dat->height - 10; + break; + case SB_PAGEUP: + pos -= dat->height - 10; + break; + case SB_THUMBTRACK: + pos = HIWORD(wParam); + break; + } + + if (pos > dat->dataHeight - dat->height) pos = dat->dataHeight - dat->height; + if (pos < 0) pos = 0; + + if (dat->scrollPos != pos) { + ScrollWindow(hwnd, 0, dat->scrollPos - pos, NULL, NULL); + SetScrollPos(hwnd, SB_VERT, pos, TRUE); + dat->scrollPos = pos; + } + break; + } + + case M_PRESHUTDOWN: + for (i=0; i < dat->wnds->realCount; ++i) + PostMessage(dat->wnds->items[i]->hwnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), 0); + break; + + case M_CALCPROGRESS: + { + TFtProgressData *prg = (TFtProgressData *)wParam; + for (i=0; i < dat->wnds->realCount; ++i) { + struct FileDlgData *trdat = (struct FileDlgData *)GetWindowLongPtr(dat->wnds->items[i]->hwnd, GWLP_USERDATA); + if (trdat->transferStatus.totalBytes && trdat->fs && !trdat->send && (trdat->transferStatus.totalBytes == trdat->transferStatus.totalProgress)) + prg->scan++; + else if (trdat->transferStatus.totalBytes && trdat->fs) { // in progress + prg->run++; + prg->totalBytes += trdat->transferStatus.totalBytes; + prg->totalProgress += trdat->transferStatus.totalProgress; + } + else if (trdat->fs) // starting + prg->init++; + } + } + break; + + case WM_DESTROY: + for (i=0; i < dat->wnds->realCount; ++i) + mir_free(dat->wnds->items[i]); + List_Destroy((SortedList *)dat->wnds); + mir_free(dat->wnds); + mir_free(dat); + break; + } + + return FALSE; +} + +static INT_PTR CALLBACK FtMgrDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct TFtMgrData *dat = (struct TFtMgrData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + + switch (msg) { + case WM_INITDIALOG: + { + TCITEM tci = {0}; + HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); + + TranslateDialogDefault(hwnd); + Window_SetIcon_IcoLib(hwnd, SKINICON_EVENT_FILE); + + dat = (struct TFtMgrData *)mir_calloc(sizeof(struct TFtMgrData)); + + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)dat); + + dat->hhkPreshutdown = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwnd, M_PRESHUTDOWN); + + dat->hwndIncoming = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc); + dat->hwndOutgoing = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc); + ShowWindow(dat->hwndIncoming, SW_SHOW); + + tci.mask = TCIF_PARAM|TCIF_TEXT; + tci.pszText = TranslateT("Incoming"); + tci.lParam = (LPARAM)dat->hwndIncoming; + TabCtrl_InsertItem(hwndTab, 0, &tci); + tci.pszText = TranslateT("Outgoing"); + tci.lParam = (LPARAM)dat->hwndOutgoing; + TabCtrl_InsertItem(hwndTab, 1, &tci); + + // Utils_RestoreWindowPosition(hwnd, NULL, "SRFile", "FtMgrDlg_"); + SAVEWINDOWPOS swp; + swp.hwnd = hwnd; swp.hContact = NULL; swp.szModule = "SRFile"; swp.szNamePrefix = "FtMgrDlg_"; + CallService(MS_UTILS_RESTOREWINDOWPOSITION, RWPF_NOACTIVATE, (LPARAM)&swp); + + // Fall through to setup initial placement + } + case WM_SIZE: + { + RECT rc, rcButton; + HDWP hdwp; + HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); + + GetWindowRect(GetDlgItem(hwnd, IDCANCEL), &rcButton); + OffsetRect(&rcButton, -rcButton.left, -rcButton.top); + + GetClientRect(hwnd, &rc); + InflateRect(&rc, -6, -6); + + hdwp = BeginDeferWindowPos(3); + + hdwp = DeferWindowPos(hdwp, GetDlgItem(hwnd, IDC_CLEAR), NULL, rc.left, rc.bottom-rcButton.bottom, 0, 0, SWP_NOZORDER|SWP_NOSIZE); + hdwp = DeferWindowPos(hdwp, GetDlgItem(hwnd, IDCANCEL), NULL, rc.right-rcButton.right, rc.bottom-rcButton.bottom, 0, 0, SWP_NOZORDER|SWP_NOSIZE); + + rc.bottom -= rcButton.bottom + 5; + + hdwp = DeferWindowPos(hdwp, hwndTab, NULL, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, SWP_NOZORDER); + + EndDeferWindowPos(hdwp); + + GetWindowRect(hwndTab, &rc); + MapWindowPoints(NULL, hwnd, (LPPOINT)&rc, 2); + TabCtrl_AdjustRect(hwndTab, FALSE, &rc); + InflateRect(&rc, -5, -5); + + hdwp = BeginDeferWindowPos(2); + + hdwp = DeferWindowPos(hdwp, dat->hwndIncoming, HWND_TOP, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 0); + hdwp = DeferWindowPos(hdwp, dat->hwndOutgoing, HWND_TOP, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 0); + + EndDeferWindowPos(hdwp); + + break; + } + + case WM_MOUSEWHEEL: + if (IsWindowVisible(dat->hwndIncoming)) SendMessage(dat->hwndIncoming, msg, wParam, lParam); + if (IsWindowVisible(dat->hwndOutgoing)) SendMessage(dat->hwndOutgoing, msg, wParam, lParam); + break; + + case WM_FT_SELECTPAGE: + { + TCITEM tci = {0}; + HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); + + if (TabCtrl_GetCurSel(hwndTab) == (int)wParam) break; + + tci.mask = TCIF_PARAM; + + TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); + ShowWindow((HWND)tci.lParam, SW_HIDE); + + TabCtrl_SetCurSel(hwndTab, wParam); + + TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); + ShowWindow((HWND)tci.lParam, SW_SHOW); + } + break; + + case WM_GETMINMAXINFO: + { + LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam; + lpmmi->ptMinTrackSize.x = 300; + lpmmi->ptMinTrackSize.y = 400; + return 0; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDCANCEL: + PostMessage(hwnd, WM_CLOSE , 0, 0); + break; + + case IDC_CLEAR: + PostMessage(dat->hwndIncoming, WM_FT_CLEANUP, 0, 0); + PostMessage(dat->hwndOutgoing, WM_FT_CLEANUP, 0, 0); + break; + } + break; + + case WM_NOTIFY: + switch (((LPNMHDR)lParam)->idFrom) { + case IDC_TABS: + { + HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); + switch (((LPNMHDR)lParam)->code) { + case TCN_SELCHANGING: + { + TCITEM tci = {0}; + tci.mask = TCIF_PARAM; + TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); + ShowWindow((HWND)tci.lParam, SW_HIDE); + break; + } + + case TCN_SELCHANGE: + { + TCITEM tci = {0}; + tci.mask = TCIF_PARAM; + TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); + ShowWindow((HWND)tci.lParam, SW_SHOW); + break; + } + } + break; + } + } + break; + + case M_PRESHUTDOWN: + SendMessage(dat->hwndIncoming, M_PRESHUTDOWN, 0, 0); + SendMessage(dat->hwndOutgoing, M_PRESHUTDOWN, 0, 0); + DestroyWindow(hwnd); + break; + + case WM_CLOSE: + ShowWindow(hwnd, SW_HIDE); + if (DBGetContactSettingByte(NULL, "SRFile", "AutoClear", 1)) { + PostMessage(dat->hwndIncoming, WM_FT_CLEANUP, 0, 0); + PostMessage(dat->hwndOutgoing, WM_FT_CLEANUP, 0, 0); + } + return TRUE; /* Disable default IDCANCEL notification */ + + case WM_DESTROY: + UnhookEvent(dat->hhkPreshutdown); + Window_FreeIcon_IcoLib(hwnd); + DestroyWindow(dat->hwndIncoming); + DestroyWindow(dat->hwndOutgoing); + mir_free(dat); + SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); + Utils_SaveWindowPosition(hwnd, NULL, "SRFile", "FtMgrDlg_"); + break; + + case WM_ACTIVATE: + dat->errorState = TBPF_NOPROGRESS; + wParam = 1; + break; + + case WM_SHOWWINDOW: + if ( !wParam) { // hiding + KillTimer(hwnd, 1); + break; + } + lParam = 0; + + case WM_TIMER: + if (pTaskbarInterface) { + SetTimer(hwnd, 1, 400, NULL); + if ((lParam == ACKRESULT_FAILED) || (lParam == ACKRESULT_DENIED)) + dat->errorState = TBPF_ERROR; + + TFtProgressData prg = {0}; + SendMessage(dat->hwndIncoming, M_CALCPROGRESS, (WPARAM)&prg, 0); + SendMessage(dat->hwndOutgoing, M_CALCPROGRESS, (WPARAM)&prg, 0); + if (dat->errorState) { + pTaskbarInterface->SetProgressState(hwnd, dat->errorState); + if ( !prg.run) + pTaskbarInterface->SetProgressValue(hwnd, 1, 1); + } + else if (prg.run) + pTaskbarInterface->SetProgressState(hwnd, TBPF_NORMAL); + else if (prg.init || prg.scan) + pTaskbarInterface->SetProgressState(hwnd, TBPF_INDETERMINATE); + else { + pTaskbarInterface->SetProgressState(hwnd, TBPF_NOPROGRESS); + KillTimer(hwnd, 1); + } + + if (prg.run) + pTaskbarInterface->SetProgressValue(hwnd, prg.totalProgress, prg.totalBytes); + } + break; + } + + return FALSE; +} + +HWND FtMgr_Show(bool bForceActivate, bool bFromMenu) +{ + bool bAutoMin = DBGetContactSettingByte(NULL, "SRFile", "AutoMin", 0) != 0; /* lqbe */ + + bool bJustCreated = (hwndFtMgr == NULL); + if (bJustCreated) + hwndFtMgr = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTMGR), NULL, FtMgrDlgProc); + + if (bFromMenu) { /* lqbe */ + ShowWindow(hwndFtMgr, SW_RESTORE); + ShowWindow(hwndFtMgr, SW_SHOW); + SetForegroundWindow(hwndFtMgr); + return hwndFtMgr; + } + if (bAutoMin && bJustCreated) { /* lqbe */ + ShowWindow(hwndFtMgr, SW_HIDE); + ShowWindow(hwndFtMgr, SW_MINIMIZE); + return hwndFtMgr; + } + if (bForceActivate) { /* lqbe */ + ShowWindow(hwndFtMgr, SW_RESTORE); + ShowWindow(hwndFtMgr, SW_SHOWNOACTIVATE); + SetForegroundWindow(hwndFtMgr); + return hwndFtMgr; + } + if ( !bJustCreated && IsWindowVisible(hwndFtMgr)) + return hwndFtMgr; + + ShowWindow(hwndFtMgr, bAutoMin ? SW_SHOWMINNOACTIVE : SW_SHOWNOACTIVATE); + return hwndFtMgr; +} + +void FtMgr_Destroy() +{ + if (hwndFtMgr) + DestroyWindow(hwndFtMgr); +} + +void FtMgr_ShowPage(int page) +{ + if (hwndFtMgr) + SendMessage(hwndFtMgr, WM_FT_SELECTPAGE, page, 0); +} + +HWND FtMgr_AddTransfer(FileDlgData *fdd) +{ + bool bForceActivate = fdd->send || !DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0); + TFtMgrData *dat = (TFtMgrData*)GetWindowLongPtr(FtMgr_Show(bForceActivate, false), GWLP_USERDATA); + if (dat == NULL) + return NULL; + + HWND hwndBox = fdd->send ? dat->hwndOutgoing : dat->hwndIncoming; + HWND hwndFt = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILETRANSFERINFO), hwndBox, DlgProcFileTransfer, (LPARAM)fdd); + ShowWindow(hwndFt, SW_SHOWNA); + SendMessage(hwndBox, WM_FT_ADD, 0, (LPARAM)hwndFt); + FtMgr_ShowPage(fdd->send ? 1 : 0); + return hwndFt; +} diff --git a/src/core/stdfile/main.cpp b/src/core/stdfile/main.cpp new file mode 100644 index 0000000000..ff38be0e8b --- /dev/null +++ b/src/core/stdfile/main.cpp @@ -0,0 +1,88 @@ +/* + +Standard URL plugin for Myranda IM + +Copyright (C) 2012 George Hazan + +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., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "commonheaders.h" + +int LoadSendRecvFileModule(void); + +CLIST_INTERFACE* pcli; +TIME_API tmi; +HINSTANCE hInst; +int hLangpack; + +pfnSHAutoComplete shAutoComplete; +ITaskbarList3 * pTaskbarInterface; + +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + MIRANDA_VERSION_DWORD, + __DESCRIPTION, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + /* 8d0a046d-8ea9-4c55-b568-38da520564fd */ + { 0x8d0a046d, 0x8ea9, 0x4c55, {0xb5, 0x68, 0x38, 0xda, 0x52, 0x05, 0x64, 0xfd}} +}; + +static const MUUID interfaces[] = { MIID_SRFILE, MIID_LAST }; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + hInst = hinstDLL; + return TRUE; +} + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +extern "C" __declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) +{ + return interfaces; +} + +extern "C" int __declspec(dllexport) Load(void) +{ + mir_getLP(&pluginInfo); + mir_getTMI(&tmi); + + pcli = ( CLIST_INTERFACE* )CallService(MS_CLIST_RETRIEVE_INTERFACE, 0, (LPARAM)hInst); + + if ( IsWinVer7Plus()) + CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&pTaskbarInterface); + + shAutoComplete = (pfnSHAutoComplete)GetProcAddress(GetModuleHandleA("shlwapi"), "SHAutoComplete"); + + LoadSendRecvFileModule(); + return 0; +} + +extern "C" int __declspec(dllexport) Unload(void) +{ + if (pTaskbarInterface) + pTaskbarInterface->Release(); + + return 0; +} diff --git a/src/core/stdfile/resource.rc b/src/core/stdfile/resource.rc new file mode 100644 index 0000000000..10272edbbb --- /dev/null +++ b/src/core/stdfile/resource.rc @@ -0,0 +1,293 @@ +// Microsoft Visual C++ generated resource script. +// +#include "..\..\resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_FILESEND DIALOGEX 0, 0, 256, 177 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Send File(s)" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_MSG,6,102,245,46,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + DEFPUSHBUTTON "&Send",IDOK,67,157,50,15 + PUSHBUTTON "Cancel",IDCANCEL,140,157,50,15 + LTEXT "To:",IDC_STATIC,6,23,24,9,SS_CENTERIMAGE + CONTROL "",IDC_TO,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,43,24,159,9 + LTEXT "File(s):",IDC_STATIC,7,39,30,8 + EDITTEXT IDC_FILE,38,38,213,31,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY + PUSHBUTTON "&Choose Again...",IDC_CHOOSE,39,74,77,14 + RTEXT "Total size:",IDC_STATIC,119,76,68,8 + CONTROL "",IDC_TOTALSIZE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,191,76,58,8 + LTEXT "Description:",IDC_STATIC,6,93,96,8 + CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,195,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,213,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,231,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 + LTEXT "",IDC_NAME,19,7,151,9,SS_NOPREFIX | SS_CENTERIMAGE +END + +IDD_FILERECV DIALOGEX 0, 0, 256, 174 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Incoming File Transfer" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "A&ccept",IDOK,68,155,50,14 + PUSHBUTTON "&Decline",IDCANCEL,138,155,50,14 + LTEXT "From:",IDC_STATIC,6,20,24,9,SS_CENTERIMAGE + CONTROL "",IDC_FROM,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,39,21,159,9 + LTEXT "Date:",IDC_STATIC,6,35,28,9,SS_CENTERIMAGE + CONTROL "",IDC_DATE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,39,34,159,9 + LTEXT "Files:",IDC_STATIC,6,50,28,8 + EDITTEXT IDC_FILENAMES,39,50,210,16,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Description:",IDC_STATIC,6,69,64,8 + EDITTEXT IDC_MSG,6,79,243,45,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY + LTEXT "Save to:",IDC_STATIC,6,131,34,8 + PUSHBUTTON "...",IDC_FILEDIRBROWSE,235,130,14,10 + COMBOBOX IDC_FILEDIR,45,129,187,108,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "&A",IDC_ADD,"MButtonClass",WS_TABSTOP,177,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,195,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,213,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,231,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 + LTEXT "",IDC_NAME,19,7,151,9,SS_NOPREFIX | SS_CENTERIMAGE +END + +IDD_FILETRANSFERINFO DIALOGEX 0, 0, 256, 44 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Contact menu",IDC_CONTACT,"MButtonClass",WS_TABSTOP,5,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_CONTACTNAME,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_WORDELLIPSIS | WS_GROUP,25,1,174,14 + CONTROL "Open...",IDC_OPENFILE,"MButtonClass",WS_DISABLED | WS_TABSTOP,203,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "Open folder",IDC_OPENFOLDER,"MButtonClass",WS_TABSTOP,219,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "Cancel",IDCANCEL,"MButtonClass",WS_TABSTOP,235,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_ALLFILESPROGRESS,"msctls_progress32",PBS_SMOOTH | NOT WS_VISIBLE | WS_DISABLED,25,16,190,12 + CONTROL "",IDC_STATUS,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX | WS_GROUP,25,17,190,10 + ICON "",IDC_FILEICON,25,15,16,14,SS_CENTERIMAGE | SS_REALSIZEIMAGE + CONTROL "Transfer completed, open file(s).",IDC_TRANSFERCOMPLETED, + "Hyperlink",NOT WS_VISIBLE | WS_TABSTOP,42,17,173,10 + LTEXT "No data transferred",IDC_ALLTRANSFERRED,25,29,226,14,SS_NOPREFIX | SS_CENTERIMAGE + RTEXT "",IDC_ALLSPEED,25,29,226,14,SS_NOPREFIX | SS_CENTERIMAGE + LTEXT "",IDC_ALLPRECENTS,218,14,33,14,SS_CENTERIMAGE + CONTROL "",IDC_FRAME,"Static",SS_ETCHEDHORZ,1,43,254,1 +END + +IDD_FILEEXISTS DIALOGEX 0, 0, 288, 181 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "File Already Exists" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + PUSHBUTTON "Resume",IDC_RESUME,5,144,65,14 + PUSHBUTTON "Resume all",IDC_RESUMEALL,5,162,65,14 + PUSHBUTTON "Overwrite",IDC_OVERWRITE,76,144,65,14 + PUSHBUTTON "Overwrite all",IDC_OVERWRITEALL,76,162,65,14 + PUSHBUTTON "Save as...",IDC_SAVEAS,147,144,65,14 + PUSHBUTTON "Auto rename",IDC_AUTORENAME,147,162,65,14 + PUSHBUTTON "Skip",IDC_SKIP,218,144,65,14 + PUSHBUTTON "Cancel transfer",IDCANCEL,218,162,65,14 + LTEXT "You are about to receive the file",IDC_STATIC,5,5,278,8 + EDITTEXT IDC_FILENAME,15,16,268,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + GROUPBOX "Existing file",IDC_STATIC,5,29,278,61 + ICON "",IDC_EXISTINGICON,14,45,20,20,SS_NOTIFY + LTEXT "Size:",IDC_STATIC,40,42,27,8 + LTEXT "",IDC_EXISTINGSIZE,67,42,35,8 + RTEXT "Last modified:",IDC_STATIC,103,42,58,8 + LTEXT "",IDC_EXISTINGDATE,166,42,115,8 + LTEXT "Type:",IDC_STATIC,40,55,27,8 + LTEXT "",IDC_EXISTINGTYPE,67,55,214,8 + PUSHBUTTON "Open file",IDC_OPENFILE,12,70,62,13 + PUSHBUTTON "Open folder",IDC_OPENFOLDER,82,70,62,13 + PUSHBUTTON "File properties",IDC_PROPERTIES,201,70,74,13 + GROUPBOX "File being received",IDC_STATIC,5,95,278,42 + ICON "",IDC_NEWICON,14,110,20,20,SS_NOTIFY + LTEXT "Size:",IDC_STATIC,40,108,27,8 + LTEXT "",IDC_NEWSIZE,67,108,35,8 + RTEXT "Last modified:",IDC_STATIC,103,108,58,8 + LTEXT "",IDC_NEWDATE,166,108,115,8 + LTEXT "Type:",IDC_STATIC,40,121,27,8 + LTEXT "",IDC_NEWTYPE,67,121,214,8 +END + +IDD_FTMGR DIALOGEX 0, 0, 276, 255 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "File Transfers" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,7,262,224 + PUSHBUTTON "Clear completed",IDC_CLEAR,7,234,100,14 + PUSHBUTTON "Close",IDCANCEL,219,234,50,14 +END + +IDD_FTPAGE DIALOGEX 0, 0, 320, 183 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VSCROLL | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT | WS_EX_STATICEDGE +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN +END + +IDD_OPT_FILETRANSFER DIALOGEX 0, 0, 313, 232 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Receiving files",IDC_STATIC,0,0,313,90 + LTEXT "Received files folder:",IDC_STATIC,8,15,82,8 + EDITTEXT IDC_FILEDIR,92,13,190,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_FILEDIRBROWSE,287,14,15,11 + LTEXT "Variables Allowed: %userid%, %nick%, %proto%, %miranda_path%, %userprofile%",IDC_STATIC,8,27,294,11,WS_DISABLED + CONTROL "Auto-accept incoming files from people on my contact list",IDC_AUTOACCEPT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,39,294,10 + CONTROL "Minimize the file transfer window",IDC_AUTOMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,52,285,10 + CONTROL "Close window when transfer completes",IDC_AUTOCLOSE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,65,294,10 + CONTROL "Clear completed transfers on window closing",IDC_AUTOCLEAR, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,76,294,10 + GROUPBOX "Virus scanner",IDC_VIRUSSCANNERGROUP,0,90,313,93 + LTEXT "Scan files:",IDC_STATIC,8,102,43,9,SS_CENTERIMAGE + CONTROL "Never, do not use virus scanning",IDC_NOSCANNER,"Button",BS_AUTORADIOBUTTON,52,102,250,10 + CONTROL "When all files have been downloaded",IDC_SCANAFTERDL, + "Button",BS_AUTORADIOBUTTON,52,114,250,10 + CONTROL "As each file finishes downloading",IDC_SCANDURINGDL, + "Button",BS_AUTORADIOBUTTON,52,126,250,10 + LTEXT "Command line:",IDC_ST_CMDLINE,7,142,62,8 + COMBOBOX IDC_SCANCMDLINE,70,141,213,71,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_SCANCMDLINEBROWSE,287,142,15,11 + LTEXT "%f will be replaced by the file or folder name to be scanned",IDC_ST_CMDLINEHELP,70,155,232,8 + CONTROL "Warn me before opening a file that has not been scanned",IDC_WARNBEFOREOPENING, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,168,294,10 + GROUPBOX "If incoming files already exist",IDC_STATIC,0,187,313,41 + CONTROL "Ask me",IDC_ASK,"Button",BS_AUTORADIOBUTTON,8,200,73,10 + CONTROL "Resume",IDC_RESUME,"Button",BS_AUTORADIOBUTTON,82,200,125,10 + CONTROL "Overwrite",IDC_OVERWRITE,"Button",BS_AUTORADIOBUTTON,8,212,73,10 + CONTROL "Rename (append "" (1)"", etc.)",IDC_RENAME,"Button",BS_AUTORADIOBUTTON,82,212,125,10 + LTEXT "You will always be asked about files from people not on your contact list",IDC_STATIC,212,198,90,24 +END + +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED + IDD_FILESEND, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 251 + VERTGUIDE, 7 + VERTGUIDE, 249 + TOPMARGIN, 5 + BOTTOMMARGIN, 172 + END + + IDD_FILERECV, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 249 + VERTGUIDE, 7 + VERTGUIDE, 249 + TOPMARGIN, 5 + BOTTOMMARGIN, 169 + END + + IDD_FILETRANSFERINFO, DIALOG + BEGIN + VERTGUIDE, 5 + VERTGUIDE, 25 + VERTGUIDE, 36 + VERTGUIDE, 120 + VERTGUIDE, 180 + VERTGUIDE, 215 + VERTGUIDE, 218 + VERTGUIDE, 235 + VERTGUIDE, 251 + BOTTOMMARGIN, 43 + HORZGUIDE, 14 + HORZGUIDE, 28 + HORZGUIDE, 42 + END + + IDD_FILEEXISTS, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 283 + TOPMARGIN, 5 + BOTTOMMARGIN, 176 + END + + IDD_FTPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 303 + TOPMARGIN, 7 + BOTTOMMARGIN, 176 + END + + IDD_OPT_KEYWORDFILTER, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 247 + TOPMARGIN, 4 + BOTTOMMARGIN, 69 + END + + IDD_OPT_FILETRANSFER, DIALOG + BEGIN + VERTGUIDE, 8 + VERTGUIDE, 302 + END + +#endif // APSTUDIO_INVOKED + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "..\..\resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \r\n" + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED diff --git a/src/core/stdfile/stdfile_10.vcxproj b/src/core/stdfile/stdfile_10.vcxproj new file mode 100644 index 0000000000..30433fab97 --- /dev/null +++ b/src/core/stdfile/stdfile_10.vcxproj @@ -0,0 +1,223 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + stdfile + {6022990D-3FD5-46A9-8AB5-E444C51646F3} + + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + $(SolutionDir)$(Configuration)\Core\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)\Core\ + $(SolutionDir)$(Configuration)\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Core\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + $(SolutionDir)$(Configuration)64\Core\ + $(SolutionDir)$(Configuration)64\Obj\$(ProjectName)\ + true + + + + Full + OnlyExplicitInline + Size + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + true + false + true + Fast + Level3 + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda32.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + true + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + Disabled + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + false + true + EnableFastChecks + MultiThreadedDebugDLL + true + Level3 + EditAndContinue + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda32.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + Full + OnlyExplicitInline + Size + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN64;NDEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + true + false + true + Fast + Level3 + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + NDEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda64.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + true + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + Disabled + ..\..\..\include;..\ExternalAPI;%(AdditionalIncludeDirectories) + WIN64;_DEBUG;_WINDOWS;_USRDLL;ADDCONTACTPLUS_EXPORTS;%(PreprocessorDefinitions) + false + true + EnableFastChecks + MultiThreadedDebugDLL + true + Level3 + 4996;%(DisableSpecificWarnings) + Use + commonheaders.h + + + _DEBUG;%(PreprocessorDefinitions) + ..\..\..\include\msapi;..\..\..\include + + + miranda64.lib;ws2_32.lib;comctl32.lib;%(AdditionalDependencies) + true + 0x3ae00000 + false + $(IntDir)$(TargetName).lib + Windows + $(SolutionDir)\lib + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/core/stdfile/stdfile_10.vcxproj.filters b/src/core/stdfile/stdfile_10.vcxproj.filters new file mode 100644 index 0000000000..596bc83397 --- /dev/null +++ b/src/core/stdfile/stdfile_10.vcxproj.filters @@ -0,0 +1,65 @@ + + + + + {5c074c9e-6c66-4233-bbd3-a50170fccf47} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {e30af2c4-42d4-4342-8eb9-2dbca157c6bb} + h;hpp;hxx;hm;inl + + + {9208a050-ffae-47fa-bc98-4ca4f79d37d7} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/src/core/stdfile/version.h b/src/core/stdfile/version.h new file mode 100644 index 0000000000..244194696b --- /dev/null +++ b/src/core/stdfile/version.h @@ -0,0 +1,14 @@ + +#include + +#define __FILEVERSION_STRING MIRANDA_VERSION_FILEVERSION +#define __VERSION_STRING MIRANDA_VERSION_STRING + +#define __PLUGIN_NAME "stdfile" +#define __INTERNAL_NAME "stdfile" +#define __FILENAME "stdfile.dll" +#define __DESCRIPTION "Core module for sending/receiving file transfer requests." +#define __AUTHOR "Myranda team" +#define __AUTHOREMAIL "" +#define __AUTHORWEB "http://nightly.miranda.im" +#define __COPYRIGHT "© 2012 Myranda team" diff --git a/src/core/stdfile/version.rc b/src/core/stdfile/version.rc new file mode 100644 index 0000000000..e637f0cb33 --- /dev/null +++ b/src/core/stdfile/version.rc @@ -0,0 +1,38 @@ +// Microsoft Visual C++ generated resource script. +// +#include "afxres.h" +#include "version.h" + +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#endif //_WIN32 + +VS_VERSION_INFO VERSIONINFO + FILEVERSION __FILEVERSION_STRING + PRODUCTVERSION __FILEVERSION_STRING + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x0L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "FileDescription", __DESCRIPTION + VALUE "InternalName", __PLUGIN_NAME + VALUE "LegalCopyright", __COPYRIGHT + VALUE "OriginalFilename", __FILENAME + VALUE "ProductName", __PLUGIN_NAME + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END diff --git a/src/mir_core/miranda.h b/src/mir_core/miranda.h index af71276ac4..a83d6e2c2f 100644 --- a/src/mir_core/miranda.h +++ b/src/mir_core/miranda.h @@ -2,8 +2,8 @@ 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 +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 @@ -11,7 +11,7 @@ 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, +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. @@ -21,10 +21,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define NEWSTR_ALLOCA(A) (A == NULL)?NULL:strcpy((char*)alloca(strlen(A)+1), A) -#define NEWTSTR_ALLOCA(A) (A == NULL)?NULL:_tcscpy((TCHAR*)alloca((_tcslen(A)+1)* sizeof(TCHAR)), A) - -extern "C" +extern "C" { MIR_CORE_DLL(int) Langpack_MarkPluginLoaded(PLUGININFOEX* pInfo); }; diff --git a/src/miranda32_10.vcxproj b/src/miranda32_10.vcxproj index 7e4bbd5983..4f6985d55d 100644 --- a/src/miranda32_10.vcxproj +++ b/src/miranda32_10.vcxproj @@ -269,7 +269,6 @@ - @@ -458,39 +457,12 @@ ..\..\core\commonheaders.h - - ..\..\core\commonheaders.h - - - ..\..\core\commonheaders.h - ..\..\core\commonheaders.h ..\..\core\commonheaders.h - - ..\..\core\commonheaders.h - - - ..\..\core\commonheaders.h - - - ..\..\core\commonheaders.h - - - ..\..\core\commonheaders.h - - - ..\..\core\commonheaders.h - - - ..\..\core\commonheaders.h - - - ..\..\core\commonheaders.h - ..\..\core\commonheaders.h diff --git a/src/miranda32_10.vcxproj.filters b/src/miranda32_10.vcxproj.filters index e7ef18e256..2cd789a1ad 100644 --- a/src/miranda32_10.vcxproj.filters +++ b/src/miranda32_10.vcxproj.filters @@ -58,15 +58,9 @@ {474a2558-48fd-45d5-b8e8-3a07d780f02a} - - {ec3937ae-458b-400e-a9de-8f1923e993ed} - {ede3d43b-a5cf-462a-90df-4ddd7a091234} - - {3fbbdcec-4a5c-4c83-8e94-724103f35d47} - {9074e889-f17c-4c90-a3cf-1cfb2e513491} @@ -228,9 +222,6 @@ Modules\protocols - - Modules\srfile - Modules\clist @@ -440,39 +431,12 @@ Modules\skin - - Modules\srauth - - - Modules\srauth - Modules\srawaymsg Modules\srawaymsg - - Modules\srfile - - - Modules\srfile - - - Modules\srfile - - - Modules\srfile - - - Modules\srfile - - - Modules\srfile - - - Modules\srfile - Modules\updater diff --git a/src/modules/database/database.cpp b/src/modules/database/database.cpp index d9299c6c5d..2a8acd4a37 100644 --- a/src/modules/database/database.cpp +++ b/src/modules/database/database.cpp @@ -22,7 +22,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "..\..\core\commonheaders.h" #include "profilemanager.h" -#include "../srfile/file.h" // contains the location of mirandaboot.ini extern TCHAR mirandabootini[MAX_PATH]; diff --git a/src/modules/database/dbini.cpp b/src/modules/database/dbini.cpp index d8da15eac6..c065949ee4 100644 --- a/src/modules/database/dbini.cpp +++ b/src/modules/database/dbini.cpp @@ -22,7 +22,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "..\..\core\commonheaders.h" -#include "../srfile/file.h" static bool bModuleInitialized = false; static HANDLE hIniChangeNotification; diff --git a/src/modules/netlib/netliblog.cpp b/src/modules/netlib/netliblog.cpp index ff352b5b55..bdfd57295f 100644 --- a/src/modules/netlib/netliblog.cpp +++ b/src/modules/netlib/netliblog.cpp @@ -23,7 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "..\..\core\commonheaders.h" #include "netlib.h" -#include "../srfile/file.h" #define MS_NETLIB_LOGWIN "Netlib/Log/Win" diff --git a/src/modules/protocols/protocols.cpp b/src/modules/protocols/protocols.cpp index 8a12239c48..b490b0188c 100644 --- a/src/modules/protocols/protocols.cpp +++ b/src/modules/protocols/protocols.cpp @@ -144,92 +144,6 @@ static INT_PTR Proto_RegisterModule(WPARAM, LPARAM lParam) ///////////////////////////////////////////////////////////////////////////////////////// // Basic core services -static INT_PTR Proto_RecvFile(WPARAM, LPARAM lParam) -{ - CCSDATA* ccs = (CCSDATA*)lParam; - PROTORECVEVENT* pre = (PROTORECVEVENT*)ccs->lParam; - char* szFile = pre->szMessage + sizeof(DWORD); - char* szDescr = szFile + strlen(szFile) + 1; - - // Suppress the standard event filter - if (pre->lParam != NULL) - *(DWORD*)pre->szMessage = 0; - - DBEVENTINFO dbei = { 0 }; - dbei.cbSize = sizeof(dbei); - dbei.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)ccs->hContact, 0); - dbei.timestamp = pre->timestamp; - dbei.flags = (pre->flags & PREF_CREATEREAD) ? DBEF_READ : 0; - dbei.flags |= (pre->flags & PREF_UTF) ? DBEF_UTF : 0; - dbei.eventType = EVENTTYPE_FILE; - dbei.cbBlob = (DWORD)(sizeof(DWORD) + strlen(szFile) + strlen(szDescr) + 2); - dbei.pBlob = (PBYTE)pre->szMessage; - HANDLE hdbe = (HANDLE)CallService(MS_DB_EVENT_ADD, (WPARAM)ccs->hContact, (LPARAM)&dbei); - - if (pre->lParam != NULL) - PushFileEvent(ccs->hContact, hdbe, pre->lParam); - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -static void sttRecvCreateBlob(DBEVENTINFO& dbei, int fileCount, char** pszFiles, char* szDescr) -{ - dbei.cbBlob = sizeof(DWORD); - { - for (int i=0; i < fileCount; i++) - dbei.cbBlob += lstrlenA(pszFiles[i]) + 1; - } - - dbei.cbBlob += lstrlenA(szDescr) + 1; - - if ((dbei.pBlob = (BYTE*)mir_alloc(dbei.cbBlob)) == 0) - return; - - *(DWORD*)dbei.pBlob = 0; - BYTE* p = dbei.pBlob + sizeof(DWORD); - for (int i=0; i < fileCount; i++) { - strcpy((char*)p, pszFiles[i]); - p += lstrlenA(pszFiles[i]) + 1; - } - strcpy((char*)p, (szDescr == NULL) ? "" : szDescr); -} - -static INT_PTR Proto_RecvFileT(WPARAM, LPARAM lParam) -{ - CCSDATA* ccs = (CCSDATA*)lParam; - PROTORECVFILET* pre = (PROTORECVFILET*)ccs->lParam; - if (pre->fileCount == 0) - return 0; - - DBEVENTINFO dbei = { 0 }; - dbei.cbSize = sizeof(dbei); - dbei.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)ccs->hContact, 0); - dbei.timestamp = pre->timestamp; - dbei.flags = (pre->flags & PREF_CREATEREAD) ? DBEF_READ : 0; - dbei.eventType = EVENTTYPE_FILE; - - char** pszFiles = (char**)alloca(pre->fileCount * sizeof(char*)); - { - for (int i=0; i < pre->fileCount; i++) - pszFiles[i] = Utf8EncodeT(pre->ptszFiles[i]); - } - char* szDescr = Utf8EncodeT(pre->tszDescription); - dbei.flags |= DBEF_UTF; - sttRecvCreateBlob(dbei, pre->fileCount, pszFiles, szDescr); - { - for (int i=0; i < pre->fileCount; i++) - mir_free(pszFiles[i]); - } - mir_free(szDescr); - - HANDLE hdbe = (HANDLE)CallService(MS_DB_EVENT_ADD, (WPARAM)ccs->hContact, (LPARAM)&dbei); - - PushFileEvent(ccs->hContact, hdbe, pre->lParam); - mir_free(dbei.pBlob); - return 0; -} - static INT_PTR Proto_RecvMessage(WPARAM, LPARAM lParam) { CCSDATA *ccs = (CCSDATA*)lParam; @@ -766,7 +680,6 @@ int LoadProtocolsModule(void) InsertServiceListItem(109, PS_SEARCHBYNAMEW); InsertServiceListItem(110, PS_SEARCHBYEMAILW); - hAckEvent = CreateHookableEvent(ME_PROTO_ACK); hTypeEvent = CreateHookableEvent(ME_PROTO_CONTACTISTYPING); hAccListChanged = CreateHookableEvent(ME_PROTO_ACCLISTCHANGED); @@ -778,8 +691,6 @@ int LoadProtocolsModule(void) CreateServiceFunction(MS_PROTO_SELFISTYPING, Proto_SelfIsTyping); CreateServiceFunction(MS_PROTO_CONTACTISTYPING, Proto_ContactIsTyping); - CreateServiceFunction(MS_PROTO_RECVFILE, Proto_RecvFile); - CreateServiceFunction(MS_PROTO_RECVFILET, Proto_RecvFileT); CreateServiceFunction(MS_PROTO_RECVMSG, Proto_RecvMessage); CreateServiceFunction("Proto/EnumProtocols", Proto_EnumAccounts); diff --git a/src/modules/protocols/protoint.cpp b/src/modules/protocols/protoint.cpp index 8470ef308a..041132c1f5 100644 --- a/src/modules/protocols/protoint.cpp +++ b/src/modules/protocols/protoint.cpp @@ -24,7 +24,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "..\..\core\commonheaders.h" char** __fastcall Proto_FilesMatrixA(TCHAR **files); -void FreeFilesMatrix(TCHAR ***files); + +void FreeFilesMatrix(TCHAR ***files) +{ + if (*files == NULL) + return; + + // Free each filename in the pointer array + TCHAR **pFile = *files; + while (*pFile != NULL) + { + mir_free(*pFile); + *pFile = NULL; + pFile++; + } + + // Free the array itself + mir_free(*files); + *files = NULL; +} INT_PTR __fastcall MyCallProtoService(const char *szModule, const char *szService, WPARAM wParam, LPARAM lParam) { diff --git a/src/modules/srauth/auth.cpp b/src/modules/srauth/auth.cpp deleted file mode 100644 index 1baadfaced..0000000000 --- a/src/modules/srauth/auth.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - -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. -*/ -#include "..\..\core\commonheaders.h" - -#define MS_AUTH_SHOWREQUEST "Auth/ShowRequest" -#define MS_AUTH_SHOWADDED "Auth/ShowAdded" - -INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); - -INT_PTR ShowReqWindow(WPARAM, LPARAM lParam) -{ - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_AUTHREQ), NULL, DlgProcAuthReq, - (LPARAM)((CLISTEVENT *)lParam)->hDbEvent); - return 0; -} - -INT_PTR ShowAddedWindow(WPARAM, LPARAM lParam) -{ - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ADDED), NULL, DlgProcAdded, - (LPARAM)((CLISTEVENT *)lParam)->hDbEvent); - return 0; -} - -static int AuthEventAdded(WPARAM, LPARAM lParam) -{ - TCHAR szUid[128] = _T(""); - TCHAR szTooltip[256]; - const HANDLE hDbEvent = (HANDLE)lParam; - - DBEVENTINFO dbei = {0}; - dbei.cbSize = sizeof(dbei); - CallService(MS_DB_EVENT_GET, (WPARAM)lParam, (LPARAM)&dbei); - if (dbei.flags & (DBEF_SENT | DBEF_READ) || - (dbei.eventType != EVENTTYPE_AUTHREQUEST && dbei.eventType != EVENTTYPE_ADDED)) - return 0; - - dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, lParam, 0); - dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); - CallService(MS_DB_EVENT_GET, lParam, (LPARAM)&dbei); - - HANDLE hContact = *(PHANDLE)(dbei.pBlob + sizeof(DWORD)); - - CLISTEVENT cli = {0}; - cli.cbSize = sizeof(cli); - cli.hContact = hContact; - cli.ptszTooltip = szTooltip; - cli.flags = CLEF_TCHAR; - cli.lParam = lParam; - cli.hDbEvent = hDbEvent; - - CONTACTINFO ci = {0}; - ci.cbSize = sizeof(ci); - ci.hContact = hContact; - ci.szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); - ci.dwFlag = CNF_UNIQUEID | CNF_TCHAR; - if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) - { - switch (ci.type) - { - case CNFT_ASCIIZ: - mir_sntprintf(szUid, SIZEOF(szUid), _T("%s"), ci.pszVal); - mir_free(ci.pszVal); - break; - - case CNFT_DWORD: - mir_sntprintf(szUid, SIZEOF(szUid), _T("%u"), ci.dVal); - break; - } - } - - if (dbei.eventType == EVENTTYPE_AUTHREQUEST) - { - SkinPlaySound("AuthRequest"); - if (szUid[0]) - mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%s requests authorization"), szUid); - else - mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%u requests authorization"), *((PDWORD)dbei.pBlob)); - - cli.hIcon = LoadSkinIcon(SKINICON_OTHER_MIRANDA); - cli.pszService = MS_AUTH_SHOWREQUEST; - CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cli); - } - else if (dbei.eventType == EVENTTYPE_ADDED) - { - SkinPlaySound("AddedEvent"); - if (szUid[0]) - mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%s added you to their contact list"), szUid); - else - mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("%u added you to their contact list"), *((PDWORD)dbei.pBlob)); - - cli.hIcon = LoadSkinIcon(SKINICON_OTHER_MIRANDA); - cli.pszService = MS_AUTH_SHOWADDED; - CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cli); - } - return 0; -} - -int LoadSendRecvAuthModule(void) -{ - CreateServiceFunction(MS_AUTH_SHOWREQUEST, ShowReqWindow); - CreateServiceFunction(MS_AUTH_SHOWADDED, ShowAddedWindow); - HookEvent(ME_DB_EVENT_ADDED, AuthEventAdded); - - SkinAddNewSoundEx("AuthRequest", LPGEN("Alerts"), LPGEN("Authorization request")); - SkinAddNewSoundEx("AddedEvent", LPGEN("Alerts"), LPGEN("Added event")); - - return 0; -} diff --git a/src/modules/srauth/authdialogs.cpp b/src/modules/srauth/authdialogs.cpp deleted file mode 100644 index ae75865ab4..0000000000 --- a/src/modules/srauth/authdialogs.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/* - -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. -*/ - -#include "..\..\core\commonheaders.h" - -INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - HANDLE hDbEvent = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - - switch (msg) - { - case WM_INITDIALOG: - { - TranslateDialogDefault(hwndDlg); - Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User's Details")); - Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add Contact Permanently to List")); - - hDbEvent = (HANDLE)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); - - //blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ) - DBEVENTINFO dbei = {0}; - dbei.cbSize = sizeof(dbei); - dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hDbEvent, 0); - dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); - CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); - - DWORD uin = *(PDWORD)dbei.pBlob; - HANDLE hContact = *(HANDLE*)(dbei.pBlob + sizeof(DWORD)); - char* nick = (char *)(dbei.pBlob + sizeof(DWORD) + sizeof(HANDLE)); - char* first = nick + strlen(nick) + 1; - char* last = first + strlen(first) + 1; - char* email = last + strlen(last) + 1; - - SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0)); - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0)); - - PROTOACCOUNT* acc = Proto_GetAccount(dbei.szModule); - - TCHAR* lastT = dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last); - TCHAR* firstT = dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first); - TCHAR* nickT = dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick); - TCHAR* emailT = dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email); - - TCHAR name[128] = _T(""); - int off = 0; - if (firstT[0] && lastT[0]) - off = mir_sntprintf(name, SIZEOF(name), _T("%s %s"), firstT, lastT); - else if (firstT[0]) - off = mir_sntprintf(name, SIZEOF(name), _T("%s"), firstT); - else if (lastT[0]) - off = mir_sntprintf(name, SIZEOF(name), _T("%s"), lastT); - if (nickT[0]) - { - if (off) - mir_sntprintf(name + off, SIZEOF(name) - off, _T(" (%s)"), nickT); - else - mir_sntprintf(name, SIZEOF(name), _T("%s"), nickT); - } - if ( !name[0]) - _tcscpy(name, TranslateT("")); - - TCHAR hdr[256]; - if (uin && emailT[0]) - mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u (%s) on %s"), name, uin, emailT, acc->tszAccountName); - else if (uin) - mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%u on %s"), name, uin, acc->tszAccountName); - else - mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s added you to the contact list\n%s on %s"), name, emailT[0] ? emailT : TranslateT("(Unknown)"), acc->tszAccountName); - - SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr); - - mir_free(lastT); - mir_free(firstT); - mir_free(nickT); - mir_free(emailT); - - SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact); - - if (hContact == INVALID_HANDLE_VALUE || !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) - ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); - } - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDC_ADD: - { - ADDCONTACTSTRUCT acs = {0}; - acs.handle = hDbEvent; - acs.handleType = HANDLE_EVENT; - acs.szProto = ""; - CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); - - HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); - if ((hContact == INVALID_HANDLE_VALUE) || !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) - ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); - break; - } - case IDC_DETAILS: - { - HANDLE hContact = (HANDLE)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA); - CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0); - break; - } - - case IDOK: - { - ADDCONTACTSTRUCT acs = {0}; - acs.handle = hDbEvent; - acs.handleType = HANDLE_EVENT; - acs.szProto = ""; - CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); - } - //fall through - case IDCANCEL: - DestroyWindow(hwndDlg); - break; - } - break; - - case WM_DESTROY: - Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); - Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); - break; - } - return FALSE; -} - -INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - HANDLE hDbEvent = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - - switch (msg) - { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User Details")); - Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add Contact Permanently to List")); - - { - DBEVENTINFO dbei = {0}; - DWORD uin; - char *nick, *first, *last, *email, *reason; - HANDLE hContact; - - hDbEvent = (HANDLE)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); - - //blob is: uin(DWORD), hcontact(HANDLE), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ), reason(ASCIIZ) - dbei.cbSize = sizeof(dbei); - dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hDbEvent, 0); - dbei.pBlob = (PBYTE)alloca(dbei.cbBlob); - CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); - - uin = *(PDWORD)dbei.pBlob; - hContact = *(HANDLE*)(dbei.pBlob + sizeof(DWORD)); - nick = (char *)(dbei.pBlob + sizeof(DWORD) + sizeof(HANDLE)); - first = nick + strlen(nick) + 1; - last = first + strlen(first) + 1; - email = last + strlen(last) + 1; - reason = email + strlen(email) + 1; - - SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0)); - SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0)); - - PROTOACCOUNT* acc = Proto_GetAccount(dbei.szModule); - - TCHAR* lastT = dbei.flags & DBEF_UTF ? Utf8DecodeT(last) : mir_a2t(last); - TCHAR* firstT = dbei.flags & DBEF_UTF ? Utf8DecodeT(first) : mir_a2t(first); - TCHAR* nickT = dbei.flags & DBEF_UTF ? Utf8DecodeT(nick) : mir_a2t(nick); - TCHAR* emailT = dbei.flags & DBEF_UTF ? Utf8DecodeT(email) : mir_a2t(email); - TCHAR* reasonT = dbei.flags & DBEF_UTF ? Utf8DecodeT(reason) : mir_a2t(reason); - - TCHAR name[128] = _T(""); - int off = 0; - if (firstT[0] && lastT[0]) - off = mir_sntprintf(name, SIZEOF(name), _T("%s %s"), firstT, lastT); - else if (firstT[0]) - off = mir_sntprintf(name, SIZEOF(name), _T("%s"), firstT); - else if (lastT[0]) - off = mir_sntprintf(name, SIZEOF(name), _T("%s"), lastT); - if (nickT[0]) - { - if (off) - mir_sntprintf(name + off, SIZEOF(name) - off, _T(" (%s)"), nickT); - else - mir_sntprintf(name, SIZEOF(name), _T("%s"), nickT); - } - if ( !name[0]) - _tcscpy(name, TranslateT("")); - - TCHAR hdr[256]; - if (uin && emailT[0]) - mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%u (%s) on %s"), name, uin, emailT, acc->tszAccountName); - else if (uin) - mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%u on %s"), name, uin, acc->tszAccountName); - else - mir_sntprintf(hdr, SIZEOF(hdr), TranslateT("%s requested authorization\n%s on %s"), name, emailT[0] ? emailT : TranslateT("(Unknown)"), acc->tszAccountName); - - SetDlgItemText(hwndDlg, IDC_HEADERBAR, hdr); - SetDlgItemText(hwndDlg, IDC_REASON, reasonT); - - mir_free(lastT); - mir_free(firstT); - mir_free(nickT); - mir_free(emailT); - mir_free(reasonT); - - if (hContact == INVALID_HANDLE_VALUE || !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) - ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE); - - SendDlgItemMessage(hwndDlg, IDC_DENYREASON, EM_LIMITTEXT, 255, 0); - if (CallProtoServiceInt(NULL,dbei.szModule, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_NOAUTHDENYREASON) - { - EnableWindow(GetDlgItem(hwndDlg, IDC_DENYREASON), FALSE); - SetDlgItemText(hwndDlg, IDC_DENYREASON, TranslateT("Feature is not supported by protocol")); - } - if ( !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) - { - EnableWindow(GetDlgItem(hwndDlg, IDC_ADDCHECK), FALSE); - CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_UNCHECKED); - } - else - CheckDlgButton(hwndDlg, IDC_ADDCHECK, BST_CHECKED); - - SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_DETAILS), GWLP_USERDATA, (LONG_PTR)hContact); - } - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDC_DETAILS: - CallService(MS_USERINFO_SHOWDIALOG, GetWindowLongPtr((HWND)lParam, GWLP_USERDATA), 0); - break; - - case IDC_DECIDELATER: - DestroyWindow(hwndDlg); - break; - - case IDOK: - { - DBEVENTINFO dbei = {0}; - dbei.cbSize = sizeof(dbei); - CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); - CallProtoServiceInt(NULL,dbei.szModule, PS_AUTHALLOW, (WPARAM)hDbEvent, 0); - - if (IsDlgButtonChecked(hwndDlg, IDC_ADDCHECK)) - { - ADDCONTACTSTRUCT acs = {0}; - acs.handle = hDbEvent; - acs.handleType = HANDLE_EVENT; - acs.szProto = ""; - CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); - } - } - DestroyWindow(hwndDlg); - break; - - case IDCANCEL: - { - DBEVENTINFO dbei = {0}; - dbei.cbSize = sizeof(dbei); - CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); - - if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_DENYREASON))) - { - TCHAR szReason[256]; - GetDlgItemText(hwndDlg, IDC_DENYREASON, szReason, SIZEOF(szReason)); - CallProtoServiceInt(NULL,dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, (LPARAM)szReason); - } - else - CallProtoServiceInt(NULL,dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, 0); - } - DestroyWindow(hwndDlg); - break;; - } - break; - - case WM_DESTROY: - Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); - Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0)); - DestroyIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0)); - break; - } - return FALSE; -} diff --git a/src/modules/srfile/file.cpp b/src/modules/srfile/file.cpp deleted file mode 100644 index 4e1db5c651..0000000000 --- a/src/modules/srfile/file.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/* - -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. -*/ -#include "..\..\core\commonheaders.h" -#include "file.h" - -TCHAR* PFTS_StringToTchar(int flags, const PROTOCHAR* s); -int PFTS_CompareWithTchar(PROTOFILETRANSFERSTATUS* ft, const PROTOCHAR* s, TCHAR* r); - -static HANDLE hSRFileMenuItem; - -static INT_PTR SendFileCommand(WPARAM wParam, LPARAM) -{ - struct FileSendData fsd; - fsd.hContact = (HANDLE)wParam; - fsd.ppFiles = NULL; - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd); - return 0; -} - -static INT_PTR SendSpecificFiles(WPARAM wParam, LPARAM lParam) -{ - FileSendData fsd; - fsd.hContact = (HANDLE)wParam; - - char** ppFiles = (char**)lParam; - int count = 0; - while (ppFiles[count] != NULL) - count++; - - fsd.ppFiles = (const TCHAR**)alloca((count+1) * sizeof(void*)); - for (int i=0; i < count; i++) - fsd.ppFiles[i] = (const TCHAR*)mir_a2t(ppFiles[i]); - fsd.ppFiles[ count ] = NULL; - - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd); - for (int j = 0; j < count; j++) - mir_free((void*)fsd.ppFiles[j]); - return 0; -} - -static INT_PTR SendSpecificFilesT(WPARAM wParam, LPARAM lParam) -{ - FileSendData fsd; - fsd.hContact = (HANDLE)wParam; - fsd.ppFiles = (const TCHAR**)lParam; - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd); - return 0; -} - -static INT_PTR GetReceivedFilesFolder(WPARAM wParam, LPARAM lParam) -{ - TCHAR buf[MAX_PATH]; - GetContactReceivedFilesDir((HANDLE)wParam, buf, MAX_PATH, TRUE); - char* dir = mir_t2a(buf); - lstrcpynA((char*)lParam, dir, MAX_PATH); - mir_free(dir); - return 0; -} - -static INT_PTR RecvFileCommand(WPARAM, LPARAM lParam) -{ - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, lParam); - return 0; -} - -void PushFileEvent(HANDLE hContact, HANDLE hdbe, LPARAM lParam) -{ - CLISTEVENT cle = {0}; - cle.cbSize = sizeof(cle); - cle.hContact = hContact; - cle.hDbEvent = hdbe; - cle.lParam = lParam; - if (DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0) && !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) { - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, (LPARAM)&cle); - } - else { - SkinPlaySound("RecvFile"); - - TCHAR szTooltip[256]; - mir_sntprintf(szTooltip, SIZEOF(szTooltip), TranslateT("File from %s"), cli.pfnGetContactDisplayName(hContact, 0)); - cle.ptszTooltip = szTooltip; - - cle.flags |= CLEF_TCHAR; - cle.hIcon = LoadSkinIcon(SKINICON_EVENT_FILE); - cle.pszService = "SRFile/RecvFile"; - CallService(MS_CLIST_ADDEVENT, 0, (LPARAM)&cle); -} } - -static int FileEventAdded(WPARAM wParam, LPARAM lParam) -{ - DWORD dwSignature; - - DBEVENTINFO dbei = {0}; - dbei.cbSize = sizeof(dbei); - dbei.cbBlob = sizeof(DWORD); - dbei.pBlob = (PBYTE)&dwSignature; - CallService(MS_DB_EVENT_GET, lParam, (LPARAM)&dbei); - if (dbei.flags&(DBEF_SENT|DBEF_READ) || dbei.eventType != EVENTTYPE_FILE || dwSignature == 0) - return 0; - - PushFileEvent((HANDLE)wParam, (HANDLE)lParam, 0); - return 0; -} - -int SRFile_GetRegValue(HKEY hKeyBase, const TCHAR *szSubKey, const TCHAR *szValue, TCHAR *szOutput, int cbOutput) -{ - HKEY hKey; - DWORD cbOut = cbOutput; - - if (RegOpenKeyEx(hKeyBase, szSubKey, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) - return 0; - - if (RegQueryValueEx(hKey, szValue, NULL, NULL, (PBYTE)szOutput, &cbOut) != ERROR_SUCCESS) { - RegCloseKey(hKey); - return 0; - } - - RegCloseKey(hKey); - return 1; -} - -void GetSensiblyFormattedSize(__int64 size, TCHAR *szOut, int cchOut, int unitsOverride, int appendUnits, int *unitsUsed) -{ - if ( !unitsOverride) { - if (size<1000) unitsOverride = UNITS_BYTES; - else if (size<100*1024) unitsOverride = UNITS_KBPOINT1; - else if (size<1024*1024) unitsOverride = UNITS_KBPOINT0; - else if (size<1024*1024*1024) unitsOverride = UNITS_MBPOINT2; - else unitsOverride = UNITS_GBPOINT3; - } - if (unitsUsed) *unitsUsed = unitsOverride; - switch(unitsOverride) { - case UNITS_BYTES: mir_sntprintf(szOut, cchOut, _T("%u%s%s"), (int)size, appendUnits?_T(" "):_T(""), appendUnits?TranslateT("bytes"):_T("")); break; - case UNITS_KBPOINT1: mir_sntprintf(szOut, cchOut, _T("%.1lf%s"), size/1024.0, appendUnits?_T(" KB"):_T("")); break; - case UNITS_KBPOINT0: mir_sntprintf(szOut, cchOut, _T("%u%s"), (int)(size/1024), appendUnits?_T(" KB"):_T("")); break; - case UNITS_GBPOINT3: mir_sntprintf(szOut, cchOut, _T("%.3f%s"), (size >> 20)/1024.0, appendUnits?_T(" GB"):_T("")); break; - default: mir_sntprintf(szOut, cchOut, _T("%.2lf%s"), size/1048576.0, appendUnits?_T(" MB"):_T("")); break; - } -} - -// Tripple redirection sucks but is needed to nullify the array pointer -void FreeFilesMatrix(TCHAR ***files) -{ - if (*files == NULL) - return; - - // Free each filename in the pointer array - TCHAR **pFile = *files; - while (*pFile != NULL) - { - mir_free(*pFile); - *pFile = NULL; - pFile++; - } - - // Free the array itself - mir_free(*files); - *files = NULL; -} - -void FreeProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *fts) -{ - mir_free(fts->tszCurrentFile); - if (fts->ptszFiles) { - for (int i=0;itotalFiles;i++) mir_free(fts->ptszFiles[i]); - mir_free(fts->ptszFiles); - } - mir_free(fts->tszWorkingDir); -} - -void CopyProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src) -{ - *dest = *src; - if (src->tszCurrentFile) dest->tszCurrentFile = PFTS_StringToTchar(src->flags, src->tszCurrentFile); - if (src->ptszFiles) { - dest->ptszFiles = (TCHAR**)mir_alloc(sizeof(TCHAR*)*src->totalFiles); - for (int i=0; i < src->totalFiles; i++) - dest->ptszFiles[i] = PFTS_StringToTchar(src->flags, src->ptszFiles[i]); - } - if (src->tszWorkingDir) dest->tszWorkingDir = PFTS_StringToTchar(src->flags, src->tszWorkingDir); - dest->flags &= ~PFTS_UTF; - dest->flags |= PFTS_TCHAR; -} - -void UpdateProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src) -{ - dest->hContact = src->hContact; - dest->flags = src->flags; - if (dest->totalFiles != src->totalFiles) { - for (int i=0;itotalFiles;i++) mir_free(dest->ptszFiles[i]); - mir_free(dest->ptszFiles); - dest->ptszFiles = NULL; - dest->totalFiles = src->totalFiles; - } - if (src->ptszFiles) { - if ( !dest->ptszFiles) - dest->ptszFiles = (TCHAR**)mir_calloc(sizeof(TCHAR*)*src->totalFiles); - for (int i=0; i < src->totalFiles; i++) - if ( !dest->ptszFiles[i] || !src->ptszFiles[i] || PFTS_CompareWithTchar(src, src->ptszFiles[i], dest->ptszFiles[i])) { - mir_free(dest->ptszFiles[i]); - if (src->ptszFiles[i]) - dest->ptszFiles[i] = PFTS_StringToTchar(src->flags, src->ptszFiles[i]); - else - dest->ptszFiles[i] = NULL; - } - } - else if (dest->ptszFiles) { - for (int i=0; i < dest->totalFiles; i++) - mir_free(dest->ptszFiles[i]); - mir_free(dest->ptszFiles); - dest->ptszFiles = NULL; - } - - dest->currentFileNumber = src->currentFileNumber; - dest->totalBytes = src->totalBytes; - dest->totalProgress = src->totalProgress; - if (src->tszWorkingDir && ( !dest->tszWorkingDir || PFTS_CompareWithTchar(src, src->tszWorkingDir, dest->tszWorkingDir))) { - mir_free(dest->tszWorkingDir); - if (src->tszWorkingDir) - dest->tszWorkingDir = PFTS_StringToTchar(src->flags, src->tszWorkingDir); - else - dest->tszWorkingDir = NULL; - } - - if ( !dest->tszCurrentFile || !src->tszCurrentFile || PFTS_CompareWithTchar(src, src->tszCurrentFile, dest->tszCurrentFile)) { - mir_free(dest->tszCurrentFile); - if (src->tszCurrentFile) - dest->tszCurrentFile = PFTS_StringToTchar(src->flags, src->tszCurrentFile); - else - dest->tszCurrentFile = NULL; - } - dest->currentFileSize = src->currentFileSize; - dest->currentFileProgress = src->currentFileProgress; - dest->currentFileTime = src->currentFileTime; - dest->flags &= ~PFTS_UTF; - dest->flags |= PFTS_TCHAR; -} - -static void RemoveUnreadFileEvents(void) -{ - DBEVENTINFO dbei = {0}; - HANDLE hDbEvent, hContact; - - dbei.cbSize = sizeof(dbei); - hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); - while (hContact) { - hDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDFIRSTUNREAD, (WPARAM)hContact, 0); - while (hDbEvent) { - dbei.cbBlob = 0; - CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei); - if ( !(dbei.flags&(DBEF_SENT|DBEF_READ)) && dbei.eventType == EVENTTYPE_FILE) - CallService(MS_DB_EVENT_MARKREAD, (WPARAM)hContact, (LPARAM)hDbEvent); - hDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDNEXT, (WPARAM)hDbEvent, 0); - } - hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); - } -} - -static int SRFilePreBuildMenu(WPARAM wParam, LPARAM) -{ - CLISTMENUITEM mi = { 0 }; - mi.cbSize = sizeof(mi); - mi.flags = CMIM_FLAGS | CMIF_HIDDEN; - - char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, wParam, 0); - if (szProto != NULL) { - if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_FILESEND) { - if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_OFFLINEFILES) - mi.flags = CMIM_FLAGS; - else if (DBGetContactSettingWord((HANDLE)wParam, szProto, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) - mi.flags = CMIM_FLAGS; - } } - - CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hSRFileMenuItem, (LPARAM)&mi); - return 0; -} - -static int SRFileModulesLoaded(WPARAM, LPARAM) -{ - CLISTMENUITEM mi = { 0 }; - mi.cbSize = sizeof(mi); - mi.position = -2000020000; - mi.icolibItem = GetSkinIconHandle(SKINICON_EVENT_FILE); - mi.pszName = LPGEN("&File"); - mi.pszService = MS_FILE_SENDFILE; - mi.flags = CMIF_ICONFROMICOLIB; - hSRFileMenuItem = Menu_AddContactMenuItem(&mi); - - RemoveUnreadFileEvents(); - return 0; -} - -INT_PTR FtMgrShowCommand(WPARAM, LPARAM) -{ - FtMgr_Show(true, true); - return 0; -} - -INT_PTR openContRecDir(WPARAM wparam, LPARAM) -{ - TCHAR szContRecDir[MAX_PATH]; - HANDLE hContact = (HANDLE)wparam; - GetContactReceivedFilesDir(hContact, szContRecDir, SIZEOF(szContRecDir), TRUE); - ShellExecute(0, _T("open"), szContRecDir, 0, 0, SW_SHOW); - return 0; -} - -INT_PTR openRecDir(WPARAM, LPARAM) -{ - TCHAR szContRecDir[MAX_PATH]; - GetReceivedFilesDir(szContRecDir, SIZEOF(szContRecDir)); - ShellExecute(0, _T("open"), szContRecDir, 0, 0, SW_SHOW); - return 0; -} - -int LoadSendRecvFileModule(void) -{ - CreateServiceFunction("FtMgr/Show", FtMgrShowCommand); - - CLISTMENUITEM mi = { 0 }; - mi.cbSize = sizeof(mi); - mi.flags = CMIF_ICONFROMICOLIB; - mi.icolibItem = GetSkinIconHandle(SKINICON_EVENT_FILE); - mi.position = 1900000000; - mi.pszName = LPGEN("File &Transfers..."); - mi.pszService = "FtMgr/Show"; //MS_PROTO_SHOWFTMGR; - Menu_AddMainMenuItem(&mi); - - HookEvent(ME_SYSTEM_MODULESLOADED, SRFileModulesLoaded); - HookEvent(ME_DB_EVENT_ADDED, FileEventAdded); - HookEvent(ME_OPT_INITIALISE, FileOptInitialise); - HookEvent(ME_CLIST_PREBUILDCONTACTMENU, SRFilePreBuildMenu); - - CreateServiceFunction(MS_FILE_SENDFILE, SendFileCommand); - CreateServiceFunction(MS_FILE_SENDSPECIFICFILES, SendSpecificFiles); - CreateServiceFunction(MS_FILE_SENDSPECIFICFILEST, SendSpecificFilesT); - CreateServiceFunction(MS_FILE_GETRECEIVEDFILESFOLDER, GetReceivedFilesFolder); - CreateServiceFunction("SRFile/RecvFile", RecvFileCommand); - - CreateServiceFunction("SRFile/OpenContRecDir", openContRecDir); - CreateServiceFunction("SRFile/OpenRecDir", openRecDir); - - SkinAddNewSoundEx("RecvFile", LPGEN("File"), LPGEN("Incoming")); - SkinAddNewSoundEx("FileDone", LPGEN("File"), LPGEN("Complete")); - SkinAddNewSoundEx("FileFailed", LPGEN("File"), LPGEN("Error")); - SkinAddNewSoundEx("FileDenied", LPGEN("File"), LPGEN("Denied")); - return 0; -} diff --git a/src/modules/srfile/file.h b/src/modules/srfile/file.h deleted file mode 100644 index d814e99ab4..0000000000 --- a/src/modules/srfile/file.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - -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. -*/ - -#define VIRUSSCAN_DISABLE 0 -#define VIRUSSCAN_AFTERDL 1 -#define VIRUSSCAN_DURINGDL 2 - -#define FILERESUME_ASK 0 -//1, 2, 3, 4: resume, overwrite, rename, skip: from proto library -#define FILERESUMEF_ALL 0x80 -#define FILERESUME_RESUMEALL (FILERESUME_RESUME|FILERESUMEF_ALL) -#define FILERESUME_OVERWRITEALL (FILERESUME_OVERWRITE|FILERESUMEF_ALL) -#define FILERESUME_RENAMEALL (FILERESUME_RENAME|FILERESUMEF_ALL) -#define FILERESUME_CANCEL 0xFFFFFFFF - -#define M_FILEEXISTSDLGREPLY (WM_USER+200) -#define M_PRESHUTDOWN (WM_USER+201) - -struct FileSendData { - HANDLE hContact; - const TCHAR **ppFiles; -}; - -#define BYTESRECVEDHISTORYCOUNT 10 //the number of bytes recved is sampled once a second and the last 10 are used to get the transfer speed -struct FileDlgData { - HWND hwndTransfer; - HANDLE fs; - HANDLE hContact; - HANDLE hDbEvent; - HANDLE hNotifyEvent; - TCHAR **files; - int send; - int closeIfFileChooseCancelled; - int resumeBehaviour; - int bytesRecvedHistory[BYTESRECVEDHISTORYCOUNT]; - int bytesRecvedHistorySize; - int waitingForAcceptance; - PROTOFILETRANSFERSTATUS transferStatus; - int *fileVirusScanned; - HANDLE hPreshutdownEvent; - DWORD dwTicks; - - TCHAR szSavePath[MAX_PATH]; - TCHAR szMsg[450], szFilenames[1024]; - HICON hIcon, hIconFolder; -}; - -//file.c -#define UNITS_BYTES 1 // 0 <= size<1000: "%d bytes" -#define UNITS_KBPOINT1 2 // 1000 <= size<100*1024: "%.1f KB" -#define UNITS_KBPOINT0 3 // 100*1024 <= size<1024*1024: "%d KB" -#define UNITS_MBPOINT2 4 // 1024*1024 <= size: "%.2f MB" -#define UNITS_GBPOINT3 5 // 1024*1024*1024 <= size: "%.3f GB" - -void GetSensiblyFormattedSize(__int64 size, TCHAR *szOut, int cchOut, int unitsOverride, int appendUnits, int *unitsUsed); -void FreeFilesMatrix(TCHAR ***files); //loving that triple indirection -void FreeProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *fts); -void CopyProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src); -void UpdateProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANSFERSTATUS *src); -int SRFile_GetRegValue(HKEY hKeyBase, const TCHAR *szSubKey, const TCHAR *szValue, TCHAR *szOutput, int cbOutput); -//filesenddlg.c -INT_PTR CALLBACK DlgProcSendFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -//filerecv.c -INT_PTR CALLBACK DlgProcRecvFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -void RemoveInvalidFilenameChars(TCHAR *tszString); -void RemoveInvalidPathChars(TCHAR *tszString); -void GetContactReceivedFilesDir(HANDLE hContact, TCHAR *szDir, int cchDir, BOOL substVars); -void GetReceivedFilesDir(TCHAR *szDir, int cchDir); -int BrowseForFolder(HWND hwnd, TCHAR *szPath); -//fileexistsdlg.c -struct TDlgProcFileExistsParam -{ - HWND hwndParent; - PROTOFILETRANSFERSTATUS *fts; -}; -INT_PTR CALLBACK DlgProcFileExists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -//filexferdlg.c -INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -//fileopts.c -int FileOptInitialise(WPARAM wParam, LPARAM lParam); -//ftmanager.c -#define WM_FT_ADD (WM_USER+701) -#define WM_FT_RESIZE (WM_USER+702) -#define WM_FT_REMOVE (WM_USER+703) -#define WM_FT_SELECTPAGE (WM_USER+704) -#define WM_FT_CLEANUP (WM_USER+705) -#define WM_FT_COMPLETED (WM_USER+706) - -HWND FtMgr_Show(bool bForceActivate, bool bFromMenu); -void FtMgr_Destroy(); -HWND FtMgr_AddTransfer(struct FileDlgData *dat); - -void FreeFileDlgData(FileDlgData* dat); - -TCHAR *GetContactID(HANDLE hContact); diff --git a/src/modules/srfile/fileexistsdlg.cpp b/src/modules/srfile/fileexistsdlg.cpp deleted file mode 100644 index 3388b692fb..0000000000 --- a/src/modules/srfile/fileexistsdlg.cpp +++ /dev/null @@ -1,344 +0,0 @@ -/* - -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. -*/ -#include "..\..\core\commonheaders.h" -#include -#include -#include -#include "file.h" - -static void SetControlToUnixTime(HWND hwndDlg, UINT idCtrl, time_t unixTime) -{ - LARGE_INTEGER liFiletime; - FILETIME filetime; - SYSTEMTIME st; - char szTime[64], szDate[64], szOutput[128]; - - liFiletime.QuadPart = (BIGI(11644473600)+(__int64)unixTime)*10000000; - filetime.dwHighDateTime = liFiletime.HighPart; - filetime.dwLowDateTime = liFiletime.LowPart; - FileTimeToSystemTime(&filetime, &st); - GetTimeFormatA(LOCALE_USER_DEFAULT, 0, &st, NULL, szTime, SIZEOF(szTime)); - GetDateFormatA(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, szDate, SIZEOF(szDate)); - mir_snprintf(szOutput, SIZEOF(szOutput), "%s %s", szDate, szTime); - SetDlgItemTextA(hwndDlg, idCtrl, szOutput); -} - -#define C_CONTEXTMENU 0 -#define C_PROPERTIES 1 -// not defined in VC++ 6.0 SE -#ifndef CMF_EXTENDEDVERBS -#define CMF_EXTENDEDVERBS 0x00000100 -#endif -static void DoAnnoyingShellCommand(HWND hwnd, const TCHAR *szFilename, int cmd, POINT *ptCursor) -{ - IShellFolder *pDesktopFolder; - if (SHGetDesktopFolder(&pDesktopFolder) == NOERROR) { - ITEMIDLIST *pCurrentIdl; - WCHAR* wszFilename = (LPWSTR)szFilename; - - if (pDesktopFolder->ParseDisplayName(NULL, NULL, wszFilename, NULL, &pCurrentIdl, NULL) == NOERROR) { - if (pCurrentIdl->mkid.cb) { - ITEMIDLIST *pidl, *pidlNext, *pidlFilename; - IShellFolder *pFileFolder; - - for (pidl = pCurrentIdl;;) { - pidlNext = (ITEMIDLIST*)((PBYTE)pidl+pidl->mkid.cb); - if (pidlNext->mkid.cb == 0) { - pidlFilename = (ITEMIDLIST*)CoTaskMemAlloc(pidl->mkid.cb+sizeof(pidl->mkid.cb)); - CopyMemory(pidlFilename, pidl, pidl->mkid.cb+sizeof(pidl->mkid.cb)); - pidl->mkid.cb = 0; - break; - } - pidl = pidlNext; - } - if (pDesktopFolder->BindToObject(pCurrentIdl, NULL, IID_IShellFolder, (void**)&pFileFolder) == NOERROR) { - IContextMenu *pContextMenu; - if (pFileFolder->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&pidlFilename, IID_IContextMenu, NULL, (void**)&pContextMenu) == NOERROR) { - switch(cmd) { - case C_PROPERTIES: - { CMINVOKECOMMANDINFO ici = {0}; - ici.cbSize = sizeof(ici); - ici.hwnd = hwnd; - ici.lpVerb = "properties"; - ici.nShow = SW_SHOW; - pContextMenu->InvokeCommand(&ici); - break; - } - case C_CONTEXTMENU: - { HMENU hMenu; - hMenu = CreatePopupMenu(); - if (SUCCEEDED(pContextMenu->QueryContextMenu(hMenu, 0, 1000, 65535, (GetKeyState(VK_SHIFT)&0x8000?CMF_EXTENDEDVERBS:0)|CMF_NORMAL))) { - int cmd; - cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, ptCursor->x, ptCursor->y, 0, hwnd, NULL); - if (cmd) { - CMINVOKECOMMANDINFO ici = {0}; - ici.cbSize = sizeof(ici); - ici.hwnd = hwnd; - ici.lpVerb = MAKEINTRESOURCEA(cmd-1000); - ici.nShow = SW_SHOW; - pContextMenu->InvokeCommand(&ici); - } - } - DestroyMenu(hMenu); - break; - } - } - pContextMenu->Release(); - } - pFileFolder->Release(); - } - CoTaskMemFree(pidlFilename); - } - CoTaskMemFree(pCurrentIdl); - } - pDesktopFolder->Release(); - } -} - -static WNDPROC pfnIconWindowProc; -static LRESULT CALLBACK IconCtrlSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - PROTOFILETRANSFERSTATUS* pft = (PROTOFILETRANSFERSTATUS*)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); - - switch(msg) { - case WM_LBUTTONDBLCLK: - ShellExecute(hwnd, NULL, pft->tszCurrentFile, NULL, NULL, SW_SHOW); - break; - case WM_RBUTTONUP: - { POINT pt; - pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); - ClientToScreen(hwnd, &pt); - DoAnnoyingShellCommand(hwnd, pft->tszCurrentFile, C_CONTEXTMENU, &pt); - return 0; - } - } - return CallWindowProc(pfnIconWindowProc, hwnd, msg, wParam, lParam); -} - -struct loadiconsstartinfo { - HWND hwndDlg; - TCHAR *szFilename; -}; - -void __cdecl LoadIconsAndTypesThread(void* param) -{ - loadiconsstartinfo *info = (loadiconsstartinfo*)param; - SHFILEINFO fileInfo; - - if (SHGetFileInfo(info->szFilename, 0, &fileInfo, sizeof(fileInfo), SHGFI_TYPENAME|SHGFI_ICON|SHGFI_LARGEICON)) { - TCHAR *pszExtension, *pszFilename; - TCHAR szExtension[64]; - TCHAR szIconFile[MAX_PATH]; - - pszFilename = _tcsrchr(info->szFilename, '\\'); - if (pszFilename == NULL) - pszFilename = info->szFilename; - - pszExtension = _tcsrchr(pszFilename, '.'); - if (pszExtension) - lstrcpyn(szExtension, pszExtension+1, SIZEOF(szExtension)); - else { - pszExtension = _T("."); - szExtension[0] = '\0'; - } - CharUpper(szExtension); - if (fileInfo.szTypeName[0] == '\0') - mir_sntprintf(fileInfo.szTypeName, SIZEOF(fileInfo.szTypeName), TranslateT("%s File"), szExtension); - SetDlgItemText(info->hwndDlg, IDC_EXISTINGTYPE, fileInfo.szTypeName); - SetDlgItemText(info->hwndDlg, IDC_NEWTYPE, fileInfo.szTypeName); - SendDlgItemMessage(info->hwndDlg, IDC_EXISTINGICON, STM_SETICON, (WPARAM)fileInfo.hIcon, 0); - szIconFile[0] = '\0'; - if ( !lstrcmp(szExtension, _T("EXE"))) - SRFile_GetRegValue(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons"), _T("2"), szIconFile, SIZEOF(szIconFile)); - else { - TCHAR szTypeName[MAX_PATH]; - if (SRFile_GetRegValue(HKEY_CLASSES_ROOT, pszExtension, NULL, szTypeName, SIZEOF(szTypeName))) { - lstrcat(szTypeName, _T("\\DefaultIcon")); - if (SRFile_GetRegValue(HKEY_CLASSES_ROOT, szTypeName, NULL, szIconFile, SIZEOF(szIconFile))) { - if (_tcsstr(szIconFile, _T("%1"))) - SRFile_GetRegValue(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons"), _T("0"), szIconFile, SIZEOF(szIconFile)); - else szIconFile[0] = '\0'; - } } } - - if (szIconFile[0]) { - TCHAR *pszComma = _tcsrchr(szIconFile, ','); - int iconIndex = (pszComma == NULL) ? 0 :_ttoi(pszComma+1); *pszComma = '\0'; - HICON hIcon = ExtractIcon(hInst, szIconFile, iconIndex); - if (hIcon) - fileInfo.hIcon = hIcon; - } - SendDlgItemMessage(info->hwndDlg, IDC_NEWICON, STM_SETICON, (WPARAM)fileInfo.hIcon, 0); - } - mir_free(info->szFilename); - mir_free(info); -} - -INT_PTR CALLBACK DlgProcFileExists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - PROTOFILETRANSFERSTATUS *fts; - - fts = (PROTOFILETRANSFERSTATUS*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch(msg) { - case WM_INITDIALOG: - { - TCHAR szSize[64]; - struct _stati64 statbuf; - HWND hwndFocus; - struct TDlgProcFileExistsParam *dat = (struct TDlgProcFileExistsParam *)lParam; - - SetPropA(hwndDlg, "Miranda.Preshutdown", HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN)); - SetPropA(hwndDlg, "Miranda.ParentWnd", dat->hwndParent); - - TranslateDialogDefault(hwndDlg); - fts = (PROTOFILETRANSFERSTATUS*)mir_alloc(sizeof(PROTOFILETRANSFERSTATUS)); - CopyProtoFileTransferStatus(fts, dat->fts); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)fts); - SetDlgItemText(hwndDlg, IDC_FILENAME, fts->tszCurrentFile); - SetControlToUnixTime(hwndDlg, IDC_NEWDATE, fts->currentFileTime); - GetSensiblyFormattedSize(fts->currentFileSize, szSize, SIZEOF(szSize), 0, 1, NULL); - SetDlgItemText(hwndDlg, IDC_NEWSIZE, szSize); - - pfnIconWindowProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_EXISTINGICON), GWLP_WNDPROC, (LONG_PTR)IconCtrlSubclassProc); - - hwndFocus = GetDlgItem(hwndDlg, IDC_RESUME); - if (_tstati64(fts->tszCurrentFile, &statbuf) == 0) { - SetControlToUnixTime(hwndDlg, IDC_EXISTINGDATE, statbuf.st_mtime); - GetSensiblyFormattedSize(statbuf.st_size, szSize, SIZEOF(szSize), 0, 1, NULL); - SetDlgItemText(hwndDlg, IDC_EXISTINGSIZE, szSize); - if (statbuf.st_size>(int)fts->currentFileSize) { - EnableWindow(GetDlgItem(hwndDlg, IDC_RESUME), FALSE); - hwndFocus = GetDlgItem(hwndDlg, IDC_OVERWRITE); - } } - - loadiconsstartinfo *lisi = (loadiconsstartinfo*)mir_alloc(sizeof(loadiconsstartinfo)); - lisi->hwndDlg = hwndDlg; - lisi->szFilename = mir_tstrdup(fts->tszCurrentFile); - //can be a little slow, so why not? - forkthread(LoadIconsAndTypesThread, 0, lisi); - SetFocus(hwndFocus); - SetWindowLongPtr(hwndFocus, GWL_STYLE, GetWindowLongPtr(hwndFocus, GWL_STYLE)|BS_DEFPUSHBUTTON); - return FALSE; - } - case WM_COMMAND: - { - PROTOFILERESUME pfr = {0}; - switch(LOWORD(wParam)) { - case IDC_OPENFILE: - ShellExecute(hwndDlg, NULL, fts->tszCurrentFile, NULL, NULL, SW_SHOW); - return FALSE; - - case IDC_OPENFOLDER: - { - TCHAR szFile[MAX_PATH]; - lstrcpyn(szFile, fts->tszCurrentFile, SIZEOF(szFile)); - TCHAR* pszLastBackslash = _tcsrchr(szFile, '\\'); - if (pszLastBackslash) - *pszLastBackslash = '\0'; - ShellExecute(hwndDlg, NULL, szFile, NULL, NULL, SW_SHOW); - return FALSE; - } - case IDC_PROPERTIES: - DoAnnoyingShellCommand(hwndDlg, fts->tszCurrentFile, C_PROPERTIES, NULL); - return FALSE; - case IDC_RESUME: - pfr.action = FILERESUME_RESUME; - break; - case IDC_RESUMEALL: - pfr.action = FILERESUME_RESUMEALL; - break; - case IDC_OVERWRITE: - pfr.action = FILERESUME_OVERWRITE; - break; - case IDC_OVERWRITEALL: - pfr.action = FILERESUME_OVERWRITEALL; - break; - - case IDC_AUTORENAME: - pfr.action = FILERESUME_RENAMEALL; - break; - - case IDC_SAVEAS: - { - OPENFILENAME ofn = {0}; - TCHAR filter[512], *pfilter; - TCHAR str[MAX_PATH]; - - lstrcpyn(str, fts->tszCurrentFile, SIZEOF(str)); - ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; - ofn.hwndOwner = hwndDlg; - ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; - _tcscpy(filter, TranslateT("All Files")); - _tcscat(filter, _T(" (*)")); - pfilter = filter + _tcslen(filter) + 1; - _tcscpy(pfilter, _T("*")); - pfilter = pfilter + _tcslen(pfilter) + 1; - *pfilter = '\0'; - ofn.lpstrFilter = filter; - ofn.lpstrFile = str; - ofn.nMaxFile = SIZEOF(str); - ofn.nMaxFileTitle = MAX_PATH; - if ( !GetSaveFileName(&ofn)) - return FALSE; - - pfr.szFilename = mir_tstrdup(str); - pfr.action = FILERESUME_RENAME; - break; - } - case IDC_SKIP: - pfr.action = FILERESUME_SKIP; - break; - case IDCANCEL: - pfr.action = FILERESUME_CANCEL; - break; - default: - return FALSE; - } - { PROTOFILERESUME *pfrCopy; - pfrCopy = (PROTOFILERESUME*)mir_alloc(sizeof(pfr)); - CopyMemory(pfrCopy, &pfr, sizeof(pfr)); - PostMessage((HWND)GetPropA(hwndDlg, "Miranda.ParentWnd"), M_FILEEXISTSDLGREPLY, (WPARAM)mir_tstrdup(fts->tszCurrentFile), (LPARAM)pfrCopy); - DestroyWindow(hwndDlg); - } - break; - } - - case WM_CLOSE: - PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDCANCEL)); - break; - - case M_PRESHUTDOWN: - PostMessage(hwndDlg, WM_CLOSE, 0, 0); - break; - - case WM_DESTROY: - UnhookEvent(GetPropA(hwndDlg, "Miranda.Preshutdown")); // GetProp() will return NULL if it couldnt find anything - RemovePropA(hwndDlg, "Miranda.Preshutdown"); - RemovePropA(hwndDlg, "Miranda.ParentWnd"); - DestroyIcon((HICON)SendDlgItemMessage(hwndDlg, IDC_EXISTINGICON, STM_GETICON, 0, 0)); - DestroyIcon((HICON)SendDlgItemMessage(hwndDlg, IDC_NEWICON, STM_GETICON, 0, 0)); - FreeProtoFileTransferStatus(fts); - mir_free(fts); - break; - } - return FALSE; -} diff --git a/src/modules/srfile/fileopts.cpp b/src/modules/srfile/fileopts.cpp deleted file mode 100644 index 2aec9fa5a1..0000000000 --- a/src/modules/srfile/fileopts.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - -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. -*/ -#include "..\..\core\commonheaders.h" -#include "file.h" - -#define VSCAN_MCAFEE 1 -#define VSCAN_DRSOLOMON 2 -#define VSCAN_NORTON 3 -#define VSCAN_CA 4 - -struct virusscannerinfo { - const TCHAR *szProductName; - const TCHAR *szExeRegPath; - const TCHAR *szExeRegValue; - const TCHAR *szCommandLine; -}; - -static const struct virusscannerinfo virusScanners[] = { - {_T("Network Associates/McAfee VirusScan"), _T("SOFTWARE\\McAfee\\VirusScan"), _T("Scan32EXE"), _T("\"%s\" %%f /nosplash /comp /autoscan /autoexit /noboot")}, - {_T("Dr Solomon's VirusScan (Network Associates)"), _T("SOFTWARE\\Network Associates\\TVD\\VirusScan\\AVConsol\\General"), _T("szScannerExe"), _T("\"%s\" %%f /uinone /noboot /comp /prompt /autoexit")}, - {_T("Norton AntiVirus"), _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Navw32.exe"), NULL, _T("\"%s\" %%f /b- /m- /s+ /noresults")}, - {_T("Computer Associates/Inoculate IT"), _T("Software\\Antivirus"), _T("ImageFilename"), _T("\"%s\" %%f /display = progress /exit")}, - {_T("Computer Associates eTrust"), _T("SOFTWARE\\ComputerAssociates\\Anti-Virus\\Resident"), _T("VetPath"), _T("\"%s\" %%f /display = progress /exit")}, - {_T("Kaspersky Anti-Virus"), _T("SOFTWARE\\KasperskyLab\\Components\\101"), _T("EXEName"), _T("\"%s\" /S /Q %%f")}, - {_T("Kaspersky Anti-Virus"), _T("SOFTWARE\\KasperskyLab\\SetupFolders"), _T("KAV8"), _T("\"%savp.exe\" SCAN %%f")}, - {_T("Kaspersky Anti-Virus"), _T("SOFTWARE\\KasperskyLab\\SetupFolders"), _T("KAV9"), _T("\"%savp.exe\" SCAN %%f")}, - {_T("AntiVir PersonalEdition Classic"), _T("SOFTWARE\\Avira\\AntiVir PersonalEdition Classic"), _T("Path"), _T("\"%savscan.exe\" /GUIMODE = 2 /PATH = \"%%f\"")}, - {_T("ESET NOD32 Antivirus"), _T("SOFTWARE\\ESET\\ESET Security\\CurrentVersion\\Info"), _T("InstallDir"), _T("\"%secls.exe\" /log-all /aind /no-boots /adware /sfx /unsafe /unwanted /heur /adv-heur /action = clean \"%%f\"")}, -}; - -#define M_UPDATEENABLING (WM_USER+100) -#define M_SCANCMDLINESELCHANGE (WM_USER+101) - -#ifndef SHACF_FILESYS_DIRS - #define SHACF_FILESYS_DIRS 0x00000020 -#endif - -static INT_PTR CALLBACK DlgProcFileOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch(msg) { - case WM_INITDIALOG: - { - TranslateDialogDefault(hwndDlg); - - if (shAutoComplete) - shAutoComplete(GetDlgItem(hwndDlg, IDC_FILEDIR), SHACF_FILESYS_DIRS); - - { - TCHAR str[MAX_PATH]; - GetContactReceivedFilesDir(NULL, str, SIZEOF(str), FALSE); - SetDlgItemText(hwndDlg, IDC_FILEDIR, str); - } - - CheckDlgButton(hwndDlg, IDC_AUTOACCEPT, DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_AUTOMIN, DBGetContactSettingByte(NULL, "SRFile", "AutoMin", 0) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_AUTOCLOSE, DBGetContactSettingByte(NULL, "SRFile", "AutoClose", 0) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_AUTOCLEAR, DBGetContactSettingByte(NULL, "SRFile", "AutoClear", 1) ? BST_CHECKED : BST_UNCHECKED); - switch(DBGetContactSettingByte(NULL, "SRFile", "UseScanner", VIRUSSCAN_DISABLE)) { - case VIRUSSCAN_AFTERDL: CheckDlgButton(hwndDlg, IDC_SCANAFTERDL, BST_CHECKED); break; - case VIRUSSCAN_DURINGDL: CheckDlgButton(hwndDlg, IDC_SCANDURINGDL, BST_CHECKED); break; - default: CheckDlgButton(hwndDlg, IDC_NOSCANNER, BST_CHECKED); break; - } - CheckDlgButton(hwndDlg, IDC_WARNBEFOREOPENING, DBGetContactSettingByte(NULL, "SRFile", "WarnBeforeOpening", 1) ? BST_CHECKED : BST_UNCHECKED); - - { TCHAR szScanExe[MAX_PATH]; - int i, iItem; - for (i=0; i < SIZEOF(virusScanners); i++) { - if (SRFile_GetRegValue(HKEY_LOCAL_MACHINE, virusScanners[i].szExeRegPath, virusScanners[i].szExeRegValue, szScanExe, SIZEOF(szScanExe))) { - iItem = SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_ADDSTRING, 0, (LPARAM)virusScanners[i].szProductName); - SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_SETITEMDATA, iItem, i); - } - } - if (SendDlgItemMessageA(hwndDlg, IDC_SCANCMDLINE, CB_GETCOUNT, 0, 0) == 0) - { - iItem = SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_ADDSTRING, 0, (LPARAM)_T("")); - SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_SETITEMDATA, iItem, (LPARAM)-1); - } - } - - DBVARIANT dbv; - if (DBGetContactSettingTString(NULL, "SRFile", "ScanCmdLine", &dbv) == 0) { - SetDlgItemText(hwndDlg, IDC_SCANCMDLINE, dbv.ptszVal); - DBFreeVariant(&dbv); - } - else { - if (SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_GETCOUNT, 0, 0)) { - SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_SETCURSEL, 0, 0); - PostMessage(hwndDlg, M_SCANCMDLINESELCHANGE, 0, 0); - } - } - switch(DBGetContactSettingByte(NULL, "SRFile", "IfExists", FILERESUME_ASK)) { - case FILERESUME_RESUMEALL: CheckDlgButton(hwndDlg, IDC_RESUME, BST_CHECKED); break; - case FILERESUME_OVERWRITEALL: CheckDlgButton(hwndDlg, IDC_OVERWRITE, BST_CHECKED); break; - case FILERESUME_RENAMEALL: CheckDlgButton(hwndDlg, IDC_RENAME, BST_CHECKED); break; - default: CheckDlgButton(hwndDlg, IDC_ASK, BST_CHECKED); break; - } - SendMessage(hwndDlg, M_UPDATEENABLING, 0, 0); - return TRUE; - } - case M_UPDATEENABLING: - { int on = !IsDlgButtonChecked(hwndDlg, IDC_NOSCANNER); - EnableWindow(GetDlgItem(hwndDlg, IDC_ST_CMDLINE), on); - EnableWindow(GetDlgItem(hwndDlg, IDC_SCANCMDLINE), on); - EnableWindow(GetDlgItem(hwndDlg, IDC_SCANCMDLINEBROWSE), on); - EnableWindow(GetDlgItem(hwndDlg, IDC_ST_CMDLINEHELP), on); - EnableWindow(GetDlgItem(hwndDlg, IDC_AUTOMIN), IsDlgButtonChecked(hwndDlg, IDC_AUTOACCEPT)); - break; - } - case M_SCANCMDLINESELCHANGE: - { TCHAR str[512]; - TCHAR szScanExe[MAX_PATH]; - int iScanner = SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_SCANCMDLINE, CB_GETCURSEL, 0, 0), 0); - if (iScanner >= SIZEOF(virusScanners) || iScanner<0) break; - str[0] = '\0'; - if (SRFile_GetRegValue(HKEY_LOCAL_MACHINE, virusScanners[iScanner].szExeRegPath, virusScanners[iScanner].szExeRegValue, szScanExe, SIZEOF(szScanExe))) - mir_sntprintf(str, SIZEOF(str), virusScanners[iScanner].szCommandLine, szScanExe); - SetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str); - break; - } - case WM_COMMAND: - switch(LOWORD(wParam)) { - case IDC_FILEDIR: - if ((HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) return 0; - break; - case IDC_FILEDIRBROWSE: - { TCHAR str[MAX_PATH]; - GetDlgItemText(hwndDlg, IDC_FILEDIR, str, SIZEOF(str)); - if (BrowseForFolder(hwndDlg, str)) - SetDlgItemText(hwndDlg, IDC_FILEDIR, str); - break; - } - case IDC_AUTOACCEPT: - case IDC_NOSCANNER: - case IDC_SCANAFTERDL: - case IDC_SCANDURINGDL: - SendMessage(hwndDlg, M_UPDATEENABLING, 0, 0); - break; - case IDC_SCANCMDLINE: - if (HIWORD(wParam) == CBN_SELCHANGE) PostMessage(hwndDlg, M_SCANCMDLINESELCHANGE, 0, 0); - else if (HIWORD(wParam) != CBN_EDITCHANGE) return 0; - break; - case IDC_SCANCMDLINEBROWSE: - { TCHAR str[MAX_PATH+2]; - OPENFILENAME ofn = {0}; - TCHAR filter[512], *pfilter; - - GetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str, SIZEOF(str)); - ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; - ofn.hwndOwner = hwndDlg; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_DONTADDTORECENT; - _tcscpy(filter, TranslateT("Executable Files")); - _tcscat(filter, _T(" (*.exe)")); - pfilter = filter + _tcslen(filter) + 1; - _tcscpy(pfilter, _T("*.exe")); - pfilter = pfilter + _tcslen(pfilter)+1; - _tcscpy(pfilter, TranslateT("All Files")); - _tcscat(pfilter, _T(" (*)")); - pfilter = pfilter + _tcslen(pfilter) + 1; - _tcscpy(pfilter, _T("*")); - pfilter = pfilter + _tcslen(pfilter) + 1; - *pfilter = 0; - ofn.lpstrFilter = filter; - ofn.lpstrFile = str; - ofn.nMaxFile = SIZEOF(str)-2; - if (str[0] == '"') { - TCHAR *pszQuote = _tcschr(str + 1, '"'); - if (pszQuote) *pszQuote = 0; - MoveMemory(str, str + 1, _tcslen(str) * sizeof(TCHAR)); - } - else { - TCHAR *pszSpace = _tcschr(str, ' '); - if (pszSpace) *pszSpace = 0; - } - ofn.nMaxFileTitle = MAX_PATH; - if ( !GetOpenFileName(&ofn)) break; - if (_tcschr(str, ' ') != NULL) { - MoveMemory(str+1, str, SIZEOF(str) - 2 * sizeof(TCHAR)); - str[0] = '"'; - _tcscat(str, _T("\"")); - } - SetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str); - break; - } - } - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->code) - { - case PSN_APPLY: - { TCHAR str[512]; - GetDlgItemText(hwndDlg, IDC_FILEDIR, str, SIZEOF(str)); - RemoveInvalidPathChars(str); - DBWriteContactSettingTString(NULL, "SRFile", "RecvFilesDirAdv", str); - DBWriteContactSettingByte(NULL, "SRFile", "AutoAccept", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOACCEPT)); - DBWriteContactSettingByte(NULL, "SRFile", "AutoMin", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOMIN)); - DBWriteContactSettingByte(NULL, "SRFile", "AutoClose", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOCLOSE)); - DBWriteContactSettingByte(NULL, "SRFile", "AutoClear", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOCLEAR)); - DBWriteContactSettingByte(NULL, "SRFile", "UseScanner", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_SCANAFTERDL)?VIRUSSCAN_AFTERDL:(IsDlgButtonChecked(hwndDlg, IDC_SCANDURINGDL)?VIRUSSCAN_DURINGDL:VIRUSSCAN_DISABLE))); - GetDlgItemText(hwndDlg, IDC_SCANCMDLINE, str, SIZEOF(str)); - DBWriteContactSettingTString(NULL, "SRFile", "ScanCmdLine", str); - DBWriteContactSettingByte(NULL, "SRFile", "WarnBeforeOpening", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_WARNBEFOREOPENING)); - DBWriteContactSettingByte(NULL, "SRFile", "IfExists", (BYTE)(IsDlgButtonChecked(hwndDlg, IDC_ASK)?FILERESUME_ASK:(IsDlgButtonChecked(hwndDlg, IDC_RESUME)?FILERESUME_RESUMEALL:(IsDlgButtonChecked(hwndDlg, IDC_OVERWRITE)?FILERESUME_OVERWRITEALL:FILERESUME_RENAMEALL)))); - return TRUE; - } - } - break; - } - return FALSE; -} - -int FileOptInitialise(WPARAM wParam, LPARAM) -{ - OPTIONSDIALOGPAGE odp = {0}; - odp.cbSize = sizeof(odp); - odp.position = 900000000; - odp.hInstance = hInst; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_FILETRANSFER); - odp.pszTitle = LPGEN("File Transfers"); - odp.pszGroup = LPGEN("Events"); - odp.pfnDlgProc = DlgProcFileOpts; - odp.flags = ODPF_BOLDGROUPS; - odp.nIDBottomSimpleControl = IDC_VIRUSSCANNERGROUP; - Options_AddPage(wParam, &odp); - return 0; -} - diff --git a/src/modules/srfile/filerecvdlg.cpp b/src/modules/srfile/filerecvdlg.cpp deleted file mode 100644 index 93ba691266..0000000000 --- a/src/modules/srfile/filerecvdlg.cpp +++ /dev/null @@ -1,442 +0,0 @@ -/* - -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. -*/ -#include "..\..\core\commonheaders.h" -#include "file.h" - -#define MAX_MRU_DIRS 5 - -static BOOL CALLBACK ClipSiblingsChildEnumProc(HWND hwnd, LPARAM) -{ - SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE)|WS_CLIPSIBLINGS); - return TRUE; -} - -static void GetLowestExistingDirName(const TCHAR *szTestDir, TCHAR *szExistingDir, int cchExistingDir) -{ - DWORD dwAttributes; - TCHAR *pszLastBackslash; - - lstrcpyn(szExistingDir, szTestDir, cchExistingDir); - while ((dwAttributes = GetFileAttributes(szExistingDir)) != INVALID_FILE_ATTRIBUTES && !(dwAttributes&FILE_ATTRIBUTE_DIRECTORY)) { - pszLastBackslash = _tcsrchr(szExistingDir, '\\'); - if (pszLastBackslash == NULL) {*szExistingDir = '\0'; break;} - *pszLastBackslash = '\0'; - } - if (szExistingDir[0] == '\0') GetCurrentDirectory(cchExistingDir, szExistingDir); -} - -static const TCHAR InvalidFilenameChars[] = _T("\\/:*?\"<>|"); -void RemoveInvalidFilenameChars(TCHAR *tszString) -{ - size_t i; - if (tszString) { - for (i = _tcscspn(tszString, InvalidFilenameChars); tszString[i]; i+=_tcscspn(tszString+i+1, InvalidFilenameChars)+1) - if (tszString[i] >= 0) - tszString[i] = _T('_'); - } -} - -static const TCHAR InvalidPathChars[] = _T("*?\"<>|"); // "\/:" are excluded as they are allowed in file path -void RemoveInvalidPathChars(TCHAR *tszString) -{ - size_t i; - if (tszString) { - for (i = _tcscspn(tszString, InvalidPathChars); tszString[i]; i+=_tcscspn(tszString+i+1, InvalidPathChars)+1) - if (tszString[i] >= 0) - tszString[i] = _T('_'); - } -} - -static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) -{ - TCHAR szDir[MAX_PATH]; - switch(uMsg) { - case BFFM_INITIALIZED: - SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); - break; - case BFFM_SELCHANGED: - if (SHGetPathFromIDList((LPITEMIDLIST) lp , szDir)) - SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szDir); - break; - } - return 0; -} - -int BrowseForFolder(HWND hwnd, TCHAR *szPath) -{ - BROWSEINFO bi = {0}; - LPITEMIDLIST pidlResult; - - bi.hwndOwner = hwnd; - bi.pszDisplayName = szPath; - bi.lpszTitle = TranslateT("Select Folder"); - bi.ulFlags = BIF_NEWDIALOGSTYLE|BIF_EDITBOX|BIF_RETURNONLYFSDIRS; // Use this combo instead of BIF_USENEWUI - bi.lpfn = BrowseCallbackProc; - bi.lParam = (LPARAM)szPath; - - pidlResult = SHBrowseForFolder(&bi); - if (pidlResult) { - SHGetPathFromIDList(pidlResult, szPath); - lstrcat(szPath, _T("\\")); - CoTaskMemFree(pidlResult); - } - return pidlResult != NULL; -} - -static REPLACEVARSARRAY sttVarsToReplace[] = -{ - { (TCHAR*)"///", (TCHAR*)"//" }, - { (TCHAR*)"//", (TCHAR*)"/" }, - { (TCHAR*)"()", (TCHAR*)"" }, - { NULL, NULL } -}; - -static void patchDir(TCHAR* str, size_t strSize) -{ - REPLACEVARSDATA dat = { 0 }; - dat.cbSize = sizeof(dat); - dat.dwFlags = RVF_TCHAR; - dat.variables = sttVarsToReplace; - - TCHAR* result = (TCHAR*)CallService(MS_UTILS_REPLACEVARS, (WPARAM)str, (LPARAM)&dat); - if (result) { - _tcsncpy(str, result, strSize); - mir_free(result); - } - - size_t len = lstrlen(str); - if (len+1 < strSize && str[len-1] != '\\') - lstrcpy(str+len, _T("\\")); -} - -void GetContactReceivedFilesDir(HANDLE hContact, TCHAR *szDir, int cchDir, BOOL patchVars) -{ - DBVARIANT dbv; - TCHAR szTemp[MAX_PATH]; - szTemp[0] = 0; - - if ( !DBGetContactSettingTString(NULL, "SRFile", "RecvFilesDirAdv", &dbv)) { - if (lstrlen(dbv.ptszVal) > 0) - lstrcpyn(szTemp, dbv.ptszVal, SIZEOF(szTemp)); - DBFreeVariant(&dbv); - } - - if ( !szTemp[0]) - - mir_sntprintf(szTemp, SIZEOF(szTemp), _T("%%mydocuments%%\\%s\\%%userid%%"), TranslateT("My Received Files")); - - - if (hContact) { - REPLACEVARSDATA dat = { 0 }; - REPLACEVARSARRAY rvaVarsToReplace[4]; - rvaVarsToReplace[0].lptzKey = _T("nick"); - rvaVarsToReplace[0].lptzValue = mir_tstrdup((TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR)); - rvaVarsToReplace[1].lptzKey = _T("userid"); - rvaVarsToReplace[1].lptzValue = GetContactID(hContact); - rvaVarsToReplace[2].lptzKey = _T("proto"); - rvaVarsToReplace[2].lptzValue = mir_a2t((char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0)); - rvaVarsToReplace[3].lptzKey = NULL; - rvaVarsToReplace[3].lptzValue = NULL; - for (int i=0; i < (SIZEOF(rvaVarsToReplace)-1);i++) - RemoveInvalidFilenameChars(rvaVarsToReplace[i].lptzValue); - - dat.cbSize = sizeof(dat); - dat.dwFlags = RVF_TCHAR; - dat.variables = rvaVarsToReplace; - dat.hContact = hContact; - TCHAR* result = (TCHAR*)CallService(MS_UTILS_REPLACEVARS, (WPARAM)szTemp, (LPARAM)&dat); - if (result) { - _tcsncpy(szTemp, result, SIZEOF(szTemp)); - mir_free(result); - for (int i=0; i < (SIZEOF(rvaVarsToReplace)-1);i++) - mir_free(rvaVarsToReplace[i].lptzValue); - } } - - if (patchVars) - patchDir(szTemp, SIZEOF(szTemp)); - RemoveInvalidPathChars(szTemp); - lstrcpyn(szDir, szTemp, cchDir); -} - -void GetReceivedFilesDir(TCHAR *szDir, int cchDir) -{ - DBVARIANT dbv; - TCHAR szTemp[MAX_PATH]; - szTemp[0] = 0; - - if ( !DBGetContactSettingTString(NULL, "SRFile", "RecvFilesDirAdv", &dbv)) { - if (lstrlen(dbv.ptszVal) > 0) - lstrcpyn(szTemp, dbv.ptszVal, SIZEOF(szTemp)); - DBFreeVariant(&dbv); - } - - if ( !szTemp[0]) - - mir_sntprintf(szTemp, SIZEOF(szTemp), _T("%%mydocuments%%\\%s"), TranslateT("My Received Files")); - - - patchDir(szTemp, SIZEOF(szTemp)); - RemoveInvalidPathChars(szTemp); - lstrcpyn(szDir, szTemp, cchDir); -} - -INT_PTR CALLBACK DlgProcRecvFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - struct FileDlgData *dat; - - dat = (struct FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: { - TCHAR *contactName; - TCHAR szPath[450]; - CLISTEVENT* cle = (CLISTEVENT*)lParam; - - TranslateDialogDefault(hwndDlg); - - dat = (struct FileDlgData*)mir_calloc(sizeof(struct FileDlgData)); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); - dat->hContact = cle->hContact; - dat->hDbEvent = cle->hDbEvent; - dat->hPreshutdownEvent = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN); - dat->dwTicks = GetTickCount(); - - EnumChildWindows(hwndDlg, ClipSiblingsChildEnumProc, 0); - - Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_FILE); - Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add Contact Permanently to List")); - Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User's Details")); - Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View User's History")); - Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User Menu")); - - contactName = cli.pfnGetContactDisplayName(dat->hContact, 0); - SetDlgItemText(hwndDlg, IDC_FROM, contactName); - GetContactReceivedFilesDir(dat->hContact, szPath, SIZEOF(szPath), TRUE); - SetDlgItemText(hwndDlg, IDC_FILEDIR, szPath); - { - int i; - char idstr[32]; - DBVARIANT dbv; - - if (shAutoComplete) - shAutoComplete(GetWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), GW_CHILD), 1); - - for (i=0;ihContact, (LPARAM)dat->hDbEvent); - { - DBEVENTINFO dbei = {0}; - TCHAR datetimestr[64]; - char buf[540]; - - dbei.cbSize = sizeof(dbei); - dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)dat->hDbEvent, 0); - dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); - CallService(MS_DB_EVENT_GET, (WPARAM)dat->hDbEvent, (LPARAM)&dbei); - dat->fs = cle->lParam ? (HANDLE)cle->lParam : (HANDLE)*(PDWORD)dbei.pBlob; - lstrcpynA(buf, (char*)dbei.pBlob+4, min(dbei.cbBlob+1, SIZEOF(buf))); - TCHAR* ptszFileName = DbGetEventStringT(&dbei, buf); - SetDlgItemText(hwndDlg, IDC_FILENAMES, ptszFileName); - mir_free(ptszFileName); - lstrcpynA(buf, (char*)dbei.pBlob+4+strlen((char*)dbei.pBlob+4)+1, min((int)(dbei.cbBlob-4-strlen((char*)dbei.pBlob+4)), SIZEOF(buf))); - TCHAR* ptszDescription = DbGetEventStringT(&dbei, buf); - SetDlgItemText(hwndDlg, IDC_MSG, ptszDescription); - mir_free(ptszDescription); - mir_free(dbei.pBlob); - - tmi.printTimeStamp(NULL, dbei.timestamp, _T("t d"), datetimestr, SIZEOF(datetimestr), 0); - SetDlgItemText(hwndDlg, IDC_DATE, datetimestr); - } - { - char* szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); - if (szProto) { - CONTACTINFO ci; - int hasName = 0; - char buf[128]; - ZeroMemory(&ci, sizeof(ci)); - - ci.cbSize = sizeof(ci); - ci.hContact = dat->hContact; - ci.szProto = szProto; - ci.dwFlag = CNF_UNIQUEID; - if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) { - switch(ci.type) { - case CNFT_ASCIIZ: - hasName = 1; - mir_snprintf(buf, SIZEOF(buf), "%s", ci.pszVal); - mir_free(ci.pszVal); - break; - case CNFT_DWORD: - hasName = 1; - mir_snprintf(buf, SIZEOF(buf), "%u", ci.dVal); - break; - } } - if (hasName) - SetDlgItemTextA(hwndDlg, IDC_NAME, buf); - else - SetDlgItemText(hwndDlg, IDC_NAME, contactName); - } } - - if (DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) { - RECT rcBtn1, rcBtn2, rcDateCtrl; - GetWindowRect(GetDlgItem(hwndDlg, IDC_ADD), &rcBtn1); - GetWindowRect(GetDlgItem(hwndDlg, IDC_USERMENU), &rcBtn2); - GetWindowRect(GetDlgItem(hwndDlg, IDC_DATE), &rcDateCtrl); - SetWindowPos(GetDlgItem(hwndDlg, IDC_DATE), 0, 0, 0, rcDateCtrl.right-rcDateCtrl.left-(rcBtn2.left-rcBtn1.left), rcDateCtrl.bottom-rcDateCtrl.top, SWP_NOZORDER|SWP_NOMOVE); - } - else if (DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0)) { - //don't check auto-min here to fix BUG#647620 - PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDOK)); - } - if ( !DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) - ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); - return TRUE; - } - - case WM_MEASUREITEM: - return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); - - case WM_DRAWITEM: - { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; - if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) { - char *szProto; - - szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); - if (szProto) { - HICON hIcon; - - hIcon = (HICON)CallProtoServiceInt(NULL,szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); - if (hIcon) { - DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); - DestroyIcon(hIcon); - } } } } - return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); - - case WM_COMMAND: - if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) - break; - - switch (LOWORD(wParam)) { - case IDC_FILEDIRBROWSE: - { - TCHAR szDirName[MAX_PATH], szExistingDirName[MAX_PATH]; - - GetDlgItemText(hwndDlg, IDC_FILEDIR, szDirName, SIZEOF(szDirName)); - GetLowestExistingDirName(szDirName, szExistingDirName, SIZEOF(szExistingDirName)); - if (BrowseForFolder(hwndDlg, szExistingDirName)) - SetDlgItemText(hwndDlg, IDC_FILEDIR, szExistingDirName); - } - break; - - case IDOK: - { //most recently used directories - TCHAR szRecvDir[MAX_PATH], szDefaultRecvDir[MAX_PATH]; - GetDlgItemText(hwndDlg, IDC_FILEDIR, szRecvDir, SIZEOF(szRecvDir)); - RemoveInvalidPathChars(szRecvDir); - GetContactReceivedFilesDir(NULL, szDefaultRecvDir, SIZEOF(szDefaultRecvDir), TRUE); - if (_tcsnicmp(szRecvDir, szDefaultRecvDir, lstrlen(szDefaultRecvDir))) { - char idstr[32]; - int i; - DBVARIANT dbv; - for (i = MAX_MRU_DIRS-2;i>=0;i--) { - mir_snprintf(idstr, SIZEOF(idstr), "MruDir%d", i); - if (DBGetContactSettingTString(NULL, "SRFile", idstr, &dbv)) continue; - mir_snprintf(idstr, SIZEOF(idstr), "MruDir%d", i+1); - DBWriteContactSettingTString(NULL, "SRFile", idstr, dbv.ptszVal); - DBFreeVariant(&dbv); - } - DBWriteContactSettingTString(NULL, "SRFile", idstr, szRecvDir); - } - } - EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAMES), FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_MSG), FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIRBROWSE), FALSE); - - GetDlgItemText(hwndDlg, IDC_FILEDIR, dat->szSavePath, SIZEOF(dat->szSavePath)); - GetDlgItemText(hwndDlg, IDC_FILE, dat->szFilenames, SIZEOF(dat->szFilenames)); - GetDlgItemText(hwndDlg, IDC_MSG, dat->szMsg, SIZEOF(dat->szMsg)); - dat->hwndTransfer = FtMgr_AddTransfer(dat); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); - //check for auto-minimize here to fix BUG#647620 - if (DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0) && DBGetContactSettingByte(NULL, "SRFile", "AutoMin", 0)) { - ShowWindow(hwndDlg, SW_HIDE); - ShowWindow(hwndDlg, SW_SHOWMINNOACTIVE); - } - DestroyWindow(hwndDlg); - break; - - case IDCANCEL: - if (dat->fs) CallContactService(dat->hContact, PSS_FILEDENYT, (WPARAM)dat->fs, (LPARAM)TranslateT("Cancelled")); - dat->fs = NULL; /* the protocol will free the handle */ - DestroyWindow(hwndDlg); - break; - - case IDC_ADD: - { ADDCONTACTSTRUCT acs = {0}; - - acs.handle = dat->hContact; - acs.handleType = HANDLE_CONTACT; - acs.szProto = ""; - CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); - if ( !DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) - ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); - } - break; - - case IDC_USERMENU: - { RECT rc; - HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)dat->hContact, 0); - GetWindowRect((HWND)lParam, &rc); - TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); - DestroyMenu(hMenu); - } - break; - - case IDC_DETAILS: - CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)dat->hContact, 0); - break; - - case IDC_HISTORY: - CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)dat->hContact, 0); - break; - } - break; - - case WM_DESTROY: - Window_FreeIcon_IcoLib(hwndDlg); - Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); - Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); - Button_FreeIcon_IcoLib(hwndDlg, IDC_HISTORY); - Button_FreeIcon_IcoLib(hwndDlg, IDC_USERMENU); - - if (dat) FreeFileDlgData(dat); - break; - } - return FALSE; -} diff --git a/src/modules/srfile/filesenddlg.cpp b/src/modules/srfile/filesenddlg.cpp deleted file mode 100644 index 7614d38a4e..0000000000 --- a/src/modules/srfile/filesenddlg.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/* - -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. -*/ -#include "..\..\core\commonheaders.h" -#include -#include -#include "file.h" - -static void SetFileListAndSizeControls(HWND hwndDlg, struct FileDlgData *dat) -{ - int fileCount = 0, dirCount = 0, totalSize = 0, i; - struct _stat statbuf; - TCHAR str[64]; - - for (i=0; dat->files[i]; i++) { - if (_tstat(dat->files[i], &statbuf) == 0) { - if (statbuf.st_mode & _S_IFDIR) - dirCount++; - else - fileCount++; - totalSize += statbuf.st_size; - } } - - GetSensiblyFormattedSize(totalSize, str, SIZEOF(str), 0, 1, NULL); - SetDlgItemText(hwndDlg, IDC_TOTALSIZE, str); - if (i>1) { - TCHAR szFormat[32]; - if (fileCount && dirCount) { - mir_sntprintf(szFormat, SIZEOF(szFormat), _T("%s, %s"), TranslateTS(fileCount == 1?_T("%d file"):_T("%d files")), TranslateTS(dirCount == 1?_T("%d directory"):_T("%d directories"))); - mir_sntprintf(str, SIZEOF(str), szFormat, fileCount, dirCount); - } - else if (fileCount) { - lstrcpy(szFormat, TranslateT("%d files")); - mir_sntprintf(str, SIZEOF(str), szFormat, fileCount); - } - else { - lstrcpy(szFormat, TranslateT("%d directories")); - mir_sntprintf(str, SIZEOF(str), szFormat, dirCount); - } - SetDlgItemText(hwndDlg, IDC_FILE, str); - } - else SetDlgItemText(hwndDlg, IDC_FILE, dat->files[0]); - - EnableWindow(GetDlgItem(hwndDlg, IDOK), fileCount || dirCount); -} - -static void FilenameToFileList(HWND hwndDlg, struct FileDlgData* dat, const TCHAR* buf) -{ - DWORD dwFileAttributes; - - // Make sure that the file matrix is empty (the user may select files several times) - FreeFilesMatrix(&dat->files); - - // Get the file attributes of selection - dwFileAttributes = GetFileAttributes(buf); - if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) - return; - - // Check if the selection is a directory or a file - if (GetFileAttributes(buf) & FILE_ATTRIBUTE_DIRECTORY) { - const TCHAR* pBuf; - int nNumberOfFiles = 0; - int nTemp; - int fileOffset; - - // :NOTE: The first string in the buffer is the directory, followed by a - // NULL separated list of all files - - // fileOffset is the offset to the first file. - fileOffset = lstrlen(buf) + 1; - - // Count number of files - pBuf = buf + fileOffset; - while (*pBuf) { - pBuf += lstrlen(pBuf) + 1; - nNumberOfFiles++; - } - - // Allocate memory for a pointer array - if ((dat->files = (TCHAR* *)mir_alloc((nNumberOfFiles + 1) * sizeof(TCHAR*))) == NULL) - return; - - // Fill the array - pBuf = buf + fileOffset; - nTemp = 0; - while (*pBuf) - { - // Allocate space for path+filename - int cbFileNameLen = lstrlen(pBuf); - dat->files[nTemp] = (TCHAR*)mir_alloc(sizeof(TCHAR)*(fileOffset + cbFileNameLen + 1)); - - // Add path to filename and copy into array - CopyMemory(dat->files[nTemp], buf, (fileOffset-1)*sizeof(TCHAR)); - dat->files[nTemp][fileOffset-1] = '\\'; - _tcscpy(dat->files[nTemp] + fileOffset - (buf[fileOffset-2] == '\\'?1:0), pBuf); - - // Move pointers to next file... - pBuf += cbFileNameLen + 1; - nTemp++; - } - // Terminate array - dat->files[nNumberOfFiles] = NULL; - } - // ...the selection is a single file - else - { - if ((dat->files = (TCHAR **)mir_alloc(2 * sizeof(TCHAR*))) == NULL) // Leaks when aborted - return; - - dat->files[0] = mir_tstrdup(buf); - dat->files[1] = NULL; - } - - // Update dialog text with new file selection - SetFileListAndSizeControls(hwndDlg, dat); -} - -#define M_FILECHOOSEDONE (WM_USER+100) -void __cdecl ChooseFilesThread(void* param) -{ - HWND hwndDlg = (HWND)param; - TCHAR filter[128], *pfilter; - TCHAR* buf = (TCHAR*)mir_alloc(sizeof(TCHAR)*32767); - if (buf == NULL) - PostMessage(hwndDlg, M_FILECHOOSEDONE, 0, (LPARAM)(TCHAR*)NULL); - else { - OPENFILENAME ofn = {0}; - ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; - ofn.hwndOwner = hwndDlg; - lstrcpy(filter, TranslateT("All Files")); - lstrcat(filter, _T(" (*)")); - pfilter = filter + lstrlen(filter)+1; - lstrcpy(pfilter, _T("*")); - pfilter = filter + lstrlen(filter)+1; - pfilter[ 0 ] = '\0'; - ofn.lpstrFilter = filter; - ofn.lpstrFile = buf; *buf = 0; - ofn.nMaxFile = 32767; - ofn.Flags = OFN_NOCHANGEDIR | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_DONTADDTORECENT; - if (GetOpenFileName(&ofn)) - PostMessage(hwndDlg, M_FILECHOOSEDONE, 0, (LPARAM)buf); - else { - mir_free(buf); - PostMessage(hwndDlg, M_FILECHOOSEDONE, 0, (LPARAM)(TCHAR*)NULL); -} } } - -static BOOL CALLBACK ClipSiblingsChildEnumProc(HWND hwnd, LPARAM) -{ - SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE)|WS_CLIPSIBLINGS); - return TRUE; -} - -static WNDPROC OldSendEditProc; -static LRESULT CALLBACK SendEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch(msg) { - case WM_CHAR: - if (wParam == '\n' && GetKeyState(VK_CONTROL)&0x8000) { - PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); - return 0; - } - break; - case WM_SYSCHAR: - if ((wParam == 's' || wParam == 'S') && GetKeyState(VK_MENU)&0x8000) { - PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0); - return 0; - } - break; - } - return CallWindowProc(OldSendEditProc, hwnd, msg, wParam, lParam); -} - -INT_PTR CALLBACK DlgProcSendFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - struct FileDlgData *dat; - - dat = (struct FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - switch (msg) { - case WM_INITDIALOG: - { - struct FileSendData *fsd = (struct FileSendData*)lParam; - - dat = (struct FileDlgData*)mir_calloc(sizeof(struct FileDlgData)); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); - dat->hContact = fsd->hContact; - dat->send = 1; - dat->hPreshutdownEvent = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN); - dat->fs = NULL; - dat->dwTicks = GetTickCount(); - - TranslateDialogDefault(hwndDlg); - EnumChildWindows(hwndDlg, ClipSiblingsChildEnumProc, 0); - OldSendEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_MSG), GWLP_WNDPROC, (LONG_PTR)SendEditSubclassProc); - - Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_FILE); - Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User's Details")); - Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View User's History")); - Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User Menu")); - - EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); - - if (fsd->ppFiles != NULL && fsd->ppFiles[0] != NULL) { - int totalCount, i; - for (totalCount = 0;fsd->ppFiles[totalCount];totalCount++); - dat->files = (TCHAR**)mir_alloc(sizeof(TCHAR*)*(totalCount+1)); // Leaks - for (i=0;ifiles[i] = mir_tstrdup(fsd->ppFiles[i]); - dat->files[totalCount] = NULL; - SetFileListAndSizeControls(hwndDlg, dat); - } - { - char *szProto; - TCHAR* contactName = cli.pfnGetContactDisplayName(dat->hContact, 0); - SetDlgItemText(hwndDlg, IDC_TO, contactName); - - szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); - if (szProto) { - CONTACTINFO ci; - int hasName = 0; - char buf[128]; - ZeroMemory(&ci, sizeof(ci)); - - ci.cbSize = sizeof(ci); - ci.hContact = dat->hContact; - ci.szProto = szProto; - ci.dwFlag = CNF_UNIQUEID; - if ( !CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) { - switch(ci.type) { - case CNFT_ASCIIZ: - hasName = 1; - mir_snprintf(buf, SIZEOF(buf), "%s", ci.pszVal); - mir_free(ci.pszVal); - break; - case CNFT_DWORD: - hasName = 1; - mir_snprintf(buf, SIZEOF(buf), "%u", ci.dVal); - break; - } } - - if (hasName) - SetDlgItemTextA(hwndDlg, IDC_NAME, buf); - else - SetDlgItemText(hwndDlg, IDC_NAME, contactName); - } } - - if (fsd->ppFiles == NULL) { - EnableWindow(hwndDlg, FALSE); - dat->closeIfFileChooseCancelled = 1; - PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_CHOOSE, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDC_CHOOSE)); - } - return TRUE; - } - - case WM_MEASUREITEM: - return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); - - case WM_DRAWITEM: - { - LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; - if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) { - char *szProto; - - szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); - if (szProto) { - HICON hIcon = (HICON)CallProtoServiceInt(NULL,szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); - if (hIcon) { - DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); - DestroyIcon(hIcon); - } } } } - return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); - - case M_FILECHOOSEDONE: - if (lParam != 0) { - FilenameToFileList(hwndDlg, dat, (TCHAR*)lParam); - mir_free((TCHAR*)lParam); - dat->closeIfFileChooseCancelled = 0; - } - else if (dat->closeIfFileChooseCancelled) DestroyWindow(hwndDlg); - EnableWindow(hwndDlg, TRUE); - break; - - case WM_COMMAND: - if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) - break; - switch (LOWORD(wParam)) - { - case IDC_CHOOSE: - EnableWindow(hwndDlg, FALSE); - //GetOpenFileName() creates its own message queue which prevents any incoming events being processed - forkthread(ChooseFilesThread, 0, hwndDlg); - break; - case IDOK: - EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_MSG), FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_CHOOSE), FALSE); - - GetDlgItemText(hwndDlg, IDC_FILEDIR, dat->szSavePath, SIZEOF(dat->szSavePath)); - GetDlgItemText(hwndDlg, IDC_FILE, dat->szFilenames, SIZEOF(dat->szFilenames)); - GetDlgItemText(hwndDlg, IDC_MSG, dat->szMsg, SIZEOF(dat->szMsg)); - dat->hwndTransfer = FtMgr_AddTransfer(dat); - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); - DestroyWindow(hwndDlg); - return TRUE; - - case IDCANCEL: - DestroyWindow(hwndDlg); - return TRUE; - - case IDC_USERMENU: - { RECT rc; - HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)dat->hContact, 0); - GetWindowRect((HWND)lParam, &rc); - TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); - DestroyMenu(hMenu); - break; - } - case IDC_DETAILS: - CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)dat->hContact, 0); - return TRUE; - case IDC_HISTORY: - CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)dat->hContact, 0); - return TRUE; - } - break; - - case WM_DESTROY: - Window_FreeIcon_IcoLib(hwndDlg); - Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); - Button_FreeIcon_IcoLib(hwndDlg, IDC_HISTORY); - Button_FreeIcon_IcoLib(hwndDlg, IDC_USERMENU); - - if (dat) - FreeFileDlgData(dat); - - SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_MSG), GWLP_WNDPROC, (LONG_PTR)OldSendEditProc); - return TRUE; - } - return FALSE; -} diff --git a/src/modules/srfile/filexferdlg.cpp b/src/modules/srfile/filexferdlg.cpp deleted file mode 100644 index 3648e2306e..0000000000 --- a/src/modules/srfile/filexferdlg.cpp +++ /dev/null @@ -1,768 +0,0 @@ -/* - -Miranda IM: the free IM client for Microsoft* Windows* - -Copyright 2000-2010 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. -*/ -#include "..\..\core\commonheaders.h" -#include -#include "file.h" - -#define HM_RECVEVENT (WM_USER+10) - -static int CheckVirusScanned(HWND hwnd, struct FileDlgData *dat, int i) -{ - if (dat->send) return 1; - if (dat->fileVirusScanned == NULL) return 0; - if (dat->fileVirusScanned[i]) return 1; - if (DBGetContactSettingByte(NULL, "SRFile", "WarnBeforeOpening", 1) == 0) return 1; - return IDYES == MessageBox(hwnd, TranslateT("This file has not yet been scanned for viruses. Are you certain you want to open it?"), TranslateT("File Received"), MB_YESNO|MB_DEFBUTTON2); -} - -#define M_VIRUSSCANDONE (WM_USER+100) -struct virusscanthreadstartinfo { - TCHAR *szFile; - int returnCode; - HWND hwndReply; -}; - -TCHAR* PFTS_StringToTchar(int flags, const PROTOCHAR* s) -{ - if (flags & PFTS_UTF) - return Utf8DecodeW((char*)s); - else if (flags & PFTS_UNICODE) - return mir_tstrdup(s); - else - return mir_a2t((char*)s); -} - -int PFTS_CompareWithTchar(PROTOFILETRANSFERSTATUS* ft, const PROTOCHAR* s, TCHAR* r) -{ - if (ft->flags & PFTS_UTF) { - TCHAR* ts = Utf8DecodeW((char*)s); - int res = _tcscmp(ts, r); - mir_free(ts); - return res; - } - else if (ft->flags & PFTS_UNICODE) - return _tcscmp(s, r); - else { - TCHAR* ts = mir_a2t((char*)s); - int res = _tcscmp(ts, r); - mir_free(ts); - return res; - } -} - -static void SetOpenFileButtonStyle(HWND hwndButton, int enabled) -{ - EnableWindow(hwndButton, enabled); -} - -void FillSendData(FileDlgData* dat, DBEVENTINFO& dbei) -{ - dbei.cbSize = sizeof(dbei); - dbei.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); - dbei.eventType = EVENTTYPE_FILE; - dbei.flags = DBEF_SENT; - dbei.timestamp = time(NULL); - char *szFileNames = Utf8EncodeT(dat->szFilenames), *szMsg = Utf8EncodeT(dat->szMsg); - dbei.flags |= DBEF_UTF; - - dbei.cbBlob = sizeof(DWORD) + lstrlenA(szFileNames)+lstrlenA(szMsg)+2; - dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); - *(PDWORD)dbei.pBlob = 0; - lstrcpyA((char*)dbei.pBlob+sizeof(DWORD), szFileNames); - lstrcpyA((char*)dbei.pBlob+sizeof(DWORD)+lstrlenA(szFileNames)+1, szMsg); - - mir_free(szFileNames), mir_free(szMsg); - -} - -static void __cdecl RunVirusScannerThread(struct virusscanthreadstartinfo *info) -{ - PROCESS_INFORMATION pi; - STARTUPINFO si = {0}; - DBVARIANT dbv; - TCHAR szCmdLine[768]; - - if ( !DBGetContactSettingTString(NULL, "SRFile", "ScanCmdLine", &dbv)) - { - if (dbv.ptszVal[0]) - { - TCHAR *pszReplace; - si.cb = sizeof(si); - pszReplace = _tcsstr(dbv.ptszVal, _T("%f")); - if (pszReplace) - { - if (info->szFile[_tcslen(info->szFile) - 1] == '\\') - info->szFile[_tcslen(info->szFile) - 1] = '\0'; - *pszReplace = 0; - mir_sntprintf(szCmdLine, SIZEOF(szCmdLine), _T("%s\"%s\"%s"), dbv.ptszVal, info->szFile, pszReplace+2); - } - else lstrcpyn(szCmdLine, dbv.ptszVal, SIZEOF(szCmdLine)); - if (CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { - if (WaitForSingleObject(pi.hProcess, 3600*1000) == WAIT_OBJECT_0) - PostMessage(info->hwndReply, M_VIRUSSCANDONE, info->returnCode, 0); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - } - DBFreeVariant(&dbv); - } - mir_free(info->szFile); - mir_free(info); -} - -static void SetFilenameControls(HWND hwndDlg, struct FileDlgData *dat, PROTOFILETRANSFERSTATUS *fts) -{ - TCHAR msg[MAX_PATH]; - TCHAR *fnbuf = NULL, *fn = NULL; - SHFILEINFO shfi = {0}; - - if (fts->tszCurrentFile) { - fnbuf = mir_tstrdup(fts->tszCurrentFile); - if ((fn = _tcsrchr(fnbuf, '\\')) == NULL) - fn = fnbuf; - else fn++; - } - - if (dat->hIcon) DestroyIcon(dat->hIcon); dat->hIcon = NULL; - - if (fn && (fts->totalFiles > 1)) { - mir_sntprintf(msg, SIZEOF(msg), _T("%s: %s (%d %s %d)"), - cli.pfnGetContactDisplayName(fts->hContact, 0), - fn, fts->currentFileNumber+1, TranslateT("of"), fts->totalFiles); - - SHGetFileInfo(fn, FILE_ATTRIBUTE_DIRECTORY, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES|SHGFI_ICON|SHGFI_SMALLICON); - dat->hIcon = shfi.hIcon; - } - else if (fn) { - mir_sntprintf(msg, SIZEOF(msg), _T("%s: %s"), cli.pfnGetContactDisplayName(fts->hContact, 0), fn); - - SHGetFileInfo(fn, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES|SHGFI_ICON|SHGFI_SMALLICON); - dat->hIcon = shfi.hIcon; - } - else { - lstrcpyn(msg, cli.pfnGetContactDisplayName(fts->hContact, 0), SIZEOF(msg)); - HICON hIcon = LoadSkinIcon(SKINICON_OTHER_DOWNARROW); - dat->hIcon = CopyIcon(hIcon); - IcoLib_ReleaseIcon(hIcon, NULL); - } - - mir_free(fnbuf); - - SendDlgItemMessage(hwndDlg, IDC_FILEICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)dat->hIcon); - SetDlgItemText(hwndDlg, IDC_CONTACTNAME, msg); -} - -enum { FTS_TEXT, FTS_PROGRESS, FTS_OPEN }; -static void SetFtStatus(HWND hwndDlg, TCHAR *text, int mode) -{ - SetDlgItemText(hwndDlg, IDC_STATUS, TranslateTS(text)); - SetDlgItemText(hwndDlg, IDC_TRANSFERCOMPLETED, TranslateTS(text)); - - ShowWindow(GetDlgItem(hwndDlg, IDC_STATUS), (mode == FTS_TEXT)?SW_SHOW:SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_ALLFILESPROGRESS), (mode == FTS_PROGRESS)?SW_SHOW:SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_TRANSFERCOMPLETED), (mode == FTS_OPEN)?SW_SHOW:SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_FILEICON), (mode == FTS_OPEN)?SW_SHOW:SW_HIDE); -} - -static void HideProgressControls(HWND hwndDlg) -{ - RECT rc; - char buf[64]; - - GetWindowRect(GetDlgItem(hwndDlg, IDC_ALLPRECENTS), &rc); - MapWindowPoints(NULL, hwndDlg, (LPPOINT)&rc, 2); - SetWindowPos(hwndDlg, NULL, 0, 0, 100, rc.bottom+3, SWP_NOMOVE|SWP_NOZORDER); - ShowWindow(GetDlgItem(hwndDlg, IDC_ALLTRANSFERRED), SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_ALLSPEED), SW_HIDE); - - _strtime(buf); - SetDlgItemTextA(hwndDlg, IDC_ALLPRECENTS, buf); - - PostMessage(GetParent(hwndDlg), WM_FT_RESIZE, 0, (LPARAM)hwndDlg); -} - -static int FileTransferDlgResizer(HWND, LPARAM, UTILRESIZECONTROL *urc) -{ - switch(urc->wId) { - case IDC_CONTACTNAME: - case IDC_STATUS: - case IDC_ALLFILESPROGRESS: - case IDC_TRANSFERCOMPLETED: - return RD_ANCHORX_WIDTH|RD_ANCHORY_TOP; - case IDC_FRAME: - return RD_ANCHORX_WIDTH|RD_ANCHORY_BOTTOM; - case IDC_ALLPRECENTS: - case IDCANCEL: - case IDC_OPENFILE: - case IDC_OPENFOLDER: - return RD_ANCHORX_RIGHT|RD_ANCHORY_TOP; - - case IDC_ALLTRANSFERRED: - urc->rcItem.right = urc->rcItem.left + (urc->rcItem.right - urc->rcItem.left - urc->dlgOriginalSize.cx + urc->dlgNewSize.cx) / 3; - return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; - - case IDC_ALLSPEED: - urc->rcItem.right = urc->rcItem.right - urc->dlgOriginalSize.cx + urc->dlgNewSize.cx; - urc->rcItem.left = urc->rcItem.left + (urc->rcItem.right - urc->rcItem.left) / 3; - return RD_ANCHORX_CUSTOM|RD_ANCHORY_CUSTOM; - } - return RD_ANCHORX_LEFT|RD_ANCHORY_TOP; -} - -INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - FileDlgData *dat = (FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); - - switch (msg) - { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - dat = (FileDlgData*)lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); - dat->hNotifyEvent = HookEventMessage(ME_PROTO_ACK, hwndDlg, HM_RECVEVENT); - dat->transferStatus.currentFileNumber = -1; - if (dat->send) { - dat->fs = (HANDLE)CallContactService(dat->hContact, PSS_FILET, (WPARAM)dat->szMsg, (LPARAM)dat->files); - SetFtStatus(hwndDlg, LPGENT("Request sent, waiting for acceptance..."), FTS_TEXT); - SetOpenFileButtonStyle(GetDlgItem(hwndDlg, IDC_OPENFILE), 1); - dat->waitingForAcceptance = 1; - // hide "open" button since it may cause potential access violations... - ShowWindow(GetDlgItem(hwndDlg, IDC_OPENFILE), SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_OPENFOLDER), SW_HIDE); - } - else { //recv - CreateDirectoryTreeT(dat->szSavePath); - dat->fs = (HANDLE)CallContactService(dat->hContact, PSS_FILEALLOWT, (WPARAM)dat->fs, (LPARAM)dat->szSavePath); - dat->transferStatus.tszWorkingDir = mir_tstrdup(dat->szSavePath); - if (DBGetContactSettingByte(dat->hContact, "CList", "NotOnList", 0)) dat->resumeBehaviour = FILERESUME_ASK; - else dat->resumeBehaviour = DBGetContactSettingByte(NULL, "SRFile", "IfExists", FILERESUME_ASK); - SetFtStatus(hwndDlg, LPGENT("Waiting for connection..."), FTS_TEXT); - } - { - /* check we actually got an fs handle back from the protocol */ - if ( !dat->fs) { - SetFtStatus(hwndDlg, LPGENT("Unable to initiate transfer."), FTS_TEXT); - dat->waitingForAcceptance = 0; - } - } - { LOGFONT lf; - HFONT hFont; - hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_CONTACTNAME, WM_GETFONT, 0, 0); - GetObject(hFont, sizeof(lf), &lf); - lf.lfWeight = FW_BOLD; - hFont = CreateFontIndirect(&lf); - SendDlgItemMessage(hwndDlg, IDC_CONTACTNAME, WM_SETFONT, (WPARAM)hFont, 0); - } - - { SHFILEINFO shfi = {0}; - SHGetFileInfo(_T(""), FILE_ATTRIBUTE_DIRECTORY, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES|SHGFI_ICON|SHGFI_SMALLICON); - dat->hIconFolder = shfi.hIcon; - } - - dat->hIcon = NULL; - - SendDlgItemMessage(hwndDlg, IDC_CONTACT, BM_SETIMAGE, IMAGE_ICON, - (LPARAM)LoadSkinnedProtoIcon((char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0), ID_STATUS_ONLINE)); - SendDlgItemMessage(hwndDlg, IDC_CONTACT, BUTTONADDTOOLTIP, (WPARAM)LPGEN("Contact menu"), 0); - SendDlgItemMessage(hwndDlg, IDC_CONTACT, BUTTONSETASFLATBTN, TRUE, 0); - - Button_SetIcon_IcoLib(hwndDlg, IDC_OPENFILE, SKINICON_OTHER_DOWNARROW, LPGEN("Open...")); - SendDlgItemMessage(hwndDlg, IDC_OPENFILE, BUTTONSETASPUSHBTN, TRUE, 0); - - SendDlgItemMessage(hwndDlg, IDC_OPENFOLDER, BM_SETIMAGE, IMAGE_ICON, (LPARAM)dat->hIconFolder); - SendDlgItemMessage(hwndDlg, IDC_OPENFOLDER, BUTTONADDTOOLTIP, (WPARAM)LPGEN("Open folder"), 0); - SendDlgItemMessage(hwndDlg, IDC_OPENFOLDER, BUTTONSETASFLATBTN, TRUE, 0); - - Button_SetIcon_IcoLib(hwndDlg, IDCANCEL, SKINICON_OTHER_DELETE, LPGEN("Cancel")); - - SetDlgItemText(hwndDlg, IDC_CONTACTNAME, cli.pfnGetContactDisplayName(dat->hContact, 0)); - - if ( !dat->waitingForAcceptance) SetTimer(hwndDlg, 1, 1000, NULL); - return TRUE; - case WM_TIMER: - MoveMemory(dat->bytesRecvedHistory+1, dat->bytesRecvedHistory, sizeof(dat->bytesRecvedHistory)-sizeof(dat->bytesRecvedHistory[0])); - dat->bytesRecvedHistory[0] = dat->transferStatus.totalProgress; - if (dat->bytesRecvedHistorySize < SIZEOF(dat->bytesRecvedHistory)) - dat->bytesRecvedHistorySize++; - - { TCHAR szSpeed[32], szTime[32], szDisplay[96]; - SYSTEMTIME st; - ULARGE_INTEGER li; - FILETIME ft; - - GetSensiblyFormattedSize((dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1])/dat->bytesRecvedHistorySize, szSpeed, SIZEOF(szSpeed), 0, 1, NULL); - if (dat->bytesRecvedHistory[0] == dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]) - lstrcpy(szTime, _T("??:??:??")); - else { - li.QuadPart = BIGI(10000000)*(dat->transferStatus.currentFileSize-dat->transferStatus.currentFileProgress)*dat->bytesRecvedHistorySize/(dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]); - ft.dwHighDateTime = li.HighPart; ft.dwLowDateTime = li.LowPart; - FileTimeToSystemTime(&ft, &st); - GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT|TIME_NOTIMEMARKER, &st, NULL, szTime, SIZEOF(szTime)); - } - if (dat->bytesRecvedHistory[0] != dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]) { - li.QuadPart = BIGI(10000000)*(dat->transferStatus.totalBytes-dat->transferStatus.totalProgress)*dat->bytesRecvedHistorySize/(dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]); - ft.dwHighDateTime = li.HighPart; ft.dwLowDateTime = li.LowPart; - FileTimeToSystemTime(&ft, &st); - GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT|TIME_NOTIMEMARKER, &st, NULL, szTime, SIZEOF(szTime)); - } - - mir_sntprintf(szDisplay, SIZEOF(szDisplay), _T("%s/%s (%s %s)"), szSpeed, TranslateT("sec"), szTime, TranslateT("remaining")); - SetDlgItemText(hwndDlg, IDC_ALLSPEED, szDisplay); - } - break; - - case WM_MEASUREITEM: - return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam); - - case WM_DRAWITEM: - return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam); - - case WM_FT_CLEANUP: - if ( !dat->fs) - { - PostMessage(GetParent(hwndDlg), WM_FT_REMOVE, 0, (LPARAM)hwndDlg); - DestroyWindow(hwndDlg); - } - break; - - case WM_COMMAND: - if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) - break; - - switch (LOWORD(wParam)) - { - case IDOK: - case IDCANCEL: - PostMessage(GetParent(hwndDlg), WM_FT_REMOVE, 0, (LPARAM)hwndDlg); - DestroyWindow(hwndDlg); - break; - - case IDC_CONTACT: - { RECT rc; - HMENU hMenu = (HMENU)CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)dat->hContact, 0); - GetWindowRect((HWND)lParam, &rc); - TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); - DestroyMenu(hMenu); - break; - } - - case IDC_TRANSFERCOMPLETED: - if (dat->transferStatus.currentFileNumber <= 1 && CheckVirusScanned(hwndDlg, dat, 0)) - { - ShellExecute(NULL, NULL, dat->files[0], NULL, NULL, SW_SHOW); - break; - } - - case IDC_OPENFOLDER: - if (dat) - { - TCHAR* path = dat->transferStatus.tszWorkingDir; - if ( !path || !path[0]) - { - path = NEWTSTR_ALLOCA(dat->transferStatus.tszCurrentFile); - TCHAR* p = _tcsrchr(path, '\\'); if (p) *p = 0; - } - - if (path) ShellExecute(NULL, _T("open"), path, NULL, NULL, SW_SHOW); - } - break; - - case IDC_OPENFILE: - { - TCHAR **files; - HMENU hMenu; - RECT rc; - int ret; - - if (dat->send) - if (dat->files == NULL) - files = dat->transferStatus.ptszFiles; - else - files = dat->files; - else - files = dat->files; - - hMenu = CreatePopupMenu(); - AppendMenu(hMenu, MF_STRING, 1, TranslateT("Open folder")); - AppendMenu(hMenu, MF_SEPARATOR, 0, 0); - - if (files && *files) - { - int i, limit; - TCHAR *pszFilename, *pszNewFileName; - - if (dat->send) - limit = dat->transferStatus.totalFiles; - else - limit = dat->transferStatus.currentFileNumber; - - // Loop over all transfered files and add them to the menu - for (i=0; i < limit; i++) { - pszFilename = _tcsrchr(files[i], '\\'); - if (pszFilename == NULL) - pszFilename = files[i]; - else - pszFilename++; - { - if (pszFilename) { - size_t cbFileNameLen = _tcslen(pszFilename); - - pszNewFileName = (TCHAR*)mir_alloc(cbFileNameLen*2*sizeof(TCHAR)); - TCHAR *p = pszNewFileName; - for (size_t pszlen = 0; pszlen < cbFileNameLen; pszlen++) { - *p++=pszFilename[pszlen]; - if (pszFilename[pszlen] == '&') - *p++='&'; - } - *p = '\0'; - AppendMenu(hMenu, MF_STRING, i+10, pszNewFileName); - mir_free(pszNewFileName); - } - } - } - } - - GetWindowRect((HWND)lParam, &rc); - CheckDlgButton(hwndDlg, IDC_OPENFILE, BST_CHECKED); - ret = TrackPopupMenu(hMenu, TPM_RETURNCMD|TPM_RIGHTALIGN, rc.right, rc.bottom, 0, hwndDlg, NULL); - CheckDlgButton(hwndDlg, IDC_OPENFILE, BST_UNCHECKED); - DestroyMenu(hMenu); - - if (ret == 1) - { - TCHAR* path = dat->transferStatus.tszWorkingDir; - if ( !path || !path[0]) - { - path = NEWTSTR_ALLOCA(dat->transferStatus.tszCurrentFile); - TCHAR* p = _tcsrchr(path, '\\'); if (p) *p = 0; - } - - if (path) ShellExecute(NULL, _T("open"), path, NULL, NULL, SW_SHOW); - } - else if (ret && CheckVirusScanned(hwndDlg, dat, ret)) - ShellExecute(NULL, NULL, files[ret-10], NULL, NULL, SW_SHOW); - - break; - } - } - break; - case M_FILEEXISTSDLGREPLY: - { PROTOFILERESUME *pfr = (PROTOFILERESUME*)lParam; - TCHAR *szOriginalFilename = (TCHAR*)wParam; - char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); - - EnableWindow(hwndDlg, TRUE); - switch(pfr->action) { - case FILERESUME_CANCEL: - if (dat->fs) CallContactService(dat->hContact, PSS_FILECANCEL, (WPARAM)dat->fs, 0); - dat->fs = NULL; - mir_free(szOriginalFilename); - if (pfr->szFilename) mir_free((char*)pfr->szFilename); - mir_free(pfr); - return 0; - case FILERESUME_RESUMEALL: - case FILERESUME_OVERWRITEALL: - dat->resumeBehaviour = pfr->action; - pfr->action&=~FILERESUMEF_ALL; - break; - case FILERESUME_RENAMEALL: - pfr->action = FILERESUME_RENAME; - { TCHAR *pszExtension, *pszFilename; - int i; - if ((pszFilename = _tcsrchr(szOriginalFilename, '\\')) == NULL) pszFilename = szOriginalFilename; - if ((pszExtension = _tcsrchr(pszFilename+1, '.')) == NULL) pszExtension = pszFilename+lstrlen(pszFilename); - if (pfr->szFilename) mir_free((TCHAR*)pfr->szFilename); - pfr->szFilename = (TCHAR*)mir_alloc(sizeof(TCHAR)*((pszExtension-szOriginalFilename)+21+lstrlen(pszExtension))); - for (i = 1;;i++) { - _stprintf((TCHAR*)pfr->szFilename, _T("%.*s (%u)%s"), pszExtension-szOriginalFilename, szOriginalFilename, i, pszExtension); - if (_taccess(pfr->szFilename, 0) != 0) - break; - } - } - break; - } - mir_free(szOriginalFilename); - CallProtoServiceInt(NULL,szProto, PS_FILERESUMET, (WPARAM)dat->fs, (LPARAM)pfr); - if (pfr->szFilename) mir_free((char*)pfr->szFilename); - mir_free(pfr); - break; - } - case HM_RECVEVENT: - { ACKDATA *ack = (ACKDATA*)lParam; - if (ack->hProcess != dat->fs) break; /* icq abuses this sometimes */ - if (ack->hContact != dat->hContact) break; - if (ack->type != ACKTYPE_FILE) break; - - if (dat->waitingForAcceptance) { - SetTimer(hwndDlg, 1, 1000, NULL); - dat->waitingForAcceptance = 0; - } - switch(ack->result) { - case ACKRESULT_SENTREQUEST: SetFtStatus(hwndDlg, LPGENT("Decision sent"), 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_CONNECTED: SetFtStatus(hwndDlg, LPGENT("Connected"), FTS_TEXT); break; - case ACKRESULT_LISTENING: SetFtStatus(hwndDlg, LPGENT("Waiting for connection..."), FTS_TEXT); break; - case ACKRESULT_INITIALISING: SetFtStatus(hwndDlg, LPGENT("Initialising..."), FTS_TEXT); break; - case ACKRESULT_NEXTFILE: - SetFtStatus(hwndDlg, LPGENT("Moving to next file..."), FTS_TEXT); - SetDlgItemTextA(hwndDlg, IDC_FILENAME, ""); - if (dat->transferStatus.currentFileNumber == 1 && dat->transferStatus.totalFiles>1 && !dat->send) - SetOpenFileButtonStyle(GetDlgItem(hwndDlg, IDC_OPENFILE), 1); - if (dat->transferStatus.currentFileNumber != -1 && dat->files && !dat->send && DBGetContactSettingByte(NULL, "SRFile", "UseScanner", VIRUSSCAN_DISABLE) == VIRUSSCAN_DURINGDL) { - if (GetFileAttributes(dat->files[dat->transferStatus.currentFileNumber])&FILE_ATTRIBUTE_DIRECTORY) - PostMessage(hwndDlg, M_VIRUSSCANDONE, dat->transferStatus.currentFileNumber, 0); - else { - virusscanthreadstartinfo *vstsi; - vstsi = (struct virusscanthreadstartinfo*)mir_alloc(sizeof(struct virusscanthreadstartinfo)); - vstsi->hwndReply = hwndDlg; - vstsi->szFile = mir_tstrdup(dat->files[dat->transferStatus.currentFileNumber]); - vstsi->returnCode = dat->transferStatus.currentFileNumber; - forkthread((void (*)(void*))RunVirusScannerThread, 0, vstsi); - } - } - break; - case ACKRESULT_FILERESUME: - { - UpdateProtoFileTransferStatus(&dat->transferStatus, (PROTOFILETRANSFERSTATUS*)ack->lParam); - PROTOFILETRANSFERSTATUS *fts = &dat->transferStatus; - - SetFilenameControls(hwndDlg, dat, fts); - int res = _taccess(fts->tszCurrentFile, 0); - if (res) - break; - - SetFtStatus(hwndDlg, LPGENT("File already exists"), FTS_TEXT); - if (dat->resumeBehaviour == FILERESUME_ASK) { - TDlgProcFileExistsParam param = { hwndDlg, fts }; - ShowWindow(hwndDlg, SW_SHOWNORMAL); - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILEEXISTS), hwndDlg, DlgProcFileExists, (LPARAM)¶m); - EnableWindow(hwndDlg, FALSE); - } - else { - PROTOFILERESUME *pfr; - pfr = (PROTOFILERESUME*)mir_alloc(sizeof(PROTOFILERESUME)); - pfr->action = dat->resumeBehaviour; - pfr->szFilename = NULL; - PostMessage(hwndDlg, M_FILEEXISTSDLGREPLY, (WPARAM)mir_tstrdup(fts->tszCurrentFile), (LPARAM)pfr); - } - SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, 1); - return TRUE; - } - case ACKRESULT_DATA: - { - PROTOFILETRANSFERSTATUS *fts = (PROTOFILETRANSFERSTATUS*)ack->lParam; - TCHAR str[64], str2[64], szSizeDone[32], szSizeTotal[32];//, *contactName; - int units; - - if (dat->fileVirusScanned == NULL) - dat->fileVirusScanned = (int*)mir_calloc(sizeof(int) * fts->totalFiles); - - // This needs to be here - otherwise we get holes in the files array - if ( !dat->send) { - if (dat->files == NULL) - dat->files = (TCHAR**)mir_calloc((fts->totalFiles + 1) * sizeof(TCHAR*)); - if (fts->currentFileNumber < fts->totalFiles && dat->files[fts->currentFileNumber] == NULL) - dat->files[fts->currentFileNumber] = PFTS_StringToTchar(fts->flags, fts->tszCurrentFile); - } - - /* HACK: for 0.3.3, limit updates to around 1.1 ack per second */ - if (fts->totalProgress != fts->totalBytes && GetTickCount() < (dat->dwTicks + 650)) break; // the last update was less than a second ago! - dat->dwTicks = GetTickCount(); - - // Update local transfer status with data from protocol - UpdateProtoFileTransferStatus(&dat->transferStatus, fts); - fts = &dat->transferStatus; - - bool firstTime = false; - if ((GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_ALLFILESPROGRESS), GWL_STYLE) & WS_VISIBLE) == 0) - { - SetFtStatus(hwndDlg, (fts->flags & PFTS_SENDING) ? LPGENT("Sending...") : LPGENT("Receiving..."), FTS_PROGRESS); - SetFilenameControls(hwndDlg, dat, fts); - firstTime = true; - } - - const unsigned long lastPos = SendDlgItemMessage(hwndDlg, IDC_ALLFILESPROGRESS, PBM_GETPOS, 0, 0); - const unsigned long nextPos = fts->totalBytes ? (BIGI(100) * fts->totalProgress / fts->totalBytes) : 0; - if (lastPos != nextPos || firstTime) - { - SendDlgItemMessage(hwndDlg, IDC_ALLFILESPROGRESS, PBM_SETPOS, nextPos, 0); - mir_sntprintf(str, SIZEOF(str), _T("%u%%"), nextPos); - SetDlgItemText(hwndDlg, IDC_ALLPRECENTS, str); - } - - GetSensiblyFormattedSize(fts->totalBytes, szSizeTotal, SIZEOF(szSizeTotal), 0, 1, &units); - GetSensiblyFormattedSize(fts->totalProgress, szSizeDone, SIZEOF(szSizeDone), units, 0, NULL); - mir_sntprintf(str, SIZEOF(str), _T("%s/%s"), szSizeDone, szSizeTotal); - str2[0] = 0; - GetDlgItemText(hwndDlg, IDC_ALLTRANSFERRED, str2, SIZEOF(str2)); - if (_tcscmp(str, str2)) SetDlgItemText(hwndDlg, IDC_ALLTRANSFERRED, str); - break; - } - - case ACKRESULT_SUCCESS: - case ACKRESULT_FAILED: - case ACKRESULT_DENIED: - { - - HideProgressControls(hwndDlg); - KillTimer(hwndDlg, 1); - if ( !dat->send) - SetOpenFileButtonStyle(GetDlgItem(hwndDlg, IDC_OPENFILE), 1); - SetDlgItemText(hwndDlg, IDCANCEL, TranslateT("Close")); - if (dat->hNotifyEvent) - UnhookEvent(dat->hNotifyEvent); - dat->hNotifyEvent = NULL; - - if (ack->result == ACKRESULT_DENIED) - { - dat->fs = NULL; /* protocol will free structure */ - SkinPlaySound("FileDenied"); - SetFtStatus(hwndDlg, LPGENT("File transfer denied"), FTS_TEXT); - } else if (ack->result == ACKRESULT_FAILED) - { - dat->fs = NULL; /* protocol will free structure */ - SkinPlaySound("FileFailed"); - SetFtStatus(hwndDlg, LPGENT("File transfer failed"), FTS_TEXT); - } else { - SkinPlaySound("FileDone"); - if (dat->send) - { - dat->fs = NULL; /* protocol will free structure */ - SetFtStatus(hwndDlg, LPGENT("Transfer completed."), FTS_TEXT); - - DBEVENTINFO dbei = {0}; - FillSendData(dat, dbei); - CallService(MS_DB_EVENT_ADD, (WPARAM)dat->hContact, (LPARAM)&dbei); - if (dbei.pBlob) - mir_free(dbei.pBlob); - dat->files = NULL; //protocol library frees this - - } else { - SetFtStatus(hwndDlg, - (dat->transferStatus.totalFiles == 1) ? - LPGENT("Transfer completed, open file.") : - LPGENT("Transfer completed, open folder."), - FTS_OPEN); - - int useScanner = DBGetContactSettingByte(NULL, "SRFile", "UseScanner", VIRUSSCAN_DISABLE); - if (useScanner != VIRUSSCAN_DISABLE) { - struct virusscanthreadstartinfo *vstsi; - vstsi = (struct virusscanthreadstartinfo*)mir_alloc(sizeof(struct virusscanthreadstartinfo)); - vstsi->hwndReply = hwndDlg; - if (useScanner == VIRUSSCAN_DURINGDL) { - vstsi->returnCode = dat->transferStatus.currentFileNumber; - if (GetFileAttributes(dat->files[dat->transferStatus.currentFileNumber])&FILE_ATTRIBUTE_DIRECTORY) { - PostMessage(hwndDlg, M_VIRUSSCANDONE, vstsi->returnCode, 0); - mir_free(vstsi); - vstsi = NULL; - } - else vstsi->szFile = mir_tstrdup(dat->files[dat->transferStatus.currentFileNumber]); - } - else { - vstsi->szFile = mir_tstrdup(dat->transferStatus.tszWorkingDir); - vstsi->returnCode = -1; - } - SetFtStatus(hwndDlg, LPGENT("Scanning for viruses..."), FTS_TEXT); - if (vstsi) - forkthread((void (*)(void*))RunVirusScannerThread, 0, vstsi); - } - else dat->fs = NULL; /* protocol will free structure */ - - dat->transferStatus.currentFileNumber = dat->transferStatus.totalFiles; - } // else dat->send - - } // else ack->result - - PostMessage(GetParent(hwndDlg), WM_FT_COMPLETED, ack->result, (LPARAM)hwndDlg); - break; - } - break; - } // switch ack->result - } break; // case HM_RECVEVENT - case M_VIRUSSCANDONE: - { int done = 1, i; - if ((int)wParam == -1) { - for (i=0;itransferStatus.totalFiles;i++) dat->fileVirusScanned[i] = 1; - } - else { - dat->fileVirusScanned[wParam] = 1; - for (i=0;itransferStatus.totalFiles;i++) if ( !dat->fileVirusScanned[i]) {done = 0; break;} - } - if (done) - { - dat->fs = NULL; /* protocol will free structure */ - SetFtStatus(hwndDlg, LPGENT("Transfer and virus scan complete"), FTS_TEXT); - } - break; - } - case WM_SIZE: - { - UTILRESIZEDIALOG urd = {0}; - urd.cbSize = sizeof(urd); - urd.hwndDlg = hwndDlg; - urd.hInstance = hInst; - urd.lpTemplate = MAKEINTRESOURCEA(IDD_FILETRANSFERINFO); - urd.pfnResizer = FileTransferDlgResizer; - CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd); - - RedrawWindow(GetDlgItem(hwndDlg, IDC_ALLTRANSFERRED), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); - RedrawWindow(GetDlgItem(hwndDlg, IDC_ALLSPEED), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); - RedrawWindow(GetDlgItem(hwndDlg, IDC_CONTACTNAME), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); - RedrawWindow(GetDlgItem(hwndDlg, IDC_STATUS), NULL, NULL, RDW_INVALIDATE|RDW_NOERASE); - break; - } - case WM_DESTROY: - KillTimer(hwndDlg, 1); - - HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_CONTACTNAME, WM_GETFONT, 0, 0); - DeleteObject(hFont); - - Button_FreeIcon_IcoLib(hwndDlg, IDC_CONTACT); - Button_FreeIcon_IcoLib(hwndDlg, IDC_OPENFILE); - Button_FreeIcon_IcoLib(hwndDlg, IDCANCEL); - - FreeFileDlgData(dat); - break; - } - return FALSE; -} - -void FreeFileDlgData(FileDlgData* dat) -{ - if (dat->fs) - CallContactService(dat->hContact, PSS_FILECANCEL, (WPARAM)dat->fs, 0); - dat->fs = NULL; - - if (dat->hPreshutdownEvent) UnhookEvent(dat->hPreshutdownEvent); - if (dat->hNotifyEvent) UnhookEvent(dat->hNotifyEvent); - dat->hNotifyEvent = NULL; - - FreeProtoFileTransferStatus(&dat->transferStatus); - FreeFilesMatrix(&dat->files); - - mir_free(dat->fileVirusScanned); - Safe_DestroyIcon(dat->hIcon); - Safe_DestroyIcon(dat->hIconFolder); - mir_free(dat); -} diff --git a/src/modules/srfile/ftmanager.cpp b/src/modules/srfile/ftmanager.cpp deleted file mode 100644 index 567e038fc6..0000000000 --- a/src/modules/srfile/ftmanager.cpp +++ /dev/null @@ -1,592 +0,0 @@ -/* - -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. -*/ -#include "..\..\core\commonheaders.h" -#include "file.h" - -static HWND hwndFtMgr = NULL; - -struct TFtMgrData -{ - HWND hwndIncoming; - HWND hwndOutgoing; - - HANDLE hhkPreshutdown; - TBPFLAG errorState; -}; - - -#define M_CALCPROGRESS (WM_USER + 200) -struct TFtProgressData -{ - unsigned int init, run, scan; - unsigned __int64 totalBytes, totalProgress; -}; - -struct TLayoutWindowInfo -{ - HWND hwnd; - RECT rc; -}; - -struct TLayoutWindowList -{ - struct TLayoutWindowInfo **items; - int realCount, limit, increment; - FSortFunc sortFunc; -}; - -struct TFtPageData -{ - struct TLayoutWindowList *wnds; - int runningCount; - int height, dataHeight, scrollPos; -}; - -static void LayoutTransfers(HWND hwnd, struct TFtPageData *dat) -{ - int top = 0; - RECT rc; - GetClientRect(hwnd, &rc); - - dat->scrollPos = GetScrollPos(hwnd, SB_VERT); - dat->height = rc.bottom - rc.top; - - if (dat->wnds->realCount) - { - int i; - HDWP hdwp; - - hdwp = BeginDeferWindowPos(dat->wnds->realCount); - top -= dat->scrollPos; - for (i=0; i < dat->wnds->realCount; ++i) - { - int height = dat->wnds->items[i]->rc.bottom - dat->wnds->items[i]->rc.top; - hdwp = DeferWindowPos(hdwp, dat->wnds->items[i]->hwnd, NULL, 0, top, rc.right, height, SWP_NOZORDER); - top += height; - } - top += dat->scrollPos; - EndDeferWindowPos(hdwp); - } - - dat->dataHeight = top; - - { - SCROLLINFO si = {0}; - si.cbSize = sizeof(si); - si.fMask = SIF_DISABLENOSCROLL|SIF_PAGE|SIF_RANGE; - si.nPage = dat->height; - si.nMin = 0; - si.nMax = dat->dataHeight; - SetScrollInfo(hwnd, SB_VERT, &si, TRUE); - } -} - -static INT_PTR CALLBACK FtMgrPageDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - struct TFtPageData *dat = (struct TFtPageData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); - - switch (msg) - { - case WM_INITDIALOG: - { - // Force scrollbar visibility - SCROLLINFO si = {0}; - si.cbSize = sizeof(si); - si.fMask = SIF_DISABLENOSCROLL; - SetScrollInfo(hwnd, SB_VERT, &si, TRUE); - - dat = (struct TFtPageData *)mir_alloc(sizeof(struct TFtPageData)); - dat->wnds = (struct TLayoutWindowList *)List_Create(0, 1); - dat->scrollPos = 0; - dat->runningCount = 0; - SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)dat); - break; - } - - case WM_FT_ADD: - { - struct TLayoutWindowInfo *wnd = (struct TLayoutWindowInfo *)mir_alloc(sizeof(struct TLayoutWindowInfo)); - wnd->hwnd = (HWND)lParam; - GetWindowRect(wnd->hwnd, &wnd->rc); - List_Insert((SortedList *)dat->wnds, wnd, dat->wnds->realCount); - LayoutTransfers(hwnd, dat); - dat->runningCount++; - PostMessage(GetParent(hwnd), WM_TIMER, 1, NULL); - break; - } - - case WM_FT_RESIZE: - { - int i; - for (i=0; i < dat->wnds->realCount; ++i) - if (dat->wnds->items[i]->hwnd == (HWND)lParam) - { - GetWindowRect(dat->wnds->items[i]->hwnd, &dat->wnds->items[i]->rc); - break; - } - LayoutTransfers(hwnd, dat); - break; - } - - case WM_FT_REMOVE: - { - int i; - for (i=0; i < dat->wnds->realCount; ++i) - if (dat->wnds->items[i]->hwnd == (HWND)lParam) - { - mir_free(dat->wnds->items[i]); - List_Remove((SortedList *)dat->wnds, i); - break; - } - LayoutTransfers(hwnd, dat); - break; - } - - case WM_FT_COMPLETED: - { //wParam: { ACKRESULT_SUCCESS | ACKRESULT_FAILED | ACKRESULT_DENIED } - dat->runningCount--; - int i=0; - while (i < dat->wnds->realCount) - { - // no error when canceling (WM_FT_REMOVE is send first, check if hwnd is still registered) - if (dat->wnds->items[i]->hwnd == (HWND)lParam) - { - SendMessage(GetParent(hwnd), WM_TIMER, 1, (LPARAM)wParam); - break; - } - ++i; - } - if (i == dat->wnds->realCount) - PostMessage(GetParent(hwnd), WM_TIMER, 1, NULL); - - if(dat->runningCount == 0 && (int)wParam == ACKRESULT_SUCCESS && DBGetContactSettingByte(NULL, "SRFile", "AutoClose", 0)) - ShowWindow(hwndFtMgr, SW_HIDE); - break; - } - - case WM_FT_CLEANUP: - { - int i; - for (i=0; i < dat->wnds->realCount; ++i) - SendMessage(dat->wnds->items[i]->hwnd, WM_FT_CLEANUP, wParam, lParam); - break; - } - - case WM_SIZE: - { - LayoutTransfers(hwnd, dat); - break; - } - - case WM_MOUSEWHEEL: - { - int zDelta = GET_WHEEL_DELTA_WPARAM(wParam); - if (zDelta) - { - int i, nScrollLines = 0; - SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, (void*)&nScrollLines, 0); - for (i=0; i < (nScrollLines + 1) / 2; i++) - SendMessage(hwnd, WM_VSCROLL, (zDelta < 0) ? SB_LINEDOWN : SB_LINEUP, 0); - } - - SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0); - return TRUE; - } - - case WM_VSCROLL: - { - int pos = dat->scrollPos; - switch (LOWORD(wParam)) - { - case SB_LINEDOWN: - pos += 15; - break; - case SB_LINEUP: - pos -= 15; - break; - case SB_PAGEDOWN: - pos += dat->height - 10; - break; - case SB_PAGEUP: - pos -= dat->height - 10; - break; - case SB_THUMBTRACK: - pos = HIWORD(wParam); - break; - } - - if (pos > dat->dataHeight - dat->height) pos = dat->dataHeight - dat->height; - if (pos < 0) pos = 0; - - if (dat->scrollPos != pos) - { - ScrollWindow(hwnd, 0, dat->scrollPos - pos, NULL, NULL); - SetScrollPos(hwnd, SB_VERT, pos, TRUE); - dat->scrollPos = pos; - } - break; - } - - case M_PRESHUTDOWN: - { - int i; - for (i=0; i < dat->wnds->realCount; ++i) - PostMessage(dat->wnds->items[i]->hwnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), 0); - break; - } - - case WM_DESTROY: - { - int i; - for (i=0; i < dat->wnds->realCount; ++i) - mir_free(dat->wnds->items[i]); - List_Destroy((SortedList *)dat->wnds); - mir_free(dat->wnds); - mir_free(dat); - break; - } - - case M_CALCPROGRESS: - { - int i; - TFtProgressData * prg = (TFtProgressData *)wParam; - for (i=0; i < dat->wnds->realCount; ++i) - { - struct FileDlgData *trdat = (struct FileDlgData *)GetWindowLongPtr(dat->wnds->items[i]->hwnd, GWLP_USERDATA); - if (trdat->transferStatus.totalBytes && trdat->fs && !trdat->send && (trdat->transferStatus.totalBytes == trdat->transferStatus.totalProgress)) - { - prg->scan++; - } else if (trdat->transferStatus.totalBytes && trdat->fs) - { // in progress - prg->run++; - prg->totalBytes += trdat->transferStatus.totalBytes; - prg->totalProgress += trdat->transferStatus.totalProgress; - } else if (trdat->fs) - { // starting - prg->init++; - } - - } - } - } - - return FALSE; -} - -static INT_PTR CALLBACK FtMgrDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - struct TFtMgrData *dat = (struct TFtMgrData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); - - switch (msg) - { - case WM_INITDIALOG: - { - TCITEM tci = {0}; - HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); - - TranslateDialogDefault(hwnd); - Window_SetIcon_IcoLib(hwnd, SKINICON_EVENT_FILE); - - dat = (struct TFtMgrData *)mir_calloc(sizeof(struct TFtMgrData)); - - SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)dat); - - dat->hhkPreshutdown = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwnd, M_PRESHUTDOWN); - - dat->hwndIncoming = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc); - dat->hwndOutgoing = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc); - ShowWindow(dat->hwndIncoming, SW_SHOW); - - tci.mask = TCIF_PARAM|TCIF_TEXT; - tci.pszText = TranslateT("Incoming"); - tci.lParam = (LPARAM)dat->hwndIncoming; - TabCtrl_InsertItem(hwndTab, 0, &tci); - tci.pszText = TranslateT("Outgoing"); - tci.lParam = (LPARAM)dat->hwndOutgoing; - TabCtrl_InsertItem(hwndTab, 1, &tci); - - // Utils_RestoreWindowPosition(hwnd, NULL, "SRFile", "FtMgrDlg_"); - SAVEWINDOWPOS swp; - swp.hwnd = hwnd; swp.hContact = NULL; swp.szModule = "SRFile"; swp.szNamePrefix = "FtMgrDlg_"; - CallService(MS_UTILS_RESTOREWINDOWPOSITION, RWPF_NOACTIVATE, (LPARAM)&swp); - - // Fall through to setup initial placement - } - case WM_SIZE: - { - RECT rc, rcButton; - HDWP hdwp; - HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); - - GetWindowRect(GetDlgItem(hwnd, IDCANCEL), &rcButton); - OffsetRect(&rcButton, -rcButton.left, -rcButton.top); - - GetClientRect(hwnd, &rc); - InflateRect(&rc, -6, -6); - - hdwp = BeginDeferWindowPos(3); - - hdwp = DeferWindowPos(hdwp, GetDlgItem(hwnd, IDC_CLEAR), NULL, rc.left, rc.bottom-rcButton.bottom, 0, 0, SWP_NOZORDER|SWP_NOSIZE); - hdwp = DeferWindowPos(hdwp, GetDlgItem(hwnd, IDCANCEL), NULL, rc.right-rcButton.right, rc.bottom-rcButton.bottom, 0, 0, SWP_NOZORDER|SWP_NOSIZE); - - rc.bottom -= rcButton.bottom + 5; - - hdwp = DeferWindowPos(hdwp, hwndTab, NULL, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, SWP_NOZORDER); - - EndDeferWindowPos(hdwp); - - GetWindowRect(hwndTab, &rc); - MapWindowPoints(NULL, hwnd, (LPPOINT)&rc, 2); - TabCtrl_AdjustRect(hwndTab, FALSE, &rc); - InflateRect(&rc, -5, -5); - - hdwp = BeginDeferWindowPos(2); - - hdwp = DeferWindowPos(hdwp, dat->hwndIncoming, HWND_TOP, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 0); - hdwp = DeferWindowPos(hdwp, dat->hwndOutgoing, HWND_TOP, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 0); - - EndDeferWindowPos(hdwp); - - break; - } - - case WM_MOUSEWHEEL: - { - if (IsWindowVisible(dat->hwndIncoming)) SendMessage(dat->hwndIncoming, msg, wParam, lParam); - if (IsWindowVisible(dat->hwndOutgoing)) SendMessage(dat->hwndOutgoing, msg, wParam, lParam); - break; - } - - case WM_FT_SELECTPAGE: - { - TCITEM tci = {0}; - HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); - - if (TabCtrl_GetCurSel(hwndTab) == (int)wParam) break; - - tci.mask = TCIF_PARAM; - - TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); - ShowWindow((HWND)tci.lParam, SW_HIDE); - - TabCtrl_SetCurSel(hwndTab, wParam); - - TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); - ShowWindow((HWND)tci.lParam, SW_SHOW); - - break; - } - - case WM_GETMINMAXINFO: - { - LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam; - lpmmi->ptMinTrackSize.x = 300; - lpmmi->ptMinTrackSize.y = 400; - return 0; - } - - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDCANCEL: - PostMessage(hwnd, WM_CLOSE , 0, 0); - break; - - case IDC_CLEAR: - PostMessage(dat->hwndIncoming, WM_FT_CLEANUP, 0, 0); - PostMessage(dat->hwndOutgoing, WM_FT_CLEANUP, 0, 0); - break; - } - break; - - case WM_NOTIFY: - { - switch (((LPNMHDR)lParam)->idFrom) - { - case IDC_TABS: - { - HWND hwndTab = GetDlgItem(hwnd, IDC_TABS); - switch (((LPNMHDR)lParam)->code) - { - case TCN_SELCHANGING: - { - TCITEM tci = {0}; - tci.mask = TCIF_PARAM; - TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); - ShowWindow((HWND)tci.lParam, SW_HIDE); - break; - } - - case TCN_SELCHANGE: - { - TCITEM tci = {0}; - tci.mask = TCIF_PARAM; - TabCtrl_GetItem(hwndTab, TabCtrl_GetCurSel(hwndTab), &tci); - ShowWindow((HWND)tci.lParam, SW_SHOW); - break; - } - } - break; - } - } - break; - } - - case M_PRESHUTDOWN: - SendMessage(dat->hwndIncoming, M_PRESHUTDOWN, 0, 0); - SendMessage(dat->hwndOutgoing, M_PRESHUTDOWN, 0, 0); - DestroyWindow(hwnd); - break; - - case WM_CLOSE: - ShowWindow(hwnd, SW_HIDE); - if (DBGetContactSettingByte(NULL, "SRFile", "AutoClear", 1)) { - PostMessage(dat->hwndIncoming, WM_FT_CLEANUP, 0, 0); - PostMessage(dat->hwndOutgoing, WM_FT_CLEANUP, 0, 0); - } - return TRUE; /* Disable default IDCANCEL notification */ - - case WM_DESTROY: - UnhookEvent(dat->hhkPreshutdown); - Window_FreeIcon_IcoLib(hwnd); - DestroyWindow(dat->hwndIncoming); - DestroyWindow(dat->hwndOutgoing); - mir_free(dat); - SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); - Utils_SaveWindowPosition(hwnd, NULL, "SRFile", "FtMgrDlg_"); - break; - - case WM_ACTIVATE: - { - dat->errorState = TBPF_NOPROGRESS; - wParam = 1; - } break; - case WM_SHOWWINDOW: - { - if ( !wParam) // hiding - { - KillTimer(hwnd, 1); - break; - } - lParam = 0; - } - case WM_TIMER: - { - if (pTaskbarInterface) - { - SetTimer(hwnd, 1, 400, NULL); - if ((lParam == ACKRESULT_FAILED) || (lParam == ACKRESULT_DENIED)) - dat->errorState = TBPF_ERROR; - - TFtProgressData prg = {0}; - SendMessage(dat->hwndIncoming, M_CALCPROGRESS, (WPARAM)&prg, 0); - SendMessage(dat->hwndOutgoing, M_CALCPROGRESS, (WPARAM)&prg, 0); - if (dat->errorState) - { - pTaskbarInterface->SetProgressState(hwnd, dat->errorState); - if ( !prg.run) - pTaskbarInterface->SetProgressValue(hwnd, 1, 1); - } else if (prg.run) - { - pTaskbarInterface->SetProgressState(hwnd, TBPF_NORMAL); - } else if (prg.init || prg.scan) - { - pTaskbarInterface->SetProgressState(hwnd, TBPF_INDETERMINATE); - } else { - pTaskbarInterface->SetProgressState(hwnd, TBPF_NOPROGRESS); - KillTimer(hwnd, 1); - } - - if (prg.run) - { - pTaskbarInterface->SetProgressValue(hwnd, prg.totalProgress, prg.totalBytes); - } - - } - } break; - - } - - return FALSE; -} - -HWND FtMgr_Show(bool bForceActivate, bool bFromMenu) -{ - bool bAutoMin = DBGetContactSettingByte(NULL, "SRFile", "AutoMin", 0) != 0; /* lqbe */ - - bool bJustCreated = (hwndFtMgr == NULL); - if (bJustCreated) - { - hwndFtMgr = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTMGR), NULL, FtMgrDlgProc); - } - if (bFromMenu) /* lqbe */ - { - ShowWindow(hwndFtMgr, SW_RESTORE); - ShowWindow(hwndFtMgr, SW_SHOW); - SetForegroundWindow(hwndFtMgr); - return hwndFtMgr; - } - else if (bAutoMin && bJustCreated) /* lqbe */ - { - ShowWindow(hwndFtMgr, SW_HIDE); - ShowWindow(hwndFtMgr, SW_MINIMIZE); - return hwndFtMgr; - } - else if (bForceActivate) /* lqbe */ - { - ShowWindow(hwndFtMgr, SW_RESTORE); - ShowWindow(hwndFtMgr, SW_SHOWNOACTIVATE); - SetForegroundWindow(hwndFtMgr); - return hwndFtMgr; - } - if ( !bJustCreated && IsWindowVisible(hwndFtMgr)) - return hwndFtMgr; - - ShowWindow(hwndFtMgr, bAutoMin ? SW_SHOWMINNOACTIVE : SW_SHOWNOACTIVATE); - return hwndFtMgr; -} - -void FtMgr_Destroy() -{ - if (hwndFtMgr) - DestroyWindow(hwndFtMgr); -} - -void FtMgr_ShowPage(int page) -{ - if (hwndFtMgr) - SendMessage(hwndFtMgr, WM_FT_SELECTPAGE, page, 0); -} - -HWND FtMgr_AddTransfer(FileDlgData *fdd) -{ - bool bForceActivate = fdd->send || !DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0); - TFtMgrData *dat = (TFtMgrData*)GetWindowLongPtr(FtMgr_Show(bForceActivate, false), GWLP_USERDATA); - if (dat == NULL) return NULL; - HWND hwndBox = fdd->send ? dat->hwndOutgoing : dat->hwndIncoming; - HWND hwndFt = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILETRANSFERINFO), hwndBox, DlgProcFileTransfer, (LPARAM)fdd); - ShowWindow(hwndFt, SW_SHOWNA); - SendMessage(hwndBox, WM_FT_ADD, 0, (LPARAM)hwndFt); - FtMgr_ShowPage(fdd->send ? 1 : 0); - return hwndFt; -} \ No newline at end of file diff --git a/src/modules/utils/path.cpp b/src/modules/utils/path.cpp index 7ce014725d..0ce1eae95a 100644 --- a/src/modules/utils/path.cpp +++ b/src/modules/utils/path.cpp @@ -22,7 +22,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "..\..\core\commonheaders.h" #include "../database/profilemanager.h" -#include "../srfile/file.h" extern TCHAR g_profileDir[MAX_PATH]; diff --git a/src/resource.rc b/src/resource.rc index 833b4260ce..9efc5754b2 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -40,24 +40,6 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,148,98,50,14 END -IDD_AUTHREQ DIALOGEX 0, 0, 271, 197 -STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "Authorization Request" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_HEADERBAR,"MHeaderbarCtrl",0x0,0,0,271,25 - DEFPUSHBUTTON "&Authorize",IDOK,17,176,50,14 - PUSHBUTTON "&Deny",IDCANCEL,97,176,50,14 - PUSHBUTTON "Decide &Later",IDC_DECIDELATER,175,176,74,14 - CONTROL "&I",IDC_DETAILS,"MButtonClass",WS_TABSTOP,248,29,16,14,WS_EX_NOACTIVATE | 0x10000000L - LTEXT "Reason:",IDC_STATIC,7,39,101,10,SS_CENTERIMAGE - EDITTEXT IDC_REASON,7,50,257,54,ES_MULTILINE | ES_READONLY | NOT WS_BORDER | WS_VSCROLL | WS_HSCROLL,WS_EX_STATICEDGE - LTEXT "Denial Reason:",IDC_STATIC,7,111,89,10,SS_CENTERIMAGE | SS_REALSIZECONTROL - EDITTEXT IDC_DENYREASON,7,124,257,32,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_BORDER,WS_EX_STATICEDGE - CONTROL "Add to contact list if authorized",IDC_ADDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,239,10 -END - IDD_ADDCONTACT DIALOGEX 0, 0, 230, 151 STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_CONTROLPARENT @@ -77,18 +59,6 @@ BEGIN EDITTEXT IDC_AUTHREQ,13,89,204,29,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL END -IDD_ADDED DIALOGEX 0, 0, 241, 70 -STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "You Were Added" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "",IDC_HEADERBAR,"MHeaderbarCtrl",0x0,0,0,241,25 - PUSHBUTTON "&Close",IDCANCEL,90,51,60,14 - CONTROL "&I",IDC_DETAILS,"MButtonClass",WS_TABSTOP,217,29,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "&U",IDC_ADD,"MButtonClass",WS_TABSTOP,197,29,16,14,WS_EX_NOACTIVATE | 0x10000000L -END - IDD_ABOUT DIALOGEX 0, 0, 212, 131 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_CONTROLPARENT @@ -335,115 +305,6 @@ BEGIN LTEXT "Find What:",IDC_STATIC,7,13,39,9 END -IDD_FILESEND DIALOGEX 0, 0, 256, 177 -STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "Send File(s)" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - EDITTEXT IDC_MSG,6,102,245,46,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL - DEFPUSHBUTTON "&Send",IDOK,67,157,50,15 - PUSHBUTTON "Cancel",IDCANCEL,140,157,50,15 - LTEXT "To:",IDC_STATIC,6,23,24,9,SS_CENTERIMAGE - CONTROL "",IDC_TO,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,43,24,159,9 - LTEXT "File(s):",IDC_STATIC,7,39,30,8 - EDITTEXT IDC_FILE,38,38,213,31,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY - PUSHBUTTON "&Choose Again...",IDC_CHOOSE,39,74,77,14 - RTEXT "Total size:",IDC_STATIC,119,76,68,8 - CONTROL "",IDC_TOTALSIZE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,191,76,58,8 - LTEXT "Description:",IDC_STATIC,6,93,96,8 - CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,195,5,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,213,5,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,231,5,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 - LTEXT "",IDC_NAME,19,7,151,9,SS_NOPREFIX | SS_CENTERIMAGE -END - -IDD_FILERECV DIALOGEX 0, 0, 256, 174 -STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "Incoming File Transfer" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "A&ccept",IDOK,68,155,50,14 - PUSHBUTTON "&Decline",IDCANCEL,138,155,50,14 - LTEXT "From:",IDC_STATIC,6,20,24,9,SS_CENTERIMAGE - CONTROL "",IDC_FROM,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,39,21,159,9 - LTEXT "Date:",IDC_STATIC,6,35,28,9,SS_CENTERIMAGE - CONTROL "",IDC_DATE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,39,34,159,9 - LTEXT "Files:",IDC_STATIC,6,50,28,8 - EDITTEXT IDC_FILENAMES,39,50,210,16,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER - LTEXT "Description:",IDC_STATIC,6,69,64,8 - EDITTEXT IDC_MSG,6,79,243,45,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY - LTEXT "Save to:",IDC_STATIC,6,131,34,8 - PUSHBUTTON "...",IDC_FILEDIRBROWSE,235,130,14,10 - COMBOBOX IDC_FILEDIR,45,129,187,108,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - CONTROL "&A",IDC_ADD,"MButtonClass",WS_TABSTOP,177,5,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,195,5,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,213,5,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,231,5,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 - LTEXT "",IDC_NAME,19,7,151,9,SS_NOPREFIX | SS_CENTERIMAGE -END - -IDD_FILETRANSFERINFO DIALOGEX 0, 0, 256, 44 -STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - CONTROL "Contact menu",IDC_CONTACT,"MButtonClass",WS_TABSTOP,5,1,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "",IDC_CONTACTNAME,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_WORDELLIPSIS | WS_GROUP,25,1,174,14 - CONTROL "Open...",IDC_OPENFILE,"MButtonClass",WS_DISABLED | WS_TABSTOP,203,1,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "Open folder",IDC_OPENFOLDER,"MButtonClass",WS_TABSTOP,219,1,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "Cancel",IDCANCEL,"MButtonClass",WS_TABSTOP,235,1,16,14,WS_EX_NOACTIVATE | 0x10000000L - CONTROL "",IDC_ALLFILESPROGRESS,"msctls_progress32",PBS_SMOOTH | NOT WS_VISIBLE | WS_DISABLED,25,16,190,12 - CONTROL "",IDC_STATUS,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX | WS_GROUP,25,17,190,10 - ICON "",IDC_FILEICON,25,15,16,14,SS_CENTERIMAGE | SS_REALSIZEIMAGE - CONTROL "Transfer completed, open file(s).",IDC_TRANSFERCOMPLETED, - "Hyperlink",NOT WS_VISIBLE | WS_TABSTOP,42,17,173,10 - LTEXT "No data transferred",IDC_ALLTRANSFERRED,25,29,226,14,SS_NOPREFIX | SS_CENTERIMAGE - RTEXT "",IDC_ALLSPEED,25,29,226,14,SS_NOPREFIX | SS_CENTERIMAGE - LTEXT "",IDC_ALLPRECENTS,218,14,33,14,SS_CENTERIMAGE - CONTROL "",IDC_FRAME,"Static",SS_ETCHEDHORZ,1,43,254,1 -END - -IDD_FILEEXISTS DIALOGEX 0, 0, 288, 181 -STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT -CAPTION "File Already Exists" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - PUSHBUTTON "Resume",IDC_RESUME,5,144,65,14 - PUSHBUTTON "Resume all",IDC_RESUMEALL,5,162,65,14 - PUSHBUTTON "Overwrite",IDC_OVERWRITE,76,144,65,14 - PUSHBUTTON "Overwrite all",IDC_OVERWRITEALL,76,162,65,14 - PUSHBUTTON "Save as...",IDC_SAVEAS,147,144,65,14 - PUSHBUTTON "Auto rename",IDC_AUTORENAME,147,162,65,14 - PUSHBUTTON "Skip",IDC_SKIP,218,144,65,14 - PUSHBUTTON "Cancel transfer",IDCANCEL,218,162,65,14 - LTEXT "You are about to receive the file",IDC_STATIC,5,5,278,8 - EDITTEXT IDC_FILENAME,15,16,268,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER - GROUPBOX "Existing file",IDC_STATIC,5,29,278,61 - ICON "",IDC_EXISTINGICON,14,45,20,20,SS_NOTIFY - LTEXT "Size:",IDC_STATIC,40,42,27,8 - LTEXT "",IDC_EXISTINGSIZE,67,42,35,8 - RTEXT "Last modified:",IDC_STATIC,103,42,58,8 - LTEXT "",IDC_EXISTINGDATE,166,42,115,8 - LTEXT "Type:",IDC_STATIC,40,55,27,8 - LTEXT "",IDC_EXISTINGTYPE,67,55,214,8 - PUSHBUTTON "Open file",IDC_OPENFILE,12,70,62,13 - PUSHBUTTON "Open folder",IDC_OPENFOLDER,82,70,62,13 - PUSHBUTTON "File properties",IDC_PROPERTIES,201,70,74,13 - GROUPBOX "File being received",IDC_STATIC,5,95,278,42 - ICON "",IDC_NEWICON,14,110,20,20,SS_NOTIFY - LTEXT "Size:",IDC_STATIC,40,108,27,8 - LTEXT "",IDC_NEWSIZE,67,108,35,8 - RTEXT "Last modified:",IDC_STATIC,103,108,58,8 - LTEXT "",IDC_NEWDATE,166,108,115,8 - LTEXT "Type:",IDC_STATIC,40,121,27,8 - LTEXT "",IDC_NEWTYPE,67,121,214,8 -END - IDD_HISTORY DIALOGEX 0, 0, 296, 166 STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_CONTROLPARENT @@ -605,44 +466,6 @@ BEGIN CTEXT "You will need to reconnect for the changes you have made on this page to take effect.",IDC_RECONNECTREQD,4,224,307,8,NOT WS_VISIBLE END -IDD_OPT_FILETRANSFER DIALOGEX 0, 0, 313, 232 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE -EXSTYLE WS_EX_CONTROLPARENT -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - GROUPBOX "Receiving files",IDC_STATIC,0,0,313,90 - LTEXT "Received files folder:",IDC_STATIC,8,15,82,8 - EDITTEXT IDC_FILEDIR,92,13,190,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_FILEDIRBROWSE,287,14,15,11 - LTEXT "Variables Allowed: %userid%, %nick%, %proto%, %miranda_path%, %userprofile%",IDC_STATIC,8,27,294,11,WS_DISABLED - CONTROL "Auto-accept incoming files from people on my contact list",IDC_AUTOACCEPT, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,39,294,10 - CONTROL "Minimize the file transfer window",IDC_AUTOMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,52,285,10 - CONTROL "Close window when transfer completes",IDC_AUTOCLOSE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,65,294,10 - CONTROL "Clear completed transfers on window closing",IDC_AUTOCLEAR, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,76,294,10 - GROUPBOX "Virus scanner",IDC_VIRUSSCANNERGROUP,0,90,313,93 - LTEXT "Scan files:",IDC_STATIC,8,102,43,9,SS_CENTERIMAGE - CONTROL "Never, do not use virus scanning",IDC_NOSCANNER,"Button",BS_AUTORADIOBUTTON,52,102,250,10 - CONTROL "When all files have been downloaded",IDC_SCANAFTERDL, - "Button",BS_AUTORADIOBUTTON,52,114,250,10 - CONTROL "As each file finishes downloading",IDC_SCANDURINGDL, - "Button",BS_AUTORADIOBUTTON,52,126,250,10 - LTEXT "Command line:",IDC_ST_CMDLINE,7,142,62,8 - COMBOBOX IDC_SCANCMDLINE,70,141,213,71,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...",IDC_SCANCMDLINEBROWSE,287,142,15,11 - LTEXT "%f will be replaced by the file or folder name to be scanned",IDC_ST_CMDLINEHELP,70,155,232,8 - CONTROL "Warn me before opening a file that has not been scanned",IDC_WARNBEFOREOPENING, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,168,294,10 - GROUPBOX "If incoming files already exist",IDC_STATIC,0,187,313,41 - CONTROL "Ask me",IDC_ASK,"Button",BS_AUTORADIOBUTTON,8,200,73,10 - CONTROL "Resume",IDC_RESUME,"Button",BS_AUTORADIOBUTTON,82,200,125,10 - CONTROL "Overwrite",IDC_OVERWRITE,"Button",BS_AUTORADIOBUTTON,8,212,73,10 - CONTROL "Rename (append "" (1)"", etc.)",IDC_RENAME,"Button",BS_AUTORADIOBUTTON,82,212,125,10 - LTEXT "You will always be asked about files from people not on your contact list",IDC_STATIC,212,198,90,24 -END - IDD_OPT_IDLE DIALOGEX 0, 0, 312, 193 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_BORDER EXSTYLE WS_EX_CONTROLPARENT @@ -924,23 +747,6 @@ BEGIN PUSHBUTTON "Close",IDCANCEL,110,49,50,14 END -IDD_FTMGR DIALOGEX 0, 0, 276, 255 -STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "File Transfers" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,7,262,224 - PUSHBUTTON "Clear completed",IDC_CLEAR,7,234,100,14 - PUSHBUTTON "Close",IDCANCEL,219,234,50,14 -END - -IDD_FTPAGE DIALOGEX 0, 0, 320, 183 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VSCROLL | WS_SYSMENU -EXSTYLE WS_EX_CONTROLPARENT | WS_EX_STATICEDGE -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN -END - IDD_OPT_KEYWORDFILTER DIALOGEX 0, 0, 251, 73 STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD EXSTYLE WS_EX_CONTROLPARENT @@ -1111,13 +917,6 @@ END #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN - IDD_AUTHREQ, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 264 - BOTTOMMARGIN, 190 - END - IDD_ADDCONTACT, DIALOG BEGIN LEFTMARGIN, 7 @@ -1126,14 +925,6 @@ BEGIN BOTTOMMARGIN, 144 END - IDD_ADDED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 233 - TOPMARGIN, 3 - BOTTOMMARGIN, 65 - END - IDD_ABOUT, DIALOG BEGIN LEFTMARGIN, 5 @@ -1269,51 +1060,6 @@ BEGIN HORZGUIDE, 17 END - IDD_FILESEND, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 251 - VERTGUIDE, 7 - VERTGUIDE, 249 - TOPMARGIN, 5 - BOTTOMMARGIN, 172 - END - - IDD_FILERECV, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 249 - VERTGUIDE, 7 - VERTGUIDE, 249 - TOPMARGIN, 5 - BOTTOMMARGIN, 169 - END - - IDD_FILETRANSFERINFO, DIALOG - BEGIN - VERTGUIDE, 5 - VERTGUIDE, 25 - VERTGUIDE, 36 - VERTGUIDE, 120 - VERTGUIDE, 180 - VERTGUIDE, 215 - VERTGUIDE, 218 - VERTGUIDE, 235 - VERTGUIDE, 251 - BOTTOMMARGIN, 43 - HORZGUIDE, 14 - HORZGUIDE, 28 - HORZGUIDE, 42 - END - - IDD_FILEEXISTS, DIALOG - BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 283 - TOPMARGIN, 5 - BOTTOMMARGIN, 176 - END - IDD_HISTORY, DIALOG BEGIN LEFTMARGIN, 7 @@ -1384,12 +1130,6 @@ BEGIN HORZGUIDE, 113 END - IDD_OPT_FILETRANSFER, DIALOG - BEGIN - VERTGUIDE, 8 - VERTGUIDE, 302 - END - IDD_PROFILE_NEW, DIALOG BEGIN LEFTMARGIN, 7 @@ -1464,22 +1204,6 @@ BEGIN BOTTOMMARGIN, 248 END - IDD_FTPAGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 303 - TOPMARGIN, 7 - BOTTOMMARGIN, 176 - END - - IDD_OPT_KEYWORDFILTER, DIALOG - BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 247 - TOPMARGIN, 4 - BOTTOMMARGIN, 69 - END - IDD_MODERNOPT_FONTS, DIALOG BEGIN VERTGUIDE, 10 -- cgit v1.2.3