diff --git a/Source/Client/IM-Client/ATL_NetLib/APIHook.h b/Source/Client/IM-Client/ATL_NetLib/APIHook.h new file mode 100644 index 0000000..af69ab3 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/APIHook.h @@ -0,0 +1,75 @@ +/****************************************************************************** +Module: APIHook.h +Notices: Copyright (c) 2000 Jeffrey Richter +******************************************************************************/ + + +#pragma once + + +/////////////////////////////////////////////////////////////////////////////// + + +class CAPIHook { +public: + // Hook a function in all modules + CAPIHook(PSTR pszCalleeModName, PSTR pszFuncName, PROC pfnHook, + BOOL fExcludeAPIHookMod); + + // Unhook a function from all modules + ~CAPIHook(); + + // Returns the original address of the hooked function + operator PROC() { return(m_pfnOrig); } + + +public: + // Calls the real GetProcAddress + static FARPROC WINAPI GetProcAddressRaw(HMODULE hmod, PCSTR pszProcName); + +private: + static PVOID sm_pvMaxAppAddr; // Maximum private memory address + static CAPIHook* sm_pHead; // Address of first object + CAPIHook* m_pNext; // Address of next object + + PCSTR m_pszCalleeModName; // Module containing the function (ANSI) + PCSTR m_pszFuncName; // Function name in callee (ANSI) + PROC m_pfnOrig; // Original function address in callee + PROC m_pfnHook; // Hook function address + BOOL m_fExcludeAPIHookMod; // Hook module w/CAPIHook implementation? + +private: + // Replaces a symbol's address in a module's import section + static void WINAPI ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, + PROC pfnOrig, PROC pfnHook, BOOL fExcludeAPIHookMod); + + // Replaces a symbol's address in all module's import sections + static void WINAPI ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, + PROC pfnOrig, PROC pfnHook, HMODULE hmodCaller); + +private: + // Used when a DLL is newly loaded after hooking a function + static void WINAPI FixupNewlyLoadedModule(HMODULE hmod, DWORD dwFlags); + + // Used to trap when DLLs are newly loaded + static HMODULE WINAPI LoadLibraryA(PCSTR pszModulePath); + static HMODULE WINAPI LoadLibraryW(PCWSTR pszModulePath); + static HMODULE WINAPI LoadLibraryExA(PCSTR pszModulePath, + HANDLE hFile, DWORD dwFlags); + static HMODULE WINAPI LoadLibraryExW(PCWSTR pszModulePath, + HANDLE hFile, DWORD dwFlags); + + // Returns address of replacement function if hooked function is requested + static FARPROC WINAPI GetProcAddress(HMODULE hmod, PCSTR pszProcName); + +private: + // Instantiates hooks on these functions + static CAPIHook sm_LoadLibraryA; + static CAPIHook sm_LoadLibraryW; + static CAPIHook sm_LoadLibraryExA; + static CAPIHook sm_LoadLibraryExW; + static CAPIHook sm_GetProcAddress; +}; + + +//////////////////////////////// End of File ////////////////////////////////// diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.cpp b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.cpp new file mode 100644 index 0000000..c0a5c78 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.cpp @@ -0,0 +1,268 @@ +// ATL_NetLib.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To merge the proxy/stub code into the object DLL, add the file +// dlldatax.c to the project. Make sure precompiled headers +// are turned off for this file, and add _MERGE_PROXYSTUB to the +// defines for the project. +// +// If you are not running WinNT4.0 or Win95 with DCOM, then you +// need to remove the following define from dlldatax.c +// #define _WIN32_WINNT 0x0400 +// +// Further, if you are running MIDL without /Oicf switch, you also +// need to remove the following define from dlldatax.c. +// #define USE_STUBLESS_PROXY +// +// Modify the custom build rule for ATL_NetLib.idl by adding the following +// files to the Outputs. +// ATL_NetLib_p.c +// dlldata.c +// To build a separate proxy/stub DLL, +// run nmake -f ATL_NetLibps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "ATL_NetLib.h" +//#include "dlldatax.h" + +#include "ATL_NetLib_i.c" +#include "Session.h" +#include "Users.h" +//#include "CallBackEvents.h" +#include "Promo.h" +#include "Message.h" +#include "File.h" +#include "Messages.h" +#include "Files.h" +#include "SIDs.h" +#include "Promos.h" +#include "SID.h" +#include "IChat.h" +#include "IChats.h" + +#ifdef _MERGE_PROXYSTUB +extern "C" HINSTANCE hProxyDll; +#endif + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_Session, CSession) + +OBJECT_ENTRY_NON_CREATEABLE(CUser) +OBJECT_ENTRY_NON_CREATEABLE(CUsers) + +OBJECT_ENTRY_NON_CREATEABLE(CPromo) +OBJECT_ENTRY_NON_CREATEABLE(CPromos) + +OBJECT_ENTRY_NON_CREATEABLE(CMessage) +OBJECT_ENTRY_NON_CREATEABLE(CMessages) + +OBJECT_ENTRY_NON_CREATEABLE(CFile) +OBJECT_ENTRY_NON_CREATEABLE(CFiles) + +OBJECT_ENTRY_NON_CREATEABLE(ClocalSID) +OBJECT_ENTRY_NON_CREATEABLE(ClocalSIDs) +OBJECT_ENTRY_NON_CREATEABLE(CChat) +OBJECT_ENTRY_NON_CREATEABLE(CChats) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{ + lpReserved; +#ifdef _MERGE_PROXYSTUB + if (!PrxDllMain(hInstance, dwReason, lpReserved)) +// MCTRACE("WINAPI DllMain(HINSTANCE hInstance,fasle end"); + return FALSE; +#endif + if (dwReason == DLL_PROCESS_ATTACH) + { + //MCTRACE("WINAPI DllMain(HINSTANCE hInstance,"); +#ifdef _DEBUG + // Get current flag + int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); + + // Turn on leak-checking bit + tmpFlag |= _CRTDBG_LEAK_CHECK_DF; + + // Turn off CRT block checking bit + tmpFlag &= ~_CRTDBG_CHECK_CRT_DF; + + // Set flag to the new value + _CrtSetDbgFlag( tmpFlag ); +#endif + _Module.Init(ObjectMap, hInstance, &LIBID_ATL_NETLIBLib); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); +// MCTRACE("WINAPI DllMain(HINSTANCE hInstance,end"); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ +#ifdef _MERGE_PROXYSTUB + if (PrxDllCanUnloadNow() != S_OK) + return S_FALSE; +#endif + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ +#ifdef _MERGE_PROXYSTUB + if (PrxDllGetClassObject(rclsid, riid, ppv) == S_OK) +// MCTRACE("DllGetClassObject 1"); + return S_OK; +#endif +// MCTRACE("DllGetClassObject 2"); + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ +#ifdef _MERGE_PROXYSTUB + HRESULT hRes = PrxDllRegisterServer(); + if (FAILED(hRes)) + return hRes; +#endif + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ +#ifdef _MERGE_PROXYSTUB + PrxDllUnregisterServer(); +#endif + return _Module.UnregisterServer(TRUE); +} + +long g_ByteSent = 0; +long g_ByteReceived = 0; +long g_LatestSent = 0; +long g_LatestReceived = 0; + +long g_FileSent = 0; +long g_FileReceived = 0; + +long g_MessageSend = 0; +long g_MessageReceveived = 0; + +long g_ByteSentPerSec[200]; +long g_ByteReceivedPerSec[200]; + +long g_forByteSentPerSec[200]; +long g_forByteReceivedPerSec[200]; + +CComAutoCriticalSection SendLock; +CComAutoCriticalSection ReceivedLock; + +void g_AddSentBytes(long bytes) +{ + InterlockedExchangeAdd(&g_ByteSent,bytes); + + long sec = GetTickCount() / 1000; + long Point = sec % 200; + long prevPoint = g_LatestSent % 200; + + SendLock.Lock(); + if(sec - g_LatestSent >= 200) + { + memset(g_ByteSentPerSec,0,200*4); + + g_ByteSentPerSec[Point] = bytes; + } + else + if(Point == prevPoint) + { + g_ByteSentPerSec[Point] += bytes; + } + else + if(Point > prevPoint) + { + for(long k = prevPoint +1; k< Point; k++) + g_ByteSentPerSec[k] = 0; + + g_ByteSentPerSec[Point] = bytes; + } + else + { + for(long k = 0; k< Point; k++) + g_ByteSentPerSec[k] = 0; + + for(long k = prevPoint+ 1; k < 200; k++) + g_ByteSentPerSec[k] = 0; + + g_ByteSentPerSec[Point] = bytes; + } + + g_LatestSent = sec; + SendLock.Unlock(); +} + + +void g_AddReceivedBytes(long bytes) +{ + InterlockedExchangeAdd(&g_ByteReceived,bytes); + + long sec = GetTickCount() / 1000; + long Point = sec % 200; + long prevPoint = g_LatestReceived % 200; + + + ReceivedLock.Lock(); + if(sec - g_LatestReceived >= 200) + { + memset(g_ByteReceivedPerSec,0,200*4); + + g_ByteReceivedPerSec[Point] = bytes; + } + else + if(Point == prevPoint) + { + g_ByteReceivedPerSec[Point] += bytes; + } + else + if(Point > prevPoint) + { + for(long k = prevPoint +1; k< Point; k++) + g_ByteReceivedPerSec[k] = 0; + + g_ByteReceivedPerSec[Point] = bytes; + } + else + { + for(long k = 0; k< Point; k++) + g_ByteReceivedPerSec[k] = 0; + + for(long k = prevPoint+ 1; k < 200; k++) + g_ByteReceivedPerSec[k] = 0; + + g_ByteReceivedPerSec[Point] = bytes; + } + + g_LatestReceived = sec; + + ReceivedLock.Unlock(); +} \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.def b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.def new file mode 100644 index 0000000..bb6ff25 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.def @@ -0,0 +1,9 @@ +; ATL_NetLib.def : Declares the module parameters. + +LIBRARY "ATL_NetLib.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.idl b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.idl new file mode 100644 index 0000000..b3736b7 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.idl @@ -0,0 +1,564 @@ +// ATL_NetLib.idl : IDL source for ATL_NetLib.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (ATL_NetLib.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; + +interface IConfig; +interface IUser; +interface IUsers; +interface IPromo; +interface IPromos; +interface IMessage; +interface IMessages; +interface IlocalSID; +interface IlocalSIDs; +interface IFile; +interface IFiles; +interface IChat; +interface IChats; + + + [ + object, + uuid(AEB8A2D7-1854-42A6-9F19-592DB16930DA), + dual, + helpstring("ISession Interface"), + pointer_default(unique) + ] + interface ISession : IDispatch + { + [propget, id(1), helpstring("property SID")] HRESULT SID([out, retval] BSTR *pVal); + [propget, id(2), helpstring("property SelfInfo")] HRESULT SelfInfo([out, retval] IUser** pVal); + [propget, id(3), helpstring("property Config")] HRESULT Config([out, retval] IConfig** pVal); + + [id(4), helpstring("method LogOn")] HRESULT LogOn(BSTR UserName, BSTR Password, long Status, [out, retval] long* Handle); + [id(5), helpstring("method ChangeStatus")] HRESULT ChangeStatus(long Status); + [id(6), helpstring("method LogOff")] HRESULT LogOff(); + + [id(7), helpstring("method CreateMessage")] HRESULT CreateMessage([out, retval] IMessage **ppMessage); + [id(8), helpstring("method CreateFile")] HRESULT CreateFile([out, retval] IFile** ppFile); + [id(9), helpstring("method CreatePromo")] HRESULT CreatePromo([out, retval] IPromo** ppPromo); + + [id(10), helpstring("method AddUser")] HRESULT AddUser([in]long User_ID, [in] BSTR Body,[in]long ListType, [out, retval] long* Handle); + [id(11), helpstring("method DeleteUser")] HRESULT DeleteUser([in] long User_ID, [in] long ListType, [out, retval] long* Handle); + [id(12), helpstring("method LoadSIDs")] HRESULT LoadSIDs([in] long From, [in] long To, [out, retval] long* Handle); + [id(13), helpstring("method LoadMessages")] HRESULT LoadMessages([in] BSTR SID, [out,retval] long* Handle); + [id(14), helpstring("method LoadIgnore")] HRESULT LoadIgnore([out, retval] long* Handle); + [id(15), helpstring("method LoadOffLineFiles")] HRESULT LoadOffLineFiles([out, retval] long* Handle); + [id(16), helpstring("method AddUserReply")] HRESULT AddUserReply([in] long User_ID, [in] long Result, [out,retval] long* Handle); + [id(17), helpstring("method ConfirmFile")] HRESULT ConfirmFile([in] BSTR FID, [in] long Result, [out,retval] long* Handle); + [id(18), helpstring("method UserDetails")] HRESULT UserDetails([in] long User_ID, [in] long InfoType, [out,retval] long* Handle); + [id(19), helpstring("method GetLastPromos")] HRESULT GetLastPromos([in] long Count, [out,retval] long* Handle); + [id(20), helpstring("method CancelOperation")] HRESULT CancelOperation([in] long Handle); + [id(21), helpstring("method DeleteUserR")] HRESULT DeleteUserR([in] long User_ID, [out,retval] long * Handle); + [id(22), helpstring("method CreateChat")] HRESULT CreateChat([in] BSTR CID, [in] BSTR bsName, [in] BSTR Descr, [out,retval] long* Handle); + }; + +[ + uuid(EB37EA05-FBA5-4F43-92B3-E485128055CB), + version(1.0), + helpstring("Mediachase IM NetLib 1.0 Type Library") +] +library ATL_NETLIBLib +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + typedef enum {Monday=2, Tuesday, Wednesday, Thursday, Friday} workdays; + + [ + object, + uuid(EB3309A2-7275-46C6-AE91-DD3E21C2DAD3), + dual, + helpstring("IUser Interface"), + pointer_default(unique) + ] + interface IUser : IDispatch + { +/* [propget, id(1), helpstring("property UserName")] HRESULT UserName([out, retval] BSTR *pVal); + [propput, id(1), helpstring("property UserName")] HRESULT UserName([in] BSTR newVal); + [propget, id(2), helpstring("property FirstName")] HRESULT FirstName([out, retval] BSTR *pVal); + [propput, id(2), helpstring("property FirstName")] HRESULT FirstName([in] BSTR newVal); + [propget, id(3), helpstring("property LastName")] HRESULT LastName([out, retval] BSTR *pVal); + [propput, id(3), helpstring("property LastName")] HRESULT LastName([in] BSTR newVal); + [propget, id(4), helpstring("property EMail")] HRESULT EMail([out, retval] BSTR *pVal); + [propput, id(4), helpstring("property EMail")] HRESULT EMail([in] BSTR newVal); + [propget, id(5), helpstring("property Status")] HRESULT Status([out, retval] long *pVal); + [propput, id(5), helpstring("property Status")] HRESULT Status([in] long newVal); + [propget, id(6), helpstring("property ID")] HRESULT ID([out, retval] long *pVal); + [propput, id(6), helpstring("property ID")] HRESULT ID([in] long newVal); + [propget, id(7), helpstring("property CompanyName")] HRESULT CompanyName([out, retval] BSTR *pVal); + [propput, id(7), helpstring("property CompanyName")] HRESULT CompanyName([in] BSTR newVal); + [propget, id(8), helpstring("property Company_ID")] HRESULT Company_ID([out, retval] long *pVal); + [propput, id(8), helpstring("property Company_ID")] HRESULT Company_ID([in] long newVal); + [propget, id(9), helpstring("property Role")] HRESULT Role([out, retval] BSTR *pVal); + [propput, id(9), helpstring("property Role")] HRESULT Role([in] BSTR newVal); + [propget, id(10), helpstring("property Role_ID")] HRESULT Role_ID([out, retval] long *pVal); + [propput, id(10), helpstring("property Role_ID")] HRESULT Role_ID([in] long newVal);*/ + [propget, id(DISPID_VALUE), helpstring("property Value")] HRESULT Value([in] BSTR bsName, [out, retval] VARIANT *pVal); + [propput, id(DISPID_VALUE), helpstring("property Value")] HRESULT Value([in] BSTR bsName, [in] VARIANT newVal); + }; + + [ + uuid(708324C5-13D3-44CC-A0AD-7FB16F450DF4), + helpstring("_ISessionEvents Interface") + ] + dispinterface _ISessionEvents + { + properties: + methods: + [id(1), helpstring("method ChangedState")] HRESULT ChangedState([in]long State,[in] long ErrorType,[in] long ErrorCode); + + [id(2), helpstring("method eChangedStatus")]HRESULT eChangedStatus([in]IUser* pUser); + [id(3), helpstring("method eMessage")] HRESULT eMessage([in] IMessage* pMessage); + [id(4), helpstring("method ePromo")] HRESULT ePromo([in] IPromo* pPromo, [in] BSTR PromoAsString); + [id(5), helpstring("method eFile")] HRESULT eFile([in] IFile* pFile); + [id(6), helpstring("method eAdd")] HRESULT eAdd([in] IUser* pUser, [in] BSTR bstrMessage); + [id(7), helpstring("method eAddR")] HRESULT eAddR([in] IUser* User, [in] long nResult); + [id(8), helpstring("method eReklama")] HRESULT eReklama([in] BSTR bstrURL); + + [id(9), helpstring("method ContactList")] HRESULT ContactList([in] IUsers* pUsers); + [id(10), helpstring("method IgnoreList")] HRESULT IgnoreList([in] long Handle, [in] IUsers* pUsers); + [id(11), helpstring("method Details")] HRESULT Details([in] long Handle, [in] IUser* pUser, [in] long type); + [id(12), helpstring("method CommandOK")] HRESULT CommandOK([in] long Handle, [in] long AddVal); + [id(13), helpstring("method CommandError")] HRESULT CommandError([in] long Handle, [in] long ErrorType, [in] long ErrorCode); + + [id(14), helpstring("method SessionsList")] HRESULT SessionsList([in] long Handle, [in] IlocalSIDs* plocalSIDs); + [id(15), helpstring("method OffLineFiles")] HRESULT OffLineFiles([in] long Handle, [in] IFiles* pFiles); + [id(16), helpstring("method MessagesList")] HRESULT MessagesList([in] long Handle, [in] IMessages* pMessages); + [id(17), helpstring("method PromosList")] HRESULT PromosList([in] long Handle, [in] IPromos* pPromos, [in] BSTR PromosAsString); + [id(18), helpstring("method SelfStatus")] HRESULT SelfStatus([in] long Status); + [id(19), helpstring("method eSysMess")] HRESULT eSysMess([in] LONG Code, [in] BSTR Description); + [id(20), helpstring("method ChatList")] HRESULT ChatList([in] IChats* pChats); + [id(21), helpstring("method ChatStatus")] HRESULT ChatStatus([in] long Handle, [in] IUsers* pUsers, [in] BSTR bsLog); + [id(22), helpstring("method ChatCreate")] HRESULT ChatCreate([in] long Handle, [in] IChat* pChat); + [id(23), helpstring("method eChatUserStatus")] HRESULT eChatUserStatus([in] IUser* pUser, [in] IChat* pChat); + [id(24), helpstring("method eChatInvite")] HRESULT eChatInvite([in] IChat* pChat, [in] IUser* pUser, [in] IUser* pInvitedFriend, [in] BSTR Invitation); + [id(25), helpstring("method eChatLeave")] HRESULT eChatLeave([in] IUser* pUser, [in] IChat* pChat); + [id(26), helpstring("method eChatMessage")] HRESULT eChatMessage([in] IChat* pChat, [in] IMessage* pMessage); + [id(27), helpstring("method eChatFile")] HRESULT eChatFile([in] IChat* pChat); + [id(28), helpstring("method eChatInvite")] HRESULT eChatAccept([in] IChat* pChat, [in] IUser* pUser, [in] long result); + + }; + + + [ + object, + uuid(6D9B52D2-0A41-450F-9D16-B1E336F9947B), + dual, + helpstring("IUsers Interface"), + pointer_default(unique), + nonextensible + ] + interface IUsers : IDispatch + { + [id(1), helpstring("method AddUser")] HRESULT AddUser([out, retval] IUser** ppUser); + + [propget] HRESULT Count([out, retval] long* pnCount); + + [id(DISPID_VALUE), propget] HRESULT Item([in] long n, [out, retval] IUser** ppUser); + + [id(DISPID_NEWENUM), propget] HRESULT _NewEnum([out, retval] IUnknown** ppEnum); + + }; + +/* [ + object, + uuid(DA4E0291-FF71-4079-A0A2-0FEDDE2FCC30), + dual, + helpstring("ICallBackEvents Interface"), + pointer_default(unique) + ] + interface ICallBackEvents : IDispatch + { + [id(1), helpstring("method Ev_LogOn")] HRESULT Ev_LogOn(BSTR Login, long Status); + [id(2), helpstring("method Ev_ChangesState")] HRESULT Ev_ChangesState([in] long State, [in] long ErrorType, [in] long ErrorCode); + [id(3), helpstring("method Ev_CommandConfirm")] HRESULT Ev_CommandConfirm([in] long handle, [in] long CommandType, [in] long ErrorType, [in] long ErrorCode); + [id(4), helpstring("method Ev_ContactList")] HRESULT Ev_ContactList([in] IUsers* pUser, [in] long type); + [id(5), helpstring("method Ev_eMessage")] HRESULT Ev_eMessage([in] IMessage* pMessage); + [id(6), helpstring("method Ev_eChangedStatus")] HRESULT Ev_eChangedStatus([in]IUser* pUser); + [id(7), helpstring("method Ev_ePromo")] HRESULT Ev_ePromo([in] IPromo* pPromo); + [id(8), helpstring("method Ev_eFile")] HRESULT Ev_eFile([in] IFile* pFile); + [id(9), helpstring("method Ev_eReklama")] HRESULT Ev_eReklama([in] BSTR pURL); + [id(10), helpstring("method Ev_eAddUser")] HRESULT Ev_eAddUser([in] IUser* pUser, [in] BSTR body); + [id(11), helpstring("method Ev_eAddUserR")] HRESULT Ev_eAddUserR([in] IUser* pUser, [in] long Result); + [id(12), helpstring("method Ev_CommandOK")] HRESULT Ev_CommandOK([in] long Handle, [in] long AddParam); + [id(13), helpstring("method Ev_CommandError")] HRESULT Ev_CommandError([in] long Handle, [in] long ErrorType, [in] long ErrorCode); + [id(14), helpstring("method M_ANSWER_BUFF")] HRESULT M_ANSWER_BUFF([in] long wParama, [in] long lParam); + [id(15), helpstring("method M_NEW_EVENT")] HRESULT M_NEW_EVENT([in] long wParam, [in] long lParam); + [id(16), helpstring("method M_CHANGE_STATE")] HRESULT M_CHANGE_STATE([in] long wParam, [in] long lParam); + [id(17), helpstring("method M_ANSWER_OK")] HRESULT M_ANSWER_OK(long wParam, long lParam); + };*/ + [ + object, + uuid(7BEB6353-1BEC-4689-AC5F-52CE6F0CE0FA), + dual, + helpstring("IPromo Interface"), + pointer_default(unique) + ] + interface IPromo : IDispatch + { + [id(1), helpstring("method Send")] HRESULT Send([out, retval] long* Handle); + [propget, id(2), helpstring("property PID")] HRESULT PID([out, retval] BSTR *pVal); + [propput, id(2), helpstring("property PID")] HRESULT PID([in] BSTR newVal); + [propget, id(3), helpstring("property date_time")] HRESULT date_time([out, retval] long *pVal); + [propget, id(4), helpstring("property SID")] HRESULT SID([out, retval] BSTR *pVal); + [propget, id(5), helpstring("property Subject")] HRESULT Subject([out, retval] BSTR *pVal); + [propput, id(5), helpstring("property Subject")] HRESULT Subject([in] BSTR newVal); + [propget, id(6), helpstring("property Product_ID")] HRESULT Product_ID([out, retval] long *pVal); + [propput, id(6), helpstring("property Product_ID")] HRESULT Product_ID([in] long newVal); + [propget, id(7), helpstring("property Body")] HRESULT Body([out, retval] BSTR *pVal); + [propput, id(7), helpstring("property Body")] HRESULT Body([in] BSTR newVal); + [propget, id(8), helpstring("property Recipients")] HRESULT Recipients([out, retval] IUsers* *pVal); + [propget, id(9), helpstring("property Sender")] HRESULT Sender([out, retval] IUser* *pVal); + [propget, id(10), helpstring("property ProductName")] HRESULT ProductName([out, retval] BSTR *pVal); + [propput, id(10), helpstring("property ProductName")] HRESULT ProductName([in] BSTR newVal); + + }; + [ + object, + uuid(459CF8BC-BB71-4DD3-B98F-2B6F65375669), + dual, + helpstring("IMessage Interface"), + pointer_default(unique) + ] + interface IMessage : IDispatch + { + [propget, id(1), helpstring("property Body")] HRESULT Body([out, retval] BSTR *pVal); + [propput, id(1), helpstring("property Body")] HRESULT Body([in] BSTR newVal); + [propget, id(2), helpstring("property date_time")] HRESULT date_time([out, retval] long *pVal); + [propget, id(3), helpstring("property Sender")] HRESULT Sender([out, retval] IUser* *pVal); + [propget, id(4), helpstring("property Recipients")] HRESULT Recipients([out, retval] IUsers* *pVal); + [propget, id(5), helpstring("property MID")] HRESULT MID([out, retval] BSTR *pVal); + [propput, id(5), helpstring("property MID")] HRESULT MID([in] BSTR newVal); + [propget, id(6), helpstring("property SID")] HRESULT SID([out, retval] BSTR *pVal); + [id(7), helpstring("method Send")] HRESULT Send([out] long* Handle); + [propget, id(8), helpstring("property ID")] HRESULT ID([out, retval] long *pVal); + + }; + [ + object, + uuid(48805461-FBEB-4F31-B341-4BED2C7A79AC), + dual, + helpstring("IFile Interface"), + pointer_default(unique) + ] + interface IFile : IDispatch + { + [propget, id(1), helpstring("property FID")] HRESULT FID([out, retval] BSTR *pVal); + [propput, id(1), helpstring("property FID")] HRESULT FID([in] BSTR newVal); + [propget, id(2), helpstring("property RealName")] HRESULT RealName([out, retval] BSTR *pVal); + [propput, id(2), helpstring("property RealName")] HRESULT RealName([in] BSTR newVal); + [propget, id(3), helpstring("property Body")] HRESULT Body([out, retval] BSTR *pVal); + [propput, id(3), helpstring("property Body")] HRESULT Body([in] BSTR newVal); + [propget, id(4), helpstring("property date_time")] HRESULT date_time([out, retval] long *pVal); + [propget, id(5), helpstring("property Sender")] HRESULT Sender([out, retval] IUser* *pVal); + [propget, id(6), helpstring("property Recipients")] HRESULT Recipients([out, retval] IUsers* *pVal); + [propget, id(7), helpstring("property SID")] HRESULT SID([out, retval] BSTR *pVal); + [id(8), helpstring("method Send")] HRESULT Send([out] long* Handle); + [id(9), helpstring("method Receive")] HRESULT Receive([out] long* Handle); + [propput, id(10), helpstring("property hWnd")] HRESULT hWnd([in] long newVal); + [propget, id(11), helpstring("property Size")] HRESULT Size([out, retval] long *pVal); + }; + + + [ + object, + uuid(1BA9F720-B0AB-4237-BE06-DE2F55E8731C), + helpstring("IMonitor Interface"), + dual, + pointer_default(unique) + ] + interface IMonitor : IDispatch + { + + /* + get_MessageSent(OUT Long *plCount) + get_MessageReceived(OUT Long *plCount) + get_FileSend(OUT Long *plCount) + get_FileReceived(OUT Long *plCount) + + get_BytesSent(OUT Long *plSize) + get_BytesReceived(OUT Long *plSize) + get_BytesSent(OUT Long *plSize) + + get_BytesSentPerSecondInterval(OUT Long **pplSizePerSec) // Возвращает массив из Long SizePerSec[200] с посекундной таррификацией + get_BytesReceivedPerSecondInterval(OUT Long **pplSizePerSec) + */ + [propget, id(1), helpstring("property MessageSent")] HRESULT MessageSent([out, retval] long *pVal); + [propget, id(2), helpstring("property MessageReceived")] HRESULT MessageReceived([out, retval] long *pVal); + [propget, id(3), helpstring("property FileSend")] HRESULT FileSend([out, retval] long *pVal); + [propget, id(4), helpstring("property FileReceived")] HRESULT FileReceived([out, retval] long *pVal); + [propget, id(5), helpstring("property BytesSent")] HRESULT BytesSent([out, retval] long *pVal); + [propget, id(6), helpstring("property BytesReceived")] HRESULT BytesReceived([out, retval] long *pVal); + [propput, id(7), helpstring("property SentPerSecondInterval")] HRESULT BytesSentPerSecondInterval([in] long pVal); + [propput, id(8), helpstring("property BytesReceivedPerSecondInterval")] + HRESULT BytesReceivedPerSecondInterval([in] long pVal); + } + + [ + object, + uuid(1D43DD2B-06D1-4D69-AA34-984C74A3EDC1), + dual, + helpstring("IConfig Interface"), + pointer_default(unique) + ] + interface IConfig : IDispatch + { + [propget, id(1), helpstring("property Server")] HRESULT Server([out, retval] BSTR *pVal); + [propput, id(1), helpstring("property Server")] HRESULT Server([in] BSTR newVal); + [propget, id(2), helpstring("property Port")] HRESULT Port([out, retval] long *pVal); + [propput, id(2), helpstring("property Port")] HRESULT Port([in] long newVal); + [propget, id(3), helpstring("property Path")] HRESULT Path([out, retval] BSTR *pVal); + [propput, id(3), helpstring("property Path")] HRESULT Path([in] BSTR newVal); + [propget, id(4), helpstring("property ProxyType")] HRESULT ProxyType([out, retval] long *pVal); + [propput, id(4), helpstring("property ProxyType")] HRESULT ProxyType([in] long newVal); + [propget, id(5), helpstring("property ProxyServerName")] HRESULT ProxyServerName([out, retval] BSTR *pVal); + [propput, id(5), helpstring("property ProxyServerName")] HRESULT ProxyServerName([in] BSTR newVal); + [propget, id(6), helpstring("property ProxyServerPort")] HRESULT ProxyServerPort([out, retval] long *pVal); + [propput, id(6), helpstring("property ProxyServerPort")] HRESULT ProxyServerPort([in] long newVal); + [propget, id(7), helpstring("property UseFirewall")] HRESULT UseFirewall([out, retval] VARIANT_BOOL *pVal); + [propput, id(7), helpstring("property UseFirewall")] HRESULT UseFirewall([in] VARIANT_BOOL newVal); + [propget, id(8), helpstring("property FireWallUserName")] HRESULT FireWallUserName([out, retval] BSTR *pVal); + [propput, id(8), helpstring("property FireWallUserName")] HRESULT FireWallUserName([in] BSTR newVal); + [propget, id(9), helpstring("property FireWallPassword")] HRESULT FireWallPassword([out, retval] BSTR *pVal); + [propput, id(9), helpstring("property FireWallPassword")] HRESULT FireWallPassword([in] BSTR newVal); + [propget, id(10), helpstring("property UseSSL")] HRESULT UseSSL([out, retval] VARIANT_BOOL *pVal); + [propput, id(10), helpstring("property UseSSL")] HRESULT UseSSL([in] VARIANT_BOOL newVal); + }; + + [ + object, + uuid(9CAE9E38-08D6-44CB-80B6-5BB407829942), + dual, + helpstring("IMessages Interface"), + pointer_default(unique) + ] + interface IMessages : IDispatch + { + [id(1), helpstring("method AddMessage")] HRESULT AddMessage([out, retval] IMessage** ppMessage); + + [propget] HRESULT Count([out, retval] long* pnCount); + + [id(DISPID_VALUE), propget] HRESULT Item([in] long n, [out, retval] IMessage** ppMessage); + + [id(DISPID_NEWENUM), propget] HRESULT _NewEnum([out, retval] IUnknown** ppEnum); + + }; + + [ + object, + uuid(CEAA7942-7583-45CD-8DD3-34A0C73F2971), + dual, + helpstring("IFiles Interface"), + pointer_default(unique) + ] + interface IFiles : IDispatch + { + [id(1), helpstring("method AddFile")] HRESULT AddFile([out, retval] IFile** ppFile); + + [propget] HRESULT Count([out, retval] long* pnCount); + + [id(DISPID_VALUE), propget] HRESULT Item([in] long n, [out, retval] IFile** ppFile); + + [id(DISPID_NEWENUM), propget] HRESULT _NewEnum([out, retval] IUnknown** ppEnum); + + }; + + [ + object, + uuid(D0F79DF9-1211-4CCE-8C8A-6E424AA0CADD), + dual, + helpstring("IlocalSIDs Interface"), + pointer_default(unique) + ] + interface IlocalSIDs : IDispatch + { + [id(1), helpstring("method AddSID")] HRESULT AddSID([out, retval] IlocalSID** pplocalSID); + + [propget] HRESULT Count([out, retval] long* pnCount); + + [id(DISPID_VALUE), propget] HRESULT Item([in] long n, [out, retval] IlocalSID** pplocalSID); + + [id(DISPID_NEWENUM), propget] HRESULT _NewEnum([out, retval] IUnknown** ppEnum); + }; + [ + object, + uuid(C45BE212-F4BF-44BD-B89E-B97D8FC2A58B), + dual, + helpstring("IPromos Interface"), + pointer_default(unique) + ] + + interface IPromos : IDispatch + { + [id(1), helpstring("method AddPromo")] HRESULT AddPromo([out, retval] IPromo** ppPromo); + + [propget] HRESULT Count([out, retval] long* pnCount); + + [id(DISPID_VALUE), propget] HRESULT Item([in] long n, [out, retval] IPromo** ppPromo); + + [id(DISPID_NEWENUM), propget] HRESULT _NewEnum([out, retval] IUnknown** ppEnum); + }; + [ + object, + uuid(8E42793F-62AC-4359-A05B-F9AEA8184EE6), + dual, + helpstring("IlocalSID Interface"), + pointer_default(unique) + ] + interface IlocalSID : IDispatch + { + [propget, id(1), helpstring("property SID")] HRESULT SID([out, retval] BSTR *pVal); + [propget, id(2), helpstring("property Count")] HRESULT Count([out, retval] long *pVal); + }; + [ + object, + uuid(6E966D11-D87B-4E72-937E-C9325B9F0959), + dual, + helpstring("IChat Interface"), + pointer_default(unique) + ] + interface IChat : IDispatch + { + [propget, id(DISPID_VALUE), helpstring("property Value")] HRESULT Value([in] BSTR bsName, [out, retval] VARIANT *pVal); + [id(1), helpstring("method SetStatus")] HRESULT SetStatus([in] long Status, [in] long Param, [out] long* Handle); + [id(2), helpstring("method CreateMessage")] HRESULT CreateMessage([out,retval] IMessage** ppMessage); + [id(3), helpstring("method AddUser")] HRESULT AddUser([in] long UserID); + [id(4), helpstring("method Invite")] HRESULT Invite([in] BSTR Invitation ,[out, retval] long * Handle); + [id(5), helpstring("method Leave")] HRESULT Leave([out, retval] long * Handle); + [id(7), helpstring("method Edit")] HRESULT Edit([in] BSTR Name, [in] BSTR Descr, [out, retval] long* Handle); + [id(6), helpstring("method Accept")] HRESULT Accept([in] long Result, [out, retval] long* Handle); + }; + [ + object, + uuid(90D29286-317A-4895-AAC2-449463E10DB3), + dual, + helpstring("IChats Interface"), + pointer_default(unique) + ] + interface IChats : IDispatch + { + [id(1), helpstring("method AddChat")] HRESULT AddChat([out, retval] IChat** ppChat); + + [propget] HRESULT Count([out, retval] long* pnCount); + + [id(DISPID_VALUE), propget] HRESULT Item([in] long n, [out, retval] IChat** ppChat); + + [id(DISPID_NEWENUM), propget] HRESULT _NewEnum([out, retval] IUnknown** ppEnum); + }; + + [ + uuid(567B302A-1DBF-4A75-8E46-65F54A58D91D), + helpstring("Session Class") + ] + coclass Session + { + [default] interface ISession; + [default, source] dispinterface _ISessionEvents; + }; +/* [ + uuid(12177FE2-D4D5-4E92-A430-D8FC3845774C), + helpstring("User Class") + ] + coclass User + { + [default] interface IUser; + }; + [ + uuid(EB496DD1-E0DF-41FA-B63C-D7BA7D9FF3D5), + helpstring("Users Class") + ] + coclass Users + { + [default] interface IUsers; + }; + + [ + uuid(A998B391-B30C-4101-BCE2-97067098C26C), + helpstring("CallBackEvents Class") + ] + coclass Promo + { + [default] interface IPromo; + }; + [ + uuid(D51400C0-A338-4D2E-B4CB-159CF7579909), + helpstring("Message Class") + ] + coclass Message + { + [default] interface IMessage; + }; + [ + uuid(0CA7B601-2FA5-40AA-8666-56F083020345), + helpstring("File Class") + ] + coclass File + { + [default] interface IFile; + }; + + [ + uuid(5CA6E67E-4F0C-407E-A38C-4E564C34487F), + helpstring("Config Class") + ] + coclass Messages + { + [default] interface IMessages; + }; + + [ + uuid(F3630615-5516-4FB5-A299-378F13D9F414), + helpstring("Files Class") + ] + coclass Files + { + [default] interface IFiles; + }; + + [ + uuid(0E5C97B4-2B69-4355-88A6-2983F43276B3), + helpstring("localSIDs Class") + ] + coclass localSIDs + { + [default] interface IlocalSIDs; + }; + [ + uuid(2BA2E731-4462-43D2-A5AB-6AB47B0704F7), + helpstring("Promos Class") + ] + coclass Promos + { + [default] interface IPromos; + }; + [ + uuid(98E50CDC-5A97-48D7-98E7-3CBF7FF6A2A0), + helpstring("localSID Class") + ] + coclass localSID + { + [default] interface IlocalSID; + };*/ +/* [ + uuid(7F7B7695-3F06-409B-8B2E-F922FB708D82), + helpstring("Chat Class") + ] + coclass Chat + { + [default] interface IChat; + }; + [ + uuid(9359EDFF-2973-4BB3-AC7A-E9A77DEE93B0), + helpstring("Chats Class") + ] + coclass Chats + { + [default] interface IChats; + };*/ +}; diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.rc b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.rc new file mode 100644 index 0000000..14bed65 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.rc @@ -0,0 +1,183 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_SESSION REGISTRY DISCARDABLE "Session.rgs" +IDR_USER REGISTRY DISCARDABLE "User.rgs" +IDR_USERS REGISTRY DISCARDABLE "Users.rgs" +IDR_PROMO REGISTRY DISCARDABLE "Promo.rgs" +IDR_MESSAGE REGISTRY DISCARDABLE "Message.rgs" +IDR_FILE REGISTRY DISCARDABLE "File.rgs" +IDR_Config REGISTRY DISCARDABLE "Config.rgs" +IDR_Messages REGISTRY DISCARDABLE "Messages.rgs" +IDR_Files REGISTRY DISCARDABLE "Files.rgs" +IDR_SIDs REGISTRY DISCARDABLE "SIDs.rgs" +IDR_PROMOS REGISTRY DISCARDABLE "Promos.rgs" +IDR_SID REGISTRY DISCARDABLE "SID.rgs" +IDR_ICHAT REGISTRY DISCARDABLE "IChat.rgs" +IDR_ICHATS REGISTRY DISCARDABLE "IChats.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_CURSOR1 CURSOR DISCARDABLE "cursor1.cur" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FILES_DESC "Files Class" + IDS_SIDS_DESC "SIDs Class" +END + +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "1 TYPELIB ""ATL_NetLib.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 4,7,718,0 + PRODUCTVERSION 4,7,718,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileVersion", "4.7.718\0" + VALUE "ProductVersion", "4.7.718\0" + VALUE "InternalName", "ATL_NetLib.dll\0" + VALUE "OriginalFilename", "ATL_NetLib.dll\0" + VALUE "Comments", "\0" + VALUE "LegalTrademarks", "\0" + VALUE "PrivateBuild", "\0" + VALUE "SpecialBuild", "\0" + VALUE "OLESelfRegister", "\0" +#ifndef RADIUS + VALUE "ProductName", "IBN Client\0" + VALUE "FileDescription", "IBN Client Network Library\0" + VALUE "CompanyName", "Mediachase\0" + VALUE "LegalCopyright", "Copyright 2002-2010 Mediachase\0" +#else + VALUE "ProductName", "MagRul Client\0" + VALUE "FileDescription", "MagRul Client Network Library\0" + VALUE "CompanyName", "Radius-Soft\0" + VALUE "LegalCopyright", "Copyright 2009-2010 Radius-Soft\0" +#endif + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_PROJNAME "ATL_NetLib" + IDS_USER_AGENT "Mediachase IM" + IDS_CALLBACKEVENTS_DESC "CallBackEvents Class" + IDS_CONFIG_DESC "Config Class" + IDS_MESSAGES_DESC "Messages Class" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "ATL_NetLib.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj new file mode 100644 index 0000000..0f5f9bb --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj @@ -0,0 +1,262 @@ +п»ї + + + + Debug + Win32 + + + Release_IBN + Win32 + + + Release_MagRul + Win32 + + + + SAK + SAK + AtlProj + SAK + SAK + + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + + + + + + + + + + + + + + + + + true + + + false + + + false + + + + Default + false + Disabled + true + Level2 + true + EditAndContinue + _DEBUG;WIN32;_WINDOWS;_USRDLL;_DOLOG;%(PreprocessorDefinitions) + true + Use + stdafx.h + StdCall + EnableFastChecks + MultiThreadedDebugDLL + + + + _DEBUG;%(PreprocessorDefinitions) + + + true + + + true + true + true + Windows + wininet.lib;msxml2.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies) + .\ATL_NetLib.def + + + + + + OnlyExplicitInline + true + true + MinSpace + true + Level3 + OldStyle + NDEBUG;WIN32;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + stdafx.h + + + + NDEBUG;%(PreprocessorDefinitions) + + + true + + + true + true + Windows + wininet.lib;msxml2.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + .\ATL_NetLib.def + true + + + + + + OnlyExplicitInline + true + true + MinSpace + true + Level3 + OldStyle + RADIUS;NDEBUG;WIN32;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + stdafx.h + + + + RADIUS;NDEBUG;%(PreprocessorDefinitions) + + + true + + + true + true + Windows + wininet.lib;msxml2.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + .\ATL_NetLib.def + true + + + + + + + + + + + + + + + + + + + + + + Create + stdafx.h + Create + Create + stdafx.h + stdafx.h + + + + + + + + + + + + + + + + + + + + + + + + + + .\ATL_NetLib.tlb + ATL_NetLib.h + ATL_NetLib_i.c + true + .\ATL_NetLib.tlb + .\ATL_NetLib.tlb + ATL_NetLib.h + ATL_NetLib.h + ATL_NetLib_i.c + ATL_NetLib_i.c + true + true + + + + + $(OUTDIR);%(AdditionalIncludeDirectories) + $(OUTDIR);%(AdditionalIncludeDirectories) + $(OUTDIR);%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj.filters b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj.filters new file mode 100644 index 0000000..8c204bf --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj.filters @@ -0,0 +1,219 @@ +п»ї + + + + {39199aaf-1d32-449f-aa86-e2a94b616de4} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {5c0ebad5-e30f-4bb2-ae8d-3e51debd6e4f} + h;hpp;hxx;hm;inl + + + {b286a245-ae67-4b6d-a3f4-7b0ef90c5bbc} + 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 + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj.vspscc b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj.vspscc new file mode 100644 index 0000000..b6d3289 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLib.vcxproj.vspscc @@ -0,0 +1,10 @@ +п»ї"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/Source/Client/IM-Client/ATL_NetLib/ATL_NetLibCP.h b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLibCP.h new file mode 100644 index 0000000..3db60eb --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/ATL_NetLibCP.h @@ -0,0 +1,774 @@ +#ifndef _ATL_NETLIBCP_H_ +#define _ATL_NETLIBCP_H_ + + + + + + + + + +template +class CProxy_ISessionEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + HRESULT Fire_ChangedState(LONG State, LONG ErrorType, LONG ErrorCode) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = State; + pvars[1] = ErrorType; + pvars[0] = ErrorCode; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eChangedStatus(IUser * pUser) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pUser; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eMessage(IMessage * pMessage) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pMessage; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_ePromo(IPromo * pPromo, BSTR PromoAsString) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = pPromo; + pvars[0] = PromoAsString; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x4, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eFile(IFile * pFile) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pFile; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x5, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eAdd(IUser * pUser, BSTR bstrMessage) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = pUser; + pvars[0] = bstrMessage; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x6, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eAddR(IUser * User, LONG nResult) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = User; + pvars[0] = nResult; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x7, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eReklama(BSTR bstrURL) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = bstrURL; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x8, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_ContactList(IUsers * pUsers) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pUsers; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x9, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_IgnoreList(LONG Handle, IUsers * pUsers) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Handle; + pvars[0] = pUsers; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0xa, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_Details(LONG Handle, IUser * pUser, LONG type) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = Handle; + pvars[1] = pUser; + pvars[0] = type; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0xb, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_CommandOK(LONG Handle, LONG AddVal) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Handle; + pvars[0] = AddVal; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0xc, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_CommandError(LONG Handle, LONG ErrorType, LONG ErrorCode) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = Handle; + pvars[1] = ErrorType; + pvars[0] = ErrorCode; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0xd, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_SessionsList(LONG Handle, IlocalSIDs * plocalSIDs) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Handle; + pvars[0] = plocalSIDs; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0xe, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_OffLineFiles(LONG Handle, IFiles * pFiles) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Handle; + pvars[0] = pFiles; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0xf, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_MessagesList(LONG Handle, IMessages * pMessages) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Handle; + pvars[0] = pMessages; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x10, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_PromosList(LONG Handle, IPromos * pPromos, BSTR PromosAsString) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = Handle; + pvars[1] = pPromos; + pvars[0] = PromosAsString; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x11, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_SelfStatus(LONG Status) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = Status; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x12, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eSysMess(LONG Code, BSTR Description) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Code; + pvars[0] = Description; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x13, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_ChatList(IChats * pChats) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pChats; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x14, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_ChatStatus(LONG Handle, IUsers * pUsers, BSTR bsLog) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = Handle; + pvars[1] = pUsers; + pvars[0] = bsLog; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x15, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_ChatCreate(LONG Handle, IChat * pChat) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = Handle; + pvars[0] = pChat; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x16, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eChatUserStatus(IUser * pUser, IChat * pChat) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = pUser; + pvars[0] = pChat; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x17, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eChatInvite(IChat * pChat, IUser * pUser, IUser * pInvitedFriend, BSTR Invitation) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[4]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[3] = pChat; + pvars[2] = pUser; + pvars[1] = pInvitedFriend; + pvars[0] = Invitation; + DISPPARAMS disp = { pvars, NULL, 4, 0 }; + pDispatch->Invoke(0x18, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eChatLeave(IUser * pUser, IChat * pChat) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = pUser; + pvars[0] = pChat; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x19, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eChatMessage(IChat * pChat, IMessage * pMessage) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[2]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[1] = pChat; + pvars[0] = pMessage; + DISPPARAMS disp = { pvars, NULL, 2, 0 }; + pDispatch->Invoke(0x1a, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eChatFile(IChat * pChat) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = pChat; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1b, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } + HRESULT Fire_eChatAccept(IChat * pChat, IUser * pUser, LONG Result) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[3]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[2] = pChat; + pvars[1] = pUser; + pvars[0] = Result; + DISPPARAMS disp = { pvars, NULL, 3, 0 }; + pDispatch->Invoke(0x1c, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.scode; + + } +}; +#endif \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/BaseNetData.cpp b/Source/Client/IM-Client/ATL_NetLib/BaseNetData.cpp new file mode 100644 index 0000000..f1de615 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/BaseNetData.cpp @@ -0,0 +1,813 @@ +// BaseNetData.cpp: implementation of the CBaseNetData class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "BaseNetData.h" + +#define WM_DOWNLOAD_BEGIN WM_USER + 520 +#define WM_DOWNLOAD_STEP WM_USER + 521 +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +LONG CBaseNetData::m_PendingOperationCount = 0; + +CBaseNetData::CBaseNetData() +{ + in_Buff = NULL; + m_OpenRequestFlags = INTERNET_FLAG_KEEP_CONNECTION | + INTERNET_FLAG_NO_CACHE_WRITE | + INTERNET_FLAG_RELOAD | + INTERNET_FLAG_PRAGMA_NOCACHE | + INTERNET_FLAG_NO_UI | + INTERNET_FLAG_NO_COOKIES | + //INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS| + //INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | + INTERNET_FLAG_IGNORE_CERT_CN_INVALID | + INTERNET_FLAG_HYPERLINK;//| + //INTERNET_FLAG_SECURE; + //Bind data + m_hConnect = NULL; + m_IsBind = FALSE; + + //Internal data + m_hRequest = NULL; + m_hTimer = NULL;//CreateWaitableTimer(NULL,FALSE,NULL); + Reset(); +} + +CBaseNetData::~CBaseNetData() +{ + if(in_Buff != NULL) + delete[] in_Buff; +} + +void CBaseNetData::Reset() +{ + haveMessage = 0; + bDataSent = FALSE; + m_hNewDataEvent = NULL; //только для NET_EVENT_RECEIVER_CHANNEL + m_hCallbackEvent = NULL; //событие завершения операции + m_ChannelState = NET_CHANNEL_STATE_BEGIN; //состояние канала + m_ObjectName[0] = '\0'; +// m_OpenRequestFlags = FALSE; + m_dwFullWriteSize = 0; + m_dwFullReadSize = 0; + m_dInwBufferSize = 0; + //настройки файла + m_CallBackHWND = NULL; + m_FileName[0] = '\0'; + m_FileDirection = NET_FILE_NONE; + + //Input parameters + m_pInStream.Release(); + m_hInFile = NULL; + m_dwInFileSize = 0; + + memset(&m_InINET_BUFFERS,0,sizeof(m_InINET_BUFFERS)); + m_InINET_BUFFERS.dwStructSize = sizeof(m_InINET_BUFFERS); + m_InINET_BUFFERS.lpvBuffer = m_pInBuffer; + m_InINET_BUFFERS.dwBufferLength = 5024; + m_FirstRead = true; + + //Output parameters + //OUT STREAM + m_pOutStream.Release(); + m_hOutGlobal = NULL; + m_dwOutStreamBuff = NULL; + m_dwOutStreamSize = NULL; + + //OUT FILE + memset(&m_OutINET_BUFFERS,0,sizeof(m_OutINET_BUFFERS)); + m_OutINET_BUFFERS.dwStructSize = sizeof(m_OutINET_BUFFERS); + m_hOutFile = NULL; + m_dwOutFileSize = NULL; + + m_ErrorType = 0; + m_ErrorCode = 0; + m_bCancel = FALSE; + if(m_hRequest != NULL) + { + InternetCloseHandle(m_hRequest); + m_hRequest = NULL; + } + return; +} +LPCTSTR CBaseNetData::GetObjectName() +{ + return m_ObjectName; +} + +DWORD CBaseNetData::GetOpenRequestFlags() +{ + if(m_ChannelType != NET_FILERECEIVE_CHANNEL) + return m_OpenRequestFlags | INTERNET_FLAG_NO_AUTO_REDIRECT; + return m_OpenRequestFlags ; +} + + + +LPCSTR CBaseNetData::GetHeaderBuffer(DWORD &dwBufferSize) +{ + if(m_ChannelType == NET_FILESEND_CHANNEL) + { + _stprintf(m_Header,_T("SESSION_ID: %s"),m_szSID); + dwBufferSize = strlen(m_Header); + return m_Header; + } + dwBufferSize = 0; + return NULL; +} + +DWORD CBaseNetData::GetFullSize() +{ + return m_dwOutStreamSize + m_dwOutFileSize;// + 2:m_dwOutStreamSize; +} + +LPVOID CBaseNetData::GetDataBuffer(DWORD &dwBufferSize) +{ + dwBufferSize = m_dwOutStreamSize; + return m_dwOutStreamBuff; +} + +LPCTSTR CBaseNetData::GetVerbs() +{ + if(m_ChannelType == NET_EVENT_RECEIVER_CHANNEL) + return NULL; + else + return _T("POST"); +} + +DWORD CBaseNetData::GetSendRequestFlags() +{ + + if(m_ChannelType == NET_FILESEND_CHANNEL) + return /*HSR_CHUNKED | */HSR_ASYNC | HSR_USE_CONTEXT |HSR_INITIATE; + else + return HSR_ASYNC | HSR_USE_CONTEXT; +} + +HRESULT CBaseNetData::SetStream(IStream *pStream) +{ + m_FirstRead = TRUE; + ULARGE_INTEGER uli; + LARGE_INTEGER li = {0, 0}; + ULARGE_INTEGER uliR ={0,0},uliW = {0,0}; + HRESULT hr = S_OK; + CHAR pSize[10]; + DWORD size; + if(m_hOutGlobal != 0) + { + GlobalUnlock(m_hOutGlobal); + m_pOutStream.Release(); + } + + hr = pStream->Seek(li, STREAM_SEEK_END, &uli); + hr = m_dwOutStreamSize = (int)uli.QuadPart; + + hr = pStream->Seek(li, STREAM_SEEK_SET, &uli); + uli.LowPart = m_dwOutStreamSize; + + if(NET_FILESEND_CHANNEL == m_ChannelType) + { + hr = CreateStreamOnHGlobal(NULL,TRUE,&m_pOutStream); + memset(&pSize[0],0,10); + ltoa(m_dwOutStreamSize,&pSize[0],10); + m_dwOutStreamSize += 5; + hr = m_pOutStream->Write(&pSize[0],5,&size); + hr = pStream->CopyTo(m_pOutStream,uli,&uliR,&uliW); + } + else + hr = pStream->Clone(&m_pOutStream); + + + hr = GetHGlobalFromStream(m_pOutStream, &m_hOutGlobal); + m_dwOutStreamBuff = GlobalLock(m_hOutGlobal); + + return S_OK; +} + +HRESULT CBaseNetData::SetFile(LPCSTR FileName, NET_FILE_DIRECTION Direction, HWND CallBackHWND) +{ + m_FirstRead = TRUE; + if(FileName == NULL) + m_FileDirection = NET_FILE_NONE; + else + m_FileDirection = Direction; + + m_hInFile = NULL; + m_dwInFileSize = 0; + m_hOutFile = NULL; + m_dwOutFileSize = 0; + + + switch(Direction) + { + case NET_FILE_SEND: + m_hOutFile = CreateFile(FileName,GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE ,NULL,OPEN_EXISTING,NULL,NULL); + if(m_hOutFile == INVALID_HANDLE_VALUE) + return HRESULT_FROM_WIN32(GetLastError()); + m_dwOutFileSize = GetFileSize(m_hOutFile,NULL); + break; + case NET_FILE_RECEIVE: + m_hInFile = CreateFile(FileName,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL); + if(m_hInFile == INVALID_HANDLE_VALUE) + return HRESULT_FROM_WIN32(GetLastError()); + break; + default: + break; + } + return S_OK; +} + +BOOL CBaseNetData::WriteAnswer() +{ + m_ChannelState = NET_CHANNEL_STATE_RESPONSE_READ; + DWORD dwWrite = 0; + HRESULT hr = S_OK; + if(!m_FirstRead) + { + switch(m_ChannelType) + { + case NET_EVENT_RECEIVER_CHANNEL: + + if(m_InINET_BUFFERS.dwBufferLength == 0) + { + m_ChannelState = NET_CHANNEL_STATE_BEGIN; + m_FirstRead = true; + if(m_hRequest) + { + InternetCloseHandle(m_hRequest); + m_hRequest = NULL; + } + return TRUE; + } + else + { + if(m_WriteData) + if(S_FALSE == WriteEventsBuffer((PBYTE)m_InINET_BUFFERS.lpvBuffer,m_InINET_BUFFERS.dwBufferLength)) + { + + m_ChannelState = NET_CHANNEL_STATE_BEGIN; + m_FirstRead = true; + if(m_hRequest) + { + InternetCloseHandle(m_hRequest); + m_hRequest = NULL; + } + + } + return TRUE; + } + break; + case NET_FILERECEIVE_CHANNEL: + + + if(m_InINET_BUFFERS.dwBufferLength == 0) + { + SetEnd(); + return FALSE; + } + + if(m_WriteData) + { + // New Addon 2005/06/21 + m_WriteData= FALSE; + + m_dwFullReadSize += m_InINET_BUFFERS.dwBufferLength; + + if(m_CallBackHWND!= 0 && m_InINET_BUFFERS.dwBufferLength != 0 && + m_ChannelType == NET_FILERECEIVE_CHANNEL) + ::PostMessage(m_CallBackHWND, + WM_DOWNLOAD_STEP, + m_CurrentHandles, + m_dwFullReadSize); + + if(!WriteFile(m_hInFile,m_InINET_BUFFERS.lpvBuffer,m_InINET_BUFFERS.dwBufferLength,&dwWrite,NULL)) + { + SetEnd(etFILE,GetLastError()); + return FALSE; + } + } + break; + default: + if(m_InINET_BUFFERS.dwBufferLength == 0) + { + SetEnd(); + return FALSE; + } + + if(m_WriteData) + hr = m_pInStream->Write(m_InINET_BUFFERS.lpvBuffer,m_InINET_BUFFERS.dwBufferLength,&dwWrite); + ATLTRACE("\r\nWriteAnswer result = %d \r\n",m_InINET_BUFFERS.dwBufferLength); + ATLTRACE("\r\nWriteAnswer write = %d \r\n",dwWrite); + + return (m_WriteData)?dwWrite:true; + break; + } + + } + else + { + if(m_ChannelType != NET_EVENT_RECEIVER_CHANNEL + &&m_ChannelType != NET_FILERECEIVE_CHANNEL) + { + m_pInStream.Release(); + hr = CreateStreamOnHGlobal(NULL,TRUE,&m_pInStream); + } + m_FirstRead = FALSE; + + if(m_dwFullReadSize == NULL) + if(m_CallBackHWND!= 0 && m_ChannelType == NET_FILERECEIVE_CHANNEL) + ::PostMessage(m_CallBackHWND, + WM_DOWNLOAD_BEGIN, + m_CurrentHandles, + m_dwContentLength); + } + return true; +} +LPINTERNET_BUFFERS CBaseNetData::GetInBuffer() +{ + memset(&m_InINET_BUFFERS,0,sizeof(m_InINET_BUFFERS)); + m_InINET_BUFFERS.dwBufferLength = 5024; + //m_InINET_BUFFERS.dwBufferTotal = 5024; + m_InINET_BUFFERS.dwStructSize = sizeof(m_InINET_BUFFERS); + + memset(m_pInBuffer,0,2*5024); + //m_pInBuffer[0] = '\0'; + + m_InINET_BUFFERS.lpvBuffer = m_pInBuffer; + return &m_InINET_BUFFERS; +} + +void CBaseNetData::SetEnd(DWORD ErrorType, DWORD ErrorCode) +{ + if(m_ChannelType == NET_COMMAND_CHANNEL) + InterlockedDecrement(&haveMessage); + + if(m_hRequest != NULL) + { + InternetCloseHandle(m_hRequest); + m_hRequest = NULL; + } + if(m_hOutFile != NULL) + { + CloseHandle(m_hOutFile); + m_hOutFile = NULL; + } + if(m_hInFile) + { + CloseHandle(m_hInFile); + if(ErrorType != NULL || ErrorCode != NULL) + { + // DeleteFile(); + } + m_hInFile = NULL; + } + m_ErrorCode = ErrorCode; + m_ErrorType = ErrorType; + if(m_bCancel && m_ErrorType != 0) + m_ErrorType = etCANCEL; + + m_ChannelState = NET_CHANNEL_STATE_END; + SetEvent(m_hCallbackEvent); + InterlockedDecrement(&m_PendingOperationCount); +} + +LPINTERNET_BUFFERS CBaseNetData::GetOutBuffer() +{ + if(m_ChannelType == NET_EVENT_RECEIVER_CHANNEL) + return NULL; + memset(&m_OutINET_BUFFERS,0,sizeof(m_OutINET_BUFFERS)); + m_OutINET_BUFFERS.lpcszHeader = (const char*)GetHeaderBuffer(m_OutINET_BUFFERS.dwHeadersLength); + m_OutINET_BUFFERS.dwBufferTotal = GetFullSize(); + m_OutINET_BUFFERS.dwStructSize = sizeof(m_OutINET_BUFFERS); + //m_OutINET_BUFFERS.lpvBuffer = GetDataBuffer(m_OutINET_BUFFERS.dwBufferLength); + return &m_OutINET_BUFFERS; +} + +long CBaseNetData::Bind(HINTERNET hConnect, HANDLE TimeOutHandle, NET_CHANNEL_ENUM NetChannel) +{ + if(NetChannel == NET_EVENT_RECEIVER_CHANNEL) + InitializeCriticalSection(&m_CS); + + ATLASSERT(!m_IsBind); + + m_hTimer = TimeOutHandle; + m_hConnect = hConnect; + m_ChannelType = NetChannel; + m_IsBind = true; + + DWORD dwTimeOutConnect,dwTimeOutReceive,dwTimeOutSend; + + dwTimeOutConnect = 10000; + + switch(NetChannel) + { + case NET_EVENT_RECEIVER_CHANNEL: + dwTimeOutReceive = 80000; + dwTimeOutSend = 10000; + break; + case NET_COMMAND_CHANNEL: + case NET_HISTORY_CHANNEL: + dwTimeOutReceive = 10000; + dwTimeOutSend = 10000; + break; + case NET_FILERECEIVE_CHANNEL: + dwTimeOutReceive = 100000; + dwTimeOutSend = 100000; + break; + case NET_FILESEND_CHANNEL: + dwTimeOutReceive = 100000; + dwTimeOutSend = 100000; + break; + default: + break; + } + + + +#ifndef _NOTIMEOUT + InternetSetOption(m_hConnect, + INTERNET_OPTION_CONNECT_TIMEOUT, + &dwTimeOutConnect, + 4); + + + + + InternetSetOption(m_hConnect, + INTERNET_OPTION_RECEIVE_TIMEOUT, + &dwTimeOutReceive, + 4); + + + InternetSetOption(m_hConnect, + INTERNET_OPTION_SEND_TIMEOUT, + &dwTimeOutSend, + 4); + +#endif + + //======================= + TempBuff = NULL; + TempLength = 0; + in_Buff = NULL; + Length = 0; + //--------------------- + Remain = FALSE; + ChunkFlag = FALSE; + ExitFlag = TRUE; + + ChunkLength=0; + ChunkHeaderLength=0; + return S_OK; +} + +void CBaseNetData::Unbind() +{ + m_IsBind = false; + m_hTimer = NULL; + if(m_hConnect != NULL) + { + InternetCloseHandle(m_hConnect); + m_hConnect = NULL; + } + + if(m_ChannelType == NET_EVENT_RECEIVER_CHANNEL) + DeleteCriticalSection(&m_CS); +} + +long CBaseNetData::SetData(LPCTSTR lpszSID, IStream *pStream, HANDLE hCallBackEvent,HANDLE hNewCallBackEvent, NET_FILE_DIRECTION FileDirection, LPCTSTR FileName,HWND CallBackHWND) +{ + LPCTSTR RootBegin=_T(""); + ULONG dwWrite; + + Reset(); + switch(m_ChannelType) + { + case NET_COMMAND_CHANNEL: + case NET_HISTORY_CHANNEL: + ATLASSERT(pStream != NULL); + SetStream(pStream); + break; + case NET_FILERECEIVE_CHANNEL: + case NET_FILESEND_CHANNEL: + ATLASSERT(pStream != NULL); + ATLASSERT(FileName != NULL); + SetFile(FileName,FileDirection,CallBackHWND); + SetStream(pStream); + break; + case NET_EVENT_RECEIVER_CHANNEL: + ATLASSERT(pStream == NULL); + ATLASSERT(FileName == NULL); + LockInStream(); + m_pInStream.Release(); + CreateStreamOnHGlobal(NULL,TRUE,&m_pInStream); + //m_FirstRead = FALSE; + m_pInStream->Write(RootBegin,strlen(RootBegin)*sizeof(TCHAR),&dwWrite); + UnLoackInStream(); + + _stprintf(m_ObjectName,_T("?SESSION_ID=%s"),lpszSID); + m_ObjectName[48] ='\0'; + break; + default: + break; + } + if(lpszSID != 0) + _tcsncpy(m_szSID,lpszSID,36); + + + m_hNewDataEvent = hNewCallBackEvent; + m_hCallbackEvent = hCallBackEvent; + m_CallBackHWND = CallBackHWND; + InterlockedIncrement(&m_PendingOperationCount); + return S_OK; +} + +long CBaseNetData::WriteEventsBuffer(PBYTE pBuffer, DWORD dwBufferSize) +{ + char Value[8]; + char* StopValue; + char* szBeginPacket = ""; + DWORD Len_BeginPacket = 8; + char* szEndPacket = ""; + DWORD Len_EndPacket = 9; + DWORD m_Write; + +try +{ + if (!Remain) + { + Length = dwBufferSize; + in_Buff = new BYTE[Length]; + ::memcpy(in_Buff,pBuffer,Length); + + ChunkFlag = FALSE; + ///////====================================May be parsed chunk + +procces: //Check packet in begin + DWORD k; + for(k=0; (kSetEventBuffer(in_Buff,Length); + LockInStream(); + m_pInStream->Write(in_Buff,Length,&m_Write); + SetEvent(m_hNewDataEvent); + UnLoackInStream(); + //if(!m_CoolNetQueue.CoolPostMessage(WM_NEW_CHUNK,(WPARAM)in_Buff,(LPARAM)Length)) + //{delete[] in_Buff;} + in_Buff = NULL; + Length = 0; + Remain = FALSE; + return S_OK; ///Received full chunk + } + else + { Remain = TRUE; + TempLength = Length; + TempBuff = in_Buff; + Length = 0; + in_Buff = NULL; + return S_OK; ///Received not full chunk + } + } + //======================================================================================= + //May be unparsed Chunk + //////Check chunk Header +chunk: + BOOL ZeroChunk = FALSE; + for(DWORD j=1; j<7 && jLength) + { + Remain = TRUE; + TempLength = Length; + TempBuff = in_Buff; + Length = 0; + in_Buff = NULL; + ChunkFlag = FALSE; + return S_OK; + } + else//if (ChunkLength+ChunkHeaderLength+2>Length) + { + if (in_Buff[ChunkLength+ChunkHeaderLength] !='\r' || + in_Buff[ChunkLength+ChunkHeaderLength+1] != '\n') + {//wrong chunk ....... del it + delete[] in_Buff; + in_Buff = NULL; + Remain = FALSE; + return S_OK; + } + else//Correct chunk + { + PBYTE BuffForSend; + if (ChunkLength != 0) //Cut and send correct chhunk + { + BuffForSend = new BYTE[ChunkLength+10]; + memcpy(BuffForSend,in_Buff+ChunkHeaderLength,ChunkLength); + //WorkClass->SetEventBuffer(BuffForSend,ChunkLength); + LockInStream(); + m_pInStream->Write(in_Buff,Length,&m_Write); + SetEvent(m_hNewDataEvent); + UnLoackInStream(); + // if(!m_CoolNetQueue.CoolPostMessage(WM_NEW_CHUNK, + // (WPARAM)BuffForSend,(LPARAM)ChunkLength)) + // {delete[] BuffForSend;} + BuffForSend = NULL; + } + else + { + delete[] in_Buff; + in_Buff = NULL; + Remain = FALSE; + BuffForSend = NULL; + return S_OK; + } + + //if we have remain data + if (Length > ChunkLength+ChunkHeaderLength+2) + { //|-0 + BuffForSend = in_Buff; + in_Buff = new BYTE[Length-(ChunkLength+ChunkHeaderLength+2)+10]; + Length = Length-(ChunkLength+ChunkHeaderLength+2); + memcpy(in_Buff,BuffForSend+Length,Length); + delete[] BuffForSend; + BuffForSend =NULL; + goto chunk; + } + else + { + delete[] in_Buff; in_Buff = NULL; + Length = 0; + Remain = FALSE; + } + }//end if correct chunk + }//end if (ChunkLength+ChunkHeaderLength+2>Length) + ///////////////////////// + } + ////////////////////// + //Prossec Remain packet + else //Else if + { + PBYTE TempBuff1; + TempBuff1 = new BYTE[TempLength+(DWORD)dwBufferSize+10]; + ::memcpy(TempBuff1,TempBuff,TempLength); + ::memcpy(TempBuff1+TempLength,(PBYTE)pBuffer,(DWORD)dwBufferSize); + + delete[] TempBuff; + in_Buff = TempBuff1; + TempBuff1 = NULL; + Length = TempLength+(DWORD)dwBufferSize; + Remain = FALSE; + goto procces; + } +} +catch(...) +{ +} + + + return S_OK; +} + +HRESULT CBaseNetData::CloneInStream(IStream **pStream) +{ + ATLASSERT(*pStream == NULL); + HRESULT hr = S_OK; + *pStream = NULL; + if(m_ChannelType == NET_FILERECEIVE_CHANNEL) + { + *pStream = NULL; + return S_OK; + } + else + if(m_ChannelType != NET_EVENT_RECEIVER_CHANNEL) + return m_pInStream->Clone(pStream); + else + { + LockInStream(); + LPCTSTR RootEnd=_T(""); + LPCTSTR RootBegin=_T(""); + ULONG dwWrite; + if(m_pInStream != NULL) + { + hr = m_pInStream->Write(RootEnd,strlen(RootEnd)*sizeof(TCHAR),&dwWrite); + hr = m_pInStream->Clone(pStream); + m_pInStream.Release(); + m_FirstRead = TRUE; + hr = CreateStreamOnHGlobal(NULL,TRUE,&m_pInStream); + hr = m_pInStream->Write(RootBegin,strlen(RootBegin)*sizeof(TCHAR),&dwWrite); + } + UnLoackInStream(); + } + return hr; +} + +void CBaseNetData::LockInStream() +{ + EnterCriticalSection(&m_CS); +} + +void CBaseNetData::UnLoackInStream() +{ + LeaveCriticalSection(&m_CS); +} + +#define _MILSECOND 10000 + +void CBaseNetData::BeginTimout(long timeout) +{ + + __int64 qwDueTime; + LARGE_INTEGER liDueTime; + + + qwDueTime = -1 * _MILSECOND * timeout; + + // Copy the relative time into a LARGE_INTEGER. + liDueTime.LowPart = (DWORD) ( qwDueTime & 0xFFFFFFFF ); + liDueTime.HighPart = (LONG) ( qwDueTime >> 32 ); + +#ifndef _NOTIMEOUT + BOOL res = SetWaitableTimer(m_hTimer,&liDueTime,0,NULL,NULL,0); +#endif +} + +void CBaseNetData::EndTimeOut() +{ + CancelWaitableTimer(m_hTimer); +} + +void CBaseNetData::BeginSendRequest() +{ + if(m_ChannelType == NET_EVENT_RECEIVER_CHANNEL) + BeginTimout(80000); + else + if(m_ChannelType == NET_FILESEND_CHANNEL || + m_ChannelType == NET_FILERECEIVE_CHANNEL) + BeginTimout(100000); + else + BeginTimout(10000); +} + +void CBaseNetData::BeginWriteData() +{ + if(m_ChannelType == NET_FILESEND_CHANNEL || + m_ChannelType == NET_FILERECEIVE_CHANNEL) + BeginTimout(100000); + else + BeginTimout(30000); +} + +void CBaseNetData::BeginReadData() +{ + if(m_ChannelType == NET_EVENT_RECEIVER_CHANNEL) + BeginTimout(80000); + else + if(m_ChannelType == NET_FILESEND_CHANNEL || + m_ChannelType == NET_FILERECEIVE_CHANNEL) + BeginTimout(100000); + else + BeginTimout(10000); +} diff --git a/Source/Client/IM-Client/ATL_NetLib/BaseNetData.h b/Source/Client/IM-Client/ATL_NetLib/BaseNetData.h new file mode 100644 index 0000000..8d19e7e --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/BaseNetData.h @@ -0,0 +1,158 @@ +// BaseNetData.h: interface for the CBaseNetData class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_BASENETDATA_H__21FD4DC2_08A7_4A15_B1DB_25819DA1E42D__INCLUDED_) +#define AFX_BASENETDATA_H__21FD4DC2_08A7_4A15_B1DB_25819DA1E42D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +typedef enum +{ + NET_COMMAND_CHANNEL, + NET_HISTORY_CHANNEL, + NET_FILERECEIVE_CHANNEL, + NET_FILESEND_CHANNEL, + NET_EVENT_RECEIVER_CHANNEL +} NET_CHANNEL_ENUM; + +typedef enum +{ + NET_FILE_NONE, + NET_FILE_SEND, + NET_FILE_RECEIVE +} NET_FILE_DIRECTION; + +typedef enum +{ + NET_CHANNEL_STATE_BEGIN, + NET_CHANNEL_STATE_REQUEST_SEND, + NET_CHANNEL_STATE_REQUEST_DATA_SEND, + NET_CHANNEL_STATE_REQUEST_END, + NET_CHANNEL_STATE_RESPONSE_READ, + NET_CHANNEL_STATE_END, +}NET_CHANNEL_STATE_ENUM; + +class CBaseNetManager; + +class CBaseNetData +{ + friend CBaseNetManager; +public: + long SetData(LPCTSTR lpszSID, IStream* pStream, + HANDLE hCallBackEvent, + HANDLE hNewCallBackEvent = NULL, + NET_FILE_DIRECTION FileDirection = NET_FILE_NONE, + LPCTSTR FileName = NULL, + HWND CallBackHWND = NULL); + void Unbind(); + long Bind(HINTERNET hConnect,HANDLE TimeOutHandle, NET_CHANNEL_ENUM NetChannel); + CBaseNetData(); + virtual ~CBaseNetData(); + +private: + void BeginReadData(); + void BeginWriteData(); + void BeginSendRequest(); + void EndTimeOut(); + void BeginTimout(long timeout); + void UnLoackInStream(); + void LockInStream(); + HRESULT CloneInStream(IStream** pStream); + long WriteEventsBuffer(PBYTE pBuffer, DWORD dwBufferSize); + LPINTERNET_BUFFERS GetOutBuffer(); + void Reset(); + + void SetEnd(DWORD ErrorType = 0, DWORD ErrorCode = 0); + HRESULT SetFile(LPCSTR FileName, NET_FILE_DIRECTION Direction, HWND CallBackHWND); + HRESULT SetStream(IStream *pStream); + + LPINTERNET_BUFFERS GetInBuffer(); + + + BOOL WriteAnswer(); + LPCTSTR GetObjectName(); + LPCTSTR GetVerbs(); + + DWORD GetSendRequestFlags(); + DWORD GetOpenRequestFlags(); + + LPVOID GetDataBuffer(DWORD &dwBufferSize); + DWORD GetFullSize(); + LPCSTR GetHeaderBuffer(DWORD &dwBufferSize); + +static LONG m_PendingOperationCount; + //Bind data + HINTERNET m_hConnect; // + BOOL m_IsBind; + NET_CHANNEL_ENUM m_ChannelType; //тип канала + + + HANDLE m_hNewDataEvent; //только для NET_EVENT_RECEIVER_CHANNEL + HANDLE m_hCallbackEvent; //событие завершения операции + NET_CHANNEL_STATE_ENUM m_ChannelState; //состояние канала + + DWORD m_CurrentHandles; + DWORD m_dwFullWriteSize; + DWORD m_dwFullReadSize; + DWORD m_dwContentLength; + //настройки файла + HWND m_CallBackHWND; + TCHAR m_FileName[500]; + NET_FILE_DIRECTION m_FileDirection; + + //Input parameters + CComPtr m_pInStream; + HANDLE m_hInFile; + DWORD m_dwInFileSize; + + INTERNET_BUFFERS m_InINET_BUFFERS; + BYTE m_pInBuffer[2*5024]; + DWORD m_dInwBufferSize; + BOOL m_FirstRead; + BOOL m_WriteData; + //Output parameters + //OUT STREAM + CRITICAL_SECTION m_CS; + CComPtr m_pOutStream; + HGLOBAL m_hOutGlobal; + LPVOID m_dwOutStreamBuff; + DWORD m_dwOutStreamSize; + //OUT FILE + INTERNET_BUFFERS m_OutINET_BUFFERS; + HANDLE m_hOutFile; + DWORD m_dwOutFileSize; + + LONG m_ErrorType; + LONG m_ErrorCode; + + HINTERNET m_hRequest; + + TCHAR m_szSID[36]; + TCHAR m_ObjectName[300]; + TCHAR m_Header[300]; + DWORD m_OpenRequestFlags; + + BOOL m_bCancel; +//=============================================== + PBYTE TempBuff; + DWORD TempLength; + PBYTE in_Buff; + DWORD Length; + //--------------------- + BOOL Remain; + BOOL ChunkFlag; + BOOL ExitFlag; + + DWORD ChunkLength; + DWORD ChunkHeaderLength; + + BOOL bDataSent; +//==================================================== + HANDLE m_hTimer; + + LONG haveMessage; +}; + +#endif // !defined(AFX_BASENETDATA_H__21FD4DC2_08A7_4A15_B1DB_25819DA1E42D__INCLUDED_) diff --git a/Source/Client/IM-Client/ATL_NetLib/BaseNetManager.cpp b/Source/Client/IM-Client/ATL_NetLib/BaseNetManager.cpp new file mode 100644 index 0000000..d76e424 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/BaseNetManager.cpp @@ -0,0 +1,997 @@ +// BaseNetManager.cpp: implementation of the CBaseNetManager class. +// +////////////////////////////////////////////////////////////////////// + +//#define _MILSECOND 10000 + +#include "stdafx.h" +#include "BaseNetManager.h" +#include "time.h" +#include "IM_Net.h" +#include "atlenc-mc.h" +#define WM_UPLOAD_BEGIN WM_USER + 523 +#define WM_UPLOAD_STEP WM_USER + 524 + +extern long g_ByteSent; +extern long g_ByteReceived; +extern long g_LatestSent; +extern long g_LatestReceived; + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CBaseNetManager::CBaseNetManager() +{ + m_hInternet = NULL; + m_IsInit = FALSE; + for(int k = 0; k< 5 ;k++) + { + m_arCallBackData[k].pChannel = (NET_CHANNEL_ENUM)k; + m_arCallBackData[k].pBaseNetManager = this; + m_TimeoutEvents[k] = CreateWaitableTimer(NULL,FALSE,NULL); + } + m_TimeoutEvents[6] = CreateWaitableTimer(NULL,FALSE,NULL); + m_TimeoutEvents[7] = CreateWaitableTimer(NULL,FALSE,NULL); + m_TimeoutEvents[5] = CreateEvent(NULL,FALSE,FALSE,NULL); + + DWORD ThreadId = NULL; + HANDLE hThread = CreateThread(NULL,250000,TimeOutThreadProc,this,NULL,&ThreadId); + CloseHandle(hThread); + +} + +CBaseNetManager::~CBaseNetManager() +{ + while(CBaseNetData::m_PendingOperationCount) + Sleep(100); + + SetEvent(m_TimeoutEvents[5]); + for(int k = 0; k< 8 ;k++) + { + CloseHandle(m_TimeoutEvents[k]); + } + Close(); + Sleep(100); +} +void CALLBACK CBaseNetManager::InternetCallback12( + HINTERNET hInternet, + DWORD dwcontext, + DWORD dwInternetStatus, + LPVOID lpvStatusInformation, + DWORD dwStatusInformationLength + ) +{ + INTERNET_ASYNC_RESULT* pINTERNET_ASYNC_RESULT = NULL; + _CALL_BACK_DATA* pCallBackData; + + DWORD Count; + DWORD l =0; + DWORD i = 0; + + switch (dwInternetStatus) + { + case INTERNET_STATUS_REQUEST_COMPLETE: + pCallBackData = (_CALL_BACK_DATA*)dwcontext; + pINTERNET_ASYNC_RESULT = (INTERNET_ASYNC_RESULT*)lpvStatusInformation; + pCallBackData->pBaseNetManager->CallBack(pCallBackData->pChannel,pINTERNET_ASYNC_RESULT); + // Some code. + break; + case INTERNET_STATUS_RESPONSE_RECEIVED: + Count = *((DWORD*)lpvStatusInformation); + g_AddReceivedBytes(Count); + ATLTRACE("==========================INTERNET_STATUS_RESPONSE_RECEIVED %d \r\n",Count); + + break; + case INTERNET_STATUS_REQUEST_SENT: + Count = *((DWORD*)lpvStatusInformation); + g_AddSentBytes(Count); + + ATLTRACE("==========================INTERNET_STATUS_REQUEST_SENT %d \r\n",Count); + break; + default: + + ATLTRACE("==========================++============================================"); + break; + } + +}; + + +long CBaseNetManager::Init(BASE_NET_MANAGER_CONFIG sConfig) +{ + ATLASSERT(!m_IsInit); + if(m_IsInit) + return E_FAIL; + + m_BASE_NET_MANAGER_CONFIG = sConfig; + + TCHAR pString[200]; + TCHAR* szProxy = NULL; + if(m_BASE_NET_MANAGER_CONFIG.m_dwAccessType == INTERNET_OPEN_TYPE_PROXY) + { + + _stprintf(pString,_T("http=http://%s:%d"), + m_BASE_NET_MANAGER_CONFIG.m_szProxyServerName, + m_BASE_NET_MANAGER_CONFIG.m_ProxyServerPort); + szProxy = pString; + MCTRACE(0,"PROXY config == %s ==",pString); + } + + m_hInternet = InternetOpen(_T("Mediachase IM"), + m_BASE_NET_MANAGER_CONFIG.m_dwAccessType, + szProxy,NULL,INTERNET_FLAG_ASYNC); + long err = GetLastError(); + if(m_hInternet == NULL) + return HRESULT_FROM_WIN32(GetLastError()); + + DWORD MAXConn = 10; + InternetSetOption(NULL, + INTERNET_OPTION_MAX_CONNS_PER_SERVER , + &MAXConn, + 4 + ); + + MAXConn = 10; + InternetSetOption(NULL, + INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, + &MAXConn, + 4 + ); + /* + if(m_BASE_NET_MANAGER_CONFIG.m_bSecure) + { + InternetSetOption(m_hInternet, + INTERNET_OPTION_PROXY_USERNAME, + m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin, + strlen(m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin) +1 + ); + + InternetSetOption(m_hInternet, + INTERNET_OPTION_PROXY_PASSWORD, + m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword, + strlen(m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword) +1 + ); + MCTRACE(0,"PROXY config secure == %s == %s ==",m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin + ,m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword); + } + + */ + //INTERNET_PROXY_INFO m_proxy; + + BYTE m_buff[3048];DWORD size = 3048; + InternetQueryOption(m_hInternet,INTERNET_OPTION_PROXY,&m_buff,&size); +#ifdef _DOLOG + if(((INTERNET_PROXY_INFO*)m_buff)->dwAccessType != INTERNET_OPEN_TYPE_DIRECT) + MCTRACE(0,"PROXY config == %s ==",((INTERNET_PROXY_INFO*)m_buff)->lpszProxy); +#endif + + //TODO SetTimeouts + INTERNET_STATUS_CALLBACK dwISC; + + dwISC = InternetSetStatusCallback(m_hInternet,InternetCallback12); + for(int k=0; k< 5 ;k++) + { + HINTERNET hConnect = InternetConnect( + m_hInternet, + m_BASE_NET_MANAGER_CONFIG.m_szServerName, + m_BASE_NET_MANAGER_CONFIG.m_ServerPort, + NULL, + NULL, + INTERNET_SERVICE_HTTP, + NULL, + NULL); + //HANDLE m_hTimer = CreateWaitableTimer(NULL,FALSE,NULL); + m_BaseNetData[k].Bind(hConnect,m_TimeoutEvents[k],(NET_CHANNEL_ENUM)k); + if(m_BASE_NET_MANAGER_CONFIG.m_bUseSSL) + m_BaseNetData[k].m_OpenRequestFlags |= INTERNET_FLAG_SECURE; + else + m_BaseNetData[k].m_OpenRequestFlags &= ~INTERNET_FLAG_SECURE; + + if(((INTERNET_PROXY_INFO*)m_buff)->dwAccessType == INTERNET_OPEN_TYPE_DIRECT) + m_BaseNetData[k].m_OpenRequestFlags |= INTERNET_FLAG_KEEP_CONNECTION; + else + m_BaseNetData[k].m_OpenRequestFlags &= ~INTERNET_FLAG_KEEP_CONNECTION; + } +// m_intCount407 = 0; + m_IsInit = true; + return S_OK; +} + +long CBaseNetManager::Close() +{ + if(m_IsInit) + for(int k=0; k< 5 ;k++) + m_BaseNetData[k].Unbind(); + + if(m_hInternet != NULL) + { + InternetCloseHandle(m_hInternet); + m_hInternet = NULL; + } + + m_IsInit = FALSE; + return S_OK; +} + +long CBaseNetManager::StopAllOperations() +{ + for(int k =0; k<5 ; k++) + { + m_BaseNetData[k].m_bCancel = true; + if(m_BaseNetData[k].m_hRequest != NULL) + InternetCloseHandle(m_BaseNetData[k].m_hRequest); + m_BaseNetData[k].m_hRequest = NULL; + } + return S_OK; +} + +long CBaseNetManager::StopOperation(NET_CHANNEL_ENUM NetChannel) +{ + if(m_BaseNetData[NetChannel].m_hRequest != NULL) + { + m_BaseNetData[NetChannel].m_bCancel = true; + if(m_BaseNetData[NetChannel].m_hRequest != NULL) + InternetCloseHandle(m_BaseNetData[NetChannel].m_hRequest); + m_BaseNetData[NetChannel].m_hRequest = NULL; + } + return S_OK; +} + +long CBaseNetManager::StartOperation(NET_CHANNEL_ENUM NetChannel,LPCTSTR lpszSID, DWORD Handle, IStream* pStream, HANDLE hCallBackEvent, LPCTSTR FileName, NET_FILE_DIRECTION FileDirection, HWND CallBackHWND) +{ + ATLASSERT(m_BaseNetData[NetChannel].m_ChannelState == NET_CHANNEL_STATE_BEGIN || + m_BaseNetData[NetChannel].m_ChannelState != NET_CHANNEL_STATE_BEGIN); + + if(m_BaseNetData[NetChannel].m_ChannelState == NET_CHANNEL_STATE_END) + m_BaseNetData[NetChannel].Reset(); + + if(m_BaseNetData[NetChannel].m_ChannelState != NET_CHANNEL_STATE_BEGIN) + return E_PENDING; + + m_BaseNetData[NetChannel].m_CurrentHandles = Handle; + m_BaseNetData[NetChannel].SetData(lpszSID, + pStream, + hCallBackEvent, + NULL, + FileDirection, + FileName, + CallBackHWND); + + InetProcessing(NetChannel); + return S_OK; +} + +long CBaseNetManager::StartEventReceiver(LPCTSTR lpszSID,HANDLE hEndCallBackEvent,HANDLE hNewEventCallBackEvent) +{ + ATLASSERT(m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_ChannelState == NET_CHANNEL_STATE_BEGIN || + m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_ChannelState != NET_CHANNEL_STATE_BEGIN); + + if(m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_ChannelState == NET_CHANNEL_STATE_END) + m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].Reset(); + + if(m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_ChannelState != NET_CHANNEL_STATE_BEGIN) + return E_PENDING; + + m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].SetData(lpszSID, + NULL, + hEndCallBackEvent, + hNewEventCallBackEvent); + + InetProcessing(NET_EVENT_RECEIVER_CHANNEL); + return S_OK; +} + + +long CBaseNetManager::StopEventReceiver() +{ + if(m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_hRequest != NULL) + { + m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_bCancel = true; + if(m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_hRequest != NULL) + InternetCloseHandle(m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_hRequest); + m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].m_hRequest = NULL; + } + return S_OK; +} + + +long CBaseNetManager::GetNextEvent(IStream **lpStream) +{ + return m_BaseNetData[NET_EVENT_RECEIVER_CHANNEL].CloneInStream(lpStream); +} + +void CBaseNetManager::GetResultError(NET_CHANNEL_ENUM emChannel, DWORD &ErrorType, DWORD &ErrorCode) +{ + ErrorCode = m_BaseNetData[emChannel].m_ErrorCode; + ErrorType = m_BaseNetData[emChannel].m_ErrorType; +} + +void CBaseNetManager::GetResult(NET_CHANNEL_ENUM emChannel, IStream **lpStream) +{ + HRESULT hr = S_OK; + hr = m_BaseNetData[emChannel].CloneInStream(lpStream); +} + + +DWORD WINAPI CBaseNetManager::ThreadProc(LPVOID lpParameter) +{ + _CALL_BACK_DATA* pCallBackData; + pCallBackData = (_CALL_BACK_DATA*)lpParameter; + + pCallBackData->pBaseNetManager->WorkFunction(pCallBackData->pChannel); + + return 0; +} + +void CBaseNetManager::WorkFunction(NET_CHANNEL_ENUM NetChannel) +{ +/* + BYTE pBuff[1024]; + DWORD dwSize = 1024; + DWORD dwReadSize; + DWORD dwWriteSize; + DWORD dwFullWriteSize = 0; + INTERNET_ASYNC_RESULT pINTERNET_ASYNC_RESULT; + if(m_BaseNetData[NetChannel].m_CallBackHWND!= 0 && + m_BaseNetData[NetChannel].m_ChannelType == NET_FILESEND_CHANNEL) + ::PostMessage(m_BaseNetData[NetChannel].m_CallBackHWND, + WM_UPLOAD_BEGIN, + m_BaseNetData[NetChannel].m_CurrentHandles, + m_BaseNetData[NetChannel].m_dwOutFileSize); + + do + { + + if(!ReadFile(m_BaseNetData[NetChannel].m_hOutFile, + pBuff, + dwSize, + &dwReadSize, + NULL)) + { + m_BaseNetData[NetChannel].SetEnd(etFILE,GetLastError()); + return; + } + if(dwReadSize == 0) break; + + if(!InternetWriteFile(m_BaseNetData[NetChannel].m_hRequest, + pBuff, + dwReadSize, + &dwWriteSize)) + { + //m_BaseNetData[NetChannel].SetEnd(etWININET,GetLastError()); + return; + } + + dwFullWriteSize =+ dwWriteSize; + if(m_BaseNetData[NetChannel].m_CallBackHWND!= 0 && + m_BaseNetData[NetChannel].m_ChannelType == NET_FILESEND_CHANNEL) + ::PostMessage(m_BaseNetData[NetChannel].m_CallBackHWND, + WM_UPLOAD_STEP, + m_BaseNetData[NetChannel].m_CurrentHandles, + dwFullWriteSize); + + } + while(true); + pINTERNET_ASYNC_RESULT.dwError = 0; + pINTERNET_ASYNC_RESULT.dwResult = 1; + InternetCallback12(m_BaseNetData[NetChannel].m_hRequest, + (ULONG)&m_arCallBackData[NetChannel], + INTERNET_STATUS_REQUEST_COMPLETE, + &pINTERNET_ASYNC_RESULT, + sizeof(pINTERNET_ASYNC_RESULT));*/ + +} + + +long CBaseNetManager::InetProcessing(NET_CHANNEL_ENUM NetChannel) +{ + DWORD err; + DWORD MAXConn; +/* + etWININET, + etSTATUS, + etSERVER, + etFILE, + etCANCEL*/ + +// time_t pp; +nextstep: + MCTRACE(NetChannel+ 3, + "CBaseNetManager::InetProcessing *State_dump_1*\r\n" + "Channel = %d;\r\n" + "State = %d;\r\n", + NetChannel, + m_BaseNetData[NetChannel].m_ChannelState); + +switch(m_BaseNetData[NetChannel].m_ChannelState) +{ + //===================================================================== + //Begin + case NET_CHANNEL_STATE_BEGIN: + + if(NetChannel == NET_COMMAND_CHANNEL) + InterlockedIncrement(&m_BaseNetData[NetChannel].haveMessage); + MAXConn = 10; + InternetSetOption(NULL, + INTERNET_OPTION_MAX_CONNS_PER_SERVER , + &MAXConn, + 4 + ); + + MAXConn = 10; + InternetSetOption(NULL, + INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, + &MAXConn, + 4 + ); + + + TCHAR ObjectString[300]; + if(strlen(m_BaseNetData[NetChannel].GetObjectName())) + _stprintf(ObjectString,_T("%s%s"),m_BASE_NET_MANAGER_CONFIG.m_szPath,m_BaseNetData[NetChannel].GetObjectName()); + else + strcpy(ObjectString,m_BASE_NET_MANAGER_CONFIG.m_szPath); + + m_BaseNetData[NetChannel].m_hRequest = + HttpOpenRequest(m_BaseNetData[NetChannel].m_hConnect, + m_BaseNetData[NetChannel].GetVerbs(), + ObjectString, + _T("HTTP/1.1"), + NULL, + NULL, + m_BaseNetData[NetChannel].GetOpenRequestFlags(), + (ULONG)&m_arCallBackData[NetChannel]); + //if error + if(m_BaseNetData[NetChannel].m_hRequest == NULL) + { + err = GetLastError(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + return S_OK; + } + + m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_REQUEST_SEND; + + if(m_BASE_NET_MANAGER_CONFIG.m_bSecure) + { + + int HeaderLen = ATLMC::ProxyAuthorizationStringGetRequiredLength( + m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin,m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword); + LPSTR strHeader = new CHAR[HeaderLen+1]; + ZeroMemory(strHeader,HeaderLen+1); + + HRESULT hr = ATLMC::ProxyAuthorizationString( + m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin,m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword,strHeader,&HeaderLen); + +// ASSERT(hr==S_OK); + + HttpAddRequestHeaders(m_BaseNetData[NetChannel].m_hRequest, strHeader, HeaderLen,HTTP_ADDREQ_FLAG_ADD ); + + delete []strHeader; + + + /* char* rangeHeader = "Proxy-Authorization: Basic ZXVnOjMyMzc4ODA5MDI=\r\n"; + DWORD dwBuffSize = strlen(rangeHeader); + + HttpAddRequestHeaders(m_BaseNetData[NetChannel].m_hRequest, rangeHeader, dwBuffSize, + HTTP_ADDREQ_FLAG_ADD ); // calls HttpSendRequest again - see HttpDump + */ + + } + m_BaseNetData[NetChannel].BeginSendRequest(); + if(!HttpSendRequestEx(m_BaseNetData[NetChannel].m_hRequest, + m_BaseNetData[NetChannel].GetOutBuffer(), + NULL, + m_BaseNetData[NetChannel].GetSendRequestFlags(), + (ULONG)&m_arCallBackData[NetChannel])) + {//if error + err = GetLastError(); + if(ERROR_IO_PENDING != err) + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + return S_OK; + } + } + else + { + m_BaseNetData[NetChannel].EndTimeOut(); + goto nextstep; + } + + break; + //===================================================================== + //Write data + case NET_CHANNEL_STATE_REQUEST_SEND: + + if(!m_BaseNetData[NetChannel].bDataSent) + { + if(m_BaseNetData[NetChannel].m_CallBackHWND!= 0 + &&m_BaseNetData[NetChannel].m_ChannelType == NET_FILESEND_CHANNEL) + ::PostMessage(m_BaseNetData[NetChannel].m_CallBackHWND, + WM_UPLOAD_BEGIN, + m_BaseNetData[NetChannel].m_CurrentHandles, + m_BaseNetData[NetChannel].GetFullSize()); + + DWORD dwReadSize; + m_BaseNetData[NetChannel].bDataSent = TRUE; + LPVOID pTempBuff = m_BaseNetData[NetChannel].GetDataBuffer(dwReadSize); + + if(dwReadSize != 0) + if(!InternetWriteFile(m_BaseNetData[NetChannel].m_hRequest, + pTempBuff, + dwReadSize, + &m_BaseNetData[NetChannel].m_dInwBufferSize)) + {//if error + err = GetLastError(); + if(ERROR_IO_PENDING != err) + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + return S_OK; + } + } + else + { + m_BaseNetData[NetChannel].EndTimeOut(); + goto nextstep; + } + } + + if(m_BaseNetData[NetChannel].m_ChannelType == NET_FILESEND_CHANNEL) + { + + DWORD dwReadSize; + m_BaseNetData[NetChannel].m_dwFullWriteSize += + m_BaseNetData[NetChannel].m_dInwBufferSize; + + if(m_BaseNetData[NetChannel].m_dwFullWriteSize == 0) + { + + } + else + { + + if(m_BaseNetData[NetChannel].m_CallBackHWND!= 0 && + m_BaseNetData[NetChannel].m_ChannelType == NET_FILESEND_CHANNEL) + ::PostMessage(m_BaseNetData[NetChannel].m_CallBackHWND, + WM_UPLOAD_STEP, + m_BaseNetData[NetChannel].m_CurrentHandles, + m_BaseNetData[NetChannel].m_dwFullWriteSize); + } + + if(!ReadFile(m_BaseNetData[NetChannel].m_hOutFile, + m_BaseNetData[NetChannel].m_pInBuffer, + 5024, + &dwReadSize,// &m_BaseNetData[NetChannel].m_dInwBufferSize, + NULL)) + { + m_BaseNetData[NetChannel].SetEnd(etFILE,GetLastError()); + return S_OK; + } + if(dwReadSize == 0) + { + m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_REQUEST_DATA_SEND; + //memcpy(m_BaseNetData[NetChannel].m_pInBuffer,"\r\n",2); + //dwReadSize = 2; + goto nextstep; + return S_OK; + } + + m_BaseNetData[NetChannel].BeginWriteData(); + + if(!InternetWriteFile(m_BaseNetData[NetChannel].m_hRequest, + m_BaseNetData[NetChannel].m_pInBuffer, + dwReadSize, + &m_BaseNetData[NetChannel].m_dInwBufferSize)) + {//if error + err = GetLastError(); + if(ERROR_IO_PENDING != err) + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + return S_OK; + } + } + else + { + m_BaseNetData[NetChannel].EndTimeOut(); + if(WaitChanel(NetChannel)) + goto nextstep; + + } + + } + else + { + m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_REQUEST_DATA_SEND; + goto nextstep; + } + + + break; + + //===================================================================== + //End Request + case NET_CHANNEL_STATE_REQUEST_DATA_SEND: + + m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_REQUEST_END; + + m_BaseNetData[NetChannel].BeginSendRequest(); + if(!HttpEndRequest(m_BaseNetData[NetChannel].m_hRequest, + NULL, + HSR_INITIATE | HSR_ASYNC, + (ULONG)&m_arCallBackData[NetChannel])) + { + err = GetLastError(); + if(ERROR_IO_PENDING != err) + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + return S_OK; + } + } + else + { + m_BaseNetData[NetChannel].EndTimeOut(); + goto nextstep; + + } + + + break; + //===================================================================== + //Check Status and IM Error + case NET_CHANNEL_STATE_REQUEST_END: + //add log sent header + g_AddSentBytes(180); + + if(!CheckStatus(NetChannel)) + break; + //goto nextstep; + //===================================================================== + //Read response + case NET_CHANNEL_STATE_RESPONSE_READ: + if(!m_BaseNetData[NetChannel].WriteAnswer()) + break; + if(m_BaseNetData[NetChannel].m_ChannelState == NET_CHANNEL_STATE_BEGIN) + { + goto nextstep; + return S_OK; + } + //m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_RESPONSE_READ; + + m_BaseNetData[NetChannel].BeginReadData(); + if(!InternetReadFileEx(m_BaseNetData[NetChannel].m_hRequest, + m_BaseNetData[NetChannel].GetInBuffer(), + IRF_ASYNC | IRF_USE_CONTEXT | IRF_NO_WAIT, + (ULONG)&m_arCallBackData[NetChannel])) + { + + err = GetLastError(); + m_BaseNetData[NetChannel].m_WriteData = FALSE; + if(ERROR_IO_PENDING != err) + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + return S_OK; + } + } + else + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].m_WriteData = TRUE; + if(WaitChanel(NetChannel)) + goto nextstep; + } + + break; + default: + ATLASSERT(FALSE); + break; +} + return S_OK; +} + +void CBaseNetManager::CallBack(NET_CHANNEL_ENUM NetChannel, INTERNET_ASYNC_RESULT *pResult) +{ + ATLTRACE("\r\nCallBack result = %d \r\n",pResult->dwResult); + MCTRACE(NetChannel+ 3, + "CBaseNetManager::CallBack *State_dump_1*\r\n" + "Channel = %d;\r\n" + "State = %d;\r\n" + "Error = %d;\r\n" + "Result = %d;\r\n", + NetChannel,m_BaseNetData[NetChannel].m_ChannelState, pResult->dwError,pResult->dwResult); + m_BaseNetData[NetChannel].EndTimeOut(); + + //CheckStatus(NetChannel); + + // OZ [2008-04-25] Windows Authentication Addon + if(pResult->dwError == 12032) + { + /*DWORD dwError = ::InternetErrorDlg(::GetDesktopWindow(), m_BaseNetData[NetChannel].m_hRequest, + ERROR_INTERNET_INCORRECT_PASSWORD, + FLAGS_ERROR_UI_FILTER_FOR_ERRORS | + FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | + FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, + NULL);*/ + + m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_REQUEST_SEND; + m_BaseNetData[NetChannel].bDataSent = FALSE; + m_BaseNetData[NetChannel].BeginSendRequest(); + + if(!HttpSendRequestEx(m_BaseNetData[NetChannel].m_hRequest, + m_BaseNetData[NetChannel].GetOutBuffer(), + NULL, + m_BaseNetData[NetChannel].GetSendRequestFlags(), + (ULONG)&m_arCallBackData[NetChannel])) + {//if error + HRESULT err = GetLastError(); + if(ERROR_IO_PENDING != err) + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + return; + } + } + else + { + m_BaseNetData[NetChannel].EndTimeOut(); + } + + return; + } + else + // End Addon + if(pResult->dwError != 0) + { + m_BaseNetData[NetChannel].SetEnd(etWININET,pResult->dwError); + return; + } + +/* + if(NetChannel == NET_FILESEND_CHANNEL + || NetChannel == NET_FILERECEIVE_CHANNEL) + { + __int64 qwDueTime; + LARGE_INTEGER liDueTime; + qwDueTime = -1 * 10000 * 200; + + // Copy the relative time into a LARGE_INTEGER. + liDueTime.LowPart = (DWORD) ( qwDueTime & 0xFFFFFFFF );` + liDueTime.HighPart = (LONG) ( qwDueTime >> 32 ); + + BOOL res = SetWaitableTimer(m_TimeoutEvents[4+NetChannel],&liDueTime,0,NULL,NULL,0); + } + else*/ + + + InetProcessing(NetChannel); +} + +BOOL CBaseNetManager::WriteFile(NET_CHANNEL_ENUM enChannel) +{ + DWORD dwThreadId; + HANDLE hTherad; + hTherad = CreateThread(NULL, + 512000, + ThreadProc, + (LPVOID)&m_arCallBackData[enChannel], + NULL,&dwThreadId); + if(hTherad == NULL) return FALSE; + CloseHandle(hTherad); + return true; +} + + +BOOL CBaseNetManager::CheckStatus(NET_CHANNEL_ENUM NetChannel) +{ + DWORD dwHTTPStatus; + DWORD dwBufferSize = 4; +// DWORD dwOutSize; + if(!HttpQueryInfo(m_BaseNetData[NetChannel].m_hRequest, + HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, + &dwHTTPStatus, + &dwBufferSize, + NULL)) + { + m_BaseNetData[NetChannel].SetEnd(etWININET,GetLastError()); + return false; + } + + + + dwBufferSize = 0; + HttpQueryInfo(m_BaseNetData[NetChannel].m_hRequest, + HTTP_QUERY_RAW_HEADERS_CRLF, + NULL, + &dwBufferSize, + NULL); + + g_AddReceivedBytes(dwBufferSize+2); + +//======================================================================== + if((dwHTTPStatus > 300 && dwHTTPStatus < 303) && NetChannel == NET_COMMAND_CHANNEL) + { + TCHAR lpBuff[1024]; +// TCHAR *Status,*End; + dwBufferSize = 1024; + if(!HttpQueryInfo(m_BaseNetData[NetChannel].m_hRequest, + HTTP_QUERY_LOCATION, + &lpBuff, + &dwBufferSize, + NULL)) + { + m_BaseNetData[NetChannel].SetEnd(etWININET,GetLastError()); + return false; + } + + //TODO + //change server or url + URL_COMPONENTS m_URL_COMPONENTS = {0}; + // TCHAR lpHost[1024]; + TCHAR lpPath[1024]; + + m_URL_COMPONENTS.dwStructSize = sizeof(URL_COMPONENTS); + //m_URL_COMPONENTS.dwHostNameLength = 1024; + //m_URL_COMPONENTS.lpszHostName = lpHost; + m_URL_COMPONENTS.dwUrlPathLength = 1024; + m_URL_COMPONENTS.lpszUrlPath = lpPath; + + LONG err = InternetCrackUrl(lpBuff,dwBufferSize,0,&m_URL_COMPONENTS); + + + strcpy(m_BASE_NET_MANAGER_CONFIG.m_szPath, lpPath); + //strcpy(CIM_Net::m_BASE_NET_MANAGER_CONFIG.m_szServerName,lpHost); + //m_IsInit = false; + //Init(CIM_Net::m_BASE_NET_MANAGER_CONFIG); + + m_BaseNetData[NetChannel].SetEnd(etSTATUS,dwHTTPStatus); + return false; + } + + + +//======================================================================== +/* + if(dwHTTPStatus == 407) + { + + m_intCount407++; + m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_REQUEST_SEND; + + m_BaseNetData[NetChannel].BeginSendRequest(); + if(!HttpSendRequestEx(m_BaseNetData[NetChannel].m_hRequest, + m_BaseNetData[NetChannel].GetOutBuffer(), + NULL, + m_BaseNetData[NetChannel].GetSendRequestFlags(), + (ULONG)&m_arCallBackData[NetChannel])) + {//if error + long err = GetLastError(); + if(ERROR_IO_PENDING != err) + { + m_BaseNetData[NetChannel].EndTimeOut(); + m_BaseNetData[NetChannel].SetEnd(etWININET,err); + m_BaseNetData[NetChannel].m_ChannelState = NET_CHANNEL_STATE_REQUEST_SEND; + return true; + } + return false; + } + else + { + m_BaseNetData[NetChannel].EndTimeOut(); + return false; + } + } + +*/ + if(dwHTTPStatus != 200) + { + m_BaseNetData[NetChannel].SetEnd(etSTATUS,dwHTTPStatus); + return false; + } + dwBufferSize =4; + HttpQueryInfo(m_BaseNetData[NetChannel].m_hRequest, + HTTP_QUERY_CONTENT_LENGTH| HTTP_QUERY_FLAG_NUMBER, + &m_BaseNetData[NetChannel].m_dwContentLength, + &dwBufferSize, + NULL); + + TCHAR lpBuff[1024]; + TCHAR *Status,*End; + dwBufferSize = 1024; + if(!HttpQueryInfo(m_BaseNetData[NetChannel].m_hRequest, + HTTP_QUERY_RAW_HEADERS_CRLF , + &lpBuff, + &dwBufferSize, + NULL)) + { + m_BaseNetData[NetChannel].SetEnd(etWININET,GetLastError()); + return false; + } + Status = strstr(lpBuff,_T("IMErrorCode")); + if(Status != 0) + { + Status += 13; + End = strstr(Status,_T("\r\n")); + *End = '\0'; + dwHTTPStatus = _ttol(Status); + if(dwHTTPStatus != 200) + { + m_BaseNetData[NetChannel].SetEnd(etSERVER,dwHTTPStatus); + return false; + } + return true; + } + if(Status == 0 && m_BaseNetData[NetChannel].m_ChannelType == NET_FILERECEIVE_CHANNEL) + return true; + m_BaseNetData[NetChannel].SetEnd(etWININET,GetLastError()); + return false; +} + +long CBaseNetManager::Reconfig(BASE_NET_MANAGER_CONFIG sConfig) +{ + return S_OK; +} + +DWORD WINAPI CBaseNetManager::TimeOutThreadProc(LPVOID lpParameter) +{ + CBaseNetManager* Class; + Class = (CBaseNetManager*)lpParameter; + return Class->TimeOut(lpParameter); + +} + +DWORD CBaseNetManager::TimeOut(LPVOID param) +{ + while(true) + { + DWORD kk = WaitForMultipleObjects(8,m_TimeoutEvents,FALSE,INFINITE); + if(kk == 5) break; + + if(kk == 6 || kk == 7) + { + InetProcessing((NET_CHANNEL_ENUM)(kk - 4)); + } + else + if(m_BaseNetData[kk].m_hRequest != NULL) + { + try + { + InternetCloseHandle(m_BaseNetData[kk].m_hRequest); + m_BaseNetData[kk].m_hRequest = NULL; + }catch(...) + { + } + } + } + return S_OK; +} + +BOOL CBaseNetManager::WaitChanel(NET_CHANNEL_ENUM NetChannel) +{ +// ATLASSERT((NetChannel == NET_FILESEND_CHANNEL +// || NetChannel == NET_FILERECEIVE_CHANNEL)); + + if((NetChannel == NET_FILESEND_CHANNEL + || NetChannel == NET_FILERECEIVE_CHANNEL) + &&(m_BaseNetData[NET_COMMAND_CHANNEL].haveMessage == 1)) + { + __int64 qwDueTime; + LARGE_INTEGER liDueTime; + + qwDueTime = -1 * 10000 * 5000; + //else + //qwDueTime = -1 * 10000 * 900; + + // Copy the relative time into a LARGE_INTEGER. + liDueTime.LowPart = (DWORD) ( qwDueTime & 0xFFFFFFFF ); + liDueTime.HighPart = (LONG) ( qwDueTime >> 32 ); + + BOOL res = SetWaitableTimer(m_TimeoutEvents[4+NetChannel],&liDueTime,0,NULL,NULL,0); + return FALSE; + } + return TRUE; +} diff --git a/Source/Client/IM-Client/ATL_NetLib/BaseNetManager.h b/Source/Client/IM-Client/ATL_NetLib/BaseNetManager.h new file mode 100644 index 0000000..cb19992 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/BaseNetManager.h @@ -0,0 +1,123 @@ +// BaseNetManager.h: interface for the CBaseNetManager class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_BASENETMANAGER_H__E32BA28F_6E71_4A9F_80BF_D38A12AAFC24__INCLUDED_) +#define AFX_BASENETMANAGER_H__E32BA28F_6E71_4A9F_80BF_D38A12AAFC24__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +#include "basenetdata.h" + +void g_AddSentBytes(long bytes); +void g_AddReceivedBytes(long bytes); + + +struct BASE_NET_MANAGER_CONFIG +{ + BASE_NET_MANAGER_CONFIG() + { + strcpy(m_szServerName,_T("im.war.ru")); + strcpy(m_szPath,_T("ofs_server.dll")); + //m_szServerName[0] = '\0'; + //m_szPath[0] = '\0'; + m_szProxyServerName[0] = '\0'; + m_szProxyServerLogin[0] = '\0'; + m_szProxyServerPassword[0] = '\0'; + m_ServerPort = 80; + m_ProxyServerPort = 8080; + m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT; + m_bSecure = FALSE; + m_bUseSSL = FALSE; + } + + TCHAR m_szServerName[200]; + TCHAR m_szPath[200]; + short m_ServerPort; + + DWORD m_dwAccessType; + TCHAR m_szProxyServerName[200]; + short m_ProxyServerPort; + BOOL m_bSecure; + TCHAR m_szProxyServerLogin[100]; + TCHAR m_szProxyServerPassword[100]; + BOOL m_bUseSSL; + + BASE_NET_MANAGER_CONFIG& operator=( const BASE_NET_MANAGER_CONFIG& s1) + { + strcpy(m_szServerName,s1.m_szServerName); + strcpy(m_szPath,s1.m_szPath); + m_ServerPort = s1.m_ServerPort; + + m_dwAccessType = s1.m_dwAccessType; + m_ProxyServerPort = s1.m_ProxyServerPort; + m_bSecure = s1.m_bSecure; + strcpy(m_szProxyServerName,s1.m_szProxyServerName); + strcpy(m_szProxyServerLogin,s1.m_szProxyServerLogin); + strcpy(m_szProxyServerPassword,s1.m_szProxyServerPassword); + m_bUseSSL = s1.m_bUseSSL; + return *this; + } + +}; + +class CBaseNetManager +{ + struct _CALL_BACK_DATA + { + CBaseNetManager* pBaseNetManager; + NET_CHANNEL_ENUM pChannel; + }; + +public: + BOOL WaitChanel(NET_CHANNEL_ENUM mChannel); + CBaseNetManager(); + virtual ~CBaseNetManager(); + + void GetResult(NET_CHANNEL_ENUM emChannel, IStream** lpStream); + void GetResultError(NET_CHANNEL_ENUM emChannel, DWORD& ErrorType, DWORD& ErrorCode); + long GetNextEvent(IStream** lpStream); + long StopEventReceiver(); + long StartEventReceiver(LPCTSTR lpszSID,HANDLE hCallBackEvent,HANDLE hNewEventCallBackEvent); + long StartOperation(NET_CHANNEL_ENUM NetChannel,LPCTSTR lpszSID, DWORD Handle, IStream* pStream, HANDLE hCallBackEvent, LPCTSTR FileName = NULL, NET_FILE_DIRECTION FileDirection = NET_FILE_NONE, HWND CallBackHWND = NULL); + long StopOperation(NET_CHANNEL_ENUM NetChannel); + long StopAllOperations(); + long Close(); + long Reconfig(BASE_NET_MANAGER_CONFIG sConfig); + long Init(BASE_NET_MANAGER_CONFIG sConfig); + +private: + DWORD TimeOut(LPVOID param); + static DWORD WINAPI TimeOutThreadProc(LPVOID lpParameter); + long InetProcessing(NET_CHANNEL_ENUM NetChannel); + + BOOL CheckStatus(NET_CHANNEL_ENUM enChannel); + BOOL WriteFile(NET_CHANNEL_ENUM enChannel); + void CallBack(NET_CHANNEL_ENUM enChannel, INTERNET_ASYNC_RESULT* pResult); + + + static void CALLBACK InternetCallback12( + HINTERNET hInternet, + DWORD dwcontext, + DWORD dwInternetStatus, + LPVOID lpvStatusInformation, + DWORD dwStatusInformationLength + ); + + + + void WorkFunction(NET_CHANNEL_ENUM NetChannel); + static DWORD WINAPI ThreadProc(LPVOID lpParameter); + + BASE_NET_MANAGER_CONFIG m_BASE_NET_MANAGER_CONFIG; + CBaseNetData m_BaseNetData[5]; + _CALL_BACK_DATA m_arCallBackData[5]; + HANDLE m_TimeoutEvents[8]; + HINTERNET m_hInternet; + BOOL m_IsInit; + BOOL m_bClose; +// int m_intCount407; +}; + +#endif // !defined(AFX_BASENETMANAGER_H__E32BA28F_6E71_4A9F_80BF_D38A12AAFC24__INCLUDED_) diff --git a/Source/Client/IM-Client/ATL_NetLib/CallBackEvents.rgs b/Source/Client/IM-Client/ATL_NetLib/CallBackEvents.rgs new file mode 100644 index 0000000..2e86c41 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/CallBackEvents.rgs @@ -0,0 +1,23 @@ +HKCR +{ + Mediachase.IMCallBackEvents.1 = s 'CallBackEvents Class' + { + CLSID = s '{A998B391-B30C-4101-BCE2-97067098C26C}' + } + Mediachase.IMCallBackEvents = s 'CallBackEvents Class' + { + CLSID = s '{A998B391-B30C-4101-BCE2-97067098C26C}' + } + NoRemove CLSID + { + ForceRemove {A998B391-B30C-4101-BCE2-97067098C26C} = s 'CallBackEvents Class' + { + ProgID = s 'Mediachase.IMCallBackEvents.1' + VersionIndependentProgID = s 'Mediachase.IMCallBackEvents' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Collections.h b/Source/Client/IM-Client/ATL_NetLib/Collections.h new file mode 100644 index 0000000..e3308f7 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Collections.h @@ -0,0 +1,35 @@ +#ifndef __COLLECTIONS_H_ +#define __COLLECTIONS_H_ + +template +struct _CopyVariantFromAdaptItf { + static HRESULT copy(VARIANT* p1, const CAdapt< CComPtr >* p2) { + HRESULT hr = p2->m_T->QueryInterface(IID_IDispatch, (void**)&p1->pdispVal); + if( SUCCEEDED(hr) ) { + p1->vt = VT_DISPATCH; + } + else { + hr = p2->m_T->QueryInterface(IID_IUnknown, (void**)&p1->punkVal); + if( SUCCEEDED(hr) ) { + p1->vt = VT_UNKNOWN; + } + } + + return hr; + } + + static void init(VARIANT* p) { VariantInit(p); } + static void destroy(VARIANT* p) { VariantClear(p); } +}; + +template +struct _CopyItfFromAdaptItf { + static HRESULT copy(T** p1, const CAdapt< CComPtr >* p2) { + if( *p1 = p2->m_T ) return (*p1)->AddRef(), S_OK; + return E_POINTER; + } + + static void init(T** p) {} + static void destroy(T** p) { if( *p ) (*p)->Release(); } +}; +#endif \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/CommandQueue.cpp b/Source/Client/IM-Client/ATL_NetLib/CommandQueue.cpp new file mode 100644 index 0000000..5ae1b83 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/CommandQueue.cpp @@ -0,0 +1,3382 @@ +// CommandQueue.cpp: implementation of the CCommandQueue class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "CommandQueue.h" +#include "Session.h" +#include "Message.h" +#include "Messages.h" +#include "Users.h" +#include "User.h" +#include "file.h" +#include "files.h" +#include "promo.h" +#include "promos.h" +#include "sid.h" +#include "sids.h" +#include "ichat.h" +#include "ichats.h" + + +#include +//#define AlREADY_IN_QUEUE 2 +#define CHECKHR(r) {if(FAILED(r)){hr = r; goto CleanUp;}} + +#define INIT_QUEUE_OUT_STR _T(""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + "
"\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + ""\ + "") + +#define INIT_QUEUE_IN_STR _T("") + + +void UnPackString(IXMLDOMNode* pNode, BSTR path,CComBSTR& Value) +{ + CComPtr pTempNode; +try +{ + Value.Empty(); + pNode->selectSingleNode(path,&pTempNode); + if(pTempNode) + { + pTempNode->get_text(&Value); + + } +} +catch(...){} +} + +void UnPackLong(IXMLDOMNode* pNode, BSTR path,long& Value) +{ + CComPtr pTempNode; + CComBSTR text; +try +{ + Value = 0; + pNode->selectSingleNode(path,&pTempNode); + if(pTempNode) + { + USES_CONVERSION; + pTempNode->get_text(&text); + Value =atol(OLE2T(text)); + + } +} +catch(...){} +} +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CCommandQueue::CCommandQueue() +{ + MCTRACE(1,"CCommandQueue::CCommandQueue() BEGIN"); + ::InitializeCriticalSection(&CS_Queue); + m_Handle = 1; + MCTRACE(1,"CCommandQueue::CCommandQueue() end"); +} + +CCommandQueue::~CCommandQueue() +{ + ::DeleteCriticalSection(&CS_Queue); +} + +HRESULT CCommandQueue::InPutQueueInit() +{ + return S_OK; +} +HRESULT CCommandQueue::OutPutQueueInit() +{ + VARIANT_BOOL res; + HRESULT hr = S_OK; + + /////////////////////////// + // AnswerRoot + + + if(pAnswerDom == NULL) + { + MCTRACE(1,"MSXML.FreeThreadedDOMDocument found hr =%d \r\n",hr); + CHECKHR(pAnswerDom.CoCreateInstance(CLSID_FreeThreadedDOMDocument40)) + MCTRACE(1,"HRESULT CLSID_FreeThreadedDOMDocument%d \r\n",hr); + + + CHECKHR(pAnswerDom->loadXML(CComBSTR(INIT_QUEUE_IN_STR),&res)); + CHECKHR(pAnswerDom->get_firstChild(&pAnswerRootNode)); + } + + /////////////////////////// + // Root + if(pDom != NULL) {pDom.Release(); pRootNode.Release();}; + + CHECKHR(pDom.CoCreateInstance(CLSID_FreeThreadedDOMDocument40)) + + CHECKHR(pDom->loadXML(CComBSTR(INIT_QUEUE_OUT_STR),&res)); + CHECKHR(pDom->get_firstChild(&pRootNode)); + + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\init_queue_out.xml")); + pAnswerDom->save(CComVariant("c:\\im\\init_queue_in.xml")); +#endif +CleanUp: + return hr; +} + + + +DWORD CCommandQueue::x_LogOn(CComBSTR SID, CComBSTR UserName, CComBSTR Password, long Status) +{ + MCTRACE(1,"x_logOn begin"); + CComPtr pNode; + CComPtr pLogonNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + long ErrorCode; + char Value[30]; + + + m_bstrLogin.Empty(); + m_bstrLogin.Attach(UserName.Copy()); + m_bstrPassword.Empty(); + m_bstrPassword.Attach(Password.Copy()); + m_Status = Status; + + pRootNode->selectSingleNode(CComBSTR("Commands/LogOn/*"),&pChildNode); + if(pChildNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + pRootNode->selectSingleNode(CComBSTR("SID"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + pChildNode->put_text(SID); + pChildNode.Release(); + + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmLogOn)); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_logon")); + pCommandNode->appendChild(pNode,&pLogonNode); + pNode.Release(); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("login"),NULL,&pNode); + pLogonNode->appendChild(pNode,&pChildNode); + pChildNode->put_text(UserName); + pNode.Release(); + pChildNode.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("password"),NULL,&pNode); + pLogonNode->appendChild(pNode,&pChildNode); + pChildNode->put_text(Password); + pNode.Release(); + pChildNode.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("status"),NULL,&pNode); + pLogonNode->appendChild(pNode,&pChildNode); + ltoa(Status,Value,10); + pChildNode->put_text(CComBSTR(Value)); + pChildNode.Release(); + pLogonNode.Release(); + pNode.Release(); + + pRootNode->selectSingleNode(CComBSTR("Commands/LogOn"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + pChildNode->appendChild(pCommandNode,&pNode); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + MCTRACE(1,"x_logOn end"); + return m_Handle; +} + + +bool CCommandQueue::CheckQueueItem(CComBSTR CommandType, IXMLDOMDocument** pComm, DWORD& dwHandle, DWORD& dwType, BSTR *FileName, long* hBackWind, long* size, BSTR *bstrSID) +{ + CComPtr pNode; + CComPtr pCommandNode; + CComPtr pCommandNodeTemp; + CComPtr pSID; + CComPtrpCommandDoc; + CComPtr pEle; + CComVariant pVar; + CComBSTR bstrSTR; + + if(pRootNode==NULL) + return false; + + pRootNode->selectSingleNode(CommandType,&pNode); + pRootNode->selectSingleNode(CComBSTR("SID"),&pSID); + if(pNode) + { + pCommandDoc.CoCreateInstance(CLSID_FreeThreadedDOMDocument40);//????????????????????????? + + //Create && sid + pCommandDoc->createNode(CComVariant(NODE_ELEMENT),CComBSTR("packet"),NULL,&pCommandNodeTemp); + pCommandNodeTemp->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pSID->get_text(&bstrSTR); + pEle->setAttribute(CComBSTR("sid"),CComVariant(bstrSTR)); + pCommandDoc->appendChild(pCommandNodeTemp,&pCommandNode); + pCommandNodeTemp.Release(); + pEle.Release(); + pSID.Release(); + + //Get Handle and Type + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + USES_CONVERSION; + pEle->getAttribute(CComBSTR("handle"),&pVar); + dwHandle = atol(OLE2T(pVar.bstrVal)); + + pEle->getAttribute(CComBSTR("type"),&pVar); + dwType = atol(OLE2T(pVar.bstrVal)); + + pEle->getAttribute(CComBSTR("FileSize"),&pVar); + if(pVar.vt != VT_NULL) + *size = atol(OLE2T(pVar.bstrVal)); + + pEle->getAttribute(CComBSTR("hWnd"),&pVar); + if(pVar.vt != VT_NULL) + *hBackWind = atol(OLE2T(pVar.bstrVal)); + + pEle->getAttribute(CComBSTR("FilePath"),&pVar); + if(pVar.vt != VT_NULL) + *FileName = CComBSTR(pVar.bstrVal).Detach(); + + if(bstrSID != 0) + bstrSTR.CopyTo(bstrSID); + + //Insert Command + pNode->get_firstChild(&pCommandNodeTemp); + pNode.Release(); + pCommandNodeTemp->cloneNode(VARIANT_TRUE,&pNode); + pCommandNodeTemp.Release(); + pCommandNode->appendChild(pNode,&pCommandNodeTemp); +#ifdef _DEBUG + pCommandDoc->save(CComVariant("c:\\im\\command.xml")); +#endif + *pComm = pCommandDoc.Detach(); + + return true; + } + return false; +} + +void CCommandQueue::LockQueue() +{ + ::EnterCriticalSection(&CS_Queue); +} + +void CCommandQueue::UnlockQueue() +{ + ::LeaveCriticalSection(&CS_Queue); +} + +DWORD CCommandQueue::x_LogOff() +{ + CComPtr pNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + long ErrorCode; + + pRootNode->selectSingleNode(CComBSTR("Commands/LogOff/*"),&pChildNode); + if(pChildNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmLogOff)); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_logoff")); + pCommandNode->appendChild(pNode,&pChildNode); + pChildNode.Release(); + pNode.Release(); + pEle.Release(); + + pRootNode->selectSingleNode(CComBSTR("Commands/LogOff"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + pChildNode->appendChild(pCommandNode,&pNode); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + +LONG CCommandQueue::DeleteCommand(DWORD handle) +{ + TCHAR szFiltr[100]; + CComPtr pChildNode; + CComPtr pNode; + CComPtr pParrentNode; + CComBSTR bstrFiltr; + LPCTSTR temp[4]= {_T("Commands/*/*[@handle = \"%d\"]"), + _T("History/*/*[@handle = \"%d\"]"), + _T("ReceiveFiles/*[@handle = \"%d\"]"), + _T("SendFiles/*[@handle = \"%d\"]") + }; + + for(int k=0; k<4; k++) + { + bstrFiltr.Empty(); + sprintf(szFiltr,temp[k],handle); + bstrFiltr = CComBSTR(szFiltr); + + pRootNode->selectSingleNode(bstrFiltr,&pChildNode); + if(pChildNode) + { + pChildNode->get_parentNode(&pParrentNode); + pParrentNode->removeChild(pChildNode,&pNode); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return k; + } + } + + return -1; +} + +DWORD CCommandQueue::x_Message(CMessage *pMessage,long& Handle) +{ + CComPtr pChildNode; + CComPtr pNode; + CComPtr pTempNode; + CComPtr pMessageNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pRecipientsNode; + CComPtr pEle; + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; + char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/Messages"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/message[@mid =\""); + bstrFiltr += pMessage->m_sMessage.m_MID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pTempNode); + if(pTempNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmMessage)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_message")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //message + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("message"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("mid"),CComVariant(pMessage->m_sMessage.m_MID)); + pRequestNode->appendChild(pNode,&pMessageNode); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + //Create body Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("body"),NULL,&pNode); + pNode->put_text(pMessage->m_sMessage.m_Body); + pMessageNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + if(pMessage->m_sMessage.m_bChat) + { + //CHAT + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("chat"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("cid"),CComVariant(pMessage->m_sMessage.m_Chat.m_CID)); + pMessageNode->appendChild(pNode,NULL); + pNode.Release(); + pEle.Release(); + } + else + { + //recipients + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("recipients"),NULL,&pNode); + pMessageNode->appendChild(pNode,&pRecipientsNode); + pNode.Release(); + + long count,lID; + CComPtr pUser; + pMessage->m_pRecipients->get_Count(&count); + + if(count == 0) throw(ErrorCode = WRONG_PARAM); + for(long k=1; k<=count; ++k) + { + pMessage->m_pRecipients->get_Item(k,&pUser); + CComVariant vID; + pUser->get_Value(CComBSTR(_T("@id")),&vID); + lID = vID.lVal; + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(lID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRecipientsNode->appendChild(pNode,&pTempNode); + + pTempNode.Release(); + pNode.Release(); + pEle.Release(); + pUser.Release(); + } + } + + pChildNode->appendChild(pCommandNode,&pTempNode); + if(pTempNode == NULL) throw(ErrorCode = WRONG_QUEUE); + Handle = m_Handle; +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_SendFile(CFile *pFile, long& Handle) +{ + USES_CONVERSION; + CComPtr pChildNode; + + CComPtr pNode; + CComPtr pTempNode; + CComPtr pFileNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pRecipientsNode; + CComPtr pEle; + CComBSTR bstrSTR; + DWORD ErrorCode; + char Value[30]; + LPTSTR FileName = NULL; + LPTSTR FilePath; + long FileSize,k; + HANDLE hFile; + + pRootNode->selectSingleNode(CComBSTR("SendFiles"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + //File check + FilePath = OLE2T(pFile->m_sFile.m_RealName); + hFile = CreateFile(FilePath,GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL); + if(hFile != INVALID_HANDLE_VALUE) + { + FileSize = GetFileSize(hFile,NULL); + CloseHandle(hFile); + } + else + { + throw(WRONG_PARAM); + } + + for(k = strlen(FilePath)-2; k>= 0; --k) + { + if(FilePath[k] == '\\') + { + FileName = new TCHAR[strlen(FilePath)-k]; + strcpy(FileName,FilePath+k+1); + break; + } + + } + + if(FileName == NULL) throw(WRONG_PARAM); + + //command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + Handle = m_Handle; + pEle->setAttribute(CComBSTR("type"),CComVariant(cmSendFile)); + pEle->setAttribute(CComBSTR("FilePath"),CComVariant(pFile->m_sFile.m_RealName)); + pEle->setAttribute(CComBSTR("hWnd"),CComVariant(pFile->m_sFile.hBackWind)); + pEle->setAttribute(CComBSTR("FileSize"),CComVariant(FileSize)); + pEle.Release(); + + //request Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_send_file")); + pCommandNode->appendChild(pNode,&pRequestNode); +// pCommandNode.Release(); + pNode.Release(); + pEle.Release(); + + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("file"),NULL,&pNode); + pRequestNode->appendChild(pNode,&pFileNode); + pRequestNode.Release(); + pNode.Release(); + + //RealName + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("real_name"),NULL,&pNode); + pNode->put_text(CComBSTR(FileName)); + pFileNode->appendChild(pNode,&pTempNode); + delete[] FileName; + pNode.Release(); + pTempNode.Release(); + + //Body + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("body"),NULL,&pNode); + pNode->put_text(pFile->m_sFile.m_Body); + pFileNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //Size + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("size"),NULL,&pNode); + ltoa(FileSize,Value,10); + pNode->put_text(CComBSTR(Value)); + pFileNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //Recipients + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("recipients"),NULL,&pNode); + pFileNode->appendChild(pNode,&pRecipientsNode); + pNode.Release(); + + long count,lID; + CComPtr pUser; + pFile->m_pRecipients->get_Count(&count); + + if(count == 0) throw(ErrorCode = WRONG_PARAM); + for(k=1; k<=count; ++k) + { + pFile->m_pRecipients->get_Item(k,&pUser); + CComVariant vID; + pUser->get_Value(CComBSTR(_T("@id")),&vID); + lID = vID.lVal; + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(lID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRecipientsNode->appendChild(pNode,&pTempNode); + + pTempNode.Release(); + pNode.Release(); + pEle.Release(); + pUser.Release(); + } + + pChildNode->appendChild(pCommandNode,&pTempNode); + pTempNode.Release(); + pChildNode.Release(); + pCommandNode.Release(); +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_Promo(CPromo *pPromo, long& Handle) +{ + CComPtr pChildNode; + CComPtr pNode; + CComPtr pTempNode; + CComPtr pPromoNode; + CComPtr pProductNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pRecipientsNode; + CComPtr pEle; + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; + char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/Promos"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/promo[@pid =\""); + bstrFiltr += pPromo->m_sPromo.m_PID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pTempNode); + if(pTempNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmPromo)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_promo")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //Promo + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("promo"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("pid"),CComVariant(pPromo->m_sPromo.m_PID)); + pRequestNode->appendChild(pNode,&pPromoNode); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + //Create body Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("body"),NULL,&pNode); + pNode->put_text(pPromo->m_sPromo.m_Body); + pPromoNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //Create subject Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("subject"),NULL,&pNode); + pNode->put_text(pPromo->m_sPromo.m_Subject); + pPromoNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //Create Product Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("product"),NULL,&pProductNode); + pProductNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("id"),CComVariant(pPromo->m_sPromo.m_Product_ID)); + pPromoNode->appendChild(pProductNode,&pTempNode); + pEle.Release(); + pProductNode.Release(); + pTempNode.Release(); + pNode.Release(); + + + //recipients + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("recipients"),NULL,&pNode); + pPromoNode->appendChild(pNode,&pRecipientsNode); + pNode.Release(); + + long count,lID; + CComPtr pUser; + pPromo->m_pRecipients->get_Count(&count); + + if(count == 0) throw(ErrorCode = WRONG_PARAM); + for(long k=1; k<=count; ++k) + { + pPromo->m_pRecipients->get_Item(k,&pUser); + CComVariant vID; + pUser->get_Value(CComBSTR(_T("@id")),&vID); + lID = vID.lVal; + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(lID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRecipientsNode->appendChild(pNode,&pTempNode); + + pTempNode.Release(); + pNode.Release(); + pEle.Release(); + pUser.Release(); + } + + pChildNode->appendChild(pCommandNode,&pTempNode); + if(pTempNode == NULL) throw(ErrorCode = WRONG_QUEUE); + Handle = m_Handle; + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_ReceiveFile(CFile *pFile, long& Handle) +{ + USES_CONVERSION; + CComPtr pChildNode; + + CComPtr pNode; + CComPtr pTempNode; + CComPtr pFileNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pRecipientsNode; + CComPtr pEle; + CComBSTR bstrSTR; + DWORD ErrorCode; + LPTSTR FileName = NULL; +// HANDLE hFile; + + pRootNode->selectSingleNode(CComBSTR("ReceiveFiles"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + //command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + Handle = m_Handle; + pEle->setAttribute(CComBSTR("type"),CComVariant(cmReceiveFile)); + pEle->setAttribute(CComBSTR("FilePath"),CComVariant(pFile->m_sFile.m_RealName)); +// pEle->setAttribute(CComBSTR("fid"),CComVariant(pFile->m_sFile.m_FID)); + pEle->setAttribute(CComBSTR("hWnd"),CComVariant(pFile->m_sFile.hBackWind)); + pEle.Release(); + + //request Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_receive_file")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("file"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("fid"),CComVariant(pFile->m_sFile.m_FID)); + pRequestNode->appendChild(pNode,&pFileNode); + pEle.Release(); + pRequestNode.Release(); + pNode.Release(); + + + pChildNode->appendChild(pCommandNode,&pTempNode); + pTempNode.Release(); + pChildNode.Release(); + pCommandNode.Release(); +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_ConfirmMessage(BSTR MID) +{ + CComPtr pNode; + CComPtr pTempNode; + CComPtr pMessageNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pEle; + CComBSTR bstrSTR,filtr; + DWORD ErrorCode; + + //command + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmConfirmMessage)); + + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_confirm_message")); + pCommandNode->appendChild(pNode,&pRequestNode); + +// pCommandNode.Release(); + pNode.Release(); + pEle.Release(); + + //message + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("message"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("mid"),CComVariant(MID)); + pRequestNode->appendChild(pNode,&pMessageNode); + + bstrSTR.Empty(); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + filtr += CComBSTR("Commands/ConfirmMessages/command/request/message[@mid = \""); + filtr += MID; + filtr += CComBSTR("\"]"); + pRootNode->selectSingleNode(filtr,&pTempNode); + if(pTempNode) throw(ErrorCode = WRONG_QUEUE); + + pRootNode->selectSingleNode(CComBSTR("Commands/ConfirmMessages"),&pNode); + if(!pNode) throw(ErrorCode = WRONG_QUEUE); + pNode->appendChild(pCommandNode,&pTempNode); + + return m_Handle; +} + +DWORD CCommandQueue::x_ConfirmPromo(BSTR PID) +{ + CComPtr pNode; + CComPtr pTempNode; + CComPtr pPromoNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pEle; + CComBSTR bstrSTR,filtr; + DWORD ErrorCode; + + //command + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmConfirmPromo)); + + pTempNode.Release(); + pNode.Release(); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_confirm_promo")); + pCommandNode->appendChild(pNode,&pRequestNode); + + pNode.Release(); + pEle.Release(); + + //message + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("promo"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("pid"),CComVariant(PID)); + pRequestNode->appendChild(pNode,&pPromoNode); + + bstrSTR.Empty(); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + filtr += CComBSTR("Commands/ConfirmPromos/command/request/promo[@pid = \""); + filtr += PID; + filtr += CComBSTR("\"]"); + pRootNode->selectSingleNode(filtr,&pTempNode); + if(pTempNode) throw(ErrorCode = WRONG_QUEUE); + + pRootNode->selectSingleNode(CComBSTR("Commands/ConfirmPromos"),&pNode); + if(!pNode) throw(ErrorCode = WRONG_QUEUE); + pNode->appendChild(pCommandNode,&pTempNode); + + return m_Handle; +} + + +DWORD CCommandQueue::x_LoadList(ltListType ListType) +{ + CComPtr pNode; + CComPtr pRequestNode; + CComPtr pTempNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + CComBSTR bstrSTR,filtr; + DWORD ErrorCode; +try +{ + switch(ListType) + { + case ltContact: + bstrSTR=CComBSTR(L"contact"); + break; + case ltIgnore: + bstrSTR=CComBSTR(L"ignore"); + break; + case ltFiles: + bstrSTR=CComBSTR(L"files"); + break; + case ltChats: + bstrSTR=CComBSTR(L"chats"); + break; + default: + throw(ErrorCode = WRONG_PARAM); + } + + //Command + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmLoadList)); + + pEle.Release(); + + //Request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_load_list")); + pCommandNode->appendChild(pNode,&pRequestNode); + + pNode.Release(); + pEle.Release(); + + //List + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("list"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("type"),CComVariant(bstrSTR)); + pRequestNode->appendChild(pNode,&pTempNode); + + pNode.Release(); + pEle.Release(); + pTempNode.Release(); + + //Check Queue + filtr += CComBSTR("Commands/LoadList/command/request/list[@type = \""); + filtr += bstrSTR; + filtr += CComBSTR("\"]"); + + pRootNode->selectSingleNode(filtr,&pChildNode); + if(pChildNode) + { + CComBSTR pp; + pChildNode->get_text(&pp); + MCTRACE(1,pp); + throw(ErrorCode = AlREADY_IN_QUEUE); + } + //Insert Command + pRootNode->selectSingleNode(CComBSTR("Commands/LoadList"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + pChildNode->appendChild(pCommandNode,&pTempNode); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} +catch(DWORD ErrorCode) +{ + throw(ErrorCode); +} +catch(...) +{} + throw(ErrorCode = UNKNOWN_PROBLEM); +} + +DWORD CCommandQueue::x_DeleteUser(long ID, long listtype) +{ + CComPtr pNode; + CComPtr pTempNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pChildNode; + CComPtr pEle; + char Value[30]; + CComBSTR bstrSTR; + long ErrorCode; + + pRootNode->selectSingleNode(CComBSTR("Commands/DelUser"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmDelUser)); + pEle.Release(); + + //Create Request Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_delete_user")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //Create list node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("list"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + switch(listtype) + { + case ltContact: + bstrSTR=CComBSTR("contact"); + break; + case ltIgnore: + bstrSTR=CComBSTR("ignore"); + break; + default: + throw(ErrorCode = WRONG_PARAM); + } + pEle->setAttribute(CComBSTR("type"),CComVariant(bstrSTR)); + pRequestNode->appendChild(pNode,&pTempNode); + + pTempNode.Release(); + bstrSTR.Empty(); + pNode.Release(); + pEle.Release(); + + //Create user node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(ID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRequestNode->appendChild(pNode,&pTempNode); + + pRequestNode.Release(); + pTempNode.Release(); + pNode.Release(); + pEle.Release(); + + pChildNode->appendChild(pCommandNode,&pTempNode); + pTempNode.Release(); + pCommandNode.Release(); +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + +// Add User +DWORD CCommandQueue::x_AddUser(long ID, long listtype, BSTR body) +{ + CComPtr pChildNode; + CComPtr pNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pWorkNode; + CComPtr pEle; + CComBSTR bstrBody(body); + char Value[30]; + CComBSTR bstrSTR; + DWORD ErrorCode; + + + pRootNode->selectSingleNode(CComBSTR("Commands/AddUser"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmAddUser)); + pEle.Release(); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_add_user")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //Create List Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("list"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + switch(listtype) + { + case ltContact: + bstrSTR=CComBSTR("contact"); + break; + case ltIgnore: + bstrSTR=CComBSTR("ignore"); + break; + default: + throw(ErrorCode = WRONG_PARAM); + } + + pEle->setAttribute(CComBSTR("type"),CComVariant(bstrSTR)); + pRequestNode->appendChild(pNode,&pWorkNode); + pWorkNode.Release(); + pNode.Release(); + bstrSTR.Empty(); + pEle.Release(); + + //Create User Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(ID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRequestNode->appendChild(pNode,&pWorkNode); + pWorkNode.Release(); + pNode.Release(); + pEle.Release(); + + //Create body Node + if(listtype == ltContact && body != NULL) + { + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("body"),NULL,&pNode); + pNode->put_text(body); + pRequestNode->appendChild(pNode,&pWorkNode); + pNode.Release(); + pWorkNode.Release(); + } + + pChildNode->appendChild(pCommandNode,&pWorkNode); + pCommandNode.Release(); + pWorkNode.Release(); + pChildNode.Release(); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + +//Add User Reply +DWORD CCommandQueue::x_AddUserR(long ID, long AnswerType) +{ + CComPtr pChildNode; + CComPtr pNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pWorkNode; + CComPtr pEle; + char Value[30]; + CComBSTR bstrSTR; + DWORD ErrorCode; + + pRootNode->selectSingleNode(CComBSTR("Commands/AddUserR"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmAddUserR)); + pEle.Release(); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_add_user_r")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //Create List Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("result"),NULL,&pNode); + switch(AnswerType) + { + case atAccept: + bstrSTR=CComBSTR("accept"); + break; + case atDeny: + bstrSTR=CComBSTR("deny"); + break; + default: + throw(ErrorCode = WRONG_PARAM); + } + pNode->put_text(bstrSTR); + pRequestNode->appendChild(pNode,&pWorkNode); + //pWorkNode.Release(); + pNode.Release(); + bstrSTR.Empty(); + pEle.Release(); + + //Create User Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(ID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRequestNode->appendChild(pNode,NULL); + pNode.Release(); + pEle.Release(); + + pChildNode->appendChild(pCommandNode,NULL); + pCommandNode.Release(); + pChildNode.Release(); +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + +//Change Status ???????????????????????????????????????????????????????? +DWORD CCommandQueue::x_ChangeStatus(long Status) +{ + CComPtr pChildNode; + CComPtr pNode; + CComPtr pRequestNode; + CComPtr pCommandNode; + CComPtr pTempNode; + CComPtr pEle; + char Value[30]; + CComBSTR bstrSTR; + DWORD ErrorCode; + + + pRootNode->selectSingleNode(CComBSTR("Commands/ChangeStatus"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmChangeStatus)); + pEle.Release(); + + //Create request Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_change_status")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //Create Status Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("status"),NULL,&pNode); + ltoa(Status,Value,10); + pNode->put_text(CComBSTR(Value)); + pRequestNode->appendChild(pNode,&pTempNode); + pTempNode.Release(); + pNode.Release(); + + pChildNode->get_firstChild(&pNode); + pChildNode->insertBefore(pCommandNode,CComVariant(pNode),&pTempNode); + LastStatus = Status; + pTempNode.Release(); + pChildNode.Release(); + pCommandNode.Release(); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + + +//Confirm File +DWORD CCommandQueue::x_ConfirmFile(BSTR FID, long Flag) +{ + CComPtr pNode; + CComPtr pTempNode; + CComPtr pFileNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pEle; + CComBSTR bstrSTR,filtr; + char Value[30]; + long ErrorCode; + + //command + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmConfirmFile)); + + pTempNode.Release(); + pNode.Release(); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_confirm_file")); + pCommandNode->appendChild(pNode,&pRequestNode); + + //pCommandNode.Release(); + pNode.Release(); + pEle.Release(); + + //file + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("file"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("fid"),CComVariant(FID)); + pRequestNode->appendChild(pNode,&pFileNode); + + pFileNode.Release(); + //pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("result"),NULL,&pNode); + switch(Flag) + { + case fcDelete: + bstrSTR = CComBSTR(L"delete"); + break; + case fcDoOffline: + bstrSTR = CComBSTR(L"offline"); + break; + default: + throw(ErrorCode = WRONG_PARAM); + break; + } + ltoa(Flag,Value,10); + pNode->put_text(bstrSTR); + pRequestNode->appendChild(pNode,&pFileNode); + + pFileNode.Release(); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + filtr += CComBSTR("Commands/ConfirmFiles/command/request/file[@fid = \""); + filtr += FID; + filtr += CComBSTR("\"]"); + pRootNode->selectSingleNode(filtr,&pTempNode); + if(pTempNode) throw(ErrorCode = WRONG_QUEUE); + + pRootNode->selectSingleNode(CComBSTR("Commands/ConfirmFiles"),&pNode); + if(!pNode) throw(ErrorCode = WRONG_QUEUE); + pNode->appendChild(pCommandNode,&pTempNode); +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + + +DWORD CCommandQueue::x_DeleteUserR(long ID) +{ + CComPtr pNode; + CComPtr pWorkNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + char Value[30]; + CComBSTR bstrSTR; + DWORD ErrorCode; + + pRootNode->selectSingleNode(CComBSTR("Commands/AddUserR"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmDelUserR)); + pChildNode->appendChild(pNode,&pCommandNode); + pChildNode.Release(); + pNode.Release(); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_del_user_r")); + pCommandNode->appendChild(pNode,&pWorkNode); + pCommandNode.Release(); + pNode.Release(); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(ID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pWorkNode->appendChild(pNode,NULL); + + + pNode.Release(); + pEle.Release(); +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} +DWORD CCommandQueue::x_LastPromos(long Count) +{ + CComPtr pNode; + CComPtr pRequestNode; + CComPtr pTempNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + CComBSTR bstrSTR,filtr; + DWORD ErrorCode; + char Value[30]; +try +{ + //Command + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmLoadList)); + pEle.Release(); + + //Request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_load_list")); + pCommandNode->appendChild(pNode,&pRequestNode); + + pNode.Release(); + pEle.Release(); + + //List + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("list"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("type"),CComVariant(CComBSTR("promos"))); + pRequestNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pEle.Release(); + pTempNode.Release(); + + //Count + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("count"),NULL,&pNode); + ltoa(Count,Value,10); + pNode->put_text(CComBSTR(Value)); + pRequestNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //Check Queue + filtr = CComBSTR("Commands/LoadList/command/request/list[@type = \"promos\"]"); + + pRootNode->selectSingleNode(filtr,&pChildNode); + if(pChildNode) + { + CComBSTR pp; + pChildNode->get_text(&pp); +// MCTRACE((char*)pp); + throw(ErrorCode = AlREADY_IN_QUEUE); + } + //Insert Command + pRootNode->selectSingleNode(CComBSTR("Commands/LoadList"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + pChildNode->appendChild(pCommandNode,&pTempNode); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} +catch(DWORD ErrorCode) +{ + throw(ErrorCode); +} +catch(...) +{} + throw(ErrorCode = UNKNOWN_PROBLEM); +} + +DWORD CCommandQueue::x_UserDetails(long ID, long type) +{ + CComPtr pChildNode; + CComPtr pNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pWorkNode; + CComPtr pEle; + char Value[30]; + CComBSTR bstrSTR; + DWORD ErrorCode; + + pRootNode->selectSingleNode(CComBSTR("Commands/Details"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmDetails)); + pEle.Release(); + + //Create Command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_details")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //Create List Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("info_type"),NULL,&pNode); + switch(type) + { + case 1: + bstrSTR=CComBSTR("short"); + break; + case 2: + bstrSTR=CComBSTR("full"); + break; + default: + throw(ErrorCode = WRONG_PARAM); + } + pNode->put_text(bstrSTR); + pRequestNode->appendChild(pNode,&pWorkNode); + pWorkNode.Release(); + pNode.Release(); + bstrSTR.Empty(); + pEle.Release(); + + //Create User Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa(ID,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRequestNode->appendChild(pNode,&pWorkNode); + pWorkNode.Release(); + pNode.Release(); + pEle.Release(); + + pChildNode->appendChild(pCommandNode,&pWorkNode); + pCommandNode.Release(); + pWorkNode.Release(); + pChildNode.Release(); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_SearchUser(IUser *pUser) +{ + return m_Handle; +} + +DWORD CCommandQueue::x_LoadSIDs(long From, long To) +{ + CComPtr pNode; + CComPtr pRequestNode; + CComPtr pTempNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + CComBSTR bstrSTR,filtr; + DWORD ErrorCode; + char Value[30]; +try +{ + //Command + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmLoadList)); + pEle.Release(); + + //Request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_load_list")); + pCommandNode->appendChild(pNode,&pRequestNode); + + pNode.Release(); + pEle.Release(); + + //List + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("list"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("type"),CComVariant(CComBSTR("sessions"))); + pRequestNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pEle.Release(); + pTempNode.Release(); + + //from + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("from"),NULL,&pNode); + ltoa(From,Value,10); + pNode->put_text(CComBSTR(Value)); + pRequestNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //to + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("to"),NULL,&pNode); + ltoa(To,Value,10); + pNode->put_text(CComBSTR(Value)); + pRequestNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //Check Queue + filtr = CComBSTR("Commands/LoadList/command/request/list[@type = \"sessions\"]"); + + pRootNode->selectSingleNode(filtr,&pChildNode); + if(pChildNode) + { + CComBSTR pp; + pChildNode->get_text(&pp); +// MCTRACE(pp); + throw(ErrorCode = AlREADY_IN_QUEUE); + } + //Insert Command + pRootNode->selectSingleNode(CComBSTR("Commands/LoadList"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + pChildNode->appendChild(pCommandNode,&pTempNode); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} +catch(DWORD ErrorCode) +{ + throw(ErrorCode); +} +catch(...) +{} + throw(ErrorCode = UNKNOWN_PROBLEM); +} + + +DWORD CCommandQueue::x_LoadMessages(BSTR SID) +{ + CComPtr pNode; + CComPtr pRequestNode; + CComPtr pTempNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + CComBSTR bstrSTR,filtr; + DWORD ErrorCode; + //Command + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmLoadList)); + pEle.Release(); + + //Request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_load_list")); + pCommandNode->appendChild(pNode,&pRequestNode); + + pNode.Release(); + pEle.Release(); + + //List + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("list"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("type"),CComVariant(CComBSTR("messages"))); + pRequestNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pEle.Release(); + pTempNode.Release(); + + //from + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("sid"),NULL,&pNode); + + pNode->put_text(SID); + pRequestNode->appendChild(pNode,&pTempNode); + pNode.Release(); + pTempNode.Release(); + + //Check Queue + filtr = CComBSTR("Commands/LoadList/command/request/list[@type = \"messages\"]"); + + pRootNode->selectSingleNode(filtr,&pChildNode); + if(pChildNode) + { + CComBSTR pp; + pChildNode->get_text(&pp); +// MCTRACE(pp); + throw(ErrorCode = AlREADY_IN_QUEUE); + } + //Insert Command + pRootNode->selectSingleNode(CComBSTR("Commands/LoadList"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + pChildNode->appendChild(pCommandNode,&pTempNode); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + +DWORD CCommandQueue::x_LogOn_Inter() +{ + CComPtr pNode; + CComPtr pLogonNode; + CComPtr pCommandNode; + CComPtr pChildNode; + CComPtr pEle; + DWORD ErrorCode; + char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/LogOn/*"),&pChildNode); + if(pChildNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + pRootNode->selectSingleNode(CComBSTR("Commands/LogOn"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmLogOn)); + pChildNode->appendChild(pNode,&pCommandNode); + pChildNode.Release(); + pNode.Release(); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_logon")); + pCommandNode->appendChild(pNode,&pLogonNode); + pCommandNode.Release(); + pNode.Release(); + pEle.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("login"),NULL,&pNode); + pLogonNode->appendChild(pNode,&pChildNode); + pChildNode->put_text(m_bstrLogin); + pNode.Release(); + pChildNode.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("password"),NULL,&pNode); + pLogonNode->appendChild(pNode,&pChildNode); + pChildNode->put_text(m_bstrPassword); + pNode.Release(); + pChildNode.Release(); + + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("status"),NULL,&pNode); + pLogonNode->appendChild(pNode,&pChildNode); + ltoa(m_Status,Value,10); + pChildNode->put_text(CComBSTR(Value)); + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +//Add new answer node to end of Answer Queue +void CCommandQueue::AddAnswer(long Handle, long Type, IXMLDOMNode *pNode) +{ + CComPtr pInComingNode; + CComPtr pTempNode; + CComPtr pAnswerNode; + CComPtr pEle; + + pNode->cloneNode(VARIANT_TRUE,&pInComingNode); + + + pAnswerDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("answer"),NULL,&pTempNode); + pTempNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(Type)); + pAnswerRootNode->appendChild(pTempNode,&pAnswerNode); + pTempNode.Release(); + pEle.Release(); + + //Append node to end of queue + pAnswerNode->appendChild(pInComingNode,&pTempNode); +#ifdef _DEBUG + pAnswerDom->save(CComVariant("c:\\im\\answer.xml")); +#endif +} + +//Add new event node to end of Event Queue +void CCommandQueue::AddEvent(IXMLDOMNode *pNode) +{ + CComPtr pInComingNode; + CComPtr pTempNode; + CComPtr pAnswerNode; + + pNode->cloneNode(VARIANT_TRUE,&pInComingNode); + if(pInComingNode == NULL) return; + + pAnswerDom->selectSingleNode(CComBSTR(L"Queue/event"),&pTempNode); + if(pTempNode == NULL) return; + + //Append Child to end of Queue + pTempNode->appendChild(pInComingNode,&pAnswerNode); + pTempNode.Release(); +#ifdef _DEBUG + pAnswerDom->save(CComVariant("c:\\im\\event.xml")); +#endif +} + +///////////// +void CCommandQueue::UnPackUser(sUser& user, CComPtr pUserNode) +{ + UnPackString(pUserNode,CComBSTR(L"nick_name"),user.m_UserName); + UnPackString(pUserNode,CComBSTR(L"first_name"),user.m_FirstName); + UnPackString(pUserNode,CComBSTR(L"last_name"),user.m_LastName); + UnPackString(pUserNode,CComBSTR(L"role/name"),user.m_Role); + UnPackString(pUserNode,CComBSTR(L"email"),user.m_EMail); + UnPackLong(pUserNode,CComBSTR(L"status"),user.m_Status); + UnPackLong(pUserNode,CComBSTR(L"@id"),user.m_ID); + UnPackLong(pUserNode,CComBSTR(L"role/@id"),user.m_Role_ID); + UnPackLong(pUserNode,CComBSTR(L"time"),user.m_time); +// UnPackString(pUserNode,CComBSTR(L"company/name"),user.m_Company); +// UnPackLong(pUserNode,CComBSTR(L"company/@id"),user.m_Company_ID); +} + +void CCommandQueue::UnPackPromo(sPromo& promo, CComPtr pPNode) +{ + CComPtr pUserNode; + + UnPackString(pPNode,CComBSTR(L"body"),promo.m_Body); + UnPackString(pPNode,CComBSTR(L"subject"),promo.m_Subject); + UnPackString(pPNode,CComBSTR(L"@pid"),promo.m_PID); + UnPackString(pPNode,CComBSTR(L"sid"),promo.m_SID); + UnPackString(pPNode,CComBSTR(L"product/name"),promo.m_ProductName); + UnPackLong(pPNode,CComBSTR(L"product/@id"),promo.m_Product_ID); + UnPackLong(pPNode,CComBSTR(L"time"),promo.m_Time); + + pPNode->selectSingleNode(CComBSTR(L"user"),&pUserNode); + if(pUserNode) + UnPackUser(promo.m_sSender,pUserNode); +} + +void CCommandQueue::UnPackMessage(sMessage& message, CComPtr pMNode) +{ + CComPtr pUserNode; + + UnPackString(pMNode,CComBSTR(L"body"), message.m_Body); + UnPackString(pMNode,CComBSTR(L"@mid"), message.m_MID); + UnPackLong(pMNode,CComBSTR(L"@id"), message.m_nMID); + UnPackString(pMNode,CComBSTR(L"sid"), message.m_SID); + UnPackLong (pMNode,CComBSTR(L"time"), message.m_Time); + + pMNode->selectSingleNode(CComBSTR(L"user"),&pUserNode); + if(pUserNode != NULL) + { + UnPackUser(message.m_Sender,pUserNode); + pUserNode.Release(); + } + + pMNode->selectSingleNode(CComBSTR(L"chat"),&pUserNode); + if(pUserNode != NULL) + { + UnPackChat(message.m_Chat,pUserNode); + pUserNode.Release(); + } +} + +void CCommandQueue::UnPackChat(LONG Handle, IChat** pChat) +{ + + LPTSTR szTemplate = _T("answer[@handle = \"%d\"]"); + TCHAR szFiltr[100]; + sprintf(szFiltr,szTemplate,Handle); + CComBSTR filtr(szFiltr); + + CComPtr pNode; + CComPtr pChatNode; + + HRESULT hr = 0; + CChat* m_pChat; + + //Find Handle + pAnswerRootNode->selectSingleNode(filtr,&pNode); + if(pNode == NULL) + { + ATLASSERT(FALSE); + return; + } + filtr.Empty(); + + + pNode->selectSingleNode(CComBSTR("packet/response/chat"), &pChatNode); + if(pChatNode == NULL) + { + ATLASSERT(FALSE); + return; + } + hr = CChat::CreateInstance(pChat); + m_pChat = static_cast(*pChat); + m_pChat->m_pSession = (CSession*)lpSession; + + if(FAILED(hr)) {ATLASSERT(FALSE); return;} + UnPackChat(m_pChat->m_sChat,pChatNode); +} + +void CCommandQueue::UnPackChat(sChat& chat, CComPtr pNode) +{ + UnPackString(pNode,CComBSTR(L"name"), chat.m_Name); + UnPackString(pNode,CComBSTR(L"descr"), chat.m_Descr); + UnPackString(pNode,CComBSTR(L"@cid"), chat.m_CID); + UnPackLong (pNode,CComBSTR(L"time"), chat.m_CreationTime); + UnPackLong (pNode,CComBSTR(L"owner"), chat.m_Creator); +} + +void CCommandQueue::UnPackFile(sFile& file, CComPtr pNode) +{ + CComPtr pUserNode; + + UnPackString(pNode,CComBSTR(L"body"), file.m_Body); + UnPackString(pNode,CComBSTR(L"real_name"),file.m_RealName); + UnPackString(pNode,CComBSTR(L"@fid"), file.m_FID); + UnPackString(pNode,CComBSTR(L"sid"), file.m_SID); + UnPackLong (pNode,CComBSTR(L"time"), file.m_Time); + UnPackLong (pNode,CComBSTR(L"size"), file.m_size); + + pNode->selectSingleNode(CComBSTR(L"user"),&pUserNode); + if(pUserNode) + UnPackUser(file.m_sSender,pUserNode); +} + +void CCommandQueue::UnPackSession(slocalSID& session, CComPtr pNode) +{ + UnPackString(pNode,CComBSTR(L"sid"), session.m_SID); + UnPackLong(pNode,CComBSTR(L"count"), session.m_Count); +} +void CCommandQueue::UnPackSelfInfo(sUser& pUser, DWORD handle) +{ + char Value[30]; + CComPtr pPacketNode; + CComPtr pUserNode; + CComBSTR filtr; + + ltoa(handle,Value,10); + CComBSTR bstrHandle(Value); + + filtr += CComBSTR("answer[@handle = \""); + filtr += bstrHandle; + filtr += CComBSTR("\"]"); + + pAnswerRootNode->selectSingleNode(filtr,&pPacketNode); + if(pPacketNode == NULL) + { + //ATLASSERT(FALSE); + return; + } + + pPacketNode->selectSingleNode(CComBSTR(L"packet/response/user"),&pUserNode); + if(pUserNode == NULL) + { + //ATLASSERT(FALSE); + return; + } + UnPackUser(pUser,pUserNode); +} + +BOOL CCommandQueue::DeleteAnswer(DWORD handle) +{ + char Value[30]; + CComPtr pChildNode; + CComPtr pNode; + CComPtr pParrentNode; + + ltoa(handle,Value,10); + CComBSTR bstrHandle(Value); + CComBSTR filtr; + + + filtr += CComBSTR("answer[@handle = \""); + filtr += bstrHandle; + filtr += CComBSTR("\"]"); + pAnswerRootNode->selectSingleNode(filtr,&pChildNode); + if(pChildNode) + { + filtr.Empty(); + pChildNode->get_text(&filtr); + MCTRACE(1,"remove %s \r\n",filtr); + pChildNode->get_parentNode(&pParrentNode); + pParrentNode->removeChild(pChildNode,&pNode); +#ifdef _DEBUG + pAnswerDom->save(CComVariant("c:\\im\\answer.xml")); +#endif + return true; + } + return false; +} + +void CCommandQueue::UnPackList(IUnknown **pList, LPVOID pWorkClass, WPARAM handle, long& outListType, BSTR* pString) +{ + LPTSTR szTemplate = _T("answer[@handle = \"%d\"]"); + TCHAR szFiltr[100]; + sprintf(szFiltr,szTemplate,handle); + CComBSTR filtr(szFiltr); + + CComPtr pNode; + CComPtr pNodeUser; + CComPtr pListTypeNode; + CComPtr pListNode; + CComPtr pListItemNode; + + CComBSTR ListType; + HRESULT hr = 0; + + + //Find Handle + pAnswerRootNode->selectSingleNode(filtr,&pNode); + if(pNode == NULL) + { + ATLASSERT(FALSE); + return; + } + filtr.Empty(); + + + //Find response + pNode->selectSingleNode(CComBSTR(L"packet/response/list"),&pListTypeNode); + if(pListTypeNode == NULL) + { + ATLASSERT(FALSE); + return; + } + pNode.Release(); + pListTypeNode->get_text(&ListType); + + //Get ListType + pListTypeNode->get_previousSibling(&pListNode); + if(pListNode == NULL) + { + pListTypeNode->get_nextSibling(&pListNode); + if(pListNode == NULL) + { + ATLASSERT(FALSE); + return; + } + } + + outListType = 0; + if(ListType == CComBSTR(L"contact")) outListType = ltContact; + if(ListType == CComBSTR(L"ignore")) outListType = ltIgnore; + if(ListType == CComBSTR(L"files")) outListType = ltFiles; + if(ListType == CComBSTR(L"messages")) outListType = ltMessages; + if(ListType == CComBSTR(L"promos")) outListType = ltPromos; + if(ListType == CComBSTR(L"sessions")) outListType = ltSIDs; + if(ListType == CComBSTR(L"chats")) outListType = ltChats; + + pListNode->get_xml(pString); + + pListNode->get_firstChild(&pListItemNode); + if(pListItemNode == NULL) + return; + + + CComPtr pUsers; + CComPtr pUser; + CComPtr pFromUser; + CUser* pcUser; + CComPtr pMessages; + CComPtr pMessage; + CMessage* pcMessage; + CComPtr pFiles; + CComPtr pFile; + CFile* pcFile; + CComPtr pPromos; + CComPtr pPromo; + CPromo* pcPromo; + CComPtr plocalSIDs; + CComPtr plocalSID; + ClocalSID* pclocalSID; + CComPtr pChats; + CComPtr pChat; + CChat* pcChat; + + switch(outListType) + { + case ltContact: + case ltIgnore: + hr = CUsers::CreateInstance(&pUsers); + if(hr == 0) + { + do + { + pUsers->AddUser(&pUser); + pcUser = static_cast((LPVOID)pUser); + UnPackUser(pcUser->m_sUser,pListItemNode); + pUser.Release(); + + pListItemNode->get_nextSibling(&pNode); + pListItemNode.Release(); + pListItemNode = pNode; + pNode.Release(); + } + while(pListItemNode); + } + (*pList) = pUsers.Detach(); + return; + + case ltFiles: + hr = CFiles::CreateInstance(&pFiles); + if(hr == 0) + { + do + { + pFiles->AddFile(&pFile); + pcFile = static_cast((LPVOID)pFile); + UnPackFile(pcFile->m_sFile,pListItemNode); + pcFile->m_pSession = (CSession*)lpSession; + pFile.Release(); + + pListItemNode->get_nextSibling(&pNode); + pListItemNode.Release(); + pListItemNode = pNode; + pNode.Release(); + } + while(pListItemNode); + } + (*pList) = pFiles.Detach(); + return; + + case ltMessages: + hr = CMessages::CreateInstance(&pMessages); + if(hr == 0) + { + do + { + pMessages->AddMessage(&pMessage); + pcMessage = static_cast((LPVOID)pMessage); + UnPackMessage(pcMessage->m_sMessage,pListItemNode); + + pListItemNode->selectSingleNode(CComBSTR("recipients/user"),&pNodeUser); + if(pNodeUser!=NULL) + { + pcMessage->m_pRecipients->AddUser(&pUser); + pcUser = static_cast((LPVOID)pUser); + UnPackUser(pcUser->m_sUser,pNodeUser); + pNodeUser.Release(); + pUser.Release(); + } + + + pMessage.Release(); + + pListItemNode->get_nextSibling(&pNode); + pListItemNode.Release(); + pListItemNode = pNode; + pNode.Release(); + } + while(pListItemNode); + } + + (*pList) = pMessages.Detach(); + return; + + case ltSIDs: + hr = ClocalSIDs::CreateInstance(&plocalSIDs); + if(hr == 0) + { + do + { + plocalSIDs->AddSID(&plocalSID); + pclocalSID = static_cast((LPVOID)plocalSID); + UnPackSession(pclocalSID->m_slocalSID,pListItemNode); + plocalSID.Release(); + + pListItemNode->get_nextSibling(&pNode); + pListItemNode.Release(); + pListItemNode = pNode; + pNode.Release(); + } + while(pListItemNode); + } + (*pList) = plocalSIDs.Detach(); + return; + + case ltPromos: + hr = CPromos::CreateInstance(&pPromos); + if(SUCCEEDED(hr)) + { + do + { + pPromos->AddPromo(&pPromo); + pcPromo = static_cast((LPVOID)pPromo); + UnPackPromo(pcPromo->m_sPromo,pListItemNode); + pPromo.Release(); + + pListItemNode->get_nextSibling(&pNode); + pListItemNode.Release(); + pListItemNode = pNode; + pNode.Release(); + } + while(pListItemNode); + } + (*pList) = pPromos.Detach(); + return; + + case ltChats: + hr = CChats::CreateInstance(&pChats); + if(SUCCEEDED(hr)) + { + do + { + pChats->AddChat(&pChat); + pcChat = static_cast((LPVOID)pChat); + pcChat->m_pSession = (CSession*)lpSession; + UnPackChat(pcChat->m_sChat,pListItemNode); + pChat.Release(); + + pListItemNode->get_nextSibling(&pNode); + pListItemNode.Release(); + pListItemNode = pNode; + pNode.Release(); + } + while(pListItemNode); + } + (*pList) = pChats.Detach(); + return; + } + + ATLASSERT(FALSE); +} + +void CCommandQueue::GetSID(TCHAR* szSID) +{ + CComBSTR bstrSID; + CComPtr pSID; + pRootNode->selectSingleNode(CComBSTR("SID"),&pSID); +try +{ + USES_CONVERSION; + pSID->get_text(&bstrSID); + ATLASSERT(bstrSID.Length() == 36); + strcpy(szSID,OLE2T(bstrSID)); +} +catch(...) +{ + Beep(1000,10); +} +} + +void CCommandQueue::UnPackEvents(void *pWorkClass) +{ + USES_CONVERSION; + CSession* pSession; + pSession = (CSession*) pWorkClass; + + CComPtr pMessage = NULL; + CComPtr pFile = NULL; + CComPtr pPromo = NULL; + CComPtr pUser = NULL; + CComPtr pFromUser = NULL; + CComPtr pChat = NULL; + + HRESULT hr; + CComBSTR bstrSID,bstrEvent,PromoAsString; + CComPtr pNode,pEventNode,pPacketNode,pTempNode,pEnd; + CComPtr pEventRootNode; + + pAnswerDom->selectSingleNode(CComBSTR(L"Queue/event"),&pEventRootNode); + + if(pEventRootNode == NULL) {ATLASSERT(FALSE); return;} + + pEventRootNode->selectSingleNode(CComBSTR(L"root"),&pNode); + while (pNode != NULL) + { + pNode->selectSingleNode(CComBSTR(L"packet"),&pPacketNode ); + while (pPacketNode != NULL) + { + pPacketNode->selectSingleNode(CComBSTR(L"event"),&pEventNode); + while(pEventNode != NULL) + { + pEventNode->get_firstChild(&pEnd); + if(pEnd) + { + pEnd->get_nodeName(&bstrEvent); + + //New Message + if(bstrEvent == CComBSTR(L"message")) + { + CMessage* m_pMessage; + CMessage::CreateInstance(&pMessage); + m_pMessage = static_cast(pMessage.p); + UnPackMessage(m_pMessage->m_sMessage,pEnd); + x_ConfirmMessage(m_pMessage->m_sMessage.m_MID); + try + { + MCTRACE(0,"Fire_eMessage"); + hr = pSession->Fire_eMessage(pMessage); + }catch(...){}; + pMessage.Release(); + pMessage = NULL; + bstrEvent.Empty(); + } + + if(bstrEvent == CComBSTR(L"chat_message")) + { + CMessage* m_pMessage; + CMessage::CreateInstance(&pMessage); + m_pMessage = static_cast(pMessage.p); + UnPackMessage(m_pMessage->m_sMessage,pEnd); + + CChat* m_pChat; + CChat::CreateInstance(&pChat); + m_pChat = static_cast(pChat.p); + m_pChat->m_sChat.m_CID = m_pMessage->m_sMessage.m_Chat.m_CID; + + try + { + MCTRACE(0,"Fire_eMessage"); + hr = pSession->Fire_eChatMessage(pChat,pMessage); + }catch(...){}; + pMessage.Release(); + pChat.Release(); + pMessage = NULL; + bstrEvent.Empty(); + } + + //New Promo + if(bstrEvent == CComBSTR(L"promo")) + { + PromoAsString.Empty(); + pEnd->get_xml(&PromoAsString); + CPromo* m_pPromo; + CPromo::CreateInstance(&pPromo); + m_pPromo = static_cast(pPromo.p); + UnPackPromo(m_pPromo->m_sPromo,pEnd); + x_ConfirmPromo(m_pPromo->m_sPromo.m_PID); + MCTRACE(0,"Fire_ePromo"); + pSession->Fire_ePromo(pPromo,PromoAsString); + pPromo.Release(); + pPromo = NULL; + bstrEvent.Empty(); + } + //New File + if(bstrEvent == CComBSTR(L"file")) + { + CFile* m_pFile; + CFile::CreateInstance(&pFile); + m_pFile = static_cast(pFile.p); + m_pFile->m_pSession = (CSession*)pWorkClass; + UnPackFile(m_pFile->m_sFile,pEnd); + try + { + MCTRACE(0,"Fire_eFile"); + hr = pSession->Fire_eFile(pFile); + } + catch(...){}; + pFile.Release(); + pFile = NULL; + } + //User Status + if(bstrEvent == CComBSTR(L"user")) + { + + CUser* m_pUser = NULL; + CUser::CreateInstance(&pUser); + m_pUser = static_cast(pUser.p); + UnPackUser(m_pUser->m_sUser,pEnd); + MCTRACE(0,"Fire_eChangedStatus"); + hr = pSession->Fire_eChangedStatus(pUser); + pUser.Release(); + pUser = NULL; + + } + //New AddUser + if(bstrEvent == CComBSTR(L"adduser")) + { + CComPtr pUserNode = NULL; + CComBSTR bstrBody; + CUser* m_pUser = NULL; + + pEnd->selectSingleNode(CComBSTR(L"user"),&pUserNode); + if(pUserNode) + { + CUser::CreateInstance(&pUser); + m_pUser = static_cast(pUser.p); + UnPackUser(m_pUser->m_sUser,pUserNode); + pUserNode.Release(); + + pEnd->selectSingleNode(CComBSTR(L"body"),&pUserNode); + if(pUserNode) + { + pUserNode->get_text(&bstrBody); + pUserNode.Release(); + } + MCTRACE(0,"Fire_eAdd"); + hr = pSession->Fire_eAdd(pUser,bstrBody); + pUser.Release(); + pUser = NULL; + + } + } + //New AddUserR + if(bstrEvent == CComBSTR(L"adduserr")) + { + CComPtr pUserNode = NULL; + CComBSTR bstrResult; + CUser* m_pUser = NULL; + + pEnd->selectSingleNode(CComBSTR(L"user"),&pUserNode); + if(pUserNode) + { + CUser::CreateInstance(&pUser); + m_pUser = static_cast(pUser.p); + UnPackUser(m_pUser->m_sUser,pUserNode); + pUserNode.Release(); + + x_DeleteUserR(m_pUser->m_sUser.m_ID); + pEnd->selectSingleNode(CComBSTR(L"result"),&pUserNode); + if(pUserNode) + { + pUserNode->get_text(&bstrResult); + if(bstrResult == CComBSTR(L"1") || + bstrResult == CComBSTR(L"3") ) + { + MCTRACE(0,"Fire_eAddR"); + hr = pSession->Fire_eAddR(pUser,atAccept); + } + else + if(bstrResult == CComBSTR(L"2")) + { + MCTRACE(0,"Fire_eAddR"); + hr = pSession->Fire_eAddR(pUser,atDeny); + } + pUserNode.Release(); + } + + pUser.Release(); + pUser = NULL; + } + + } + //New reklama + if(bstrEvent == CComBSTR(L"reklama")) + { + CComPtr pURLNode; + CComBSTR bstrURL; + pEnd->selectSingleNode(CComBSTR(L"url"),&pURLNode); + if(pURLNode) + { + pURLNode->get_text(&bstrURL); + pURLNode.Release(); + MCTRACE(0,"bstrURL"); + hr = pSession->Fire_eReklama(bstrURL); + bstrURL.Empty(); + } + + } + + //New SysMess + if(bstrEvent == CComBSTR(L"system")) + { + CComPtr pCodeNode; + LONG lnCode; + CComBSTR bstrCode; + + pEnd->selectSingleNode(CComBSTR(L"code"),&pCodeNode); + if(pCodeNode) + { + pCodeNode->get_text(&bstrCode); + lnCode = atol(OLE2T(bstrCode)); + pCodeNode.Release(); + bstrCode.Empty(); + + pEnd->selectSingleNode(CComBSTR(L"descr"),&pCodeNode); + if(pCodeNode) + { + pCodeNode->get_text(&bstrCode); + } + CSession* pSess; + switch(lnCode) + { + case 1: //UpdateGroup + try{x_LoadList(ltContact);}catch(...){} + pSess = (CSession*)lpSession; + pSess->m_IM_NET->SetNewCommand(); + break; + case 2: //UpdateUser + hr = pSession->Fire_eSysMess(lnCode,bstrCode); + //pSess->m_IM_NET->m_WaitForReconnect = TRUE; + //pSess->m_IM_NET->m_BaseNetManager.StopAllOperations(); + break; + case 3://UpdateWebStub + hr = pSession->Fire_eSysMess(lnCode,bstrCode); + break; + default: + hr = pSession->Fire_eSysMess(lnCode,bstrCode); + break; + } + MCTRACE(0,"System Message %d Description %s",lnCode,OLE2T(bstrCode)); + + + pCodeNode.Release(); + bstrCode.Empty(); + } + + } + + if(bstrEvent == CComBSTR(L"chat_status")) + { + CComPtr pNode = NULL; + CUser* m_pUser = NULL; + CChat* m_pChat = NULL; + + pEnd->selectSingleNode(CComBSTR(L"user"),&pNode); + if(pNode) + { + CUser::CreateInstance(&pUser); + m_pUser = static_cast(pUser.p); + UnPackUser(m_pUser->m_sUser,pNode); + pNode.Release(); + } + + pEnd->selectSingleNode(CComBSTR(L"chat"),&pNode); + if(pNode) + { + CChat::CreateInstance(&pChat); + m_pChat = static_cast(pChat.p); + UnPackChat(m_pChat->m_sChat,pNode); + pNode.Release(); + m_pChat->m_pSession = pSession; + } + + if(pChat && pUser) + { + MCTRACE(0,"Fire_eChatStatus"); + hr = pSession->Fire_eChatUserStatus(pUser,pChat); + } + else + ATLASSERT(FALSE); + + pUser.Release(); + pChat.Release(); + + } + + if(bstrEvent == CComBSTR(L"chat_leave")) + { + CComPtr pNode = NULL; + CUser* m_pUser = NULL; + CChat* m_pChat = NULL; + + pEnd->selectSingleNode(CComBSTR(L"user"),&pNode); + if(pNode) + { + CUser::CreateInstance(&pUser); + m_pUser = static_cast(pUser.p); + UnPackUser(m_pUser->m_sUser,pNode); + pNode.Release(); + } + + pEnd->selectSingleNode(CComBSTR(L"chat"),&pNode); + if(pNode) + { + CChat::CreateInstance(&pChat); + m_pChat = static_cast(pChat.p); + UnPackChat(m_pChat->m_sChat,pNode); + pNode.Release(); + m_pChat->m_pSession = pSession; + } + + if(pChat && pUser) + { + MCTRACE(0,"Fire_eChatLeave"); + hr = pSession->Fire_eChatLeave(pUser,pChat); + } + else + ATLASSERT(FALSE); + + pUser.Release(); + pChat.Release(); + } + + if(bstrEvent == CComBSTR(L"chat_accept")) + { + CComPtr pNode = NULL; + CComBSTR bsBody; + CUser* m_pUser = NULL; + CChat* m_pChat = NULL; + + pEnd->selectSingleNode(CComBSTR(L"user"),&pNode); + if(pNode) + { + CUser::CreateInstance(&pUser); + m_pUser = static_cast(pUser.p); + UnPackUser(m_pUser->m_sUser,pNode); + pNode.Release(); + } + + + pEnd->selectSingleNode(CComBSTR(L"chat"),&pNode); + if(pNode) + { + CChat::CreateInstance(&pChat); + m_pChat = static_cast(pChat.p); + UnPackChat(m_pChat->m_sChat,pNode); + pNode.Release(); + m_pChat->m_pSession = pSession; + } + + if(pChat && pUser) + { + + pEnd->selectSingleNode(CComBSTR(L"result"),&pNode); + if(pNode) + { + pNode->get_text(&bsBody); + pNode.Release(); + + if(bsBody == CComBSTR(L"0")) + { + MCTRACE(0,"Fire_ChatAccept 0"); + hr = pSession->Fire_eChatAccept(pChat,pUser,0); + } + if(bsBody == CComBSTR(L"1")) + { + MCTRACE(0,"Fire_ChatAccept 1"); + hr = pSession->Fire_eChatAccept(pChat,pUser,1); + } + } + else + { + MCTRACE(0,"Fire_ChatAccept 0"); + hr = pSession->Fire_eChatAccept(pChat,pUser,0); + } + + + + + } + else + ATLASSERT(FALSE); + + pUser.Release(); + pChat.Release(); + } + + + if(bstrEvent == CComBSTR(L"chat_invite")) + { + CComPtr pNode = NULL; + CUser* m_pUser = NULL; + CUser* m_pFromUser = NULL; + CChat* m_pChat = NULL; + CComBSTR m_bsBody; + pEnd->selectSingleNode(CComBSTR(L"user"),&pNode); + if(pNode) + { + CUser::CreateInstance(&pUser); + m_pUser = static_cast(pUser.p); + UnPackUser(m_pUser->m_sUser,pNode); + pNode.Release(); + } + + pEnd->selectSingleNode(CComBSTR(L"from_user"),&pNode); + if(pNode) + { + CUser::CreateInstance(&pFromUser); + m_pFromUser = static_cast(pFromUser.p); + UnPackUser(m_pFromUser->m_sUser,pNode); + pNode.Release(); + } + + pEnd->selectSingleNode(CComBSTR(L"chat"),&pNode); + if(pNode) + { + CChat::CreateInstance(&pChat); + m_pChat = static_cast(pChat.p); + UnPackChat(m_pChat->m_sChat,pNode); + pNode.Release(); + m_pChat->m_pSession = pSession; + } + + pEnd->selectSingleNode(CComBSTR(L"body"),&pNode); + if(pNode) + { + pNode->get_text(&m_bsBody); + pNode.Release(); + } + + if(pChat && pUser && pFromUser) + { + MCTRACE(0,"Fire_eChatLeave"); + hr = pSession->Fire_eChatInvite(pChat,pFromUser,pUser,m_bsBody); + } + else + ATLASSERT(FALSE); + + pUser.Release(); + pFromUser.Release(); + pChat.Release(); + } + + /*if(bstrEvent == CComBSTR(L"system")) + { + } + if(bstrEvent == CComBSTR(L"system")) + { + }*/ + + pEnd.Release(); + } + bstrEvent.Empty(); + pEventNode->get_nextSibling(&pTempNode); + pEventNode.Release(); + if(pTempNode) {pEventNode = pTempNode; pTempNode.Release();} + } + + pPacketNode->get_nextSibling(&pTempNode); + pPacketNode.Release(); + if(pTempNode) {pPacketNode = pTempNode; pTempNode.Release();} + } + pEventRootNode->removeChild(pNode,&pEnd); + pEnd.Release(); + pNode.Release(); + pEventRootNode->selectSingleNode(CComBSTR(L"root"),&pNode); + } +} + +void CCommandQueue::UnPackTime(long Handle, long &Time) +{ + char Value[30]; + CComPtr pPacketNode; + CComPtr pTimeNode; + CComBSTR filtr; + CComBSTR bstrTime; + + ltoa(Handle,Value,10); + CComBSTR bstrHandle(Value); + + filtr += CComBSTR("answer[@handle = \""); + filtr += bstrHandle; + filtr += CComBSTR("\"]"); + + //Find Handle + pAnswerRootNode->selectSingleNode(filtr,&pPacketNode); + if(pPacketNode == NULL) + { + ATLASSERT(FALSE); + return; + } + filtr.Empty(); + + //Find response + pPacketNode->selectSingleNode(CComBSTR(L"packet/response/time"),&pTimeNode); + if(pTimeNode == NULL) + { + ATLASSERT(FALSE); + return; + } + pTimeNode->get_text(&bstrTime); + USES_CONVERSION; + Time = atol(OLE2T(bstrTime)); + return; +} + + +void CCommandQueue::UnPackUserDetails(long Handle, IUser **pUser) +{ + + LPTSTR szTemplate = _T("answer[@handle = \"%d\"]"); + TCHAR szFiltr[100]; + sprintf(szFiltr,szTemplate,Handle); + CComBSTR filtr(szFiltr); + + CComPtr pNode; + CComPtr pUserNode; + + HRESULT hr = 0; + CUser* m_pUser; + + //Find Handle + pAnswerRootNode->selectSingleNode(filtr,&pNode); + if(pNode == NULL) + { + ATLASSERT(FALSE); + return; + } + filtr.Empty(); + + + pNode->selectSingleNode(CComBSTR("packet/response/user"), &pUserNode); + if(pUserNode == NULL) + { + ATLASSERT(FALSE); + return; + } + hr = CUser::CreateInstance(pUser); + m_pUser = static_cast(*pUser); + + if(FAILED(hr)) {ATLASSERT(FALSE); return;} + UnPackUser(m_pUser->m_sUser,pUserNode); + +} + + +HRESULT CCommandQueue::Init() +{ + return OutPutQueueInit(); +} + +VOID CCommandQueue::DeleteAllCommands(void *pWorkClass) +{ + CSession* pSession; + pSession = (CSession*) pWorkClass; + + CComPtr pChildNodes; + CComPtr pChildNode; + CComPtr pNode; + CComBSTR bsHandle; + LONG size,handle; + + + pRootNode->selectNodes(CComBSTR(_T("*/*/*")),&pChildNodes); + if(pChildNodes) + { + pChildNodes->get_length(&size); + for(int k = 0;kget_item(k,&pChildNode); + pChildNode->selectSingleNode(CComBSTR(_T("@handle")),&pNode); + if(pNode != NULL) + { + bsHandle.Empty(); + pNode->get_text(&bsHandle); + handle = _wtol(bsHandle); + pSession->Fire_CommandError(handle,1,1); + } + pChildNode.Release(); + pNode.Release(); + } + } + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif +} + +DWORD CCommandQueue::x_ChatCreate(BSTR CID, BSTR Name, BSTR Descr) +{ + CComPtr pChatNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + + CComPtr pEle; + CComPtr pChildNode; + + CComPtr pNode; + + + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; +// char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/ChatCreate"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/chat[@cid =\""); + bstrFiltr += CID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pNode); + if(pNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmChatCreate)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_ch_create")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //chat + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("chat"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("cid"),CComVariant(CID)); + pRequestNode->appendChild(pNode,&pChatNode); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + + //Create name Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("name"),NULL,&pNode); + pNode->put_text(Name); + pChatNode->appendChild(pNode,NULL); + pNode.Release(); + + //Create descr Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("descr"),NULL,&pNode); + pNode->put_text(Descr); + pChatNode->appendChild(pNode,NULL); + pNode.Release(); + + + pChildNode->appendChild(pCommandNode,&pNode); + if(pNode == NULL) throw(ErrorCode = WRONG_QUEUE); +// Handle = m_Handle; + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_ChatStatus(BSTR CID, LONG Status, LONG Param) +{ + //Param = 50; + + CComPtr pChatNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + + CComPtr pEle; + CComPtr pChildNode; + + CComPtr pNode; + + + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; + char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/ChatStatus"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/chat[@cid =\""); + bstrFiltr += CID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pNode); + if(pNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmChatStatus)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_ch_status")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //chat + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("chat"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("cid"),CComVariant(CID)); + pRequestNode->appendChild(pNode,&pChatNode); + //pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + //status + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("status"),NULL,&pNode); + ltoa(Status,Value,10); + pNode->put_text(CComBSTR(Value)); + pRequestNode->appendChild(pNode,NULL); + pNode.Release(); + + //Param + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("param"),NULL,&pNode); + ltoa(Param,Value,10); + pNode->put_text(CComBSTR(Value)); + pRequestNode->appendChild(pNode,NULL); + pNode.Release(); + + pChildNode->appendChild(pCommandNode,&pNode); + if(pNode == NULL) throw(ErrorCode = WRONG_QUEUE); +// Handle = m_Handle; + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_ChatEdit(BSTR CID, BSTR Name, BSTR Descr) +{ + CComPtr pChatNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + + CComPtr pEle; + CComPtr pChildNode; + + CComPtr pNode; + + + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; +// char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/ChatEdit"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/chat[@cid =\""); + bstrFiltr += CID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pNode); + if(pNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmChatEdit)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_ch_edit")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //chat + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("chat"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("cid"),CComVariant(CID)); + pRequestNode->appendChild(pNode,&pChatNode); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + + //Create name Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("name"),NULL,&pNode); + pNode->put_text(Name); + pChatNode->appendChild(pNode,NULL); + pNode.Release(); + + //Create descr Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("descr"),NULL,&pNode); + pNode->put_text(Descr); + pChatNode->appendChild(pNode,NULL); + pNode.Release(); + + + pChildNode->appendChild(pCommandNode,&pNode); + if(pNode == NULL) throw(ErrorCode = WRONG_QUEUE); +// Handle = m_Handle; + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + + return m_Handle; +} + +DWORD CCommandQueue::x_ChatInvite(sChat* pChat,BSTR bsInvitation) +{ + + CComPtr pCommandNode; + CComPtr pRequestNode; + CComPtr pRecipientsNode; + + CComPtr pEle; + CComPtr pChildNode; + + CComPtr pNode; + + + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; + char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/ChatInvite"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/chat[@cid =\""); + bstrFiltr += pChat->m_CID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pNode); + if(pNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmChatInvite)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_ch_invite")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //chat + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("chat"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("cid"),CComVariant(pChat->m_CID)); + pRequestNode->appendChild(pNode,NULL); + pNode.Release(); + pEle.Release(); + + //body + if(bsInvitation != NULL) + { + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("body"),NULL,&pNode); + pNode->put_text(bsInvitation); + pRequestNode->appendChild(pNode,NULL); + pNode.Release(); + pEle.Release(); + } + + //recipients + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("recipients"),NULL,&pNode); + pRequestNode->appendChild(pNode,&pRecipientsNode); + pNode.Release(); + + list::iterator iter; + iter = pChat->m_Users.begin(); + + while(iter != pChat->m_Users.end()) + { + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("user"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + ltoa((long)*iter,Value,10); + pEle->setAttribute(CComBSTR("id"),CComVariant(Value)); + pRecipientsNode->appendChild(pNode,NULL); + + pNode.Release(); + pEle.Release(); + + iter ++; + } + + pChat->m_Users.clear(); + pChildNode->appendChild(pCommandNode,&pNode); + if(pNode == NULL) throw(ErrorCode = WRONG_QUEUE); +// Handle = m_Handle; + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; + +} + +DWORD CCommandQueue::x_ChatAccept(BSTR CID, LONG Result) +{ + + CComPtr pCommandNode; + CComPtr pRequestNode; + + CComPtr pEle; + CComPtr pChildNode; + + CComPtr pNode; + + + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; +// char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/ChatAccept"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/chat[@cid =\""); + bstrFiltr += CID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pNode); + if(pNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmChatAccept)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_ch_accept")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //chat + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("chat"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("cid"),CComVariant(CID)); + pRequestNode->appendChild(pNode,NULL); + //pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + + //Create List Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("result"),NULL,&pNode); + switch(Result) + { + case 1: + bstrSTR=CComBSTR("accept"); + break; + case 0: + bstrSTR=CComBSTR("deny"); + break; + default: + throw(ErrorCode = WRONG_PARAM); + } + pNode->put_text(bstrSTR); + pRequestNode->appendChild(pNode,NULL); + pNode.Release(); + bstrSTR.Empty(); + + + pChildNode->appendChild(pCommandNode,&pNode); + if(pNode == NULL) throw(ErrorCode = WRONG_QUEUE); +// Handle = m_Handle; + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + +DWORD CCommandQueue::x_ChatLeave(BSTR CID) +{ + + CComPtr pChatNode; + CComPtr pCommandNode; + CComPtr pRequestNode; + + CComPtr pEle; + CComPtr pChildNode; + + CComPtr pNode; + + + CComBSTR bstrSTR; + CComBSTR bstrFiltr; + long ErrorCode; +// char Value[30]; + + pRootNode->selectSingleNode(CComBSTR("Commands/ChatLeave"),&pChildNode); + if(!pChildNode) throw(ErrorCode = WRONG_QUEUE); + + bstrFiltr = CComBSTR(L"*/*/chat[@cid =\""); + bstrFiltr += CID; + bstrFiltr += CComBSTR(L"\"]"); + + pChildNode->selectSingleNode(bstrFiltr,&pNode); + if(pNode) throw(ErrorCode = AlREADY_IN_QUEUE); + + //Create command Node + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("command"),NULL,&pCommandNode); + pCommandNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("handle"),CComVariant(++m_Handle)); + pEle->setAttribute(CComBSTR("type"),CComVariant(cmChatLeave)); + pEle.Release(); + + //request + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("request"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("value"),CComVariant("c_ch_leave")); + pCommandNode->appendChild(pNode,&pRequestNode); + pNode.Release(); + pEle.Release(); + + //chat + pDom->createNode(CComVariant(NODE_ELEMENT),CComBSTR("chat"),NULL,&pNode); + pNode->QueryInterface(IID_IXMLDOMElement,(void**)&pEle); + pEle->setAttribute(CComBSTR("cid"),CComVariant(CID)); + pRequestNode->appendChild(pNode,&pChatNode); + pRequestNode.Release(); + pNode.Release(); + pEle.Release(); + + pChildNode->appendChild(pCommandNode,&pNode); + if(pNode == NULL) throw(ErrorCode = WRONG_QUEUE); +// Handle = m_Handle; + +#ifdef _DEBUG + pDom->save(CComVariant("c:\\im\\template.xml")); +#endif + return m_Handle; +} + +void CCommandQueue::UnPackSetChatStatus(long Handle, IUsers **lpUsers, BSTR *bsLog) +{ + + LPTSTR szTemplate = _T("answer[@handle = \"%d\"]"); + TCHAR szFiltr[100]; + sprintf(szFiltr,szTemplate,Handle); + CComBSTR filtr(szFiltr); + + CComPtr pNode; + CComPtr pLog; + CComPtr pUserNode; + CComPtr pUserNodes; + + HRESULT hr = 0; + CComPtr pUsers; + CComPtr pUser; + CUser* pcUser; + + + //Find Handle + pAnswerRootNode->selectSingleNode(filtr,&pNode); + if(pNode == NULL) + { + ATLASSERT(FALSE); + return; + } + filtr.Empty(); + + hr = CUsers::CreateInstance(&pUsers); + + + pNode->selectSingleNode(CComBSTR("packet/response/log"), &pLog); + if(pLog != NULL) + pLog->get_xml(bsLog); + else + *bsLog = CComBSTR(L"").Detach(); + + pNode->selectSingleNode(CComBSTR("packet/response/users/user"), &pUserNode); + pNode.Release(); + if(pUserNode != NULL) + { + + do + { + pUsers->AddUser(&pUser); + pcUser = static_cast((LPVOID)pUser); + UnPackUser(pcUser->m_sUser,pUserNode); + pUser.Release(); + + pUserNode->get_nextSibling(&pNode); + pUserNode.Release(); + pUserNode = pNode; + pNode.Release(); + } + while(pUserNode); + + } + + (*lpUsers) = pUsers.Detach(); + +} diff --git a/Source/Client/IM-Client/ATL_NetLib/CommandQueue.h b/Source/Client/IM-Client/ATL_NetLib/CommandQueue.h new file mode 100644 index 0000000..8a8108c --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/CommandQueue.h @@ -0,0 +1,110 @@ +// CommandQueue.h: interface for the CCommandQueue class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_COMMANDQUEUE_H__23BBDF2E_E574_4036_B56A_C277CA30E6CC__INCLUDED_) +#define AFX_COMMANDQUEUE_H__23BBDF2E_E574_4036_B56A_C277CA30E6CC__INCLUDED_ + +//#include +#include "atl_netlib.h" +#include "message.h" +#include "promo.h" +#include "File.h" +#include "users.h" + + +#define WRONG_QUEUE 1 +#define AlREADY_IN_QUEUE 2 +#define WRONG_PARAM 3 +#define UNKNOWN_PROBLEM 4 + + +class CCommandQueue +{ +public: + CCommandQueue(); + virtual ~CCommandQueue(); + +private: + CRITICAL_SECTION CS_Queue; + int m_Handle; + +public: + void UnPackSetChatStatus(long handle, IUsers** pUsers, BSTR* bsLog); + VOID DeleteAllCommands(void *pWorkClass); + + HRESULT Init(); + HRESULT OutPutQueueInit(); + HRESULT InPutQueueInit(); + void GetSID(TCHAR* szSID); + + void UnPackEvents(void* pWorkClass); + void UnPackList(IUnknown** pList, LPVOID pWorkClass, WPARAM handle, long& outListType, BSTR* pString); + + void UnPackUserDetails(long Handle, IUser** pUser); + void UnPackTime(long Handle, long& Time); + + void UnPackSelfInfo(sUser& pUser, DWORD handle); + void UnPackUser(sUser& user, CComPtr pUserNode); + void UnPackMessage(sMessage& message, CComPtr pMNode); + void UnPackPromo(sPromo& promo, CComPtr pPNode); + void UnPackFile(sFile& file, CComPtr pNode); + void UnPackSession(slocalSID& session, CComPtr pNode); + void UnPackChat(LONG Handle, IChat** pChat); + void UnPackChat(sChat& chat, CComPtr pNode); + + bool CheckQueueItem(CComBSTR CommandType,IXMLDOMDocument** pComm, DWORD& dwHandle, DWORD& dwType,BSTR *FileName = NULL, long* hBackWind = 0, long* size = 0, BSTR *bstrSID = NULL); + void AddEvent(IXMLDOMNode *pNode); + void AddAnswer(long Handle, long Type, IXMLDOMNode* pNode); + LONG DeleteCommand(DWORD handle); + BOOL DeleteAnswer(DWORD handle); + + DWORD x_LogOn_Inter(); + DWORD x_LoadMessages(BSTR SID); + DWORD x_LoadSIDs(long From, long To); + DWORD x_SearchUser(IUser* pUser); + DWORD x_UserDetails(long ID, long type); + DWORD x_DeleteUserR(long ID); + DWORD x_DeleteUser(long ID, long listtype); + DWORD x_ChangeStatus(long Status); + DWORD x_LoadList(ltListType ListType); + DWORD x_LogOn(CComBSTR SID, CComBSTR UserName, CComBSTR Password, long Status); + DWORD x_ConfirmFile(BSTR FID, long Flag); + DWORD x_ConfirmPromo(BSTR PID); + DWORD x_ConfirmMessage(BSTR MID); + DWORD x_Promo(CPromo* pPromo, long& Handle); + DWORD x_SendFile(CFile* pFile, long& Handle); + DWORD x_ReceiveFile(CFile* pFile, long& Handle); + DWORD x_Message(CMessage* pMessage, long& Handle); + DWORD x_LogOff(); + DWORD x_AddUser(long ID, long listtype, BSTR body = NULL); + DWORD x_AddUserR(long ID, long AnswerType); + DWORD x_LastPromos(long Count); + + DWORD x_ChatCreate(BSTR CID, BSTR Name, BSTR Descr); + DWORD x_ChatStatus(BSTR CID, LONG Status, LONG Param); + DWORD x_ChatEdit(BSTR CID, BSTR Name, BSTR Descr); + DWORD x_ChatInvite(sChat* pChat,BSTR bsInvitation); + DWORD x_ChatAccept(BSTR CID, LONG Result); + DWORD x_ChatLeave(BSTR CID); + + void UnlockQueue(); + void LockQueue(); + + + //OutPut Queue + CComPtr pRootNode; + CComPtr pDom; + + //InPut Queue + CComPtr pAnswerRootNode; + CComPtr pAnswerDom; + + CComBSTR m_bstrLogin; + CComBSTR m_bstrPassword; + LONG m_Status; + LONG LastStatus; + LPVOID lpSession; +}; + +#endif // !defined(AFX_COMMANDQUEUE_H__23BBDF2E_E574_4036_B56A_C277CA30E6CC__INCLUDED_) diff --git a/Source/Client/IM-Client/ATL_NetLib/Config.rgs b/Source/Client/IM-Client/ATL_NetLib/Config.rgs new file mode 100644 index 0000000..cb44f49 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Config.rgs @@ -0,0 +1,23 @@ +HKCR +{ + Mediachase.IMConfig.1 = s 'Config Class' + { + CLSID = s '{5CA6E67E-4F0C-407E-A38C-4E564C34487F}' + } + Mediachase.IMConfig = s 'Config Class' + { + CLSID = s '{5CA6E67E-4F0C-407E-A38C-4E564C34487F}' + } + NoRemove CLSID + { + ForceRemove {5CA6E67E-4F0C-407E-A38C-4E564C34487F} = s 'Config Class' + { + ProgID = s 'Mediachase.IMConfig.1' + VersionIndependentProgID = s 'Mediachase.IMConfig' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/File.cpp b/Source/Client/IM-Client/ATL_NetLib/File.cpp new file mode 100644 index 0000000..5cfdfb3 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/File.cpp @@ -0,0 +1,145 @@ +// File.cpp : Implementation of CFile +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "File.h" +#include "Session.h" + +///////////////////////////////////////////////////////////////////////////// +// CFile + + +STDMETHODIMP CFile::get_FID(BSTR *pVal) +{ + return m_sFile.m_FID.CopyTo(pVal); +} + +STDMETHODIMP CFile::put_FID(BSTR newVal) +{ + m_sFile.m_FID.Empty(); + m_sFile.m_FID = newVal; + return (m_sFile.m_FID || !newVal ? S_OK : E_OUTOFMEMORY); +} + +STDMETHODIMP CFile::get_RealName(BSTR *pVal) +{ + return m_sFile.m_RealName.CopyTo(pVal); +} + +STDMETHODIMP CFile::put_RealName(BSTR newVal) +{ + m_sFile.m_RealName.Empty(); + m_sFile.m_RealName = newVal; + return (m_sFile.m_RealName || !newVal ? S_OK : E_OUTOFMEMORY); +} + +STDMETHODIMP CFile::get_Body(BSTR *pVal) +{ + return m_sFile.m_Body.CopyTo(pVal); +} + +STDMETHODIMP CFile::put_Body(BSTR newVal) +{ + m_sFile.m_Body.Empty(); + m_sFile.m_Body = newVal; + return (m_sFile.m_Body || !newVal ? S_OK : E_OUTOFMEMORY); +} + +STDMETHODIMP CFile::get_date_time(long *pVal) +{ + if (pVal == NULL) + return E_POINTER; + + *pVal = m_sFile.m_Time; + return S_OK; +} + +STDMETHODIMP CFile::get_Sender(IUser **pVal) +{ + if(pVal == NULL) + return E_POINTER; + + HRESULT hr; + IUser* pUser = NULL; + CUser* mpUser = NULL; + + hr = CUser::CreateInstance(&pUser); + if(hr != NULL) + return hr; + + mpUser = static_cast(pUser); + mpUser->m_sUser = m_sFile.m_sSender; //???????????????????????? + + *pVal = pUser; + return S_OK; +} + +STDMETHODIMP CFile::get_Recipients(IUsers **pVal) +{ + return m_pRecipients.CopyTo(pVal); +} + +STDMETHODIMP CFile::Send(long *Handle) +{ + if(Handle == NULL) + return E_POINTER; + + if(m_pSession->GetState() != stConnected) + return E_PENDING; + try + { + m_pSession->m_IM_NET->m_CommandQueue.x_SendFile(this,*Handle); + m_pSession->m_IM_NET->SetNewCommand(); + + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +STDMETHODIMP CFile::Receive(long *Handle) +{ + if(Handle == NULL) + return E_POINTER; + if(m_pSession->GetState() != stConnected) + return E_PENDING; + + m_pSession->m_IM_NET->m_CommandQueue.x_ReceiveFile(this,*Handle); + m_pSession->m_IM_NET->SetNewCommand(); + return S_OK; +} + +STDMETHODIMP CFile::get_SID(BSTR *pVal) +{ + return m_sFile.m_SID.CopyTo(pVal); +} + +STDMETHODIMP CFile::put_hWnd(long newVal) +{ + m_sFile.hBackWind = newVal; + return S_OK; +} + +STDMETHODIMP CFile::get_Size(long *pVal) +{ + if (pVal == NULL) + return E_POINTER; + + *pVal = m_sFile.m_size; + return S_OK; + +} diff --git a/Source/Client/IM-Client/ATL_NetLib/File.h b/Source/Client/IM-Client/ATL_NetLib/File.h new file mode 100644 index 0000000..90e3e2c --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/File.h @@ -0,0 +1,57 @@ +// File.h : Declaration of the CFile + +#ifndef __FILE_H_ +#define __FILE_H_ + +#include "resource.h" // main symbols +#include "users.h" + +class CSession; +///////////////////////////////////////////////////////////////////////////// +// CFile +class ATL_NO_VTABLE CFile : + public CComObjectRootEx, + public CComCoClass,//, &CLSID_File>, + public IDispatchImpl +{ +public: + CFile() + { + } + + HRESULT CFile::FinalConstruct() + { + return CUsers::CreateInstance(&m_pRecipients); + } +DECLARE_REGISTRY_RESOURCEID(IDR_FILE) +DECLARE_NOT_AGGREGATABLE(CFile) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CFile) + COM_INTERFACE_ENTRY(IFile) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IFile +public: + STDMETHOD(get_Size)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_hWnd)(/*[in]*/ long newVal); + STDMETHOD(get_SID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(Receive)(/*[out]*/ long* Handle); + STDMETHOD(Send)(/*[out]*/ long* Handle); + STDMETHOD(get_Recipients)(/*[out, retval]*/ IUsers* *pVal); + STDMETHOD(get_Sender)(/*[out, retval]*/ IUser* *pVal); + STDMETHOD(get_date_time)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Body)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Body)(/*[in]*/ BSTR newVal); + STDMETHOD(get_RealName)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_RealName)(/*[in]*/ BSTR newVal); + STDMETHOD(get_FID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_FID)(/*[in]*/ BSTR newVal); + CSession* m_pSession; + sFile m_sFile; + CComPtr m_pRecipients; +}; + +#endif //__FILE_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/File.rgs b/Source/Client/IM-Client/ATL_NetLib/File.rgs new file mode 100644 index 0000000..cc487fd --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/File.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediachase.IMFile.1 = s 'File Class' + { + CLSID = s '{0CA7B601-2FA5-40AA-8666-56F083020345}' + } + Mediachase.IMFile = s 'File Class' + { + CLSID = s '{0CA7B601-2FA5-40AA-8666-56F083020345}' + CurVer = s 'Mediachase.IMFile.1' + } + NoRemove CLSID + { + ForceRemove {0CA7B601-2FA5-40AA-8666-56F083020345} = s 'File Class' + { + ProgID = s 'Mediachase.IMFile.1' + VersionIndependentProgID = s 'Mediachase.IMFile' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Files.cpp b/Source/Client/IM-Client/ATL_NetLib/Files.cpp new file mode 100644 index 0000000..870166b --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Files.cpp @@ -0,0 +1,10 @@ +// Files.cpp : Implementation of CATL_NetLibApp and DLL registration. + +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "Files.h" + +///////////////////////////////////////////////////////////////////////////// +// + + diff --git a/Source/Client/IM-Client/ATL_NetLib/Files.h b/Source/Client/IM-Client/ATL_NetLib/Files.h new file mode 100644 index 0000000..25c4952 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Files.h @@ -0,0 +1,66 @@ +// Files.h: Definition of the CFiles class +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_FILES_H__481389BA_C44C_49A8_A6E3_8280E4A369BF__INCLUDED_) +#define AFX_FILES_H__481389BA_C44C_49A8_A6E3_8280E4A369BF__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" // main symbols +#include "collections.h" +#include "file.h" +#pragma warning(disable: 4530) +typedef CComEnumOnSTL, + list< CAdapt< CComPtr > > > + CComEnumVariantOnListOfFiles; + +typedef ICollectionOnSTLImpl, + list< CAdapt< CComPtr > >, + IFile*, + _CopyItfFromAdaptItf, + CComEnumVariantOnListOfFiles> + IFilesCollImpl; +#pragma warning(default: 4530) +///////////////////////////////////////////////////////////////////////////// +// CFiles + +class ATL_NO_VTABLE CFiles : + public CComObjectRootEx, + public CComCoClass, + public IFilesCollImpl +{ +public: + CFiles() {} +BEGIN_COM_MAP(CFiles) + COM_INTERFACE_ENTRY(IFiles) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() +DECLARE_NO_REGISTRY() +DECLARE_PROTECT_FINAL_CONSTRUCT() +DECLARE_NOT_AGGREGATABLE(CFiles) + HRESULT CFiles::FinalRelease() + { + MCTRACE(5,"FileS LIST DELETED"); + return S_OK; + }; + + STDMETHODIMP CFiles::AddFile(IFile** ppFile) + { + HRESULT hr = CFile::CreateInstance(ppFile); + if( SUCCEEDED(hr) ) + { + // Put the document on the list + CComPtr spFile = *ppFile; + m_coll.push_back(spFile); + } + return hr; + } +// IFiles +public: +}; + +#endif // !defined(AFX_FILES_H__481389BA_C44C_49A8_A6E3_8280E4A369BF__INCLUDED_) diff --git a/Source/Client/IM-Client/ATL_NetLib/Files.rgs b/Source/Client/IM-Client/ATL_NetLib/Files.rgs new file mode 100644 index 0000000..99e63b3 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Files.rgs @@ -0,0 +1,23 @@ +HKCR +{ + Mediachase.IMFiles.1 = s 'Files Class' + { + CLSID = s '{F3630615-5516-4FB5-A299-378F13D9F414}' + } + Mediachase.IMFiles = s 'Files Class' + { + CLSID = s '{F3630615-5516-4FB5-A299-378F13D9F414}' + } + NoRemove CLSID + { + ForceRemove {F3630615-5516-4FB5-A299-378F13D9F414} = s 'Files Class' + { + ProgID = s 'Mediachase.IMFiles.1' + VersionIndependentProgID = s 'Mediachase.IMFiles' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/IChat.cpp b/Source/Client/IM-Client/ATL_NetLib/IChat.cpp new file mode 100644 index 0000000..3dd3553 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IChat.cpp @@ -0,0 +1,234 @@ +// IChat.cpp : Implementation of CIChat +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "IChat.h" +#include "Session.h" +#include "Message.h" +///////////////////////////////////////////////////////////////////////////// +// CIChat + + +STDMETHODIMP CChat::SetStatus(long Status, long Param, long* Handle) +{ + if(Status >1 || Status <0) + return E_INVALIDARG; + + //Check Current State + if(m_pSession->GetState() != stConnected) + return E_PENDING; + + try + { + *Handle = m_pSession->m_IM_NET->m_CommandQueue.x_ChatStatus(m_sChat.m_CID,Status,Param); + m_pSession->m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +STDMETHODIMP CChat::CreateMessage(IMessage **ppMessage) +{ + //Check Current State + if(m_pSession->GetState() != stConnected) + return E_PENDING; + + HRESULT hr = CMessage::CreateInstance(ppMessage); + if(hr != 0) + return hr; + CMessage* mpMessage; + + mpMessage = static_cast(*ppMessage); + mpMessage->m_pSession = m_pSession; + mpMessage->m_sMessage.m_Chat.m_CID = m_sChat.m_CID; + mpMessage->m_sMessage.m_bChat = TRUE; + return hr; + +} + +STDMETHODIMP CChat::AddUser(long UserID) +{ + m_sChat.m_Users.push_back(UserID); + return S_OK; +} + +STDMETHODIMP CChat::Invite(BSTR Invitation, long *Handle) +{ + //Check Current State + if(m_pSession->GetState() != stConnected) + return E_PENDING; + + try + { + *Handle = m_pSession->m_IM_NET->m_CommandQueue.x_ChatInvite(&m_sChat,Invitation); + m_pSession->m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + + return S_OK; +} + +STDMETHODIMP CChat::Leave(long *Handle) +{ + //Check Current State + if(m_pSession->GetState() != stConnected) + return E_PENDING; + + try + { + *Handle = m_pSession->m_IM_NET->m_CommandQueue.x_ChatLeave(m_sChat.m_CID); + m_pSession->m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + + return S_OK; +} + +STDMETHODIMP CChat::Accept(long Result, long *Handle) +{ + if(Result <0 || Result >1) + return E_INVALIDARG; + + //Check Current State + if(m_pSession->GetState() != stConnected) + return E_PENDING; + + try + { + *Handle = m_pSession->m_IM_NET->m_CommandQueue.x_ChatAccept(m_sChat.m_CID,Result); + m_pSession->m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + + return S_OK; +} + +STDMETHODIMP CChat::Edit(BSTR Name, BSTR Descr, long *Handle) +{ + //Check Input Parametrs + if(Name == NULL) + return E_POINTER; + + //Check Current State + if(m_pSession->GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_pSession->m_IM_NET->m_CommandQueue.x_ChatEdit(m_sChat.m_CID,Name,Descr); + m_pSession->m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +STDMETHODIMP CChat::get_Value(BSTR bsName, VARIANT *pVal) +{ + if(CComBSTR(bsName) == CComBSTR(_T("@cid"))) + { + return CComVariant(m_sChat.m_CID).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("name"))) + { + return CComVariant(m_sChat.m_Name).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("descr"))) + { + return CComVariant(m_sChat.m_Descr).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("time"))) + { + return CComVariant(m_sChat.m_CreationTime).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("owner"))) + { + return CComVariant(m_sChat.m_Creator).Detach(pVal); + } + else + return E_INVALIDARG; + return S_OK; +} \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/IChat.h b/Source/Client/IM-Client/ATL_NetLib/IChat.h new file mode 100644 index 0000000..7ef269b --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IChat.h @@ -0,0 +1,46 @@ +// IChat.h : Declaration of the CIChat + +#ifndef __ICHAT_H_ +#define __ICHAT_H_ + +#include "resource.h" // main symbols + +class CSession; +///////////////////////////////////////////////////////////////////////////// +// CIChat +class ATL_NO_VTABLE CChat : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + CChat() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_ICHAT) +DECLARE_NOT_AGGREGATABLE(CChat) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CChat) + COM_INTERFACE_ENTRY(IChat) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IIChat +public: + STDMETHOD(get_Value)(/*[in]*/ BSTR bsName, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(Edit)(/*[in]*/ BSTR Name, /*[in]*/ BSTR Descr, /*[out, retval]*/ long* Handle); + STDMETHOD(Accept)(/*[in]*/ long Result, /*[out, retval]*/ long* Handle); + STDMETHOD(Leave)(/*[in]*/ long * Handle); + STDMETHOD(Invite)(/*[in]*/ BSTR Invitation,/*[out, retval]*/ long * Handle); + STDMETHOD(AddUser)(/*[IN]*/ long UserID); + STDMETHOD(CreateMessage)(/*[OUT]*/ IMessage** pMessage); + STDMETHOD(SetStatus)(/*[IN]*/ long Status, /*[IN]*/ long Param, /*[OUT]*/ long* Handle); + + CSession* m_pSession; + sChat m_sChat; +}; + +#endif //__ICHAT_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/IChat.rgs b/Source/Client/IM-Client/ATL_NetLib/IChat.rgs new file mode 100644 index 0000000..1287e91 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IChat.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediachase.Chat.1 = s 'Chat Class' + { + CLSID = s '{7F7B7695-3F06-409B-8B2E-F922FB708D82}' + } + Mediachase.Chat = s 'Chat Class' + { + CLSID = s '{7F7B7695-3F06-409B-8B2E-F922FB708D82}' + CurVer = s 'Mediachase.Chat.1' + } + NoRemove CLSID + { + ForceRemove {7F7B7695-3F06-409B-8B2E-F922FB708D82} = s 'Chat Class' + { + ProgID = s 'Mediachase.Chat.1' + VersionIndependentProgID = s 'Mediachase.Chat' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/IChats.cpp b/Source/Client/IM-Client/ATL_NetLib/IChats.cpp new file mode 100644 index 0000000..a0e9075 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IChats.cpp @@ -0,0 +1,8 @@ +// IChats.cpp : Implementation of CIChats +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "IChats.h" + +///////////////////////////////////////////////////////////////////////////// +// CIChats + diff --git a/Source/Client/IM-Client/ATL_NetLib/IChats.h b/Source/Client/IM-Client/ATL_NetLib/IChats.h new file mode 100644 index 0000000..791828e --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IChats.h @@ -0,0 +1,62 @@ +// IChats.h : Declaration of the CIChats + +#ifndef __ICHATS_H_ +#define __ICHATS_H_ + +#include "resource.h" // main symbols + +#include "resource.h" // main symbols +#include "collections.h" +#include "ichat.h" +#pragma warning(disable: 4530) +typedef CComEnumOnSTL, + list< CAdapt< CComPtr > > > + CComEnumVariantOnListOfChats; + +typedef ICollectionOnSTLImpl, + list< CAdapt< CComPtr > >, + IChat*, + _CopyItfFromAdaptItf, + CComEnumVariantOnListOfChats> + IChatsCollImpl; +#pragma warning(default: 4530) +///////////////////////////////////////////////////////////////////////////// +// CFiles + +class ATL_NO_VTABLE CChats : + public CComObjectRootEx, + public CComCoClass, + public IChatsCollImpl +{ +public: + CChats() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_ICHATS) +DECLARE_NOT_AGGREGATABLE(CChats) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CChats) + COM_INTERFACE_ENTRY(IChats) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + + STDMETHODIMP AddChat(IChat** ppChat) + { + HRESULT hr = CChat::CreateInstance(ppChat); + if( SUCCEEDED(hr) ) + { + // Put the document on the list + CComPtr spChat = *ppChat; + m_coll.push_back(spChat); + } + return hr; + } +// IIChats +public: +}; + +#endif //__ICHATS_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/IChats.rgs b/Source/Client/IM-Client/ATL_NetLib/IChats.rgs new file mode 100644 index 0000000..95f9de9 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IChats.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediachase.Chats.1 = s 'Chats Class' + { + CLSID = s '{9359EDFF-2973-4BB3-AC7A-E9A77DEE93B0}' + } + Mediachase.Chats = s 'Chats Class' + { + CLSID = s '{9359EDFF-2973-4BB3-AC7A-E9A77DEE93B0}' + CurVer = s 'Mediachase.Chats.1' + } + NoRemove CLSID + { + ForceRemove {9359EDFF-2973-4BB3-AC7A-E9A77DEE93B0} = s 'Chats Class' + { + ProgID = s 'Mediachase.Chats.1' + VersionIndependentProgID = s 'Mediachase.Chats' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/IM_Net.cpp b/Source/Client/IM-Client/ATL_NetLib/IM_Net.cpp new file mode 100644 index 0000000..c88bacc --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IM_Net.cpp @@ -0,0 +1,1020 @@ +// IM_Net.cpp: implementation of the CIM_Net class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "IM_Net.h" +#include "Session.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +extern long g_MessageSend; +extern long g_MessageReceveived; + +extern long g_FileSent; +extern long g_FileReceived; + +BASE_NET_MANAGER_CONFIG CIM_Net::m_BASE_NET_MANAGER_CONFIG; + +CIM_Net::CIM_Net() +{ + MCTRACE(OBJECT_CREATE_DELETE,"CIM_Net::CIM_Net() begin"); + + ::InitializeCriticalSection(&hCS); + ::InitializeCriticalSection(&hNewCommandCS); + + //init var + m_bWaitForDisconnect= FALSE; + m_bMustBeDestroied = FALSE; + m_WaitForReconnect = FALSE; + m_State = stDisconnected; + m_OpenThreadCount = 0; + m_StartedChannelCount = 0; + m_DisErrorCode = 0; + m_DisErrorType = 0; + + //Output commands events + for(int k=0; k<2; k++) + { + m_CurrentHandles[k] = 0; + m_CurrentCommands[k] = 0; + m_EnableSend[k] = true; + } + + hEvents[0] = ::CreateEvent(NULL,FALSE,FALSE,0); //New command + hEvents[1] = ::CreateEvent(NULL,TRUE,FALSE,0); //Destroy + + //input answers and events events + hCallBackEvents[NET_EVENT_RECEIVER_CHANNEL] = ::CreateEvent(NULL,FALSE,FALSE,0); + hCallBackEvents[NET_COMMAND_CHANNEL] = ::CreateEvent(NULL,FALSE,FALSE,0); + hCallBackEvents[NET_HISTORY_CHANNEL] = ::CreateEvent(NULL,FALSE,FALSE,0); + hCallBackEvents[NET_FILESEND_CHANNEL] = ::CreateEvent(NULL,FALSE,FALSE,0); + hCallBackEvents[NET_FILERECEIVE_CHANNEL] = ::CreateEvent(NULL,FALSE,FALSE,0); + hCallBackEvents[5] = CreateEvent(NULL,FALSE,FALSE,0);//New Event signal + hCallBackEvents[6] = hEvents[1];//Destroy signal + + //Net configuration + + DWORD dwThreadId; + HANDLE hThread; + + hThread = CreateThread(NULL,NULL,CheckQueueThread,this,0,&dwThreadId); + CloseHandle(hThread); + hThread = CreateThread(NULL,NULL,CallBackThread,this,0,&dwThreadId); + CloseHandle(hThread); + + MCTRACE(OBJECT_CREATE_DELETE,"CIM_Net::CIM_Net() end"); +} + +CIM_Net::~CIM_Net() +{ + MCTRACE(OBJECT_CREATE_DELETE,"CIM_Net::~CIM_Net() beging"); + + + m_bMustBeDestroied = TRUE; + + m_BaseNetManager.StopAllOperations(); + + SetEvent(hEvents[1]); + + while(m_StartedChannelCount) + Sleep(100); + + //Sleep(1000); + MCTRACE(OBJECT_CREATE_DELETE,"CIM_Net::~CIM_Net() m_StartedChannelCount == 0"); + + for(int k=0; k<2; k++) + CloseHandle(hEvents[k]); + + for(int k=0; k<6; k++) + CloseHandle(hCallBackEvents[k]); + + ::DeleteCriticalSection(&hCS); + ::DeleteCriticalSection(&hNewCommandCS); + + MCTRACE(OBJECT_CREATE_DELETE,"CIM_Net::~CIM_Net() end"); +} + +//DEL void CIM_Net::OpenInternet() +//DEL { +//DEL if (InetHandle != NULL) return; +//DEL +//DEL InetHandle = InternetOpen(_T("Mediachase IM"), prAccessType, prProxyName,prBypass,NULL); +//DEL +//DEL if (InetHandle == NULL) return;//throw(); +//DEL } + + +bool CIM_Net::CancelCommand(long Handle) +{ + int k = m_CommandQueue.DeleteCommand(Handle); + BOOL Find = FALSE; + + if(k>=0 && k<=4 && m_CurrentHandles[k] == Handle) + { + Find = TRUE; + m_BaseNetManager.StopOperation((NET_CHANNEL_ENUM)k); + } + if(!Find) + while(!m_ParentSession->PostMessage(IM_ANSWER_ERROR,Handle,MAKELONG(LOWORD(etCANCEL),LOWORD(1)))); + return true; +} +bool IsInternal(long pp) +{ + + switch(pp) + { + case cmLogOn_int: + case cmConfirmMessage: + case cmConfirmPromo: +// case cmConfirmFile: + return true; + break; + } +return false; +}; +//***************************************************************************************** +// +// +//***************************************************************************************** +DWORD WINAPI CIM_Net::CallBackThread(LPVOID param) +{ + CIM_Net* WorkClass; + WorkClass = (CIM_Net*)param; + WorkClass->ProcessingServerEvents(); + return 0; +} + +//*************************************************************************************** +//Sending +// +// +DWORD WINAPI CIM_Net::CheckQueueThread(LPVOID param) +{ + try + { + CIM_Net* WorkClass; + WorkClass = (CIM_Net*)param; + WorkClass->CheckQueue(); + } + catch(...) + { + } + return 0; +} + +void CIM_Net::CheckQueue() +{ + + LPCTSTR ConstStr[4] = {LPCTSTR("Commands/*/*"), LPCTSTR("History/*/*"), + LPCTSTR("ReceiveFiles/*"), LPCTSTR("SendFiles/*")}; + + + + ::InterlockedIncrement(&m_OpenThreadCount); + ::CoInitializeEx(NULL,COINIT_MULTITHREADED); + USES_CONVERSION; +do +{ + MCTRACE(2,"CIM_Net::CheckQueue got to waiting\r\n"); + DWORD kk = ::WaitForMultipleObjects(2,(const HANDLE *)(hEvents),FALSE,INFINITE); + ATLASSERT(WAIT_FAILED != kk); + kk -= WAIT_OBJECT_0; + + //Close Thread + if(kk == 1) + { + ::InterlockedDecrement(&m_OpenThreadCount); + ::CoUninitialize(); + return; + } + + MCTRACE(2,"CIM_Net::CheckQueue befor CS\r\n"); + ::EnterCriticalSection(&hCS); + MCTRACE(2, "CIM_Net::CheckQueue after CS\r\n"); + + for(int intChannel=0; intChannel<4; intChannel++) + { + if(m_EnableSend[intChannel]) + { + CComBSTR bsFileName; //input, output file name + CComBSTR SID; + CComPtr pDoc = NULL; + BOOL bFileDirection; + DWORD dwCommandHandle, dwCommandType; + long dwSize; + long hBackWind; + CComPtr pStream = NULL; + CComPtr pNode; + CComBSTR bstrStatus; + int i; + if(!m_CommandQueue.CheckQueueItem(CComBSTR(ConstStr[intChannel]),&pDoc, + dwCommandHandle,dwCommandType, + &bsFileName,&hBackWind,&dwSize,&SID)) + continue; +#ifdef _DEBUG +#ifdef _DOLOG + CComBSTR bsCommand; + pDoc->get_xml(&bsCommand); + MCTRACE(3 + intChannel, + "CIM_Net::CheckQueue new command\r\n %S",bsCommand); + pDoc->save(CComVariant(CComBSTR(_T("C:\\im\\command.xml")))); +#endif +#endif + XMLtoStream(pDoc,&pStream); + + switch(intChannel) + { + case opCommand: + case opHistory: + switch(dwCommandType) + { + case cmLogOn: + while(!m_ParentSession->PostMessage(IM_CHANGE_STATE,stConnecting,0)) + Sleep(10); + break; + case cmChangeStatus: + pDoc->selectSingleNode(CComBSTR("packet/request/status"),&pNode); + pNode->get_text(&bstrStatus); + m_CurrentSendingStatus = atol(OLE2T(bstrStatus)); + break; + default: + //ATLASSERT(FALSE); + break; + } + break; + case opReceiveFile: + bFileDirection = NET_FILE_RECEIVE; + break; + case opSendFile: + bFileDirection = NET_FILE_SEND; + break; + default: + break; + } + m_CurrentHandles[intChannel] = dwCommandHandle; + m_CurrentCommands[intChannel]= dwCommandType; + + ::InterlockedIncrement(&m_StartedChannelCount); + m_BaseNetManager.StartOperation((NET_CHANNEL_ENUM)intChannel, + OLE2T(SID),dwCommandHandle, + pStream, + hCallBackEvents[intChannel], + OLE2T(bsFileName), + (NET_FILE_DIRECTION)bFileDirection, + (HWND)hBackWind); + m_EnableSend[intChannel] = FALSE; + pStream.Release(); + switch(intChannel) + { + case opCommand: + case opHistory: + switch(dwCommandType) + { + case cmLogOff: + m_bWaitForDisconnect = true; + for(i=0; i<4; i++) + { + m_DisErrorCode = 0; + m_DisErrorType = 0; + m_BaseNetManager.StopOperation((NET_CHANNEL_ENUM)(i+1)); + m_EnableSend[i] = FALSE; + } + + break; + default: + break; + } + break; + default: + break; + } + } + } + ::LeaveCriticalSection(&hCS); +} +while(!m_bMustBeDestroied); + + ::CoUninitialize(); + ::InterlockedDecrement(&m_OpenThreadCount); + return; +} + + +//DEL void CIM_Net::SetNewCommand(opType type) +//DEL { +//DEL ATLASSERT(type<5 && type >= 0); +//DEL ::EnterCriticalSection(&hNewCommandCS); +//DEL ::SetEvent(hEvents[type]); +//DEL LeaveCriticalSection(&hNewCommandCS); +//DEL } + +//DEL BOOL CIM_Net::XMLtoMEM(IXMLDOMDocument *pDom, PBYTE &pBuff, DWORD &dwSize) +//DEL { +//DEL CComPtr pPSI; +//DEL CComPtr pStm; +//DEL BYTE *pbData = NULL; +//DEL HGLOBAL hGlobal; +//DEL ULARGE_INTEGER uli; +//DEL LARGE_INTEGER li = {0, 0}; +//DEL HRESULT hr = 0; +//DEL +//DEL try +//DEL { +//DEL pBuff = NULL; +//DEL dwSize = 0; +//DEL +//DEL hr = CreateStreamOnHGlobal(NULL, TRUE, &pStm); +//DEL if(FAILED(hr)) goto CleanUp; +//DEL +//DEL hr = pDom->QueryInterface( IID_IPersistStreamInit, (void **)&pPSI); +//DEL if(FAILED(hr)) goto CleanUp; +//DEL +//DEL hr = pPSI->Save(pStm, TRUE); +//DEL if(FAILED(hr)) goto CleanUp; +//DEL +//DEL hr = pStm->Seek(li, STREAM_SEEK_CUR, &uli); +//DEL if(FAILED(hr)) goto CleanUp; +//DEL +//DEL dwSize = (int)uli.QuadPart; +//DEL +//DEL pBuff = new BYTE[dwSize]; MCTRACE(2,"XML TO MEM = NEW BUFFER"); +//DEL +//DEL if (pBuff == NULL) goto CleanUp; +//DEL +//DEL hr = GetHGlobalFromStream(pStm, &hGlobal); +//DEL if(FAILED(hr)) goto CleanUp; +//DEL +//DEL memcpy(pBuff, (PBYTE)GlobalLock(hGlobal),dwSize); +//DEL GlobalUnlock(hGlobal); +//DEL +//DEL } +//DEL catch(...){hr = E_FAIL;} +//DEL +//DEL CleanUp: +//DEL if(FAILED(hr)) +//DEL { +//DEL if(pBuff) delete[] pBuff; pBuff = NULL; +//DEL return false; +//DEL } +//DEL return true; +//DEL } + +//DEL BOOL CIM_Net::MEMtoXML(IXMLDOMDocument **pDom, PBYTE &pBuff, DWORD &dwSize) +//DEL { +//DEL CComPtr pPSI; +//DEL CComPtr pStm; +//DEL CComPtr pDoc; +//DEL HRESULT hr; +//DEL ULONG ulWritten; +//DEL LARGE_INTEGER li = {0, 0}; +//DEL try +//DEL { +//DEL pDoc.CoCreateInstance(CLSID_FreeThreadedDOMDocument); +//DEL if(!pDoc) return false; +//DEL hr = CreateStreamOnHGlobal(NULL, TRUE, &pStm); +//DEL if(FAILED(hr)) return false; +//DEL +//DEL hr = pStm->Write(pBuff, dwSize, &ulWritten); +//DEL if(FAILED(hr)) return false; +//DEL +//DEL +//DEL hr = pStm->Seek(li, STREAM_SEEK_SET, NULL); +//DEL if(FAILED(hr)) return false; +//DEL +//DEL hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI); +//DEL if(FAILED(hr)) return false; +//DEL +//DEL hr = pPSI->Load(pStm); +//DEL if(FAILED(hr)) return false; +//DEL +//DEL *pDom = pDoc.Detach(); +//DEL return true; +//DEL } +//DEL catch(...) +//DEL {} +//DEL return false; +//DEL } + +void CIM_Net::Config() +{ + USES_CONVERSION; + + m_BaseNetManager.Close(); + //prAccessType = INTERNET_OPEN_TYPE_PRECONFIG; + //prProxyName = NULL; + //prBypass = NULL; + + m_BaseNetManager.Init(m_BASE_NET_MANAGER_CONFIG); +/* + if(prProxyName) + {delete[] prProxyName;} + prProxyName = new TCHAR[strlen(OLE2T(pConfig.m_ProxyServer))+1]; + strcpy(prProxyName,OLE2T(pConfig.m_ProxyServer)); + + if(prBypass) + {delete[] prBypass;} + prBypass = new TCHAR[strlen(OLE2T(pConfig.m_ProxyBypass))+1]; + strcpy(prBypass,OLE2T(pConfig.m_ProxyBypass));*/ + + + prAccessType = INTERNET_OPEN_TYPE_DIRECT; + + //OpenInternet(); + +/* + m_NetCommand.hInternet = InetHandle; + m_NetEvent.hInternet = InetHandle; + m_NetHistory.hInternet = InetHandle; + m_NetReceiveFile.hInternet = InetHandle; + m_NetSendFile.hInternet = InetHandle; + m_NetSendFile.hInternet = InetHandle; + + + m_NetCommand.Config(OLE2T(pConfig.m_Server),OLE2T(pConfig.m_Path),pConfig.m_Port); + m_NetEvent.Config(OLE2T(pConfig.m_Server),OLE2T(pConfig.m_Path),pConfig.m_Port); + m_NetHistory.Config(OLE2T(pConfig.m_Server),OLE2T(pConfig.m_Path),pConfig.m_Port); + m_NetReceiveFile.Config(OLE2T(pConfig.m_Server),OLE2T(pConfig.m_Path),pConfig.m_Port); + m_NetSendFile.Config(OLE2T(pConfig.m_Server),OLE2T(pConfig.m_Path),pConfig.m_Port); + m_NetSendFile.Config(OLE2T(pConfig.m_Server),OLE2T(pConfig.m_Path),pConfig.m_Port);*/ + +} + +DWORD CIM_Net::ProcessingServerEvents() +{ +// HRESULT hr; + DWORD res = 0; + + DWORD OperationComplet; + DWORD ErrorCode = 0; + DWORD ErrorType = 0; + DWORD ErrorCount= 0; + + USES_CONVERSION; + ::InterlockedIncrement(&m_OpenThreadCount); + ::CoInitializeEx(NULL,COINIT_MULTITHREADED); + +/* +NET_COMMAND_CHANNEL, +NET_HISTORY_CHANNEL, +NET_FILERECEIVE_CHANNEL, +NET_FILESEND_CHANNEL, +NET_EVENT_RECEIVER_CHANNEL +*/ + MCTRACE(OBJECT_CREATE_DELETE,"CIM_Net::ProcessingServerEvents STARTED"); + + do + { + res = WaitForMultipleObjects(7,(const HANDLE *)(hCallBackEvents),FALSE,INFINITE); + OperationComplet = res-WAIT_OBJECT_0; + + //================================================================== + //Print state dump + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents *State_dump_1*\r\n" + "WaitForReconnect = %d;\r\n" + "m_bWaitForDisconnect = %d;\r\n" + "ErrorCount = %d;\r\n" + "m_StartedChannelCount = %d\r\n", + m_WaitForReconnect,m_bWaitForDisconnect,ErrorCount,m_StartedChannelCount); + + //=================================================================== + // Must be destroied //6 == STOP + if(OperationComplet == 6) + { + MCTRACE(OBJECT_CREATE_DELETE,"CIM_Net::ProcessingServerEvents STOPTED"); + InterlockedDecrement(&m_OpenThreadCount); + CoUninitialize(); + return 0; + } + + MCTRACE(OperationComplet+ 3,"CIM_Net::ProcessingServerEvents Operation Completed"); + + //=================================================================== + // We have received new event //5 = new event + if(OperationComplet == 5) + { + ErrorCount = 0; + NewEventProcessing(); + continue; + } + InterlockedDecrement(&m_StartedChannelCount); //Decrement Count Net Thread + //=================================================================== + //Preprocess any operation completed + DWORD dwCommandHandle = 0; + DWORD dwCommandType = 0; + + + if(OperationComplet<4) + { + dwCommandHandle = m_CurrentHandles[OperationComplet]; + dwCommandType = m_CurrentCommands[OperationComplet]; + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents New Answer Command Handle = %d CommandType = %d", + dwCommandHandle,dwCommandType); + } + + //*************************************************************************** + //Obtain error codes + m_BaseNetManager.GetResultError((NET_CHANNEL_ENUM)OperationComplet, ErrorType,ErrorCode); + + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents New Answer Error Type= %d Code= %d", + ErrorType,ErrorCode); + + + //**************************************************************************** + //Process errors + //Что происходит если пришла ошибка когда + //WaitForReconnect или m_bWaitForDisconnect true??? + + if(!m_WaitForReconnect && !m_bWaitForDisconnect) + if(ErrorType != 0 || ErrorCode != 0) + { + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents error processing"); + + switch(ErrorType) + { + case etWININET://Ошибки связи + case etSTATUS: + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents etSTATUS or etSTATUS"); + ErrorCount++; + if(ErrorCount>3) //Отработка отключения (3 ошибки подряд) + { + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents ErrorCount > 3"); + + //Подготовка к отключению!!!!!!!!!!!!!!!!!!!!! + m_bWaitForDisconnect = true; // + m_DisErrorType = ErrorType; + m_DisErrorCode = ErrorCode; + LockSending(); + + m_BaseNetManager.StopAllOperations(); + m_BaseNetManager.StopEventReceiver(); + } + else + { + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents ErrorCount <= 3"); + + // if command // try send again + if(OperationComplet == NET_COMMAND_CHANNEL || + OperationComplet == NET_HISTORY_CHANNEL) + { + UnlockSendingOperation((NET_CHANNEL_ENUM)OperationComplet); + } + else + if(OperationComplet == NET_FILERECEIVE_CHANNEL || + OperationComplet == NET_FILESEND_CHANNEL) + { + ErrorCount --; + m_CommandQueue.DeleteCommand(dwCommandHandle); + + UnlockSendingOperation((NET_CHANNEL_ENUM)OperationComplet); + while(!m_ParentSession->PostMessage(IM_ANSWER_ERROR,dwCommandHandle,MAKELONG(LOWORD(ErrorType),LOWORD(ErrorCode)))); + } + else + if(OperationComplet == NET_EVENT_RECEIVER_CHANNEL) //5 == GET_EVENT + { + + InterlockedIncrement(&m_StartedChannelCount); + m_BaseNetManager.StartEventReceiver( + OLE2T(m_ParentSession->m_SID), + hCallBackEvents[NET_EVENT_RECEIVER_CHANNEL], + hCallBackEvents[5]); + + } + } + break; + //******************************************************** + case etSERVER://Ошибки сервера + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents etSERVER"); + if(OperationComplet == opCommand && dwCommandType == cmLogOn) + { + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents command was LogOn"); + m_bWaitForDisconnect = true; + m_DisErrorType = ErrorType; + m_DisErrorCode = ErrorCode; + break; + } + else + switch(ErrorCode) + { + case 112: + + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents 112 error"); + + LockSending(); + m_BaseNetManager.StopAllOperations(); + m_BaseNetManager.StopEventReceiver(); + + if(OperationComplet == opCommand && dwCommandType == cmLogOff) + { + m_DisErrorType = ErrorType; + m_DisErrorCode = ErrorCode; + m_bWaitForDisconnect = true; + } + else + m_WaitForReconnect = true; + + break; + + //Any another server error + default: + + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents Error Processing Serever Any another err"); + + if(dwCommandHandle != 0 && !IsInternal(dwCommandHandle)) + { + //????????????????????????????????????????? + while(!m_ParentSession->PostMessage(IM_ANSWER_ERROR,dwCommandHandle,MAKELONG(LOWORD(ErrorType),LOWORD(ErrorCode)))); + } + else + m_CommandQueue.DeleteCommand(dwCommandHandle); + + UnlockSendingOperation((NET_CHANNEL_ENUM)OperationComplet); + break; + } + break; + + case etFILE: + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents Error Processing Serever File err"); + + UnlockSendingOperation((NET_CHANNEL_ENUM)OperationComplet); + + if(dwCommandHandle != 0 && !IsInternal(dwCommandHandle)) + { + while(!m_ParentSession->PostMessage(IM_ANSWER_ERROR,dwCommandHandle,MAKELONG(LOWORD(ErrorType),LOWORD(ErrorCode)))); + MCTRACE(2,"CIM_Net::CallBackThread Error Process Serever File err Send Message"); + } + break; + + case etCANCEL: + MCTRACE(OperationComplet+ 3, + "CIM_Net::ProcessingServerEvents Error Processing Serever Error Cancel"); + + ErrorCode = 0; + UnlockSendingOperation((NET_CHANNEL_ENUM)OperationComplet); + + if(opCommand == OperationComplet && dwCommandType == cmLogOn) + { + m_DisErrorType = etCANCEL; + m_DisErrorCode = ErrorCode; + m_bWaitForDisconnect = true; + break; + } + + if(dwCommandHandle != 0 && !IsInternal(dwCommandHandle)) + { + while(!m_ParentSession->PostMessage(IM_ANSWER_ERROR,dwCommandHandle,MAKELONG(LOWORD(ErrorType),LOWORD(ErrorCode)))); + MCTRACE(2,"CIM_Net::CallBackThread Error Process Serever Error Cancel Send Message"); + } + else + m_CommandQueue.DeleteCommand(dwCommandHandle); + break; + default: + break; + } + } + else + { + ErrorCount = 0; + MCTRACE(2,"CIM_Net::CallBackThread ErrorCount = 0"); + } + + //************************************************************************** + //If errors not found + if(ErrorCode == 0 && ErrorType == 0) + { + ErrorCount = 0; + CComPtr pStream = NULL; + CComPtr pDoc = NULL; + CComPtr pNode = NULL; + + pStream.Release(); + m_BaseNetManager.GetResult((NET_CHANNEL_ENUM)OperationComplet,&pStream); + + m_CommandQueue.DeleteCommand(dwCommandHandle); + + //IMonitor implementation + + if(OperationComplet == NET_COMMAND_CHANNEL + &&dwCommandType == cmMessage) + { + ::InterlockedIncrement(&g_MessageSend); + } + else + if(OperationComplet == NET_COMMAND_CHANNEL + &&dwCommandType == cmConfirmMessage) + { + ::InterlockedIncrement(&g_MessageReceveived); + } + else + if(OperationComplet == NET_FILESEND_CHANNEL) + { + ::InterlockedIncrement(&g_FileSent); + } + else + if(OperationComplet == NET_FILERECEIVE_CHANNEL) + { + ::InterlockedIncrement(&g_FileReceived); + } + //end IMonitor implementation + + + if(pStream != NULL) + XMLfromSream(&pDoc,pStream); + + if(pDoc != NULL) + { + if(S_OK == pDoc->get_firstChild(&pNode)) + m_CommandQueue.AddAnswer(dwCommandHandle,dwCommandType,pNode); + + if(!IsInternal(dwCommandType)) + while(!m_ParentSession->PostMessage(IM_ANSWER_BUFF,dwCommandHandle,dwCommandType)); + } + else + if(!IsInternal(dwCommandType)) + while(!m_ParentSession->PostMessage(IM_ANSWER_OK,dwCommandHandle,dwCommandType)); + + pNode.Release(); + pDoc.Release(); + + if(opCommand == OperationComplet) + switch(dwCommandType) + { + case cmLogOn: + m_bWaitForDisconnect = FALSE; + m_WaitForReconnect = FALSE; + m_DisErrorCode = 0; + m_DisErrorType = 0; + //send StatusChanged message + m_State = stConnected; + while(!m_ParentSession->PostMessage(IM_CHANGE_STATE,stConnected,0)) + Beep(100,100); + + //start event receiver + + InterlockedIncrement(&m_StartedChannelCount); + m_BaseNetManager.StartEventReceiver( + OLE2T(m_ParentSession->m_SID), + hCallBackEvents[NET_EVENT_RECEIVER_CHANNEL], + hCallBackEvents[5]); + + + + //add Load List command + try {m_CommandQueue.x_LoadList(ltContact);} + catch(...){}; + try {m_CommandQueue.x_LoadList(ltChats);} + catch(...){}; + //unlock output commads + UnlockSending(); + break; + + case cmLogOff: + MCTRACE(2,"CIM_Net::CallBackThread opCommand || opHistory new Answer LOGOFF"); + + m_bWaitForDisconnect = true; + + //lock output command + LockSending(); + + //Stop any net activity + m_BaseNetManager.StopAllOperations(); + m_BaseNetManager.StopEventReceiver(); + + //Set disconnect errors + m_DisErrorType = ErrorType; + m_DisErrorCode = ErrorCode; + //waiting all operation completed + break; + default: + if(!m_bWaitForDisconnect && !m_WaitForReconnect) + UnlockSendingOperation((NET_CHANNEL_ENUM)OperationComplet); + break; + } + else + if(!m_bWaitForDisconnect && !m_WaitForReconnect) + UnlockSendingOperation((NET_CHANNEL_ENUM)OperationComplet); + } + + //======================================================================== + //All thread closed + if(m_StartedChannelCount == 0) + { + if(m_bWaitForDisconnect) + { + MCTRACE(2,"CIM_Net::CallBackThread WaitForDisconnect"); + m_State = stDisconnected; + m_ParentSession->SendMessage(IM_CHANGE_STATE,stDisconnected,MAKELONG(m_DisErrorType,m_DisErrorCode)); + + ErrorCount = 0; + m_bWaitForDisconnect = false; + UnlockSendingOperation((NET_CHANNEL_ENUM)opCommand); + } + else + if(m_WaitForReconnect) + { + MCTRACE(2,"CIM_Net::CallBackThread WaitForReconnect"); + + try{m_CommandQueue.x_LogOn_Inter();}catch(...){}; + ErrorCount = 0; + m_WaitForReconnect = FALSE; + UnlockSendingOperation((NET_CHANNEL_ENUM)opCommand); + } + } + + MCTRACE(2,"CIM_Net::CallBackThread WaitForNew Event"); + } + while(!m_bMustBeDestroied); + + ::CoUninitialize(); + ::InterlockedDecrement(&m_OpenThreadCount); + MCTRACE(2,"CIM_Net::CallBackThread CLOSED"); + return 0; +} + + +long CIM_Net::XMLtoStream(IXMLDOMDocument *pDoc, IStream **lpStream) +{ + CComPtr pPSI; + ULARGE_INTEGER uli; + LARGE_INTEGER li = {0, 0}; + HRESULT hr = 0; + + ATLASSERT(*lpStream == NULL); + + *lpStream = NULL; + + hr = CreateStreamOnHGlobal(NULL, TRUE, lpStream); + if(FAILED(hr)) goto CleanUp; + + hr = pDoc->QueryInterface( IID_IPersistStreamInit, (void **)&pPSI); + if(FAILED(hr)) goto CleanUp; + + hr = pPSI->Save(*lpStream, TRUE); + if(FAILED(hr)) goto CleanUp; + + hr = (*lpStream)->Seek(li, STREAM_SEEK_SET, &uli); + if(FAILED(hr)) goto CleanUp; + +#ifdef _DEBUG +#ifdef _DOLOG + pDoc->save(CComVariant(CComBSTR(_T("C:\\im\\XMLToStream.xml")))); +#endif +#endif + return S_OK; + +CleanUp: + if(*lpStream != NULL) + (*lpStream)->Release(); + + return E_FAIL; +} + +long CIM_Net::NewEventProcessing() +{ + HRESULT hr = S_OK; + CComPtr pStream = NULL; + CComPtr pDoc = NULL; + CComPtr pNode = NULL; + + do + { + pStream.Release(); + pDoc.Release(); + pNode.Release(); + + hr = m_BaseNetManager.GetNextEvent(&pStream); + if(pStream == NULL || hr != S_OK) return hr; + hr = XMLfromSream(&pDoc,pStream); + if(hr != S_OK) return S_OK; + hr = pDoc->get_firstChild(&pNode); + if(!pNode) return S_OK; + VARIANT_BOOL vb_HaveChild = VARIANT_FALSE; + pNode->hasChildNodes(&vb_HaveChild); + if(vb_HaveChild == VARIANT_FALSE) return S_OK; + m_CommandQueue.AddEvent(pNode); + while(!m_ParentSession->PostMessage(IM_NEW_EVENT,0,0)); + } + while(true); + + return S_OK; +}; + +long CIM_Net::XMLfromSream(IXMLDOMDocument **lpDoc, IStream *pStream) +{ + ATLASSERT(*lpDoc == NULL); + ATLASSERT(pStream != NULL); + + HRESULT hr; + CComPtr pPSI; + CComPtr pDoc; +// ULONG ulWritten; + LARGE_INTEGER li = {0, 0}; + + hr = pDoc.CoCreateInstance(CLSID_FreeThreadedDOMDocument40); + if(FAILED(hr)) return hr; + + hr = pStream->Seek(li,STREAM_SEEK_SET,NULL); + if(FAILED(hr)) return hr; + + hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI); + if(FAILED(hr)) return hr; +#ifdef DEBUG + TCHAR pp[201]; + DWORD si= 200; + DWORD wsi = 1; + while(wsi) + { + hr = pStream->Read(pp,si,&wsi); + pp[wsi] = '\0'; + ATLTRACE(pp); + } + hr = pStream->Seek(li,STREAM_SEEK_SET,NULL); + if(FAILED(hr)) return hr; +#endif DEBUG + hr = pPSI->Load(pStream); + if(FAILED(hr)) return hr; + +#ifdef _DEBUG +#ifdef _DOLOG + pDoc->save(CComVariant(CComBSTR(_T("C:\\im\\XMLFromStream.xml")))); +#endif +#endif + VARIANT_BOOL vbChild = VARIANT_FALSE; + pDoc->hasChildNodes(&vbChild); + if(vbChild == VARIANT_TRUE) + *lpDoc = pDoc.Detach(); + return S_OK; +} + +void CIM_Net::LockSending() +{ +MCTRACE(2,"LockSending begin\r\n"); + EnterCriticalSection(&hCS); + for(int k=0; k<4; k++) + m_EnableSend[k] = FALSE; + LeaveCriticalSection(&hCS); +MCTRACE(2,"LockSending begin\r\n"); +} + +void CIM_Net::UnlockSending() +{ +MCTRACE(2,"UnlockSending begin\r\n"); + EnterCriticalSection(&hCS); + for(int k=0; k<4; k++) + m_EnableSend[k] = TRUE; + SetEvent(hEvents[0]); + LeaveCriticalSection(&hCS); +MCTRACE(2,"UnlockSending end\r\n"); +} + +void CIM_Net::LockSendingOperation(NET_CHANNEL_ENUM NetChannel) +{ +MCTRACE(2,"LockSendingOperation begin\r\n"); + EnterCriticalSection(&hCS); + m_EnableSend[NetChannel] = FALSE; + LeaveCriticalSection(&hCS); +MCTRACE(2,"LockSendingOperation end\r\n"); +} + +void CIM_Net::UnlockSendingOperation(NET_CHANNEL_ENUM NetChannel) +{ +MCTRACE(2,"UnlockSendingOperation begin\r\n"); + EnterCriticalSection(&hCS); + m_EnableSend[NetChannel] = TRUE; + SetEvent(hEvents[0]); + LeaveCriticalSection(&hCS); +MCTRACE(2,"UnlockSendingOperation end\r\n"); +} + +void CIM_Net::SetNewCommand() +{ + MCTRACE(2,"SetNewCommand begin\r\n"); +EnterCriticalSection(&hCS); + SetEvent(hEvents[0]); +LeaveCriticalSection(&hCS); + MCTRACE(2,"SetNewCommand end\r\n"); +} + +HRESULT CIM_Net::SetStream(IStream *pStream) +{ + return S_OK; +} + +BOOL CIM_Net::WriteFileToServer() +{ + return S_OK; +} diff --git a/Source/Client/IM-Client/ATL_NetLib/IM_Net.h b/Source/Client/IM-Client/ATL_NetLib/IM_Net.h new file mode 100644 index 0000000..74c0169 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/IM_Net.h @@ -0,0 +1,72 @@ +// IM_Net.h: interface for the CIM_Net class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_IM_NET_H__3AE2EAF5_1840_41BA_BBD1_E4D83EB7E34B__INCLUDED_) +#define AFX_IM_NET_H__3AE2EAF5_1840_41BA_BBD1_E4D83EB7E34B__INCLUDED_ + +#include "CommandQueue.h" +#include "BaseNetManager.h" +//#include "NetCommand.h" +//#include "NetEvent.h" +//#include "NetReceiveFile.h" +//#include "NetSendFile.h" + +class CIM_Net +{ +public: + CIM_Net(); + virtual ~CIM_Net(); +private: + static DWORD WINAPI CheckQueueThread(LPVOID param); + static DWORD WINAPI CallBackThread(LPVOID param); + void CheckQueue(); + +public: + void SetNewCommand(); + void Config(); + + CRITICAL_SECTION hCS; + CRITICAL_SECTION hNewCommandCS; + bool CancelCommand(long Handle); + CCommandQueue m_CommandQueue; + CSession* m_ParentSession; + + CBaseNetManager m_BaseNetManager; + long m_CurrentSendingStatus; + static BASE_NET_MANAGER_CONFIG m_BASE_NET_MANAGER_CONFIG; + BOOL m_WaitForReconnect; +private: + BOOL WriteFileToServer(); + HRESULT SetStream(IStream* pStream); + void UnlockSending(); + void LockSending(); + long NewEventProcessing(); + void UnlockSendingOperation(NET_CHANNEL_ENUM NetChannel); + void LockSendingOperation(NET_CHANNEL_ENUM NetChannel); + long XMLfromSream(IXMLDOMDocument** lpDoc, IStream* pStream); + long XMLtoStream(IXMLDOMDocument* pDoc, IStream** lpStream); + DWORD ProcessingServerEvents(); + + bool m_EnableSend[4]; + long m_OpenThreadCount; + DWORD m_CurrentHandles[4]; + DWORD m_CurrentCommands[4]; + HANDLE hEvents[2]; + HANDLE hCallBackEvents[7]; + stState m_State; + + BOOL m_bMustBeDestroied; + BOOL m_bWaitForDisconnect; + long m_StartedChannelCount; //count of active net channel + + DWORD m_DisErrorCode; + DWORD m_DisErrorType; + + //proxy + DWORD prAccessType; + LPTSTR prProxyName; + LPTSTR prBypass; +}; + +#endif // !defined(AFX_IM_NET_H__3AE2EAF5_1840_41BA_BBD1_E4D83EB7E34B__INCLUDED_) diff --git a/Source/Client/IM-Client/ATL_NetLib/LogEX.h b/Source/Client/IM-Client/ATL_NetLib/LogEX.h new file mode 100644 index 0000000..ea08353 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/LogEX.h @@ -0,0 +1,57 @@ +#ifndef __LOG__EX__ +#define __LOG__EX__ + +#define LOG_EX_WINDOW_NAME "{CD882CBA-DE79-429c-B195-732051E98C43}" +#define LOG_EX_WINDOW_CLASS "{173D6EE5-02DC-4239-884E-C0051639D11A}" + +#define LOG_SAVE_WINDOW_NAME "{337556F0-BE00-481c-98E5-D30EAB8070A8}" +#define LOG_SAVE_WINDOW_CLASS "{84E7E26D-2077-4645-92DF-E57C5B8AF548}" + +#define WM_SAVE_LOG_DATA WM_USER+1 +#define WM_GET_LOG_INFO WM_USER+2 + +#define LOGEX_TYPE_NORMAL 0 +#define LOGEX_TYPE_INFO 1 + +enum +{ + LOGEX_LEVEL0 = 0, + LOGEX_LEVEL1, + LOGEX_LEVEL2, + LOGEX_LEVEL3, + LOGEX_LEVEL4, + LOGEX_LEVEL5, + LOGEX_LEVEL6, + LOGEX_LEVEL7, + LOGEX_LEVEL8, + LOGEX_LEVEL9, + LOGEX_LEVEL_LAST +}; + +struct LOGEX_INFO +{ + SYSTEMTIME st; + DWORD dwProcID; + DWORD dwType; + DWORD dwUID; + DWORD dwLevel; +}; + +#ifdef LOGEX_EXPORTS +#define LOGEX_API __declspec(dllexport) +#else +#define LOGEX_API __declspec(dllimport) +#endif + +LOGEX_API void AddToLogEX(DWORD dwLevel, char *szFormat, ...); +LOGEX_API void AddToLogEX(DWORD dwLevel, BSTR format, ...); +LOGEX_API void AddToLogEX(DWORD dwLevel, PBYTE pData, DWORD dwSize); + +#ifdef _DOLOG +//#define MCTRACE AddToLogEX +#define MCTRACE __noop +#else //_DOLOG +#define MCTRACE __noop +#endif //_DOLOG + +#endif //__LOG__EX__ diff --git a/Source/Client/IM-Client/ATL_NetLib/Message.cpp b/Source/Client/IM-Client/ATL_NetLib/Message.cpp new file mode 100644 index 0000000..9f6abfc --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Message.cpp @@ -0,0 +1,122 @@ +// Message.cpp : Implementation of CMessage +#pragma warning(disable: 4530) +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "Message.h" +#include "User.h" +#include "Session.h" +///////////////////////////////////////////////////////////////////////////// +// CMessage + + +STDMETHODIMP CMessage::get_Body(BSTR *pVal) +{ + ATLTRACE("Get Body"); + return m_sMessage.m_Body.CopyTo(pVal); +} + +STDMETHODIMP CMessage::put_Body(BSTR newVal) +{ + ATLTRACE("Put Body"); + m_sMessage.m_Body= newVal; + return (m_sMessage.m_Body || !newVal ? S_OK : E_OUTOFMEMORY); +} + +STDMETHODIMP CMessage::get_date_time(long *pVal) +{ + if(pVal == NULL) + return E_POINTER; + + *pVal = m_sMessage.m_Time; + return S_OK; +} + +STDMETHODIMP CMessage::get_Sender(IUser* *pVal) +{ + if(pVal == NULL) + return E_POINTER; + + HRESULT hr; + IUser* pUser = NULL; + CUser* m_pUser; + hr = CUser::CreateInstance(&pUser); + if(hr != NULL) + return hr; + + m_pUser = static_cast(pUser); + m_pUser->m_sUser = m_sMessage.m_Sender; + + *pVal = pUser; + return S_OK; +} + +STDMETHODIMP CMessage::get_Recipients(IUsers **pVal) +{ + return m_pRecipients.CopyTo(pVal); +} + + +STDMETHODIMP CMessage::get_MID(BSTR *pVal) +{ + return m_sMessage.m_MID.CopyTo(pVal); +} + +STDMETHODIMP CMessage::put_MID(BSTR newVal) +{ + ATLTRACE("Put MID"); + m_sMessage.m_MID.Empty(); + m_sMessage.m_MID = newVal; + return (m_sMessage.m_MID || !newVal ? S_OK : E_OUTOFMEMORY); + +} + +STDMETHODIMP CMessage::Send(long *Handle) +{ + ATLTRACE("Send Begin"); + if(Handle == NULL) + return E_POINTER; + if(m_pSession->GetState() != stConnected) + return E_PENDING; + try + { + ATLTRACE("Send Befor Add"); + m_pSession->m_IM_NET->m_CommandQueue.x_Message(this,*Handle); + ATLTRACE("Send Befor Send"); + m_pSession->m_IM_NET->SetNewCommand(); + + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +STDMETHODIMP CMessage::get_SID(BSTR *pVal) +{ + return m_sMessage.m_SID.CopyTo(pVal); + +} + + +STDMETHODIMP CMessage::get_ID(long *pVal) +{ + *pVal = m_sMessage.m_nMID; + + return S_OK; +} + +#pragma warning(default: 4530) \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/Message.h b/Source/Client/IM-Client/ATL_NetLib/Message.h new file mode 100644 index 0000000..f11ae13 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Message.h @@ -0,0 +1,53 @@ +// Message.h : Declaration of the CMessage + +#ifndef __MESSAGE_H_ +#define __MESSAGE_H_ + +#include "resource.h" // main symbols +#include "Users.h" // main symbols +class CSession; +///////////////////////////////////////////////////////////////////////////// +// CMessage +class ATL_NO_VTABLE CMessage : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: +DECLARE_REGISTRY_RESOURCEID(IDR_MESSAGE) +DECLARE_PROTECT_FINAL_CONSTRUCT() + + CMessage() + { + + }; + + HRESULT CMessage::FinalConstruct() + { + return CUsers::CreateInstance(&m_pRecipients); + } + +BEGIN_COM_MAP(CMessage) + COM_INTERFACE_ENTRY(IMessage) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IMessage +public: + STDMETHOD(get_ID)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_SID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(Send)(/*[out]*/ long *Handle); + STDMETHOD(get_MID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_MID)(/*[in]*/ BSTR newVal); + STDMETHOD(get_Recipients)(/*[out, retval]*/ IUsers* *pVal); + STDMETHOD(get_Sender)(/*[out, retval]*/ IUser* *pVal); + STDMETHOD(get_date_time)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_Body)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Body)(/*[in]*/ BSTR newVal); + CSession* m_pSession; + sMessage m_sMessage; + CComBSTR m_bsCID; + CComPtr m_pRecipients; +}; + +#endif //__MESSAGE_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/Message.rgs b/Source/Client/IM-Client/ATL_NetLib/Message.rgs new file mode 100644 index 0000000..02f8efa --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Message.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediachase.IMMessage.1 = s 'Message Class' + { + CLSID = s '{D51400C0-A338-4D2E-B4CB-159CF7579909}' + } + Mediachase.IMMessage = s 'Message Class' + { + CLSID = s '{D51400C0-A338-4D2E-B4CB-159CF7579909}' + CurVer = s 'Mediachase.IMMessage.1' + } + NoRemove CLSID + { + ForceRemove {D51400C0-A338-4D2E-B4CB-159CF7579909} = s 'Message Class' + { + ProgID = s 'Mediachase.IMMessage.1' + VersionIndependentProgID = s 'Mediachase.IMMessage' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Messages.cpp b/Source/Client/IM-Client/ATL_NetLib/Messages.cpp new file mode 100644 index 0000000..b7bd243 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Messages.cpp @@ -0,0 +1,9 @@ +// Messages.cpp : Implementation of CATL_NetLibApp and DLL registration. + +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "Messages.h" + +///////////////////////////////////////////////////////////////////////////// +// + diff --git a/Source/Client/IM-Client/ATL_NetLib/Messages.h b/Source/Client/IM-Client/ATL_NetLib/Messages.h new file mode 100644 index 0000000..9027fcb --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Messages.h @@ -0,0 +1,67 @@ +// Messages.h: Definition of the CMessages class +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_MESSAGES_H__99028114_5B92_47DF_9E3F_0929E7384010__INCLUDED_) +#define AFX_MESSAGES_H__99028114_5B92_47DF_9E3F_0929E7384010__INCLUDED_ + +#include "resource.h" // main symbols +#include "collections.h" +#include "message.h" +#pragma warning(disable: 4530) +typedef CComEnumOnSTL, + list< CAdapt< CComPtr > > > + CComEnumVariantOnListOfMessages; + +typedef ICollectionOnSTLImpl, + list< CAdapt< CComPtr > >, + IMessage*, + _CopyItfFromAdaptItf, + CComEnumVariantOnListOfMessages> + IMessagesCollImpl; +#pragma warning(default: 4530) + +///////////////////////////////////////////////////////////////////////////// +// CMessages + +class ATL_NO_VTABLE CMessages : + public CComObjectRootEx, + public CComCoClass, + public IMessagesCollImpl +{ + +public: + CMessages() {} + HRESULT CMessages::FinalRelease() + { + MCTRACE(4,"MessageS LIST DELETED"); + return S_OK; + }; + + STDMETHODIMP AddMessage(IMessage** ppMessage) + { + HRESULT hr = CMessage::CreateInstance(ppMessage); + if( SUCCEEDED(hr) ) + { + // Put the document on the list + CComPtr spMessage = *ppMessage; + m_coll.push_back(spMessage); + } + return hr; + } +BEGIN_COM_MAP(CMessages) + COM_INTERFACE_ENTRY(IMessages) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +DECLARE_NO_REGISTRY() +DECLARE_NOT_AGGREGATABLE(CMessages) +DECLARE_PROTECT_FINAL_CONSTRUCT() + + +// IMessages +public: +}; + +#endif // !defined(AFX_MESSAGES_H__99028114_5B92_47DF_9E3F_0929E7384010__INCLUDED_) diff --git a/Source/Client/IM-Client/ATL_NetLib/Messages.rgs b/Source/Client/IM-Client/ATL_NetLib/Messages.rgs new file mode 100644 index 0000000..44297f2 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Messages.rgs @@ -0,0 +1,23 @@ +HKCR +{ + Mediachase.IMMessages.1 = s 'Messages Class' + { + CLSID = s '{B515381E-E099-4ABE-95A9-3D1C9C352462}' + } + Mediachase.IMMessages = s 'Messages Class' + { + CLSID = s '{B515381E-E099-4ABE-95A9-3D1C9C352462}' + } + NoRemove CLSID + { + ForceRemove {B515381E-E099-4ABE-95A9-3D1C9C352462} = s 'Messages Class' + { + ProgID = s 'Mediachase.IMMessages.1' + VersionIndependentProgID = s 'Mediachase.IMMessages' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Promo.cpp b/Source/Client/IM-Client/ATL_NetLib/Promo.cpp new file mode 100644 index 0000000..949eaa0 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Promo.cpp @@ -0,0 +1,140 @@ +// Promo.cpp : Implementation of CPromo +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "Promo.h" +#include "Session.h" + +///////////////////////////////////////////////////////////////////////////// +// CPromo + +STDMETHODIMP CPromo::get_PID(BSTR *pVal) +{ + return m_sPromo.m_PID.CopyTo(pVal); +} + +STDMETHODIMP CPromo::put_PID(BSTR newVal) +{ + if(newVal == NULL) return E_INVALIDARG; + m_sPromo.m_PID.Empty(); + m_sPromo.m_PID = newVal; + + return S_OK; +} + +STDMETHODIMP CPromo::get_date_time(long *pVal) +{ + if(pVal == NULL) return E_POINTER; + *pVal = m_sPromo.m_Time; + return S_OK; +} + +STDMETHODIMP CPromo::get_SID(BSTR *pVal) +{ + return m_sPromo.m_SID.CopyTo(pVal); +} + +STDMETHODIMP CPromo::get_Subject(BSTR *pVal) +{ + return m_sPromo.m_Subject.CopyTo(pVal); +} + +STDMETHODIMP CPromo::put_Subject(BSTR newVal) +{ + m_sPromo.m_Subject.Empty(); + m_sPromo.m_Subject = newVal; + return S_OK; +} + +STDMETHODIMP CPromo::get_Product_ID(long *pVal) +{ + if(pVal == NULL) return E_POINTER; + *pVal = m_sPromo.m_Product_ID; + return S_OK; +} + +STDMETHODIMP CPromo::put_Product_ID(long newVal) +{ + m_sPromo.m_Product_ID = newVal; + return S_OK; +} + +STDMETHODIMP CPromo::get_Body(BSTR *pVal) +{ + return m_sPromo.m_Body.CopyTo(pVal); + return S_OK; +} + +STDMETHODIMP CPromo::put_Body(BSTR newVal) +{ + m_sPromo.m_Body.Empty(); + m_sPromo.m_Body= newVal; + return S_OK; +} + +STDMETHODIMP CPromo::get_Recipients(IUsers **pVal) +{ + return m_pRecipients.CopyTo(pVal); +} + + +STDMETHODIMP CPromo::get_Sender(IUser **pVal) +{ + if(pVal == NULL) + return E_POINTER; + + HRESULT hr; + IUser* pUser = NULL; + CUser* m_pUser; + hr = CUser::CreateInstance(&pUser); + if(hr != NULL) + return hr; + + m_pUser = static_cast(pUser); + m_pUser->m_sUser = m_sPromo.m_sSender; + + *pVal = pUser; + return S_OK; +} + +STDMETHODIMP CPromo::get_ProductName(BSTR *pVal) +{ + return m_sPromo.m_ProductName.CopyTo(pVal); +} + +STDMETHODIMP CPromo::put_ProductName(BSTR newVal) +{ + m_sPromo.m_ProductName.Empty(); + m_sPromo.m_ProductName = newVal; + return S_OK; +} + +STDMETHODIMP CPromo::Send(long *Handle) +{ + if(Handle == NULL) + return E_POINTER; + if(m_pSession->GetState() != stConnected) + return E_PENDING; + try + { + m_pSession->m_IM_NET->m_CommandQueue.x_Promo(this,*Handle); + m_pSession->m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Promo.h b/Source/Client/IM-Client/ATL_NetLib/Promo.h new file mode 100644 index 0000000..eb59830 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Promo.h @@ -0,0 +1,59 @@ +// Promo.h : Declaration of the CPromo + +#ifndef __PROMO_H_ +#define __PROMO_H_ + +#include "resource.h" // main symbols +#include "Users.h" + +class CSession; +///////////////////////////////////////////////////////////////////////////// +// CPromo +class ATL_NO_VTABLE CPromo : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + CPromo() + { + } + + HRESULT CPromo::FinalConstruct() + { + return CUsers::CreateInstance(&m_pRecipients); + } + +DECLARE_REGISTRY_RESOURCEID(IDR_PROMO) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CPromo) + COM_INTERFACE_ENTRY(IPromo) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IPromo +public: + STDMETHOD(Send)(/*[out, retval]*/ long* Handle); + STDMETHOD(get_ProductName)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_ProductName)(/*[in]*/ BSTR newVal); + STDMETHOD(get_Sender)(/*[out, retval]*/ IUser* *pVal); + STDMETHOD(get_Recipients)(/*[out, retval]*/ IUsers* *pVal); + STDMETHOD(get_Body)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Body)(/*[in]*/ BSTR newVal); + STDMETHOD(get_Product_ID)(/*[out, retval]*/ long *pVal); + STDMETHOD(put_Product_ID)(/*[in]*/ long newVal); + STDMETHOD(get_Subject)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Subject)(/*[in]*/ BSTR newVal); + STDMETHOD(get_SID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_date_time)(/*[out, retval]*/ long *pVal); + STDMETHOD(get_PID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_PID)(/*[in]*/ BSTR newVal); + + sPromo m_sPromo; + CComPtr m_pRecipients; + CSession* m_pSession; +}; + +#endif //__PROMO_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/Promo.rgs b/Source/Client/IM-Client/ATL_NetLib/Promo.rgs new file mode 100644 index 0000000..55a7506 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Promo.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediachase.IMPromo.1 = s 'Promo Class' + { + CLSID = s '{9F2EE1D8-F590-4A4E-92BF-274E96DEE15C}' + } + Mediachase.IMPromo = s 'Promo Class' + { + CLSID = s '{9F2EE1D8-F590-4A4E-92BF-274E96DEE15C}' + CurVer = s 'Mediachase.IMPromo.1' + } + NoRemove CLSID + { + ForceRemove {9F2EE1D8-F590-4A4E-92BF-274E96DEE15C} = s 'Promo Class' + { + ProgID = s 'Mediachase.IMPromo.1' + VersionIndependentProgID = s 'Mediachase.IMPromo' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Promos.cpp b/Source/Client/IM-Client/ATL_NetLib/Promos.cpp new file mode 100644 index 0000000..cd3f4c1 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Promos.cpp @@ -0,0 +1,8 @@ +// Promos.cpp : Implementation of CPromos +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "Promos.h" + +///////////////////////////////////////////////////////////////////////////// +// CPromos + diff --git a/Source/Client/IM-Client/ATL_NetLib/Promos.h b/Source/Client/IM-Client/ATL_NetLib/Promos.h new file mode 100644 index 0000000..f9348ec --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Promos.h @@ -0,0 +1,64 @@ +// Promos.h : Declaration of the CPromos + +#ifndef __PROMOS_H_ +#define __PROMOS_H_ + +#include "resource.h" // main symbols +#include "collections.h" +#include "promo.h" +#pragma warning(disable: 4530) +typedef CComEnumOnSTL, + list< CAdapt< CComPtr > > > + CComEnumVariantOnListOfPromos; + +typedef ICollectionOnSTLImpl, + list< CAdapt< CComPtr > >, + IPromo*, + _CopyItfFromAdaptItf, + CComEnumVariantOnListOfPromos> + IPromosCollImpl; +#pragma warning(default: 4530) +///////////////////////////////////////////////////////////////////////////// +// CPromos +class ATL_NO_VTABLE CPromos : + public CComObjectRootEx, + public CComCoClass, + public IPromosCollImpl +{ +public: + CPromos() + { + } + + HRESULT CPromos::FinalRelease() + { + MCTRACE(4,"PROMOS LIST DELETED"); + return S_OK; + }; + + STDMETHODIMP AddPromo(IPromo** ppPromo) + { + HRESULT hr = CPromo::CreateInstance(ppPromo); + if( SUCCEEDED(hr) ) + { + // Put the document on the list + CComPtr spPromo = *ppPromo; + m_coll.push_back(spPromo); + } + return hr; + } +DECLARE_NO_REGISTRY() +DECLARE_NOT_AGGREGATABLE(CPromos) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CPromos) + COM_INTERFACE_ENTRY(IPromos) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IPromos +public: +}; + +#endif //__PROMOS_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/Promos.rgs b/Source/Client/IM-Client/ATL_NetLib/Promos.rgs new file mode 100644 index 0000000..c431c00 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Promos.rgs @@ -0,0 +1,26 @@ +HKCR +{ + ATL_NetLib.Promos.1 = s 'Promos Class' + { + CLSID = s '{2BA2E731-4462-43D2-A5AB-6AB47B0704F7}' + } + ATL_NetLib.Promos = s 'Promos Class' + { + CLSID = s '{2BA2E731-4462-43D2-A5AB-6AB47B0704F7}' + CurVer = s 'ATL_NetLib.Promos.1' + } + NoRemove CLSID + { + ForceRemove {2BA2E731-4462-43D2-A5AB-6AB47B0704F7} = s 'Promos Class' + { + ProgID = s 'ATL_NetLib.Promos.1' + VersionIndependentProgID = s 'ATL_NetLib.Promos' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/SID.cpp b/Source/Client/IM-Client/ATL_NetLib/SID.cpp new file mode 100644 index 0000000..6886c58 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/SID.cpp @@ -0,0 +1,21 @@ +// SID.cpp : Implementation of CSID +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "SID.h" + +///////////////////////////////////////////////////////////////////////////// +// CSID + + +STDMETHODIMP ClocalSID::get_Count(long *pVal) +{ + if(pVal == NULL) + return E_POINTER; + *pVal = m_slocalSID.m_Count; + return S_OK; +} + +STDMETHODIMP ClocalSID::get_SID(BSTR *pVal) +{ + return m_slocalSID.m_SID.CopyTo(pVal); +} diff --git a/Source/Client/IM-Client/ATL_NetLib/SID.h b/Source/Client/IM-Client/ATL_NetLib/SID.h new file mode 100644 index 0000000..4f053a7 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/SID.h @@ -0,0 +1,37 @@ +// SID.h : Declaration of the CSID + +#ifndef __SID_H_ +#define __SID_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// CSID +class ATL_NO_VTABLE ClocalSID : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + ClocalSID() + { + } + +DECLARE_REGISTRY_RESOURCEID(IDR_SID) +DECLARE_NOT_AGGREGATABLE(ClocalSID) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(ClocalSID) + COM_INTERFACE_ENTRY(IlocalSID) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// ISID +public: + STDMETHOD(get_SID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal); + slocalSID m_slocalSID; +}; + +#endif //__SID_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/SID.rgs b/Source/Client/IM-Client/ATL_NetLib/SID.rgs new file mode 100644 index 0000000..f36ff46 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/SID.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediachase.IMlocalSID.1 = s 'localSID Class' + { + CLSID = s '{98E50CDC-5A97-48D7-98E7-3CBF7FF6A2A0}' + } + Mediachase.IMlocalSID = s 'localSID Class' + { + CLSID = s '{98E50CDC-5A97-48D7-98E7-3CBF7FF6A2A0}' + CurVer = s 'Mediachase.IMlocalSID.1' + } + NoRemove CLSID + { + ForceRemove {98E50CDC-5A97-48D7-98E7-3CBF7FF6A2A0} = s 'localSID Class' + { + ProgID = s 'Mediachase.IMlocalSID.1' + VersionIndependentProgID = s 'Mediachase.IMlocalSID' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/SIDs.cpp b/Source/Client/IM-Client/ATL_NetLib/SIDs.cpp new file mode 100644 index 0000000..326247e --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/SIDs.cpp @@ -0,0 +1,9 @@ +// SIDs.cpp : Implementation of CATL_NetLibApp and DLL registration. + +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "SIDs.h" + +///////////////////////////////////////////////////////////////////////////// +// + diff --git a/Source/Client/IM-Client/ATL_NetLib/SIDs.h b/Source/Client/IM-Client/ATL_NetLib/SIDs.h new file mode 100644 index 0000000..d5c430b --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/SIDs.h @@ -0,0 +1,66 @@ +// SIDs.h: Definition of the CSIDs class +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_SIDS_H__AB6571B7_5006_4283_9435_B4471028A8AF__INCLUDED_) +#define AFX_SIDS_H__AB6571B7_5006_4283_9435_B4471028A8AF__INCLUDED_ + +#include "resource.h" // main symbols +#include "collections.h" +#include "SID.h" +#pragma warning(disable: 4530) +typedef CComEnumOnSTL, + list< CAdapt< CComPtr > > > + CComEnumVariantOnListOflocalSIDs; + +typedef ICollectionOnSTLImpl, + list< CAdapt< CComPtr > >, + IlocalSID*, + _CopyItfFromAdaptItf, + CComEnumVariantOnListOflocalSIDs> + IlocalSIDsCollImpl; +#pragma warning(default: 4530) + +///////////////////////////////////////////////////////////////////////////// +// CSIDs + +class ATL_NO_VTABLE ClocalSIDs : + public CComObjectRootEx, + public CComCoClass, + public IlocalSIDsCollImpl + +{ +public: + ClocalSIDs() {} + HRESULT ClocalSIDs::FinalRelease() + { + //MCTRACE(4,"localSIDS LIST DELETED"); + return S_OK; + }; + + STDMETHODIMP AddSID(IlocalSID** pplocalSID) + { + HRESULT hr = ClocalSID::CreateInstance(pplocalSID); + if( SUCCEEDED(hr) ) + { + // Put the document on the list + CComPtr splocalSID = *pplocalSID; + m_coll.push_back(splocalSID); + } + return hr; + } + +BEGIN_COM_MAP(ClocalSIDs) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IlocalSIDs) +END_COM_MAP() + +DECLARE_NO_REGISTRY() +DECLARE_NOT_AGGREGATABLE(ClocalSIDs) +DECLARE_PROTECT_FINAL_CONSTRUCT() +// ISIDs +public: +}; + +#endif // !defined(AFX_SIDS_H__AB6571B7_5006_4283_9435_B4471028A8AF__INCLUDED_) diff --git a/Source/Client/IM-Client/ATL_NetLib/SIDs.rgs b/Source/Client/IM-Client/ATL_NetLib/SIDs.rgs new file mode 100644 index 0000000..fa857f2 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/SIDs.rgs @@ -0,0 +1,23 @@ +HKCR +{ + Mediachase.IMlocalSIDs.1 = s 'SIDs Class' + { + CLSID = s '{0E5C97B4-2B69-4355-88A6-2983F43276B3}' + } + Mediachase.IMlocalSIDs = s 'SIDs Class' + { + CLSID = s '{0E5C97B4-2B69-4355-88A6-2983F43276B3}' + } + NoRemove CLSID + { + ForceRemove {0E5C97B4-2B69-4355-88A6-2983F43276B3} = s 'localSIDs Class' + { + ProgID = s 'Mediachase.IMlocalSIDs.1' + VersionIndependentProgID = s 'Mediachase.IMlocalSIDs' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'both' + } + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Session.cpp b/Source/Client/IM-Client/ATL_NetLib/Session.cpp new file mode 100644 index 0000000..a0b2261 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Session.cpp @@ -0,0 +1,784 @@ +// Session.cpp : Implementation of CSession +#include "stdafx.h" +#include "Session.h" +#include "Message.h" +#include "ATLCONV.H" +#include "ATL_NetLib.h" + + +///////////////////////////////////////////////////////////////////////////// +// CSession + +STDMETHODIMP CSession::get_SID(BSTR *pVal) +{ + return m_SID.CopyTo(pVal); +} + +STDMETHODIMP CSession::get_SelfInfo(IUser **pVal) +{ + if(pVal == NULL) + return E_POINTER; + + return this->QueryInterface(IID_IUser,(void**)pVal); + +} + +STDMETHODIMP CSession::get_Config(IConfig **pVal) +{ + void* pConfig; + HRESULT hr; + hr = this->QueryInterface(IID_IConfig, &pConfig); + if (hr == 0) + { + *pVal = (IConfig*) pConfig; + + return S_OK; + } + else + return hr; +} + +////////////////////////////////////////////////////////////////////////////////// +// Commands + +//Add User to List +STDMETHODIMP CSession::AddUser(long User_ID, BSTR Body, long ListType, long* Handle) +{ + //Check Input Parametrs + if(Handle == NULL) + return E_POINTER; + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_AddUser(User_ID,ListType,Body); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Add user reply +STDMETHODIMP CSession::AddUserReply(long User_ID, long Result, long *Handle) +{ + //Check Input parametrs + if(Handle == NULL) + return E_POINTER; + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + try + { + *Handle = m_IM_NET->m_CommandQueue.x_AddUserR(User_ID,Result); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Chenge self status +STDMETHODIMP CSession::ChangeStatus(long Status) +{ + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + if(Status == 0) + return E_INVALIDARG; + + //Add Command + try + { + m_IM_NET->m_CommandQueue.x_ChangeStatus(Status); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Confirm File +STDMETHODIMP CSession::ConfirmFile(BSTR FID, long Result, long *Handle) +{ + if(Handle == NULL) + return E_POINTER; + + if(Result<1 || Result>3) + return E_INVALIDARG; + + if(GetState() != stConnected) + return E_PENDING; + + //Add Command + try + { + *Handle = m_IM_NET->m_CommandQueue.x_ConfirmFile(FID,Result); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Create File +STDMETHODIMP CSession::CreateFile(IFile **ppFile) +{ + HRESULT hr = CFile::CreateInstance(ppFile); + if(hr != 0) + return hr; + CFile* mpFile; + + mpFile = static_cast(*ppFile); + mpFile->m_pSession = this; + return hr; +} + +//Create Message +STDMETHODIMP CSession::CreateMessage(IMessage **ppMessage) +{ + HRESULT hr = CMessage::CreateInstance(ppMessage); + if(hr != 0) + return hr; + CMessage* mpMessage; + + mpMessage = static_cast(*ppMessage); + mpMessage->m_pSession = this; + return hr; +} + +//Create Promo +STDMETHODIMP CSession::CreatePromo(IPromo **ppPromo) +{ + ATLTRACE("Before Create"); + HRESULT hr = CPromo::CreateInstance(ppPromo); + if(hr != 0) + return hr; + CPromo* mpPromo; + ATLTRACE("After Create"); + mpPromo = static_cast(*ppPromo); + ATLTRACE("After Set Session"); + mpPromo->m_pSession = this; + return hr; +} + +//Delete User +STDMETHODIMP CSession::DeleteUser(long User_ID, long ListType, long *Handle) +{ + //Check Input Parametrs + if(Handle == NULL) + return E_POINTER; + + //Check Input Parametrs + if(ListType <1 || ListType >2) + return E_INVALIDARG; + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_DeleteUser(User_ID,ListType); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Load Last Promos +STDMETHODIMP CSession::GetLastPromos(long Count, long *Handle) +{ + //Check Input Parametrs + if(Handle == NULL) + return E_POINTER; + + //Check Input Parametrs + if(Count <1 || Count >50) + return E_INVALIDARG; + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_LastPromos(Count); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Load Ignore +STDMETHODIMP CSession::LoadIgnore(long *Handle) +{ + //Check Input Parametrs + if(Handle == NULL) + return E_POINTER; + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_LoadList(ltIgnore); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Load Messages +STDMETHODIMP CSession::LoadMessages(BSTR SID, long *Handle) +{ + if(Handle == NULL) + return E_POINTER; + + if(SID == NULL) + return E_INVALIDARG; + + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_LoadMessages(SID); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Load Off line Files +STDMETHODIMP CSession::LoadOffLineFiles(long *Handle) +{ + //Check Input Parametrs + if(Handle == NULL) + return E_POINTER; + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_LoadList(ltFiles); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//Load SIDs +STDMETHODIMP CSession::LoadSIDs(long From, long To, long *Handle) +{ + if(Handle == NULL) + return E_POINTER; + if(To<=From) + return E_INVALIDARG; + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_LoadSIDs(From,To); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +//LogOff +STDMETHODIMP CSession::LogOff() +{ + + if(GetState() == stDisconnected) return E_POINTER; + + try + { + m_IM_NET->m_CommandQueue.x_LogOff(); + m_IM_NET->SetNewCommand(); + } + catch(long Err) + { + Err; + MCTRACE(4,"Queue Error = %d\r\n", Err); + } + return S_OK; +} + +STDMETHODIMP CSession::LogOn(BSTR UserName, BSTR Password, long Status, long* Handle) +{ +MCTRACE(1,"session logon begin"); + if(bConfigChanged) + { + m_IM_NET->Config(); + bConfigChanged = FALSE; + } + + + if(GetState() != stDisconnected) return E_PENDING; + //m_IM_NET->m_CommandQueue.OutPutQueueInit(); + + CComBSTR m_TempUser(UserName); + + //m_sUser.??????????????????????????????????????????????? + (m_UserName == m_TempUser) ? m_UserChanged = FALSE : m_UserChanged = TRUE; + m_UserName.Empty(); + m_UserName = m_TempUser; + m_Password.Empty(); + m_Password = CComBSTR(Password); + m_Status = Status; + + if(m_UserChanged) + { + //generating new SID + CComBSTR sid; + GUID SID; + CoCreateGuid(&SID); + sid = CComBSTR(SID); + m_SID = CComBSTR(36); + wcsncpy(m_SID.m_str, sid.m_str+1,36); + //wcscpy(m_SID.m_str, sid.m_str+1); + + } + + if (GetState() == stDisconnected) + { + try + { + *Handle = m_IM_NET->m_CommandQueue.x_LogOn(m_SID,m_UserName,m_Password,m_Status); + m_IM_NET->SetNewCommand(); + } + catch(long Err) + { + Err; + MCTRACE(4,"Queue Error = %d\r\n", Err); + } + } + return S_OK; +} + + +STDMETHODIMP CSession::UserDetails(long User_ID, long InfoType, long *Handle) +{ + if(Handle == NULL) + return E_POINTER; + if(InfoType<1 || InfoType>2) + return E_INVALIDARG; + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_UserDetails(User_ID,InfoType); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + + +STDMETHODIMP CSession::CancelOperation(long Handle) +{ + m_IM_NET->CancelCommand(Handle); + return S_OK; +} + +stState CSession::GetState() +{ + return m_ClientState; +} + + +STDMETHODIMP CSession::DeleteUserR(long User_ID, long *Handle) +{ + //Check Input Parametrs + if(Handle == NULL) + return E_POINTER; + + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_DeleteUserR(User_ID); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} + +STDMETHODIMP CSession::get_Value(BSTR bsName, VARIANT *pVal) +{ + if(CComBSTR(bsName) == CComBSTR(_T("nick_name"))) + { + return CComVariant(m_sUser.m_UserName).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("first_name"))) + { + return CComVariant(m_sUser.m_FirstName).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("last_name"))) + { + return CComVariant(m_sUser.m_LastName).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/name"))) + { + return CComVariant(m_sUser.m_Role).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("email"))) + { + return CComVariant(m_sUser.m_EMail).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("status"))) + { + return CComVariant(m_sUser.m_Status).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("@id"))) + { + return CComVariant(m_sUser.m_ID).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/@id"))) + { + return CComVariant(m_sUser.m_Role_ID).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("time"))) + { + return CComVariant(m_sUser.m_time).Detach(pVal); + } + else + return E_INVALIDARG; + + return S_OK; +} + +STDMETHODIMP CSession::put_Value(BSTR bsName, VARIANT newVal) +{ + if(CComBSTR(bsName) == CComBSTR(_T("nick_name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_UserName = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("first_name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_FirstName = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("last_name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_LastName = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_Role = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("email"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_EMail = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("status"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_Status = newVal.lVal; + } + else + if(CComBSTR(bsName) == CComBSTR(_T("@id"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_ID = newVal.lVal; + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/@id"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_Role_ID = newVal.lVal; + } + else + if(CComBSTR(bsName) == CComBSTR(_T("time"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_time = newVal.lVal; + } + else + return E_INVALIDARG; + + return S_OK; +} + +STDMETHODIMP CSession::get_UseSSL(VARIANT_BOOL *pVal) +{ + if(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_bUseSSL) + *pVal = VARIANT_TRUE; + else + *pVal = VARIANT_FALSE; + + return S_OK; +} + +STDMETHODIMP CSession::put_UseSSL(VARIANT_BOOL newVal) +{ + + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_bUseSSL = (newVal == VARIANT_TRUE); + return S_OK; +} + +STDMETHODIMP CSession::CreateChat(BSTR CID, BSTR bsName, BSTR Descr, long* Handle) +{ + //Check Input Parametrs + if(CID == NULL) + return E_POINTER; + + if(bsName == NULL) + return E_POINTER; + + if(SysStringLen(CID) != 36) + return E_INVALIDARG; + + //Check Current State + if(GetState() != stConnected) + return E_PENDING; + + // Add Command to Queue + try + { + *Handle = m_IM_NET->m_CommandQueue.x_ChatCreate(CID,bsName,Descr); + m_IM_NET->SetNewCommand(); + } + catch(long ErrorCode) + { + switch(ErrorCode) + { + case WRONG_PARAM: + return E_INVALIDARG; + break; + + default: + return E_INVALIDQUEUE; + break; + } + } + catch(...) + { + return E_INVALIDQUEUE; + } + return S_OK; +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Session.h b/Source/Client/IM-Client/ATL_NetLib/Session.h new file mode 100644 index 0000000..5225011 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Session.h @@ -0,0 +1,610 @@ +// Session.h : Declaration of the CSession + +#ifndef __SESSION_H_ +#define __SESSION_H_ + +#include "defConst.h" // Added by ClassView +#define WM_IMSENDER_WRNING WM_USER+111 +#define WM_IMSENDER_STAT WM_USER+112 +#define WM_IMSENDER_STATE WM_USER+113 + +#include +#include "resource.h" // main symbols +#include "IM_Net.h" +#include "ATL_NetLibCP.h" + + +extern long g_ByteSent; +extern long g_ByteReceived; +extern long g_LatestSent; +extern long g_LatestReceived; + +extern long g_FileSent; +extern long g_FileReceived; + +extern long g_MessageSend; +extern long g_MessageReceveived; + +extern long g_ByteSentPerSec[200]; +extern long g_ByteReceivedPerSec[200]; + +extern long g_forByteSentPerSec[200]; +extern long g_forByteReceivedPerSec[200]; + +extern CComAutoCriticalSection SendLock; +extern CComAutoCriticalSection ReceivedLock; +///////////////////////////////////////////////////////////////////////////// +// CSession +class ATL_NO_VTABLE CSession : + public CWindowImpl, + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public IDispatchImpl, + public CProxy_ISessionEvents< CSession >, + public IDispatchImpl, + public IDispatchImpl, + public IDispatchImpl +{ +public: + CSession() + { + MCTRACE(3,"SESSION CREATED"); + bConfigChanged = TRUE; + m_ClientState = stDisconnected; + InitializeCriticalSection(&CS_SelfInfo); + + } +public: + DECLARE_WND_CLASS("CSession") + + BEGIN_MSG_MAP(CSession) + MESSAGE_HANDLER(IM_CHANGE_STATE, OnChangeState) + MESSAGE_HANDLER(IM_ANSWER_OK, OnAnswerOK) + MESSAGE_HANDLER(IM_ANSWER_BUFF, OnAnswerBuffer) + MESSAGE_HANDLER(IM_ANSWER_ERROR, OnAnswerError) + MESSAGE_HANDLER(IM_NEW_EVENT, OnNewEvent) + END_MSG_MAP() + +public: + stState GetState(); + + LRESULT OnNewEvent(UINT uMsg, WPARAM wParam, + LPARAM lParam, BOOL& bHandled) + { + m_IM_NET->m_CommandQueue.UnPackEvents((LPVOID)this); + m_IM_NET->SetNewCommand();//отправка внутренних команд + return 0; + } + + LRESULT OnChangeState(UINT uMsg, WPARAM wParam, + LPARAM lParam, BOOL& bHandled) + { + if(wParam == stDisconnected) + { + try{m_IM_NET->m_CommandQueue.DeleteAllCommands((void*)this);}catch(...){}; + m_IM_NET->m_CommandQueue.OutPutQueueInit(); + } + + + // if(wParam == stDisconnected) + // Beep(1000,100); + //ATLASSERT(wParam != stConnecting); + + m_ClientState = (stState)wParam; + MCTRACE(0,"Fire net status %d",wParam); + Fire_ChangedState(wParam,LOWORD(lParam),HIWORD(lParam)); + return 0; + } + LRESULT OnAnswerOK(UINT uMsg, WPARAM wParam, + LPARAM lParam, BOOL& bHandled) + { + switch(lParam) + { + case cmChangeStatus: + MCTRACE(0,"Fire_SelfStatus"); + Fire_SelfStatus(this->m_IM_NET->m_CurrentSendingStatus); + break; + case cmAddUser: + MCTRACE(0,"Fire_CommandOK"); + Fire_CommandOK(wParam,0); + break; + case cmChatStatus: + MCTRACE(0,"Fire_CommandOK_CHAT_STATUS"); + Fire_ChatStatus(wParam,NULL,NULL); + break; + default: + MCTRACE(0,"Fire_CommandOK"); + Fire_CommandOK(wParam, 0); + break; + } + return 0; + } + LRESULT OnAnswerBuffer(UINT uMsg, WPARAM wParam, + LPARAM lParam, BOOL& bHandled) + { + IUnknown* pIUn = NULL; + long lTime; + long lListType; + CComBSTR AsString; + CComPtr pUser; + CComPtr pUsers; + CComPtr pChat; + switch(lParam) + { + case cmLogOn: + EnterCriticalSection(&CS_SelfInfo); + m_IM_NET->m_CommandQueue.UnPackSelfInfo(m_sUser,wParam); + LeaveCriticalSection(&CS_SelfInfo); + break; + + case cmLoadList: + AsString.Empty(); + m_IM_NET->m_CommandQueue.UnPackList(&pIUn,(LPVOID)this,wParam,lListType,&AsString); + switch(lListType) + { + case ltContact: + MCTRACE(0,"Fire_ContactList"); + Fire_ContactList((IUsers*)pIUn); + break; + case ltIgnore: + MCTRACE(0,"Fire_IgnoreList"); + Fire_IgnoreList(wParam,(IUsers*)pIUn); + break; + case ltFiles: + MCTRACE(0,"Fire_OffLineFiles"); + Fire_OffLineFiles(wParam,(IFiles*)pIUn); + break; + case ltMessages: + MCTRACE(0,"Fire_MessagesList"); + Fire_MessagesList(wParam,(IMessages*)pIUn); + break; + case ltPromos: + MCTRACE(0,"Fire_PromosList"); + Fire_PromosList(wParam,(IPromos*)pIUn,AsString); + break; + case ltSIDs: + MCTRACE(0,"Fire_SessionsList"); + Fire_SessionsList(wParam,(IlocalSIDs*)pIUn); + break; + case ltChats: + MCTRACE(0,"Fire_ChatsList"); + Fire_ChatList((IChats*)pIUn); + break; + default: + MCTRACE(0,"Fire_CommandError"); + Fire_CommandError(wParam,1,1); + break; + + } + if(pIUn) pIUn->Release(); + break; + case cmDetails: + m_IM_NET->m_CommandQueue.UnPackUserDetails(wParam,&pUser); + MCTRACE(0,"Fire_Details"); + Fire_Details(wParam,pUser,1); + pUser.Release(); + break; + case cmMessage: + case cmPromo: + case cmSendFile: + m_IM_NET->m_CommandQueue.UnPackTime(wParam,lTime); + MCTRACE(0,"Fire_CommandOK"); + Fire_CommandOK(wParam,lTime); + break; + case cmAddUser: + MCTRACE(0,"Fire_CommandOK"); + Fire_CommandOK(wParam,0); + break; + case cmChatCreate: + case cmChatEdit: + case cmChatAccept: + m_IM_NET->m_CommandQueue.UnPackChat(wParam,&pChat); + MCTRACE(0,"Fire_CreateChat"); + Fire_ChatCreate(wParam,pChat); + pChat.Release(); + break; + case cmChatStatus: + m_IM_NET->m_CommandQueue.UnPackSetChatStatus(wParam,&pUsers,&AsString); + MCTRACE(0,"Fire_CreateSetChatStatus"); + Fire_ChatStatus(wParam,pUsers,AsString); + pUsers.Release(); + break; + default: + ATLASSERT(FALSE); + break; + } + m_IM_NET->m_CommandQueue.DeleteAnswer(wParam); + return 0; + } + + LRESULT OnAnswerError(UINT uMsg, WPARAM wParam, + LPARAM lParam, BOOL& bHandled) + { + m_IM_NET->m_CommandQueue.DeleteCommand(wParam); + Fire_CommandError(wParam,LOWORD(lParam),HIWORD(lParam)); + return 0; + } + + HRESULT CSession::FinalConstruct() + { + HRESULT hr; + + memset(g_ByteSentPerSec,0,200*4); + memset(g_ByteReceivedPerSec,0,200*4); + + memset(g_forByteSentPerSec,0,200*4); + memset(g_forByteReceivedPerSec,0,200*4); + + //SendLock.Init(); + //ReceivedLock.Init(); + + HWND hwnd; + RECT rect; + rect.left=0; + rect.right=100; + rect.top=0; + rect.bottom=100; + hwnd = Create( NULL, rect, "SessionWindow", WS_POPUP); + + if (!hwnd) + { + hr = HRESULT_FROM_WIN32(GetLastError()); + return hr; + } + m_IM_NET = new CIM_Net; + if(m_IM_NET == NULL) return E_FAIL; + hr = m_IM_NET->m_CommandQueue.Init(); + if(FAILED(hr)) return hr; + m_IM_NET->m_CommandQueue.lpSession = this; + m_IM_NET->m_ParentSession = this; + return S_OK; + } + HRESULT CSession::FinalRelease() + { + //SendLock.Term(); + //ReceivedLock.Term(); + + if(m_ClientState != stDisconnected) + { + + } + MCTRACE(3,"SESSION RELEASED befor delete im_net"); + delete m_IM_NET; + MCTRACE(3,"SESSION RELEASED after delete im_net"); + if (m_hWnd != NULL) + { + DestroyWindow(); + } + DeleteCriticalSection(&CS_SelfInfo); + + MCTRACE(3,"SESSION RELEASED"); + + + return S_OK; + + } +DECLARE_REGISTRY_RESOURCEID(IDR_SESSION) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CSession) + COM_INTERFACE_ENTRY(ISession) + COM_INTERFACE_ENTRY(IConnectionPointContainer) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) + COM_INTERFACE_ENTRY2(IDispatch, ISession) + COM_INTERFACE_ENTRY(IConfig) + COM_INTERFACE_ENTRY(IUser) + COM_INTERFACE_ENTRY(IMonitor) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(CSession) +CONNECTION_POINT_ENTRY(DIID__ISessionEvents) +//CONNECTION_POINT_ENTRY(IID__ISessionEvents) +END_CONNECTION_POINT_MAP() + +// ISession +public: + STDMETHOD(CreateChat)(/*[IN]*/ BSTR CID, /*[IN]*/ BSTR bsName, /*[IN]*/ BSTR Descr, /*[OUT]*/ long* Handle); + STDMETHOD(get_UseSSL)(/*[out, retval]*/ VARIANT_BOOL *pVal); + STDMETHOD(put_UseSSL)(/*[in]*/ VARIANT_BOOL newVal); + STDMETHOD(get_Value)(/*[in]*/ BSTR bsName, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(put_Value)(/*[in]*/ BSTR bsName, /*[in]*/ VARIANT newVal); + STDMETHOD(DeleteUserR)(/*[in]*/ long User_ID, /*[out]*/ long * Handle); + STDMETHOD(CancelOperation)(/*[in]*/ long Handle); + STDMETHOD(GetLastPromos)(/*[in]*/ long Count, /*[out,retval]*/ long* Handle); + + STDMETHOD(get_SelfInfo)(/*[out, retval]*/ IUser* *pVal); + STDMETHOD(get_SID)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(get_Config)(/*[out, retval]*/ IConfig* *pVal); + + STDMETHOD(LogOn)(BSTR UserName, BSTR Password, long Status, long *Handle); + STDMETHOD(LogOff)(); + STDMETHOD(ChangeStatus)(long Status); + + STDMETHOD(CreatePromo)(/*[out, retval]*/ IPromo** ppPromo); + STDMETHOD(CreateFile)(/*[out, retval]*/ IFile **ppFile); + STDMETHOD(CreateMessage)(/*[out, retval]*/ IMessage **ppMessage); + + STDMETHOD(AddUser)(/*[in]*/long User_ID, /*[in]*/ BSTR Body,/*[in]*/ long LisType, /*[out, retval]*/long* Handle); + STDMETHOD(AddUserReply)(/*[in]*/ long User_ID, /*[in]*/ long Result, /*[out,retval]*/ long* Handle); + STDMETHOD(DeleteUser)(/*[in]*/ long User_ID, /*[in]*/ long ListType, /*[out, retval]*/ long* Handle); + + STDMETHOD(LoadIgnore)(/*[out, retval]*/ long* Handle); + STDMETHOD(LoadOffLineFiles)(/*[out, retval]*/ long* Handle); + STDMETHOD(ConfirmFile)(/*[in]*/ BSTR FID, /*[in]*/ long Result, /*[out,retval]*/ long* Handle); + STDMETHOD(UserDetails)(/*[in]*/ long User_ID, /*[in]*/ long InfoType, /*[out,retval]*/ long* Handle); + + STDMETHOD(LoadSIDs)(/*[in]*/ long From, /*[in]*/ long To, /*[out, retVal]*/ long* Handle); + STDMETHOD(LoadMessages)(/*[in]*/ BSTR SID, /*[out,retval]*/ long* Handle); + + CIM_Net* m_IM_NET; + + CComBSTR m_SID; + BOOL m_UserChanged; + CComBSTR m_Password; + CComBSTR m_UserName; + long m_Status; + sUser m_sUser; + sConfig m_sConfig; + BOOL bConfigChanged; + stState m_ClientState; + CRITICAL_SECTION CS_SelfInfo; + +////////////////////////////////////////////////////////// + +// IConfig + STDMETHOD(get_Server)(BSTR * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = CComBSTR(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szServerName).Detach(); + return S_OK; + } + + STDMETHOD(put_Server)(BSTR pVal) + { + bConfigChanged = TRUE; + USES_CONVERSION; + if(pVal == NULL) + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szServerName[0] = '\0'; + else + _tcscpy(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szServerName, OLE2T(pVal)); + return S_OK; + } + STDMETHOD(get_Port)(long * pVal) + { + if (pVal == NULL) + return E_POINTER; + *pVal = m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_ServerPort; + return S_OK; + } + STDMETHOD(put_Port)(long pVal) + { + bConfigChanged = TRUE; + m_sConfig.m_Port = pVal; + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_ServerPort = pVal; + return S_OK; + } + STDMETHOD(get_Path)(BSTR * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = CComBSTR(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szPath).Detach(); + return S_OK; + } + STDMETHOD(put_Path)(BSTR pVal) + { + bConfigChanged = TRUE; + USES_CONVERSION; + if(pVal == NULL) + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szPath[0] = '\0'; + else + _tcscpy(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szPath, OLE2T(pVal)); + return S_OK; + } + STDMETHOD(get_ProxyType)(long * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_dwAccessType; + return S_OK; + } + STDMETHOD(put_ProxyType)(long pVal) + { + bConfigChanged = TRUE; + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_dwAccessType = pVal; + return S_OK; + } + STDMETHOD(get_ProxyServerName)(BSTR * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = CComBSTR(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerName).Detach(); + return S_OK; + } + STDMETHOD(put_ProxyServerName)(BSTR pVal) + { + bConfigChanged = TRUE; + USES_CONVERSION; + if(pVal == NULL) + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerName[0] = '\0'; + else + _tcscpy(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerName, OLE2T(pVal)); + return S_OK; + } + STDMETHOD(get_UseFirewall)(VARIANT_BOOL *pVal) + { + if(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_bSecure) + *pVal = VARIANT_TRUE; + else + *pVal = VARIANT_FALSE; + return S_OK; + } + + STDMETHOD(put_UseFirewall)(VARIANT_BOOL newVal) + { + bConfigChanged = TRUE; + if(newVal == VARIANT_TRUE) + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_bSecure = TRUE; + else + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_bSecure = FALSE; + return S_OK; + } + + STDMETHOD(get_FireWallUserName)(BSTR *pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = CComBSTR(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin).Detach(); + return S_OK; + } + + STDMETHOD(put_FireWallUserName)(BSTR newVal) + { + bConfigChanged = TRUE; + USES_CONVERSION; + if(newVal == NULL) + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin[0] = '\0'; + else + _tcscpy(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerLogin, OLE2T(newVal)); + return S_OK; + } + + STDMETHOD(get_FireWallPassword)(BSTR *pVal) + { + return E_NOTIMPL; + if (pVal == NULL) + return E_POINTER; + + *pVal = CComBSTR(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword).Detach(); + return S_OK; + } + + STDMETHOD(put_FireWallPassword)(BSTR newVal) + { + bConfigChanged = TRUE; + USES_CONVERSION; + if(newVal == NULL) + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword[0] = '\0'; + else + _tcscpy(m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_szProxyServerPassword, OLE2T(newVal)); + return S_OK; + } + + STDMETHOD(get_ProxyServerPort)(long *pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_ProxyServerPort; + return S_OK; + } + + STDMETHOD(put_ProxyServerPort)(long newVal) + { + bConfigChanged = TRUE; + m_IM_NET->m_BASE_NET_MANAGER_CONFIG.m_ProxyServerPort = newVal; + return S_OK; + } + +//End IConfig + +// IMonitor + STDMETHOD(get_MessageSent)(LONG * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = ::InterlockedExchangeAdd(&g_MessageSend,0); + return S_OK; + } + STDMETHOD(get_MessageReceived)(LONG * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = ::InterlockedExchangeAdd(&g_MessageReceveived,0); + return S_OK; + } + + STDMETHOD(get_FileSend)(LONG * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = ::InterlockedExchangeAdd(&g_FileSent,0); + return S_OK; + } + + STDMETHOD(get_FileReceived)(LONG * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = ::InterlockedExchangeAdd(&g_FileReceived,0); + return S_OK; + } + + STDMETHOD(get_BytesSent)(LONG * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = ::InterlockedExchangeAdd(&g_ByteSent,0); + return S_OK; + } + + STDMETHOD(get_BytesReceived)(LONG * pVal) + { + if (pVal == NULL) + return E_POINTER; + + *pVal = ::InterlockedExchangeAdd(&g_ByteReceived,0); + return S_OK; + } + + + STDMETHOD(put_BytesSentPerSecondInterval)(LONG pVal) + { + if (pVal == NULL) + return E_POINTER; + LONG* m_get = (LONG*)pVal; + DWORD sec = GetTickCount()/1000; + DWORD Point = sec % 200; + + SendLock.Lock(); + g_AddSentBytes(0); + memcpy(m_get,&g_ByteSentPerSec[Point+1],(199-Point)*sizeof(LONG)); + memcpy(m_get + (199-Point),g_ByteSentPerSec,(Point+1)*sizeof(LONG)); + + //*pVal = g_forByteSentPerSec; + SendLock.Unlock(); + return S_OK; + } + STDMETHOD(put_BytesReceivedPerSecondInterval)(LONG pVal) + { + if (pVal == NULL) + return E_POINTER; + + LONG* m_get = (LONG*)pVal; + DWORD sec = GetTickCount()/1000; + DWORD Point = sec % 200; + + ReceivedLock.Lock(); + g_AddReceivedBytes(0); + memcpy(m_get,&g_ByteReceivedPerSec[Point+1],(199-Point)*sizeof(LONG)); + memcpy(m_get + (199-Point),g_ByteReceivedPerSec,(Point+1)*sizeof(LONG)); + ReceivedLock.Unlock(); + //*pVal = g_forByteReceivedPerSec; + + return S_OK; + } +}; + +#endif //__SESSION_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/Session.rgs b/Source/Client/IM-Client/ATL_NetLib/Session.rgs new file mode 100644 index 0000000..f585e86 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Session.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediacase.IMSession.1 = s 'Session Class' + { + CLSID = s '{567B302A-1DBF-4A75-8E46-65F54A58D91D}' + } + Mediacase.IMSession = s 'Session Class' + { + CLSID = s '{567B302A-1DBF-4A75-8E46-65F54A58D91D}' + CurVer = s 'Mediacase.IMSession.1' + } + NoRemove CLSID + { + ForceRemove {567B302A-1DBF-4A75-8E46-65F54A58D91D} = s 'Session Class' + { + ProgID = s 'Mediacase.IMSession.1' + VersionIndependentProgID = s 'Mediacase.IMSession' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/StdAfx.cpp b/Source/Client/IM-Client/ATL_NetLib/StdAfx.cpp new file mode 100644 index 0000000..ef68a2c --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/StdAfx.cpp @@ -0,0 +1,11 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#include +#endif +#include diff --git a/Source/Client/IM-Client/ATL_NetLib/StdAfx.h b/Source/Client/IM-Client/ATL_NetLib/StdAfx.h new file mode 100644 index 0000000..d36ce11 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/StdAfx.h @@ -0,0 +1,45 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#if !defined(AFX_STDAFX_H__706A7E47_BA9F_4A04_A034_7AD6C453AE4D__INCLUDED_) +#define AFX_STDAFX_H__706A7E47_BA9F_4A04_A034_7AD6C453AE4D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +//#ifndef _WIN32_WINNT +//#define _WIN32_WINNT 0x0400 +//#endif +#define _ATL_APARTMENT_THREADED +#define INCL_WINSOCK_API_PROTOTYPES 1 + +//#include +#include +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; + +#include + +#ifdef _DEBUG +//#define _NOTIMEOUT +#endif +//#define _DOLOG +#include +using namespace std; +#include +#include "defConst.h" +#include "structs.h" +#include "LogEX.h" +//#include "Mswsock.h" + + +#define OBJECT_CREATE_DELETE 2 +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__706A7E47_BA9F_4A04_A034_7AD6C453AE4D__INCLUDED) diff --git a/Source/Client/IM-Client/ATL_NetLib/Structs.h b/Source/Client/IM-Client/ATL_NetLib/Structs.h new file mode 100644 index 0000000..f1d815a --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Structs.h @@ -0,0 +1,143 @@ +#ifndef __STRUCTS_H_ +#define __STRUCTS_H_ + +#include "StdAfx.h" +#include "wininet.h" +///////////////////////// +//Support Functions + +///////////////////////////////////////////////////////////////////////// +struct sUser +{ + sUser() + { + reset(); + }; + CComBSTR m_UserName; + CComBSTR m_FirstName; + CComBSTR m_LastName; + CComBSTR m_EMail; + CComBSTR m_Role; + long m_time; + long m_Status; + long m_ID; + long m_Role_ID; +public: + void reset() + { + m_LastName.Empty(); + m_FirstName.Empty(); + m_UserName.Empty(); + m_EMail.Empty(); + m_Role.Empty(); + m_Status = 0; + m_ID = 0; + m_Role_ID = 0; + } +}; +struct sConfig +{ + sConfig() + { + m_Server = CComBSTR(L"212.44.65.142"); + m_Path = CComBSTR(L"IMServer/ofs_server.dll"); + m_ProxyServer = CComBSTR(L""); + m_ProxyBypass = CComBSTR(L""); + m_Port = 80; + m_ProxyType = INTERNET_OPEN_TYPE_PRECONFIG; + }; + CComBSTR m_Server; + CComBSTR m_Path; + CComBSTR m_ProxyServer; + CComBSTR m_ProxyBypass; + long m_Port; + long m_ProxyType; +}; + +struct sChat +{ + sChat() + { + + } + CComBSTR m_Name; + CComBSTR m_Descr; + CComBSTR m_CID; + long m_CreationTime; + long m_Creator; + list m_Users; +}; + +struct sMessage +{ + sMessage() + { + m_Time = 0; + m_bChat = FALSE; + }; + sUser m_Sender; + BOOL m_bChat; + sChat m_Chat; + CComBSTR m_Body; + CComBSTR m_MID; + long m_nMID; + CComBSTR m_SID; + long m_Time; +}; + + +struct sPromo +{ + sPromo() + { + m_Body = CComBSTR(L""); + m_Subject = CComBSTR(L""); + m_PID = CComBSTR(L""); + m_SID = CComBSTR(L""); + m_ProductName = CComBSTR(L""); + m_Product_ID = 0; + m_Time = 0; + + }; + sUser m_sSender; + CComBSTR m_Body; + CComBSTR m_Subject; + CComBSTR m_ProductName; + CComBSTR m_PID; + CComBSTR m_SID; + long m_Sender_ID; + long m_Product_ID; + long m_Time; +}; +struct slocalSID +{ + slocalSID() + { + m_SID = CComBSTR(L""); + m_Count = 0; + }; + CComBSTR m_SID; + long m_Count; +}; +struct sFile +{ + sFile() + { + m_Body = CComBSTR(L""); + m_RealName = CComBSTR(L""); + m_FID = CComBSTR(L""); + m_SID = CComBSTR(L""); + m_size = 0; + m_Time = 0; + hBackWind = 0; + }; + sUser m_sSender; + CComBSTR m_Body; + CComBSTR m_RealName; + CComBSTR m_FID; + CComBSTR m_SID; + long m_size; + long m_Time; + long hBackWind; +}; +#endif \ No newline at end of file diff --git a/Source/Client/IM-Client/ATL_NetLib/User.cpp b/Source/Client/IM-Client/ATL_NetLib/User.cpp new file mode 100644 index 0000000..89d5e29 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/User.cpp @@ -0,0 +1,120 @@ +// User.cpp : Implementation of CUser +#include "stdafx.h" +#include "ATL_NetLib.h" +#include "User.h" + +///////////////////////////////////////////////////////////////////////////// +// CUser + +STDMETHODIMP CUser::get_Value(BSTR bsName, VARIANT *pVal) +{ + if(CComBSTR(bsName) == CComBSTR(_T("nick_name"))) + { + return CComVariant(m_sUser.m_UserName).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("first_name"))) + { + return CComVariant(m_sUser.m_FirstName).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("last_name"))) + { + return CComVariant(m_sUser.m_LastName).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/name"))) + { + return CComVariant(m_sUser.m_Role).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("email"))) + { + return CComVariant(m_sUser.m_EMail).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("status"))) + { + return CComVariant(m_sUser.m_Status).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("@id"))) + { + return CComVariant(m_sUser.m_ID).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/@id"))) + { + return CComVariant(m_sUser.m_Role_ID).Detach(pVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("time"))) + { + return CComVariant(m_sUser.m_time).Detach(pVal); + } + else + return E_INVALIDARG; + + return S_OK; +} + +STDMETHODIMP CUser::put_Value(BSTR bsName, VARIANT newVal) +{ + if(CComBSTR(bsName) == CComBSTR(_T("nick_name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_UserName = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("first_name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_FirstName = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("last_name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_LastName = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/name"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_Role = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("email"))) + { + if(newVal.vt != VT_BSTR) return E_INVALIDARG; + m_sUser.m_EMail = CComBSTR(newVal.bstrVal); + } + else + if(CComBSTR(bsName) == CComBSTR(_T("status"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_Status = newVal.lVal; + } + else + if(CComBSTR(bsName) == CComBSTR(_T("@id"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_ID = newVal.lVal; + } + else + if(CComBSTR(bsName) == CComBSTR(_T("role/@id"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_Role_ID = newVal.lVal; + } + else + if(CComBSTR(bsName) == CComBSTR(_T("time"))) + { + if(newVal.vt != VT_I4) return E_INVALIDARG; + m_sUser.m_time = newVal.lVal; + } + else + return E_INVALIDARG; + + return S_OK; +} diff --git a/Source/Client/IM-Client/ATL_NetLib/User.h b/Source/Client/IM-Client/ATL_NetLib/User.h new file mode 100644 index 0000000..d15c011 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/User.h @@ -0,0 +1,68 @@ +// User.h : Declaration of the CUser + +#ifndef __USER_H_ +#define __USER_H_ + +//#include "session.h" +//#include "ATL_NetLib.h" +//#include "Structs.h" +#include "resource.h" // main symbols +///////////////////////////////////////////////////////////////////////////// +// CUser +class ATL_NO_VTABLE CUser : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + CUser() + { +/* + WasSetEMail = FALSE; + WasSetLastName = FALSE; + WasSetFirstName = FALSE; + WasSetUserName = FALSE; + WasSetStatus = FALSE; + WasSetID = FALSE;*/ + + } + HRESULT CUser::FinalRelease() + { + try + { + //MCTRACE(1,m_sUser.m_UserName); + } + catch(...) + { + ATLASSERT(FALSE); + } + return S_OK; + } + +DECLARE_REGISTRY_RESOURCEID(IDR_USER) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CUser) + COM_INTERFACE_ENTRY(IUser) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IUser +public: + STDMETHOD(get_Value)(/*[in]*/ BSTR bsName, /*[out, retval]*/ VARIANT *pVal); + STDMETHOD(put_Value)(/*[in]*/ BSTR bsName, /*[in]*/ VARIANT newVal); + sUser m_sUser; +private: + +/* + bool WasSetEMail; + bool WasSetLastName; + bool WasSetFirstName; + bool WasSetUserName; + bool WasSetStatus; + bool WasSetID;*/ + +}; + +#endif //__USER_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/User.rgs b/Source/Client/IM-Client/ATL_NetLib/User.rgs new file mode 100644 index 0000000..7238ae1 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/User.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediacase.IMUser.1 = s 'User Class' + { + CLSID = s '{12177FE2-D4D5-4E92-A430-D8FC3845774C}' + } + Mediacase.IMUser = s 'User Class' + { + CLSID = s '{12177FE2-D4D5-4E92-A430-D8FC3845774C}' + CurVer = s 'Mediacase.IMUser.1' + } + NoRemove CLSID + { + ForceRemove {12177FE2-D4D5-4E92-A430-D8FC3845774C} = s 'User Class' + { + ProgID = s 'Mediacase.IMUser.1' + VersionIndependentProgID = s 'Mediacase.IMUser' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/Users.cpp b/Source/Client/IM-Client/ATL_NetLib/Users.cpp new file mode 100644 index 0000000..d4f04cc --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Users.cpp @@ -0,0 +1,7 @@ +// Users.cpp : Implementation of CUsers +#include "stdafx.h" +#include "Users.h" + +///////////////////////////////////////////////////////////////////////////// +// CUsers + diff --git a/Source/Client/IM-Client/ATL_NetLib/Users.h b/Source/Client/IM-Client/ATL_NetLib/Users.h new file mode 100644 index 0000000..c735910 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Users.h @@ -0,0 +1,65 @@ +// Users.h : Declaration of the CUsers + +#ifndef __USERS_H_ +#define __USERS_H_ + +#include "resource.h" // main symbols +#include "ATL_NETlib.h" +#include "user.h" +#include "collections.h" +#pragma warning(disable: 4530) +typedef CComEnumOnSTL, + list< CAdapt< CComPtr > > > + CComEnumVariantOnListOfUsers; + +typedef ICollectionOnSTLImpl, + list< CAdapt< CComPtr > >, + IUser*, + _CopyItfFromAdaptItf, + CComEnumVariantOnListOfUsers> + IUsersCollImpl; +#pragma warning(default: 4530) +///////////////////////////////////////////////////////////////////////////// +// CUsers +class ATL_NO_VTABLE CUsers : + public CComObjectRootEx, + public CComCoClass, + public IUsersCollImpl + +{ +public: +DECLARE_NO_REGISTRY() +DECLARE_NOT_AGGREGATABLE(CUsers) +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CUsers) + COM_INTERFACE_ENTRY(IUsers) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IUsers +public: + CUsers() + { + MCTRACE(3,"USERS LIST CREATED"); + }; + HRESULT CUsers::FinalRelease() + { + MCTRACE(3,"USERS LIST DELETED"); + return S_OK; + }; + STDMETHODIMP AddUser(IUser** ppUser) { + // Create a document to hand back to the client + HRESULT hr = CUser::CreateInstance(ppUser); + if( SUCCEEDED(hr) ) { + // Put the document on the list + CComPtr spUser = *ppUser; + m_coll.push_back(spUser); + } + + return hr; + } +}; + +#endif //__USERS_H_ diff --git a/Source/Client/IM-Client/ATL_NetLib/Users.rgs b/Source/Client/IM-Client/ATL_NetLib/Users.rgs new file mode 100644 index 0000000..3485eb8 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/Users.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Mediachase.IMUsers.1 = s 'Users Class' + { + CLSID = s '{EB496DD1-E0DF-41FA-B63C-D7BA7D9FF3D5}' + } + Mediachase.IMUsers = s 'Users Class' + { + CLSID = s '{EB496DD1-E0DF-41FA-B63C-D7BA7D9FF3D5}' + CurVer = s 'Mediachase.IMUsers.1' + } + NoRemove CLSID + { + ForceRemove {EB496DD1-E0DF-41FA-B63C-D7BA7D9FF3D5} = s 'Users Class' + { + ProgID = s 'Mediachase.IMUsers.1' + VersionIndependentProgID = s 'Mediachase.IMUsers' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{EB37EA05-FBA5-4F43-92B3-E485128055CB}' + } + } +} diff --git a/Source/Client/IM-Client/ATL_NetLib/atlenc-mc.h b/Source/Client/IM-Client/ATL_NetLib/atlenc-mc.h new file mode 100644 index 0000000..0268bc3 --- /dev/null +++ b/Source/Client/IM-Client/ATL_NetLib/atlenc-mc.h @@ -0,0 +1,287 @@ +// This is a part of the Active Template Library. +// Copyright (C) 1996-2001 Microsoft Corporation +// All rights reserved. +// +// This source code is only intended as a supplement to the +// Active Template Library Reference and related +// electronic documentation provided with the library. +// See these sources for detailed information regarding the +// Active Template Library product. + +#ifndef __ATLENC_MC_H__ +#define __ATLENC_MC_H__ + +#pragma once + +//#include +#include + +namespace ATLMC { + +//Not including CRLFs +//NOTE: For BASE64 and UUENCODE, this actually +//represents the amount of unencoded characters +//per line +#define ATLSMTP_MAX_QP_LINE_LENGTH 76 +#define ATLSMTP_MAX_BASE64_LINE_LENGTH 57 +#define ATLSMTP_MAX_UUENCODE_LINE_LENGTH 45 + + +//======================================================================= +// Base64Encode/Base64Decode +// compliant with RFC 2045 +//======================================================================= +// +#define ATL_BASE64_FLAG_NONE 0 +#define ATL_BASE64_FLAG_NOPAD 1 +#define ATL_BASE64_FLAG_NOCRLF 2 + +inline int Base64EncodeGetRequiredLength(int nSrcLen, DWORD dwFlags=ATL_BASE64_FLAG_NONE) throw() +{ + int nRet = nSrcLen*4/3; + + if ((dwFlags & ATL_BASE64_FLAG_NOPAD) == 0) + nRet += nSrcLen % 3; + + int nCRLFs = nRet / 76 + 1; + int nOnLastLine = nRet % 76; + + if (nOnLastLine) + { + if (nOnLastLine % 4) + nRet += 4-(nOnLastLine % 4); + } + + nCRLFs *= 2; + + if ((dwFlags & ATL_BASE64_FLAG_NOCRLF) == 0) + nRet += nCRLFs; + + return nRet; +} + +inline int Base64DecodeGetRequiredLength(int nSrcLen) throw() +{ + return nSrcLen; +} + +inline BOOL Base64Encode( + const BYTE *pbSrcData, + int nSrcLen, + LPSTR szDest, + int *pnDestLen, + DWORD dwFlags=ATL_BASE64_FLAG_NONE) throw() +{ + static const char s_chBase64EncodingTable[64] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', + 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', + 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; + + if (!pbSrcData || !szDest || !pnDestLen) + { + return FALSE; + } + + ATLASSERT(*pnDestLen >= Base64EncodeGetRequiredLength(nSrcLen, dwFlags)); + + int nWritten( 0 ); + int nLen1( (nSrcLen/3)*4 ); + int nLen2( nLen1/76 ); + int nLen3( 19 ); + + for (int i=0; i<=nLen2; i++) + { + if (i==nLen2) + nLen3 = (nLen1%76)/4; + + for (int j=0; j>26); + *szDest++ = s_chBase64EncodingTable[b]; + dwCurr <<= 6; + } + } + nWritten+= nLen3*4; + + if ((dwFlags & ATL_BASE64_FLAG_NOCRLF)==0) + { + *szDest++ = '\r'; + *szDest++ = '\n'; + nWritten+= 2; + } + } + + if (nWritten && (dwFlags & ATL_BASE64_FLAG_NOCRLF)==0) + { + szDest-= 2; + nWritten -= 2; + } + + nLen2 = nSrcLen%3 ? nSrcLen%3 + 1 : 0; + if (nLen2) + { + DWORD dwCurr(0); + for (int n=0; n<3; n++) + { + if (n<(nSrcLen%3)) + dwCurr |= *pbSrcData++; + dwCurr <<= 8; + } + for (int k=0; k>26); + *szDest++ = s_chBase64EncodingTable[b]; + dwCurr <<= 6; + } + nWritten+= nLen2; + if ((dwFlags & ATL_BASE64_FLAG_NOPAD)==0) + { + nLen3 = nLen2 ? 4-nLen2 : 0; + for (int j=0; j= 'A' && ch <= 'Z') + return ch - 'A' + 0; // 0 range starts at 'A' + if (ch >= 'a' && ch <= 'z') + return ch - 'a' + 26; // 26 range starts at 'a' + if (ch >= '0' && ch <= '9') + return ch - '0' + 52; // 52 range starts at '0' + if (ch == '+') + return 62; + if (ch == '/') + return 63; + return -1; +} + +inline BOOL Base64Decode(LPCSTR szSrc, int nSrcLen, BYTE *pbDest, int *pnDestLen) throw() +{ + // walk the source buffer + // each four character sequence is converted to 3 bytes + // CRLFs and =, and any characters not in the encoding table + // are skiped + + if (!szSrc || !pbDest || !pnDestLen) + { + return FALSE; + } + + LPCSTR szSrcEnd = szSrc + nSrcLen; + int nWritten = 0; + while (szSrc < szSrcEnd) + { + DWORD dwCurr = 0; + int i; + int nBits = 0; + for (i=0; i<4; i++) + { + if (szSrc >= szSrcEnd) + break; + int nCh = DecodeBase64Char(*szSrc); + szSrc++; + if (nCh == -1) + { + // skip this char + i--; + continue; + } + dwCurr <<= 6; + dwCurr |= nCh; + nBits += 6; + } + // dwCurr has the 3 bytes to write to the output buffer + // left to right + dwCurr <<= 24-nBits; + for (i=0; i> 16); + dwCurr <<= 8; + pbDest++; + nWritten++; + } + } + + *pnDestLen = nWritten; + return TRUE; +} + +CHAR PROXY_AUTH_STRING_BEGIN[] = "Proxy-Authorization: Basic "; + +int ProxyAuthorizationStringGetRequiredLength(LPCSTR strUserLogin, LPCSTR strUserPassword) +{ + if(IsBadStringPtr(strUserLogin,1024)|| + IsBadStringPtr(strUserPassword,1024)) + { + return -1; + } + + int HashStringLength = strlen(strUserLogin)+strlen(strUserPassword)+1; + + return strlen(PROXY_AUTH_STRING_BEGIN) + Base64EncodeGetRequiredLength(HashStringLength) + 3 /*\r\n\0*/; +} + +HRESULT ProxyAuthorizationString(LPCSTR strUserLogin, LPCSTR strUserPassword, LPSTR OutBuffer, int *pBufferSize) +{ + if(IsBadReadPtr(pBufferSize,sizeof(int))|| + IsBadStringPtr(strUserLogin,1024)|| + IsBadStringPtr(strUserPassword,1024)|| + IsBadWritePtr(OutBuffer,*pBufferSize)) + { + return E_INVALIDARG; + } + + int HashStringLength = strlen(strUserLogin)+strlen(strUserPassword)+1; + + int StringLength = ProxyAuthorizationStringGetRequiredLength(strUserLogin,strUserPassword); + + if(*pBufferSize +//#include "smileyahoopopup.h" + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +extern CString GetCurrentSkin(); + +// New Smile Addon [2007-02-06] +#include "SmileManager.h" +#include "SelectSmileDlg.h" + +extern CSmileManager CurrentSmileManager; +// + +///////////////////////////////////////////////////////////////////////////// +// CAddUserDlg dialog +#define WM_EDIT_UPDATE WM_USER + 201 + +CAddUserDlg::CAddUserDlg(CMainDlg* pParent /*=NULL*/) +: CResizableDialog(CAddUserDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CAddUserDlg) + //}}AFX_DATA_INIT + Handle = 0; + pMessenger = pParent; + bIsKillWinodow = FALSE; + bInitEdit = FALSE; + m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = FALSE; + bBlock = FALSE; +} + + +void CAddUserDlg::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CAddUserDlg) + DDX_Control(pDX, IDC_FONT_COMBO, m_FontCombo); + DDX_Control(pDX, IDC_SIZE_COMBO, m_SizeCombo); + DDX_Control(pDX, IDC_FRAME_EDIT, m_frameEdit); + DDX_Control(pDX, IDC_NICK_EDIT, m_Nick); + DDX_Control(pDX, IDC_COLOR_BUTTON, m_ColorButton); + DDX_Control(pDX, IDC_BOLD_CHECK, m_BoldButton); + DDX_Control(pDX, IDC_ITALIC_CHECK, m_ItalicButton); + DDX_Control(pDX, IDC_UNDERLINE_CHECK, m_UnderLineButton); + DDX_Control(pDX, IDCANCEL, m_CancelButton); + DDX_Control(pDX, IDC_INSERTSMILE_CHECK, m_InsertSmileButton); + DDX_Control(pDX, IDC_MCOK, m_Ok); + DDX_Control(pDX, IDC_MCCANCEL, m_Cancel); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CAddUserDlg, CResizableDialog) + //{{AFX_MSG_MAP(CAddUserDlg) + ON_BN_CLICKED(ID_AUTHORIZATION, OnAuthorization) + ON_BN_CLICKED(IDC_COLOR_BUTTON, OnColorButton) + ON_BN_CLICKED(IDC_BOLD_CHECK, OnBoldCheck) + ON_BN_CLICKED(IDC_ITALIC_CHECK, OnItalicCheck) + ON_BN_CLICKED(IDC_UNDERLINE_CHECK, OnUnderlineCheck) + ON_COMMAND(ID_EDITMENU_COPY, OnEditmenuCopy) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_COPY, OnUpdateEditmenuCopy) + ON_COMMAND(ID_EDITMENU_CUT, OnEditmenuCut) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_CUT, OnUpdateEditmenuCut) + ON_COMMAND(ID_EDITMENU_DELETE, OnEditmenuDelete) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_DELETE, OnUpdateEditmenuDelete) + ON_COMMAND(ID_EDITMENU_PAST, OnEditmenuPast) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_PAST, OnUpdateEditmenuPast) + ON_WM_CAPTURECHANGED() + ON_BN_CLICKED(IDC_INSERTSMILE_CHECK, OnInsertsmileCheck) + ON_CBN_SELENDOK(IDC_FONT_COMBO, OnSelendokFontCombo) + ON_CBN_SELENDOK(IDC_SIZE_COMBO, OnSelendokSizeCombo) + ON_BN_CLICKED(IDC_MCOK, OnClickAuth) + ON_BN_CLICKED(IDC_MCCANCEL, OnClickCancel) + //}}AFX_MSG_MAP + ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) + ON_MESSAGE(WM_EDIT_UPDATE,OnEditUpdate) + ON_COMMAND_RANGE(20000,20000+SmileBuffSize,OnSmileItem) +END_MESSAGE_MAP() + +BEGIN_EVENTSINK_MAP(CAddUserDlg, CResizableDialog) +//{{AFX_EVENTSINK_MAP(CAddUserDlg) +ON_EVENT(CAddUserDlg, IDC_MCCLOSE, -600 /* Click */, OnClickMcclose, VTS_NONE) +ON_EVENT(CAddUserDlg, IDC_MCMINI, -600 /* Click */, OnClickMcmini, VTS_NONE) +ON_EVENT(CAddUserDlg, IDC_MCOK, -600 /* Click */, OnClickMcOk, VTS_NONE) +ON_EVENT(CAddUserDlg, IDC_MCCANCEL, -600 /* Click */, OnClickMcCancel, VTS_NONE) +//}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CAddUserDlg message handlers + +void CAddUserDlg::AddNewContact(long user_id, LPCTSTR nick_name, LPCTSTR first_name, LPCTSTR last_name, LPCTSTR email, long company_id, LPCTSTR company_name, long role_id, LPCTSTR role_name) +{ + m_User.m_strLogin = nick_name; + m_User.m_strFirstName = first_name; + m_User.m_strLastName = last_name; + m_User.m_strEMail = email; + + m_Nick.SetText(m_User.GetShowName()); + + m_User.GlobalID = user_id; + m_User.m_RoleID = role_id; + m_User.m_iStatus = S_AWAITING; + + CString strFormat; + CString strTitleFormat; + strTitleFormat.LoadString(IDS_ADD_FRIEND_TITLE); + strFormat.Format(strTitleFormat,m_User.GetShowName()); + SetWindowText(strFormat); + + UpdateData(FALSE); +} + +void CAddUserDlg::OnOK() +{ +} + +void CAddUserDlg::OnCancel() +{ + if(Handle&&pMessenger->ConnectEnable()) + { + pSession->CancelOperation(Handle); + } + else + KillWindow(); +} + + +BOOL CAddUserDlg::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + m_font.Attach(GetStockObject(DEFAULT_GUI_FONT)); + + ShowSizeGrip(FALSE); +// m_Close.SetAutoPressed(TRUE); +// m_Close.SetCanStayPressed(FALSE); +// m_Mini.SetAutoPressed(TRUE); +// m_Mini.SetCanStayPressed(FALSE); +// m_Ok.SetAutoPressed(TRUE); +// m_Ok.SetCanStayPressed(FALSE); +// m_Cancel.SetAutoPressed(TRUE); +// m_Cancel.SetCanStayPressed(FALSE); + +// LoadSkin(); + + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + CBitmap bm; + + FontStateList.Create(16,16,ILC_COLOR32|ILC_MASK, 0,4); + bm.LoadBitmap(IDB_BOLD); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_ITALIC); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_UNDERLINE); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_COLOR); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_SMILE); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + m_BoldButton.SetIcon(FontStateList.ExtractIcon(0)); + m_ItalicButton.SetIcon(FontStateList.ExtractIcon(1)); + m_UnderLineButton.SetIcon(FontStateList.ExtractIcon(2)); + m_ColorButton.SetIcon(FontStateList.ExtractIcon(3)); + m_InsertSmileButton.SetIcon(FontStateList.ExtractIcon(4)); + +// m_Nick.SetTextColor(0xffffff); +// m_Nick.SetTransparent(TRUE); + +// CRect rect; +// rect.top = 67; +// rect.bottom = rect.top + nDropHeight; +// rect.left = 150; +// rect.right = rect.left + 40; + +// m_SizeCombo.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP, rect,this,IDC_SIZE_COMBO); +// m_SizeCombo.SetFont(&m_font); + CString str; + for (int i = 0; i < sizeof(nFontSizes)/sizeof(int); i++) + { + str.Format(_T("%d"), nFontSizes[i]); + m_SizeCombo.AddString(str); + } + + ///// Font Combo Create .... +// rect.top = 67; +// rect.bottom = rect.top + nDropHeight; +// rect.left = 195; +// rect.right = rect.left+120; + +// m_FontCombo.Create(CBS_DROPDOWNLIST|WS_VSCROLL|CBS_SORT |WS_VISIBLE|WS_TABSTOP, rect, this, IDC_FONT_COMBO); +// m_FontCombo.SetFont(&m_font); + ::EnumFontFamilies(GetDC()->m_hDC, (LPTSTR) NULL, (FONTENUMPROC)NEnumFontNameProc, (LPARAM)&(m_FontCombo)); + + CRect windowRect; + GetWindowRect(&windowRect); + + CRect rTmp(15,94,windowRect.Width()-15,windowRect.Height()-50); + m_edit.Create(NULL,NULL,WS_VISIBLE|WS_BORDER,rTmp,this,IDC_DHTML_EDIT); + m_edit.InitInfoMessage(WM_EDIT_UPDATE); + m_edit.SetContextMenu(IDR_MESSENGER_MENU,1,this); + m_edit.SetEditMode(); + +// m_Nick.SetWindowPos(NULL,18,43,windowRect.Width()-36,16,SWP_NOZORDER|SWP_NOACTIVATE); + +// m_ColorButton.SetWindowPos(NULL,17,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_BoldButton.SetWindowPos(NULL,43,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_ItalicButton.SetWindowPos(NULL,69,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_UnderLineButton.SetWindowPos(NULL,94,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_InsertSmileButton.SetWindowPos(NULL,120,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// m_Cancel.SetWindowPos(NULL,windowRect.Width()-91,windowRect.Height()-38,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_Ok.SetWindowPos(NULL,windowRect.Width()-170,windowRect.Height()-38,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// AddAnchor(&m_Nick,CSize(0,0),CSize(100,0)); +// AddAnchor(&m_edit,CSize(0,0),CSize(100,100)); +// AddAnchor(&m_Ok,CSize(100,100),CSize(100,100)); +// AddAnchor(&m_Cancel,CSize(100,100),CSize(100,100)); + + AddAnchor(m_Nick.GetSafeHwnd(), CSize(0, 0), CSize(100, 0)); + CRect r; + m_frameEdit.GetWindowRect(&r); + ScreenToClient(&r); + m_edit.SetWindowPos(NULL, r.left, r.top, r.Width(), r.Height(), SWP_NOZORDER); + AddAnchor(&m_edit, CSize(0, 0), CSize(100, 100)); + AddAnchor(m_SizeCombo.GetSafeHwnd(), CSize(0, 0), CSize(0, 0)); + AddAnchor(m_FontCombo.GetSafeHwnd(), CSize(0, 0), CSize(100, 0)); + AddAnchor(m_Ok.GetSafeHwnd(), CSize(100, 100), CSize(100, 100)); + AddAnchor(m_Cancel.GetSafeHwnd(), CSize(100, 100), CSize(100, 100)); + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_ADD_FRIEND, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + + CString strFontName = GetOptionString(IDS_OFSMESSENGER,IDS_FONT,_T("Arial")); + //int FontId = GetOptionInt(IDS_OFSMESSENGER,IDS_FONT,-1); + //if(FontId!=-1) + // m_FontCombo.GetLBText(FontId, strFontName); + CComBSTR bsFontName = strFontName; + + // [4/29/2002] + m_edit.SetDefaultFontName(bsFontName); + m_edit.SetDefaultFontSize(nFontSizes[GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)]); + // [4/29/2002] + + + // OZ 2007-02-01 + m_CoolMenuManager.Install(this); + + try + { + // Load Smiles + int SmileIndex = 0; + for(CSmileInfoListEnum item = CurrentSmileManager.GetSmiles().begin();item!=CurrentSmileManager.GetSmiles().end();item++, SmileIndex++) + { + CBitmap* pPreviewBmp = CurrentSmileManager.GetSmilePreview((*item).GetId()); + + if(pPreviewBmp!=NULL) + { + TOOLBARDATA Tdt = {1,16,16,1,0}; + WORD dwItemID[] = {20001+(*item).GetIndex()}; + + Tdt.items = (WORD*)dwItemID; + + m_CoolMenuManager.LoadToolbar(*pPreviewBmp,&Tdt,0x808080); + + pPreviewBmp->DeleteObject(); + delete pPreviewBmp; + } + } + + } + catch (...) + { + ASSERT(FALSE); + } + // + + m_edit.Clear(); + m_edit.SetFocus(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + + +CComBSTR CAddUserDlg::GetMessageText() +{ + CComBSTR bstText; + m_edit.GetHTML(&bstText); + + // Replace Smile Images + int StartPos = 0, Length = 0; + CSmileInfo currentSmile = FindSmileImage(bstText.m_str, StartPos, Length); + + while(currentSmile!=CSmileInfo::Empty) + { + USES_CONVERSION; + + WCHAR *pBuffer = new WCHAR[Length+1]; + wcsncpy(pBuffer, ((LPCWSTR)bstText.m_str) + StartPos, Length); + pBuffer[Length] = 0; + + int LenPrev = bstText.Length(); + Replace(bstText.m_str,pBuffer, T2CW(currentSmile.GetHtmlSmile())); + + int LenNew = bstText.Length(); + + StartPos = 0; + Length = 0; + + delete pBuffer; + + currentSmile = FindSmileImage(bstText.m_str, StartPos, Length); + } + + /// + CComBSTR bstTmpText = (LPCWSTR)bstText; + bstText.Empty(); + bstText = bstTmpText; + /// + + RemoveParagraf(bstText.m_str); + + /// + CComBSTR bstTmpText2 = (LPCWSTR)bstText; + bstText.Empty(); + bstText = bstTmpText2; + /// + + return bstText; +} + +void CAddUserDlg::OnAuthorization() +{ + //CResizableDialog::OnOK(); + if(pMessenger->ConnectEnable()&&!bBlock) + { + theNet2.LockTranslator(); + Handle = pSession->AddUser(m_User.GetGlobalID(),_bstr_t(GetMessageText()),1); + if(Handle) + { + Block(); + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + pMessenger->AddUserToContactList(m_User); + } + theNet2.UnlockTranslator(); + + } + ///else + //{ + // MessageBox("Error: No Connection","Can't add user",MB_OK|MB_ICONSTOP); + //} +} + +void CAddUserDlg::OnColorButton() +{ + CColorDialog m_Color(m_edit.GetBgColor(),CC_ANYCOLOR,this); + if(m_Color.DoModal()==IDOK) + { + m_edit.SetColor(m_Color.GetColor()); + m_edit.SetFocus(); + } +} + +void CAddUserDlg::OnBoldCheck() +{ + m_edit.SetBold(); + m_edit.SetFocus(); +} + +void CAddUserDlg::OnItalicCheck() +{ + m_edit.SetItalic(); + m_edit.SetFocus(); +} + +void CAddUserDlg::OnUnderlineCheck() +{ + m_edit.SetUnderline(); + m_edit.SetFocus(); +} + +void CAddUserDlg::UnBlock() +{ + bBlock = FALSE; + m_Ok.EnableWindow(TRUE); + m_edit.EnableWindow(TRUE); +} + +void CAddUserDlg::Block() +{ + bBlock = TRUE; + m_Ok.EnableWindow(FALSE); + m_edit.EnableWindow(FALSE); +} + +LRESULT CAddUserDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + + UnBlock(); + + switch(pItem->EventType) + { + case NLT_ECommandOK: + KillWindow(); + break; + case NLT_ECommandError: + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + pMessenger->DeleteFromContact(m_User.GetGlobalID()); + MessageBox(GetString(IDS_ADD_USER_ERROR),GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONSTOP); + break; + } + + + delete pItem; + return 0; +} + +void CAddUserDlg::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + CResizableDialog::OnClose(); + if(!bIsKillWinodow) + { + bIsKillWinodow = TRUE; + pMessenger->SendMessage(WM_KILL_ADDUSER_MESSAGE_DLG,(WPARAM)m_User.GetGlobalID(),(LPARAM)this); + DestroyWindow(); + delete this; + } + +} + +HRESULT CAddUserDlg::OnEditUpdate(WPARAM w, LPARAM l) +{ + if(!bInitEdit) + { + bInitEdit = TRUE; + + // [7/22/2002] + /* + m_edit.SetTextSize(GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)+1); + CString strFontName = _T("Arial"); + int FontId = GetOptionInt(IDS_OFSMESSENGER,IDS_FONT,-1); + if(FontId!=-1) + m_FontCombo.GetLBText(FontId, strFontName); + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName);*/ + + + if(GetOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE,0)) + { + //m_UnderLineButton.SetCheck(1); + m_edit.SetUnderline(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ITALIC,0)) + { + //m_ItalicButton.SetCheck(1); + m_edit.SetItalic(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_BOLD,0)) + { + //m_BoldButton.SetCheck(1); + m_edit.SetBold(); + } + + } + + CCmdUI m_Command; + + m_Command.m_nID = m_BoldButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_BoldButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_BOLD,TRUE); + + m_Command.m_nID = m_ItalicButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_ItalicButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_ITALIC,TRUE); + + m_Command.m_nID = m_UnderLineButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_UnderLineButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_UNDERLINE,TRUE); + + int TextSize = m_edit.GetTextSize(); + // [4/29/2002] + if(TextSize>=1) + m_SizeCombo.SetCurSel(m_edit.GetTextSize()-1); + else + { + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + } + // [4/29/2002] + + + CString strFontName = m_edit.GetFontName(); + + for (int i=0; i < m_FontCombo.GetCount(); ++i) + { + CString itemStr; + + m_FontCombo.GetLBText(i, itemStr); + + if ( itemStr == strFontName) + { + m_FontCombo.SetCurSel(i); + break; + } + } + return 0; +} + +void CAddUserDlg::OnEditmenuCopy() +{ + m_edit.ClipboardCopy(); +} + +void CAddUserDlg::OnUpdateEditmenuCopy(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCopy()); +} + +void CAddUserDlg::OnEditmenuCut() +{ + m_edit.ClipboardCut(); +} + +void CAddUserDlg::OnUpdateEditmenuCut(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCut()); +} + +void CAddUserDlg::OnEditmenuDelete() +{ + m_edit.ClipboardDelete(); +} + +void CAddUserDlg::OnUpdateEditmenuDelete(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardDelete()); +} + +void CAddUserDlg::OnEditmenuPast() +{ + if (OpenClipboard()) + { + HANDLE hText = GetClipboardData(CF_TEXT); + + if(hText!=NULL) + { + CComBSTR strText = (LPCTSTR)GlobalLock(hText); + m_edit.InsertTEXT(strText); + GlobalUnlock(hText); + } + + CloseClipboard(); + } +} + +void CAddUserDlg::OnUpdateEditmenuPast(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardPast()); +} + + + +//DEL void CAddUserDlg::OnPaint() +//DEL { +//DEL CPaintDC dc(this); // device context for painting +//DEL +//DEL CRect m_Client; +//DEL GetClientRect(&m_Client); +//DEL m_ResizeFon.Render(dc.GetSafeHdc(),m_Client.Size()); +//DEL } + +//DEL void CAddUserDlg::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL CPoint inPoint = point; +//DEL ClientToScreen(&point); +//DEL +//DEL CRect StatusRect, miniRect; +//DEL GetClientRect(&StatusRect); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL CResizableDialog::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL CResizableDialog::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL CResizableDialog::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL CResizableDialog::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMLEFT; +//DEL else +//DEL nHitTest = HTLEFT; +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMRIGHT; +//DEL else +//DEL nHitTest = HTRIGHT; +//DEL else if(inPoint.y=0) + { + + CSmileInfo smileInfo = CurrentSmileManager.GetSmile(SmileId); + + if(smileInfo!=CSmileInfo::Empty) + { + + CurrentSmileManager.IncHitCount(smileInfo.GetId()); + + BOOL bShift = GetKeyState(VK_SHIFT)>>1; + + if(bShift) + { + CComBSTR strSmileHtml = smileInfo.GetHtmlSmile(); + m_edit.InsertHTML(strSmileHtml); + } + else + { + CComBSTR strSmileHtml = L""; + + m_edit.InsertHTML(strSmileHtml); + } + + m_edit.SetFocus(); + } + else + { + ASSERT(FALSE); + } + } + // +} + +//DEL BOOL CAddUserDlg::OnEraseBkgnd(CDC* pDC) +//DEL { +//DEL return TRUE; +//DEL } + +void CAddUserDlg::OnSelendokSizeCombo() +{ + WriteOptionInt(IDS_OFSMESSENGER,IDS_SIZE,m_SizeCombo.GetCurSel()); + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + // [4/29/2002] + m_edit.SetDefaultFontSize(nFontSizes[m_SizeCombo.GetCurSel()]); + // [4/29/2002] + m_edit.SetFocus(); +} + +void CAddUserDlg::OnSelendokFontCombo() +{ + int nIndex = m_FontCombo.GetCurSel(); + CString strFontName; + m_FontCombo.GetLBText(nIndex, strFontName); + + WriteOptionString(IDS_OFSMESSENGER,IDS_FONT,strFontName); + + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName); + // [4/29/2002] + m_edit.SetDefaultFontName(bsFontName); + // [4/29/2002] + m_edit.SetFocus(); +} + +BOOL CAddUserDlg::PreTranslateMessage(MSG* pMsg) +{ + if(m_bWasCtrlExit&&m_bWasCtrlEnter) + { + m_bWasCtrlExit = m_bWasCtrlEnter = FALSE; + CResizableDialog::PreTranslateMessage(pMsg); + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + pMsg->lParam = 0; + } + else + if(pMsg->message==WM_KEYUP&& + pMsg->wParam==VK_CONTROL&& + !bBlock&& + m_bWasCtrlEnter) + { + //m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = TRUE; + } + else + if(pMsg->message==WM_KEYDOWN||pMsg->message==WM_SYSKEYDOWN) + { + //TRACE("\r\n WM_KEYDOWN wParam = 0x%X",pMsg->wParam); + if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_CONTROL)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_CTRLENTER,1)==0) + { + OnAuthorization(); + return TRUE; + } + else + { + m_bWasCtrlEnter = TRUE; + //pMsg->message = WM_KEYDOWN; + //pMsg->wParam = VK_RETURN; + //m_edit.SendMessage(WM_KEYDOWN,VK_RETURN); + } + } + else if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_SHIFT)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHIFTENTER,0)==0) + { + OnAuthorization(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==VK_RETURN&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ENTER,0)==0) + { + OnAuthorization(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==0x53&&(GetKeyState(VK_MENU)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ALTS,0)==0) + { + OnAuthorization(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + } + return CResizableDialog::PreTranslateMessage(pMsg); +} + +void CAddUserDlg::OnClickAuth() +{ + OnAuthorization(); +} + +void CAddUserDlg::OnClickCancel() +{ + OnCancel(); +} diff --git a/Source/Client/IM-Client/IMClient/AddUserDlg.h b/Source/Client/IM-Client/IMClient/AddUserDlg.h new file mode 100644 index 0000000..1ec1585 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/AddUserDlg.h @@ -0,0 +1,124 @@ +//{{AFX_INCLUDES() +#include "mcticker.h" +//}}AFX_INCLUDES +#if !defined(AFX_ADDUSERDLG_H__C2EAB833_2AB0_426E_B135_0D48DE834AD3__INCLUDED_) +#define AFX_ADDUSERDLG_H__C2EAB833_2AB0_426E_B135_0D48DE834AD3__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// AddUserDlg.h : header file +// + +#include "OfsNcDlg.h" +#include "ResizableImage.h" +#include "McButton.h" +#include "Label.h" + +#include ".\\OFSDhtmlEditCtrl\\OFSDhtmlCtrl.h" +#include "user.h" // Added by ClassView +#include "coolmenu.h" + +class CMainDlg; +///////////////////////////////////////////////////////////////////////////// +// CAddUserDlg dialog + +class CAddUserDlg : public CResizableDialog +{ +// Construction +public: + void AddNewContact(long user_id, LPCTSTR nick_name, LPCTSTR first_name, LPCTSTR last_name, LPCTSTR email, long company_id, LPCTSTR company_name, long role_id, LPCTSTR role_name); + CAddUserDlg(CMainDlg* pParent); // standard constructor + +// Dialog Data + //{{AFX_DATA(CAddUserDlg) + enum { IDD = IDD_ADDUSER_DIALOG }; + CStatic m_frameEdit; + CLabel m_Nick; + CButton m_ColorButton; + CButton m_BoldButton; + CButton m_ItalicButton; + CButton m_UnderLineButton; + CButton m_CancelButton; + CButton m_InsertSmileButton; + CButton m_Ok; + CButton m_Cancel; + CComboBox m_FontCombo; + CComboBox m_SizeCombo; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CAddUserDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +public: + CComBSTR GetMessageText(); + CUser m_User; +protected: + BOOL bBlock; + BOOL m_bWasCtrlEnter, m_bWasCtrlExit; + + void KillWindow(); + CMainDlg *pMessenger; + ISessionPtr pSession; + long Handle; + CImageList FontStateList; + CFont m_font; + BOOL bInitEdit; + + void UnBlock(); + void Block(); + + COfsDhtmlEditCtrl m_edit; + BOOL bIsKillWinodow; + CResizableImage m_ResizeFon; + // Generated message map functions + //{{AFX_MSG(CAddUserDlg) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnAuthorization(); + afx_msg void OnColorButton(); + afx_msg void OnBoldCheck(); + afx_msg void OnItalicCheck(); + afx_msg void OnUnderlineCheck(); + afx_msg void OnEditmenuCopy(); + afx_msg void OnUpdateEditmenuCopy(CCmdUI* pCmdUI); + afx_msg void OnEditmenuCut(); + afx_msg void OnUpdateEditmenuCut(CCmdUI* pCmdUI); + afx_msg void OnEditmenuDelete(); + afx_msg void OnUpdateEditmenuDelete(CCmdUI* pCmdUI); + afx_msg void OnEditmenuPast(); + afx_msg void OnUpdateEditmenuPast(CCmdUI* pCmdUI); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnClickMcmini(); + afx_msg void OnClickMcclose(); + afx_msg void OnClickMcOk(); + afx_msg void OnClickMcCancel(); + afx_msg void OnInsertsmileCheck(); + afx_msg void OnSelendokFontCombo(); + afx_msg void OnSelendokSizeCombo(); + afx_msg void OnClickAuth(); + afx_msg void OnClickCancel(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + LRESULT OnNetEvent(WPARAM w,LPARAM l); + HRESULT OnEditUpdate(WPARAM w, LPARAM l); + void OnSmileItem(UINT nID); + + DECLARE_MESSAGE_MAP() +private: + CCoolMenuManager m_CoolMenuManager; +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_ADDUSERDLG_H__C2EAB833_2AB0_426E_B135_0D48DE834AD3__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/AddUserRequest.cpp b/Source/Client/IM-Client/IMClient/AddUserRequest.cpp new file mode 100644 index 0000000..d5c80c7 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/AddUserRequest.cpp @@ -0,0 +1,865 @@ +// AddUserRequest.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "AddUserRequest.h" +#include "GlobalFunction.h" +#include "MainDlg.h" +//#include "MainFrm.h" +#include "LoadSkins.h" +#include "ExDispid.h" + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CAddUserRequest dialog +extern CString GetCurrentSkin(); + +CAddUserRequest::CAddUserRequest(CMainDlg* pParent) +: CResizableDialog(CAddUserRequest::IDD, pParent) +{ + EnableAutomation(); + //{{AFX_DATA_INIT(CAddUserRequest) + //}}AFX_DATA_INIT + Handle = 0; + pMessenger = pParent; + bIsKillWinodow = FALSE; + m_bAddUserCommand = FALSE; + m_dwSessionCookie = 0; +// SetBoundary(0,0); +// SetCaption(RGB(0,0,0),RGB(0,0,0),0); +} + + +void CAddUserRequest::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CAddUserRequest) + //DDX_Control(pDX, IDC_FRAME_EDIT, m_frameEdit); + DDX_Control(pDX, IDC_NICK_EDIT, m_Nick); + DDX_Control(pDX, IDC_MCACCEPT, m_Accept); + DDX_Control(pDX, IDC_MCDENY, m_Deny); + DDX_Control(pDX, IDC_MCUSERDETAILS, m_Details); + DDX_Control(pDX, IDC_MCADDTOCONTACT, m_AddToContact); + DDX_Control(pDX, IDC_EDIT_EXPLORER, m_edit); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CAddUserRequest, CResizableDialog) +//{{AFX_MSG_MAP(CAddUserRequest) +//ON_BN_CLICKED(ID_DANY, OnDany) +ON_COMMAND(ID_EDITMENU_COPY, OnEditmenuCopy) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_COPY, OnUpdateEditmenuCopy) +ON_COMMAND(ID_EDITMENU_CUT, OnEditmenuCut) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_CUT, OnUpdateEditmenuCut) +ON_COMMAND(ID_EDITMENU_DELETE, OnEditmenuDelete) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_DELETE, OnUpdateEditmenuDelete) +ON_COMMAND(ID_EDITMENU_PAST, OnEditmenuPast) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_PAST, OnUpdateEditmenuPast) +//ON_BN_CLICKED(ID_AUTHORIZATION_REQUEST, OnAuthorizationRequest) +//ON_BN_CLICKED(ID_GETUSERDETAILS_BUTTON, OnGetuserdetailsButton) +ON_WM_CAPTURECHANGED() +ON_BN_CLICKED(IDC_MCUSERDETAILS, OnMcUserDetails) +ON_BN_CLICKED(IDC_MCADDTOCONTACT, OnMcAddToContact) +ON_BN_CLICKED(IDC_MCACCEPT, OnMcAccept) +ON_WM_CANCELMODE() +ON_BN_CLICKED(IDC_MCDENY, OnMcDeny) +//}}AFX_MSG_MAP +ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) +END_MESSAGE_MAP() + +BEGIN_EVENTSINK_MAP(CAddUserRequest, CResizableDialog) +//{{AFX_EVENTSINK_MAP(CAddUserRequest) +ON_EVENT(CAddUserRequest, IDC_EDIT_EXPLORER, DISPID_DOCUMENTCOMPLETE, OnWebDocumentCompleted, VTS_DISPATCH VTS_PVARIANT) +//}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +BEGIN_INTERFACE_MAP(CAddUserRequest, CCmdTarget) +INTERFACE_PART(CAddUserRequest, __uuidof(_IMpaWebCustomizerEvents), Dispatch) +END_INTERFACE_MAP() + +BEGIN_DISPATCH_MAP(CAddUserRequest, CCmdTarget) +//{{AFX_DISPATCH_MAP(CHistoryDlg) +DISP_FUNCTION_ID(CAddUserRequest,"", 18, OnShowContextMenu, VT_EMPTY, VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_PI4) +//}}AFX_DISPATCH_MAP +END_DISPATCH_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CAddUserRequest message handlers + +void CAddUserRequest::OnOK() +{ +} + +void CAddUserRequest::OnCancel() +{ + if(Handle&&pMessenger->ConnectEnable()) + { + pSession->CancelOperation(Handle); + } + else + KillWindow(); +} + + + +BOOL CAddUserRequest::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + HRESULT hr = m_pWebCustomizer.CreateInstance(CLSID_MpaWebCustomizer); + + LPUNKNOWN pDispatch = m_edit.GetControlUnknown(); + m_pWebCustomizer->PutRefWebBrowser((LPDISPATCH)pDispatch); + + InitMpaWebEvent(); + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + +// LoadSkin(); + + CRect winRect; + GetWindowRect(&winRect); + + CRect rTmp(15,70,winRect.Width()-15,winRect.Height()-50); + + //m_edit.Create(NULL,NULL,WS_VISIBLE|WS_BORDER,rTmp,this,IDC_DHTML_EDIT); + //m_edit.SetContextMenu(IDR_MESSENGER_MENU,1,this); + //m_edit.SetViewMode(); + + // [4/29/2002] + //m_edit.SetDefaultFontName(L"Arial"); + //m_edit.SetDefaultFontSize(nFontSizes[GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)]); + // [4/29/2002] + + + + // m_Nick.SetWindowPos(NULL,18,43,winRect.Width()-36,16,SWP_NOZORDER|SWP_NOACTIVATE); + // m_Nick.SetTextColor(0xffffff); + // m_Nick.SetTransparent(TRUE); + + // m_Close.SetAutoPressed(TRUE); + // m_Close.SetCanStayPressed(FALSE); + // m_Mini.SetAutoPressed(TRUE); + // m_Mini.SetCanStayPressed(FALSE); + // m_Deny.SetAutoPressed(TRUE); + // m_Deny.SetCanStayPressed(FALSE); + // m_AddToContact.SetAutoPressed(TRUE); + // m_AddToContact.SetCanStayPressed(FALSE); + // m_Accept.SetAutoPressed(TRUE); + // m_Accept.SetCanStayPressed(FALSE); + // m_Details.SetAutoPressed(TRUE); + // m_Details.SetCanStayPressed(FALSE); + + + // m_Deny.SetWindowPos(NULL,winRect.Width()-91,winRect.Height()-38,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_AddToContact.SetWindowPos(NULL,winRect.Width()-91,winRect.Height()-38,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE|SWP_HIDEWINDOW); + // m_Accept.SetWindowPos(NULL,winRect.Width()-170,winRect.Height()-38,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_Details.SetWindowPos(NULL,15,winRect.Height()-38,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + + CRect r; + //m_frameEdit.GetWindowRect(&r); + //ScreenToClient(&r); + //m_edit.SetWindowPos(NULL, r.left, r.top, r.Width(), r.Height(), SWP_NOZORDER); + AddAnchor(m_edit.GetSafeHwnd(), CSize(0,0), CSize(100,100)); + AddAnchor(m_Deny.GetSafeHwnd(), CSize(100,100), CSize(100,100)); + AddAnchor(m_AddToContact.GetSafeHwnd(), CSize(100,100), CSize(100,100)); + AddAnchor(m_Accept.GetSafeHwnd(), CSize(100,100), CSize(100,100)); + AddAnchor(m_Details.GetSafeHwnd(), CSize(0,100), CSize(0,100)); + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_ADD_FRIENDR, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + + + //m_edit.Clear(); + //m_edit.SetFocus(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + + +void CAddUserRequest::SetSender(CUser &user, BSTR Data) +{ + m_User = user; + + m_Nick.SetText(m_User.GetShowName()); + + m_bsHTML = L""; + m_bsHTML += Data; + m_bsHTML += L""; + + m_edit.Navigate(_T("about:blank"),0,0,0,0); + + UpdateData(FALSE); + + if(m_User.IsBad()) + { + if(!Handle) + { + if(pMessenger->ConnectEnable()) + { + theNet2.LockTranslator(); + try + { + Handle = pSession->UserDetails(m_User.GetGlobalID(),1); + if(Handle) + { + Block(); + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + } + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + + theNet2.UnlockTranslator(); + } + } + } +} + +void CAddUserRequest::UnBlock() +{ + //GetDlgItem(IDOK)->EnableWindow(TRUE); + //GetDlgItem(ID_DANY)->EnableWindow(TRUE); + m_Accept.EnableWindow(TRUE); + m_Deny.EnableWindow(TRUE); +} + +void CAddUserRequest::Block() +{ + m_Accept.EnableWindow(FALSE); + m_Deny.EnableWindow(FALSE); + //GetDlgItem(IDOK)->EnableWindow(FALSE); + //GetDlgItem(ID_DANY)->EnableWindow(FALSE); +} + +LRESULT CAddUserRequest::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + + UnBlock(); + switch(pItem->EventType) + { + case NLT_EDetails: + { + IUser *pUser = NULL; + HRESULT hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + + if(SUCCEEDED(hr)) + { + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + try + { + CUser InfoUser(pUser); + m_User = InfoUser; + m_Nick.SetText(m_User.GetShowName()); + + UpdateData(FALSE); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + pUser->Release(); + } + } + break; + case NLT_ECommandOK: + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + if(m_bAddUserCommand&&!pMessenger->CheckUserInContactList(m_User)) + { + //GetDlgItem(IDOK)->ShowWindow(SW_HIDE); + //GetDlgItem(ID_DANY)->ShowWindow(SW_HIDE); + m_Accept.ShowWindow(SW_HIDE); + m_Deny.ShowWindow(SW_HIDE); + m_AddToContact.ShowWindow(SW_SHOWNORMAL); + //GetDlgItem(ID_AUTHORIZATION_REQUEST)->ShowWindow(SW_SHOWNORMAL); + } + else + KillWindow(); + break; + case NLT_ECommandError: + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + MessageBox(GetString(IDS_ADD_USER_ERROR),GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONSTOP); + break; + } + + delete pItem; + return 0; +} + +void CAddUserRequest::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + CResizableDialog::OnClose(); + if(!bIsKillWinodow) + { + CloseMpaWebEvent(); + bIsKillWinodow = TRUE; + DestroyWindow(); + delete this; + } +} + +void CAddUserRequest::OnDany() +{ + if(!Handle) + { + if(pMessenger->ConnectEnable()) + { + theNet2.LockTranslator(); + try + { + Handle = pSession->AddUserReply(m_User.GetGlobalID(),2); + if(Handle) + { + m_bAddUserCommand = FALSE; + Block(); + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + } + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + theNet2.UnlockTranslator(); + } + //else + //{ + // MessageBox("Error: No Connection","Can't add user",MB_OK|MB_ICONSTOP); + //} + } +} + +void CAddUserRequest::OnEditmenuCopy() +{ + //m_edit.ClipboardCopy(); +} + +void CAddUserRequest::OnUpdateEditmenuCopy(CCmdUI* pCmdUI) +{ + //pCmdUI->Enable(m_edit.EnableClipboardCopy()); +} + +void CAddUserRequest::OnEditmenuCut() +{ + //m_edit.ClipboardCut(); +} + +void CAddUserRequest::OnUpdateEditmenuCut(CCmdUI* pCmdUI) +{ + //pCmdUI->Enable(m_edit.EnableClipboardCut()); +} + +void CAddUserRequest::OnEditmenuDelete() +{ + //m_edit.ClipboardDelete(); +} + +void CAddUserRequest::OnUpdateEditmenuDelete(CCmdUI* pCmdUI) +{ + //pCmdUI->Enable(m_edit.EnableClipboardDelete()); +} + +void CAddUserRequest::OnEditmenuPast() +{ + //if (OpenClipboard()) + // { + // HANDLE hText = GetClipboardData(CF_TEXT); + // + // if(hText!=NULL) + // { + // CComBSTR strText = (LPCTSTR)GlobalLock(hText); + // m_edit.InsertTEXT(strText); + // GlobalUnlock(hText); + // } + // + // CloseClipboard(); + // } + +} + +void CAddUserRequest::OnUpdateEditmenuPast(CCmdUI* pCmdUI) +{ + //pCmdUI->Enable(m_edit.EnableClipboardPast()); +} + + +void CAddUserRequest::OnAuthorizationRequest() +{ + DHTMLE_ADDCONTACT_Container *pData = new DHTMLE_ADDCONTACT_Container; + + pData->email = m_User.m_strEMail; + pData->first_name = m_User.m_strFirstName; + pData->last_name = m_User.m_strLastName; + pData->nick_name = m_User.m_strLogin; + pData->role_id = m_User.m_RoleID; + pData->role_name = m_User.m_strType; + pData->user_id = m_User.GlobalID; + + pMessenger->SendMessage(WM_DHTML_EVENT,(WPARAM)DHTMLE_ADDCONTACT,(LPARAM)pData); + + KillWindow(); +} + +void CAddUserRequest::OnGetuserdetailsButton() +{ + pMessenger->ShowUserDetails(m_User.GetGlobalID()); +} + +//DEL void CAddUserRequest::LoadSkin() +//DEL { +//DEL LoadSkins m_LoadSkin; +//DEL +//DEL IStreamPtr pStream = NULL; +//DEL long Error = 0L; +//DEL +//DEL bstr_t bstrPath =IBN_SCHEMA; +//DEL bstrPath += (LPCTSTR)GetCurrentSkin(); +//DEL +//DEL m_LoadSkin.Load(bstr_t(bstrPath+"/Shell/AddR/fon.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL { +//DEL LPPICTURE Pic = NULL; +//DEL HRESULT hr = ::OleLoadPicture(pStream, 0, TRUE, IID_IPicture,(void**)&Pic); +//DEL if(SUCCEEDED(hr)) +//DEL { +//DEL m_ResizeFon.Create(Pic); +//DEL m_ResizeFon.AddAnchor(CRect(0,0,130,70),CSize(0,0),CSize(0,0)); +//DEL m_ResizeFon.AddAnchor(CRect(130,0,205,70),CSize(0,0),CSize(100,0),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(205,0,299,70),CSize(100,0),CSize(100,0)); +//DEL +//DEL m_ResizeFon.AddAnchor(CRect(0,70,130,179),CSize(0,0),CSize(0,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(130,70,205,179),CSize(0,0),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(205,70,299,179),CSize(100,0),CSize(100,100),CResizableImage::DUPLICATE); +//DEL +//DEL m_ResizeFon.AddAnchor(CRect(0,179,130,227),CSize(0,100),CSize(0,100)); +//DEL m_ResizeFon.AddAnchor(CRect(139,179,205,227),CSize(0,100),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(205,179,299,227),CSize(100,100),CSize(100,100)); +//DEL } +//DEL } +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_x.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Close.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_minimize.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Mini.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/AddR/accept.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Accept.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/AddR/deny.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Deny.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/AddR/user_details.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Details.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/AddR/add.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_AddToContact.LoadBitmapFromStream(pStream); +//DEL } + +void CAddUserRequest::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_ADD_FRIEND,RectToString(rWindow)); + + CResizableDialog::OnCaptureChanged(pWnd); +} + +//DEL void CAddUserRequest::OnPaint() +//DEL { +//DEL CPaintDC dc(this); // device context for painting +//DEL +//DEL CRect m_Client; +//DEL GetClientRect(&m_Client); +//DEL m_ResizeFon.Render(dc.GetSafeHdc(),m_Client.Size()); +//DEL } + +//DEL void CAddUserRequest::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL CPoint inPoint = point; +//DEL ClientToScreen(&point); +//DEL +//DEL CRect StatusRect, miniRect; +//DEL GetClientRect(&StatusRect); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL CResizableDialog::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL CResizableDialog::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL CResizableDialog::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL CResizableDialog::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMLEFT; +//DEL else +//DEL nHitTest = HTLEFT; +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMRIGHT; +//DEL else +//DEL nHitTest = HTRIGHT; +//DEL else if(inPoint.yConnectEnable()) + { + theNet2.LockTranslator(); + try + { + Handle = pSession->AddUserReply(m_User.GetGlobalID(),1); + if(Handle) + { + m_bAddUserCommand = TRUE; + Block(); + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + } + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + theNet2.UnlockTranslator(); + } + ///else + //{ + // MessageBox("Error: No Connection","Can't add user",MB_OK|MB_ICONSTOP); + //} + } +} + +void CAddUserRequest::OnClickMcdeny() +{ + OnDany(); +} + +void CAddUserRequest::OnClickMcadd() +{ + OnAuthorizationRequest(); +} + +void CAddUserRequest::OnClickMcdetails() +{ + OnGetuserdetailsButton(); +} + +//DEL BOOL CAddUserRequest::OnEraseBkgnd(CDC* pDc) +//DEL { +//DEL return TRUE; +//DEL } + +void CAddUserRequest::OnMcUserDetails() +{ + OnGetuserdetailsButton(); +} + +void CAddUserRequest::OnMcAddToContact() +{ + OnAuthorizationRequest(); +} + +void CAddUserRequest::OnMcAccept() +{ + if(!Handle) + { + if(pMessenger->ConnectEnable()) + { + theNet2.LockTranslator(); + try + { + Handle = pSession->AddUserReply(m_User.GetGlobalID(),1); + if(Handle) + { + m_bAddUserCommand = TRUE; + Block(); + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + } + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + theNet2.UnlockTranslator(); + } + ///else + //{ + // MessageBox("Error: No Connection","Can't add user",MB_OK|MB_ICONSTOP); + //} + } +} + +void CAddUserRequest::OnMcDeny() +{ + OnDany(); +} + +void CAddUserRequest::InitMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + CComPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + LPUNKNOWN pInterEvent = GetInterface(&IID_IUnknown); + hr = m_pSessionConnectionPoint->Advise(pInterEvent ,&m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + +void CAddUserRequest::CloseMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + CComPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + hr = m_pSessionConnectionPoint->Unadvise(m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + + +void CAddUserRequest::OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow) +{ + *pShow = 0; + + HRESULT hr = S_OK; + HINSTANCE hinstSHDOCLC; + HWND hwnd; + HMENU hMenu; + + CComPtr spCT; + CComPtr spWnd; + + hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT); + if(SUCCEEDED(hr)) + { + hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd); + if(SUCCEEDED(hr)) + { + hr = spWnd->GetWindow(&hwnd); + + if(SUCCEEDED(hr)) + { + hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); + + hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(24641)); + + hMenu = GetSubMenu(hMenu, 4); + + int iSelection = ::TrackPopupMenu(hMenu, + TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, x, y, 0, hwnd, (RECT*)NULL); + + // Пересылаем выбранную команду окну броузера + LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); + + FreeLibrary(hinstSHDOCLC); + } + } + } +} + +void CAddUserRequest::OnWebDocumentCompleted(IDispatch *pDisp, VARIANT *URL) +{ + // Step1. Получить HTML Document [5/7/2002] + CComPtr pHtmlDoc; + pHtmlDoc.Attach((IHTMLDocument2*)m_edit.GetDocument()); + + // Step 2. Try Load HTML to WebBrowser + CComPtr pPersistStream = NULL; + + if(pHtmlDoc&&m_bsHTML.Length()) + { + HRESULT hr = pHtmlDoc->QueryInterface(IID_IPersistStreamInit,(void**)&pPersistStream); + if(SUCCEEDED(hr)) + { + hr = pPersistStream->InitNew(); + + HGLOBAL hMem = NULL; + + ULONG StrRealSize = (m_bsHTML.Length()+1)*2; + hMem = GlobalAlloc(GPTR, StrRealSize+2); + LPBYTE pBuf = (LPBYTE)GlobalLock(hMem); + ////////////////////////////////////////////////////////////////////////// + // !!! CAUTION [6/18/2002] + // Обязательно добавлять, перед Unicode - данными, + // иначе IE не правильно будет определять, не английские Unicode символы. + // !!! CAUTION [6/18/2002] + ////////////////////////////////////////////////////////////////////////// + pBuf[0]=0xFF; + pBuf[1]=0xFE; + ////////////////////////////////////////////////////////////////////////// + memcpy((LPVOID)(pBuf+2),(void*)m_bsHTML,StrRealSize); + ////////////////////////////////////////////////////////////////////////// + GlobalUnlock(hMem); + + CComPtr pDataStream = NULL; + CreateStreamOnHGlobal(hMem,TRUE,&pDataStream); + + hr = pPersistStream->Load(pDataStream); + + } + m_bsHTML.Empty(); + } +} diff --git a/Source/Client/IM-Client/IMClient/AddUserRequest.h b/Source/Client/IM-Client/IMClient/AddUserRequest.h new file mode 100644 index 0000000..2af72b4 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/AddUserRequest.h @@ -0,0 +1,116 @@ +//{{AFX_INCLUDES() +#include "webbrowser2.h" +//}}AFX_INCLUDES +#if !defined(AFX_ADDUSERREQUEST_H__EDC9A951_2F0D_4865_9669_395BDA4E8E64__INCLUDED_) +#define AFX_ADDUSERREQUEST_H__EDC9A951_2F0D_4865_9669_395BDA4E8E64__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// AddUserRequest.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CAddUserRequest dialog +#include "OfsNcDlg.h" +#include "ResizableImage.h" +#include "McButton.h" +#include "Label.h" + +//#include ".\\OFSDhtmlEditCtrl\\OFSDhtmlCtrl.h" +#include "user.h" // Added by ClassView + +class CMainDlg; + + +class CAddUserRequest : public CResizableDialog +{ +// Construction +public: + CAddUserRequest(CMainDlg* pParent); // standard constructor + + void SetSender(CUser &user, BSTR Data); +// Dialog Data + //{{AFX_DATA(CAddUserRequest) + enum { IDD = IDD_ADDUSERREQUEST_DIALOG }; + CStatic m_frameEdit; + CLabel m_Nick; + CButton m_Accept; + CButton m_Deny; + CButton m_Details; + CButton m_AddToContact; + CWebBrowser2 m_edit; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CAddUserRequest) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation + +public: + CString GetMessageText(); + CUser m_User; +protected: + void InitMpaWebEvent(); + void CloseMpaWebEvent(); + + IMpaWebCustomizerPtr m_pWebCustomizer; + DWORD m_dwSessionCookie; + CComBSTR m_bsHTML; + + BOOL m_bAddUserCommand; + void KillWindow(); + CMainDlg *pMessenger; + ISessionPtr pSession; + long Handle; + void UnBlock(); + void Block(); + //COfsDhtmlEditCtrl m_edit; + BOOL bIsKillWinodow; + // Generated message map functions + //{{AFX_MSG(CAddUserRequest) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnDany(); + afx_msg void OnEditmenuCopy(); + afx_msg void OnUpdateEditmenuCopy(CCmdUI* pCmdUI); + afx_msg void OnEditmenuCut(); + afx_msg void OnUpdateEditmenuCut(CCmdUI* pCmdUI); + afx_msg void OnEditmenuDelete(); + afx_msg void OnUpdateEditmenuDelete(CCmdUI* pCmdUI); + afx_msg void OnEditmenuPast(); + afx_msg void OnUpdateEditmenuPast(CCmdUI* pCmdUI); + afx_msg void OnAuthorizationRequest(); + afx_msg void OnGetuserdetailsButton(); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnClickMcclose(); + afx_msg void OnClickMcmini(); + afx_msg void OnClickMcaccept(); + afx_msg void OnClickMcdeny(); + afx_msg void OnClickMcadd(); + afx_msg void OnClickMcdetails(); + afx_msg void OnMcUserDetails(); + afx_msg void OnMcAddToContact(); + afx_msg void OnMcAccept(); + afx_msg void OnMcDeny(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + LRESULT OnNetEvent(WPARAM w,LPARAM l); + afx_msg void OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow); + void OnWebDocumentCompleted(IDispatch* pDisp, VARIANT* URL); + DECLARE_INTERFACE_MAP() + DECLARE_DISPATCH_MAP() + + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_ADDUSERREQUEST_H__EDC9A951_2F0D_4865_9669_395BDA4E8E64__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/Chat.cpp b/Source/Client/IM-Client/IMClient/Chat.cpp new file mode 100644 index 0000000..4421b92 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Chat.cpp @@ -0,0 +1,663 @@ +// Chat.cpp: implementation of the CChat class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "ofstv.h" +#include "Chat.h" +#include "SupportXMLFunction.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +static CMapStringToPtr globalWndMsgChatMap; + +CChat::CChat() +{ + m_pChat = NULL; + m_lChatStatus = SC_INACTIVE; + m_lTID = 0; +// m_hWndMsgChat = NULL; +} + +CChat::~CChat() +{ + +} + +CChat::CChat(const CChat &srcChat) +{ + *this = srcChat; +} + +CChat::CChat(IChat *pChat) +{ + m_pChat = pChat; + m_lChatStatus = SC_INACTIVE; + m_lTID = 0; + + m_pHistoryXML = NULL; +} + +const CChat& CChat::operator=(const CChat &pSrc) +{ + m_bsId.Empty(); + + m_pChat = pSrc.m_pChat; + m_lChatStatus = pSrc.m_lChatStatus; + m_lTID = pSrc.m_lTID; + + m_pHistoryXML = pSrc.m_pHistoryXML; + +// m_hWndMsgChat = pSrc.m_hWndMsgChat; + + m_ContactList.Clear(); + + POSITION pos = const_cast(pSrc).m_ContactList.InitIteration(); + + CUser *pUser = NULL; + + while(const_cast(pSrc).m_ContactList.GetNext(pos,pUser)) + { + m_ContactList.SetAt(*pUser); + } + + return *this; +} + + +BOOL CChat::operator ==(const CChat &pSrc) const +{ + if(GetInterface()==NULL&&pSrc.GetInterface()==NULL) + return TRUE; + + return GetId()==pSrc.GetId(); +} + +BOOL CChat::operator !=(const CChat &pSrc) const +{ + return !(operator==(pSrc)); +} + +void CChat::Attach(IChat* pChat) +{ + m_pChat = NULL; + m_lChatStatus = SC_INACTIVE; + m_lTID = 0; + m_pHistoryXML = NULL; + //m_hWndMsgChat = NULL; + + m_ContactList.Clear(); + + m_bsId.Empty(); + + m_pChat.Attach(pChat); +} + +IChat* CChat::Detach() +{ + m_bsId.Empty(); + m_lChatStatus = SC_INACTIVE; + m_lTID = 0; + m_pHistoryXML = NULL; + //m_hWndMsgChat = NULL; + + m_ContactList.Clear(); + + return m_pChat.Detach(); +} + +IChat* CChat::operator->() const +{ + return m_pChat.operator->(); +} + +const CComPtr& CChat::GetInterface() const +{ + return m_pChat; +} + +HRESULT CChat::GetValueBSTR(BSTR ValName, BSTR* pOut) const +{ + HRESULT hr = S_OK; + + CComVariant varData; + hr = GetValue(ValName,&varData); + if(hr==S_OK) + { + hr = varData.ChangeType(VT_BSTR); + if(hr==S_OK) + *pOut = SysAllocString(varData.bstrVal); + } + return hr; +} + +HRESULT CChat::GetValueLONG(BSTR ValName, LONG* pOut) const +{ + HRESULT hr = S_OK; + + CComVariant varData; + hr = GetValue(ValName,&varData); + if(hr==S_OK) + { + hr = varData.ChangeType(VT_I4); + if(hr==S_OK) + *pOut = varData.lVal; + } + return hr; +} + +HRESULT CChat::GetValue(BSTR ValName, VARIANT* pOut) const +{ + HRESULT hr = S_OK; + if(m_pChat) + { + hr = m_pChat->get_Value(ValName,pOut); + } + return hr; +} + + + +CComBSTR CChat::GetId() const +{ + if(!m_bsId) + GetValueBSTR(CComBSTR(L"@cid"),&(const_cast(this)->m_bsId)); + return m_bsId; +} + +CComBSTR CChat::GetName() const +{ + CComBSTR bsName; + GetValueBSTR(CComBSTR(L"name"),&bsName); + return bsName; +} + +CComBSTR CChat::GetDescription() const +{ + CComBSTR bsDescription; + GetValueBSTR(CComBSTR(L"descr"),&bsDescription); + return bsDescription; +} + +LONG CChat::GetOwnerId() const +{ + LONG lOwnerId = 0; + GetValueLONG(CComBSTR(L"owner"),&lOwnerId); + return lOwnerId; +} + +LONG CChat::GetTime() const +{ + LONG lTime = 0; + GetValueLONG(CComBSTR(L"time"),&lTime); + return lTime; +} + +LONG CChat::GetStatus() +{ + return m_lChatStatus; +} + +LONG CChat::GetTID() +{ + return m_lTID; +} + +LONG CChat::SetTID(LONG newVal) +{ + LONG oldVal = m_lTID; + m_lTID = newVal; + return oldVal; +} + +CString CChat::GetShowName() const +{ + USES_CONVERSION; + CString strFormat = GetString(IDS_CHAT_SHOW_NAME); + + CString retVal; + retVal.Format(strFormat,W2CT(GetName())); + + return retVal; +} + +LONG CChat::SetStatus(LONG newVal) +{ + LONG oldVal = m_lChatStatus; + m_lChatStatus = newVal; + return oldVal; + +} + +void CChat::LoadUser(IUsers *pUsers) +{ + long iArraySize = 0L; + + HRESULT hr = pUsers->get_Count(&iArraySize); + + for(long i=1;i<=iArraySize;i++) + { + CUser user(pUsers->GetItem(i)); + m_ContactList.SetAt(user); + } +} + +CUserCollection& CChat::GetUsers() +{ + return m_ContactList; +} + +BOOL CChat::LoadMessages(LPCTSTR UserRole, int UserId, BSTR bsChatMessages) +{ + if(m_pHistoryXML==NULL) + m_pHistoryXML.CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER); + /* Messages XML Format ... + + + + Employee + UserTwo + + 54353543 + + .. * + + + ... + + */ + VARIANT_BOOL vbLoad = VARIANT_FALSE; + m_pHistoryXML->loadXML(bsChatMessages,&vbLoad); + + if(vbLoad==VARIANT_TRUE) + { + // Confert time to Str + CComPtr pMessList = NULL; + m_pHistoryXML->selectNodes(CComBSTR(L"//mess"),&pMessList); + + if(pMessList) + { + long listLength = 0; + pMessList->get_length(&listLength); + for(long lHodeIndex = 0;lHodeIndex pMessNode=NULL; + pMessList->get_item(lHodeIndex,&pMessNode); + if(pMessNode) + { + CComPtr pTimeNode = NULL; + pMessNode->selectSingleNode(CComBSTR(L"time"),&pTimeNode); + + if(pTimeNode) + { + CComBSTR bsText; + pTimeNode->get_text(&bsText); + + long lTime = _wtol(bsText); + + if(lTime) + { + CTime Time(lTime); + + SYSTEMTIME sysTime = {0}; + TCHAR szDate[MAX_PATH]=_T(""), szTime[MAX_PATH]=_T(""); + + Time.GetAsSystemTime(sysTime); + + GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&sysTime,NULL,szDate,MAX_PATH); + GetTimeFormat(LOCALE_USER_DEFAULT,NULL,&sysTime,NULL,szTime,MAX_PATH); + + CString strDataFormat; + strDataFormat.Format(_T("%s %s"),szDate,szTime); + + CComBSTR bsStrTime; + bsStrTime.Attach(strDataFormat.AllocSysString()); + + //pTimeNode->put_text(bsStrTime); + + //CComPtr pTimeParantNode = NULL; + + //pTimeNode->get_parentNode(&pTimeParantNode); + + insertSingleNode(pMessNode,CComBSTR(L"show_time"),NULL,bsStrTime); + } + } + + if(UserId) + { + CComPtr pUserIdNode = NULL; + + pMessNode->selectSingleNode(CComBSTR(L"user"),&pUserIdNode); + + if(pUserIdNode) + { + CComVariant varID; + GetAttribute(pUserIdNode,CComBSTR(L"id"),&varID); + + varID.ChangeType(VT_I4); + + DWORD dwColor = 0; + + if(GetColorFromColorStorage(UserRole, UserId,varID.lVal,dwColor)) + { + //Color = RGB(GetBValue(dwColor),GetGValue(dwColor),GetRValue(dwColor)); + + WCHAR wsBuff[100]; + swprintf(wsBuff,L"%02X%02X%02X",GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); + //_ultow(dwColor,wsBuff,16); + + insertSingleNode(pMessNode,CComBSTR(L"color"),NULL,CComBSTR(wsBuff)); + } + else + { + ASSERT(FALSE); + } + } + } + } + } + } + } + else + { + m_pHistoryXML->loadXML(CComBSTR(L""),&vbLoad); + } + +#ifdef _DEBUG + m_pHistoryXML->save(CComVariant(L"c:\\log_chatmess.xml")); +#endif + + return (vbLoad==VARIANT_TRUE)?TRUE:FALSE; +} + +BOOL CChat::GetMessages(BSTR *pbsMessages) +{ + if(m_pHistoryXML==NULL) + return FALSE; + + return (m_pHistoryXML->get_xml(pbsMessages)==S_OK)?TRUE:FALSE; +} + +BOOL CChat::AddNewMessages(BSTR bsMessages) +{ + if(m_pHistoryXML==NULL) + { + return LoadMessages(NULL,0,bsMessages); + } + + CComPtr pNewMessages; + pNewMessages.CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER); + + VARIANT_BOOL vbLoad = VARIANT_FALSE; + pNewMessages->loadXML(bsMessages,&vbLoad); + if(vbLoad==VARIANT_FALSE) + return FALSE; + + // Step 1. Check Message By Message Id [8/15/2002] + CComPtr pNodes = NULL; + pNewMessages->selectNodes(CComBSTR(L"log/mess"),&pNodes); + if(pNodes) + { + long listLength = 0; + pNodes->get_length(&listLength); + + CComPtr pHistoryLogNode = NULL; + m_pHistoryXML->selectSingleNode(CComBSTR(L"log"),&pHistoryLogNode); + + for(int iNodeInedex = 0;iNodeInedex pNode = NULL, pIdNode = NULL, pResultNode = NULL; + pNodes->get_item(iNodeInedex,&pNode); + if(pNode) + { + CComBSTR bsId; + GetTextByPath(pNode,CComBSTR(L"id"),&bsId); + + CComBSTR bsQueryString = L"mess[id=\""; + bsQueryString += bsId; + bsQueryString += L"\"]"; + + pHistoryLogNode->selectSingleNode(bsQueryString,&pResultNode); + + if(!pResultNode) + { + // Step 2. If need add new message, add message and return TRUE; + pHistoryLogNode->appendChild(pNode,NULL); + } + } + + } + } + +#ifdef _DEBUG + m_pHistoryXML->save(CComVariant(L"c:\\log_chatmess.xml")); +#endif + + return TRUE; +} + +HWND CChat::GetChatWindow() +{ + HWND result = NULL; + + USES_CONVERSION; + LPCTSTR szId = W2CT(GetId()); + if(szId) + result = (HWND)globalWndMsgChatMap[szId]; + + return result; +} + +HWND CChat::SetChatWindow(HWND hWnd) +{ + USES_CONVERSION; + + LPCTSTR strId = W2CT(GetId()); + + HWND OldhWnd = (HWND)globalWndMsgChatMap[strId]; + globalWndMsgChatMap[strId] = hWnd; + + return OldhWnd; +} + +LPDISPATCH CChat::GetMessagesInterface() +{ + if(m_pHistoryXML==NULL) + { + LoadMessages(NULL,0,NULL); + } + + return (LPDISPATCH)m_pHistoryXML; +} + +void CChat::AddNewEvent(DWORD dwId, BSTR FirstName, BSTR LastName, BSTR bsMessage, DWORD dwTime, DWORD dwColor) +{ + if(m_pHistoryXML==NULL) + { + LoadMessages(NULL,0,NULL); + } + +/* + + + + +Employee +UserTwo + +54353543 + +.. + + + + */ + if(m_pHistoryXML) + { + CComPtr pHistoryLogNode = NULL; + m_pHistoryXML->selectSingleNode(CComBSTR(L"log"),&pHistoryLogNode); + if(pHistoryLogNode) + { + CComPtr pNewHistoryEventNode = NULL; + insertSingleNode(pHistoryLogNode,CComBSTR(L"event"),NULL,NULL,&pNewHistoryEventNode); + if(pNewHistoryEventNode) + { + WCHAR wsBuf[100]; + _ltow(dwId,wsBuf,10); + + //CComVariant varId = (BSTR)wsBuf; + + //SetAttribute(pNewHistoryEventNode,CComBSTR(L"id"),varId); + + insertSingleNode(pNewHistoryEventNode,CComBSTR(L"id"),NULL,CComBSTR(wsBuf)); + + CComPtr pHistoryEventUserNode = NULL; + insertSingleNode(pNewHistoryEventNode,CComBSTR(L"user"),NULL,NULL,&pHistoryEventUserNode); + if(pHistoryEventUserNode) + { + insertSingleNode(pHistoryEventUserNode,CComBSTR(L"first_name"),NULL,FirstName); + insertSingleNode(pHistoryEventUserNode,CComBSTR(L"last_name"),NULL,LastName); + } + insertSingleNode(pNewHistoryEventNode,CComBSTR(L"body"),NULL,bsMessage); + + CTime Time((time_t)dwTime); + + SYSTEMTIME sysTime = {0}; + TCHAR szDate[MAX_PATH]=_T(""), szTime[MAX_PATH]=_T(""); + + Time.GetAsSystemTime(sysTime); + + GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&sysTime,NULL,szDate,MAX_PATH); + GetTimeFormat(LOCALE_USER_DEFAULT,NULL,&sysTime,NULL,szTime,MAX_PATH); + + CString strDataFormat; + strDataFormat.Format(_T("%s %s"),szDate,szTime); + + CComBSTR bsStrTime; + bsStrTime.Attach(strDataFormat.AllocSysString()); + + insertSingleNode(pNewHistoryEventNode,CComBSTR(L"show_time"),NULL,bsStrTime); + + WCHAR wsBuff[100] = L""; + + _ltow((time_t)dwTime,wsBuff,10); + + insertSingleNode(pNewHistoryEventNode,CComBSTR(L"time"),NULL,CComBSTR(wsBuff)); + + //WCHAR wsBuff[100]; + swprintf(wsBuff,L"%02X%02X%02X",GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); + + insertSingleNode(pNewHistoryEventNode,CComBSTR(L"color"),NULL,CComBSTR(wsBuff)); + } + } + } +} + +void CChat::RefreshColors(LPCTSTR UserRole, int UserId) +{ + if(m_pHistoryXML) + { + // Refresh Messages [8/29/2002] + CComPtr pMessNodeList = NULL; + + m_pHistoryXML->selectNodes(CComBSTR(L"log/mess"),&pMessNodeList); + if(pMessNodeList) + { + long lMessNodeListLength = 0; + pMessNodeList->get_length(&lMessNodeListLength); + + for(long lMessNodeIndex = 0 ; lMessNodeIndex pMessNode = NULL; + pMessNodeList->get_item(lMessNodeIndex,&pMessNode); + if(pMessNode) + { + CComPtr pMessUserNode = NULL; + + CheckNodeByPath(pMessNode,CComBSTR(L"user"),&pMessUserNode); + + if(pMessUserNode) + { + CComVariant varId; + GetAttribute(pMessUserNode,CComBSTR(L"id"),&varId); + if(varId.ChangeType(VT_I4)==S_OK) + { + DWORD dwColor = 0; + if(GetColorFromColorStorage(UserRole, UserId, varId.lVal,dwColor)) + { + WCHAR wsBuff[100]; + swprintf(wsBuff,L"%02X%02X%02X",GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); + + CComPtr pMessColorNode = NULL; + CheckNodeByPath(pMessNode,CComBSTR(L"color"),&pMessColorNode); + + if(pMessColorNode) + { + pMessColorNode->put_text(CComBSTR(wsBuff)); + } + } + else + { + ASSERT(FALSE); + } + } + } + } + } + } + // Refresh Events [8/29/2002] + CComPtr pEventNodeList = NULL; + + m_pHistoryXML->selectNodes(CComBSTR(L"log/event"),&pEventNodeList); + if(pEventNodeList) + { + long lEventNodeListLength = 0; + pEventNodeList->get_length(&lEventNodeListLength); + + for(long lEventNodeIndex = 0 ; lEventNodeIndex pEventNode = NULL; + pEventNodeList->get_item(lEventNodeIndex,&pEventNode); + if(pEventNode) + { + CComBSTR bsId; + GetTextByPath(pEventNode,CComBSTR(L"id"),&bsId); + + DWORD dwColor = 0; + + if(GetColorFromColorStorage(UserRole, UserId, _wtol(bsId),dwColor)) + { + WCHAR wsBuff[100]; + swprintf(wsBuff,L"%02X%02X%02X",GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); + + CComPtr pEventColorNode = NULL; + CheckNodeByPath(pEventNode,CComBSTR(L"color"),&pEventColorNode); + + if(pEventColorNode) + { + pEventColorNode->put_text(CComBSTR(wsBuff)); + } + } + else + { + ASSERT(FALSE); + } + + } + } + } + } +} + + +void CChat::SetInterface(IChat *pChat) +{ + m_pChat = pChat; +} diff --git a/Source/Client/IM-Client/IMClient/Chat.h b/Source/Client/IM-Client/IMClient/Chat.h new file mode 100644 index 0000000..232797b --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Chat.h @@ -0,0 +1,68 @@ +// Chat.h: interface for the CChat class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_CHAT_H__E733705A_5AAB_4B44_A20D_627833E824E6__INCLUDED_) +#define AFX_CHAT_H__E733705A_5AAB_4B44_A20D_627833E824E6__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "UserCollection.h" + +class CChat +{ +public: + CChat(const CChat &srcChat); + CChat(IChat* pChat); + CChat(); + virtual ~CChat(); +public: + IChat* Detach(); + void Attach(IChat* pChat); +public: + void SetInterface(IChat *pChat); + void RefreshColors(LPCTSTR UserRole, int UserId); + HWND GetChatWindow(); + HWND SetChatWindow(HWND hWnd); + void AddNewEvent(DWORD dwId, BSTR FirstName, BSTR LastName, BSTR bsMessage, DWORD dwTime, DWORD dwColor); + LPDISPATCH GetMessagesInterface(); + BOOL AddNewMessages(BSTR bsMessages); + BOOL GetMessages(BSTR* pbsMessages); + BOOL LoadMessages(LPCTSTR UserRole, int UserId, BSTR bsChatMessages); + CUserCollection& GetUsers(); + void LoadUser(IUsers* pUsers); + LONG SetStatus(LONG newVal); + CString GetShowName() const; + LONG SetTID(LONG newVal); + LONG GetTID(); + LONG GetStatus(); + LONG GetTime() const; + LONG GetOwnerId() const; + CComBSTR GetDescription() const; + CComBSTR GetName() const; + CComBSTR GetId() const; + HRESULT GetValueBSTR(BSTR ValName, BSTR* pOut) const; + HRESULT GetValueLONG(BSTR ValName, LONG* pOut) const; + HRESULT GetValue(BSTR ValName, VARIANT* pOut) const; + const CComPtr& GetInterface() const; + const CChat& operator=(const CChat &pSrc); + BOOL operator==(const CChat &pSrc) const; + BOOL operator!=(const CChat &pSrc) const; + IChat* operator->() const; +private: + CComPtr m_pChat; + CComBSTR m_bsId; + LONG m_lChatStatus; + LONG m_lTID; + CUserCollection m_ContactList; + //HWND m_hWndDelChat; + //HWND m_hWndMsgChat; + + CComPtr m_pHistoryXML; + + +}; + +#endif // !defined(AFX_CHAT_H__E733705A_5AAB_4B44_A20D_627833E824E6__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/ChatCreateDlg.cpp b/Source/Client/IM-Client/IMClient/ChatCreateDlg.cpp new file mode 100644 index 0000000..a859389 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ChatCreateDlg.cpp @@ -0,0 +1,883 @@ +// ChatCreateDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "ChatCreateDlg.h" +#include "MainDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CChatCreateDlg dialog + + +CChatCreateDlg::CChatCreateDlg(CMainDlg *pMsgParent,CWnd* pParent /*=NULL*/) +: COFSNcDlg2(CChatCreateDlg::IDD, pParent) +{ + m_pMessenger = pMsgParent; + m_DlgMode = CCDM_CREATE; + //{{AFX_DATA_INIT(CChatCreateDlg) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_strSkinSettings = _T("/Shell/Conference/Create/skin_create.xml"); + m_bResizable = FALSE; + + bIsKillWinodow = FALSE; + m_lHandle = 0; +} + + +void CChatCreateDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CChatCreateDlg) + DDX_Control(pDX, IDC_EDIT_INVITATION, m_edInvit); + DDX_Control(pDX, IDC_EDIT_DESCR, m_edDescr); + DDX_Control(pDX, IDC_EDIT_NAME, m_edName); + DDX_Control(pDX, IDC_BTN_CREATE, m_btnCreate); + DDX_Control(pDX, IDC_X, m_btnX); + DDX_Control(pDX, IDC_USER_LIST, m_treebox); + DDX_Control(pDX, IDC_BTN_INVITE, m_btnInvite); + DDX_Control(pDX, IDC_BTN_UPDATE, m_btnUpdate); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CChatCreateDlg, COFSNcDlg2) + //{{AFX_MSG_MAP(CChatCreateDlg) + ON_BN_CLICKED(IDOK, OnOk) + ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CChatCreateDlg message handlers + +BEGIN_EVENTSINK_MAP(CChatCreateDlg, COFSNcDlg2) + //{{AFX_EVENTSINK_MAP(CChatCreateDlg) + ON_EVENT(CChatCreateDlg, IDC_BTN_CREATE, -600 /* Click */, OnClickBtnCreate, VTS_NONE) + ON_EVENT(CChatCreateDlg, IDC_X, -600 /* Click */, OnClickBtnX, VTS_NONE) + ON_EVENT(CChatCreateDlg, IDC_BTN_INVITE, -600 /* Click */, OnClickBtnInvite, VTS_NONE) + ON_EVENT(CChatCreateDlg, IDC_BTN_UPDATE, -600 /* Click */, OnClickBtnUpdate, VTS_NONE) + ON_EVENT(CChatCreateDlg, IDC_USER_LIST, 3 /* Action */, OnActionCcootreectrl, VTS_I4 VTS_BOOL) + ON_EVENT(CChatCreateDlg, IDC_USER_LIST, 4 /* DoDrop */, OnDoDropCcootreectrl, VTS_I4 VTS_BOOL VTS_UNKNOWN VTS_I4 VTS_I4) + ON_EVENT(CChatCreateDlg, IDC_USER_LIST, 1 /* Menu */, OnMenuCcootreectrl, VTS_I4 VTS_BOOL) + ON_EVENT(CChatCreateDlg, IDC_USER_LIST, 2 /* Select */, OnSelectCcootreectrl, VTS_I4 VTS_BOOL) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +void CChatCreateDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Create"), &m_btnCreate, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Invite"), &m_btnInvite, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Update"), &m_btnUpdate, TRUE, FALSE); + + LoadRectangle(pXmlRoot, _T("EditName"), &m_edName, TRUE); + LoadRectangle(pXmlRoot, _T("EditDescription"), &m_edDescr, TRUE); + LoadRectangle(pXmlRoot, _T("Users"), &m_treebox, TRUE); + LoadRectangle(pXmlRoot, _T("EditInvitation"), &m_edInvit, TRUE); +} + + +BOOL CChatCreateDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + m_pSession = theNet2.GetSession(); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + CString strText; + + switch(m_DlgMode) + { + case CCDM_CREATE: + SetWindowText(GetString(IDS_CREATE_NEW_CONFERENCE)); + break; + case CCDM_UPDATE: + strText.Format(GetString(IDS_UPDATE_CONFERENCE),m_strConferenceName); + SetWindowText(strText); + break; + case CCDM_INVITE: + strText.Format(GetString(IDS_INVITE_CONFERENCE),m_strConferenceName); + SetWindowText(strText); + break; + case CCDM_DETAIL: + strText.Format(GetString(IDS_DETAILS_CONFERENCE),m_strConferenceName); + SetWindowText(strText); + break; + default: + ASSERT(FALSE); + } + + CreateTree(); + + // TODO: Add extra initialization here + UpdateControls(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CChatCreateDlg::OnOk() +{ +} + +void CChatCreateDlg::OnCancel() +{ + if((m_lHandle==0L)||!m_pMessenger->ConnectEnable()) + { + KillWindow(); + return; + } + m_pSession->CancelOperation(m_lHandle); +} + +void CChatCreateDlg::OnClickBtnX() +{ + OnCancel(); +} + +void CChatCreateDlg::UpdateControls() +{ + m_btnCreate.ShowWindow(m_DlgMode==CCDM_CREATE?SW_SHOW:SW_HIDE); + m_btnInvite.ShowWindow(m_DlgMode==CCDM_INVITE?SW_SHOW:SW_HIDE); + m_btnUpdate.ShowWindow(m_DlgMode==CCDM_UPDATE?SW_SHOW:SW_HIDE); + + switch(m_DlgMode) + { + case CCDM_CREATE: + //m_edInvit.EnableWindow(FALSE); + break; + case CCDM_UPDATE: + m_treebox.EnableWindow(FALSE); + m_edInvit.EnableWindow(FALSE); + break; + case CCDM_INVITE: + m_edDescr.EnableWindow(FALSE); + m_edName.EnableWindow(FALSE); + break; + case CCDM_DETAIL: + m_edDescr.EnableWindow(FALSE); + m_edName.EnableWindow(FALSE); + m_treebox.EnableWindow(FALSE); + m_edInvit.EnableWindow(FALSE); + break; + default: + ASSERT(FALSE); + } +} + +void CChatCreateDlg::OnClickBtnCreate() +{ + UpdateData(TRUE); + + if(m_pMessenger->ConnectEnable() && !m_lHandle) + { + CString strName, strDescription; + m_edName.GetWindowText(strName); + m_edDescr.GetWindowText(strDescription); + + if(!strName.IsEmpty()) + { + + theNet2.LockTranslator(); + try + { + m_bsChatId = (BSTR)GUIDGen(); + m_lHandle = m_pSession->CreateChat((BSTR)m_bsChatId,_bstr_t((LPCTSTR)strName),_bstr_t((LPCTSTR)strDescription)); + if(m_lHandle) + { + Block(); + theNet2.AddToTranslator(m_lHandle,GetSafeHwnd()); + } + + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + else + { + MessageBox(GetString(IDS_INVALID_CONFERENCE_NAME),GetString(IDS_ERROR_TITLE)); + } + } +} + +void CChatCreateDlg::OnClickBtnInvite() +{ + UpdateData(TRUE); + + if(m_pMessenger->ConnectEnable() && !m_lHandle) + { + if(!EnableRecepients()) + return; + + CChat Chat; + + if(m_pMessenger->FindChatByGlobalId(m_bsChatId,Chat)) + { + CString strInivation; + m_edInvit.GetWindowText(strInivation); + + theNet2.LockTranslator(); + try + { + POSITION pos = m_UserList.InitIteration(); + + CUser *pRecipient = NULL; + + while(m_UserList.GetNext(pos,pRecipient)) + { + if(pRecipient->m_bHasNewMessages) + { + Chat->AddUser(pRecipient->GetGlobalID()); + } + } + + m_lHandle = Chat->Invite(_bstr_t(LPCTSTR(strInivation))); + + if(m_lHandle) + { + Block(); + theNet2.AddToTranslator(m_lHandle,GetSafeHwnd()); + } + + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + } +} + +void CChatCreateDlg::OnClickBtnUpdate() +{ + UpdateData(TRUE); + + if(m_pMessenger->ConnectEnable() && !m_lHandle) + { + CChat Chat; + + if(m_pMessenger->FindChatByGlobalId(m_bsChatId,Chat)) + { + CString strName, strDescription; + m_edName.GetWindowText(strName); + m_edDescr.GetWindowText(strDescription); + + if(!strName.IsEmpty()) + { + theNet2.LockTranslator(); + try + { + m_lHandle = Chat->Edit(_bstr_t((LPCTSTR)strName),_bstr_t((LPCTSTR)strDescription)); + if(m_lHandle) + { + Block(); + theNet2.AddToTranslator(m_lHandle,GetSafeHwnd()); + } + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + else + { + MessageBox(GetString(IDS_INVALID_CONFERENCE_NAME),GetString(IDS_ERROR_TITLE)); + } + } + else + { + // Error Message ... + } + } +} + + +BOOL CChatCreateDlg::Create(CChatCreateDlg::ChatCreateDlgMode DlgMode, LPCTSTR strName, + LPCTSTR strDescription, + LPCTSTR strInvite, + CUserCollection *pUsers, BSTR bsChatId) +{ + switch(DlgMode) + { + case CCDM_CREATE : + m_strSkinSettings = _T("/Shell/Conference/Create/skin_create.xml"); + break; + case CCDM_UPDATE: + m_strSkinSettings = _T("/Shell/Conference/Create/skin_update.xml"); + break; + case CCDM_INVITE: + m_strSkinSettings = _T("/Shell/Conference/Create/skin_invite.xml"); + break; + default: + m_strSkinSettings = _T("/Shell/Conference/Create/skin.xml"); + } + + m_strConferenceName = strName; + + m_DlgMode = (ChatCreateDlgMode)DlgMode; + + BOOL bRetValue = COFSNcDlg2::Create(CChatCreateDlg::IDD,GetDesktopWindow()); + + if(strName) + m_edName.SetWindowText(strName); + + + if(strDescription) + m_edDescr.SetWindowText(strDescription); + + if(strInvite) + m_edInvit.SetWindowText(strInvite); + + if(bsChatId) + m_bsChatId = bsChatId; + + if(pUsers) + { + // Create Contact List Copy ... + ////////////////////////////////////////////////////////////////////////// + // Копируем Контак Лист [12/21/2001] + try + { + CUser* pUser=NULL; + + if(POSITION pos = pUsers->InitIteration()) + { + for(int i=0; pUsers->GetNext(pos,pUser); i++) + { + m_UserList.SetAt(*pUser); + } + } + } + catch(...) + { + ASSERT(FALSE); + } + ////////////////////////////////////////////////////////////////////////// + + // Load User ... [8/8/2002] + + BuildTree(); + } + + return bRetValue; +} + +LRESULT CChatCreateDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(m_lHandle); + theNet2.UnlockTranslator(); + + + + switch(pItem->EventType) + { + case NLT_EChatCreate: + { + IChat *pChat = NULL; + HRESULT hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pChat); + if(hr==S_OK) + { + // Step 1. Add new Chat to ChatsCollections [8/9/2002] + m_pMessenger->AddNewChat(pChat,SC_ACTIVE); + // Step 2. Free Interface [8/9/2002] + pChat->Release(); + } + // Step 3. Close the Window + if(m_DlgMode==CCDM_CREATE&&EnableRecepients()) + { + UnBlock(); + + m_DlgMode = CCDM_INVITE; + + UpdateControls(); + + CString strText; + + strText.Format(GetString(IDS_INVITE_CONFERENCE),m_strConferenceName); + SetWindowText(strText); + + OnClickBtnInvite(); + } + else + KillWindow(); + } + break; + case NLT_ECommandOK: + switch(m_DlgMode) + { + case CCDM_CREATE: + // Step 3. Close the Window + ASSERT(FALSE); + break; + case CCDM_UPDATE: + // Step 3. Close the Window + ASSERT(FALSE); + break; + case CCDM_INVITE: + // Step 3. Close the Window + KillWindow(); + break; + default: + ASSERT(FALSE); + } + break; + case NLT_ECommandError: + // Show error dlg ... + UnBlock(); + break; + }; + delete pItem; + + return 0; +} + +void CChatCreateDlg::Block() +{ + switch(m_DlgMode) + { + case CCDM_CREATE: + m_edInvit.EnableWindow(FALSE); + m_edDescr.EnableWindow(FALSE); + m_edName.EnableWindow(FALSE); + m_btnCreate.EnableWindow(FALSE); + m_treebox.EnableWindow(FALSE); + break; + case CCDM_UPDATE: + m_edDescr.EnableWindow(FALSE); + m_edName.EnableWindow(FALSE); + m_btnUpdate.EnableWindow(FALSE); + break; + case CCDM_INVITE: + m_edInvit.EnableWindow(FALSE); + m_treebox.EnableWindow(FALSE); + m_btnInvite.EnableWindow(FALSE); + break; + default: + ASSERT(FALSE); + } +} + +void CChatCreateDlg::UnBlock() +{ + switch(m_DlgMode) + { + case CCDM_CREATE: + m_edInvit.EnableWindow(TRUE); + m_edDescr.EnableWindow(TRUE); + m_edName.EnableWindow(TRUE); + m_btnCreate.EnableWindow(TRUE); + m_treebox.EnableWindow(TRUE); + break; + case CCDM_UPDATE: + m_edDescr.EnableWindow(TRUE); + m_edName.EnableWindow(TRUE); + m_btnUpdate.EnableWindow(TRUE); + break; + case CCDM_INVITE: + m_edInvit.EnableWindow(TRUE); + m_treebox.EnableWindow(TRUE); + m_btnInvite.EnableWindow(TRUE); + break; + default: + ASSERT(FALSE); + } +} + +void CChatCreateDlg::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + + COFSNcDlg2::OnClose(); + + if(!bIsKillWinodow) + { + m_UserList.Clear(); + m_treebox.DeleteTree(); + + bIsKillWinodow = TRUE; + DestroyWindow(); + delete this; + } +} + +void CChatCreateDlg::BuildTree() +{ + m_treebox.DeleteTree(); + + m_UserCheckInGroup.RemoveAll(); + m_GroupTIDMap.RemoveAll(); + + CUser* pUser=NULL; + + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + if(POSITION pos = m_UserList.InitIteration()) + { + for(int i=0; m_UserList.GetNext(pos,pUser); i++) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + CString GroupName = pUser->m_strType; + + BOOL isCheck = FALSE;//(m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + + switch(CLMode) + { + case 1: + { + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treebox.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + } + break; + case 2: + { + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + GroupName= GetString(IDS_OFFLINE); + + if(!m_GroupTIDMap.Lookup(GetString(IDS_OFFLINE),(void*&)GroupTID)) + { + long ShablonId[10] = {0L,1L,0L,0L,0L,0L,0L,0L,0L,0L}; + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,GetString(IDS_OFFLINE),ShablonId); + m_GroupTIDMap.SetAt(GetString(IDS_OFFLINE),(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + } + else + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treebox.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + } + break; + } + + m_treebox.RootOpen(GroupTID,pUser->m_bHasNewMessages); + } + } + + UpdateGroupCheck(); + +} + +void CChatCreateDlg::UpdateGroupCheck() +{ + POSITION pos = m_UserCheckInGroup.GetStartPosition(); + while(pos) + { + CString strKey; + int Data; + m_UserCheckInGroup.GetNextAssoc(pos,strKey,(void*&)Data); + UpdateGroupID(strKey); + } +} + +void CChatCreateDlg::UpdateGroupID(LPCTSTR strName) +{ + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + if(m_UserCheckInGroup[strName]) + m_treebox.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[1]); + else + m_treebox.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[0]); +} + +void CChatCreateDlg::CreateTree() +{ + CBitmap hbmpCheckImage; + hbmpCheckImage.LoadBitmap(IDB_TREECHECK); + + m_treebox.SetImageList((long)hbmpCheckImage.Detach()); + + short PriorityIndex[10]; + for(int i=0;i<10;i++) + PriorityIndex[i] = -1; + + m_treebox.SetPriority(PriorityIndex); + + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + short m_ShablonIcon[4][10] = + { + {2,-1,-1,-1,-1,-1,-1,-1,-1,-1}, /// Группа UnCheck + {3,-1,-1,-1,-1,-1,-1,-1,-1,-1}, /// Группа Check + {2,-1,-1,-1,-1,-1,-1,-1,-1,-1}, /// User UnCheck + {3,-1,-1,-1,-1,-1,-1,-1,-1,-1} /// User Check + }; + + DWORD m_ShablonRGBTextEnable [4] = + { + RGB(0,0,100), /// Группа ... + RGB(0,0,100), /// Группа ... + RGB(0,0,0), /// User + RGB(0,0,0) /// User + }; + + DWORD m_ShablonRGBTextSelect[4] = + { + RGB(0,0,200), /// Группа ... + RGB(0,0,200), /// Группа ... + RGB(0,0,0), /// User + RGB(0,0,0) /// User + }; + + for(int i = 0 ;i<4;i++) + { + m_treebox.AddEffect(m_ShablonId[i],m_ShablonIcon[i],m_ShablonRGBTextEnable[i], + m_ShablonRGBTextSelect[i],RGB(255,255,255),RGB(200,200,200)); + } + + m_treebox.SetEventMode(1); +} + +void CChatCreateDlg::OnActionCcootreectrl(long TID, BOOL bGroupe) +{ + if(TID!= -1) + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser) + { + pUser->m_bHasNewMessages = !pUser->m_bHasNewMessages; + // Change User Check in group [2/21/2002] + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + CString strGroupName; + + switch(CLMode) + { + case 1: + { + strGroupName = pUser->m_strType; + } + break; + case 2: + { + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + strGroupName = GetString(IDS_OFFLINE); + else + strGroupName = pUser->m_strType; + } + break; + } + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])+1)); + else + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])-1)); + + UpdateGroupID(strGroupName); + // [2/21/2002] + UpdateID(pUser->GetGlobalID()); + } + } + else + { + CString strGrouName; + + POSITION pos = m_GroupTIDMap.GetStartPosition(); + while(pos) + { + CString strKey; + long Data; + m_GroupTIDMap.GetNextAssoc(pos,strKey,(void*&)Data); + if(Data==TID) + { + strGrouName = strKey; + break; + } + } + + if(!strGrouName.IsEmpty()) + { + BOOL bCheck = !((BOOL)m_UserCheckInGroup[strGrouName]); + if(POSITION pos = m_UserList.InitIteration()) + { + CUser *pUser=NULL; + + m_UserCheckInGroup.SetAt(strGrouName,(void*)0); + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + while(m_UserList.GetNext(pos,pUser)) + { + switch(CLMode) + { + case 1: + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + break; + case 2: + { + // [2/21/2002] + if(strGrouName.CompareNoCase(GetString(IDS_OFFLINE))==0&& + (pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + else if(strGrouName.CompareNoCase(pUser->m_strType)==0&& + !(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + // [2/21/2002] + } + break; + } + } + } + UpdateGroupID(strGrouName); + } + } +} + +void CChatCreateDlg::OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState) +{ + // TODO: Add your control notification handler code here + +} + +void CChatCreateDlg::OnMenuCcootreectrl(long TID, BOOL bGroupe) +{ + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser) + { + CUser User = *pUser; + m_pMessenger->ShowUserMenu(User.GetGlobalID()); + } + } +} + +void CChatCreateDlg::OnSelectCcootreectrl(long TID, BOOL bGroupe) +{ + //OnActionCcootreectrl(TID, bGroupe); +} + +void CChatCreateDlg::UpdateID(long UserId) +{ + CUser *pUser = m_UserList.GetAt(UserId); + if(pUser) + { + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + m_treebox.SetItemId(pUser->TID,m_ShablonId[pUser->m_bHasNewMessages+2]); + } +} + +CUser* CChatCreateDlg::FindUserInVisualContactList(long TID) +{ + if(POSITION pos = m_UserList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_UserList.GetNext(pos,pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + return NULL; +} + +BOOL CChatCreateDlg::EnableRecepients() +{ + CUser *pRecipient = NULL; + BOOL bEnableContactUser = FALSE; + + if(POSITION pos = m_UserList.InitIteration()) + { + while(m_UserList.GetNext(pos,pRecipient)) + { + if(pRecipient->m_bHasNewMessages) + return TRUE; + } + } + return FALSE; +} + + +//DEL void CChatCreateDlg::SetChat(const CChat &Chat) +//DEL { +//DEL +//DEL } + +void CChatCreateDlg::AutoCreate() +{ + if(IsWindow(GetSafeHwnd())) + OnClickBtnCreate(); + else + ASSERT(FALSE); +} diff --git a/Source/Client/IM-Client/IMClient/ChatCreateDlg.h b/Source/Client/IM-Client/IMClient/ChatCreateDlg.h new file mode 100644 index 0000000..9ba3035 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ChatCreateDlg.h @@ -0,0 +1,113 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +#include "ccootree.h" +//}}AFX_INCLUDES +#if !defined(AFX_CHATCREATEDLG_H__42835901_5470_407F_A3A1_47225C3E67D2__INCLUDED_) +#define AFX_CHATCREATEDLG_H__42835901_5470_407F_A3A1_47225C3E67D2__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// ChatCreateDlg.h : header file +// + +#include "OFSNcDlg2.h" +#include "UserCollection.h" + +class CMainDlg; +///////////////////////////////////////////////////////////////////////////// +// CChatCreateDlg dialog + +class CChatCreateDlg : public COFSNcDlg2 +{ +// Construction +public: + enum ChatCreateDlgMode + { + CCDM_CREATE = 0, // default + CCDM_UPDATE = 1, + CCDM_INVITE = 2, + CCDM_DETAIL = 3, + }; +public: + void AutoCreate(); + BOOL Create(CChatCreateDlg::ChatCreateDlgMode DlgMode = CCDM_CREATE, LPCTSTR strName = NULL, LPCTSTR strDescription = NULL,LPCTSTR strInvite = NULL, CUserCollection *pUsers = NULL, BSTR bsChatId = NULL); + //int DoModal(BOOL bCreate); + CChatCreateDlg(CMainDlg *pMsgParent,CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CChatCreateDlg) + enum { IDD = IDD_CHAT_CREATE }; + CEdit m_edInvit; + CEdit m_edDescr; + CEdit m_edName; + CMcButton m_btnCreate; + CMcButton m_btnX; + CCCooTree m_treebox; + CMcButton m_btnInvite; + CMcButton m_btnUpdate; + //}}AFX_DATA + + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CChatCreateDlg) +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation +protected: + BOOL EnableRecepients(); + CUser* FindUserInVisualContactList(long TID); + void UpdateID(long UserId); + void CreateTree(); + void UpdateGroupID(LPCTSTR strName); + void UpdateGroupCheck(); + void BuildTree(); + void KillWindow(); + void UnBlock(); + void Block(); + void UpdateControls(); + //BOOL m_bCreate; + void LoadSkin(IXMLDOMNode *pXmlRoot); + + // Generated message map functions + //{{AFX_MSG(CChatCreateDlg) + afx_msg void OnSelectCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnMenuCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState); + afx_msg void OnActionCcootreectrl(long TID, BOOL bGroupe); + virtual void OnCancel(); + afx_msg void OnOk(); + afx_msg LRESULT OnNetEvent(WPARAM w,LPARAM l); + afx_msg void OnClickBtnCreate(); + afx_msg void OnClickBtnX(); + virtual BOOL OnInitDialog(); + afx_msg void OnClickBtnInvite(); + afx_msg void OnClickBtnUpdate(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +private: + CMapStringToPtr m_GroupTIDMap; + CMapStringToPtr m_UserCheckInGroup; + + CMainDlg* m_pMessenger; + ISessionPtr m_pSession; + ChatCreateDlgMode m_DlgMode; + LONG m_lHandle; + CUserCollection m_UserList; + BOOL bIsKillWinodow; + + CComBSTR m_bsChatId; + + CString m_strConferenceName; + + +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CHATCREATEDLG_H__42835901_5470_407F_A3A1_47225C3E67D2__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/ChatDlg.cpp b/Source/Client/IM-Client/IMClient/ChatDlg.cpp new file mode 100644 index 0000000..73316d2 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ChatDlg.cpp @@ -0,0 +1,1962 @@ +// MessageSplitDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "MainDlg.h" +#include "ChatDlg.h" +#include "resource.h" +#include "User.h" +#include + +#include "MemDc.h" +//#include "smileyahoopopup.h" +#include "FileDescriptioDlg.h" +#include "DlgTV.h" +#include "LoadSkins.h" +#include "cdib.h" + +#include "mshtmcid.h" + +//#include "McCreateWebFolders.h" + +#include "SmileManager.h" +#include "SelectSmileDlg.h" + +extern CSmileManager CurrentSmileManager; + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +#define WM_EDIT_UPDATE WM_USER + 201 +#define WM_AUTOREFRESH + 202 +///////////////////////////////////////////////////////////////////////////// +// CChatDlg dialog +extern CString GetCurrentSkin(); + +CChatDlg::CChatDlg(CMainDlg *pMessenger,CWnd* pParent /*=NULL*/) +: COFSNcDlg2(CChatDlg::IDD, pParent) +{ + EnableAutomation(); + //{{AFX_DATA_INIT(CChatDlg) + //}}AFX_DATA_INIT + m_bDisableEditOnStart = FALSE; + m_strSkinSettings = _T("/Shell/Conference/skin.xml"); + bBlock = FALSE; + this->pMessenger = pMessenger; + Handle = 0L; + MessageTime = 0L; + bInitEdit = FALSE; + SetBoundary(0,0); + SetBoundaryColor(RGB(0,0,0)); + SetCaption(COLORREF(0), COLORREF(0), 0); + bIsKillWinodow = FALSE; + m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = FALSE; + m_bLoadSkin = FALSE; + m_dwSessionCookie = 0; + m_bEnableIfActiavte = FALSE; + m_bEnableRefresh = FALSE; + + CurrTID = -1; +} + +CChatDlg::~CChatDlg() +{ +} + + +void CChatDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CChatDlg) + DDX_Control(pDX, IDC_SENDERUSERINFO, m_SenderUserInfo); + DDX_Control(pDX, IDC_USERINFO, m_UserInfo); + DDX_Control(pDX, IDC_MCCLOSE, m_btnX); + DDX_Control(pDX, IDC_MCSEND, m_Send); + DDX_Control(pDX, IDC_MCOPTIONS, m_Options); + DDX_Control(pDX, IDC_MCMENU, m_Menu); + DDX_Control(pDX, IDC_MCMINI, m_btnMin); + DDX_Control(pDX, IDC_BTN_COLOR, m_btnColor); + DDX_Control(pDX, IDC_BTN_BOLD, m_btnBold); + DDX_Control(pDX, IDC_BTN_ITALIC, m_btnItalic); + DDX_Control(pDX, IDC_BTN_UNDERLINE, m_btnUnderline); + DDX_Control(pDX, IDC_BTN_SMILES, m_btnSmiles); + DDX_Control(pDX, IDC_EXPLORER, m_History); + DDX_Control(pDX, IDC_USER_LIST, m_treebox); + DDX_Control(pDX, IDC_BTN_USERS, m_btnUsers); + DDX_Control(pDX, IDC_BTN_FILES, m_btnFiles); + //}}AFX_DATA_MAP + //if(!IsWindow(m_InWindow.GetSafeHwnd())) + // m_InWindow.CreateAsChild(this, pMessenger); + //if(!IsWindow(m_WebFolderView.GetSafeHwnd())) + // m_WebFolderView.Create(AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(WHITE_BRUSH), NULL), + // NULL,WS_OVERLAPPED|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN,CRect(10,10,20,20),this,777); + +} + + +BEGIN_MESSAGE_MAP(CChatDlg, COFSNcDlg2) +//{{AFX_MSG_MAP(CChatDlg) +ON_WM_CREATE() +ON_BN_CLICKED(IDOK, OnOk) +ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) +//ON_BN_CLICKED(IDC_SEND_BUTTON, OnSendButton) +//ON_BN_CLICKED(IDC_COLOR_BUTTON, OnColorButton) +ON_CBN_SELENDOK(IDC_FONT_COMBO, OnSelendokFontCombo) +ON_CBN_SELENDOK(IDC_SIZE_COMBO, OnSelendokSizeCombo) +ON_COMMAND(ID_EDITMENU_COPY, OnEditmenuCopy) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_COPY, OnUpdateEditmenuCopy) +ON_COMMAND(ID_EDITMENU_CUT, OnEditmenuCut) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_CUT, OnUpdateEditmenuCut) +ON_COMMAND(ID_EDITMENU_DELETE, OnEditmenuDelete) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_DELETE, OnUpdateEditmenuDelete) +ON_COMMAND(ID_EDITMENU_PAST, OnEditmenuPast) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_PAST, OnUpdateEditmenuPast) +ON_WM_CAPTURECHANGED() +ON_WM_MOVE() +ON_WM_PAINT() +ON_WM_SETCURSOR() +ON_WM_DROPFILES() +//ON_BN_CLICKED(IDC_INSERTSMILE_CHECK, OnInsertsmileCheck) +ON_WM_ACTIVATE() +ON_MESSAGE(WM_EDIT_UPDATE,OnEditUpdate) +ON_MESSAGE(WM_AUTOREFRESH,OnAutoRefresh) +ON_WM_NCACTIVATE() +//}}AFX_MSG_MAP +//ON_MESSAGE(WM_SET_RECIPIENT,OnSetRecipient) +ON_MESSAGE(WM_SWM_REFRESH,OnSWMRefreh) +ON_MESSAGE(WM_SWM_SETBODY,OnSWMSetBody) +ON_COMMAND_RANGE(20000,20000+SmileBuffSize,OnSmileItem) +END_MESSAGE_MAP() + + +BEGIN_INTERFACE_MAP(CChatDlg, CCmdTarget) +INTERFACE_PART(CChatDlg, __uuidof(_IMpaWebCustomizerEvents), Dispatch) +END_INTERFACE_MAP() + +BEGIN_DISPATCH_MAP(CChatDlg, CCmdTarget) +//{{AFX_DISPATCH_MAP(CEventContainer) +DISP_FUNCTION_ID(CChatDlg,"", 18, OnShowContextMenu, VT_EMPTY, VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_PI4) +//}}AFX_DISPATCH_MAP +END_DISPATCH_MAP() + +BEGIN_EVENTSINK_MAP(CChatDlg, COFSNcDlg2) +//{{AFX_EVENTSINK_MAP(CChatDlg) +ON_EVENT(CChatDlg, IDC_MCCLOSE, -600 , OnClickMcclose, VTS_NONE) +ON_EVENT(CChatDlg, IDC_MCSEND, -600 , OnClickMcsend, VTS_NONE) +ON_EVENT(CChatDlg, IDC_MCOPTIONS, -600 , OnClickMcoptions, VTS_NONE) +ON_EVENT(CChatDlg, IDC_MCMENU, -600 , OnClickMcmenu, VTS_NONE) +ON_EVENT(CChatDlg, IDC_MCMINI, -600 , OnClickMcmini, VTS_NONE) +ON_EVENT(CChatDlg, IDC_BTN_COLOR, -600 , OnClickBtnColor, VTS_NONE) +ON_EVENT(CChatDlg, IDC_BTN_BOLD, -600 , OnClickBtnBold, VTS_NONE) +ON_EVENT(CChatDlg, IDC_BTN_ITALIC, -600 , OnClickBtnItalic, VTS_NONE) +ON_EVENT(CChatDlg, IDC_BTN_UNDERLINE, -600 , OnClickBtnUnderline, VTS_NONE) +ON_EVENT(CChatDlg, IDC_BTN_SMILES, -600 , OnClickBtnSmiles, VTS_NONE) +ON_EVENT(CChatDlg, IDC_EXPLORER, 250 , OnBeforeNavigate2History, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL) +ON_EVENT(CChatDlg, IDC_EXPLORER, 259 , OnDocumentComplete2History, VTS_DISPATCH VTS_PVARIANT) +ON_EVENT(CChatDlg, IDC_BTN_USERS, -600 , OnClickBtnUsers, VTS_NONE) +ON_EVENT(CChatDlg, IDC_BTN_FILES, -600 , OnClickBtnFiles, VTS_NONE) +ON_EVENT(CChatDlg, IDC_USER_LIST, 1 /* Menu */, OnMenuCcootreectrl, VTS_I4 VTS_BOOL) +ON_EVENT(CChatDlg, IDC_USER_LIST, 3 /* Action */, OnActionCcootreectrl, VTS_I4 VTS_BOOL) +//}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CChatDlg message handlers +/* +LPARAM CChatDlg::OnSetRecipient(WPARAM w, LPARAM l) +{ +SetRecipient(*((CUser*)w)); +return 0; +} +*/ +void CChatDlg::OnMenuCcootreectrl(long TID, BOOL bGroupe) +{ + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser) + { + /*CUser User = *pUser; + + pMessenger->ShowUserMenu(User.GetGlobalID());*/ + + CPoint point; + GetCursorPos(&point); + + CMenu menu; + menu.LoadMenu(IDR_MESSENGER_MENU); + + CMenu* popup = menu.GetSubMenu(0); + + pMessenger->UpdateUserMenu(pUser->GetGlobalID(),popup); + + popup->AppendMenu(MF_SEPARATOR); + popup->AppendMenu(MF_STRING,IDS_CHANGE_COLOR,GetString(IDS_CHANGE_COLOR)); + + int iSelection = popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, point.x, point.y, this); + + if(IDS_CHANGE_COLOR==iSelection) + { + DWORD dwColor = 0; + GetColorFromColorStorage(pMessenger->GetUserRole(),pMessenger->GetUserID(),pUser->GetGlobalID(),dwColor); + + CColorDialog colorDlg(dwColor,CC_ANYCOLOR|CC_FULLOPEN,this); + if(colorDlg.DoModal()==IDOK) + { + SetItemToColorStorage(pMessenger->GetUserRole(),pMessenger->GetUserID(), pUser->GetGlobalID(), pUser->GetShowName(), colorDlg.GetColor()); + m_Chat.RefreshColors(pMessenger->GetUserRole(),pMessenger->GetUserID()); + Refresh(); + } + } + else + { + // Пересылаем выбранную команду окну броузера + pMessenger->SendMessage(WM_COMMAND, iSelection, NULL); + } + } + } +} + +void CChatDlg::OnActionCcootreectrl(long TID, BOOL bGroupe) +{ + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser&&pUser->GetGlobalID()!=pMessenger->GetUserID()) + { + pMessenger->SendMessageToUser(pUser); + } + } +} + +LRESULT CChatDlg::OnSWMRefreh(WPARAM w, LPARAM l) +{ + Refresh(); + return 0; +} + +void CChatDlg::OnOk() +{ + // TODO: Add your control notification handler code here +} + +void CChatDlg::OnCancel() +{ + // TODO: Add extra cleanup here + if((Handle==0L)||!pMessenger->ConnectEnable()) + { + //COFSNcDlg2::OnCancel(); + KillWindow(); + return; + } + pSession->CancelOperation(Handle); +} + +BOOL CChatDlg::OnInitDialog() +{ + // [7/23/2002] + //CDialog::OnInitDialog(); + + // [7/23/2002] + + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + m_ToolTip.AddTool(&m_btnMin,IDS_TIP_MINIMIZE); + m_ToolTip.AddTool(&m_btnColor,IDS_TIP_FONT_COLOR); + m_ToolTip.AddTool(&m_btnBold,IDS_TIP_BOLD); + m_ToolTip.AddTool(&m_btnItalic,IDS_TIP_ITALIC); + m_ToolTip.AddTool(&m_btnUnderline,IDS_TIP_UNDERLINE); + m_ToolTip.AddTool(&m_btnSmiles,IDS_TIP_SMILES); + m_ToolTip.AddTool(&m_FontCombo,IDS_TIP_FONT); + m_ToolTip.AddTool(&m_SizeCombo,IDS_TIP_FONT_SIZE); + ////////////////////////////////////////////////////////////////////////// + + HRESULT hr = m_pWebCustomizer.CreateInstance(CLSID_MpaWebCustomizer); + + LPUNKNOWN pDispatch = m_History.GetControlUnknown(); + m_pWebCustomizer->PutRefWebBrowser((LPDISPATCH)pDispatch); + + CreateTree(); + + InitMpaWebEvent(); + + // COFSNcDlg2::LoadSkin(); + // ShowSizeGrip(FALSE); + + /// Create Font ... + m_font.Attach(GetStockObject(DEFAULT_GUI_FONT)); + + /* + CBitmap bm; + + FontStateList.Create(16,16,ILC_COLOR32|ILC_MASK, 0,4); + bm.LoadBitmap(IDB_BOLD); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_ITALIC); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_UNDERLINE); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_COLOR); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + bm.LoadBitmap (IDB_SMILE); + FontStateList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + */ + + // m_BoldButton.SetIcon(FontStateList.ExtractIcon(0)); + // m_ItalicButton.SetIcon(FontStateList.ExtractIcon(1)); + // m_UnderLineButton.SetIcon(FontStateList.ExtractIcon(2)); + // m_ColorButton.SetIcon(FontStateList.ExtractIcon(3)); + // m_InsertSmileButton.SetIcon(FontStateList.ExtractIcon(4)); + + // m_btnX.SetAutoPressed(TRUE); + // m_btnX.SetCanStayPressed(FALSE); + // m_Send.SetAutoPressed(TRUE); + // m_Send.SetCanStayPressed(FALSE); + // m_Menu.SetAutoPressed(TRUE); + // m_Menu.SetCanStayPressed(FALSE); + // m_btnMin.SetAutoPressed(TRUE); + // m_btnMin.SetCanStayPressed(FALSE); + + // m_UserInfo.SetTransparent(TRUE); + // m_UserInfo.SetFontName(_T("Arial")); + // m_UserInfo.SetFontSize(8); + // m_UserInfo.SetTextColor(m_crStatic.crText); + + // m_SenderUserInfo.SetTransparent(TRUE); + // m_SenderUserInfo.SetFontName(_T("Arial")); + // m_SenderUserInfo.SetFontSize(8); + // m_SenderUserInfo.SetTextColor(m_crStatic.crBG); + + /// Create and Init History Brouser + // CRect m_HistoryRect(17,72,393,205); + // m_HistoryChild.SetBoundary(0,0); + // m_HistoryChild.Create(NULL,NULL,WS_VISIBLE|WS_CHILD,m_HistoryRect,this,AFX_IDW_PANE_FIRST); + // m_HistoryChild.webbrowser2.Navigate("about:blank",NULL,NULL,NULL,NULL); + m_bEnableNavigateHistory = TRUE; + m_History.Navigate(_T("about:blank"), NULL, NULL, NULL, NULL); + //GetDlgItem(IDC_SPLITTER_STATIC)->SetWindowPos(NULL,m_HistoryRect.left-5,m_HistoryRect.bottom+1,m_HistoryRect.Width()+10,3,SWP_NOZORDER|SWP_NOACTIVATE); + + /// Create Font ... + //m_font.Attach(GetStockObject(DEFAULT_GUI_FONT)); + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + // SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + // SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + // CRect rTmp(16,249,351,304); + // m_edit.Create(NULL,NULL,WS_VISIBLE,rTmp,this,IDC_DHTML_EDIT); + + m_edit.InitInfoMessage(WM_EDIT_UPDATE); + m_edit.SetContextMenu(IDR_MESSENGER_MENU,1,this); + m_edit.SetEditMode(); + + // m_Send.SetWindowPos(NULL,360,249,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_btnX.SetWindowPos(NULL,382,13,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_btnMin.SetWindowPos(NULL,360,13,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_Options.SetWindowPos(NULL,57,16,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_Menu.SetWindowPos(NULL,20,16,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_UserInfo.SetWindowPos(NULL,20,48,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_SenderUserInfo.SetWindowPos(NULL,135,48,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + + + // m_ColorButton.SetWindowPos(NULL,17,222,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_BoldButton.SetWindowPos(NULL,43,222,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_ItalicButton.SetWindowPos(NULL,69,222,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_UnderLineButton.SetWindowPos(NULL,94,222,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + // m_InsertSmileButton.SetWindowPos(NULL,120,222,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + + //static int nFontSizes[] = {8, 10, 12, 14, 18, 24, 36}; + // CRect rect; + // rect.top = 221; + // rect.bottom = rect.top + nDropHeight; + // rect.left = 150; + // rect.right = rect.left + 40; + + // m_SizeCombo.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP, + // rect,this,IDC_SIZE_COMBO); + m_SizeCombo.SetFont(&m_font); + CString str; + for (int i = 0; i < sizeof(nFontSizes)/sizeof(int); i++) + { + str.Format(_T("%d"), nFontSizes[i]); + m_SizeCombo.AddString(str); + } + + ///// Font Combo Create .... + // rect.top = 221; + // rect.bottom = rect.top + nDropHeight; + // rect.left = 195; + // rect.right = rect.left+120; + + // m_FontCombo.Create(CBS_DROPDOWNLIST|WS_VSCROLL|CBS_SORT |WS_VISIBLE|WS_TABSTOP, + // rect, this, IDC_FONT_COMBO); + m_FontCombo.SetFont(&m_font); + + HDC hWinDC = ::GetDC(GetSafeHwnd()); + ::EnumFontFamilies(hWinDC, (LPTSTR) NULL, (FONTENUMPROC)NEnumFontNameProc, (LPARAM)&(m_FontCombo)); + ::ReleaseDC(GetSafeHwnd(),hWinDC); + + bInitEdit = FALSE; + + // [4/29/2002] + CString strFontName = GetOptionString(IDS_OFSMESSENGER,IDS_FONT,_T("Arial")); + //int FontId = GetOptionString(IDS_OFSMESSENGER,IDS_FONT,_T("Arial")); + //if(FontId!=-1) + // m_FontCombo.GetLBText(FontId, strFontName); + + CComBSTR bsFontName = strFontName; + + m_edit.SetDefaultFontName(bsFontName); + m_edit.SetDefaultFontSize(nFontSizes[GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)]); + // [4/29/2002] + + // OZ 2007-02-01 + m_CoolMenuManager.Install(this); + + try + { + // Load Smiles + int SmileIndex = 0; + for(CSmileInfoListEnum item = CurrentSmileManager.GetSmiles().begin();item!=CurrentSmileManager.GetSmiles().end();item++, SmileIndex++) + { + CBitmap* pPreviewBmp = CurrentSmileManager.GetSmilePreview((*item).GetId()); + + if(pPreviewBmp!=NULL) + { + TOOLBARDATA Tdt = {1,16,16,1,0}; + WORD dwItemID[] = {20001+(*item).GetIndex()}; + + Tdt.items = (WORD*)dwItemID; + + m_CoolMenuManager.LoadToolbar(*pPreviewBmp,&Tdt,0x808080); + + pPreviewBmp->DeleteObject(); + delete pPreviewBmp; + } + } + + } + catch (...) + { + ASSERT(FALSE); + } + // + + + m_edit.Clear(); + + //m_InWindow.ShowWindow(SW_HIDE); + //m_WebFolderView.ShowWindow(SW_HIDE); + //m_InWindow.Navigate(_T("IBN_SCHEMA://default/Common/blank.html")); + + ShowUsers(TRUE); + + return (m_bDisableEditOnStart?FALSE:TRUE); // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CChatDlg::OnSendButton() +{ + // TODO: Add your control notification handler code here + UpdateData(TRUE); + + if(pMessenger->ConnectEnable() && !Handle) + { + CChat Chat; + + if(pMessenger->FindChatByGlobalId(m_Chat.GetId(),Chat)&&Chat.GetStatus()==SC_ACTIVE) + { + m_Chat = Chat; + + CComBSTR bstText; + + m_edit.GetHTML(&bstText); + + // Replace Smile Images + int StartPos = 0, Length = 0; + CSmileInfo currentSmile = FindSmileImage(bstText.m_str, StartPos, Length); + + while(currentSmile!=CSmileInfo::Empty) + { + USES_CONVERSION; + + WCHAR *pBuffer = new WCHAR[Length+1]; + wcsncpy(pBuffer, ((LPCWSTR)bstText.m_str) + StartPos, Length); + pBuffer[Length] = 0; + + int LenPrev = bstText.Length(); + Replace(bstText.m_str,pBuffer, T2CW(currentSmile.GetHtmlSmile())); + + int LenNew = bstText.Length(); + + StartPos = 0; + Length = 0; + + delete pBuffer; + + currentSmile = FindSmileImage(bstText.m_str, StartPos, Length); + } + + /// + CComBSTR bstTmpText = (LPCWSTR)bstText; + bstText.Empty(); + bstText = bstTmpText; + /// + + //////// + RemoveParagraf(bstText.m_str); + //////// + + + /// + CComBSTR bstTmpText2 = (LPCWSTR)bstText; + bstText.Empty(); + bstText = bstTmpText2; + /// + + try + { + pMessage = m_Chat->CreateMessage(); + pMessage->PutMID(GUIDGen()); + pMessage->PutBody((BSTR)bstText); + + theNet2.LockTranslator(); + try + { + pMessage->Send(&Handle); + if(Handle) + { + Block(); + theNet2.AddToTranslator(Handle,this->m_hWnd); + } + } + catch(...) + {ASSERT(FALSE);} + theNet2.UnlockTranslator(); + } + catch (_com_error&) + { + } + + } + } +} + + +BOOL CChatDlg::PreTranslateMessage(MSG* pMsg) +{ + // TODO: Add your specialized code here and/or call the base class + //TRACE("\r\n WM = 0x%X wParam = 0x%X (%d)",pMsg->message,pMsg->wParam, GetKeyState(VK_MENU)); + if(m_bWasCtrlExit&&m_bWasCtrlEnter) + { + m_bWasCtrlExit = m_bWasCtrlEnter = FALSE; + COFSNcDlg2::PreTranslateMessage(pMsg); + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + pMsg->lParam = 0; + //m_edit.PostMessage(WM_KEYDOWN,VK_RETURN); + } + else + if(pMsg->message==WM_KEYUP&& + pMsg->wParam==VK_CONTROL&& + !bBlock&& + m_bWasCtrlEnter) + { + //m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = TRUE; + } + else + if(pMsg->message==WM_KEYDOWN||pMsg->message==WM_SYSKEYDOWN) + { + //TRACE("\r\n WM_KEYDOWN wParam = 0x%X",pMsg->wParam); + if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_CONTROL)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_CTRLENTER,1)==0) + { + OnSendButton(); + return TRUE; + } + else + { + m_bWasCtrlEnter = TRUE; + //pMsg->message = WM_KEYDOWN; + //pMsg->wParam = VK_RETURN; + //pMsg->lParam = 0; + //m_edit.SendMessage(WM_KEYDOWN,VK_RETURN); + } + } + else if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_SHIFT)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHIFTENTER,0)==0) + { + OnSendButton(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==VK_RETURN&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ENTER,0)==0) + { + OnSendButton(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==0x53&&(GetKeyState(VK_MENU)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ALTS,0)==0) + { + OnSendButton(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + //else if(pMsg->wParam==0x4C&&(GetKeyState(VK_CONTROL)>>1)&&!bBlock) + //{ + // m_FontCombo.ShowDropDown(); + //} + } + + return COFSNcDlg2::PreTranslateMessage(pMsg); +} + +void CChatDlg::Block() +{ + bBlock=TRUE; + m_Send.SetFocus(); + m_edit.EnableWindow(FALSE); + m_Send.EnableWindow(FALSE); +} + +void CChatDlg::UnBlock() +{ + CWnd *pActiveWnd = GetForegroundWindow(); + bBlock=FALSE; + + //m_edit.EnableWindow(TRUE); + m_Send.EnableWindow(TRUE); + + if(pActiveWnd->GetSafeHwnd()==GetSafeHwnd()) + { + m_edit.EnableWindow(TRUE); + } + else + m_bEnableIfActiavte = TRUE; +} + +//DEL void CChatDlg::SetSender(CUser &user) +//DEL { +//DEL m_Sender = user; +//DEL //m_edit.SetFocus(); +//DEL CString strName; +//DEL strName.Format(GetString(IDS_FROM_FORMAT),m_Sender.GetShowName()); +//DEL m_SenderUserInfo.SetText(strName); +//DEL } + +//DEL void CChatDlg::SetRecipient(CUser &user) +//DEL { +//DEL m_Recipient = user; +//DEL CString strCaption; +//DEL +//DEL //GetWindowText(strCaption); +//DEL strCaption.Format(GetString(IDS_INSTANT_CHAT_TITLE_FORMAT),m_Recipient.GetShowName()); +//DEL +//DEL SetWindowText(strCaption); +//DEL m_UserInfo.SetText(m_Recipient.GetShowName()); +//DEL Refresh(); +//DEL //m_edit.SetFocus(); +//DEL } + +LRESULT CChatDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + + UnBlock(); + + switch(pItem->EventType) + { + case NLT_ECommandOK: + //MessageTime = pItem->Long1; + + + /*if(!pMessenger->AddMessageToDataBase(m_Recipient.GetGlobalID(),pMessage->GetMID(),MessageTime,pMessage->GetBody())) + { + _SHOW_IBN_ERROR_DLG_OK(IDS_LOCDATABASE_ADDMESSAGE_ERROR); + }*/ + + bInitEdit = FALSE; + m_edit.Clear(); + //Refresh(); + + break; + case NLT_ECommandError: + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + break; + default: + break; + } + + delete pItem; + return 0; +} + +void CChatDlg::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + COFSNcDlg2::OnClose(); + + if(!bIsKillWinodow) + { + CloseMpaWebEvent(); + bIsKillWinodow = TRUE; + DestroyWindow(); + delete this; + } +} + + +void CChatDlg::OnEditmenuCopy() +{ + m_edit.ClipboardCopy(); +} + +void CChatDlg::OnUpdateEditmenuCopy(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCopy()); +} + +void CChatDlg::OnEditmenuCut() +{ + m_edit.ClipboardCut(); +} + +void CChatDlg::OnUpdateEditmenuCut(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCut()); +} + +void CChatDlg::OnEditmenuDelete() +{ + m_edit.ClipboardDelete(); +} + +void CChatDlg::OnUpdateEditmenuDelete(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardDelete()); +} + +void CChatDlg::OnEditmenuPast() +{ + if (OpenClipboard()) + { + HANDLE hText = GetClipboardData(CF_TEXT); + + if(hText!=NULL) + { + CComBSTR strText = (LPCTSTR)GlobalLock(hText); + m_edit.InsertTEXT(strText); + GlobalUnlock(hText); + } + + CloseClipboard(); + } + + //m_edit.ClipboardPast(); +} + +void CChatDlg::OnUpdateEditmenuPast(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardPast()); +} + + + +void CChatDlg::OnCaptureChanged(CWnd *pWnd) +{ + TRACE(_T("\r\n CChatDlg::OnCaptureChanged")); + + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_CHATSPLITRECT,RectToString(rWindow)); + + //pMessenger->RemoveAllMessageById(m_Recipient.GetGlobalID()); + m_edit.SetFocus(); + + COFSNcDlg2::OnCaptureChanged(pWnd); +} + +BOOL CChatDlg::Refresh() +{ + if(pMessenger) + { + // Step 1. Reload Contact List [8/16/2002] + CChat FindChat; + if(pMessenger->FindChatByGlobalId(m_Chat.GetId(),FindChat)) + { + m_Chat = FindChat; + BuildContactList(); + } + // Step 1. Refresh Messages Arhife [8/16/2002] + + IDispatchPtr pDispatch; + pDispatch.Attach(m_History.GetDocument()); + + if(pDispatch) + { + try + { + // Step 1. Load XSLT ... + IStreamPtr pStream = NULL; + LoadSkins m_LoadSkins; + + bstr_t xsltPath = bstr_t(IBN_SCHEMA) +(LPCTSTR)GetCurrentSkin() + bstr_t("/Shell/Conference/messages.xslt"); + + long Error = 0L; + m_LoadSkins.Load(xsltPath,&pStream,&Error); + + if(pStream) + { + bstr_t bstrtXSLT; + + ULONG pRealyRead = 0; + BYTE *pRead = NULL; + + STATSTG statStg = {0}; + if(S_OK==pStream->Stat(&statStg,0)) + { + pRead = new BYTE[statStg.cbSize.LowPart+2]; + + ZeroMemory(pRead,statStg.cbSize.LowPart+2); + + pStream->Read((LPVOID)pRead,statStg.cbSize.LowPart,&pRealyRead); + + if((pRead[0]==0xFF&&pRead[1]==0xFE)|| + (pRead[0]==0xFE&&pRead[1]==0xFF)) + { + // Remove Lead FE FF, FF FE + //if((pRead[0]==0xFF&&pRead[1]==0xFE)|| + // (pRead[0]==0xFE&&pRead[1]==0xFF)) + bstrtXSLT = (LPWSTR)(LPBYTE)(pRead+2); + //else + // bstrtXSLT = (LPWSTR)(LPBYTE)pRead; + } + else + { + if(pRead[0]==0xEF&&pRead[1]==0xBB&&pRead[2]==0xBF) + { + int WideSize = MultiByteToWideChar(CP_UTF8,0,(LPCSTR)(pRead+3),-1,0,0); + + LPWSTR wsBuff = new WCHAR[WideSize]; + MultiByteToWideChar(CP_UTF8,0,(LPCSTR)(pRead+3),-1,wsBuff,WideSize); + + bstrtXSLT = wsBuff; + + delete [] wsBuff; + } + else + { + int WideSize = MultiByteToWideChar(0,0,(LPCSTR)(pRead),-1,0,0); + + LPWSTR wsBuff = new WCHAR[WideSize]; + MultiByteToWideChar(0,0,(LPCSTR)(pRead),-1,wsBuff,WideSize); + + bstrtXSLT = wsBuff; + + delete []wsBuff; + } + } + + + delete [] pRead; + + // Step 2. Convert XML + XSLT ->HTML and Load into Document [8/16/2002] + // bstrtXSLT consist XML + + CComPtr pIXSLTemplate = NULL; + CComPtr pXSLT = NULL; + CComPtr pIXSLProcessor = NULL; + + HRESULT hr = pIXSLTemplate.CoCreateInstance(CLSID_XSLTemplate40,NULL,CLSCTX_SERVER); + if(hr==S_OK) + { + hr = pXSLT.CoCreateInstance(CLSID_FreeThreadedDOMDocument40,NULL,CLSCTX_SERVER); + + pXSLT->put_async(VARIANT_FALSE); + + VARIANT_BOOL vbLoad = VARIANT_FALSE; + TRACE(_T("\r\n $$$ Try pStream Load $$$")); + + //pXSLT->load(CComVariant((IUnknown*)pStream),&vbLoad); + pXSLT->loadXML(bstrtXSLT,&vbLoad); +#ifdef _DEBUG + + pXSLT->save(CComVariant(L"c:\\tmp_mess.xml")); +#endif + if(vbLoad==VARIANT_TRUE) + { + TRACE(_T("\r\n $$$ pStream Load Completed $$$")); + hr = pIXSLTemplate->putref_stylesheet(pXSLT); + hr = pIXSLTemplate->createProcessor(&pIXSLProcessor); + + if(pIXSLProcessor) + { + hr = pIXSLProcessor->put_input(CComVariant((IDispatch*)m_Chat.GetMessagesInterface())); + hr = pIXSLProcessor->put_output(CComVariant((IDispatch*)pDispatch)); + + VARIANT_BOOL vbResult = VARIANT_FALSE; + hr = pIXSLProcessor->transform(&vbResult); + } + + } + + } + // End [8/16/2002] + } + } + } + catch(...) + { + ASSERT(FALSE); + } + + } + else + { + m_bEnableRefresh = TRUE; + } + } + return FALSE; +} + + + + +HRESULT CChatDlg::OnAutoRefresh(WPARAM w, LPARAM l) +{ + //Refresh(); + return 0; +} + +void CChatDlg::OnMove(int x, int y) +{ + COFSNcDlg2::OnMove(x, y); + + if(::IsWindow(GetParent()->GetSafeHwnd())) + GetParent()->UpdateWindow(); + if(::IsWindow(pMessenger->GetMessageParent()->GetSafeHwnd())) + pMessenger->GetMessageParent()->UpdateWindow(); +} + +//DEL void CChatDlg::SetFon(HBITMAP hFon) +//DEL { +//DEL // 03.04.2002 \- +//DEL return; +//DEL // 03.04.2002 /- +//DEL +//DEL /*if(pFonBmp) +//DEL pFonBmp->DeleteObject(); +//DEL else +//DEL pFonBmp = new CBitmap; +//DEL +//DEL pFonBmp->Attach(hFon); +//DEL +//DEL BITMAP hb; +//DEL pFonBmp->GetBitmap(&hb); +//DEL sFon = CSize(hb.bmWidth ,hb.bmHeight); +//DEL +//DEL SetMinTrackSize(sFon); +//DEL SetWindowPos(NULL,-1,-1,sFon.cx,sFon.cy ,SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); +//DEL +//DEL CPictureHolder tmpImage; +//DEL tmpImage.CreateFromBitmap(pFonBmp); +//DEL m_ResizeFon.Destroy(); +//DEL m_ResizeFon.Create(tmpImage.m_pPict); +//DEL m_ResizeFon.AddAnchor(CRect(0,0,230,100),CSize(0,0),CSize(0,0)); +//DEL m_ResizeFon.AddAnchor(CRect(231,0,290,100),CSize(0,0),CSize(100,0),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(291,0,413,100),CSize(100,0),CSize(100,0)); +//DEL m_ResizeFon.AddAnchor(CRect(0,101,230,170),CSize(0,0),CSize(0,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(291,101,413,170),CSize(100,0),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(0,171,230,350),CSize(0,100),CSize(0,100)); +//DEL m_ResizeFon.AddAnchor(CRect(231,171,290,350),CSize(0,100),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(291,171,413,350),CSize(100,100),CSize(100,100)); +//DEL +//DEL //AddAnchor(m_btnX.GetSafeHwnd(),CSize(100,0),CSize(100,0)); +//DEL //AddAnchor(m_btnMin.GetSafeHwnd(),CSize(100,0),CSize(100,0)); +//DEL AddAnchor(m_edit.GetSafeHwnd(),CSize(0,100),CSize(100,100)); +//DEL AddAnchor(m_History.GetSafeHwnd(),CSize(0,0),CSize(100,100)); +//DEL // AddAnchor(m_ColorButton.GetSafeHwnd(),CSize(0,100),CSize(0,100)); +//DEL // AddAnchor(m_BoldButton.GetSafeHwnd(),CSize(0,100),CSize(0,100)); +//DEL // AddAnchor(m_ItalicButton.GetSafeHwnd(),CSize(0,100),CSize(0,100)); +//DEL // AddAnchor(m_UnderLineButton.GetSafeHwnd(),CSize(0,100),CSize(0,100)); +//DEL // AddAnchor(m_InsertSmileButton.GetSafeHwnd(),CSize(0,100),CSize(0,100)); +//DEL AddAnchor(m_SizeCombo.GetSafeHwnd(),CSize(0,100),CSize(0,100)); +//DEL AddAnchor(m_FontCombo.GetSafeHwnd(),CSize(0,100),CSize(0,100)); +//DEL +//DEL //AddAnchor(m_Send.GetSafeHwnd(),CSize(100,100),CSize(100,100)); +//DEL +//DEL CRect rgnRect; +//DEL GetWindowRect(&rgnRect); +//DEL CRgn WinRgn; +//DEL WinRgn.CreateRoundRectRgn(0,0,rgnRect.Width(),rgnRect.Height(),20,20); +//DEL SetWindowRgn(WinRgn,TRUE); +//DEL +//DEL CString strRect = GetOptionString(IDS_OFSMESSENGER,IDS_SPLITRECT,""); +//DEL if(!strRect.IsEmpty()) +//DEL { +//DEL CRect rWindow = StringToRect(strRect); +//DEL FitRectToWindow(rWindow); +//DEL SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); +//DEL } +//DEL */ +//DEL } + +void CChatDlg::OnPaint() +{ +/* +CRect winRect, editRect; +GetWindowRect(winRect); + + m_edit.GetWindowRect(&editRect); + ScreenToClient(&editRect); + + CPaintDC dc(this); // device context for painting + //CMemDC memdc(&dc); + if(pFonBmp) + { + //CDC dc; + //dc.CreateCompatibleDC(&memdc); + //dc.SelectObject(pFonBmp); + //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); + //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); + CRect m_Client; + GetClientRect(&m_Client); + CSize winSize(m_Client.Width(),m_Client.Height()); + m_ResizeFon.Render(dc.GetSafeHdc(),winSize); + m_UserInfo.Invalidate(); + } + */ + + // CPaintDC dc(this); // device context for painting + // DrawBackground(&dc); + COFSNcDlg2::OnPaint(); + m_UserInfo.Invalidate(); + m_SenderUserInfo.Invalidate(); +} + +//DEL void CChatDlg::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL CPoint inPoint = point; +//DEL ClientToScreen(&point); +//DEL +//DEL CRect StatusRect, miniRect; +//DEL GetClientRect(&StatusRect); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yFindChatByGlobalId(m_Chat.GetId(),SelChat)) + { + ChatTID = SelChat.GetTID(); + } + pMessenger->ShowGeneralMenu(ChatTID); +} + +void CChatDlg::OnClickMcmini() +{ + ShowWindow(SW_MINIMIZE); +} + +void CChatDlg::OnClickMcoptions() +{ + pMessenger->PreferenceDlg(this); +} + +BOOL CChatDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +{ + CRect StatusRect, miniRect; + + GetClientRect(&StatusRect); + + CPoint point, inPoint; + + ::GetCursorPos(&point); + inPoint = point; + ScreenToClient(&inPoint); + + miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); + + if(!miniRect.PtInRect(inPoint)) + { + if(inPoint.xminiRect.bottom) + nHitTest = HTBOTTOMLEFT; + else + nHitTest = HTLEFT; + else if(inPoint.x>miniRect.right) + if(inPoint.yminiRect.bottom) + nHitTest = HTBOTTOMRIGHT; + else + nHitTest = HTRIGHT; + else if(inPoint.y30) + { + CString strMessage; + strMessage.LoadString(IDS_FILES_SEND_LIMIT); + MessageBox(strMessage,GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONERROR); + return ; + } + + + CString strDescription; + CFileDescriptioDlg DescrDlg(this); + + DescrDlg.m_strFileName = _T(""); + for(UINT i=0;iSendFileToUser(&m_Recipient,FileBuffer,strDescription); + } + }*/ +} + +void CChatDlg::OnColorButton() +{ + CColorDialog m_Color(m_edit.GetColor(), CC_ANYCOLOR,this); + if(m_Color.DoModal()==IDOK) + { + m_edit.SetColor(m_Color.GetColor()); + } + m_edit.SetFocus(); +} + +HRESULT CChatDlg::OnEditUpdate(WPARAM w, LPARAM l) +{ + if(!m_strSetBody.IsEmpty()) + { + CComBSTR bstSetBody = m_strSetBody; + m_edit.InsertTEXT(bstSetBody); + m_strSetBody.Empty(); + } + + if(!bInitEdit) + { + bInitEdit = TRUE; + + // Try Fix Font Jamping. [7/22/2002] + /* + m_edit.SetTextSize(GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)+1); + CString strFontName = _T("Arial"); + int FontId = GetOptionInt(IDS_OFSMESSENGER,IDS_FONT,-1); + if(FontId!=-1) + m_FontCombo.GetLBText(FontId, strFontName); + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName);*/ + + + if(GetOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE,0)) + { + //m_UnderLineButton.SetCheck(1); + m_edit.SetUnderline(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ITALIC,0)) + { + //m_ItalicButton.SetCheck(1); + m_edit.SetItalic(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_BOLD,0)) + { + //m_BoldButton.SetCheck(1); + m_edit.SetBold(); + } + + } + + CCmdUI m_Command; + + /* + m_Command.m_nID = m_BoldButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_BoldButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_BOLD,TRUE); + + m_Command.m_nID = m_ItalicButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_ItalicButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_ITALIC,TRUE); + + m_Command.m_nID = m_UnderLineButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_UnderLineButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_UNDERLINE,TRUE); + */ + m_edit.UpdateCmdControl(&m_btnBold, IDM_TRIED_BOLD, TRUE); + m_edit.UpdateCmdControl(&m_btnItalic, IDM_TRIED_ITALIC, TRUE); + m_edit.UpdateCmdControl(&m_btnUnderline, IDM_TRIED_UNDERLINE, TRUE); + + int TextSize = m_edit.GetTextSize(); + // [4/29/2002] + if(TextSize>=1) + m_SizeCombo.SetCurSel(m_edit.GetTextSize()-1); + else + { + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + } + // [4/29/2002] + + CString strFontName = m_edit.GetFontName(); + + for (int i=0; i < m_FontCombo.GetCount(); ++i) + { + CString itemStr; + + m_FontCombo.GetLBText(i, itemStr); + + if ( itemStr == strFontName) + { + m_FontCombo.SetCurSel(i); + break; + } + } + + + return 0; +} + +void CChatDlg::OnSelendokSizeCombo() +{ + WriteOptionInt(IDS_OFSMESSENGER,IDS_SIZE,m_SizeCombo.GetCurSel()); + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + // [4/29/2002] + m_edit.SetDefaultFontSize(nFontSizes[m_SizeCombo.GetCurSel()]); + // [4/29/2002] + m_edit.SetFocus(); +} + +void CChatDlg::OnSelendokFontCombo() +{ + int nIndex = m_FontCombo.GetCurSel(); + CString strFontName; + m_FontCombo.GetLBText(nIndex, strFontName); + + WriteOptionString(IDS_OFSMESSENGER,IDS_FONT,strFontName); + + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName); + // [4/29/2002] + m_edit.SetDefaultFontName(bsFontName); + // [4/29/2002] + m_edit.SetFocus(); +} + +void CChatDlg::OnInsertsmileCheck() +{ + // New Smile Addon [2007-02-06] + CMenu smileMenu; + smileMenu.CreatePopupMenu(); + + int index = 0; + for(CSmileInfoListEnum item = CurrentSmileManager.GetSmiles().begin();item!=CurrentSmileManager.GetSmiles().end() && index<(3*8-1);item++,index++) + { + CString str; + str.Format("%s\t%s", (*item).GetText(), (*item).GetSmile()); + + if(index!=0 && (index%8)==0) + VERIFY(smileMenu.AppendMenu(MF_STRING|MF_ENABLED|MF_MENUBREAK, 20001 + (*item).GetIndex(), str)); + else + VERIFY(smileMenu.AppendMenu(MF_STRING|MF_ENABLED, 20001 + (*item).GetIndex(), str)); + + } + + smileMenu.AppendMenu(MF_STRING|MF_ENABLED, 20000, GetString(IDS_SMILES_MORE)); + + CPoint curPoint; + GetCursorPos(&curPoint); + smileMenu.TrackPopupMenu(TPM_LEFTBUTTON,curPoint.x,curPoint.y,this); + // +} + +void CChatDlg::OnSmileItem(UINT nID) +{ + // New Smile Addon [2007-02-06] + int SmileId = -1; + + if(nID==20000) + { + // Show Smile Select Popup Window. + CSelectSmileDlg dlgSelectSmile(this); + + if(dlgSelectSmile.DoModal()==IDOK) + { + SmileId = dlgSelectSmile.GetSelectedSmileIndex(); + } + } + else + SmileId = nID - 20001; + + if(SmileId>=0) + { + + CSmileInfo smileInfo = CurrentSmileManager.GetSmile(SmileId); + + if(smileInfo!=CSmileInfo::Empty) + { + + CurrentSmileManager.IncHitCount(smileInfo.GetId()); + + BOOL bShift = GetKeyState(VK_SHIFT)>>1; + + if(bShift) + { + CComBSTR strSmileHtml = smileInfo.GetHtmlSmile(); + m_edit.InsertHTML(strSmileHtml); + } + else + { + CComBSTR strSmileHtml = L""; + + m_edit.InsertHTML(strSmileHtml); + } + + m_edit.SetFocus(); + } + else + { + ASSERT(FALSE); + } + } + // +} + + +void CChatDlg::SetBody(LPCTSTR strBody) +{ + m_strSetBody = strBody; + CComBSTR bsText = L""; + m_edit.InsertTEXT(bsText); + m_edit.SetFocus(); +} + +LPARAM CChatDlg::OnSWMSetBody(WPARAM w, LPARAM l) +{ + if(!Handle) + { + SetBody(LPCTSTR(w)); + + if(l!=NULL) + OnSendButton(); + } + return 0; +} + +void CChatDlg::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized ) +{ + TRACE(_T("\r\n -- CChatDlg::OnActivate nState== %d, bMinimized = %d"), nState,bMinimized); + + // [7/23/2002] + if(m_bEnableIfActiavte) + { + m_edit.EnableWindow(TRUE); + m_bEnableIfActiavte = FALSE; + } + + //if(m_bDisableEditOnStart) + //{ + //TRACE("\r\n -- CChatDlg::OnActivate m_bEnableIfActiavte = TRUE"); + //m_bEnableIfActiavte = m_bDisableEditOnStart; + //m_bDisableEditOnStart = FALSE; + //} + + if((nState==WA_ACTIVE||nState==WA_CLICKACTIVE)&&!bMinimized) + { + //pMessenger->RemoveAllMessageById(m_Recipient.GetGlobalID()); + m_edit.SetFocus(); + } + + COFSNcDlg2::OnActivate(nState, pWndOther, bMinimized); +} + +BOOL CChatDlg::OnNcActivate(BOOL bActive) +{ + TRACE(_T("\r\n -- CChatDlg::OnNcActivate bActive== %d"), bActive); + + if(m_bEnableIfActiavte) + { + m_edit.EnableWindow(TRUE); + m_bEnableIfActiavte = FALSE; + } + + if(bActive) + { + //pMessenger->RemoveAllMessageById(m_Recipient.GetGlobalID()); + //m_edit.SetFocus(); + } + + return COFSNcDlg2::OnNcActivate(bActive); +} + +void CChatDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + + // [7/23/2002] + m_btnX.ShowWindow(SW_HIDE); + m_btnMin.ShowWindow(SW_HIDE); + m_Send.ShowWindow(SW_HIDE); + m_Menu.ShowWindow(SW_HIDE); + m_Options.ShowWindow(SW_HIDE); + // m_UserInfo.ShowWindow(SW_HIDE); + m_SenderUserInfo.ShowWindow(SW_HIDE); + m_btnColor.ShowWindow(SW_HIDE); + m_btnBold.ShowWindow(SW_HIDE); + m_btnItalic.ShowWindow(SW_HIDE); + m_btnUnderline.ShowWindow(SW_HIDE); + m_btnSmiles.ShowWindow(SW_HIDE); + m_btnUsers.ShowWindow(SW_HIDE); + m_btnFiles.ShowWindow(SW_HIDE); + m_treebox.ShowWindow(SW_HIDE); + //m_InWindow.ShowWindow(SW_HIDE); + //m_WebFolderView.ShowWindow(SW_HIDE); + + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Send"), &m_Send, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Menu"), &m_Menu, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Options"), &m_Options, TRUE, FALSE); + + LoadButton(pXmlRoot, _T("Color"), &m_btnColor, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Bold"), &m_btnBold, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Italic"), &m_btnItalic, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Underline"), &m_btnUnderline, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Smiles"), &m_btnSmiles, TRUE, FALSE); + + LoadLabel(pXmlRoot, _T("Recipient"), &m_UserInfo, TRUE); + LoadLabel(pXmlRoot, _T("Sender"), &m_SenderUserInfo, TRUE); + + LoadRectangle2(pXmlRoot, _T("History"), m_History.GetSafeHwnd(), TRUE, TRUE); + LoadRectangle2(pXmlRoot, _T("Edit"), m_edit.GetSafeHwnd(), TRUE); + LoadRectangle2(pXmlRoot, _T("ComboFont"), m_FontCombo.GetSafeHwnd(), TRUE); + LoadRectangle2(pXmlRoot, _T("ComboSize"), m_SizeCombo.GetSafeHwnd(), TRUE); + + LoadButton(pXmlRoot, _T("Users"), &m_btnUsers, FALSE, TRUE); + LoadButton(pXmlRoot, _T("Files"), &m_btnFiles, FALSE, TRUE); + //LoadRectangle(pXmlRoot, _T("Users"), &m_InWindow, FALSE); + //LoadRectangle(pXmlRoot, _T("Users"), &m_WebFolderView, FALSE); + LoadRectangle(pXmlRoot, _T("Users"), &m_treebox, TRUE); + + ///m_btnFiles.EnableWindow(FALSE); +} + +int CChatDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (COFSNcDlg2::OnCreate(lpCreateStruct) == -1) + return -1; + + // TODO: Add your specialized creation code here + // [7/23/2002] + CRect r(1,2,3,202); + + m_SizeCombo.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_CHILD, r, this, IDC_SIZE_COMBO); + m_FontCombo.Create(CBS_DROPDOWNLIST|WS_VSCROLL|CBS_SORT |WS_VISIBLE|WS_TABSTOP|WS_CHILD, r, this, IDC_FONT_COMBO); + + m_edit.Create(NULL, NULL, WS_TABSTOP|WS_CHILD|WS_VISIBLE|WS_DISABLED/*|(m_bDisableEditOnStart?WS_DISABLED:0)*/, r, this, IDC_DHTML_EDIT); + + m_edit.EnableWindow(); + + + + return 0; +} + +BOOL CChatDlg::Create(CWnd *pParentWnd, BOOL bDisableEditOnStart) +{ + TRACE(_T("\r\n CChatDlg::Create")); + m_bDisableEditOnStart = bDisableEditOnStart; + + if(!COFSNcDlg2::Create(IDD, pParentWnd)) + { + TRACE0("Warning: failed to create CChatDlg.\n"); + return FALSE; + } + + TRACE(_T("\r\n CChatDlg::Create/COFSNcDlg2::LoadSkin")); + if(!m_bLoadSkin) + COFSNcDlg2::LoadSkin(); + TRACE(_T("\r\n CChatDlg::Create/COFSNcDlg2::LoadSkin end")); + + // [7/23/2002] + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_CHATSPLITRECT, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + TRACE(_T("\r\n CChatDlg::Create End")); + return TRUE; +} + +void CChatDlg::OnClickBtnColor() +{ + CColorDialog dlg(m_edit.GetColor(), CC_ANYCOLOR, this); + m_bIgnoreActivate = TRUE; + if(dlg.DoModal() == IDOK) + { + m_edit.SetColor(dlg.GetColor()); + } + m_bIgnoreActivate = FALSE; + m_edit.SetFocus(); +} + +void CChatDlg::OnClickBtnBold() +{ + m_edit.SetBold(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_BOLD, m_btnBold.GetPressed()); +} + +void CChatDlg::OnClickBtnItalic() +{ + m_edit.SetItalic(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_ITALIC, m_btnItalic.GetPressed()); +} + +void CChatDlg::OnClickBtnUnderline() +{ + m_edit.SetUnderline(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE, m_btnUnderline.GetPressed()); +} + +void CChatDlg::OnClickBtnSmiles() +{ + OnInsertsmileCheck(); +} + +void CChatDlg::OnBeforeNavigate2History(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel) +{ + /*if(IsTVFileType(URL->bstrVal)) + { + long cx = 0, cy = 0, tearoff = 0, fullscreen = 0; + GetTargetRect(pDisp, cx, cy, tearoff, fullscreen); + + CDlgTV *pDlg = new CDlgTV; + if(pDlg) + { + pDlg->CreateAutoKiller(URL->bstrVal, GetDesktopWindow(), cx, cy); + *Cancel = TRUE; + } + } + else*/ + { + if(m_bEnableNavigateHistory) + { + m_bEnableNavigateHistory = FALSE; + return; + } + else + { + *Cancel = TRUE; + CString strUrl(URL->bstrVal); + + strUrl = pMessenger->ChangeUrlForCurrentDomain(strUrl); + + m_bEnableNavigateHistory = TRUE; + + if(S_OK != ::NavigateNewWindow(m_History.GetControlUnknown(), strUrl)) + ShellExecute(::GetDesktopWindow(), _T("open"), strUrl, NULL, NULL, SW_SHOWDEFAULT); + + m_bEnableNavigateHistory = FALSE; + } + } +} + +void CChatDlg::InitMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + IConnectionPointPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + LPUNKNOWN pInterEvent = GetInterface(&IID_IUnknown); + hr = m_pSessionConnectionPoint->Advise(pInterEvent ,&m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + +void CChatDlg::CloseMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + IConnectionPointPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + hr = m_pSessionConnectionPoint->Unadvise(m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + + +void CChatDlg::OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow) +{ + *pShow = 0; + + HRESULT hr = S_OK; + HINSTANCE hinstSHDOCLC; + HWND hwnd; + HMENU hMenu; + + CComPtr spCT; + CComPtr spWnd; + + hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT); + if(SUCCEEDED(hr)) + { + hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd); + if(SUCCEEDED(hr)) + { + hr = spWnd->GetWindow(&hwnd); + + if(SUCCEEDED(hr)) + { + hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); + + hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(24641)); + + hMenu = GetSubMenu(hMenu, 4); + + int iSelection = ::TrackPopupMenu(hMenu, + TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, x, y, 0, hwnd, (RECT*)NULL); + + // Пересылаем выбранную команду окну броузера + LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); + + FreeLibrary(hinstSHDOCLC); + } + } + } +} + +void CChatDlg::OnDocumentComplete2History(LPDISPATCH pDisp, VARIANT FAR* URL) +{ + if(m_bEnableRefresh) + { + Refresh(); + m_bEnableRefresh = FALSE; + } +} + +void CChatDlg::OnClickBtnUsers() +{ + ShowUsers(TRUE); +} + +void CChatDlg::OnClickBtnFiles() +{ + ShowUsers(FALSE); +} + +void CChatDlg::ShowUsers(BOOL bShow) +{ + USES_CONVERSION; + + m_btnUsers.SetPressed(bShow); + m_btnFiles.SetPressed(!bShow); + m_treebox.ShowWindow(bShow?SW_SHOW:SW_HIDE); + //m_InWindow.ShowWindow(!bShow?SW_SHOW:SW_HIDE); + //m_WebFolderView.ShowWindow(!bShow?SW_SHOW:SW_HIDE); + + if(bShow) + { + //m_InWindow.Navigate(_T("IBN_SCHEMA://default/Common/blank.html")); + //m_WebFolderView.Navigate(L""); + } + else + { + //CString strConferencesUrl = _T("#host#/Intranet/#domain#"); + + //strConferencesUrl.Replace("#sid#",pMessenger->GetSID()); + //strConferencesUrl.Replace("#host#",pMessenger->GetServerPath()); + //strConferencesUrl.Replace("#domain#",pMessenger->GetUserDomain()); + + //CString strDescription; + //strDescription.Format(_T("IBN Conferences on %s"),pMessenger->GetUserDomain()); + + //m_InWindow.Navigate(strNewsUrl); + //McAddNetworkPlace(GetSafeHwnd(),strConferencesUrl,strDescription);x + + //strConferencesUrl += _T("/Conferences/"); + //strConferencesUrl += (LPCWSTR)m_Chat.GetId(); + + //strConferencesUrl = _T("http://212.44.66.3/Intranet/"); + + //LPITEMIDLIST pPIDL = NULL; + + //if(S_OK == McCoCreateWFPIDL(T2CW(strDescription),T2CW(strConferencesUrl),&pPIDL)) + //{ + //m_WebFolderView.Destroy(); + //m_WebFolderView.Navigate2(pPIDL); + + // CComPtr pMalloc = NULL; + // SHGetMalloc(&pMalloc); + // pMalloc->Free(pPIDL); + //} + } + +} + +void CChatDlg::SetChat(const CChat &Chat) +{ + m_Chat = Chat; + + CString strText; + + strText.Format(GetString(IDS_CONFERENCE_CAPTION_TEXT),m_Chat.GetShowName()); + + SetWindowText(strText); + + m_UserInfo.SetWindowText(m_Chat.GetShowName()); +} + +void CChatDlg::CreateTree() +{ + LoadSkins m_LoadSkin; + + IStreamPtr pStream = NULL; + long Error=0; + m_LoadSkin.Load(bstr_t(IBN_SCHEMA) + bstr_t((LPCTSTR)GetProductLanguage()) + bstr_t("/Shell/Main/status.bmp"),&pStream,&Error); + if(pStream) + { + CDib dib(pStream); + CPaintDC dc(this); + HBITMAP lhBmp = dib.GetHBITMAP((HDC)dc); + m_treebox.SetImageList((long)lhBmp); + if(lhBmp) + DeleteObject(lhBmp); + } + + short PriorityIndex[10]; + for(int i=0;i<10;i++) + PriorityIndex[i] = -1; + PriorityIndex[0] = 1; + PriorityIndex[1] = 0; + + m_treebox.SetPriority(PriorityIndex); + + for(int i = 0 ;iTID = m_treebox.AddItem(0,pUser->GetShowName(),m_ShablonId[pUser->GetStatus()==SC_ACTIVE?1:9]); + else + pUser->TID = m_treebox.AddItem(0,pUser->GetShowName(),m_ShablonId[9]); + } + } + + ////////////////////////////////////////////// + //TRACE("\r\n CMainDlg::BuildContactList End ..."); +} + +CUser* CChatDlg::FindUserInVisualContactList(long TID) +{ + if(POSITION pos = m_Chat.GetUsers().InitIteration()) + { + CUser *pUser=NULL; + + while(m_Chat.GetUsers().GetNext(pos,pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + return NULL; +} diff --git a/Source/Client/IM-Client/IMClient/ChatDlg.h b/Source/Client/IM-Client/IMClient/ChatDlg.h new file mode 100644 index 0000000..c5a4220 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ChatDlg.h @@ -0,0 +1,189 @@ +//{{AFX_INCLUDES() +#include "webbrowser2.h" +#include "mcbutton.h" +#include "ccootree.h" +#include "resource.h" +//}}AFX_INCLUDES +#if !defined(AFX_CHAT_H__57334E4B_6FAA_4A15_AC98_5AB99FAD07E9__INCLUDED_) +#define AFX_CHAT_H__57334E4B_6FAA_4A15_AC98_5AB99FAD07E9__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// MessageSplitDlg.h : header file +// +#include "OFSNcDlg2.h" + +///////////////////////////////////////////////////////////////////////////// +#include "OfsNCDlg.h" +#include ".\\OFSDhtmlEditCtrl\\OFSDhtmlCtrl.h" +//#include "ChildView.h" +#include "Label.h" +#include "ResizableImage.h" +// CChatDlg dialog + +#include "Chat.h" +#include "CoolMenu.h" + +//#include "McWebFolderView.h" + +class CMainDlg; + +class CChatDlg : public COFSNcDlg2 +{ +// Construction +public: + + void SetChat(const CChat& Chat); + BOOL Create(CWnd *pParentWnd, BOOL bDisableEditOnStart = FALSE); + void SetBody(LPCTSTR strBody); + BOOL Refresh(); +// CChildView m_HistoryChild; +// CWebBrowser2 m_HistoryChild; + CChatDlg(CMainDlg *pMessenger,CWnd* pParent = NULL); // standard constructor + ~CChatDlg(); + +// Dialog Data + //{{AFX_DATA(CChatDlg) + enum { IDD = IDD_CHAT_DIALOG }; + CLabel m_SenderUserInfo; + CLabel m_UserInfo; + CStatic m_EditFrame; + CMcButton m_btnX; + CMcButton m_Send; + CMcButton m_Options; + CMcButton m_Menu; + CMcButton m_btnMin; + CComboBox m_FontCombo; + CComboBox m_SizeCombo; + CButton m_SendButton; + CMcButton m_btnColor; + CMcButton m_btnBold; + CMcButton m_btnItalic; + CMcButton m_btnUnderline; + CMcButton m_btnSmiles; + CCCooTree m_treebox; + //CWebWindow m_InWindow; + CMcButton m_btnUsers; + CMcButton m_btnFiles; + //}}AFX_DATA + + ///CMcWebFolderView m_WebFolderView; + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CChatDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation +protected: + CUser* FindUserInVisualContactList(long TID); + void CreateTree(); + void BuildContactList(); + void ShowUsers(BOOL bShow); + BOOL m_bEnableIfActiavte; + void InitMpaWebEvent(); + void CloseMpaWebEvent(); + + BOOL m_bEnableNavigateHistory; + + void LoadSkin(IXMLDOMNode *pXmlRoot); + BOOL m_bWasCtrlEnter, m_bWasCtrlExit; + CString m_strSetBody; + LPARAM OnSWMSetBody(WPARAM w, LPARAM l); + CResizableImage m_ResizeFon; + BOOL bIsKillWinodow; + CSize sFon; + HRESULT OnAutoRefresh(WPARAM w, LPARAM l); + IMpaWebCustomizerPtr m_WebCustomizer; + BOOL bInitEdit; + CFont m_font; + void KillWindow(); + long Handle; + long MessageTime; + CMainDlg *pMessenger; + //CUser m_Recipient,m_Sender; + BOOL bBlock; + void UnBlock(); + void Block(); + + CImageList FontStateList; + IMessagePtr pMessage; + ISessionPtr pSession; + CWebBrowser2 m_History; + COfsDhtmlEditCtrl m_edit; + IMpaWebCustomizerPtr m_pWebCustomizer; + DWORD m_dwSessionCookie; + + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + void OnSendButton(); + // Generated message map functions + //{{AFX_MSG(CChatDlg) + afx_msg void OnMenuCcootreectrl(long TID, BOOL bGroupe); + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + afx_msg void OnOk(); + afx_msg LRESULT OnNetEvent(WPARAM w,LPARAM l); + afx_msg void OnColorButton(); + afx_msg void OnSelendokFontCombo(); + afx_msg void OnSelendokSizeCombo(); + afx_msg void OnEditmenuCopy(); + afx_msg void OnUpdateEditmenuCopy(CCmdUI* pCmdUI); + afx_msg void OnEditmenuCut(); + afx_msg void OnUpdateEditmenuCut(CCmdUI* pCmdUI); + afx_msg void OnEditmenuDelete(); + afx_msg void OnUpdateEditmenuDelete(CCmdUI* pCmdUI); + afx_msg void OnEditmenuPast(); + afx_msg void OnUpdateEditmenuPast(CCmdUI* pCmdUI); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnMove(int x, int y); + afx_msg void OnPaint(); + afx_msg void OnClickMcclose(); + afx_msg void OnClickMcsend(); + afx_msg void OnClickMcoptions(); + afx_msg void OnClickMcmenu(); + afx_msg void OnClickMcmini(); + afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); + afx_msg void OnDropFiles( HDROP hDropInfo ); + afx_msg void OnInsertsmileCheck(); + afx_msg void OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized ); + afx_msg BOOL OnNcActivate(BOOL bActive); + afx_msg void OnClickBtnColor(); + afx_msg void OnClickBtnBold(); + afx_msg void OnClickBtnItalic(); + afx_msg void OnClickBtnUnderline(); + afx_msg void OnClickBtnSmiles(); + afx_msg void OnBeforeNavigate2History(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel); + afx_msg void OnDocumentComplete2History(LPDISPATCH pDisp, VARIANT FAR* URL); + afx_msg void OnClickBtnUsers(); + afx_msg void OnClickBtnFiles(); + afx_msg void OnActionCcootreectrl(long TID, BOOL bGroupe); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + afx_msg void OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow); + DECLARE_DISPATCH_MAP() + DECLARE_INTERFACE_MAP() + + //LPARAM OnSetRecipient(WPARAM w, LPARAM l); + LRESULT OnSWMRefreh(WPARAM w, LPARAM l); + HRESULT OnEditUpdate(WPARAM w, LPARAM l); + void OnSmileItem(UINT nID); + + DECLARE_MESSAGE_MAP() +private: + CChat m_Chat; + LONG CurrTID; + + BOOL m_bDisableEditOnStart; + BOOL m_bEnableRefresh; + CCoolMenuManager m_CoolMenuManager; +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CHAT_H__57334E4B_6FAA_4A15_AC98_5AB99FAD07E9__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/ChooseFolder.cpp b/Source/Client/IM-Client/IMClient/ChooseFolder.cpp new file mode 100644 index 0000000..48d38b6 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ChooseFolder.cpp @@ -0,0 +1,75 @@ +// ChooseFolder.cpp: implementation of the CChooseFolder class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "ChooseFolder.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +static int CALLBACK +BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) +{ + TCHAR szPath[_MAX_PATH]; + switch (uMsg) { + case BFFM_INITIALIZED: + if (lpData) + SendMessage(hWnd,BFFM_SETSELECTION,TRUE,lpData); + break; + case BFFM_SELCHANGED: + SHGetPathFromIDList(LPITEMIDLIST(lParam),szPath); + SendMessage(hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath)); + break; + } + return 0; +} + +CChooseFolder::CChooseFolder(HWND hOwner/* = NULL*/) +: m_pShf(NULL), m_pMalloc(NULL) +{ + if (SHGetDesktopFolder(&m_pShf) != NOERROR) m_pShf = NULL; + if (SHGetMalloc(&m_pMalloc) != NOERROR) m_pMalloc = NULL; + memset(&m_asFolder, 0, sizeof(m_asFolder)); + m_asFolder.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; + m_asFolder.pszDisplayName = NULL; + m_asFolder.hwndOwner = hOwner; + m_asFolder.lpfn = BrowseCallbackProc; +} + +CChooseFolder::~CChooseFolder() +{ + if (m_pMalloc) m_pMalloc->Release(); + if (m_pShf) m_pShf->Release(); +} + +BOOL CChooseFolder::DoModal(LPCTSTR title, CString &path, HWND hOwner) +{ + int pathLen = path.GetLength(); + LPTSTR asPath = path.GetBuffer(_MAX_PATH + 1); + /*LPITEMIDLIST pIdl = NULL; + if (pathLen && m_pShf) { // IShellFolder + ULONG chEaten = 0L, dwAttributes = 0L; + LPOLESTR pOleStr = path.AllocSysString(); + m_pShf->ParseDisplayName(hOwner, NULL, pOleStr, &chEaten, &pIdl, &dwAttributes); + ::SysFreeString(pOleStr); + } */ + m_asFolder.lpszTitle = title; + m_asFolder.lParam = LPARAM(asPath); + if (hOwner) m_asFolder.hwndOwner = hOwner; + LPITEMIDLIST item = SHBrowseForFolder(&m_asFolder); + BOOL ok = FALSE; + if (item) ok = SHGetPathFromIDList(item, asPath); + if (m_pMalloc) { + if (item) m_pMalloc->Free(item); + //if (pIdl) m_pMalloc->Free(pIdl); + } + path.ReleaseBuffer(); + return ok; +} diff --git a/Source/Client/IM-Client/IMClient/ChooseFolder.h b/Source/Client/IM-Client/IMClient/ChooseFolder.h new file mode 100644 index 0000000..e5da854 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ChooseFolder.h @@ -0,0 +1,28 @@ +// ChooseFolder.h: interface for the CChooseFolder class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_CHOOSEFOLDER_H__A500610B_4C54_4A20_A071_FCF03D9833C3__INCLUDED_) +#define AFX_CHOOSEFOLDER_H__A500610B_4C54_4A20_A071_FCF03D9833C3__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#pragma comment(lib,"shell32") + +class CChooseFolder +{ +public: + BOOL DoModal(LPCTSTR title, CString &path, HWND hOwner = NULL); + CChooseFolder(HWND hOwner = NULL); + virtual ~CChooseFolder(); + +protected: + LPMALLOC m_pMalloc; + BROWSEINFO m_asFolder; + LPSHELLFOLDER m_pShf; +}; + +#endif // !defined(AFX_CHOOSEFOLDER_H__A500610B_4C54_4A20_A071_FCF03D9833C3__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/ColorMenu.cpp b/Source/Client/IM-Client/IMClient/ColorMenu.cpp new file mode 100644 index 0000000..69d6a80 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ColorMenu.cpp @@ -0,0 +1,162 @@ +// colorlis.cpp : implementation file +// +// This is a part of the Microsoft Foundation Classes C++ library. +// Copyright (C) 1992-1998 Microsoft Corporation +// All rights reserved. +// +// This source code is only intended as a supplement to the +// Microsoft Foundation Classes Reference and related +// electronic documentation provided with the library. +// See these sources for detailed information regarding the +// Microsoft Foundation Classes product. + +#include "stdafx.h" +#include "ColorMenu.h" +#include "resource.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char BASED_CODE THIS_FILE[] = __FILE__; +#endif + +class CDisplayIC : public CDC +{ +public: + CDisplayIC() { CreateIC(_T("DISPLAY"), NULL, NULL, NULL); } +}; + + +///////////////////////////////////////////////////////////////////////////// +// CColorMenu + +/* +int BASED_CODE CColorMenu::indexMap[17] = { + 0, //black + 19, //white + 13, //red + 14, //green + 16, //blue + 15, //yellow + 17, //magenta + 18, //cyan + 1, //dark red + 2, //dark green + 4, //dark blue + 3, //light brown + 5, //purple + 6, //dark cyan + 7, //light gray + 12, //gray + 0}; //automatic +*/ + +int BASED_CODE CColorMenu::indexMap[17] = { + 0, //black + 1, //dark red + 2, //dark green + 3, //light brown + 4, //dark blue + 5, //purple + 6, //dark cyan + 12, //gray + 7, //light gray + 13, //red + 14, //green + 15, //yellow + 16, //blue + 17, //magenta + 18, //cyan + 19, //white + 0}; //automatic + +CColorMenu::CColorMenu() +{ + VERIFY(CreatePopupMenu()); + ASSERT(GetMenuItemCount()==0); + for (int i=0; i<=16;i++) + VERIFY(AppendMenu(MF_OWNERDRAW, ID_COLOR0+i, (LPCTSTR)(ID_COLOR0+i))); + +} + +COLORREF CColorMenu::GetColor(UINT id) +{ + ASSERT(id >= ID_COLOR0); + ASSERT(id <= ID_COLOR16); + if (id == ID_COLOR16) // autocolor + return ::GetSysColor(COLOR_WINDOWTEXT); + else + { + CPalette* pPal = CPalette::FromHandle( (HPALETTE) GetStockObject(DEFAULT_PALETTE)); + ASSERT(pPal != NULL); + PALETTEENTRY pe; + if (pPal->GetPaletteEntries(indexMap[id-ID_COLOR0], 1, &pe) == 0) + return ::GetSysColor(COLOR_WINDOWTEXT); + else + return RGB(pe.peRed,pe.peGreen,pe.peBlue); +// return PALETTEINDEX(CColorMenu::indexMap[id-ID_COLOR0]); + } +} + +void CColorMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS) +{ + ASSERT(lpDIS->CtlType == ODT_MENU); + UINT id = (UINT)(WORD)lpDIS->itemID; + ASSERT(id == lpDIS->itemData); + ASSERT(id >= ID_COLOR0); + ASSERT(id <= ID_COLOR16); + CDC dc; + dc.Attach(lpDIS->hDC); + + CRect rc(lpDIS->rcItem); + ASSERT(rc.Width() < 500); + if (lpDIS->itemState & ODS_FOCUS) + dc.DrawFocusRect(&rc); + + COLORREF cr = (lpDIS->itemState & ODS_SELECTED) ? + ::GetSysColor(COLOR_HIGHLIGHT) : + dc.GetBkColor(); + + CBrush brushFill(cr); + cr = dc.GetTextColor(); + + if (lpDIS->itemState & ODS_SELECTED) + dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); + + int nBkMode = dc.SetBkMode(TRANSPARENT); + dc.FillRect(&rc, &brushFill); + + rc.left += 4;rc.top += 2; + rc.bottom -= 2;rc.right = rc.left + 45; + if(id==ID_COLOR16) + { + dc.DrawText(CString(_T("...")),rc,DT_LEFT|DT_SINGLELINE|DT_VCENTER); + } + else + { + CBrush brush(GetColor(id)); + CBrush* pOldBrush = dc.SelectObject(&brush); + dc.Rectangle(rc); + dc.SelectObject(pOldBrush); + } + + dc.SetTextColor(cr); + dc.SetBkMode(nBkMode); + + dc.Detach(); +} + +void CColorMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS) +{ + ASSERT(lpMIS->CtlType == ODT_MENU); + UINT id = (UINT)(WORD)lpMIS->itemID; + ASSERT(id == lpMIS->itemData); + ASSERT(id >= ID_COLOR0); + ASSERT(id <= ID_COLOR16); + CDisplayIC dc; + CString strColor; + strColor.LoadString(id); + CSize sizeText = dc.GetTextExtent(strColor,strColor.GetLength()); + ASSERT(sizeText.cx < 500); + lpMIS->itemWidth = 40;//sizeText.cx + 20; + lpMIS->itemHeight = 15;//sizeText.cy; +} diff --git a/Source/Client/IM-Client/IMClient/ColorMenu.h b/Source/Client/IM-Client/IMClient/ColorMenu.h new file mode 100644 index 0000000..9009e7e --- /dev/null +++ b/Source/Client/IM-Client/IMClient/ColorMenu.h @@ -0,0 +1,41 @@ +// colorlis.h : header file +// +// This is a part of the Microsoft Foundation Classes C++ library. +// Copyright (C) 1992-1998 Microsoft Corporation +// All rights reserved. +// +// This source code is only intended as a supplement to the +// Microsoft Foundation Classes Reference and related +// electronic documentation provided with the library. +// See these sources for detailed information regarding the +// Microsoft Foundation Classes product. + +///////////////////////////////////////////////////////////////////////////// +// CColorMenu window +#ifndef _COLOR_MENU_H_ + #define _COLOR_MENU_H_ + +class CColorMenu : public CMenu +{ +// Construction +public: + CColorMenu(); + +// Attributes +public: + static int BASED_CODE indexMap[17]; + static COLORREF GetColor(UINT id); + +// Operations +public: + +// Implementation +public: + virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); + virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS); + +}; + + +#endif +///////////////////////////////////////////////////////////////////////////// diff --git a/Source/Client/IM-Client/IMClient/CoolMenu.cpp b/Source/Client/IM-Client/IMClient/CoolMenu.cpp new file mode 100644 index 0000000..cabbd2f --- /dev/null +++ b/Source/Client/IM-Client/IMClient/CoolMenu.cpp @@ -0,0 +1,985 @@ +//////////////////////////////////////////////////////////////// +// CoolMenu 1997 Microsoft Systems Journal. +// If this code works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// +#include "StdAfx.h" +#include "CoolMenu.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +// helpers +void PLFillRect(CDC& dc, const CRect& rc, COLORREF color); +void PLDrawEmbossed(CDC& dc, CImageList& il, int i, + CPoint p, BOOL bColor=FALSE); +HBITMAP PLLoadSysColorBitmap(LPCTSTR lpResName, BOOL bMono=FALSE); +inline HBITMAP PLLoadSysColorBitmap(UINT nResID, BOOL bMono=FALSE) { + return PLLoadSysColorBitmap(MAKEINTRESOURCE(nResID), bMono); +} + +// if you want to see extra TRACE diagnostics, set below to TRUE +BOOL CCoolMenuManager::bTRACE = FALSE; + +#ifdef _DEBUG +#define CMTRACEFN \ + CTraceFn __fooble; \ + if (bTRACE) \ +TRACE +#define CMTRACE \ + if (bTRACE) \ +TRACE +#else +#define CMTRACEFN TRACE +#define CMTRACE TRACE +#endif + +// constants used for drawing +const int CXGAP = 1; // num pixels between button and text +const int CXTEXTMARGIN = 2; // num pixels after hilite to start text +const int CXBUTTONMARGIN = 2; // num pixels wider button is than bitmap +const int CYBUTTONMARGIN = 2; // ditto for height + +// DrawText flags +const UINT DT_MYSTANDARD = DT_SINGLELINE|DT_LEFT|DT_VCENTER; + +// identifies owner-draw data as mine +const LONG MYITEMID = MAKELONG(MAKEWORD('m','i'),MAKEWORD('d','0')); + +// private struct: one of these for each owner-draw menu item +struct CMyItemData { + long magicNum; // magic number identifying me + CString text; // item text + UINT fType; // original item type flags + int iButton; // index of button image in image list + CMyItemData() { magicNum = MYITEMID; } + BOOL IsMyItemData() { return magicNum == MYITEMID; } +}; + +IMPLEMENT_DYNAMIC(CCoolMenuManager, CSubclassWnd) + +CCoolMenuManager::CCoolMenuManager() +{ + m_szBitmap = m_szButton = CSize(0,0); // will compute later + m_bShowButtons = TRUE; // show buttons by default + m_bAutoAccel = TRUE; // auto accelerators by default + m_hAccel = NULL; // no accelerators loaded yet + m_pAccel = NULL; // no accelerators loaded yet + m_bUseDrawState = FALSE; // use DrawEmbossed by default + m_bDrawDisabledButtonsInColor = FALSE; // use color for disabled buttons + FixMFCDotBitmap(); +} + +CCoolMenuManager::~CCoolMenuManager() +{ + Destroy(); +} + +////////////////// +// Destroy everything. Called from destructor and Refresh. +// +void CCoolMenuManager::Destroy() +{ + m_ilButtons.DeleteImageList(); + m_mapIDtoImage.RemoveAll(); + m_szBitmap = m_szButton = CSize(0,0); + m_arToolbarID.RemoveAll(); + m_fontMenu.DeleteObject(); + DestroyAccel(); +} + +///////////////// +// Destroy accelerators +// +void CCoolMenuManager::DestroyAccel() +{ + m_mapIDtoAccel.RemoveAll(); // delete ACCEL entries in map + delete m_pAccel; // delete current accelerators + m_pAccel = NULL; // ... +} + +////////////////// +// Call this to install the menu manager. Install(NULL) to un-install. +// +void CCoolMenuManager::Install(CWnd* pFrame) +{ + ASSERT_VALID(pFrame); + m_pFrame = pFrame; + HookWindow(pFrame); // install message hook +} + +////////////////// +// Load array of toolbar IDs. +// +BOOL CCoolMenuManager::LoadToolbars(const UINT* arID, int n) +{ + ASSERT(arID); + BOOL bRet = TRUE; + for (int i=0; iwVersion==1); + + // OK, I have the bitmap and toolbar. + + CSize sz(ptbd->wWidth, ptbd->wHeight); + if (m_szBitmap.cx==0) { + // First toolbar: initialized bitmap/button sizes and create image list. + m_szBitmap = sz; + m_szButton = sz + CSize(CXBUTTONMARGIN<<1, CYBUTTONMARGIN<<1); + VERIFY(m_ilButtons.Create(sz.cx, sz.cy, ILC_MASK|ILC_COLOR24, 0, 10)); + + } else if (m_szBitmap != sz) { + // button sizes different -- oops + TRACE(_T("*** Toolbar %d button size differs!\n"), nIDToolbar); + return FALSE; + } + + // I have a good toolbar: now add bitmap to the image list, and each + // command ID to m_mapIDtoImage array. Note that LoadSysColorBitmap will + // change gray -> COLOR_3DFACE, so use that for image list background. + // + int iNextImage = m_ilButtons.GetImageCount(); + m_ilButtons.Add(&bmToolbar, GetSysColor(COLOR_3DFACE)); + for (int i = 0; i < ptbd->wItemCount; i++) { + UINT nID = ptbd->items[i]; + if (nID > 0) { + if (GetButtonIndex(nID) >= 0) { + TRACE(_T("*** Duplicate button ID %d ignored\n"), nID); + } else + m_mapIDtoImage.SetAt(nID, (void*)iNextImage++); + } + } + m_arToolbarID.Add(nIDToolbar); // remember toolbar ID for Refresh + bmToolbar.Detach(); + return TRUE; // success! +} + +BOOL CCoolMenuManager::LoadToolbar(const CBitmap &Image, TOOLBARDATA *pTbd, COLORREF TransparentColor) +{ + // OK, I have the bitmap and toolbar. + + CSize sz(pTbd->wWidth, pTbd->wHeight); + if (m_szBitmap.cx==0) + { + // First toolbar: initialized bitmap/button sizes and create image list. + m_szBitmap = sz; + m_szButton = sz + CSize(CXBUTTONMARGIN<<1, CYBUTTONMARGIN<<1); + VERIFY(m_ilButtons.Create(sz.cx, sz.cy, ILC_MASK|ILC_COLOR24, 0, 10)); + + } else if (m_szBitmap != sz) { + // button sizes different -- oops + TRACE(_T("*** Toolbar Custom button size differs!\n")); + return FALSE; + } + + // I have a good toolbar: now add bitmap to the image list, and each + // command ID to m_mapIDtoImage array. Note that LoadSysColorBitmap will + // change gray -> COLOR_3DFACE, so use that for image list background. + // + int iNextImage = m_ilButtons.GetImageCount(); + m_ilButtons.Add((CBitmap*)&Image, TransparentColor); + for (int i = 0; i < pTbd->wItemCount; i++) { + UINT nID = pTbd->items[i]; + if (nID > 0) { + if (GetButtonIndex(nID) >= 0) { + TRACE(_T("*** Duplicate button ID %d ignored\n"), nID); + } else + m_mapIDtoImage.SetAt(nID, (void*)iNextImage++); + } + } + //m_arToolbarID.Add(nIDToolbar); // remember toolbar ID for Refresh + return TRUE; // success! +} + + +////////////////// +// Virtual CSubclassWnd window proc. All messages come here before frame +// window. Isn't it cool? Just like in the old days! +// +LRESULT CCoolMenuManager::WindowProc(UINT msg, WPARAM wp, LPARAM lp) +{ + switch(msg) { + case WM_SYSCOLORCHANGE: + case WM_SETTINGCHANGE: + Refresh(); + break; + + case WM_MEASUREITEM: + if (OnMeasureItem((MEASUREITEMSTRUCT*)lp)) + return TRUE; // handled + break; + + case WM_DRAWITEM: + if (OnDrawItem((DRAWITEMSTRUCT*)lp)) + return TRUE; // handled + break; + + case WM_INITMENUPOPUP: + // Very important: must let frame window handle it first! + // Because if someone calls CCmdUI::SetText, MFC will change item to + // MFT_STRING, so I must change back to MFT_OWNERDRAW. + // + CSubclassWnd::WindowProc(msg, wp, lp); + OnInitMenuPopup(CMenu::FromHandle((HMENU)wp), + (UINT)LOWORD(lp), (BOOL)HIWORD(lp)); + return 0; + + case WM_MENUSELECT: + OnMenuSelect((UINT)LOWORD(wp), (UINT)HIWORD(wp), (HMENU)lp); + break; + + case WM_MENUCHAR: + LRESULT lr = OnMenuChar((TCHAR)LOWORD(wp), (UINT)HIWORD(wp), + CMenu::FromHandle((HMENU)lp)); + if (lr!=0) + return lr; + break; + } + return CSubclassWnd::WindowProc(msg, wp, lp); +} + +////////////////// +// Refresh all colors, fonts, etc. For WM_SETTINGCHANGE, WM_SYSCOLORCHANGE. +// +void CCoolMenuManager::Refresh() +{ + if(m_arToolbarID.GetSize()==0) + return; + + // first copy list (array) of toolbar IDs now loaded. + CUIntArray arToolbarID; + arToolbarID.Copy(m_arToolbarID); + + // destroy everything + Destroy(); + + // re-load toolbars. + int nToolbars = arToolbarID.GetSize(); + for (int i = 0; i < nToolbars; i++) + LoadToolbar(arToolbarID[i]); +} + +////////////////// +// Get menu font, creating if needed +// +CFont* CCoolMenuManager::GetMenuFont() +{ + if (!(HFONT)m_fontMenu) { + NONCLIENTMETRICS info; + info.cbSize = sizeof(info); + SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); + VERIFY(m_fontMenu.CreateFontIndirect(&info.lfMenuFont)); + } + return &m_fontMenu; +} + +////////////////// +// Handle WM_MEASUREITEM on behalf of frame: compute menu item size. +// +BOOL CCoolMenuManager::OnMeasureItem(LPMEASUREITEMSTRUCT lpms) +{ + ASSERT(lpms); + CMyItemData* pmd = (CMyItemData*)lpms->itemData; + ASSERT(pmd); + if (lpms->CtlType != ODT_MENU || !pmd->IsMyItemData()) + return FALSE; // not handled by me + + if (pmd->fType & MFT_SEPARATOR) { + // separator: use half system height and zero width + lpms->itemHeight = GetSystemMetrics(SM_CYMENU)>>1; + lpms->itemWidth = 0; + + } else { + + // compute size of text: use DrawText with DT_CALCRECT + + CWindowDC dc(NULL); // screen DC--I won't actually draw on it + CRect rcText(0,0,0,0); + CFont* pOldFont = dc.SelectObject(GetMenuFont()); + dc.DrawText(pmd->text, rcText, DT_MYSTANDARD|DT_CALCRECT); + dc.SelectObject(pOldFont); + + // height of item is just height of a standard menu item + lpms->itemHeight= max(GetSystemMetrics(SM_CYMENU), rcText.Height()); + + // width is width of text plus a bunch of stuff + int cx = rcText.Width(); // text width + cx += CXTEXTMARGIN<<1; // L/R margin for readability + cx += CXGAP; // space between button and menu text + cx += m_szButton.cx<<1; // button width (L=button; R=empty margin) + + // whatever value I return in lpms->itemWidth, Windows will add the + // width of a menu checkmark, so I must subtract to defeat Windows. Argh. + // + cx -= GetSystemMetrics(SM_CXMENUCHECK)-1; + lpms->itemWidth = cx; // done deal + + CMTRACE(_T("OnMeasureItem for '%s':\tw=%d h=%d\n"), (LPCTSTR)pmd->text, + lpms->itemWidth, lpms->itemHeight); + } + return TRUE; // handled +} + +///////////////// +// Handle WM_DRAWITEM on behalf of frame. Note: in all that goes +// below, can't assume rcItem.left=0 because of multi-column menus! +// +BOOL CCoolMenuManager::OnDrawItem(LPDRAWITEMSTRUCT lpds) +{ + ASSERT(lpds); + CMyItemData* pmd = (CMyItemData*)lpds->itemData; + ASSERT(pmd); + if (lpds->CtlType != ODT_MENU || !pmd->IsMyItemData()) + return FALSE; // not handled by me + + ASSERT(lpds->itemAction != ODA_FOCUS); + ASSERT(lpds->hDC); + CDC dc; + dc.Attach(lpds->hDC); + + const CRect& rcItem = lpds->rcItem; + if (pmd->fType & MFT_SEPARATOR) { + // draw separator + CRect rc = rcItem; // copy rect + rc.top += rc.Height()>>1; // vertical center + dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line + + } else { // not a separator + + CMTRACE(_T("OnDrawItem for '%s':\tw=%d h=%d\n"), (LPCTSTR)pmd->text, + rcItem.Width(), rcItem.Height()); + + BOOL bDisabled = lpds->itemState & ODS_GRAYED; + BOOL bSelected = lpds->itemState & ODS_SELECTED; + BOOL bChecked = lpds->itemState & ODS_CHECKED; + BOOL bHaveButn=FALSE; + + // Paint button, or blank if none + CRect rcButn(rcItem.TopLeft(), m_szButton); // button rect + rcButn += CPoint(0, // center vertically + (rcItem.Height() - rcButn.Height())>>1 ); + + int iButton = pmd->iButton; + TRACE("OnDrawItem ID = %d", iButton); + if (iButton >= 0) { + + // this item has a button! + bHaveButn = TRUE; + + // compute point to start drawing + CSize sz = rcButn.Size() - m_szBitmap; + sz.cx >>= 1; + sz.cy >>= 1; + CPoint p(rcButn.TopLeft() + sz); + + // draw disabled or normal + if (!bDisabled) { + // normal: fill BG depending on state + PLFillRect(dc, rcButn, GetSysColor( + (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU)); + + // draw pushed-in or popped-out edge + if (bSelected || bChecked) { + CRect rc2 = rcButn; + dc.DrawEdge(rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, + BF_RECT); + } + // draw the button! + m_ilButtons.Draw(&dc, iButton, p, ILD_TRANSPARENT); + + } else if (m_bUseDrawState) { + // use DrawState to draw disabled button: must convert to icon + HICON hIcon=m_ilButtons.ExtractIcon(iButton); + ASSERT(hIcon); + dc.DrawState(p, CSize(0,0), hIcon, DSS_DISABLED, (HBRUSH)NULL); + DestroyIcon(hIcon); + + } else + // use DrawEmbossed to draw disabeld button, w/color flag + PLDrawEmbossed(dc, m_ilButtons, iButton, p, + m_bDrawDisabledButtonsInColor); + + } else { + // no button: look for custom checked/unchecked bitmaps + CMenuItemInfo info; + info.fMask = MIIM_CHECKMARKS; + GetMenuItemInfo((HMENU)lpds->hwndItem, + lpds->itemID, MF_BYCOMMAND, &info); + if (bChecked || info.hbmpUnchecked) { + bHaveButn = Draw3DCheckmark(dc, rcButn, bSelected, + bChecked ? info.hbmpChecked : info.hbmpUnchecked); + } + } + + // Done with button, now paint text. First do background if needed. + int cxButn = m_szButton.cx; // width of button + COLORREF colorBG = GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU); + if (bSelected || lpds->itemAction==ODA_SELECT) { + // selected or selection state changed: paint text background + CRect rcBG = rcItem; // whole rectangle + if (bHaveButn) // if there's a button: + rcBG.left += cxButn + CXGAP; // don't paint over it! + PLFillRect(dc, rcBG, colorBG); // paint it! + } + + // compute text rectangle and colors + CRect rcText = rcItem; // start w/whole item + rcText.left += cxButn + CXGAP + CXTEXTMARGIN; // left margin + rcText.right -= cxButn; // right margin + dc.SetBkMode(TRANSPARENT); // paint transparent text + COLORREF colorText = GetSysColor(bDisabled ? COLOR_GRAYTEXT : + bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT); + + // Now paint menu item text. No need to select font, + // because windows sets it up before sending WM_DRAWITEM + // + if (bDisabled && (!bSelected || colorText == colorBG)) { + // disabled: draw hilite text shifted southeast 1 pixel for embossed + // look. Don't do it if item is selected, tho--unless text color same + // as menu highlight color. Got it? + // + DrawMenuText(dc, rcText + CPoint(1,1), pmd->text, + GetSysColor(COLOR_3DHILIGHT)); + } + DrawMenuText(dc, rcText, pmd->text, colorText); // finally! + } + dc.Detach(); + + return TRUE; // handled +} + +///////////////// +// Helper function to draw justified menu text. If the text contains a TAB, +// draw everything after the tab right-aligned +// +void CCoolMenuManager::DrawMenuText(CDC& dc, CRect rc, CString text, + COLORREF color) +{ + CString left = text; + CString right; + int iTabPos = left.Find('\t'); + if (iTabPos >= 0) { + right = left.Right(left.GetLength() - iTabPos - 1); + left = left.Left(iTabPos); + } + dc.SetTextColor(color); + dc.DrawText(left, &rc, DT_MYSTANDARD); + if (iTabPos > 0) + dc.DrawText(right, &rc, DT_MYSTANDARD|DT_RIGHT); +} + +#ifndef OBM_CHECK +#define OBM_CHECK 32760 // from winuser.h +#endif + +////////////////// +// Draw 3D checkmark +// +// dc device context to draw in +// rc rectangle to center bitmap in +// bSelected TRUE if button is also selected +// hbmCheck Checkmark bitmap to use, or NULL for default +// +BOOL CCoolMenuManager::Draw3DCheckmark(CDC& dc, const CRect& rc, + BOOL bSelected, HBITMAP hbmCheck) +{ + // get checkmark bitmap if none, use Windows standard + if (!hbmCheck) { + CBitmap bm; + VERIFY(bm.LoadOEMBitmap(OBM_CHECK)); + hbmCheck = (HBITMAP)bm.Detach(); + ASSERT(hbmCheck); + } + + // center bitmap in caller's rectangle + BITMAP bm; + ::GetObject(hbmCheck, sizeof(bm), &bm); + int cx = bm.bmWidth; + int cy = bm.bmHeight; + CRect rcDest = rc; + CPoint p(0,0); + CSize delta(CPoint((rc.Width() - cx)/2, (rc.Height() - cy)/2)); + if (rc.Width() > cx) + rcDest = CRect(rc.TopLeft() + delta, CSize(cx, cy)); + else + p -= delta; + + // select checkmark into memory DC + CDC memdc; + memdc.CreateCompatibleDC(&dc); + HBITMAP hOldBM = (HBITMAP)::SelectObject(memdc, hbmCheck); + + // set BG color based on selected state + COLORREF colorOld = + dc.SetBkColor(GetSysColor(bSelected ? COLOR_MENU : COLOR_3DLIGHT)); + dc.BitBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(), + &memdc, p.x, p.y, SRCCOPY); + dc.SetBkColor(colorOld); + + ::SelectObject(memdc, hOldBM); // restore + + // draw pushed-in hilight. + if (rc.Width() > cx) // if room: + rcDest.InflateRect(1,1); // inflate checkmark by one pixel all around + dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT); + + return TRUE; +} + +////////////////// +// Handle WM_INITMENUPOPUP on behalf of frame. +// +void CCoolMenuManager::OnInitMenuPopup(CMenu* pMenu, + UINT nIndex, BOOL bSysMenu) +{ + if (m_bAutoAccel) { + // check for new accels. If ASSERT bombs, you forgot to call Install. + ASSERT_VALID(m_pFrame); + //HACCEL hAccel = m_pFrame->GetDefaultAccelerator(); + //if (hAccel != m_hAccel) + // LoadAccel(hAccel); + } + ConvertMenu(pMenu, nIndex, bSysMenu, m_bShowButtons); +} + +////////////////// +// Set the accelerator table used to generate automatic key +// names in menus. Delete previous table if any. +// +void CCoolMenuManager::LoadAccel(HACCEL hAccel) +{ + DestroyAccel(); + int nAccel; + if (hAccel && (nAccel = CopyAcceleratorTable(hAccel, NULL, 0)) > 0) { + m_pAccel = new ACCEL [nAccel]; + ASSERT(m_pAccel); + CopyAcceleratorTable(hAccel, m_pAccel, nAccel); + + // Now I have the accelerators. Look over list, linking each command + // ID with its ACCEL structure--i.e., m_mapIDtoAccel[nID] = ACCEL for + // that ID. If more than one ACCEL for a given command (command has more + // than one shortcut), fix up so ACCEL.cmd is offset of prev ACCEL + // + for (int i=0; iGetMenuItemCount(); + + for (UINT i = 0; i < nItem; i++) + { // loop over each item in menu + + // get menu item info + TCHAR itemname[256]; + ZeroMemory(itemname,sizeof(itemname)); + + CMenuItemInfo info; + + info.fMask = MIIM_SUBMENU | MIIM_DATA | MIIM_ID | MIIM_TYPE; + info.dwTypeData = itemname; + info.cch = sizeof(itemname); + + BOOL bRetValue = ::GetMenuItemInfo(pMenu->GetSafeHmenu(), i, TRUE, &info); + + if(!bRetValue) + continue; + + CMyItemData* pmd = (CMyItemData*)info.dwItemData; + + if (pmd && !pmd->IsMyItemData()) { + CMTRACE(_T("CCoolMenuManager: ignoring foreign owner-draw item\n")); + continue; // owner-draw menu item isn't mine--leave it alone + } + + if (bSysMenu && info.wID >= 0xF000) { + CMTRACE(_T("CCoolMenuManager: ignoring sys menu item\n")); + continue; // don't do for system menu commands + } + + // now that I have the info, I will modify it + info.fMask = 0; // assume nothing to change + + if (bShowButtons) + { + + // I'm showing buttons: convert to owner-draw + + if (!(info.fType & MFT_OWNERDRAW)) + { + // If not already owner-draw, make it so. NOTE: If app calls + // pCmdUI->SetText to change the text of a menu item, MFC will + // turn the item to MFT_STRING. So I must set it back to + // MFT_OWNERDRAW again. In this case, the menu item data (pmd) + // will still be there. + // + info.fType |= MFT_OWNERDRAW; + info.fMask |= MIIM_TYPE; + if (!pmd) { // if no item data: + pmd = new CMyItemData; // create one + ASSERT(pmd); // (I hope) + pmd->fType = info.fType; // handy when drawing + pmd->iButton = GetButtonIndex(info.wID); + info.dwItemData = (DWORD)pmd; // set in menu item data + info.fMask |= MIIM_DATA; // set item data + } + pmd->text = reinterpret_cast(info.dwTypeData); // copy menu item string + } + + // now add the menu to list of "converted" menus + HMENU hmenu = pMenu->GetSafeHmenu(); + ASSERT(hmenu); + if (!m_menuList.Find(hmenu)) + m_menuList.AddHead(hmenu); + + // append accelerators to menu item name + if (m_pAccel && m_bAutoAccel) + AppendAccelName(pmd->text, info.wID); + + } else { + + // no buttons -- I'm converting to strings + + if (info.fType & MFT_OWNERDRAW) { // if ownerdraw: + info.fType &= ~MFT_OWNERDRAW; // turn it off + info.fMask |= MIIM_TYPE; // change item type + ASSERT(pmd); // sanity check + sItemName = pmd->text; // save name before deleting pmd + } else // otherwise: + sItemName = reinterpret_cast(info.dwTypeData); // use name from MENUITEMINFO + + if (pmd) { + // NOTE: pmd (item data) could still be left hanging around even + // if MFT_OWNERDRAW is not set, in case mentioned above where app + // calls pCmdUI->SetText to set text of item and MFC sets the type + // to MFT_STRING. + // + info.dwItemData = NULL; // item data is NULL + info.fMask |= MIIM_DATA; // change it + delete pmd; // and item data too + } + + // possibly add accelerator name + if (m_pAccel && m_bAutoAccel && AppendAccelName(sItemName, info.wID)) + info.fMask |= MIIM_TYPE; // change item type (string) + + if (info.fMask & MIIM_TYPE) { + // if setting name, copy name from CString to buffer and set cch + info.cch = sItemName.GetLength(); + _tcsncpy(itemname, sItemName, info.cch); + info.dwTypeData = itemname; + } + } + + // if after all the above, there is anything to change, change it + if (info.fMask) { + CMTRACE(_T("Converting '%s' to %s\n"), itemname, + (info.fType & MFT_OWNERDRAW) ? _T("OWNERDRAW") : _T("STRING")); + SetMenuItemInfo(*pMenu, i, TRUE, &info); + } + } +} + +////////////////// +// User typed a char into menu. Look for item with & preceeding the char typed. +// +LONG CCoolMenuManager::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) +{ + ASSERT_VALID(pMenu); + + UINT iCurrentItem = (UINT)-1; // guaranteed higher than any command ID + CUIntArray arItemsMatched; // items that match the character typed + + UINT nItem = pMenu->GetMenuItemCount(); + for (UINT i=0; i< nItem; i++) { + // get menu info + CMenuItemInfo info; + info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE; + ::GetMenuItemInfo(*pMenu, i, TRUE, &info); + + CMyItemData* pmd = (CMyItemData*)info.dwItemData; + if ((info.fType & MFT_OWNERDRAW) && pmd && pmd->IsMyItemData()) { + CString& text = pmd->text; + int iAmpersand = text.Find('&'); + if (iAmpersand >=0 && toupper(nChar)==toupper(text[iAmpersand+1])) + arItemsMatched.Add(i); + } + if (info.fState & MFS_HILITE) + iCurrentItem = i; // note index of current item + } + + // arItemsMatched now contains indexes of items that match the char typed. + // + // * if none: beep + // * if one: execute it + // * if more than one: hilite next + // + UINT nFound = arItemsMatched.GetSize(); + if (nFound == 0) + return 0; + + else if (nFound==1) + return MAKELONG(arItemsMatched[0], MNC_EXECUTE); + + // more than one found--return 1st one past current selected item; + UINT iSelect = 0; + for (UINT i=0; i < nFound; i++) { + if (arItemsMatched[i] > iCurrentItem) { + iSelect = i; + break; + } + } + return MAKELONG(arItemsMatched[iSelect], MNC_SELECT); +} + +////////////////// +// Handle WM_MENUSELECT: check for menu closed +// +void CCoolMenuManager::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) +{ + if (hSysMenu==NULL && nFlags==0xFFFF) { + // Windows has closed the menu: restore all menus to original state + while (!m_menuList.IsEmpty()) { + ConvertMenu(CMenu::FromHandle((HMENU)m_menuList.RemoveHead()), + 0, FALSE, FALSE); + } + } +} + +////////////////// +// Append the name of accelerator for given command ID to menu string. +// sItemName is menu item name, which will have the accelerator appended. +// For example, might call with sItemName = "File &Open" and return with +// sItemName = "File &Open\tCtrl-O". Returns BOOL = whether string changed. +// +BOOL CCoolMenuManager::AppendAccelName(CString& sItemName, UINT nID) +{ + int iTabPos = sItemName.Find('\t'); + if (iTabPos > 0) + sItemName = sItemName.Left(iTabPos); + + BOOL bFound = FALSE; + for (ACCEL* pa = GetAccel(nID); pa; pa -= pa->cmd) { + sItemName += bFound ? _T(", ") : _T("\t"); + if (pa->fVirt & FALT) sItemName += _T("Alt+"); + if (pa->fVirt & FCONTROL) sItemName += _T("Ctrl+"); + if (pa->fVirt & FSHIFT) sItemName += _T("Shift+"); + if (pa->fVirt & FVIRTKEY) { + TCHAR keyname[64]; + UINT vkey = MapVirtualKey(pa->key, 0)<<16; + GetKeyNameText(vkey, keyname, sizeof(keyname)); + sItemName += keyname; + } else + sItemName += (char)pa->key; + + bFound = TRUE; + if (pa->cmd == 0) + break; + } + return bFound; +} + +////////////////// +// This function fixes MFC's diseased dot bitmap used for +// "radio-style" menu items (CCmdUI->SetRadio), which is completely +// wrong if the menu font is large. +// +void CCoolMenuManager::FixMFCDotBitmap() +{ + HBITMAP hbmDot = GetMFCDotBitmap(); + if (hbmDot) { + // Draw a centered dot of appropriate size + BITMAP bm; + ::GetObject(hbmDot, sizeof(bm), &bm); + CRect rcDot(0,0, bm.bmWidth, bm.bmHeight); + rcDot.DeflateRect((bm.bmWidth>>1)-2, (bm.bmHeight>>1)-2); + + CWindowDC dcScreen(NULL); + CDC memdc; + memdc.CreateCompatibleDC(&dcScreen); + int nSave = memdc.SaveDC(); + memdc.SelectStockObject(BLACK_PEN); + memdc.SelectStockObject(BLACK_BRUSH); + memdc.SelectObject((HGDIOBJ)hbmDot); + memdc.PatBlt(0, 0, bm.bmWidth, bm.bmHeight, WHITENESS); + memdc.Ellipse(&rcDot); + memdc.RestoreDC(nSave); + } +} + +////////////////// +// This function gets MFC's dot bitmap. +// +HBITMAP CCoolMenuManager::GetMFCDotBitmap() +{ + // The bitmap is stored in afxData.hbmMenuDot, but afxData is MFC-private, + // so the only way to get it is create a menu, set the radio check, + // and then see what bitmap MFC set in the menu item. + CMenu menu; + VERIFY(menu.CreateMenu()); + VERIFY(menu.AppendMenu(MFT_STRING, 0, (LPCTSTR)NULL)); + CCmdUI cui; + cui.m_pMenu = &menu; + cui.m_nIndex = 0; + cui.m_nIndexMax = 1; + cui.SetRadio(TRUE); + CMenuItemInfo info; + info.fMask = MIIM_CHECKMARKS; + GetMenuItemInfo(menu, 0, MF_BYPOSITION, &info); + HBITMAP hbmDot = info.hbmpChecked; + menu.DestroyMenu(); + return hbmDot; +} + +//////////////////////////////////////////////////////////////// +// Helper functions + +////////////////// +// Load a bitmap, converting the standard colors. +// Calls AfxLoadSysColorBitmap to do the work. +// +// RGB(0x00, 0x00, 0x00) (black) --> COLOR_BTNTEXT +// RGB(0x80, 0x80, 0x80) (dark gray) --> COLOR_3DSHADOW +// RGB(0xC0, 0xC0, 0xC0) (gray) --> COLOR_3DFACE +// RGB(0xFF, 0xFF, 0xFF) (white) --> COLOR_3DHILIGHT +// +HBITMAP PLLoadSysColorBitmap(LPCTSTR lpResName, BOOL bMono) +{ + HINSTANCE hInst = AfxFindResourceHandle(lpResName, RT_BITMAP); + HRSRC hRsrc = ::FindResource(hInst, lpResName, RT_BITMAP); + if (hRsrc == NULL) + return NULL; + return AfxLoadSysColorBitmap(hInst, hRsrc, bMono); +} + +////////////////// +// Shorthand to fill a rectangle with a solid color. +// +void PLFillRect(CDC& dc, const CRect& rc, COLORREF color) +{ + CBrush brush(color); + CBrush* pOldBrush = dc.SelectObject(&brush); + dc.PatBlt(rc.left, rc.top, rc.Width(), rc.Height(), PATCOPY); + dc.SelectObject(pOldBrush); +} + +// This is the magic ROP code used to generate the embossed look for +// a disabled button. It's listed in Appendix F of the Win32 Programmer's +// Reference as PSDPxax (!) which is a cryptic reverse-polish notation for +// +// ((Destination XOR Pattern) AND Source) XOR Pattern +// +// which I leave to you to figure out. In the case where I apply it, +// Source is a monochrome bitmap which I want to draw in such a way that +// the black pixels get transformed to the brush color and the white pixels +// draw transparently--i.e. leave the Destination alone. +// +// black ==> Pattern (brush) +// white ==> Destintation (ie, transparent) +// +// 0xb8074a is the ROP code that does this. For more info, see Charles +// Petzold, _Programming Windows_, 2nd Edition, p 622-624. +// +#define TRANSPARENTROP 0xb8074a + +////////////////// +// Draw an image with the embossed (disabled) look. +// +// dc device context to draw in +// il image list containing image +// i index of image to draw +// p point in dc to draw image at +// bColor do color embossing. Default is B/W. +// +void PLDrawEmbossed(CDC& dc, CImageList& il, int i, + CPoint p, BOOL bColor) +{ + IMAGEINFO info; + VERIFY(il.GetImageInfo(0, &info)); + CRect rc = info.rcImage; + int cx = rc.Width(); + int cy = rc.Height(); + + // create memory dc + CDC memdc; + memdc.CreateCompatibleDC(&dc); + + // create mono or color bitmap + CBitmap bm; + if (bColor) + bm.CreateCompatibleBitmap(&dc, cx, cy); + else + bm.CreateBitmap(cx, cy, 1, 1, NULL); + + // draw image into memory DC--fill BG white first + CBitmap* pOldBitmap = memdc.SelectObject(&bm); + memdc.PatBlt(0, 0, cx, cy, WHITENESS); + il.Draw(&memdc, i, CPoint(0,0), ILD_TRANSPARENT); + + // This seems to be required. Why, I don't know. ??? + COLORREF colorOldBG = dc.SetBkColor(RGB(255,255,255)); // white + + // Draw using hilite offset by (1,1), then shadow + CBrush brShadow(GetSysColor(COLOR_3DSHADOW)); + CBrush brHilite(GetSysColor(COLOR_3DHIGHLIGHT)); + CBrush* pOldBrush = dc.SelectObject(&brHilite); + dc.BitBlt(p.x+1, p.y+1, cx, cy, &memdc, 0, 0, TRANSPARENTROP); + dc.SelectObject(&brShadow); + dc.BitBlt(p.x, p.y, cx, cy, &memdc, 0, 0, TRANSPARENTROP); + dc.SelectObject(pOldBrush); + dc.SetBkColor(colorOldBG); // restore + memdc.SelectObject(pOldBitmap); // ... +} + diff --git a/Source/Client/IM-Client/IMClient/CoolMenu.h b/Source/Client/IM-Client/IMClient/CoolMenu.h new file mode 100644 index 0000000..2c08b8d --- /dev/null +++ b/Source/Client/IM-Client/IMClient/CoolMenu.h @@ -0,0 +1,109 @@ +//////////////////////////////////////////////////////////////// +// 199 Microsoft Systems Journal. +// If this code works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// +#include "SubClass.h" + +#pragma once +////////////////// +// CCoolMenuManager implements "cool" menus with buttons in them. To use: +// +// * Instantiate in your CMainFrame. +// * Call Install to install it +// * Call LoadToolbars or LoadToolbar to load toolbars +// +// Don't forget to link with CoolMenu.cpp, Subclass.cpp and DrawTool.cpp! +// +// structure of RT_TOOLBAR resource +struct TOOLBARDATA { + WORD wVersion; // version # should be 1 + WORD wWidth; // width of one bitmap + WORD wHeight; // height of one bitmap + WORD wItemCount; // number of items + WORD *items; // array of command IDs, actual size is wItemCount +}; + +class CCoolMenuManager : private CSubclassWnd { +public: + BOOL LoadToolbar(const CBitmap& Image, TOOLBARDATA* pTbd, COLORREF TransparentColor = 0xff00ff); + DECLARE_DYNAMIC(CCoolMenuManager) + CCoolMenuManager(); + ~CCoolMenuManager(); + + // You can set these any time + BOOL m_bShowButtons; // use to control whether buttons are shown + BOOL m_bAutoAccel; // generate auto accelerators + BOOL m_bUseDrawState; // use ::DrawState for disabled buttons + BOOL m_bDrawDisabledButtonsInColor; // draw disabled buttons in color + // (only if m_bUseDrawState = FALSE) + + // public functions to use + void Install(CWnd* pFrame); // connect to main frame + BOOL LoadToolbars(const UINT* arIDs, int n); // load multiple toolbars + BOOL LoadToolbar(UINT nID); // load one toolbar + + // should never need to call: + virtual void Destroy(); // destroys everything--to re-load new toolbars? + virtual void Refresh(); // called when system colors, etc change + static HBITMAP GetMFCDotBitmap(); // get.. + static void FixMFCDotBitmap(); // and fix MFC's dot bitmap + + static BOOL bTRACE; // Set TRUE to see extra diagnostics in DEBUG code + +protected: + CWnd* m_pFrame; // frame window I belong to + CUIntArray m_arToolbarID; // array of toolbar IDs loaded + CImageList m_ilButtons; // image list for all buttons + CMapWordToPtr m_mapIDtoImage;// maps command ID -> image list index + CMapWordToPtr m_mapIDtoAccel;// maps command ID -> ACCEL* + HACCEL m_hAccel; // current accelerators, if any + ACCEL* m_pAccel; // ..and table in memory + CPtrList m_menuList; // list of HMENU's initialized + CSize m_szBitmap; // size of button bitmap + CSize m_szButton; // size of button (including shadow) + CFont m_fontMenu; // menu font + + // helpers + void DestroyAccel(); + void DrawMenuText(CDC& dc, CRect rc, CString text, COLORREF color); + BOOL Draw3DCheckmark(CDC& dc, const CRect& rc, BOOL bSelected, + HBITMAP hbmCheck=NULL); + void ConvertMenu(CMenu* pMenu,UINT nIndex,BOOL bSysMenu,BOOL bShowButtons); + void LoadAccel(HACCEL hAccel); + BOOL AppendAccelName(CString& sItemName, UINT nID); + CFont* GetMenuFont(); + + // Get button index for given command ID, or -1 if not found + int GetButtonIndex(WORD nID) { + void* val; + return m_mapIDtoImage.Lookup(nID, val) ? (int)val : -1; + } + + // Get ACCEL structure associated with a given command ID + ACCEL* GetAccel(WORD nID) { + void* val; + return m_mapIDtoAccel.Lookup(nID, val) ? (ACCEL*)val : NULL; + } + + // window proc to hook frame using CSubclassWnd implementation + virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp); + + // CSubclassWnd message handlers + virtual void OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu); + virtual BOOL OnMeasureItem(LPMEASUREITEMSTRUCT lpms); + virtual BOOL OnDrawItem(LPDRAWITEMSTRUCT lpds); + virtual LONG OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu); + virtual void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu); +}; + +////////////////// +// Friendly version of MENUITEMINFO initializes itself +// +struct CMenuItemInfo : public MENUITEMINFO { + CMenuItemInfo() + { memset(this, 0, sizeof(MENUITEMINFO)); + cbSize = sizeof(MENUITEMINFO); + } +}; + diff --git a/Source/Client/IM-Client/IMClient/CxImageCtrl.cpp b/Source/Client/IM-Client/IMClient/CxImageCtrl.cpp new file mode 100644 index 0000000..fb90014 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/CxImageCtrl.cpp @@ -0,0 +1,1060 @@ +// CxImageCtrl.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "CxImageCtrl.h" +#include "memdc.h" +#include "TextCommentSettings.h" +#include ".\cximagectrl.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CCxImageCtrl + +CCxImageCtrl::CCxImageCtrl() +{ + m_dwWidth = 0; + m_dwHeight = 0; + m_nVScrollPos = 0; + m_nHScrollPos = 0; + + m_bStretchMode = FALSE; + m_iZoomValue = 1.0; + m_btQuality = 100; + + m_brHatch.CreateHatchBrush(HS_DIAGCROSS, RGB(191, 191, 191)); + + m_State = CCxImageCtrl::IS_Move; + + m_bCaptureWasSet = FALSE; + + m_iUndoListCurrPosition = 0; + + m_bCurrentImageWasSave = false; + + m_bIsSaved = false; + + m_PenColor = RGB(0xFF,0x0,0x0); + m_TextColor = RGB(0x0,0x0,0x0); + m_TextSize = 12; + m_FontName = _T("Arial"); + + m_pTextComment = NULL; + +} + +CCxImageCtrl::~CCxImageCtrl() +{ + for(CImageUndoEnum Index = m_UndoList.begin();Index!=m_UndoList.end();Index++) + { + delete *Index; + } + m_UndoList.clear(); + + if (m_pTextComment != NULL) + { + delete m_pTextComment; + } +} + + +BEGIN_MESSAGE_MAP(CCxImageCtrl, CWnd) + //{{AFX_MSG_MAP(CCxImageCtrl) + ON_WM_PAINT() + ON_WM_ERASEBKGND() + ON_WM_SIZE() + ON_WM_VSCROLL() + ON_WM_HSCROLL() + ON_WM_LBUTTONDOWN() + ON_WM_LBUTTONUP() + ON_WM_SETCURSOR() + ON_WM_MOUSEMOVE() + ON_WM_CAPTURECHANGED() + + //}}AFX_MSG_MAP + ON_WM_LBUTTONDBLCLK() +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CCxImageCtrl message handlers +void CCxImageCtrl::Refresh() +{ + if(m_hImage.IsValid()&&IsWindow(GetSafeHwnd())) + { + SetZoomValue(GetZoomValue()); + + CRect ClipRect; + GetClientRect(&ClipRect); + OnSize(SIZE_RESTORED,ClipRect.Width(),ClipRect.Height()); + + Invalidate(FALSE); + } +} + +bool CCxImageCtrl::CreateFromHBITMAP (HBITMAP hbmp, HPALETTE hpal) +{ + bool bRetVal = m_hImage.CreateFromHBITMAP(hbmp,hpal); + + if(m_hImage.IsIndexed()) + m_hImage.IncreaseBpp(24); + + Refresh(); + + return bRetVal; +} + +void CCxImageCtrl::OnPaint() +{ + CPaintDC dc(this); // device context for painting + + CRect ClipRect; + GetClientRect(&ClipRect); + + if(m_hImage.IsValid()) + { + if(GetStretchMode()) + { + m_hImage.Stretch(dc,ClipRect); + + if(m_bCaptureWasSet&&GetState()==CCxImageCtrl::IS_Crop) + { + dc.Draw3dRect(CRect(m_RefPoint,m_CropActivePoint),RGB(255, 0, 0), RGB(0, 255, 0)); + } + } + else + { + CRect renderRect(-m_nHScrollPos,-m_nVScrollPos,m_dwWidth-m_nHScrollPos,m_dwHeight-m_nVScrollPos); + m_hImage.Draw(dc,renderRect); + + if(m_bCaptureWasSet&&GetState()==CCxImageCtrl::IS_Crop) + { + dc.Draw3dRect(CRect(m_RefPoint,m_CropActivePoint),RGB(255, 0, 0), RGB(0, 255, 0)); + } + + dc.SetBkColor(0xEEEEEE); + dc.ExcludeClipRect(renderRect); + dc.FillRect(ClipRect,&m_brHatch); + } + + } + + + // Do not call CWnd::OnPaint() for painting messages +} + +BOOL CCxImageCtrl::OnEraseBkgnd(CDC* pDC) +{ + return CWnd::OnEraseBkgnd(pDC); +} + +void CCxImageCtrl::SetScrollSize(int cx, int cy) +{ + ////////////////////////////////////////////////////////////////////////// + + m_nCurHeight = cy; + int nScrollMax; + if (cy < m_dwHeight&&!GetStretchMode()) + { + nScrollMax = m_dwHeight - cy; + } + else + nScrollMax = 0; + + if(m_nVScrollPos<0) + m_nVScrollPos = 0; + if(m_nVScrollPos>nScrollMax) + m_nVScrollPos = nScrollMax; + + SCROLLINFO si; + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS; + si.nMin = 0; + si.nMax = nScrollMax; + si.nPage = si.nMax/5; + si.nPos = m_nVScrollPos; + SetScrollInfo(SB_VERT, &si, TRUE); + + + ////////////////////////////////////////////////////////////////////////// + + m_nCurWidth = cx; + if (cx < m_dwWidth&&!GetStretchMode()) + { + nScrollMax = m_dwWidth - cx; + } + else + nScrollMax = 0; + + + if(m_nHScrollPos<0) + m_nHScrollPos = 0; + if(m_nHScrollPos>nScrollMax) + m_nHScrollPos = nScrollMax; + + + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS; + si.nMin = 0; + si.nMax = nScrollMax; + si.nPage = si.nMax/5; + si.nPos = m_nHScrollPos; + SetScrollInfo(SB_HORZ, &si, TRUE); + + + ////////////////////////////////////////////////////////////////////////// + + + Invalidate(FALSE); +} + +void CCxImageCtrl::OnSize(UINT nType, int cx, int cy) +{ + CWnd::OnSize(nType, cx, cy); + + SetScrollSize(cx, cy); +} + +void CCxImageCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +{ + int nDelta; + int nMaxPos = m_dwHeight - m_nCurHeight; + + switch (nSBCode) + { + case SB_LINEDOWN: + if (m_nVScrollPos >= nMaxPos) + return; + nDelta = min(nMaxPos/20,nMaxPos-m_nVScrollPos); + break; + + case SB_LINEUP: + if (m_nVScrollPos <= 0) + return; + nDelta = -min(nMaxPos/20,m_nVScrollPos); + break; + + case SB_PAGEDOWN: + if (m_nVScrollPos >= nMaxPos) + return; + nDelta = min(nMaxPos/2,nMaxPos-m_nVScrollPos); + break; + + case SB_THUMBPOSITION: + nDelta = (int)nPos - m_nVScrollPos; + break; + + case SB_PAGEUP: + if (m_nVScrollPos <= 0) + return; + nDelta = -min(nMaxPos/2,m_nVScrollPos); + break; + + default: + return; + } + m_nVScrollPos += nDelta; + SetScrollPos(SB_VERT,m_nVScrollPos,TRUE); + //ScrollWindow(0,-nDelta); + + if(IsWindow(GetSafeHwnd())) + Invalidate(FALSE); + + CWnd::OnVScroll(nSBCode, nPos, pScrollBar); +} + +void CCxImageCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +{ + int nDelta; + int nMaxPos = m_dwWidth - m_nCurWidth; + + switch (nSBCode) + { + case SB_LINEDOWN: + if (m_nHScrollPos >= nMaxPos) + return; + nDelta = min(nMaxPos/20,nMaxPos-m_nHScrollPos); + break; + + case SB_LINEUP: + if (m_nHScrollPos <= 0) + return; + nDelta = -min(nMaxPos/20,m_nHScrollPos); + break; + + case SB_PAGEDOWN: + if (m_nHScrollPos >= nMaxPos) + return; + nDelta = min(nMaxPos/2,nMaxPos-m_nHScrollPos); + break; + + case SB_THUMBPOSITION: + nDelta = (int)nPos - m_nHScrollPos; + break; + + case SB_PAGEUP: + if (m_nHScrollPos <= 0) + return; + nDelta = -min(nMaxPos/20,m_nHScrollPos); + break; + + default: + return; + } + m_nHScrollPos += nDelta; + SetScrollPos(SB_HORZ,m_nHScrollPos,TRUE); + //ScrollWindow(-nDelta,0); + + Invalidate(FALSE); + + CWnd::OnHScroll(nSBCode, nPos, pScrollBar); +} + +BOOL CCxImageCtrl::PreCreateWindow(CREATESTRUCT& cs) +{ + // TODO: Add your specialized code here and/or call the base class + //cs.style |= WS_VSCROLL|WS_HSCROLL; + + return CWnd::PreCreateWindow(cs); +} + +void CCxImageCtrl::SetStretchMode(BOOL bIsStretch) +{ + m_bStretchMode = bIsStretch; + + if(IsWindow(GetSafeHwnd())) + Invalidate(FALSE); +} + +BOOL CCxImageCtrl::GetStretchMode() +{ + return m_bStretchMode; +} + +void CCxImageCtrl::SetZoomValue(double ZoomValue) +{ + m_iZoomValue = ZoomValue; + + if(m_hImage.IsValid()) + { + m_dwWidth = (DWORD)(m_hImage.GetWidth()*GetZoomValue()); + m_dwHeight = (DWORD)(m_hImage.GetHeight()*GetZoomValue()); + } + + if(IsWindow(GetSafeHwnd())) + { + CRect ClipRect; + GetClientRect(&ClipRect); + OnSize(SIZE_RESTORED,ClipRect.Width(),ClipRect.Height()); + + Invalidate(FALSE); + } +} + +double CCxImageCtrl::GetZoomValue() +{ + return m_iZoomValue; +} + + +void CCxImageCtrl::OnLButtonDown(UINT nFlags, CPoint point) +{ + CPoint imagePoint(point); + ClientToImage(imagePoint); + + CRect clientRect; + GetClientRect(&clientRect); + + + if(m_hImage.IsInside(imagePoint.x,imagePoint.y)) + { + switch(GetState()) + { + case CCxImageCtrl::IS_Move: + if (m_pTextComment) + { + delete m_pTextComment; + m_pTextComment = NULL; + } + SetCapture(); + m_bCaptureWasSet = TRUE; + SetCursor(AfxGetApp()->LoadCursor(IDC_HANDCATCHCURSOR2)); + + m_RefScroll = CSize(m_nHScrollPos,m_nVScrollPos); + m_RefPoint = point; + break; + case CCxImageCtrl::IS_Crop: + if (m_pTextComment) + { + delete m_pTextComment; + m_pTextComment = NULL; + } + SetCapture(); + m_bCaptureWasSet = TRUE; + SetCursor(AfxGetApp()->LoadCursor(IDC_SELECTCURSOR)); + + m_RefScroll = CSize(m_nHScrollPos,m_nVScrollPos); + m_RefPoint = point; + + ClientToImage(m_RefPoint); + ImageToClient(m_RefPoint); + + break; + case CCxImageCtrl::IS_Pen: + if (m_pTextComment) + { + delete m_pTextComment; + m_pTextComment = NULL; + } + SaveImageToUndo(); + + SetCapture(); + m_bCaptureWasSet = TRUE; + SetCursor(AfxGetApp()->LoadCursor(IDC_PENCURSOR)); + + m_RefScroll = CSize(m_nHScrollPos,m_nVScrollPos); + m_RefPoint = point; + break; + case IS_TextMove: + SetCapture(); + m_RefOffset= m_pTextComment->GetPosition() - imagePoint; + m_bCaptureWasSet = TRUE; + break; + case CCxImageCtrl::IS_Text: + SaveImageToUndo(); + SetCapture(); + m_bCaptureWasSet = TRUE; + SetCursor(AfxGetApp()->LoadCursor(IDC_TEXTCURSOR)); + + m_RefScroll = CSize(m_nHScrollPos, m_nVScrollPos); + m_RefPoint = imagePoint; + + CTextCommentSettings settingsDlg(this); + + settingsDlg.m_fontColor = m_TextColor; + settingsDlg.m_fontSize = m_TextSize; + settingsDlg.m_fontName = m_FontName; + + if(settingsDlg.DoModal()==IDOK) + { + m_TextColor = settingsDlg.m_fontColor; + m_TextSize = settingsDlg.m_fontSize; + m_FontName = settingsDlg.m_fontName; + + if (m_pTextComment) + { + delete m_pTextComment; + m_pTextComment = NULL; + } + + m_pTextComment = new CTextComment(m_RefPoint); + m_pTextComment->SetColor(settingsDlg.m_fontColor); + m_pTextComment->SetText(settingsDlg.GetCommentText()); + m_pTextComment->SetFont(settingsDlg.m_Font, GetDC()); + + m_hImageBuffer.Copy(m_hImage); + + m_pTextComment->DrawText(m_hImage, CPaintDC(GetDesktopWindow())); + + Invalidate(FALSE); + } + + break; + } + } + + CWnd::OnLButtonDown(nFlags, point); +} + +void CCxImageCtrl::OnMouseMove(UINT nFlags, CPoint point) +{ + CPoint imagePoint(point); + + ClientToImage(imagePoint); + + CRect clientRect; + GetClientRect(&clientRect); + + if(m_hImage.IsInside(imagePoint.x,imagePoint.y) || (GetState()==CCxImageCtrl::IS_TextMove && m_bCaptureWasSet)) + { + switch(GetState()) + { + case CCxImageCtrl::IS_Move: + if(m_bCaptureWasSet) + { + SCROLLINFO si = {0}; + + if(m_dwWidth>clientRect.Width()) + { + GetScrollInfo(SB_HORZ,&si); + m_nHScrollPos = m_RefScroll.cx - point.x + m_RefPoint.x; + + if(m_nHScrollPossi.nMax) + m_nHScrollPos = si.nMax; + + SetScrollPos(SB_HORZ,m_RefScroll.cx - point.x + m_RefPoint.x); + Invalidate(FALSE); + } + + if(m_dwHeight>clientRect.Height()) + { + GetScrollInfo(SB_VERT,&si); + m_nVScrollPos = m_RefScroll.cy - point.y + m_RefPoint.y; + + if(m_nVScrollPossi.nMax) + m_nVScrollPos = si.nMax; + + SetScrollPos(SB_VERT,m_RefScroll.cy - point.y + m_RefPoint.y); + Invalidate(FALSE); + } + } + break; + case CCxImageCtrl::IS_Crop: + if(m_bCaptureWasSet) + { + m_CropActivePoint = point; + + ClientToImage(m_CropActivePoint); + ImageToClient(m_CropActivePoint); + + Invalidate(FALSE); + } + break; + case CCxImageCtrl::IS_TextMove: + if (m_pTextComment != NULL) + { + if (!m_bCaptureWasSet) + { + if (!m_pTextComment->GetRectangle().PtInRect(imagePoint)) + { + SetState(IS_Text); + SetCursor(AfxGetApp()->LoadCursor(IDC_TEXTCURSOR)); + } + } + else + { + m_RefPoint = imagePoint; + m_RefPoint.Offset(m_RefOffset); + + m_hImage.Copy(m_hImageBuffer); + m_pTextComment->SetPosition(m_RefPoint, GetDC()); + + m_pTextComment->DrawText(m_hImage, CPaintDC(GetDesktopWindow())); + Invalidate(false); + } + } + break; + case CCxImageCtrl::IS_Text: + if (m_pTextComment != NULL) + { + if (m_pTextComment->GetRectangle().PtInRect(imagePoint)) + { + SetState(IS_TextMove); + SetCursor(AfxGetApp()->LoadCursor(IDC_HANDCATCHCURSOR2)); + + Invalidate(false); + } + } + break; + case CCxImageCtrl::IS_Pen: + { + // Draw Line + if(m_bCaptureWasSet) + { + CPoint fromPoint(m_RefPoint), toPoint(point); + + ClientToImage(fromPoint); + ClientToImage(toPoint); + + m_hImage.DrawLine(fromPoint.x, toPoint.x, m_hImage.GetHeight()-fromPoint.y,m_hImage.GetHeight()-toPoint.y,GetPenColor()); + + //and remember new position [4/7/2004] + m_RefScroll = CSize(m_nHScrollPos,m_nVScrollPos); + m_RefPoint = point; + + Invalidate(FALSE); + } + } + break; + } + } + + + CWnd::OnMouseMove(nFlags, point); +} + +void CCxImageCtrl::OnLButtonUp(UINT nFlags, CPoint point) +{ + CPoint imagePoint(point); + + ClientToImage(imagePoint); + + if(m_bCaptureWasSet&&m_hImage.IsInside(imagePoint.x,imagePoint.y)) + { + CPoint lefttop(m_RefPoint), rightbottom(point); + ClientToImage(lefttop); + ClientToImage(rightbottom); + + switch(GetState()) + { + case CCxImageCtrl::IS_Move: + SetCursor(AfxGetApp()->LoadCursor(IDC_HANDCATCHCURSOR1)); + break; + case CCxImageCtrl::IS_Crop: + + SaveImageToUndo(); + + m_hImage.Crop(CRect(lefttop,rightbottom)); + + // [Tue 7/6/2004] + //m_bCurrentImageWasSave = false; + m_bIsSaved = false; + + Refresh(); + + break; + case CCxImageCtrl::IS_TextMove: + case CCxImageCtrl::IS_Text: + + m_bIsSaved = false; + + break; + case CCxImageCtrl::IS_Pen: + CPoint fromPoint(m_RefPoint), toPoint(point); + + ClientToImage(fromPoint); + ClientToImage(toPoint); + + m_hImage.DrawLine(fromPoint.x, toPoint.x, m_hImage.GetHeight()-fromPoint.y,m_hImage.GetHeight()-toPoint.y,GetPenColor()); + + // [Tue 7/6/2004] + //m_bCurrentImageWasSave = false; + m_bIsSaved = false; + + break; + } + } + + if(m_bCaptureWasSet) + { + ReleaseCapture(); + Invalidate(FALSE); + m_bCaptureWasSet = FALSE; + } + + + CWnd::OnLButtonUp(nFlags, point); +} + +void CCxImageCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) +{ + switch (GetState()) + { + case CCxImageCtrl::IS_TextMove: + if (m_pTextComment != NULL) + { + CTextCommentSettings settingsDlg(this); + + settingsDlg.m_fontColor = m_TextColor; + settingsDlg.m_fontSize = m_TextSize; + settingsDlg.m_fontName = m_FontName; + + settingsDlg.SetCommentText(m_pTextComment->GetText()); + settingsDlg.SetFont(m_pTextComment->GetFont()); + settingsDlg.SetColor(m_pTextComment->GetColor()); + + if(settingsDlg.DoModal()==IDOK) + { + m_TextColor = settingsDlg.m_fontColor; + m_TextSize = settingsDlg.m_fontSize; + m_FontName = settingsDlg.m_fontName; + + m_pTextComment->SetColor(m_TextColor); + m_pTextComment->SetText(settingsDlg.GetCommentText()); + m_pTextComment->SetFont(settingsDlg.m_Font, GetDC()); + + m_hImage.Copy(m_hImageBuffer); + + m_pTextComment->DrawText(m_hImage, CPaintDC(GetDesktopWindow())); + + Invalidate(FALSE); + } + } + break; + } + + CWnd::OnLButtonDblClk(nFlags, point); +} + +void CCxImageCtrl::SetState(CCxImageCtrl::CCxImageCtrlState State) +{ + m_State = State; +} + +CCxImageCtrl::CCxImageCtrlState CCxImageCtrl::GetState() +{ + return m_State; +} + +BOOL CCxImageCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +{ + CRect clientRect; + GetClientRect(&clientRect); + + //TRACE("CCxImageCtrl::OnSetCursor nHitTest = %d\r\n",nHitTest); + + switch(GetState()) + { + case CCxImageCtrl::IS_Move: + if(m_dwWidth>clientRect.Width()||m_dwHeight>clientRect.Height()) + { + if(m_bCaptureWasSet) + { + SetCursor(AfxGetApp()->LoadCursor(IDC_HANDCATCHCURSOR2)); + return FALSE; + } + else + { + if(nHitTest == HTCLIENT) + { + SetCursor(AfxGetApp()->LoadCursor(IDC_HANDCATCHCURSOR1)); + return FALSE; + } + } + } + break; + case CCxImageCtrl::IS_Crop: + if(nHitTest == HTCLIENT||m_bCaptureWasSet) + { + SetCursor(AfxGetApp()->LoadCursor(IDC_SELECTCURSOR)); + return FALSE; + } + break; + case CCxImageCtrl::IS_Pen: + if(nHitTest == HTCLIENT||m_bCaptureWasSet) + { + SetCursor(AfxGetApp()->LoadCursor(IDC_PENCURSOR)); + return FALSE; + } + break; + case CCxImageCtrl::IS_TextMove: + if (nHitTest == HTCLIENT) + { + SetCursor(AfxGetApp()->LoadCursor(IDC_HANDCATCHCURSOR2)); + return FALSE; + } + break; + case CCxImageCtrl::IS_Text: + if(nHitTest == HTCLIENT||m_bCaptureWasSet) + { + SetCursor(AfxGetApp()->LoadCursor(IDC_TEXTCURSOR)); + return FALSE; + } + break; + } + + return CWnd::OnSetCursor(pWnd,nHitTest,message); +} + +void CCxImageCtrl::ClientToImage(CPoint &point) +{ + if (!m_hImage.IsValid()) + return; + + if (GetStretchMode()) + { + CRect rect; + GetClientRect(&rect); + + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + + double fx = point.x*m_hImage.GetWidth()/(double)width; + double fy = point.y*m_hImage.GetHeight()/(double)height; + + point.x = (long)fx; + point.y = (long)fy; + } + else + { + double fx =(double)(m_nHScrollPos + point.x); + double fy =(double)(m_nVScrollPos + point.y); + + fx /= GetZoomValue(); + fy /= GetZoomValue(); + + point.x = (long)fx; + point.y = (long)fy; + } +} + +void CCxImageCtrl::ImageToClient(CPoint &point) +{ + if (!m_hImage.IsValid()) + return; + + if (GetStretchMode()) + { + CRect rect; + GetClientRect(&rect); + + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + + double fx = point.x*width/(double)m_hImage.GetWidth(); + double fy = point.y*height/(double)m_hImage.GetHeight(); + + point.x = (long)fx; + point.y = (long)fy; + } + else + { + double fx = point.x*GetZoomValue(); + double fy = point.y*GetZoomValue(); + + fx -= m_nHScrollPos; + fy -= m_nVScrollPos; + + point.x = (long)fx; + point.y = (long)fy; + } +} + + +void CCxImageCtrl::OnCaptureChanged(CWnd *pWnd) +{ + if(m_bCaptureWasSet) + { + ReleaseCapture(); + m_bCaptureWasSet = FALSE; + Invalidate(FALSE); + } + + CWnd::OnCaptureChanged(pWnd); +} + +BOOL CCxImageCtrl::Cancel() +{ + if(m_bCaptureWasSet) + { + ReleaseCapture(); + m_bCaptureWasSet = FALSE; + Invalidate(FALSE); + return TRUE; + } + return FALSE; +} + +bool CCxImageCtrl::Save (LPCTSTR filename, DWORD imagetype) +{ + return m_hImage.Save(filename, imagetype); +} + +bool CCxImageCtrl::ShowSaveFileDialog() +{ + CFileDialog saveImageDialog(FALSE,NULL,_T("ScreenCapture"),OFN_EXPLORER|OFN_OVERWRITEPROMPT,_T("Jpg Files (*.jpg)|*.jpg|Bmp Files(*.bmp)|*.bmp|"),this); + + int iRetVal = saveImageDialog.DoModal(); + if(iRetVal==IDOK) + + { + CString strFileExt = saveImageDialog.GetFileExt(); + CString strFilePath = saveImageDialog.GetPathName(); + + if(saveImageDialog.m_ofn.nFilterIndex==1) + + { + if(strFileExt.GetLength()==0) + strFilePath += _T(".jpg"); + + return Save(strFilePath, CXIMAGE_FORMAT_JPG); + + } + else if(saveImageDialog.m_ofn.nFilterIndex==2) + { + if(strFileExt.GetLength()==0) + strFilePath += _T(".bmp"); + + return Save(strFilePath, CXIMAGE_FORMAT_BMP); + } + } + + return false; +} + +void CCxImageCtrl::SaveImageToUndo() +{ + if(m_iUndoListCurrPositionSendMessage(WM_UNDO_UPDATED,0,0); + +} + +bool CCxImageCtrl::IsUndoEnable() +{ + return (m_iUndoListCurrPosition>0&&m_iUndoListCurrPosition==m_UndoList.size())|| + (m_iUndoListCurrPosition>1&&m_iUndoListCurrPositionSendMessage(WM_UNDO_UPDATED,0,0); + + if (m_pTextComment) + { + delete m_pTextComment; + m_pTextComment = NULL; + } + + Refresh(); +} + +bool CCxImageCtrl::IsRedoEnable() +{ + return m_iUndoListCurrPositionSendMessage(WM_UNDO_UPDATED,0,0); + + Refresh(); +} + +void CCxImageCtrl::SetTextColor(COLORREF Color) +{ + m_TextColor = Color; +} + +COLORREF CCxImageCtrl::GetTextColor() +{ + return m_TextColor; +} + +void CCxImageCtrl::SetTextSize(int Size) +{ + m_TextSize = Size; +} + +int CCxImageCtrl::GetTextSize() +{ + return m_TextSize; +} + +void CCxImageCtrl::SetFontName(LPCTSTR Name) +{ + m_FontName = Name; +} + +CString CCxImageCtrl::GetFontName() +{ + return m_FontName; +} + +void CCxImageCtrl::SetPenColor(COLORREF Color) +{ + m_PenColor = Color; +} + +COLORREF CCxImageCtrl::GetPenColor() +{ + return m_PenColor; +} + +BOOL CCxImageCtrl::IsSaved() +{ + return m_bIsSaved; +} + +void CCxImageCtrl::SetQuality(BYTE q) +{ + m_btQuality = q>100 || q<0 ? m_btQuality : q; + m_hImage.SetJpegQuality(m_btQuality); +} + +BYTE CCxImageCtrl::GetQuality() +{ + return m_btQuality; +} \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/CxImageCtrl.h b/Source/Client/IM-Client/IMClient/CxImageCtrl.h new file mode 100644 index 0000000..738bdf0 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/CxImageCtrl.h @@ -0,0 +1,159 @@ +#if !defined(AFX_CXIMAGECTRL_H__1E8FCD38_E55A_4EEB_AE07_806974FB2B8F__INCLUDED_) +#define AFX_CXIMAGECTRL_H__1E8FCD38_E55A_4EEB_AE07_806974FB2B8F__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// CxImageCtrl.h : header file +// +#include "..\CxImage\ximage.h" +#include "TextComment.h" +///////////////////////////////////////////////////////////////////////////// +// CCxImageCtrl window + +#include + +#define WM_UNDO_UPDATED (WM_USER+1) + +class CCxImageCtrl : public CWnd +{ +// Construction +public: + CCxImageCtrl(); + + enum CCxImageCtrlState + { + IS_Move = 0, //Default + IS_Crop, + IS_Pen, + IS_Text, + IS_TextMove + }; + + typedef std::list CImageUndoList, *LPCImageUndoList; + typedef CImageUndoList::iterator CImageUndoEnum, *LPCImageUndoEnum; +/* + typedef std::list CTextCommentList, *LPCTextCommentList; + typedef CTextCommentList::iterator CTextCommentEnum, *LPCTextCommentEnum; +*/ + +// Attributes + +// Operations +public: + bool CreateFromHBITMAP (HBITMAP hbmp, HPALETTE hpal=0); + void SetStretchMode(BOOL bIsStretch = TRUE); + BOOL GetStretchMode(); + void SetZoomValue(double ZoomValue = 1.0); + double GetZoomValue(); + void SetQuality(BYTE q); + BYTE GetQuality(); + void SetState(CCxImageCtrl::CCxImageCtrlState State = CCxImageCtrl::IS_Move); + CCxImageCtrl::CCxImageCtrlState GetState(); + + BOOL Cancel(); + void Refresh(); + bool ShowSaveFileDialog(); + bool Save (const TCHAR* filename, DWORD imagetype); + + bool IsUndoEnable(); + void Undo(); + bool IsRedoEnable(); + void Redo(); + + void SetPenColor(COLORREF Color); + COLORREF GetPenColor(); + + void SetTextColor(COLORREF Color); + COLORREF GetTextColor(); + + void SetFontName(LPCTSTR Name); + CString GetFontName(); + + void SetTextSize(int Size); + int GetTextSize(); + + BOOL IsSaved(); + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CCxImageCtrl) + protected: + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + //}}AFX_VIRTUAL + +// Implementation +public: + virtual ~CCxImageCtrl(); + + // Generated message map functions +protected: + void SetScrollSize(int cx, int cy); + void ClientToImage(CPoint &point); + void ImageToClient(CPoint &point); + void SaveImageToUndo(); + + CxImage m_hImage; + CxImage m_hImageBuffer; + int m_nCurHeight; + int m_nCurWidth; + + int m_nHScrollPos; + int m_nVScrollPos; + + + DWORD m_dwWidth; + DWORD m_dwHeight; + + BOOL m_bStretchMode; + double m_iZoomValue; + BYTE m_btQuality; + + CBrush m_brHatch; + + CCxImageCtrl::CCxImageCtrlState m_State; + + CSize m_RefScroll; + CSize m_RefOffset; + CPoint m_RefPoint; + BOOL m_bCaptureWasSet; + + CPoint m_CropActivePoint; + + CImageUndoList m_UndoList; + long m_iUndoListCurrPosition; + bool m_bCurrentImageWasSave; + bool m_bIsSaved; + + COLORREF m_PenColor; + COLORREF m_TextColor; + int m_TextSize; + CString m_FontName; + + //CTextCommentList m_TextCommentList; + CTextComment* m_pTextComment; + + //{{AFX_MSG(CCxImageCtrl) + afx_msg void OnPaint(); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); + afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + afx_msg void OnCaptureChanged(CWnd *pWnd); + //}}AFX_MSG + + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CXIMAGECTRL_H__1E8FCD38_E55A_4EEB_AE07_806974FB2B8F__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/DelChatDlg.cpp b/Source/Client/IM-Client/IMClient/DelChatDlg.cpp new file mode 100644 index 0000000..9a116da --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DelChatDlg.cpp @@ -0,0 +1,234 @@ +// CDelChatDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "DelChatDlg.h" +#include "MainDlg.h" +#include "GlobalFunction.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDelChatDlg dialog + + +CDelChatDlg::CDelChatDlg(CMainDlg *pMessenger,CWnd* pParent /*=NULL*/) + : CDialog(CDelChatDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CDelChatDlg) + m_Description = _T(""); + //}}AFX_DATA_INIT + Handle = 0; + this->pMessenger = pMessenger; + bIsKillWinodow = FALSE; +// ShowSizeGrip(FALSE); +} + + +void CDelChatDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CDelChatDlg) + DDX_Text(pDX, IDC_DESCRIPTION_STATIC, m_Description); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CDelChatDlg, CDialog) +//{{AFX_MSG_MAP(CDelChatDlg) +ON_BN_CLICKED(IDC_BTN_YES, OnYes) +ON_BN_CLICKED(IDC_BTN_NO, OnNo) +//}}AFX_MSG_MAP +ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDelChatDlg message handlers + +void CDelChatDlg::OnOK() +{ + if(pMessenger->ConnectEnable() && !Handle) + { + CChat Chat; + + if(pMessenger->FindChatByGlobalId(m_bsChatId,Chat)) + { + theNet2.LockTranslator(); + try + { + Handle = Chat->Leave(); + if(Handle) + { + Block(); + theNet2.AddToTranslator(Handle,GetSafeHwnd()); + } + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + else + { + // Error Message [8/10/2002] + } + + } +} + +void CDelChatDlg::OnCancel() +{ + if(Handle&&pMessenger->ConnectEnable()) + { + pSession->CancelOperation(Handle); + } + else + KillWindow(); +} + +LRESULT CDelChatDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + + UnBlock(); + switch(pItem->EventType) + { + case NLT_ECommandOK: + pMessenger->DeleteChat(m_bsChatId); + KillWindow(); + break; + case NLT_ECommandError: + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + //MessageBox(GetString(IDS_DEL_USER_ERROR),GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONSTOP); + break; + } + + delete pItem; + return 0; +} + +BOOL CDelChatDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CDelChatDlg::Block() +{ + GetDlgItem(IDC_BTN_YES)->EnableWindow(FALSE); +} + +void CDelChatDlg::UnBlock() +{ + GetDlgItem(IDC_BTN_YES)->EnableWindow(TRUE); +} + +void CDelChatDlg::SetKillChat(const CChat &Chat) +{ + m_bsChatId = Chat.GetId(); + + m_Description.Format(GetString(IDS_CHAT_DEL_FORMAT),Chat.GetShowName()); + + UpdateData(FALSE); +} + +void CDelChatDlg::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + CDialog::OnClose(); + if(!bIsKillWinodow) + { + bIsKillWinodow = TRUE; + //pMessenger->SendMessage(WM_KILL_DELUSER_MESSAGE_DLG,(WPARAM)m_KillUser.GetGlobalID(),(LPARAM)this); + DestroyWindow(); + delete this; + } +} + +BEGIN_EVENTSINK_MAP(CDelChatDlg, CDialog) + //{{AFX_EVENTSINK_MAP(CDelChatDlg) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +//DEL void CDelChatDlg::OnClickButtonYes() +//DEL { +//DEL OnOK(); +//DEL } + +//DEL void CDelChatDlg::OnClickButtonNo() +//DEL { +//DEL OnCancel(); +//DEL } + +//DEL void CDelChatDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +//DEL { +//DEL m_btnX.ShowWindow(SW_HIDE); +//DEL m_btnYes.ShowWindow(SW_HIDE); +//DEL m_btnNo.ShowWindow(SW_HIDE); +//DEL LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); +//DEL LoadButton(pXmlRoot, _T("Yes"), &m_btnYes, TRUE, FALSE); +//DEL LoadButton(pXmlRoot, _T("No"), &m_btnNo, TRUE, FALSE); +//DEL +//DEL LoadRectangle(pXmlRoot, _T("Description"), &m_description, TRUE); +//DEL } + +//DEL void CDelChatDlg::OnClickButtonX() +//DEL { +//DEL OnCancel(); +//DEL } + +//DEL void CDelChatDlg::OnPaint() +//DEL { +//DEL CPaintDC dc(this); // device context for painting +//DEL +//DEL CRect r; +//DEL DrawBackground(&dc); +//DEL if(m_pBranding) +//DEL { +//DEL m_branding.GetWindowRect(&r); +//DEL ScreenToClient(&r); +//DEL CDC Dc; +//DEL Dc.CreateCompatibleDC(&dc); +//DEL Dc.SelectObject(m_pBranding); +//DEL dc.BitBlt(r.left, r.top, r.Width(), r.Height(), &Dc, 0, 0, SRCCOPY); +//DEL } +//DEL +//DEL // Do not call CDialog::OnPaint() for painting messages +//DEL } + +void CDelChatDlg::OnYes() +{ + OnOK(); +} + +void CDelChatDlg::OnNo() +{ + OnCancel(); +} diff --git a/Source/Client/IM-Client/IMClient/DelChatDlg.h b/Source/Client/IM-Client/IMClient/DelChatDlg.h new file mode 100644 index 0000000..7eb4d7d --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DelChatDlg.h @@ -0,0 +1,66 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +//}}AFX_INCLUDES +#if !defined(AFX_CDelChatDlg_H__DD63E5E4_EC98_4B9D_A1E3_580EEA65B45D__INCLUDED_) +#define AFX_CDelChatDlg_H__DD63E5E4_EC98_4B9D_A1E3_580EEA65B45D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// CDelChatDlg.h : header file +// + +#include "ResizableDialog.h" +#include "chat.h" + +///////////////////////////////////////////////////////////////////////////// +// CDelChatDlg dialog +class CMainDlg; +class CDelChatDlg : public CDialog +{ +// Construction +public: + CDelChatDlg(CMainDlg *pMessenger,CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CDelChatDlg) + enum { IDD = IDD_DELCHAT_DIALOG }; + CString m_Description; + //}}AFX_DATA +protected: + ISessionPtr pSession; + long Handle; + CMainDlg *pMessenger; + BOOL bIsKillWinodow; + CComBSTR m_bsChatId; +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDelChatDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +public: + void SetKillChat(const CChat &ChatName); +protected: + void KillWindow(); + void Block(); + void UnBlock(); + // Generated message map functions + //{{AFX_MSG(CDelChatDlg) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnYes(); + afx_msg void OnNo(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + LRESULT OnNetEvent(WPARAM w,LPARAM l); + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CDelChatDlg_H__DD63E5E4_EC98_4B9D_A1E3_580EEA65B45D__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/DelUserDlg.cpp b/Source/Client/IM-Client/IMClient/DelUserDlg.cpp new file mode 100644 index 0000000..573de6e --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DelUserDlg.cpp @@ -0,0 +1,250 @@ +// CDelUserDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "DelUserDlg.h" +#include "MainDlg.h" +#include "GlobalFunction.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDelUserDlg dialog + + +CDelUserDlg::CDelUserDlg(CMainDlg *pMessenger,CWnd* pParent /*=NULL*/) + : CDialog(CDelUserDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CDelUserDlg) + m_Description = _T(""); + //}}AFX_DATA_INIT + Handle = 0; + this->pMessenger = pMessenger; + bIsKillWinodow = FALSE; +// ShowSizeGrip(FALSE); +} + + +void CDelUserDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CDelUserDlg) + DDX_Text(pDX, IDC_DESCRIPTION_STATIC, m_Description); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CDelUserDlg, CDialog) + //{{AFX_MSG_MAP(CDelUserDlg) + ON_BN_CLICKED(IDC_BTN_YES, OnYes) + ON_BN_CLICKED(IDC_BTN_NO, OnNo) + //}}AFX_MSG_MAP + ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDelUserDlg message handlers + +void CDelUserDlg::OnOK() +{ + if(pMessenger->ConnectEnable() && !Handle) + { + if(pMessenger->CheckUserInContactList(m_KillUser)) + { + theNet2.LockTranslator(); + try + { + if(m_KillUser.GetStatus()==S_AWAITING) + { + Handle = pSession->DeleteUserR(m_KillUser.GetGlobalID()); + } + else + { + Handle = pSession->DeleteUser(m_KillUser.GetGlobalID(),m_ListType); + } + if(Handle) + { + Block(); + theNet2.AddToTranslator(Handle,GetSafeHwnd()); + } + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + else + { + pMessenger->DeleteFromContact(m_KillUser.GetGlobalID()); + KillWindow(); + } + } +} + +void CDelUserDlg::OnCancel() +{ + if(Handle&&pMessenger->ConnectEnable()) + { + pSession->CancelOperation(Handle); + } + else + KillWindow(); +} + +LRESULT CDelUserDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + + UnBlock(); + switch(pItem->EventType) + { + case NLT_ECommandOK: + pMessenger->DeleteFromContact(m_KillUser.GetGlobalID()); + KillWindow(); + break; + case NLT_ECommandError: + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + MessageBox(GetString(IDS_DEL_USER_ERROR),GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONSTOP); + break; + } + + delete pItem; + return 0; +} + +BOOL CDelUserDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CDelUserDlg::Block() +{ + GetDlgItem(IDC_BTN_YES)->EnableWindow(FALSE); +} + +void CDelUserDlg::UnBlock() +{ + GetDlgItem(IDC_BTN_YES)->EnableWindow(TRUE); +} + +void CDelUserDlg::SetKillUser(CUser& user, long ListType) +{ + m_ListType = ListType; + m_KillUser = user; + + if(m_KillUser.GetStatus()==S_AWAITING) + { + m_Description.Format(GetString(IDS_AUTH_CANCEL_FORMAT),m_KillUser.GetShowName()); + } + else + { + if(ListType==1) + m_Description.Format(GetString(IDS_CONTACTLIST_DEL_FORMAT),m_KillUser.GetShowName()); + else if(ListType==2) + m_Description.Format(GetString(IDS_IGNORYLIST_DEL_FORMAT),m_KillUser.GetShowName()); + } + + UpdateData(FALSE); +} + +void CDelUserDlg::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + CDialog::OnClose(); + if(!bIsKillWinodow) + { + bIsKillWinodow = TRUE; + pMessenger->SendMessage(WM_KILL_DELUSER_MESSAGE_DLG,(WPARAM)m_KillUser.GetGlobalID(),(LPARAM)this); + DestroyWindow(); + delete this; + } +} + +BEGIN_EVENTSINK_MAP(CDelUserDlg, CDialog) + //{{AFX_EVENTSINK_MAP(CDelUserDlg) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +//DEL void CDelUserDlg::OnClickButtonYes() +//DEL { +//DEL OnOK(); +//DEL } + +//DEL void CDelUserDlg::OnClickButtonNo() +//DEL { +//DEL OnCancel(); +//DEL } + +//DEL void CDelUserDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +//DEL { +//DEL m_btnX.ShowWindow(SW_HIDE); +//DEL m_btnYes.ShowWindow(SW_HIDE); +//DEL m_btnNo.ShowWindow(SW_HIDE); +//DEL LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); +//DEL LoadButton(pXmlRoot, _T("Yes"), &m_btnYes, TRUE, FALSE); +//DEL LoadButton(pXmlRoot, _T("No"), &m_btnNo, TRUE, FALSE); +//DEL +//DEL LoadRectangle(pXmlRoot, _T("Description"), &m_description, TRUE); +//DEL } + +//DEL void CDelUserDlg::OnClickButtonX() +//DEL { +//DEL OnCancel(); +//DEL } + +//DEL void CDelUserDlg::OnPaint() +//DEL { +//DEL CPaintDC dc(this); // device context for painting +//DEL +//DEL CRect r; +//DEL DrawBackground(&dc); +//DEL if(m_pBranding) +//DEL { +//DEL m_branding.GetWindowRect(&r); +//DEL ScreenToClient(&r); +//DEL CDC Dc; +//DEL Dc.CreateCompatibleDC(&dc); +//DEL Dc.SelectObject(m_pBranding); +//DEL dc.BitBlt(r.left, r.top, r.Width(), r.Height(), &Dc, 0, 0, SRCCOPY); +//DEL } +//DEL +//DEL // Do not call CDialog::OnPaint() for painting messages +//DEL } + +void CDelUserDlg::OnYes() +{ + OnOK(); +} + +void CDelUserDlg::OnNo() +{ + OnCancel(); +} diff --git a/Source/Client/IM-Client/IMClient/DelUserDlg.h b/Source/Client/IM-Client/IMClient/DelUserDlg.h new file mode 100644 index 0000000..190f7a4 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DelUserDlg.h @@ -0,0 +1,67 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +//}}AFX_INCLUDES +#if !defined(AFX_CDelUserDlg_H__DD63E5E4_EC98_4B9D_A1E3_580EEA65B45D__INCLUDED_) +#define AFX_CDelUserDlg_H__DD63E5E4_EC98_4B9D_A1E3_580EEA65B45D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// CDelUserDlg.h : header file +// + +#include "ResizableDialog.h" +#include "User.h" + +///////////////////////////////////////////////////////////////////////////// +// CDelUserDlg dialog +class CMainDlg; +class CDelUserDlg : public CDialog +{ +// Construction +public: + CDelUserDlg(CMainDlg *pMessenger,CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CDelUserDlg) + enum { IDD = IDD_DELUSER_DIALOG }; + CString m_Description; + //}}AFX_DATA +protected: + ISessionPtr pSession; + long Handle; + CMainDlg *pMessenger; + CUser m_KillUser; + long m_ListType; + BOOL bIsKillWinodow; +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDelUserDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +public: + void SetKillUser(CUser& user, long ListType = 1 /*Contact List*/); +protected: + void KillWindow(); + void Block(); + void UnBlock(); + // Generated message map functions + //{{AFX_MSG(CDelUserDlg) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnYes(); + afx_msg void OnNo(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + LRESULT OnNetEvent(WPARAM w,LPARAM l); + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CDelUserDlg_H__DD63E5E4_EC98_4B9D_A1E3_580EEA65B45D__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/DlgAbout.cpp b/Source/Client/IM-Client/IMClient/DlgAbout.cpp new file mode 100644 index 0000000..11cc2fd --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgAbout.cpp @@ -0,0 +1,129 @@ +// DlgAbout.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "DlgAbout.h" +#include "McVersionInfo.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDlgAbout dialog + + +CDlgAbout::CDlgAbout(CWnd* pParent /*=NULL*/) + : COFSNcDlg2(CDlgAbout::IDD, pParent) +{ + //{{AFX_DATA_INIT(CDlgAbout) + //}}AFX_DATA_INIT + m_strSkinSettings = _T("/Shell/About/skin.xml"); + m_bResizable = FALSE; +} + + +void CDlgAbout::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CDlgAbout) + DDX_Control(pDX, IDC_VERSION_STATIC, m_Version); + DDX_Control(pDX, IDC_SERVER_VERSION_STATIC, m_ServerVersion); + DDX_Control(pDX, IDC_BTN_X, m_btnX); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CDlgAbout, COFSNcDlg2) +//{{AFX_MSG_MAP(CDlgAbout) + ON_WM_PAINT() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDlgAbout message handlers +//DEL CDlgAbout::CDlgAbout() : COFSNcDlg2(CDlgAbout::IDD) +//DEL { +//DEL } + +BEGIN_EVENTSINK_MAP(CDlgAbout, COFSNcDlg2) +//{{AFX_EVENTSINK_MAP(CDlgAbout) + ON_EVENT(CDlgAbout, IDC_BTN_X, -600 /* Click */, OnClickBtnX, VTS_NONE) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +void CDlgAbout::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + m_btnX.ShowWindow(SW_HIDE); + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); +// LoadRectangle2(pXmlRoot, _T("Frame"), m_frame.GetSafeHwnd(), FALSE); + LoadLabel(pXmlRoot, _T("Version"), &m_Version, TRUE); + LoadLabel(pXmlRoot, _T("ServerVersion"), &m_ServerVersion, TRUE); +} + +BOOL CDlgAbout::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + ////////////////////////////////////////////////////////////////////////// + + CMcVersionInfo VerInfo; + + CString strVersion; + strVersion.Format(GetString(IDS_VERSION_FORMAT),(VerInfo.GetProductVersionMS()&0xffff0000)>>16,VerInfo.GetProductVersionMS()&0x0000ffff,(VerInfo.GetProductVersionLS()&0xffff0000)>>16); + m_Version.SetText(strVersion); + + m_ServerVersion.SetText(GetString(IDS_SERVER_VERSION)); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +//DEL BOOL CDlgAbout::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +//DEL { +//DEL CRect r; +//DEL m_frame.GetWindowRect(&r); +//DEL CPoint pt; +//DEL ::GetCursorPos(&pt); +//DEL if(r.PtInRect(pt)) +//DEL { +//DEL SetCursor(AfxGetApp()->LoadCursor(IDC_HANDCURSOR)); +//DEL return TRUE; +//DEL } +//DEL +//DEL return COFSNcDlg2::OnSetCursor(pWnd, nHitTest, message); +//DEL } + +//DEL void CDlgAbout::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL CPoint pt = point; +//DEL ClientToScreen(&pt); +//DEL +//DEL CRect r; +//DEL m_frame.GetWindowRect(&r); +//DEL +//DEL if(r.PtInRect(pt)) +//DEL { +//DEL OnCancel(); +//DEL return; +//DEL } +//DEL +//DEL COFSNcDlg2::OnLButtonDown(nFlags, point); +//DEL } + +void CDlgAbout::OnClickBtnX() +{ + OnCancel(); +} + +void CDlgAbout::OnPaint() +{ + COFSNcDlg2::OnPaint(); + m_Version.Invalidate(); +} diff --git a/Source/Client/IM-Client/IMClient/DlgAbout.h b/Source/Client/IM-Client/IMClient/DlgAbout.h new file mode 100644 index 0000000..ae045d0 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgAbout.h @@ -0,0 +1,58 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +//}}AFX_INCLUDES +#if !defined(AFX_DLGABOUT_H__9BC55935_667C_4A2C_B477_74FF069FC960__INCLUDED_) +#define AFX_DLGABOUT_H__9BC55935_667C_4A2C_B477_74FF069FC960__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// DlgAbout.h : header file +// + +#include "OFSNcDlg2.h" +#include "Label.h" + +///////////////////////////////////////////////////////////////////////////// +// CDlgAbout dialog + +class CDlgAbout : public COFSNcDlg2 +{ +// Construction +public: + CDlgAbout(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CDlgAbout) + enum { IDD = IDD_ABOUTBOX }; + CLabel m_Version; + CLabel m_ServerVersion; + CMcButton m_btnX; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDlgAbout) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + void LoadSkin(IXMLDOMNode *pXmlRoot); + + // Generated message map functions + //{{AFX_MSG(CDlgAbout) + virtual BOOL OnInitDialog(); + afx_msg void OnClickBtnX(); + afx_msg void OnPaint(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DLGABOUT_H__9BC55935_667C_4A2C_B477_74FF069FC960__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/DlgNetOptions2.cpp b/Source/Client/IM-Client/IMClient/DlgNetOptions2.cpp new file mode 100644 index 0000000..4053428 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgNetOptions2.cpp @@ -0,0 +1,214 @@ +// DlgNetOptions2.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "DlgNetOptions2.h" +#include "LoadSkins.h" +#include "cdib.h" +#include "GlobalFunction.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDlgNetOptions2 dialog + + +CDlgNetOptions2::CDlgNetOptions2(CWnd* pParent /*=NULL*/) + : COFSNcDlg2(CDlgNetOptions2::IDD, pParent) +{ + //{{AFX_DATA_INIT(CDlgNetOptions2) + m_strPass = _T(""); + m_strServ = _T(""); + m_strUser = _T(""); + m_strPort = _T(""); + //}}AFX_DATA_INIT + m_strSkinSettings = _T("/Shell/NetOptions/skin.xml"); + m_bResizable = FALSE; +} + + +void CDlgNetOptions2::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CDlgNetOptions2) + DDX_Control(pDX, IDC_USESSLCHECKBOX, m_checkssl); + DDX_Control(pDX, IDC_EDIT_USER, m_edUser); + DDX_Control(pDX, IDC_EDIT_SERV, m_edServ); + DDX_Control(pDX, IDC_EDIT_PORT, m_edPort); + DDX_Control(pDX, IDC_EDIT_PASS, m_edPass); + DDX_Control(pDX, IDC_RADIO_1, m_radio1); + DDX_Control(pDX, IDC_RADIO_2, m_radio2); + DDX_Control(pDX, IDC_RADIO_3, m_radio3); + DDX_Control(pDX, IDC_CHECKBOX, m_checkbox); + DDX_Text(pDX, IDC_EDIT_PASS, m_strPass); + DDX_Text(pDX, IDC_EDIT_SERV, m_strServ); + DDX_Text(pDX, IDC_EDIT_USER, m_strUser); + DDX_Control(pDX, IDC_BUTTON_X, m_btnX); + DDX_Control(pDX, IDC_BUTTON_OK, m_btnOK); + DDX_Control(pDX, IDC_BUTTON_CANCEL, m_btnCancel); + DDX_Text(pDX, IDC_EDIT_PORT, m_strPort); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CDlgNetOptions2, COFSNcDlg2) +//{{AFX_MSG_MAP(CDlgNetOptions2) + ON_WM_LBUTTONDOWN() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDlgNetOptions2 message handlers + +void CDlgNetOptions2::OnOK() +{ + UpdateData(); + + WriteOptionInt(IDS_NETOPTIONS, IDS_ACCESSTYPE, m_dwAccessType); + WriteOptionString(IDS_NETOPTIONS, IDS_PROXYNAME, m_strServ); + WriteOptionString(IDS_NETOPTIONS, IDS_PROXYPORT, m_strPort); + //WriteOptionInt(IDS_LOGIN,IDS_BYPASSENABLE,m_BypassCheck); + WriteOptionInt(IDS_NETOPTIONS, IDS_USEFIREWALL, m_bUseFirewall); + WriteOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, m_strUser); + WriteOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, m_strPass); + WriteOptionInt(IDS_NETOPTIONS, IDS_USESSL, m_bUseSSL); + + OnClose(); + COFSNcDlg2::OnOK(); +} + +void CDlgNetOptions2::OnCancel() +{ + OnClose(); + COFSNcDlg2::OnCancel(); +} + +BOOL CDlgNetOptions2::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + ////////////////////////////////////////////////////////////////////////// + + + m_dwAccessType = GetOptionInt(IDS_NETOPTIONS,IDS_ACCESSTYPE,INTERNET_OPEN_TYPE_PRECONFIG); + + m_strServ = GetOptionString(IDS_NETOPTIONS, IDS_PROXYNAME, _T("")); + m_strPort = GetOptionString(IDS_NETOPTIONS, IDS_PROXYPORT, _T("")); + m_bUseFirewall = GetOptionInt(IDS_NETOPTIONS, IDS_USEFIREWALL, FALSE); + m_strUser = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, _T("")); + m_strPass = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, _T("")); + + m_bUseSSL = GetOptionInt(IDS_NETOPTIONS, IDS_USESSL, FALSE); + + UpdateControls(); + UpdateData(FALSE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +BEGIN_EVENTSINK_MAP(CDlgNetOptions2, COFSNcDlg2) +//{{AFX_EVENTSINK_MAP(CDlgNetOptions2) +ON_EVENT(CDlgNetOptions2, IDC_BUTTON_X, -600 /* Click */, OnClickButtonX, VTS_NONE) + ON_EVENT(CDlgNetOptions2, IDC_RADIO_1, -600 /* Click */, OnClickRadio1, VTS_NONE) + ON_EVENT(CDlgNetOptions2, IDC_RADIO_2, -600 /* Click */, OnClickRadio2, VTS_NONE) + ON_EVENT(CDlgNetOptions2, IDC_RADIO_3, -600 /* Click */, OnClickRadio3, VTS_NONE) + ON_EVENT(CDlgNetOptions2, IDC_CHECKBOX, -600 /* Click */, OnClickCheckbox, VTS_NONE) + ON_EVENT(CDlgNetOptions2, IDC_BUTTON_OK, -600 /* Click */, OnClickButtonOk, VTS_NONE) + ON_EVENT(CDlgNetOptions2, IDC_BUTTON_CANCEL, -600 /* Click */, OnClickButtonCancel, VTS_NONE) + ON_EVENT(CDlgNetOptions2, IDC_USESSLCHECKBOX, -600 /* Click */, OnClickUseSSL, VTS_NONE) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +void CDlgNetOptions2::OnClickButtonX() +{ + OnCancel(); +} + +void CDlgNetOptions2::OnClickUseSSL() +{ + m_bUseSSL = !m_bUseSSL; +} + +void CDlgNetOptions2::OnLButtonDown(UINT nFlags, CPoint point) +{ + PostMessage(WM_NCLBUTTONDOWN,(WPARAM)HTCAPTION,MAKELPARAM(point.x,point.y)); + COFSNcDlg2::OnLButtonDown(nFlags, point); +} + +void CDlgNetOptions2::UpdateControls() +{ + m_radio1.SetPressed(m_dwAccessType == INTERNET_OPEN_TYPE_PRECONFIG); + m_radio2.SetPressed(m_dwAccessType == INTERNET_OPEN_TYPE_DIRECT); + m_radio3.SetPressed(m_dwAccessType == INTERNET_OPEN_TYPE_PROXY); + + m_edPort.EnableWindow(m_dwAccessType == INTERNET_OPEN_TYPE_PROXY); + m_edServ.EnableWindow(m_dwAccessType == INTERNET_OPEN_TYPE_PROXY); + + m_checkbox.SetEnabled(m_dwAccessType != INTERNET_OPEN_TYPE_DIRECT); + m_checkbox.SetPressed(m_bUseFirewall); + m_edUser.EnableWindow(m_bUseFirewall && m_dwAccessType != INTERNET_OPEN_TYPE_DIRECT); + m_edPass.EnableWindow(m_bUseFirewall && m_dwAccessType != INTERNET_OPEN_TYPE_DIRECT); + + m_checkssl.SetPressed(m_bUseSSL); +} + +void CDlgNetOptions2::OnClickRadio1() +{ + m_dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG; + UpdateControls(); +} + +void CDlgNetOptions2::OnClickRadio2() +{ + m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT; + UpdateControls(); +} + +void CDlgNetOptions2::OnClickRadio3() +{ + m_dwAccessType = INTERNET_OPEN_TYPE_PROXY; + UpdateControls(); +} + +void CDlgNetOptions2::OnClickCheckbox() +{ + m_bUseFirewall = !m_bUseFirewall; + UpdateControls(); +} + +void CDlgNetOptions2::OnClickButtonOk() +{ + OnOK(); +} + +void CDlgNetOptions2::OnClickButtonCancel() +{ + OnCancel(); +} + +void CDlgNetOptions2::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("OK"), &m_btnOK, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Cancel"), &m_btnCancel, TRUE, FALSE); + LoadButton(pXmlRoot, _T("ProxyDefault"), &m_radio1, FALSE, TRUE); + LoadButton(pXmlRoot, _T("ProxyDirect"), &m_radio2, FALSE, TRUE); + LoadButton(pXmlRoot, _T("ProxyCustom"), &m_radio3, FALSE, TRUE); + LoadButton(pXmlRoot, _T("UseAuth"), &m_checkbox, TRUE, TRUE); + LoadButton(pXmlRoot, _T("UseSSL"), &m_checkssl, TRUE, TRUE); + + LoadRectangle(pXmlRoot, _T("EditServer"), &m_edServ, TRUE); + LoadRectangle(pXmlRoot, _T("EditPort"), &m_edPort, TRUE); + LoadRectangle(pXmlRoot, _T("EditUser"), &m_edUser, TRUE); + LoadRectangle(pXmlRoot, _T("EditPassword"), &m_edPass, TRUE); + +} diff --git a/Source/Client/IM-Client/IMClient/DlgNetOptions2.h b/Source/Client/IM-Client/IMClient/DlgNetOptions2.h new file mode 100644 index 0000000..d44c3e8 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgNetOptions2.h @@ -0,0 +1,83 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +//}}AFX_INCLUDES +#if !defined(AFX_DLGNETOPTIONS2_H__921824D2_7FB0_411C_B21E_1F060BC97A40__INCLUDED_) +#define AFX_DLGNETOPTIONS2_H__921824D2_7FB0_411C_B21E_1F060BC97A40__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// DlgNetOptions2.h : header file +// + +#include "OFSNcDlg2.h" + +///////////////////////////////////////////////////////////////////////////// +// CDlgNetOptions2 dialog + +class CDlgNetOptions2 : public COFSNcDlg2 +{ +// Construction +public: + CDlgNetOptions2(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CDlgNetOptions2) + enum { IDD = IDD_NETOPTIONS_2 }; + CEdit m_edUser; + CEdit m_edServ; + CEdit m_edPort; + CEdit m_edPass; + CMcButton m_radio1; + CMcButton m_radio2; + CMcButton m_radio3; + CMcButton m_checkbox; + CMcButton m_checkssl; + CString m_strPass; + CString m_strServ; + CString m_strUser; + CMcButton m_btnX; + CMcButton m_btnOK; + CMcButton m_btnCancel; + CString m_strPort; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDlgNetOptions2) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + void LoadSkin(IXMLDOMNode *pXmlRoot); + void UpdateControls(); + BOOL m_bUseFirewall; + BOOL m_bUseSSL; + DWORD m_dwAccessType; + + // Generated message map functions + //{{AFX_MSG(CDlgNetOptions2) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnClickButtonX(); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnClickRadio1(); + afx_msg void OnClickRadio2(); + afx_msg void OnClickRadio3(); + afx_msg void OnClickCheckbox(); + afx_msg void OnClickButtonOk(); + afx_msg void OnClickButtonCancel(); + afx_msg void OnClickUseSSL(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DLGNETOPTIONS2_H__921824D2_7FB0_411C_B21E_1F060BC97A40__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/DlgPreferences.cpp b/Source/Client/IM-Client/IMClient/DlgPreferences.cpp new file mode 100644 index 0000000..d9f47db --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgPreferences.cpp @@ -0,0 +1,81 @@ +// DlgPreferences.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "DlgPreferences.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDlgPreferences dialog + + +CDlgPreferences::CDlgPreferences(CWnd* pParent /*=NULL*/) + : PREFERENCES_PARENT(CDlgPreferences::IDD, pParent) +{ + //{{AFX_DATA_INIT(CDlgPreferences) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_strSkinSettings = _T("/Shell/Preferences/skin.xml"); +} + + +void CDlgPreferences::DoDataExchange(CDataExchange* pDX) +{ + PREFERENCES_PARENT::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CDlgPreferences) + DDX_Control(pDX, IDC_PLACEHOLDER, m_placeholder); + DDX_Control(pDX, IDC_LIST, m_list); + DDX_Control(pDX, IDC_BUTTON_X, m_btnX); + DDX_Control(pDX, IDC_BUTTON_OK, m_btnOK); + DDX_Control(pDX, IDC_BUTTON_CANCEL, m_btnCancel); + DDX_Control(pDX, IDC_BUTTON_APPLY, m_btnApply); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CDlgPreferences, PREFERENCES_PARENT) + //{{AFX_MSG_MAP(CDlgPreferences) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDlgPreferences message handlers + +void CDlgPreferences::OnOK() +{ + // TODO: Add extra validation here + + PREFERENCES_PARENT::OnOK(); +} + +void CDlgPreferences::OnCancel() +{ + // TODO: Add extra cleanup here + + PREFERENCES_PARENT::OnCancel(); +} + +void CDlgPreferences::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + LoadButtons(pXmlRoot); + LoadRectangle(pXmlRoot, _T("List"), &m_list, TRUE); + LoadRectangle(pXmlRoot, _T("Page"), &m_placeholder, FALSE); +} + +void CDlgPreferences::LoadButtons(IXMLDOMNode *pXmlRoot) +{ + m_btnX.ShowWindow(SW_HIDE); + m_btnOK.ShowWindow(SW_HIDE); + m_btnCancel.ShowWindow(SW_HIDE); + m_btnApply.ShowWindow(SW_HIDE); + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("OK"), &m_btnOK, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Cancel"), &m_btnCancel, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Apply"), &m_btnApply, TRUE, FALSE); +} diff --git a/Source/Client/IM-Client/IMClient/DlgPreferences.h b/Source/Client/IM-Client/IMClient/DlgPreferences.h new file mode 100644 index 0000000..68c07d8 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgPreferences.h @@ -0,0 +1,64 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +//}}AFX_INCLUDES +#if !defined(AFX_DLGPREFERENCES_H__050A37DC_2F67_4754_ABCF_EF030F6DC3B1__INCLUDED_) +#define AFX_DLGPREFERENCES_H__050A37DC_2F67_4754_ABCF_EF030F6DC3B1__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// DlgPreferences.h : header file +// + +#include "OFSNcDlg2.h" +#include + +///////////////////////////////////////////////////////////////////////////// +// CDlgPreferences dialog + +#define PREFERENCES_PARENT COFSNcDlg2 + +class CDlgPreferences : public PREFERENCES_PARENT +{ +// Construction +public: + CDlgPreferences(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CDlgPreferences) + enum { IDD = IDD_PREFERENCES }; + CStatic m_placeholder; + CListCtrl m_list; + CMcButton m_btnX; + CMcButton m_btnOK; + CMcButton m_btnCancel; + CMcButton m_btnApply; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDlgPreferences) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + void LoadButtons(IXMLDOMNode *pXmlRoot); + void LoadSkin(IXMLDOMNode *pXmlRoot); + +// CArray m_aPages; + + // Generated message map functions + //{{AFX_MSG(CDlgPreferences) + virtual void OnOK(); + virtual void OnCancel(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DLGPREFERENCES_H__050A37DC_2F67_4754_ABCF_EF030F6DC3B1__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/DlgTV.cpp b/Source/Client/IM-Client/IMClient/DlgTV.cpp new file mode 100644 index 0000000..163467f --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgTV.cpp @@ -0,0 +1,246 @@ +// DlgTV.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "DlgTV.h" +#include "GlobalFunction.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDlgTV dialog + + +CDlgTV::CDlgTV(CWnd* pParent /*=NULL*/) + : DLG_TV_PARENT(CDlgTV::IDD, pParent) +{ + //{{AFX_DATA_INIT(CDlgTV) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_strSkinSettings = _T("/Shell/TV/skin.xml"); + SetBoundary(0, 0); + m_nPlayer = 0; + m_bIsClosed = FALSE; +} + + +void CDlgTV::DoDataExchange(CDataExchange* pDX) +{ + DLG_TV_PARENT::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CDlgTV) + DDX_Control(pDX, IDC_PLACEHOLDER, m_placeholder); + DDX_Control(pDX, IDC_BUTTON_X, m_btnX); + DDX_Control(pDX, IDC_BUTTON_RESTORE, m_btnRestore); + DDX_Control(pDX, IDC_BUTTON_MIN, m_btnMin); + DDX_Control(pDX, IDC_BUTTON_MAX, m_btnMax); + DDX_Control(pDX, IDC_MEDIAPLAYER1, m_mediaplayer); + DDX_Control(pDX, IDC_SHOCKWAVEFLASH1, m_flash); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CDlgTV, DLG_TV_PARENT) + //{{AFX_MSG_MAP(CDlgTV) + ON_WM_CLOSE() + ON_WM_CREATE() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CDlgTV message handlers + +void CDlgTV::OnOK() +{ +// DLG_TV_PARENT::OnOK(); + PostMessage(WM_CLOSE); +} + +void CDlgTV::OnCancel() +{ +// DLG_TV_PARENT::OnCancel(); + PostMessage(WM_CLOSE); +} + +BEGIN_EVENTSINK_MAP(CDlgTV, DLG_TV_PARENT) + //{{AFX_EVENTSINK_MAP(CDlgTV) + ON_EVENT(CDlgTV, IDC_BUTTON_X, -600 /* Click */, OnClickButtonX, VTS_NONE) + ON_EVENT(CDlgTV, IDC_BUTTON_RESTORE, -600 /* Click */, OnClickButtonRestore, VTS_NONE) + ON_EVENT(CDlgTV, IDC_BUTTON_MIN, -600 /* Click */, OnClickButtonMin, VTS_NONE) + ON_EVENT(CDlgTV, IDC_BUTTON_MAX, -600 /* Click */, OnClickButtonMax, VTS_NONE) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +void CDlgTV::OnClickButtonX() +{ + OnCancel(); +} + +void CDlgTV::OnClickButtonRestore() +{ + ShowWindow(SW_SHOWNORMAL); +} + +void CDlgTV::OnClickButtonMin() +{ + ShowWindow(SW_SHOWMINIMIZED); +} + +void CDlgTV::OnClickButtonMax() +{ + ShowWindow(SW_SHOWMAXIMIZED); +} + +void CDlgTV::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + m_btnX.ShowWindow(SW_HIDE); + m_btnMax.ShowWindow(SW_HIDE); + m_btnRestore.ShowWindow(SW_HIDE); + m_btnMin.ShowWindow(SW_HIDE); + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Maximize"), &m_btnMax, TRUE, FALSE, 1); + LoadButton(pXmlRoot, _T("Restore"), &m_btnRestore, TRUE, FALSE, 2); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + + ShowPlayer(0); + LoadRectangle(pXmlRoot, _T("Player"), &m_mediaplayer, FALSE); + LoadRectangle(pXmlRoot, _T("Player"), &m_flash, FALSE); +} + +BOOL CDlgTV::CreateAutoKiller(BSTR URL, CWnd *pParentWnd, long ScreenCX, long ScreenCY) +{ + m_bAutoKill = TRUE; + + if(!Create(IDD, pParentWnd)) + { + TRACE0("Warning: failed to create CDlgTV.\n"); + return FALSE; + } + + SetFrameSize(ScreenCX, ScreenCY); + MMOpen(URL); + ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(); + return TRUE; +} + +int CDlgTV::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (DLG_TV_PARENT::OnCreate(lpCreateStruct) == -1) + return -1; + + AddWindowToClose(this); + + return 0; +} + +void CDlgTV::OnClose() +{ + if(m_bIsClosed) + return; + + m_bIsClosed = TRUE; + RemoveWindowToClose(this); + + MMStop(); + if(m_bAutoKill) + { + if(GetStyle() & WS_VISIBLE && GetOptionInt(IDS_OFSMESSENGER, IDS_ANIMATION, FALSE)) + RoundExitAddon(this); + DLG_TV_PARENT::OnClose(); + DestroyWindow(); + delete this; + } + else + DLG_TV_PARENT::OnClose(); +} + +int CDlgTV::GetPlayer(BSTR URL) +{ + // Return value: + // 0 = Unknown + // 1 = Windows Media Player + // 2 = Flash + + // Determine MIME type + int nResult = 0; + HRESULT hr; + LPWSTR pStrMimeType = NULL; + + hr = FindMimeFromData(NULL, URL, NULL, 0, NULL, 0, &pStrMimeType, 0); + if(hr == NOERROR) + { + if(0 == wcsicmp(pStrMimeType, L"application/x-shockwave-flash")) + return 2; + else + return 1; + } + + return nResult; +} + +void CDlgTV::ShowPlayer(int nPlayer) +{ + m_flash.ShowWindow(SW_HIDE); + m_mediaplayer.ShowWindow(SW_HIDE); + + if(nPlayer == 1) + { + m_mediaplayer.ShowWindow(SW_SHOW); + } + if(nPlayer == 2) + { + m_flash.ShowWindow(SW_SHOW); + } +} + +void CDlgTV::MMStop() +{ + m_flash.Stop(); + m_mediaplayer.Stop(); +} + +void CDlgTV::MMOpen(BSTR URL) +{ + int nPrevPlayer = m_nPlayer; + if(nPrevPlayer > 0) + MMStop(); + + m_nPlayer = GetPlayer(URL); + ShowPlayer(m_nPlayer); + + if(m_nPlayer == 1) + m_mediaplayer.Open(CString(URL)); + else if(m_nPlayer == 2) + { + m_flash.SetMovie(_T("")); + m_flash.SetMovie(CString(URL)); + } + if(nPrevPlayer > 0) + MMPlay(); +} + +void CDlgTV::MMPlay() +{ + if(m_nPlayer == 1) + m_mediaplayer.Play(); + else if(m_nPlayer == 2) + m_flash.Play(); +} + +void CDlgTV::SetFrameSize(long cx, long cy) +{ + if(cx <= 0 || cy <= 0) + return; + + CRect rw, rp; + GetWindowRect(&rw); + m_mediaplayer.GetWindowRect(&rp); + rw.InflateRect(0, 0, cx - rp.Width(), cy - rp.Height()); + AdjustRect(rw); + SetWindowPos(NULL, rw.left, rw.top, rw.Width(), rw.Height(), SWP_NOZORDER); +} diff --git a/Source/Client/IM-Client/IMClient/DlgTV.h b/Source/Client/IM-Client/IMClient/DlgTV.h new file mode 100644 index 0000000..51e628b --- /dev/null +++ b/Source/Client/IM-Client/IMClient/DlgTV.h @@ -0,0 +1,81 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +#include "mediaplayer2.h" +#include "shockwaveflash.h" +//}}AFX_INCLUDES +#if !defined(AFX_DLGTV_H__820FF0B3_CA73_4B33_8F1F_62F8E1343A79__INCLUDED_) +#define AFX_DLGTV_H__820FF0B3_CA73_4B33_8F1F_62F8E1343A79__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "OFSNcDlg2.h" + +// DlgTV.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CDlgTV dialog +#define DLG_TV_PARENT COFSNcDlg2 + +class CDlgTV : public DLG_TV_PARENT +{ +// Construction +public: + void MMPlay(); + void MMStop(); + void MMOpen(BSTR URL); + + BOOL CreateAutoKiller(BSTR URL, CWnd *pParentWnd, long ScreenCX = 0, long ScreenCY = 0); + CDlgTV(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CDlgTV) + enum { IDD = IDD_TV }; + CStatic m_placeholder; + CMcButton m_btnX; + CMcButton m_btnRestore; + CMcButton m_btnMin; + CMcButton m_btnMax; + CMediaPlayer2 m_mediaplayer; + CShockwaveFlash m_flash; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CDlgTV) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + void SetFrameSize(long cx, long cy); + int m_nPlayer; + void ShowPlayer(int nPlayer); + int GetPlayer(BSTR URL); + BOOL m_bAutoKill; + void LoadSkin(IXMLDOMNode *pXmlRoot); + BOOL m_bIsClosed; + + // Generated message map functions + //{{AFX_MSG(CDlgTV) + virtual void OnOK(); + virtual void OnCancel(); + afx_msg void OnClickButtonX(); + afx_msg void OnClickButtonRestore(); + afx_msg void OnClickButtonMin(); + afx_msg void OnClickButtonMax(); + afx_msg void OnClose(); + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DLGTV_H__820FF0B3_CA73_4B33_8F1F_62F8E1343A79__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/EditMessageTemplateDlg.cpp b/Source/Client/IM-Client/IMClient/EditMessageTemplateDlg.cpp new file mode 100644 index 0000000..c2c0c91 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/EditMessageTemplateDlg.cpp @@ -0,0 +1,90 @@ +// EditMessageTemplateDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "EditMessageTemplateDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CEditMessageTemplateDlg dialog + + +CEditMessageTemplateDlg::CEditMessageTemplateDlg(CWnd* pParent /*=NULL*/) + : CDialog(CEditMessageTemplateDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CEditMessageTemplateDlg) + m_strName = _T(""); + m_strText = _T(""); + //}}AFX_DATA_INIT +} + +CEditMessageTemplateDlg::CEditMessageTemplateDlg(CString strName, CString strText, CWnd* pParent /*=NULL*/) + : CDialog(CEditMessageTemplateDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CEditMessageTemplateDlg) + m_strName = strName; + m_strText = strText; + //}}AFX_DATA_INIT +} + + +void CEditMessageTemplateDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CEditMessageTemplateDlg) + DDX_Text(pDX, IDC_NAME_EDIT, m_strName); + DDX_Text(pDX, IDC_TEXT_EDIT, m_strText); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CEditMessageTemplateDlg, CDialog) + //{{AFX_MSG_MAP(CEditMessageTemplateDlg) + ON_EN_CHANGE(IDC_NAME_EDIT, OnChangeName) + ON_EN_CHANGE(IDC_TEXT_EDIT, OnChangeText) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CEditMessageTemplateDlg message handlers + +void CEditMessageTemplateDlg::OnOK() +{ + CDialog::OnOK(); +} + +void CEditMessageTemplateDlg::OnCancel() +{ + CDialog::OnCancel(); +} + + +BOOL CEditMessageTemplateDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + GetDlgItem(IDOK)->EnableWindow(m_strName.GetLength()!=0); + + UpdateData(FALSE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + + +void CEditMessageTemplateDlg::OnChangeName() +{ + UpdateData(); + + GetDlgItem(IDOK)->EnableWindow(m_strName.GetLength()!=0); +} + +void CEditMessageTemplateDlg::OnChangeText() +{ +} diff --git a/Source/Client/IM-Client/IMClient/EditMessageTemplateDlg.h b/Source/Client/IM-Client/IMClient/EditMessageTemplateDlg.h new file mode 100644 index 0000000..52bb587 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/EditMessageTemplateDlg.h @@ -0,0 +1,52 @@ +#if !defined(AFX_EDITMESSAGETEMPLATEDLG_H__91A12C95_82CA_48CE_99F8_49385821334E__INCLUDED_) +#define AFX_EDITMESSAGETEMPLATEDLG_H__91A12C95_82CA_48CE_99F8_49385821334E__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// EditMessageTemplateDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CEditMessageTemplateDlg dialog + +class CEditMessageTemplateDlg : public CDialog +{ +// Construction +public: + CEditMessageTemplateDlg(CWnd* pParent = NULL); // standard constructor + CEditMessageTemplateDlg(CString strName, CString strText, CWnd* pParent =NULL); + +// Dialog Data + //{{AFX_DATA(CEditMessageTemplateDlg) + enum { IDD = IDD_EDIT_MES_TEMPLATE_DIALOG }; + CString m_strName; + CString m_strText; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CEditMessageTemplateDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(CEditMessageTemplateDlg) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + void OnChangeName(); + void OnChangeText(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_EDITMESSAGETEMPLATEDLG_H__91A12C95_82CA_48CE_99F8_49385821334E__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/FIXATLBASE.H b/Source/Client/IM-Client/IMClient/FIXATLBASE.H new file mode 100644 index 0000000..cc7da26 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FIXATLBASE.H @@ -0,0 +1,6242 @@ +// This is a part of the Active Template Library. +// Copyright (C) 1996-1998 Microsoft Corporation +// All rights reserved. +// +// This source code is only intended as a supplement to the +// Active Template Library Reference and related +// electronic documentation provided with the library. +// See these sources for detailed information regarding the +// Active Template Library product. + +#ifndef __ATLBASE_H__ +#define __ATLBASE_H__ + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef _ATL_NO_PRAGMA_WARNINGS +#pragma warning(disable: 4201) // nameless unions are part of C++ +#pragma warning(disable: 4127) // constant expression +#pragma warning(disable: 4505) // unreferenced local function has been removed +#pragma warning(disable: 4512) // can't generate assignment operator (so what?) +#pragma warning(disable: 4514) // unreferenced inlines are common +#pragma warning(disable: 4103) // pragma pack +#pragma warning(disable: 4702) // unreachable code +#pragma warning(disable: 4237) // bool +#pragma warning(disable: 4710) // function couldn't be inlined +#pragma warning(disable: 4355) // 'this' : used in base member initializer list +#pragma warning(disable: 4097) // typedef name used as synonym for class-name +#pragma warning(disable: 4786) // identifier was truncated in the debug information +#pragma warning(disable: 4268) // const static/global data initialized to zeros +#pragma warning(disable: 4291) // allow placement new +#endif //!_ATL_NO_PRAGMA_WARNINGS + +#include + +#include +#include +#include + +#include +#include + +#ifdef new +#pragma push_macro("new") +#define _ATL_REDEF_NEW +#undef new +#endif + +#include +#include + +#ifndef _ATL_NO_DEBUG_CRT +// Warning: if you define the above symbol, you will have +// to provide your own definition of the ATLASSERT(x) macro +// in order to compile ATL + #include +#endif + +#include +#include +#include + +#ifdef _DEBUG +#include +#include +#endif + +#include + +#include + +#pragma pack(push, _ATL_PACKING) + +#if defined(_ATL_DLL) + #pragma comment(lib, "atl.lib") +#endif + +extern "C" const __declspec(selectany) GUID LIBID_ATLLib = {0x44EC0535,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}}; +extern "C" const __declspec(selectany) CLSID CLSID_Registrar = {0x44EC053A,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}}; +extern "C" const __declspec(selectany) IID IID_IRegistrar = {0x44EC053B,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}}; +extern "C" const __declspec(selectany) IID IID_IAxWinHostWindow = {0xb6ea2050,0x48a,0x11d1,{0x82,0xb9,0x0,0xc0,0x4f,0xb9,0x94,0x2e}}; +extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatch = {0xb6ea2051,0x48a,0x11d1,{0x82,0xb9,0x0,0xc0,0x4f,0xb9,0x94,0x2e}}; +extern "C" const __declspec(selectany) IID IID_IInternalConnection = {0x72AD0770,0x6A9F,0x11d1,{0xBC,0xEC,0x00,0x60,0x08,0x8F,0x44,0x4E}}; +extern "C" const __declspec(selectany) IID IID_IDocHostUIHandlerDispatch = {0x425B5AF0,0x65F1,0x11d1,{0x96,0x11,0x00,0x00,0xF8,0x1E,0x0D,0x0D}}; + +#ifndef _ATL_DLL_IMPL +namespace ATL +{ +#endif + +struct _ATL_CATMAP_ENTRY +{ + int iType; + const CATID* pcatid; +}; + +#define _ATL_CATMAP_ENTRY_END 0 +#define _ATL_CATMAP_ENTRY_IMPLEMENTED 1 +#define _ATL_CATMAP_ENTRY_REQUIRED 2 + +typedef HRESULT (WINAPI _ATL_CREATORFUNC)(void* pv, REFIID riid, LPVOID* ppv); +typedef HRESULT (WINAPI _ATL_CREATORARGFUNC)(void* pv, REFIID riid, LPVOID* ppv, DWORD dw); +typedef HRESULT (WINAPI _ATL_MODULEFUNC)(DWORD dw); +typedef LPCTSTR (WINAPI _ATL_DESCRIPTIONFUNC)(); +typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)(); +typedef void (__stdcall _ATL_TERMFUNC)(DWORD dw); + +struct _ATL_TERMFUNC_ELEM +{ + _ATL_TERMFUNC* pFunc; + DWORD dw; + _ATL_TERMFUNC_ELEM* pNext; +}; + +struct _ATL_OBJMAP_ENTRY +{ + const CLSID* pclsid; + HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister); + _ATL_CREATORFUNC* pfnGetClassObject; + _ATL_CREATORFUNC* pfnCreateInstance; + IUnknown* pCF; + DWORD dwRegister; + _ATL_DESCRIPTIONFUNC* pfnGetObjectDescription; + _ATL_CATMAPFUNC* pfnGetCategoryMap; + HRESULT WINAPI RevokeClassObject() + { + return CoRevokeClassObject(dwRegister); + } + HRESULT WINAPI RegisterClassObject(DWORD dwClsContext, DWORD dwFlags) + { + IUnknown* p = NULL; + if (pfnGetClassObject == NULL) + return S_OK; + HRESULT hRes = pfnGetClassObject(pfnCreateInstance, IID_IUnknown, (LPVOID*) &p); + if (SUCCEEDED(hRes)) + hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister); + if (p != NULL) + p->Release(); + return hRes; + } +// Added in ATL 3.0 + void (WINAPI *pfnObjectMain)(bool bStarting); +}; + +struct _ATL_REGMAP_ENTRY +{ + LPCOLESTR szKey; + LPCOLESTR szData; +}; + +struct _AtlCreateWndData +{ + void* m_pThis; + DWORD m_dwThreadID; + _AtlCreateWndData* m_pNext; +}; + +struct _ATL_MODULE +{ +// Attributes +public: + UINT cbSize; + HINSTANCE m_hInst; + HINSTANCE m_hInstResource; + HINSTANCE m_hInstTypeLib; + _ATL_OBJMAP_ENTRY* m_pObjMap; + LONG m_nLockCnt; + HANDLE m_hHeap; + union + { + CRITICAL_SECTION m_csTypeInfoHolder; + CRITICAL_SECTION m_csStaticDataInit; + }; + CRITICAL_SECTION m_csWindowCreate; + CRITICAL_SECTION m_csObjMap; +// Original Size = 100 +// Stuff added in ATL 3.0 + DWORD dwAtlBuildVer; + _AtlCreateWndData* m_pCreateWndList; + bool m_bDestroyHeap; + GUID* pguidVer; + DWORD m_dwHeaps; // Number of heaps we have (-1) + HANDLE* m_phHeaps; + int m_nHeap; // Which heap to choose from + _ATL_TERMFUNC_ELEM* m_pTermFuncs; +}; + +const int _nAtlModuleVer1Size = 100; + +//This define makes debugging asserts easier. +#define _ATL_SIMPLEMAPENTRY ((_ATL_CREATORARGFUNC*)1) + +struct _ATL_INTMAP_ENTRY +{ + const IID* piid; // the interface id (IID) + DWORD dw; + _ATL_CREATORARGFUNC* pFunc; //NULL:end, 1:offset, n:ptr +}; + +///////////////////////////////////////////////////////////////////////////// +// QI Support + +ATLAPI AtlInternalQueryInterface(void* pThis, + const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject); + +///////////////////////////////////////////////////////////////////////////// +// Smart Pointer helpers + +ATLAPI_(IUnknown*) AtlComPtrAssign(IUnknown** pp, IUnknown* lp); +ATLAPI_(IUnknown*) AtlComQIPtrAssign(IUnknown** pp, IUnknown* lp, REFIID riid); + +///////////////////////////////////////////////////////////////////////////// +// Inproc Marshaling helpers + +ATLAPI AtlFreeMarshalStream(IStream* pStream); +ATLAPI AtlMarshalPtrInProc(IUnknown* pUnk, const IID& iid, IStream** ppStream); +ATLAPI AtlUnmarshalPtr(IStream* pStream, const IID& iid, IUnknown** ppUnk); + +ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent); + +///////////////////////////////////////////////////////////////////////////// +// Connection Point Helpers + +ATLAPI AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw); +ATLAPI AtlUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw); + +///////////////////////////////////////////////////////////////////////////// +// IDispatch Error handling + +ATLAPI AtlSetErrorInfo(const CLSID& clsid, LPCOLESTR lpszDesc, + DWORD dwHelpID, LPCOLESTR lpszHelpFile, const IID& iid, HRESULT hRes, + HINSTANCE hInst); + +///////////////////////////////////////////////////////////////////////////// +// Module + +ATLAPI AtlModuleRegisterClassObjects(_ATL_MODULE* pM, DWORD dwClsContext, DWORD dwFlags); +ATLAPI AtlModuleRevokeClassObjects(_ATL_MODULE* pM); +ATLAPI AtlModuleGetClassObject(_ATL_MODULE* pM, REFCLSID rclsid, REFIID riid, LPVOID* ppv); +ATLAPI AtlModuleRegisterServer(_ATL_MODULE* pM, BOOL bRegTypeLib, const CLSID* pCLSID = NULL); +ATLAPI AtlModuleUnregisterServer(_ATL_MODULE* pM, const CLSID* pCLSID = NULL); +ATLAPI AtlModuleUnregisterServerEx(_ATL_MODULE* pM, BOOL bUnRegTypeLib, const CLSID* pCLSID = NULL); +ATLAPI AtlModuleUpdateRegistryFromResourceD(_ATL_MODULE*pM, LPCOLESTR lpszRes, + BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = NULL); +ATLAPI AtlModuleRegisterTypeLib(_ATL_MODULE* pM, LPCOLESTR lpszIndex); +ATLAPI AtlModuleUnRegisterTypeLib(_ATL_MODULE* pM, LPCOLESTR lpszIndex); +ATLAPI AtlModuleLoadTypeLib(_ATL_MODULE* pM, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib); + +ATLAPI AtlModuleInit(_ATL_MODULE* pM, _ATL_OBJMAP_ENTRY* p, HINSTANCE h); +ATLAPI AtlModuleTerm(_ATL_MODULE* pM); +ATLAPI_(DWORD) AtlGetVersion(void* pReserved); +ATLAPI_(void) AtlModuleAddCreateWndData(_ATL_MODULE* pM, _AtlCreateWndData* pData, void* pObject); +ATLAPI_(void*) AtlModuleExtractCreateWndData(_ATL_MODULE* pM); +ATLAPI AtlModuleAddTermFunc(_ATL_MODULE* pM, _ATL_TERMFUNC* pFunc, DWORD dw); + + +#ifndef _ATL_DLL_IMPL +}; //namespace ATL +#endif + +namespace ATL +{ + +enum atlTraceFlags +{ + // Application defined categories + atlTraceUser = 0x00000001, + atlTraceUser2 = 0x00000002, + atlTraceUser3 = 0x00000004, + atlTraceUser4 = 0x00000008, + // ATL defined categories + atlTraceGeneral = 0x00000020, + atlTraceCOM = 0x00000040, + atlTraceQI = 0x00000080, + atlTraceRegistrar = 0x00000100, + atlTraceRefcount = 0x00000200, + atlTraceWindowing = 0x00000400, + atlTraceControls = 0x00000800, + atlTraceHosting = 0x00001000, + atlTraceDBClient = 0x00002000, + atlTraceDBProvider = 0x00004000, + atlTraceSnapin = 0x00008000, + atlTraceNotImpl = 0x00010000, +}; + +#ifndef ATL_TRACE_CATEGORY +#define ATL_TRACE_CATEGORY 0xFFFFFFFF +#endif + +#ifdef _DEBUG + +#ifndef ATL_TRACE_LEVEL +#define ATL_TRACE_LEVEL 0 +#endif + +inline void _cdecl AtlTrace(LPCSTR lpszFormat, ...) +{ + va_list args; + va_start(args, lpszFormat); + + int nBuf; + char szBuffer[512]; + + nBuf = _vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args); + ATLASSERT(nBuf < sizeof(szBuffer)); //Output truncated as it was > sizeof(szBuffer) + + OutputDebugStringA(szBuffer); + va_end(args); +} +inline void _cdecl AtlTrace2(DWORD category, UINT level, LPCSTR lpszFormat, ...) +{ + if (category & ATL_TRACE_CATEGORY && level <= ATL_TRACE_LEVEL) + { + va_list args; + va_start(args, lpszFormat); + + int nBuf; + char szBuffer[512]; + + nBuf = _vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args); + ATLASSERT(nBuf < sizeof(szBuffer)); //Output truncated as it was > sizeof(szBuffer) + + OutputDebugStringA("ATL: "); + OutputDebugStringA(szBuffer); + va_end(args); + } +} +#ifndef OLE2ANSI +inline void _cdecl AtlTrace(LPCWSTR lpszFormat, ...) +{ + va_list args; + va_start(args, lpszFormat); + + int nBuf; + WCHAR szBuffer[512]; + + nBuf = _vsnwprintf(szBuffer, sizeof(szBuffer) / sizeof(WCHAR), lpszFormat, args); + ATLASSERT(nBuf < sizeof(szBuffer));//Output truncated as it was > sizeof(szBuffer) + + OutputDebugStringW(szBuffer); + va_end(args); +} +inline void _cdecl AtlTrace2(DWORD category, UINT level, LPCWSTR lpszFormat, ...) +{ + if (category & ATL_TRACE_CATEGORY && level <= ATL_TRACE_LEVEL) + { + va_list args; + va_start(args, lpszFormat); + + int nBuf; + WCHAR szBuffer[512]; + + nBuf = _vsnwprintf(szBuffer, sizeof(szBuffer) / sizeof(WCHAR), lpszFormat, args); + ATLASSERT(nBuf < sizeof(szBuffer));//Output truncated as it was > sizeof(szBuffer) + + OutputDebugStringW(L"ATL: "); + OutputDebugStringW(szBuffer); + va_end(args); + } +} +#endif //!OLE2ANSI + + +#ifndef ATLTRACE +#define ATLTRACE AtlTrace +#define ATLTRACE2 AtlTrace2 +#endif +#define ATLTRACENOTIMPL(funcname) ATLTRACE2(atlTraceNotImpl, 2, _T("ATL: %s not implemented.\n"), funcname); return E_NOTIMPL +#else // !DEBUG +inline void _cdecl AtlTrace(LPCSTR , ...){} +inline void _cdecl AtlTrace2(DWORD, UINT, LPCSTR , ...){} +#ifndef OLE2ANSI +inline void _cdecl AtlTrace(LPCWSTR , ...){} +inline void _cdecl AtlTrace2(DWORD, UINT, LPCWSTR , ...){} +#endif //OLE2ANSI +#ifndef ATLTRACE +#define ATLTRACE 1 ? (void)0 : AtlTrace +#define ATLTRACE2 1 ? (void)0 : AtlTrace2 +#endif //ATLTRACE +#define ATLTRACENOTIMPL(funcname) return E_NOTIMPL +#endif //_DEBUG + + + + + +///////////////////////////////////////////////////////////////////////////// +// Win32 libraries + +#pragma comment(lib, "kernel32.lib") +#pragma comment(lib, "user32.lib") +#pragma comment(lib, "olepro32.lib") +#pragma comment(lib, "advapi32.lib") +#pragma comment(lib, "ole32.lib") +#pragma comment(lib, "oleaut32.lib") +#pragma comment(lib, "uuid.lib") + +static HRESULT AtlSetChildSite(IUnknown* punkChild, IUnknown* punkParent) +{ + if (punkChild == NULL) + return E_POINTER; + + HRESULT hr; + IObjectWithSite* pChildSite = NULL; + hr = punkChild->QueryInterface(IID_IObjectWithSite, (void**)&pChildSite); + if (SUCCEEDED(hr) && pChildSite != NULL) + { + hr = pChildSite->SetSite(punkParent); + pChildSite->Release(); + } + return hr; +} + +template +class _NoAddRefReleaseOnCComPtr : public T +{ + private: + STDMETHOD_(ULONG, AddRef)()=0; + STDMETHOD_(ULONG, Release)()=0; +}; + +template +class CComPtr +{ +public: + typedef T _PtrClass; + CComPtr() + { + p=NULL; + } + CComPtr(T* lp) + { + if ((p = lp) != NULL) + p->AddRef(); + } + CComPtr(const CComPtr& lp) + { + if ((p = lp.p) != NULL) + p->AddRef(); + } + ~CComPtr() + { + if (p) + p->Release(); + } + void Release() + { + IUnknown* pTemp = p; + if (pTemp) + { + p = NULL; + pTemp->Release(); + } + } + operator T*() const + { + return (T*)p; + } + T& operator*() const + { + ATLASSERT(p!=NULL); + return *p; + } + //The assert on operator& usually indicates a bug. If this is really + //what is needed, however, take the address of the p member explicitly. + T** operator&() + { + ATLASSERT(p==NULL); + return &p; + } + _NoAddRefReleaseOnCComPtr* operator->() const + { + ATLASSERT(p!=NULL); + return (_NoAddRefReleaseOnCComPtr*)p; + } + T* operator=(T* lp) + { + return (T*)AtlComPtrAssign((IUnknown**)&p, lp); + } + T* operator=(const CComPtr& lp) + { + return (T*)AtlComPtrAssign((IUnknown**)&p, lp.p); + } + bool operator!() const + { + return (p == NULL); + } + bool operator<(T* pT) const + { + return p < pT; + } + bool operator==(T* pT) const + { + return p == pT; + } + // Compare two objects for equivalence + bool IsEqualObject(IUnknown* pOther) + { + if (p == NULL && pOther == NULL) + return true; // They are both NULL objects + + if (p == NULL || pOther == NULL) + return false; // One is NULL the other is not + + CComPtr punk1; + CComPtr punk2; + p->QueryInterface(IID_IUnknown, (void**)&punk1); + pOther->QueryInterface(IID_IUnknown, (void**)&punk2); + return punk1 == punk2; + } + void Attach(T* p2) + { + if (p) + p->Release(); + p = p2; + } + T* Detach() + { + T* pt = p; + p = NULL; + return pt; + } + HRESULT CopyTo(T** ppT) + { + ATLASSERT(ppT != NULL); + if (ppT == NULL) + return E_POINTER; + *ppT = p; + if (p) + p->AddRef(); + return S_OK; + } + HRESULT SetSite(IUnknown* punkParent) + { + return AtlSetChildSite(p, punkParent); + } + HRESULT Advise(IUnknown* pUnk, const IID& iid, LPDWORD pdw) + { + return AtlAdvise(p, pUnk, iid, pdw); + } + HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + ATLASSERT(p == NULL); + return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); + } + HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + CLSID clsid; + HRESULT hr = CLSIDFromProgID(szProgID, &clsid); + ATLASSERT(p == NULL); + if (SUCCEEDED(hr)) + hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); + return hr; + } + template + HRESULT QueryInterface(Q** pp) const + { + ATLASSERT(pp != NULL && *pp == NULL); + return p->QueryInterface(__uuidof(Q), (void**)pp); + } + T* p; +}; + + +template +class CComQIPtr +{ +public: + typedef T _PtrClass; + CComQIPtr() + { + p=NULL; + } + CComQIPtr(T* lp) + { + if ((p = lp) != NULL) + p->AddRef(); + } + CComQIPtr(const CComQIPtr& lp) + { + if ((p = lp.p) != NULL) + p->AddRef(); + } + CComQIPtr(IUnknown* lp) + { + p=NULL; + if (lp != NULL) + lp->QueryInterface(*piid, (void **)&p); + } + ~CComQIPtr() + { + if (p) + p->Release(); + } + void Release() + { + IUnknown* pTemp = p; + if (pTemp) + { + p = NULL; + pTemp->Release(); + } + } + operator T*() const + { + return p; + } + T& operator*() const + { + ATLASSERT(p!=NULL); return *p; + } + //The assert on operator& usually indicates a bug. If this is really + //what is needed, however, take the address of the p member explicitly. + T** operator&() + { + ATLASSERT(p==NULL); + return &p; + } + _NoAddRefReleaseOnCComPtr* operator->() const + { + ATLASSERT(p!=NULL); + return (_NoAddRefReleaseOnCComPtr*)p; + } + T* operator=(T* lp) + { + return (T*)AtlComPtrAssign((IUnknown**)&p, lp); + } + T* operator=(const CComQIPtr& lp) + { + return (T*)AtlComPtrAssign((IUnknown**)&p, lp.p); + } + T* operator=(IUnknown* lp) + { + return (T*)AtlComQIPtrAssign((IUnknown**)&p, lp, *piid); + } + bool operator!() const + { + return (p == NULL); + } + bool operator<(T* pT) const + { + return p < pT; + } + bool operator==(T* pT) const + { + return p == pT; + } + // Compare two objects for equivalence + bool IsEqualObject(IUnknown* pOther) + { + if (p == NULL && pOther == NULL) + return true; // They are both NULL objects + + if (p == NULL || pOther == NULL) + return false; // One is NULL the other is not + + CComPtr punk1; + CComPtr punk2; + p->QueryInterface(IID_IUnknown, (void**)&punk1); + pOther->QueryInterface(IID_IUnknown, (void**)&punk2); + return punk1 == punk2; + } + void Attach(T* p2) + { + if (p) + p->Release(); + p = p2; + } + T* Detach() + { + T* pt = p; + p = NULL; + return pt; + } + HRESULT CopyTo(T** ppT) + { + ATLASSERT(ppT != NULL); + if (ppT == NULL) + return E_POINTER; + *ppT = p; + if (p) + p->AddRef(); + return S_OK; + } + HRESULT SetSite(IUnknown* punkParent) + { + return AtlSetChildSite(p, punkParent); + } + HRESULT Advise(IUnknown* pUnk, const IID& iid, LPDWORD pdw) + { + return AtlAdvise(p, pUnk, iid, pdw); + } + HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + ATLASSERT(p == NULL); + return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); + } + HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + CLSID clsid; + HRESULT hr = CLSIDFromProgID(szProgID, &clsid); + ATLASSERT(p == NULL); + if (SUCCEEDED(hr)) + hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); + return hr; + } + template + HRESULT QueryInterface(Q** pp) + { + ATLASSERT(pp != NULL && *pp == NULL); + return p->QueryInterface(__uuidof(Q), (void**)pp); + } + T* p; +}; + +//Specialization to make it work +template<> +class CComQIPtr +{ +public: + typedef IUnknown _PtrClass; + CComQIPtr() + { + p=NULL; + } + CComQIPtr(IUnknown* lp) + { + //Actually do a QI to get identity + p=NULL; + if (lp != NULL) + lp->QueryInterface(IID_IUnknown, (void **)&p); + } + CComQIPtr(const CComQIPtr& lp) + { + if ((p = lp.p) != NULL) + p->AddRef(); + } + ~CComQIPtr() + { + if (p) + p->Release(); + } + void Release() + { + IUnknown* pTemp = p; + if (pTemp) + { + p = NULL; + pTemp->Release(); + } + } + operator IUnknown*() const + { + return p; + } + IUnknown& operator*() const + { + ATLASSERT(p!=NULL); + return *p; + } + //The assert on operator& usually indicates a bug. If this is really + //what is needed, however, take the address of the p member explicitly. + IUnknown** operator&() + { + ATLASSERT(p==NULL); + return &p; + } + _NoAddRefReleaseOnCComPtr* operator->() const + { + ATLASSERT(p!=NULL); + return (_NoAddRefReleaseOnCComPtr*)p; + } + IUnknown* operator=(IUnknown* lp) + { + //Actually do a QI to get identity + return (IUnknown*)AtlComQIPtrAssign((IUnknown**)&p, lp, IID_IUnknown); + } + IUnknown* operator=(const CComQIPtr& lp) + { + return (IUnknown*)AtlComPtrAssign((IUnknown**)&p, lp.p); + } + bool operator!() const + { + return (p == NULL); + } + bool operator<(IUnknown* pT) const + { + return p < pT; + } + bool operator==(IUnknown* pT) const + { + return p == pT; + } + // Compare two objects for equivalence + bool IsEqualObject(IUnknown* pOther) + { + if (p == NULL && pOther == NULL) + return true; // They are both NULL objects + + if (p == NULL || pOther == NULL) + return false; // One is NULL the other is not + + CComPtr punk1; + CComPtr punk2; + p->QueryInterface(IID_IUnknown, (void**)&punk1); + pOther->QueryInterface(IID_IUnknown, (void**)&punk2); + return punk1 == punk2; + } + IUnknown* Detach() + { + IUnknown* pt = p; + p = NULL; + return pt; + } + HRESULT CopyTo(T** ppT) + { + ATLASSERT(ppT != NULL); + if (ppT == NULL) + return E_POINTER; + *ppT = p; + if (p) + p->AddRef(); + return S_OK; + } + HRESULT SetSite(IUnknown* punkParent) + { + return AtlSetChildSite(p, punkParent); + } + HRESULT Advise(IUnknown* pUnk, const IID& iid, LPDWORD pdw) + { + return AtlAdvise(p, pUnk, iid, pdw); + } + HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + ATLASSERT(p == NULL); + return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); + } + HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + CLSID clsid; + HRESULT hr = CLSIDFromProgID(szProgID, &clsid); + ATLASSERT(p == NULL); + if (SUCCEEDED(hr)) + hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); + return hr; + } + template + HRESULT QueryInterface(Q** pp) + { + ATLASSERT(pp != NULL && *pp == NULL); + return p->QueryInterface(__uuidof(Q), (void**)pp); + } + IUnknown* p; +}; + +#define com_cast CComQIPtr + +///////////////////////////////////////////////////////////// +// Class to Adapt CComBSTR and CComPtr for use with STL containers +// the syntax to use it is +// std::vector< CAdapt > vect; + +template +class CAdapt +{ +public: + CAdapt() + { + } + CAdapt(const T& rSrc) + { + m_T = rSrc; + } + + CAdapt(const CAdapt& rSrCA) + { + m_T = rSrCA.m_T; + } + + CAdapt& operator=(const T& rSrc) + { + m_T = rSrc; + return *this; + } + bool operator<(const T& rSrc) const + { + return m_T < rSrc; + } + bool operator==(const T& rSrc) const + { + return m_T == rSrc; + } + operator T&() + { + return m_T; + } + + operator const T&() const + { + return m_T; + } + + T m_T; +}; + +///////////////////////////////////////////////////////////////////////////// +// GUID comparison + +inline BOOL InlineIsEqualGUID(REFGUID rguid1, REFGUID rguid2) +{ + return ( + ((PLONG) &rguid1)[0] == ((PLONG) &rguid2)[0] && + ((PLONG) &rguid1)[1] == ((PLONG) &rguid2)[1] && + ((PLONG) &rguid1)[2] == ((PLONG) &rguid2)[2] && + ((PLONG) &rguid1)[3] == ((PLONG) &rguid2)[3]); +} + +inline BOOL InlineIsEqualUnknown(REFGUID rguid1) +{ + return ( + ((PLONG) &rguid1)[0] == 0 && + ((PLONG) &rguid1)[1] == 0 && +#ifdef _ATL_BYTESWAP + ((PLONG) &rguid1)[2] == 0xC0000000 && + ((PLONG) &rguid1)[3] == 0x00000046); +#else + ((PLONG) &rguid1)[2] == 0x000000C0 && + ((PLONG) &rguid1)[3] == 0x46000000); +#endif +} + +///////////////////////////////////////////////////////////////////////////// +// Threading Model Support + +class CComCriticalSection +{ +public: + void Lock() {EnterCriticalSection(&m_sec);} + void Unlock() {LeaveCriticalSection(&m_sec);} + void Init() {InitializeCriticalSection(&m_sec);} + void Term() {DeleteCriticalSection(&m_sec);} + CRITICAL_SECTION m_sec; +}; + +class CComAutoCriticalSection +{ +public: + void Lock() {EnterCriticalSection(&m_sec);} + void Unlock() {LeaveCriticalSection(&m_sec);} + CComAutoCriticalSection() {InitializeCriticalSection(&m_sec);} + ~CComAutoCriticalSection() {DeleteCriticalSection(&m_sec);} + CRITICAL_SECTION m_sec; +}; + +class CComFakeCriticalSection +{ +public: + void Lock() {} + void Unlock() {} + void Init() {} + void Term() {} +}; + +class CComMultiThreadModelNoCS +{ +public: + static ULONG WINAPI Increment(LPLONG p) {return InterlockedIncrement(p);} + static ULONG WINAPI Decrement(LPLONG p) {return InterlockedDecrement(p);} + typedef CComFakeCriticalSection AutoCriticalSection; + typedef CComFakeCriticalSection CriticalSection; + typedef CComMultiThreadModelNoCS ThreadModelNoCS; +}; + +class CComMultiThreadModel +{ +public: + static ULONG WINAPI Increment(LPLONG p) {return InterlockedIncrement(p);} + static ULONG WINAPI Decrement(LPLONG p) {return InterlockedDecrement(p);} + typedef CComAutoCriticalSection AutoCriticalSection; + typedef CComCriticalSection CriticalSection; + typedef CComMultiThreadModelNoCS ThreadModelNoCS; +}; + +class CComSingleThreadModel +{ +public: + static ULONG WINAPI Increment(LPLONG p) {return ++(*p);} + static ULONG WINAPI Decrement(LPLONG p) {return --(*p);} + typedef CComFakeCriticalSection AutoCriticalSection; + typedef CComFakeCriticalSection CriticalSection; + typedef CComSingleThreadModel ThreadModelNoCS; +}; + +#if defined(_ATL_SINGLE_THREADED) + typedef CComSingleThreadModel CComObjectThreadModel; + typedef CComSingleThreadModel CComGlobalsThreadModel; +#elif defined(_ATL_APARTMENT_THREADED) + typedef CComSingleThreadModel CComObjectThreadModel; + typedef CComMultiThreadModel CComGlobalsThreadModel; +#else + typedef CComMultiThreadModel CComObjectThreadModel; + typedef CComMultiThreadModel CComGlobalsThreadModel; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CComModule + +#define THREADFLAGS_APARTMENT 0x1 +#define THREADFLAGS_BOTH 0x2 +#define AUTPRXFLAG 0x4 + +HRESULT WINAPI AtlDumpIID(REFIID iid, LPCTSTR pszClassName, HRESULT hr); + +#ifdef _ATL_DEBUG_INTERFACES +struct _QIThunk +{ + STDMETHOD(QueryInterface)(REFIID iid, void** pp) + { + ATLASSERT(m_dwRef >= 0); + return pUnk->QueryInterface(iid, pp); + } + STDMETHOD_(ULONG, AddRef)() + { + if (bBreak) + DebugBreak(); + pUnk->AddRef(); + return InternalAddRef(); + } + ULONG InternalAddRef() + { + if (bBreak) + DebugBreak(); + ATLASSERT(m_dwRef >= 0); + long l = InterlockedIncrement(&m_dwRef); + ATLTRACE(_T("%d> "), m_dwRef); + AtlDumpIID(iid, lpszClassName, S_OK); + if (l > m_dwMaxRef) + m_dwMaxRef = l; + return l; + } + STDMETHOD_(ULONG, Release)(); + + STDMETHOD(f3)(); + STDMETHOD(f4)(); + STDMETHOD(f5)(); + STDMETHOD(f6)(); + STDMETHOD(f7)(); + STDMETHOD(f8)(); + STDMETHOD(f9)(); + STDMETHOD(f10)(); + STDMETHOD(f11)(); + STDMETHOD(f12)(); + STDMETHOD(f13)(); + STDMETHOD(f14)(); + STDMETHOD(f15)(); + STDMETHOD(f16)(); + STDMETHOD(f17)(); + STDMETHOD(f18)(); + STDMETHOD(f19)(); + STDMETHOD(f20)(); + STDMETHOD(f21)(); + STDMETHOD(f22)(); + STDMETHOD(f23)(); + STDMETHOD(f24)(); + STDMETHOD(f25)(); + STDMETHOD(f26)(); + STDMETHOD(f27)(); + STDMETHOD(f28)(); + STDMETHOD(f29)(); + STDMETHOD(f30)(); + STDMETHOD(f31)(); + STDMETHOD(f32)(); + STDMETHOD(f33)(); + STDMETHOD(f34)(); + STDMETHOD(f35)(); + STDMETHOD(f36)(); + STDMETHOD(f37)(); + STDMETHOD(f38)(); + STDMETHOD(f39)(); + STDMETHOD(f40)(); + STDMETHOD(f41)(); + STDMETHOD(f42)(); + STDMETHOD(f43)(); + STDMETHOD(f44)(); + STDMETHOD(f45)(); + STDMETHOD(f46)(); + STDMETHOD(f47)(); + STDMETHOD(f48)(); + STDMETHOD(f49)(); + STDMETHOD(f50)(); + STDMETHOD(f51)(); + STDMETHOD(f52)(); + STDMETHOD(f53)(); + STDMETHOD(f54)(); + STDMETHOD(f55)(); + STDMETHOD(f56)(); + STDMETHOD(f57)(); + STDMETHOD(f58)(); + STDMETHOD(f59)(); + STDMETHOD(f60)(); + STDMETHOD(f61)(); + STDMETHOD(f62)(); + STDMETHOD(f63)(); + STDMETHOD(f64)(); + STDMETHOD(f65)(); + STDMETHOD(f66)(); + STDMETHOD(f67)(); + STDMETHOD(f68)(); + STDMETHOD(f69)(); + STDMETHOD(f70)(); + STDMETHOD(f71)(); + STDMETHOD(f72)(); + STDMETHOD(f73)(); + STDMETHOD(f74)(); + STDMETHOD(f75)(); + STDMETHOD(f76)(); + STDMETHOD(f77)(); + STDMETHOD(f78)(); + STDMETHOD(f79)(); + STDMETHOD(f80)(); + STDMETHOD(f81)(); + STDMETHOD(f82)(); + STDMETHOD(f83)(); + STDMETHOD(f84)(); + STDMETHOD(f85)(); + STDMETHOD(f86)(); + STDMETHOD(f87)(); + STDMETHOD(f88)(); + STDMETHOD(f89)(); + STDMETHOD(f90)(); + STDMETHOD(f91)(); + STDMETHOD(f92)(); + STDMETHOD(f93)(); + STDMETHOD(f94)(); + STDMETHOD(f95)(); + STDMETHOD(f96)(); + STDMETHOD(f97)(); + STDMETHOD(f98)(); + STDMETHOD(f99)(); + STDMETHOD(f100)(); + STDMETHOD(f101)(); + STDMETHOD(f102)(); + STDMETHOD(f103)(); + STDMETHOD(f104)(); + STDMETHOD(f105)(); + STDMETHOD(f106)(); + STDMETHOD(f107)(); + STDMETHOD(f108)(); + STDMETHOD(f109)(); + STDMETHOD(f110)(); + STDMETHOD(f111)(); + STDMETHOD(f112)(); + STDMETHOD(f113)(); + STDMETHOD(f114)(); + STDMETHOD(f115)(); + STDMETHOD(f116)(); + STDMETHOD(f117)(); + STDMETHOD(f118)(); + STDMETHOD(f119)(); + STDMETHOD(f120)(); + STDMETHOD(f121)(); + STDMETHOD(f122)(); + STDMETHOD(f123)(); + STDMETHOD(f124)(); + STDMETHOD(f125)(); + STDMETHOD(f126)(); + STDMETHOD(f127)(); + STDMETHOD(f128)(); + STDMETHOD(f129)(); + STDMETHOD(f130)(); + STDMETHOD(f131)(); + STDMETHOD(f132)(); + STDMETHOD(f133)(); + STDMETHOD(f134)(); + STDMETHOD(f135)(); + STDMETHOD(f136)(); + STDMETHOD(f137)(); + STDMETHOD(f138)(); + STDMETHOD(f139)(); + STDMETHOD(f140)(); + STDMETHOD(f141)(); + STDMETHOD(f142)(); + STDMETHOD(f143)(); + STDMETHOD(f144)(); + STDMETHOD(f145)(); + STDMETHOD(f146)(); + STDMETHOD(f147)(); + STDMETHOD(f148)(); + STDMETHOD(f149)(); + STDMETHOD(f150)(); + STDMETHOD(f151)(); + STDMETHOD(f152)(); + STDMETHOD(f153)(); + STDMETHOD(f154)(); + STDMETHOD(f155)(); + STDMETHOD(f156)(); + STDMETHOD(f157)(); + STDMETHOD(f158)(); + STDMETHOD(f159)(); + STDMETHOD(f160)(); + STDMETHOD(f161)(); + STDMETHOD(f162)(); + STDMETHOD(f163)(); + STDMETHOD(f164)(); + STDMETHOD(f165)(); + STDMETHOD(f166)(); + STDMETHOD(f167)(); + STDMETHOD(f168)(); + STDMETHOD(f169)(); + STDMETHOD(f170)(); + STDMETHOD(f171)(); + STDMETHOD(f172)(); + STDMETHOD(f173)(); + STDMETHOD(f174)(); + STDMETHOD(f175)(); + STDMETHOD(f176)(); + STDMETHOD(f177)(); + STDMETHOD(f178)(); + STDMETHOD(f179)(); + STDMETHOD(f180)(); + STDMETHOD(f181)(); + STDMETHOD(f182)(); + STDMETHOD(f183)(); + STDMETHOD(f184)(); + STDMETHOD(f185)(); + STDMETHOD(f186)(); + STDMETHOD(f187)(); + STDMETHOD(f188)(); + STDMETHOD(f189)(); + STDMETHOD(f190)(); + STDMETHOD(f191)(); + STDMETHOD(f192)(); + STDMETHOD(f193)(); + STDMETHOD(f194)(); + STDMETHOD(f195)(); + STDMETHOD(f196)(); + STDMETHOD(f197)(); + STDMETHOD(f198)(); + STDMETHOD(f199)(); + STDMETHOD(f200)(); + STDMETHOD(f201)(); + STDMETHOD(f202)(); + STDMETHOD(f203)(); + STDMETHOD(f204)(); + STDMETHOD(f205)(); + STDMETHOD(f206)(); + STDMETHOD(f207)(); + STDMETHOD(f208)(); + STDMETHOD(f209)(); + STDMETHOD(f210)(); + STDMETHOD(f211)(); + STDMETHOD(f212)(); + STDMETHOD(f213)(); + STDMETHOD(f214)(); + STDMETHOD(f215)(); + STDMETHOD(f216)(); + STDMETHOD(f217)(); + STDMETHOD(f218)(); + STDMETHOD(f219)(); + STDMETHOD(f220)(); + STDMETHOD(f221)(); + STDMETHOD(f222)(); + STDMETHOD(f223)(); + STDMETHOD(f224)(); + STDMETHOD(f225)(); + STDMETHOD(f226)(); + STDMETHOD(f227)(); + STDMETHOD(f228)(); + STDMETHOD(f229)(); + STDMETHOD(f230)(); + STDMETHOD(f231)(); + STDMETHOD(f232)(); + STDMETHOD(f233)(); + STDMETHOD(f234)(); + STDMETHOD(f235)(); + STDMETHOD(f236)(); + STDMETHOD(f237)(); + STDMETHOD(f238)(); + STDMETHOD(f239)(); + STDMETHOD(f240)(); + STDMETHOD(f241)(); + STDMETHOD(f242)(); + STDMETHOD(f243)(); + STDMETHOD(f244)(); + STDMETHOD(f245)(); + STDMETHOD(f246)(); + STDMETHOD(f247)(); + STDMETHOD(f248)(); + STDMETHOD(f249)(); + STDMETHOD(f250)(); + STDMETHOD(f251)(); + STDMETHOD(f252)(); + STDMETHOD(f253)(); + STDMETHOD(f254)(); + STDMETHOD(f255)(); + STDMETHOD(f256)(); + STDMETHOD(f257)(); + STDMETHOD(f258)(); + STDMETHOD(f259)(); + STDMETHOD(f260)(); + STDMETHOD(f261)(); + STDMETHOD(f262)(); + STDMETHOD(f263)(); + STDMETHOD(f264)(); + STDMETHOD(f265)(); + STDMETHOD(f266)(); + STDMETHOD(f267)(); + STDMETHOD(f268)(); + STDMETHOD(f269)(); + STDMETHOD(f270)(); + STDMETHOD(f271)(); + STDMETHOD(f272)(); + STDMETHOD(f273)(); + STDMETHOD(f274)(); + STDMETHOD(f275)(); + STDMETHOD(f276)(); + STDMETHOD(f277)(); + STDMETHOD(f278)(); + STDMETHOD(f279)(); + STDMETHOD(f280)(); + STDMETHOD(f281)(); + STDMETHOD(f282)(); + STDMETHOD(f283)(); + STDMETHOD(f284)(); + STDMETHOD(f285)(); + STDMETHOD(f286)(); + STDMETHOD(f287)(); + STDMETHOD(f288)(); + STDMETHOD(f289)(); + STDMETHOD(f290)(); + STDMETHOD(f291)(); + STDMETHOD(f292)(); + STDMETHOD(f293)(); + STDMETHOD(f294)(); + STDMETHOD(f295)(); + STDMETHOD(f296)(); + STDMETHOD(f297)(); + STDMETHOD(f298)(); + STDMETHOD(f299)(); + STDMETHOD(f300)(); + STDMETHOD(f301)(); + STDMETHOD(f302)(); + STDMETHOD(f303)(); + STDMETHOD(f304)(); + STDMETHOD(f305)(); + STDMETHOD(f306)(); + STDMETHOD(f307)(); + STDMETHOD(f308)(); + STDMETHOD(f309)(); + STDMETHOD(f310)(); + STDMETHOD(f311)(); + STDMETHOD(f312)(); + STDMETHOD(f313)(); + STDMETHOD(f314)(); + STDMETHOD(f315)(); + STDMETHOD(f316)(); + STDMETHOD(f317)(); + STDMETHOD(f318)(); + STDMETHOD(f319)(); + STDMETHOD(f320)(); + STDMETHOD(f321)(); + STDMETHOD(f322)(); + STDMETHOD(f323)(); + STDMETHOD(f324)(); + STDMETHOD(f325)(); + STDMETHOD(f326)(); + STDMETHOD(f327)(); + STDMETHOD(f328)(); + STDMETHOD(f329)(); + STDMETHOD(f330)(); + STDMETHOD(f331)(); + STDMETHOD(f332)(); + STDMETHOD(f333)(); + STDMETHOD(f334)(); + STDMETHOD(f335)(); + STDMETHOD(f336)(); + STDMETHOD(f337)(); + STDMETHOD(f338)(); + STDMETHOD(f339)(); + STDMETHOD(f340)(); + STDMETHOD(f341)(); + STDMETHOD(f342)(); + STDMETHOD(f343)(); + STDMETHOD(f344)(); + STDMETHOD(f345)(); + STDMETHOD(f346)(); + STDMETHOD(f347)(); + STDMETHOD(f348)(); + STDMETHOD(f349)(); + STDMETHOD(f350)(); + STDMETHOD(f351)(); + STDMETHOD(f352)(); + STDMETHOD(f353)(); + STDMETHOD(f354)(); + STDMETHOD(f355)(); + STDMETHOD(f356)(); + STDMETHOD(f357)(); + STDMETHOD(f358)(); + STDMETHOD(f359)(); + STDMETHOD(f360)(); + STDMETHOD(f361)(); + STDMETHOD(f362)(); + STDMETHOD(f363)(); + STDMETHOD(f364)(); + STDMETHOD(f365)(); + STDMETHOD(f366)(); + STDMETHOD(f367)(); + STDMETHOD(f368)(); + STDMETHOD(f369)(); + STDMETHOD(f370)(); + STDMETHOD(f371)(); + STDMETHOD(f372)(); + STDMETHOD(f373)(); + STDMETHOD(f374)(); + STDMETHOD(f375)(); + STDMETHOD(f376)(); + STDMETHOD(f377)(); + STDMETHOD(f378)(); + STDMETHOD(f379)(); + STDMETHOD(f380)(); + STDMETHOD(f381)(); + STDMETHOD(f382)(); + STDMETHOD(f383)(); + STDMETHOD(f384)(); + STDMETHOD(f385)(); + STDMETHOD(f386)(); + STDMETHOD(f387)(); + STDMETHOD(f388)(); + STDMETHOD(f389)(); + STDMETHOD(f390)(); + STDMETHOD(f391)(); + STDMETHOD(f392)(); + STDMETHOD(f393)(); + STDMETHOD(f394)(); + STDMETHOD(f395)(); + STDMETHOD(f396)(); + STDMETHOD(f397)(); + STDMETHOD(f398)(); + STDMETHOD(f399)(); + STDMETHOD(f400)(); + STDMETHOD(f401)(); + STDMETHOD(f402)(); + STDMETHOD(f403)(); + STDMETHOD(f404)(); + STDMETHOD(f405)(); + STDMETHOD(f406)(); + STDMETHOD(f407)(); + STDMETHOD(f408)(); + STDMETHOD(f409)(); + STDMETHOD(f410)(); + STDMETHOD(f411)(); + STDMETHOD(f412)(); + STDMETHOD(f413)(); + STDMETHOD(f414)(); + STDMETHOD(f415)(); + STDMETHOD(f416)(); + STDMETHOD(f417)(); + STDMETHOD(f418)(); + STDMETHOD(f419)(); + STDMETHOD(f420)(); + STDMETHOD(f421)(); + STDMETHOD(f422)(); + STDMETHOD(f423)(); + STDMETHOD(f424)(); + STDMETHOD(f425)(); + STDMETHOD(f426)(); + STDMETHOD(f427)(); + STDMETHOD(f428)(); + STDMETHOD(f429)(); + STDMETHOD(f430)(); + STDMETHOD(f431)(); + STDMETHOD(f432)(); + STDMETHOD(f433)(); + STDMETHOD(f434)(); + STDMETHOD(f435)(); + STDMETHOD(f436)(); + STDMETHOD(f437)(); + STDMETHOD(f438)(); + STDMETHOD(f439)(); + STDMETHOD(f440)(); + STDMETHOD(f441)(); + STDMETHOD(f442)(); + STDMETHOD(f443)(); + STDMETHOD(f444)(); + STDMETHOD(f445)(); + STDMETHOD(f446)(); + STDMETHOD(f447)(); + STDMETHOD(f448)(); + STDMETHOD(f449)(); + STDMETHOD(f450)(); + STDMETHOD(f451)(); + STDMETHOD(f452)(); + STDMETHOD(f453)(); + STDMETHOD(f454)(); + STDMETHOD(f455)(); + STDMETHOD(f456)(); + STDMETHOD(f457)(); + STDMETHOD(f458)(); + STDMETHOD(f459)(); + STDMETHOD(f460)(); + STDMETHOD(f461)(); + STDMETHOD(f462)(); + STDMETHOD(f463)(); + STDMETHOD(f464)(); + STDMETHOD(f465)(); + STDMETHOD(f466)(); + STDMETHOD(f467)(); + STDMETHOD(f468)(); + STDMETHOD(f469)(); + STDMETHOD(f470)(); + STDMETHOD(f471)(); + STDMETHOD(f472)(); + STDMETHOD(f473)(); + STDMETHOD(f474)(); + STDMETHOD(f475)(); + STDMETHOD(f476)(); + STDMETHOD(f477)(); + STDMETHOD(f478)(); + STDMETHOD(f479)(); + STDMETHOD(f480)(); + STDMETHOD(f481)(); + STDMETHOD(f482)(); + STDMETHOD(f483)(); + STDMETHOD(f484)(); + STDMETHOD(f485)(); + STDMETHOD(f486)(); + STDMETHOD(f487)(); + STDMETHOD(f488)(); + STDMETHOD(f489)(); + STDMETHOD(f490)(); + STDMETHOD(f491)(); + STDMETHOD(f492)(); + STDMETHOD(f493)(); + STDMETHOD(f494)(); + STDMETHOD(f495)(); + STDMETHOD(f496)(); + STDMETHOD(f497)(); + STDMETHOD(f498)(); + STDMETHOD(f499)(); + STDMETHOD(f500)(); + STDMETHOD(f501)(); + STDMETHOD(f502)(); + STDMETHOD(f503)(); + STDMETHOD(f504)(); + STDMETHOD(f505)(); + STDMETHOD(f506)(); + STDMETHOD(f507)(); + STDMETHOD(f508)(); + STDMETHOD(f509)(); + STDMETHOD(f510)(); + STDMETHOD(f511)(); + STDMETHOD(f512)(); + STDMETHOD(f513)(); + STDMETHOD(f514)(); + STDMETHOD(f515)(); + STDMETHOD(f516)(); + STDMETHOD(f517)(); + STDMETHOD(f518)(); + STDMETHOD(f519)(); + STDMETHOD(f520)(); + STDMETHOD(f521)(); + STDMETHOD(f522)(); + STDMETHOD(f523)(); + STDMETHOD(f524)(); + STDMETHOD(f525)(); + STDMETHOD(f526)(); + STDMETHOD(f527)(); + STDMETHOD(f528)(); + STDMETHOD(f529)(); + STDMETHOD(f530)(); + STDMETHOD(f531)(); + STDMETHOD(f532)(); + STDMETHOD(f533)(); + STDMETHOD(f534)(); + STDMETHOD(f535)(); + STDMETHOD(f536)(); + STDMETHOD(f537)(); + STDMETHOD(f538)(); + STDMETHOD(f539)(); + STDMETHOD(f540)(); + STDMETHOD(f541)(); + STDMETHOD(f542)(); + STDMETHOD(f543)(); + STDMETHOD(f544)(); + STDMETHOD(f545)(); + STDMETHOD(f546)(); + STDMETHOD(f547)(); + STDMETHOD(f548)(); + STDMETHOD(f549)(); + STDMETHOD(f550)(); + STDMETHOD(f551)(); + STDMETHOD(f552)(); + STDMETHOD(f553)(); + STDMETHOD(f554)(); + STDMETHOD(f555)(); + STDMETHOD(f556)(); + STDMETHOD(f557)(); + STDMETHOD(f558)(); + STDMETHOD(f559)(); + STDMETHOD(f560)(); + STDMETHOD(f561)(); + STDMETHOD(f562)(); + STDMETHOD(f563)(); + STDMETHOD(f564)(); + STDMETHOD(f565)(); + STDMETHOD(f566)(); + STDMETHOD(f567)(); + STDMETHOD(f568)(); + STDMETHOD(f569)(); + STDMETHOD(f570)(); + STDMETHOD(f571)(); + STDMETHOD(f572)(); + STDMETHOD(f573)(); + STDMETHOD(f574)(); + STDMETHOD(f575)(); + STDMETHOD(f576)(); + STDMETHOD(f577)(); + STDMETHOD(f578)(); + STDMETHOD(f579)(); + STDMETHOD(f580)(); + STDMETHOD(f581)(); + STDMETHOD(f582)(); + STDMETHOD(f583)(); + STDMETHOD(f584)(); + STDMETHOD(f585)(); + STDMETHOD(f586)(); + STDMETHOD(f587)(); + STDMETHOD(f588)(); + STDMETHOD(f589)(); + STDMETHOD(f590)(); + STDMETHOD(f591)(); + STDMETHOD(f592)(); + STDMETHOD(f593)(); + STDMETHOD(f594)(); + STDMETHOD(f595)(); + STDMETHOD(f596)(); + STDMETHOD(f597)(); + STDMETHOD(f598)(); + STDMETHOD(f599)(); + STDMETHOD(f600)(); + STDMETHOD(f601)(); + STDMETHOD(f602)(); + STDMETHOD(f603)(); + STDMETHOD(f604)(); + STDMETHOD(f605)(); + STDMETHOD(f606)(); + STDMETHOD(f607)(); + STDMETHOD(f608)(); + STDMETHOD(f609)(); + STDMETHOD(f610)(); + STDMETHOD(f611)(); + STDMETHOD(f612)(); + STDMETHOD(f613)(); + STDMETHOD(f614)(); + STDMETHOD(f615)(); + STDMETHOD(f616)(); + STDMETHOD(f617)(); + STDMETHOD(f618)(); + STDMETHOD(f619)(); + STDMETHOD(f620)(); + STDMETHOD(f621)(); + STDMETHOD(f622)(); + STDMETHOD(f623)(); + STDMETHOD(f624)(); + STDMETHOD(f625)(); + STDMETHOD(f626)(); + STDMETHOD(f627)(); + STDMETHOD(f628)(); + STDMETHOD(f629)(); + STDMETHOD(f630)(); + STDMETHOD(f631)(); + STDMETHOD(f632)(); + STDMETHOD(f633)(); + STDMETHOD(f634)(); + STDMETHOD(f635)(); + STDMETHOD(f636)(); + STDMETHOD(f637)(); + STDMETHOD(f638)(); + STDMETHOD(f639)(); + STDMETHOD(f640)(); + STDMETHOD(f641)(); + STDMETHOD(f642)(); + STDMETHOD(f643)(); + STDMETHOD(f644)(); + STDMETHOD(f645)(); + STDMETHOD(f646)(); + STDMETHOD(f647)(); + STDMETHOD(f648)(); + STDMETHOD(f649)(); + STDMETHOD(f650)(); + STDMETHOD(f651)(); + STDMETHOD(f652)(); + STDMETHOD(f653)(); + STDMETHOD(f654)(); + STDMETHOD(f655)(); + STDMETHOD(f656)(); + STDMETHOD(f657)(); + STDMETHOD(f658)(); + STDMETHOD(f659)(); + STDMETHOD(f660)(); + STDMETHOD(f661)(); + STDMETHOD(f662)(); + STDMETHOD(f663)(); + STDMETHOD(f664)(); + STDMETHOD(f665)(); + STDMETHOD(f666)(); + STDMETHOD(f667)(); + STDMETHOD(f668)(); + STDMETHOD(f669)(); + STDMETHOD(f670)(); + STDMETHOD(f671)(); + STDMETHOD(f672)(); + STDMETHOD(f673)(); + STDMETHOD(f674)(); + STDMETHOD(f675)(); + STDMETHOD(f676)(); + STDMETHOD(f677)(); + STDMETHOD(f678)(); + STDMETHOD(f679)(); + STDMETHOD(f680)(); + STDMETHOD(f681)(); + STDMETHOD(f682)(); + STDMETHOD(f683)(); + STDMETHOD(f684)(); + STDMETHOD(f685)(); + STDMETHOD(f686)(); + STDMETHOD(f687)(); + STDMETHOD(f688)(); + STDMETHOD(f689)(); + STDMETHOD(f690)(); + STDMETHOD(f691)(); + STDMETHOD(f692)(); + STDMETHOD(f693)(); + STDMETHOD(f694)(); + STDMETHOD(f695)(); + STDMETHOD(f696)(); + STDMETHOD(f697)(); + STDMETHOD(f698)(); + STDMETHOD(f699)(); + STDMETHOD(f700)(); + STDMETHOD(f701)(); + STDMETHOD(f702)(); + STDMETHOD(f703)(); + STDMETHOD(f704)(); + STDMETHOD(f705)(); + STDMETHOD(f706)(); + STDMETHOD(f707)(); + STDMETHOD(f708)(); + STDMETHOD(f709)(); + STDMETHOD(f710)(); + STDMETHOD(f711)(); + STDMETHOD(f712)(); + STDMETHOD(f713)(); + STDMETHOD(f714)(); + STDMETHOD(f715)(); + STDMETHOD(f716)(); + STDMETHOD(f717)(); + STDMETHOD(f718)(); + STDMETHOD(f719)(); + STDMETHOD(f720)(); + STDMETHOD(f721)(); + STDMETHOD(f722)(); + STDMETHOD(f723)(); + STDMETHOD(f724)(); + STDMETHOD(f725)(); + STDMETHOD(f726)(); + STDMETHOD(f727)(); + STDMETHOD(f728)(); + STDMETHOD(f729)(); + STDMETHOD(f730)(); + STDMETHOD(f731)(); + STDMETHOD(f732)(); + STDMETHOD(f733)(); + STDMETHOD(f734)(); + STDMETHOD(f735)(); + STDMETHOD(f736)(); + STDMETHOD(f737)(); + STDMETHOD(f738)(); + STDMETHOD(f739)(); + STDMETHOD(f740)(); + STDMETHOD(f741)(); + STDMETHOD(f742)(); + STDMETHOD(f743)(); + STDMETHOD(f744)(); + STDMETHOD(f745)(); + STDMETHOD(f746)(); + STDMETHOD(f747)(); + STDMETHOD(f748)(); + STDMETHOD(f749)(); + STDMETHOD(f750)(); + STDMETHOD(f751)(); + STDMETHOD(f752)(); + STDMETHOD(f753)(); + STDMETHOD(f754)(); + STDMETHOD(f755)(); + STDMETHOD(f756)(); + STDMETHOD(f757)(); + STDMETHOD(f758)(); + STDMETHOD(f759)(); + STDMETHOD(f760)(); + STDMETHOD(f761)(); + STDMETHOD(f762)(); + STDMETHOD(f763)(); + STDMETHOD(f764)(); + STDMETHOD(f765)(); + STDMETHOD(f766)(); + STDMETHOD(f767)(); + STDMETHOD(f768)(); + STDMETHOD(f769)(); + STDMETHOD(f770)(); + STDMETHOD(f771)(); + STDMETHOD(f772)(); + STDMETHOD(f773)(); + STDMETHOD(f774)(); + STDMETHOD(f775)(); + STDMETHOD(f776)(); + STDMETHOD(f777)(); + STDMETHOD(f778)(); + STDMETHOD(f779)(); + STDMETHOD(f780)(); + STDMETHOD(f781)(); + STDMETHOD(f782)(); + STDMETHOD(f783)(); + STDMETHOD(f784)(); + STDMETHOD(f785)(); + STDMETHOD(f786)(); + STDMETHOD(f787)(); + STDMETHOD(f788)(); + STDMETHOD(f789)(); + STDMETHOD(f790)(); + STDMETHOD(f791)(); + STDMETHOD(f792)(); + STDMETHOD(f793)(); + STDMETHOD(f794)(); + STDMETHOD(f795)(); + STDMETHOD(f796)(); + STDMETHOD(f797)(); + STDMETHOD(f798)(); + STDMETHOD(f799)(); + STDMETHOD(f800)(); + STDMETHOD(f801)(); + STDMETHOD(f802)(); + STDMETHOD(f803)(); + STDMETHOD(f804)(); + STDMETHOD(f805)(); + STDMETHOD(f806)(); + STDMETHOD(f807)(); + STDMETHOD(f808)(); + STDMETHOD(f809)(); + STDMETHOD(f810)(); + STDMETHOD(f811)(); + STDMETHOD(f812)(); + STDMETHOD(f813)(); + STDMETHOD(f814)(); + STDMETHOD(f815)(); + STDMETHOD(f816)(); + STDMETHOD(f817)(); + STDMETHOD(f818)(); + STDMETHOD(f819)(); + STDMETHOD(f820)(); + STDMETHOD(f821)(); + STDMETHOD(f822)(); + STDMETHOD(f823)(); + STDMETHOD(f824)(); + STDMETHOD(f825)(); + STDMETHOD(f826)(); + STDMETHOD(f827)(); + STDMETHOD(f828)(); + STDMETHOD(f829)(); + STDMETHOD(f830)(); + STDMETHOD(f831)(); + STDMETHOD(f832)(); + STDMETHOD(f833)(); + STDMETHOD(f834)(); + STDMETHOD(f835)(); + STDMETHOD(f836)(); + STDMETHOD(f837)(); + STDMETHOD(f838)(); + STDMETHOD(f839)(); + STDMETHOD(f840)(); + STDMETHOD(f841)(); + STDMETHOD(f842)(); + STDMETHOD(f843)(); + STDMETHOD(f844)(); + STDMETHOD(f845)(); + STDMETHOD(f846)(); + STDMETHOD(f847)(); + STDMETHOD(f848)(); + STDMETHOD(f849)(); + STDMETHOD(f850)(); + STDMETHOD(f851)(); + STDMETHOD(f852)(); + STDMETHOD(f853)(); + STDMETHOD(f854)(); + STDMETHOD(f855)(); + STDMETHOD(f856)(); + STDMETHOD(f857)(); + STDMETHOD(f858)(); + STDMETHOD(f859)(); + STDMETHOD(f860)(); + STDMETHOD(f861)(); + STDMETHOD(f862)(); + STDMETHOD(f863)(); + STDMETHOD(f864)(); + STDMETHOD(f865)(); + STDMETHOD(f866)(); + STDMETHOD(f867)(); + STDMETHOD(f868)(); + STDMETHOD(f869)(); + STDMETHOD(f870)(); + STDMETHOD(f871)(); + STDMETHOD(f872)(); + STDMETHOD(f873)(); + STDMETHOD(f874)(); + STDMETHOD(f875)(); + STDMETHOD(f876)(); + STDMETHOD(f877)(); + STDMETHOD(f878)(); + STDMETHOD(f879)(); + STDMETHOD(f880)(); + STDMETHOD(f881)(); + STDMETHOD(f882)(); + STDMETHOD(f883)(); + STDMETHOD(f884)(); + STDMETHOD(f885)(); + STDMETHOD(f886)(); + STDMETHOD(f887)(); + STDMETHOD(f888)(); + STDMETHOD(f889)(); + STDMETHOD(f890)(); + STDMETHOD(f891)(); + STDMETHOD(f892)(); + STDMETHOD(f893)(); + STDMETHOD(f894)(); + STDMETHOD(f895)(); + STDMETHOD(f896)(); + STDMETHOD(f897)(); + STDMETHOD(f898)(); + STDMETHOD(f899)(); + STDMETHOD(f900)(); + STDMETHOD(f901)(); + STDMETHOD(f902)(); + STDMETHOD(f903)(); + STDMETHOD(f904)(); + STDMETHOD(f905)(); + STDMETHOD(f906)(); + STDMETHOD(f907)(); + STDMETHOD(f908)(); + STDMETHOD(f909)(); + STDMETHOD(f910)(); + STDMETHOD(f911)(); + STDMETHOD(f912)(); + STDMETHOD(f913)(); + STDMETHOD(f914)(); + STDMETHOD(f915)(); + STDMETHOD(f916)(); + STDMETHOD(f917)(); + STDMETHOD(f918)(); + STDMETHOD(f919)(); + STDMETHOD(f920)(); + STDMETHOD(f921)(); + STDMETHOD(f922)(); + STDMETHOD(f923)(); + STDMETHOD(f924)(); + STDMETHOD(f925)(); + STDMETHOD(f926)(); + STDMETHOD(f927)(); + STDMETHOD(f928)(); + STDMETHOD(f929)(); + STDMETHOD(f930)(); + STDMETHOD(f931)(); + STDMETHOD(f932)(); + STDMETHOD(f933)(); + STDMETHOD(f934)(); + STDMETHOD(f935)(); + STDMETHOD(f936)(); + STDMETHOD(f937)(); + STDMETHOD(f938)(); + STDMETHOD(f939)(); + STDMETHOD(f940)(); + STDMETHOD(f941)(); + STDMETHOD(f942)(); + STDMETHOD(f943)(); + STDMETHOD(f944)(); + STDMETHOD(f945)(); + STDMETHOD(f946)(); + STDMETHOD(f947)(); + STDMETHOD(f948)(); + STDMETHOD(f949)(); + STDMETHOD(f950)(); + STDMETHOD(f951)(); + STDMETHOD(f952)(); + STDMETHOD(f953)(); + STDMETHOD(f954)(); + STDMETHOD(f955)(); + STDMETHOD(f956)(); + STDMETHOD(f957)(); + STDMETHOD(f958)(); + STDMETHOD(f959)(); + STDMETHOD(f960)(); + STDMETHOD(f961)(); + STDMETHOD(f962)(); + STDMETHOD(f963)(); + STDMETHOD(f964)(); + STDMETHOD(f965)(); + STDMETHOD(f966)(); + STDMETHOD(f967)(); + STDMETHOD(f968)(); + STDMETHOD(f969)(); + STDMETHOD(f970)(); + STDMETHOD(f971)(); + STDMETHOD(f972)(); + STDMETHOD(f973)(); + STDMETHOD(f974)(); + STDMETHOD(f975)(); + STDMETHOD(f976)(); + STDMETHOD(f977)(); + STDMETHOD(f978)(); + STDMETHOD(f979)(); + STDMETHOD(f980)(); + STDMETHOD(f981)(); + STDMETHOD(f982)(); + STDMETHOD(f983)(); + STDMETHOD(f984)(); + STDMETHOD(f985)(); + STDMETHOD(f986)(); + STDMETHOD(f987)(); + STDMETHOD(f988)(); + STDMETHOD(f989)(); + STDMETHOD(f990)(); + STDMETHOD(f991)(); + STDMETHOD(f992)(); + STDMETHOD(f993)(); + STDMETHOD(f994)(); + STDMETHOD(f995)(); + STDMETHOD(f996)(); + STDMETHOD(f997)(); + STDMETHOD(f998)(); + STDMETHOD(f999)(); + STDMETHOD(f1000)(); + STDMETHOD(f1001)(); + STDMETHOD(f1002)(); + STDMETHOD(f1003)(); + STDMETHOD(f1004)(); + STDMETHOD(f1005)(); + STDMETHOD(f1006)(); + STDMETHOD(f1007)(); + STDMETHOD(f1008)(); + STDMETHOD(f1009)(); + STDMETHOD(f1010)(); + STDMETHOD(f1011)(); + STDMETHOD(f1012)(); + STDMETHOD(f1013)(); + STDMETHOD(f1014)(); + STDMETHOD(f1015)(); + STDMETHOD(f1016)(); + STDMETHOD(f1017)(); + STDMETHOD(f1018)(); + STDMETHOD(f1019)(); + STDMETHOD(f1020)(); + STDMETHOD(f1021)(); + STDMETHOD(f1022)(); + STDMETHOD(f1023)(); + STDMETHOD(f1024)(); + _QIThunk(IUnknown* pOrig, LPCTSTR p, const IID& i, UINT n, bool b) + { + lpszClassName = p; + iid = i; + nIndex = n; + m_dwRef = 0; + m_dwMaxRef = 0; + pUnk = pOrig; + bBreak = b; + bNonAddRefThunk = false; + } + IUnknown* pUnk; + long m_dwRef; + long m_dwMaxRef; + LPCTSTR lpszClassName; + IID iid; + UINT nIndex; + bool bBreak; + bool bNonAddRefThunk; + void Dump() + { + TCHAR buf[256]; + if (m_dwRef != 0) + { + wsprintf(buf, _T("INTERFACE LEAK: RefCount = %d, MaxRefCount = %d, {Allocation = %d} "), m_dwRef, m_dwMaxRef, nIndex); + OutputDebugString(buf); + AtlDumpIID(iid, lpszClassName, S_OK); + } + else + { + wsprintf(buf, _T("NonAddRef Thunk LEAK: {Allocation = %d}\n"), nIndex); + OutputDebugString(buf); + } + } +}; +#endif + + +///////////////////////////////////////////////////////////////////////////// +// Collection helpers - CSimpleArray & CSimpleMap + +template +class CSimpleArray +{ +public: + T* m_aT; + int m_nSize; + int m_nAllocSize; + +// Construction/destruction + CSimpleArray() : m_aT(NULL), m_nSize(0), m_nAllocSize(0) + { } + + ~CSimpleArray() + { + RemoveAll(); + } + +// Operations + int GetSize() const + { + return m_nSize; + } + BOOL Add(T& t) + { + if(m_nSize == m_nAllocSize) + { + T* aT; + int nNewAllocSize = (m_nAllocSize == 0) ? 1 : (m_nSize * 2); + aT = (T*)realloc(m_aT, nNewAllocSize * sizeof(T)); + if(aT == NULL) + return FALSE; + m_nAllocSize = nNewAllocSize; + m_aT = aT; + } + m_nSize++; + SetAtIndex(m_nSize - 1, t); + return TRUE; + } + BOOL Remove(T& t) + { + int nIndex = Find(t); + if(nIndex == -1) + return FALSE; + return RemoveAt(nIndex); + } + BOOL RemoveAt(int nIndex) + { + if(nIndex != (m_nSize - 1)) + { + m_aT[nIndex].~T(); + memmove((void*)&m_aT[nIndex], (void*)&m_aT[nIndex + 1], (m_nSize - (nIndex + 1)) * sizeof(T)); + } + m_nSize--; + return TRUE; + } + void RemoveAll() + { + if(m_aT != NULL) + { + for(int i = 0; i < m_nSize; i++) + m_aT[i].~T(); + free(m_aT); + m_aT = NULL; + } + m_nSize = 0; + m_nAllocSize = 0; + } + T& operator[] (int nIndex) const + { + ATLASSERT(nIndex >= 0 && nIndex < m_nSize); + return m_aT[nIndex]; + } + T* GetData() const + { + return m_aT; + } + +// Implementation + class Wrapper + { + public: + Wrapper(T& _t) : t(_t) + { + } + template + void *operator new(size_t, _Ty* p) + { + return p; + } + T t; + }; + void SetAtIndex(int nIndex, T& t) + { + ATLASSERT(nIndex >= 0 && nIndex < m_nSize); + new(&m_aT[nIndex]) Wrapper(t); + } + int Find(T& t) const + { + for(int i = 0; i < m_nSize; i++) + { + if(m_aT[i] == t) + return i; + } + return -1; // not found + } +}; + +// for arrays of simple types +template +class CSimpleValArray : public CSimpleArray< T > +{ +public: + BOOL Add(T t) + { + return CSimpleArray< T >::Add(t); + } + BOOL Remove(T t) + { + return CSimpleArray< T >::Remove(t); + } + T operator[] (int nIndex) const + { + return CSimpleArray< T >::operator[](nIndex); + } +}; + + +// intended for small number of simple types or pointers +template +class CSimpleMap +{ +public: + TKey* m_aKey; + TVal* m_aVal; + int m_nSize; + +// Construction/destruction + CSimpleMap() : m_aKey(NULL), m_aVal(NULL), m_nSize(0) + { } + + ~CSimpleMap() + { + RemoveAll(); + } + +// Operations + int GetSize() const + { + return m_nSize; + } + BOOL Add(TKey key, TVal val) + { + TKey* pKey; + pKey = (TKey*)realloc(m_aKey, (m_nSize + 1) * sizeof(TKey)); + if(pKey == NULL) + return FALSE; + m_aKey = pKey; + TVal* pVal; + pVal = (TVal*)realloc(m_aVal, (m_nSize + 1) * sizeof(TVal)); + if(pVal == NULL) + return FALSE; + m_aVal = pVal; + m_nSize++; + SetAtIndex(m_nSize - 1, key, val); + return TRUE; + } + BOOL Remove(TKey key) + { + int nIndex = FindKey(key); + if(nIndex == -1) + return FALSE; + if(nIndex != (m_nSize - 1)) + { + m_aKey[nIndex].~TKey(); + m_aVal[nIndex].~TVal(); + memmove((void*)&m_aKey[nIndex], (void*)&m_aKey[nIndex + 1], (m_nSize - (nIndex + 1)) * sizeof(TKey)); + memmove((void*)&m_aVal[nIndex], (void*)&m_aVal[nIndex + 1], (m_nSize - (nIndex + 1)) * sizeof(TVal)); + } + TKey* pKey; + pKey = (TKey*)realloc(m_aKey, (m_nSize - 1) * sizeof(TKey)); + if(pKey != NULL || m_nSize == 1) + m_aKey = pKey; + TVal* pVal; + pVal = (TVal*)realloc(m_aVal, (m_nSize - 1) * sizeof(TVal)); + if(pVal != NULL || m_nSize == 1) + m_aVal = pVal; + m_nSize--; + return TRUE; + } + void RemoveAll() + { + if(m_aKey != NULL) + { + for(int i = 0; i < m_nSize; i++) + { + m_aKey[i].~TKey(); + m_aVal[i].~TVal(); + } + free(m_aKey); + m_aKey = NULL; + } + if(m_aVal != NULL) + { + free(m_aVal); + m_aVal = NULL; + } + + m_nSize = 0; + } + BOOL SetAt(TKey key, TVal val) + { + int nIndex = FindKey(key); + if(nIndex == -1) + return FALSE; + SetAtIndex(nIndex, key, val); + return TRUE; + } + TVal Lookup(TKey key) const + { + int nIndex = FindKey(key); + if(nIndex == -1) + return NULL; // must be able to convert + return GetValueAt(nIndex); + } + TKey ReverseLookup(TVal val) const + { + int nIndex = FindVal(val); + if(nIndex == -1) + return NULL; // must be able to convert + return GetKeyAt(nIndex); + } + TKey& GetKeyAt(int nIndex) const + { + ATLASSERT(nIndex >= 0 && nIndex < m_nSize); + return m_aKey[nIndex]; + } + TVal& GetValueAt(int nIndex) const + { + ATLASSERT(nIndex >= 0 && nIndex < m_nSize); + return m_aVal[nIndex]; + } + +// Implementation + + template + class Wrapper + { + public: + Wrapper(T& _t) : t(_t) + { + } + template + void *operator new(size_t, _Ty* p) + { + return p; + } + T t; + }; + void SetAtIndex(int nIndex, TKey& key, TVal& val) + { + ATLASSERT(nIndex >= 0 && nIndex < m_nSize); + new(&m_aKey[nIndex]) Wrapper(key); + new(&m_aVal[nIndex]) Wrapper(val); + } + int FindKey(TKey& key) const + { + for(int i = 0; i < m_nSize; i++) + { + if(m_aKey[i] == key) + return i; + } + return -1; // not found + } + int FindVal(TVal& val) const + { + for(int i = 0; i < m_nSize; i++) + { + if(m_aVal[i] == val) + return i; + } + return -1; // not found + } +}; + + +class CComModule; +__declspec(selectany) CComModule* _pModule=NULL; + +// {B62F5910-6528-11d1-9611-0000F81E0D0D} +_declspec(selectany) GUID GUID_ATLVer30 = { 0xb62f5910, 0x6528, 0x11d1, { 0x96, 0x11, 0x0, 0x0, 0xf8, 0x1e, 0xd, 0xd } }; + +class CComModule : public _ATL_MODULE +{ +// Operations +public: + static GUID m_libid; +#ifdef _ATL_DEBUG_INTERFACES + UINT m_nIndexQI; + UINT m_nIndexBreakAt; + CSimpleArray<_QIThunk*>* m_paThunks; +#endif // _ATL_DEBUG_INTERFACES + + void AddCreateWndData(_AtlCreateWndData* pData, void* pObject) + { + AtlModuleAddCreateWndData(this, pData, pObject); + } + void* ExtractCreateWndData() + { + return AtlModuleExtractCreateWndData(this); + } + + HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = NULL) + { + pguidVer = &GUID_ATLVer30; + _pModule = this; + cbSize = sizeof(_ATL_MODULE); + dwAtlBuildVer = _ATL_VER; + AtlModuleInit(this, p, h); + if (plibid != NULL) + memcpy((void*)&m_libid, plibid, sizeof(GUID)); +#ifdef _ATL_MIN_CRT + // Create a base heap + m_hHeap = HeapCreate(0, 0, 0); + +#ifndef _ATL_NO_MP_HEAP + OSVERSIONINFO ver; + SYSTEM_INFO si; + memset( &ver, 0, sizeof( ver ) ); + ver.dwOSVersionInfoSize = sizeof( ver ); + GetVersionEx( &ver ); + GetSystemInfo(&si); + if( ((ver.dwPlatformId != VER_PLATFORM_WIN32_NT) || + (ver.dwMajorVersion < 5)) && (si.dwNumberOfProcessors > 1) ) + { + DWORD dwHeaps = si.dwNumberOfProcessors * 2; + m_dwHeaps = 0xFFFFFFFF; + for (int bits = 0; bits < 32; bits++) + { + if (dwHeaps & 0x80000000) + break; + dwHeaps <<= 1; + m_dwHeaps >>= 1; + } + m_dwHeaps >>= 1; + + // Allocate more heaps for each processor + m_phHeaps = (HANDLE*) HeapAlloc(m_hHeap, _ATL_HEAPFLAGS, sizeof(HANDLE) * (m_dwHeaps + 1)); + for (DWORD i = 0; i <= m_dwHeaps; i++) + m_phHeaps[i] = HeapCreate(0, 0, 0); + } + else +#endif + { + m_phHeaps = NULL; + m_dwHeaps = 0; + } +#endif +#ifdef _ATL_DEBUG_INTERFACES + m_nIndexQI = 0; + m_nIndexBreakAt = 0; + m_paThunks = NULL; + ATLTRY(m_paThunks = new CSimpleArray<_QIThunk*>); + if (m_paThunks == NULL) + return E_OUTOFMEMORY; +#endif // _ATL_DEBUG_INTERFACES + return S_OK; + } +#ifdef _ATL_DEBUG_INTERFACES + HRESULT AddThunk(IUnknown** pp, LPCTSTR lpsz, REFIID iid) + { + if ((pp == NULL) || (*pp == NULL)) + return E_POINTER; + IUnknown* p = *pp; + _QIThunk* pThunk = NULL; + EnterCriticalSection(&m_csObjMap); + // Check if exists already for identity + if (InlineIsEqualUnknown(iid)) + { + for (int i = 0; i < m_paThunks->GetSize(); i++) + { + if (m_paThunks->operator[](i)->pUnk == p) + { + m_paThunks->operator[](i)->InternalAddRef(); + pThunk = m_paThunks->operator[](i); + break; + } + } + } + if (pThunk == NULL) + { + ++m_nIndexQI; + if (m_nIndexBreakAt == m_nIndexQI) + DebugBreak(); + ATLTRY(pThunk = new _QIThunk(p, lpsz, iid, m_nIndexQI, (m_nIndexBreakAt == m_nIndexQI))); + if (pThunk == NULL) + return E_OUTOFMEMORY; + pThunk->InternalAddRef(); + m_paThunks->Add(pThunk); + } + LeaveCriticalSection(&m_csObjMap); + *pp = (IUnknown*)pThunk; + return S_OK; + } + HRESULT AddNonAddRefThunk(IUnknown* p, LPCTSTR lpsz, IUnknown** ppThunkRet) + { + _QIThunk* pThunk = NULL; + EnterCriticalSection(&m_csObjMap); + // Check if exists already for identity + for (int i = 0; i < m_paThunks->GetSize(); i++) + { + if (m_paThunks->operator[](i)->pUnk == p) + { + m_paThunks->operator[](i)->bNonAddRefThunk = true; + pThunk = m_paThunks->operator[](i); + break; + } + } + if (pThunk == NULL) + { + ++m_nIndexQI; + if (m_nIndexBreakAt == m_nIndexQI) + DebugBreak(); + ATLTRY(pThunk = new _QIThunk(p, lpsz, IID_IUnknown, m_nIndexQI, (m_nIndexBreakAt == m_nIndexQI))); + if (pThunk == NULL) + { + *ppThunkRet = NULL; + return E_OUTOFMEMORY; + } + pThunk->bNonAddRefThunk = true; + m_paThunks->Add(pThunk); + } + LeaveCriticalSection(&m_csObjMap); + *ppThunkRet = (IUnknown*)pThunk; + return S_OK;; + } + void DeleteNonAddRefThunk(IUnknown* pUnk) + { + EnterCriticalSection(&m_csObjMap); + for (int i = 0; i < m_paThunks->GetSize(); i++) + { + if (m_paThunks->operator[](i)->pUnk == pUnk) + { + delete m_paThunks->operator[](i); + m_paThunks->RemoveAt(i); + break; + } + } + LeaveCriticalSection(&m_csObjMap); + } + void DeleteThunk(_QIThunk* p) + { + EnterCriticalSection(&m_csObjMap); + int nIndex = m_paThunks->Find(p); + if (nIndex != -1) + { + delete m_paThunks->operator[](nIndex); + m_paThunks->RemoveAt(nIndex); + } + LeaveCriticalSection(&m_csObjMap); + } + bool DumpLeakedThunks() + { + bool b = false; + for (int i = 0; i < m_paThunks->GetSize(); i++) + { + b = true; + m_paThunks->operator[](i)->Dump(); + delete m_paThunks->operator[](i); + } + m_paThunks->RemoveAll(); + return b; + } +#endif // _ATL_DEBUG_INTERFACES + void Term() + { +#ifdef _ATL_DEBUG_INTERFACES + m_bDestroyHeap = false; // prevent heap from going away + AtlModuleTerm(this); + DumpLeakedThunks(); + delete m_paThunks; +#ifndef _ATL_NO_MP_HEAP + if (m_phHeaps != NULL) + { + for (DWORD i = 0; i <= m_dwHeaps; i++) + HeapDestroy(m_phHeaps[i]); + } +#endif + if (m_hHeap != NULL) + HeapDestroy(m_hHeap); +#else + AtlModuleTerm(this); +#endif // _ATL_DEBUG_INTERFACES + } + + HRESULT AddTermFunc(_ATL_TERMFUNC* pFunc, DWORD dw) + { + return AtlModuleAddTermFunc(this, pFunc, dw); + } + + LONG Lock() + { + return CComGlobalsThreadModel::Increment(&m_nLockCnt); + } + LONG Unlock() + { + return CComGlobalsThreadModel::Decrement(&m_nLockCnt); + } + LONG GetLockCount() + { + return m_nLockCnt; + } + + HINSTANCE GetModuleInstance() {return m_hInst;} + HINSTANCE GetResourceInstance() {return m_hInstResource;} + HINSTANCE GetTypeLibInstance() {return m_hInstTypeLib;} + + // Registry support (helpers) + HRESULT RegisterTypeLib() + { + return AtlModuleRegisterTypeLib(this, NULL); + } + HRESULT RegisterTypeLib(LPCTSTR lpszIndex) + { + USES_CONVERSION; + return AtlModuleRegisterTypeLib(this, T2COLE(lpszIndex)); + } + HRESULT UnRegisterTypeLib() + { + return AtlModuleUnRegisterTypeLib(this, NULL); + } + HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex) + { + USES_CONVERSION; + return AtlModuleUnRegisterTypeLib(this, T2COLE(lpszIndex)); + } + HRESULT RegisterServer(BOOL bRegTypeLib = FALSE, const CLSID* pCLSID = NULL) + { + return AtlModuleRegisterServer(this, bRegTypeLib, pCLSID); + } + + HRESULT UnregisterServer(const CLSID* pCLSID = NULL) + { + return AtlModuleUnregisterServer(this, pCLSID); + } + HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = NULL) + { + return AtlModuleUnregisterServerEx(this, bUnRegTypeLib, pCLSID); + } + + // Resource-based Registration + HRESULT WINAPI UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister, + struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) + { + USES_CONVERSION; + return AtlModuleUpdateRegistryFromResourceD(this, T2COLE(lpszRes), bRegister, + pMapEntries); + } + HRESULT WINAPI UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister, + struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) + { + return AtlModuleUpdateRegistryFromResourceD(this, + (LPCOLESTR)MAKEINTRESOURCE(nResID), bRegister, pMapEntries); + } + +#ifdef _ATL_STATIC_REGISTRY + // Statically linking to Registry Ponent + HRESULT WINAPI UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister, + struct _ATL_REGMAP_ENTRY* pMapEntries = NULL); + HRESULT WINAPI UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister, + struct _ATL_REGMAP_ENTRY* pMapEntries = NULL); +#endif + + // Standard Registration + HRESULT WINAPI UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, + LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister); + HRESULT WINAPI RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, + LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags); + HRESULT WINAPI UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, + LPCTSTR lpszVerIndProgID); + + // Register/Revoke All Class Factories with the OS (EXE only) + HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) + { + return AtlModuleRegisterClassObjects(this, dwClsContext, dwFlags); + } + HRESULT RevokeClassObjects() + { + return AtlModuleRevokeClassObjects(this); + } + + // Obtain a Class Factory (DLL only) + HRESULT GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) + { + return AtlModuleGetClassObject(this, rclsid, riid, ppv); + } + + // Only used in CComAutoThreadModule + HRESULT CreateInstance(void* /*pfnCreateInstance*/, REFIID /*riid*/, void** /*ppvObj*/) + { + ATLASSERT(FALSE); + return E_NOTIMPL; + } + static HRESULT RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc); + + static void ReplaceSingleQuote(LPOLESTR lpDest, LPCOLESTR lp) + { + while (*lp) + { + *lpDest++ = *lp; + if (*lp == OLESTR('\'')) + *lpDest++ = *lp; + lp++; + } + *lpDest = NULL; + } +}; + +#ifdef _ATL_DEBUG_INTERFACES +inline ULONG _QIThunk::Release() +{ + if (bBreak) + DebugBreak(); + ATLASSERT(m_dwRef > 0); + ULONG l = InterlockedDecrement(&m_dwRef); + ATLTRACE(_T("%d< "), m_dwRef); + AtlDumpIID(iid, lpszClassName, S_OK); + pUnk->Release(); + if (l == 0 && !bNonAddRefThunk) + _pModule->DeleteThunk(this); + return l; +} +inline static void atlBadThunkCall() +{ + ATLASSERT(FALSE && "Call through deleted thunk"); +} +#define IMPL_THUNK(n)\ +__declspec(naked) inline HRESULT _QIThunk::f##n()\ +{\ + __asm mov eax, [esp+4]\ + __asm cmp dword ptr [eax+8], 0\ + __asm jg goodref\ + __asm call atlBadThunkCall\ + __asm goodref:\ + __asm mov eax, [esp+4]\ + __asm mov eax, dword ptr [eax+4]\ + __asm mov [esp+4], eax\ + __asm mov eax, dword ptr [eax]\ + __asm mov eax, dword ptr [eax+4*n]\ + __asm jmp eax\ +} + +IMPL_THUNK(3) +IMPL_THUNK(4) +IMPL_THUNK(5) +IMPL_THUNK(6) +IMPL_THUNK(7) +IMPL_THUNK(8) +IMPL_THUNK(9) +IMPL_THUNK(10) +IMPL_THUNK(11) +IMPL_THUNK(12) +IMPL_THUNK(13) +IMPL_THUNK(14) +IMPL_THUNK(15) +IMPL_THUNK(16) +IMPL_THUNK(17) +IMPL_THUNK(18) +IMPL_THUNK(19) +IMPL_THUNK(20) +IMPL_THUNK(21) +IMPL_THUNK(22) +IMPL_THUNK(23) +IMPL_THUNK(24) +IMPL_THUNK(25) +IMPL_THUNK(26) +IMPL_THUNK(27) +IMPL_THUNK(28) +IMPL_THUNK(29) +IMPL_THUNK(30) +IMPL_THUNK(31) +IMPL_THUNK(32) +IMPL_THUNK(33) +IMPL_THUNK(34) +IMPL_THUNK(35) +IMPL_THUNK(36) +IMPL_THUNK(37) +IMPL_THUNK(38) +IMPL_THUNK(39) +IMPL_THUNK(40) +IMPL_THUNK(41) +IMPL_THUNK(42) +IMPL_THUNK(43) +IMPL_THUNK(44) +IMPL_THUNK(45) +IMPL_THUNK(46) +IMPL_THUNK(47) +IMPL_THUNK(48) +IMPL_THUNK(49) +IMPL_THUNK(50) +IMPL_THUNK(51) +IMPL_THUNK(52) +IMPL_THUNK(53) +IMPL_THUNK(54) +IMPL_THUNK(55) +IMPL_THUNK(56) +IMPL_THUNK(57) +IMPL_THUNK(58) +IMPL_THUNK(59) +IMPL_THUNK(60) +IMPL_THUNK(61) +IMPL_THUNK(62) +IMPL_THUNK(63) +IMPL_THUNK(64) +IMPL_THUNK(65) +IMPL_THUNK(66) +IMPL_THUNK(67) +IMPL_THUNK(68) +IMPL_THUNK(69) +IMPL_THUNK(70) +IMPL_THUNK(71) +IMPL_THUNK(72) +IMPL_THUNK(73) +IMPL_THUNK(74) +IMPL_THUNK(75) +IMPL_THUNK(76) +IMPL_THUNK(77) +IMPL_THUNK(78) +IMPL_THUNK(79) +IMPL_THUNK(80) +IMPL_THUNK(81) +IMPL_THUNK(82) +IMPL_THUNK(83) +IMPL_THUNK(84) +IMPL_THUNK(85) +IMPL_THUNK(86) +IMPL_THUNK(87) +IMPL_THUNK(88) +IMPL_THUNK(89) +IMPL_THUNK(90) +IMPL_THUNK(91) +IMPL_THUNK(92) +IMPL_THUNK(93) +IMPL_THUNK(94) +IMPL_THUNK(95) +IMPL_THUNK(96) +IMPL_THUNK(97) +IMPL_THUNK(98) +IMPL_THUNK(99) +IMPL_THUNK(100) +IMPL_THUNK(101) +IMPL_THUNK(102) +IMPL_THUNK(103) +IMPL_THUNK(104) +IMPL_THUNK(105) +IMPL_THUNK(106) +IMPL_THUNK(107) +IMPL_THUNK(108) +IMPL_THUNK(109) +IMPL_THUNK(110) +IMPL_THUNK(111) +IMPL_THUNK(112) +IMPL_THUNK(113) +IMPL_THUNK(114) +IMPL_THUNK(115) +IMPL_THUNK(116) +IMPL_THUNK(117) +IMPL_THUNK(118) +IMPL_THUNK(119) +IMPL_THUNK(120) +IMPL_THUNK(121) +IMPL_THUNK(122) +IMPL_THUNK(123) +IMPL_THUNK(124) +IMPL_THUNK(125) +IMPL_THUNK(126) +IMPL_THUNK(127) +IMPL_THUNK(128) +IMPL_THUNK(129) +IMPL_THUNK(130) +IMPL_THUNK(131) +IMPL_THUNK(132) +IMPL_THUNK(133) +IMPL_THUNK(134) +IMPL_THUNK(135) +IMPL_THUNK(136) +IMPL_THUNK(137) +IMPL_THUNK(138) +IMPL_THUNK(139) +IMPL_THUNK(140) +IMPL_THUNK(141) +IMPL_THUNK(142) +IMPL_THUNK(143) +IMPL_THUNK(144) +IMPL_THUNK(145) +IMPL_THUNK(146) +IMPL_THUNK(147) +IMPL_THUNK(148) +IMPL_THUNK(149) +IMPL_THUNK(150) +IMPL_THUNK(151) +IMPL_THUNK(152) +IMPL_THUNK(153) +IMPL_THUNK(154) +IMPL_THUNK(155) +IMPL_THUNK(156) +IMPL_THUNK(157) +IMPL_THUNK(158) +IMPL_THUNK(159) +IMPL_THUNK(160) +IMPL_THUNK(161) +IMPL_THUNK(162) +IMPL_THUNK(163) +IMPL_THUNK(164) +IMPL_THUNK(165) +IMPL_THUNK(166) +IMPL_THUNK(167) +IMPL_THUNK(168) +IMPL_THUNK(169) +IMPL_THUNK(170) +IMPL_THUNK(171) +IMPL_THUNK(172) +IMPL_THUNK(173) +IMPL_THUNK(174) +IMPL_THUNK(175) +IMPL_THUNK(176) +IMPL_THUNK(177) +IMPL_THUNK(178) +IMPL_THUNK(179) +IMPL_THUNK(180) +IMPL_THUNK(181) +IMPL_THUNK(182) +IMPL_THUNK(183) +IMPL_THUNK(184) +IMPL_THUNK(185) +IMPL_THUNK(186) +IMPL_THUNK(187) +IMPL_THUNK(188) +IMPL_THUNK(189) +IMPL_THUNK(190) +IMPL_THUNK(191) +IMPL_THUNK(192) +IMPL_THUNK(193) +IMPL_THUNK(194) +IMPL_THUNK(195) +IMPL_THUNK(196) +IMPL_THUNK(197) +IMPL_THUNK(198) +IMPL_THUNK(199) +IMPL_THUNK(200) +IMPL_THUNK(201) +IMPL_THUNK(202) +IMPL_THUNK(203) +IMPL_THUNK(204) +IMPL_THUNK(205) +IMPL_THUNK(206) +IMPL_THUNK(207) +IMPL_THUNK(208) +IMPL_THUNK(209) +IMPL_THUNK(210) +IMPL_THUNK(211) +IMPL_THUNK(212) +IMPL_THUNK(213) +IMPL_THUNK(214) +IMPL_THUNK(215) +IMPL_THUNK(216) +IMPL_THUNK(217) +IMPL_THUNK(218) +IMPL_THUNK(219) +IMPL_THUNK(220) +IMPL_THUNK(221) +IMPL_THUNK(222) +IMPL_THUNK(223) +IMPL_THUNK(224) +IMPL_THUNK(225) +IMPL_THUNK(226) +IMPL_THUNK(227) +IMPL_THUNK(228) +IMPL_THUNK(229) +IMPL_THUNK(230) +IMPL_THUNK(231) +IMPL_THUNK(232) +IMPL_THUNK(233) +IMPL_THUNK(234) +IMPL_THUNK(235) +IMPL_THUNK(236) +IMPL_THUNK(237) +IMPL_THUNK(238) +IMPL_THUNK(239) +IMPL_THUNK(240) +IMPL_THUNK(241) +IMPL_THUNK(242) +IMPL_THUNK(243) +IMPL_THUNK(244) +IMPL_THUNK(245) +IMPL_THUNK(246) +IMPL_THUNK(247) +IMPL_THUNK(248) +IMPL_THUNK(249) +IMPL_THUNK(250) +IMPL_THUNK(251) +IMPL_THUNK(252) +IMPL_THUNK(253) +IMPL_THUNK(254) +IMPL_THUNK(255) +IMPL_THUNK(256) +IMPL_THUNK(257) +IMPL_THUNK(258) +IMPL_THUNK(259) +IMPL_THUNK(260) +IMPL_THUNK(261) +IMPL_THUNK(262) +IMPL_THUNK(263) +IMPL_THUNK(264) +IMPL_THUNK(265) +IMPL_THUNK(266) +IMPL_THUNK(267) +IMPL_THUNK(268) +IMPL_THUNK(269) +IMPL_THUNK(270) +IMPL_THUNK(271) +IMPL_THUNK(272) +IMPL_THUNK(273) +IMPL_THUNK(274) +IMPL_THUNK(275) +IMPL_THUNK(276) +IMPL_THUNK(277) +IMPL_THUNK(278) +IMPL_THUNK(279) +IMPL_THUNK(280) +IMPL_THUNK(281) +IMPL_THUNK(282) +IMPL_THUNK(283) +IMPL_THUNK(284) +IMPL_THUNK(285) +IMPL_THUNK(286) +IMPL_THUNK(287) +IMPL_THUNK(288) +IMPL_THUNK(289) +IMPL_THUNK(290) +IMPL_THUNK(291) +IMPL_THUNK(292) +IMPL_THUNK(293) +IMPL_THUNK(294) +IMPL_THUNK(295) +IMPL_THUNK(296) +IMPL_THUNK(297) +IMPL_THUNK(298) +IMPL_THUNK(299) +IMPL_THUNK(300) +IMPL_THUNK(301) +IMPL_THUNK(302) +IMPL_THUNK(303) +IMPL_THUNK(304) +IMPL_THUNK(305) +IMPL_THUNK(306) +IMPL_THUNK(307) +IMPL_THUNK(308) +IMPL_THUNK(309) +IMPL_THUNK(310) +IMPL_THUNK(311) +IMPL_THUNK(312) +IMPL_THUNK(313) +IMPL_THUNK(314) +IMPL_THUNK(315) +IMPL_THUNK(316) +IMPL_THUNK(317) +IMPL_THUNK(318) +IMPL_THUNK(319) +IMPL_THUNK(320) +IMPL_THUNK(321) +IMPL_THUNK(322) +IMPL_THUNK(323) +IMPL_THUNK(324) +IMPL_THUNK(325) +IMPL_THUNK(326) +IMPL_THUNK(327) +IMPL_THUNK(328) +IMPL_THUNK(329) +IMPL_THUNK(330) +IMPL_THUNK(331) +IMPL_THUNK(332) +IMPL_THUNK(333) +IMPL_THUNK(334) +IMPL_THUNK(335) +IMPL_THUNK(336) +IMPL_THUNK(337) +IMPL_THUNK(338) +IMPL_THUNK(339) +IMPL_THUNK(340) +IMPL_THUNK(341) +IMPL_THUNK(342) +IMPL_THUNK(343) +IMPL_THUNK(344) +IMPL_THUNK(345) +IMPL_THUNK(346) +IMPL_THUNK(347) +IMPL_THUNK(348) +IMPL_THUNK(349) +IMPL_THUNK(350) +IMPL_THUNK(351) +IMPL_THUNK(352) +IMPL_THUNK(353) +IMPL_THUNK(354) +IMPL_THUNK(355) +IMPL_THUNK(356) +IMPL_THUNK(357) +IMPL_THUNK(358) +IMPL_THUNK(359) +IMPL_THUNK(360) +IMPL_THUNK(361) +IMPL_THUNK(362) +IMPL_THUNK(363) +IMPL_THUNK(364) +IMPL_THUNK(365) +IMPL_THUNK(366) +IMPL_THUNK(367) +IMPL_THUNK(368) +IMPL_THUNK(369) +IMPL_THUNK(370) +IMPL_THUNK(371) +IMPL_THUNK(372) +IMPL_THUNK(373) +IMPL_THUNK(374) +IMPL_THUNK(375) +IMPL_THUNK(376) +IMPL_THUNK(377) +IMPL_THUNK(378) +IMPL_THUNK(379) +IMPL_THUNK(380) +IMPL_THUNK(381) +IMPL_THUNK(382) +IMPL_THUNK(383) +IMPL_THUNK(384) +IMPL_THUNK(385) +IMPL_THUNK(386) +IMPL_THUNK(387) +IMPL_THUNK(388) +IMPL_THUNK(389) +IMPL_THUNK(390) +IMPL_THUNK(391) +IMPL_THUNK(392) +IMPL_THUNK(393) +IMPL_THUNK(394) +IMPL_THUNK(395) +IMPL_THUNK(396) +IMPL_THUNK(397) +IMPL_THUNK(398) +IMPL_THUNK(399) +IMPL_THUNK(400) +IMPL_THUNK(401) +IMPL_THUNK(402) +IMPL_THUNK(403) +IMPL_THUNK(404) +IMPL_THUNK(405) +IMPL_THUNK(406) +IMPL_THUNK(407) +IMPL_THUNK(408) +IMPL_THUNK(409) +IMPL_THUNK(410) +IMPL_THUNK(411) +IMPL_THUNK(412) +IMPL_THUNK(413) +IMPL_THUNK(414) +IMPL_THUNK(415) +IMPL_THUNK(416) +IMPL_THUNK(417) +IMPL_THUNK(418) +IMPL_THUNK(419) +IMPL_THUNK(420) +IMPL_THUNK(421) +IMPL_THUNK(422) +IMPL_THUNK(423) +IMPL_THUNK(424) +IMPL_THUNK(425) +IMPL_THUNK(426) +IMPL_THUNK(427) +IMPL_THUNK(428) +IMPL_THUNK(429) +IMPL_THUNK(430) +IMPL_THUNK(431) +IMPL_THUNK(432) +IMPL_THUNK(433) +IMPL_THUNK(434) +IMPL_THUNK(435) +IMPL_THUNK(436) +IMPL_THUNK(437) +IMPL_THUNK(438) +IMPL_THUNK(439) +IMPL_THUNK(440) +IMPL_THUNK(441) +IMPL_THUNK(442) +IMPL_THUNK(443) +IMPL_THUNK(444) +IMPL_THUNK(445) +IMPL_THUNK(446) +IMPL_THUNK(447) +IMPL_THUNK(448) +IMPL_THUNK(449) +IMPL_THUNK(450) +IMPL_THUNK(451) +IMPL_THUNK(452) +IMPL_THUNK(453) +IMPL_THUNK(454) +IMPL_THUNK(455) +IMPL_THUNK(456) +IMPL_THUNK(457) +IMPL_THUNK(458) +IMPL_THUNK(459) +IMPL_THUNK(460) +IMPL_THUNK(461) +IMPL_THUNK(462) +IMPL_THUNK(463) +IMPL_THUNK(464) +IMPL_THUNK(465) +IMPL_THUNK(466) +IMPL_THUNK(467) +IMPL_THUNK(468) +IMPL_THUNK(469) +IMPL_THUNK(470) +IMPL_THUNK(471) +IMPL_THUNK(472) +IMPL_THUNK(473) +IMPL_THUNK(474) +IMPL_THUNK(475) +IMPL_THUNK(476) +IMPL_THUNK(477) +IMPL_THUNK(478) +IMPL_THUNK(479) +IMPL_THUNK(480) +IMPL_THUNK(481) +IMPL_THUNK(482) +IMPL_THUNK(483) +IMPL_THUNK(484) +IMPL_THUNK(485) +IMPL_THUNK(486) +IMPL_THUNK(487) +IMPL_THUNK(488) +IMPL_THUNK(489) +IMPL_THUNK(490) +IMPL_THUNK(491) +IMPL_THUNK(492) +IMPL_THUNK(493) +IMPL_THUNK(494) +IMPL_THUNK(495) +IMPL_THUNK(496) +IMPL_THUNK(497) +IMPL_THUNK(498) +IMPL_THUNK(499) +IMPL_THUNK(500) +IMPL_THUNK(501) +IMPL_THUNK(502) +IMPL_THUNK(503) +IMPL_THUNK(504) +IMPL_THUNK(505) +IMPL_THUNK(506) +IMPL_THUNK(507) +IMPL_THUNK(508) +IMPL_THUNK(509) +IMPL_THUNK(510) +IMPL_THUNK(511) +IMPL_THUNK(512) +IMPL_THUNK(513) +IMPL_THUNK(514) +IMPL_THUNK(515) +IMPL_THUNK(516) +IMPL_THUNK(517) +IMPL_THUNK(518) +IMPL_THUNK(519) +IMPL_THUNK(520) +IMPL_THUNK(521) +IMPL_THUNK(522) +IMPL_THUNK(523) +IMPL_THUNK(524) +IMPL_THUNK(525) +IMPL_THUNK(526) +IMPL_THUNK(527) +IMPL_THUNK(528) +IMPL_THUNK(529) +IMPL_THUNK(530) +IMPL_THUNK(531) +IMPL_THUNK(532) +IMPL_THUNK(533) +IMPL_THUNK(534) +IMPL_THUNK(535) +IMPL_THUNK(536) +IMPL_THUNK(537) +IMPL_THUNK(538) +IMPL_THUNK(539) +IMPL_THUNK(540) +IMPL_THUNK(541) +IMPL_THUNK(542) +IMPL_THUNK(543) +IMPL_THUNK(544) +IMPL_THUNK(545) +IMPL_THUNK(546) +IMPL_THUNK(547) +IMPL_THUNK(548) +IMPL_THUNK(549) +IMPL_THUNK(550) +IMPL_THUNK(551) +IMPL_THUNK(552) +IMPL_THUNK(553) +IMPL_THUNK(554) +IMPL_THUNK(555) +IMPL_THUNK(556) +IMPL_THUNK(557) +IMPL_THUNK(558) +IMPL_THUNK(559) +IMPL_THUNK(560) +IMPL_THUNK(561) +IMPL_THUNK(562) +IMPL_THUNK(563) +IMPL_THUNK(564) +IMPL_THUNK(565) +IMPL_THUNK(566) +IMPL_THUNK(567) +IMPL_THUNK(568) +IMPL_THUNK(569) +IMPL_THUNK(570) +IMPL_THUNK(571) +IMPL_THUNK(572) +IMPL_THUNK(573) +IMPL_THUNK(574) +IMPL_THUNK(575) +IMPL_THUNK(576) +IMPL_THUNK(577) +IMPL_THUNK(578) +IMPL_THUNK(579) +IMPL_THUNK(580) +IMPL_THUNK(581) +IMPL_THUNK(582) +IMPL_THUNK(583) +IMPL_THUNK(584) +IMPL_THUNK(585) +IMPL_THUNK(586) +IMPL_THUNK(587) +IMPL_THUNK(588) +IMPL_THUNK(589) +IMPL_THUNK(590) +IMPL_THUNK(591) +IMPL_THUNK(592) +IMPL_THUNK(593) +IMPL_THUNK(594) +IMPL_THUNK(595) +IMPL_THUNK(596) +IMPL_THUNK(597) +IMPL_THUNK(598) +IMPL_THUNK(599) +IMPL_THUNK(600) +IMPL_THUNK(601) +IMPL_THUNK(602) +IMPL_THUNK(603) +IMPL_THUNK(604) +IMPL_THUNK(605) +IMPL_THUNK(606) +IMPL_THUNK(607) +IMPL_THUNK(608) +IMPL_THUNK(609) +IMPL_THUNK(610) +IMPL_THUNK(611) +IMPL_THUNK(612) +IMPL_THUNK(613) +IMPL_THUNK(614) +IMPL_THUNK(615) +IMPL_THUNK(616) +IMPL_THUNK(617) +IMPL_THUNK(618) +IMPL_THUNK(619) +IMPL_THUNK(620) +IMPL_THUNK(621) +IMPL_THUNK(622) +IMPL_THUNK(623) +IMPL_THUNK(624) +IMPL_THUNK(625) +IMPL_THUNK(626) +IMPL_THUNK(627) +IMPL_THUNK(628) +IMPL_THUNK(629) +IMPL_THUNK(630) +IMPL_THUNK(631) +IMPL_THUNK(632) +IMPL_THUNK(633) +IMPL_THUNK(634) +IMPL_THUNK(635) +IMPL_THUNK(636) +IMPL_THUNK(637) +IMPL_THUNK(638) +IMPL_THUNK(639) +IMPL_THUNK(640) +IMPL_THUNK(641) +IMPL_THUNK(642) +IMPL_THUNK(643) +IMPL_THUNK(644) +IMPL_THUNK(645) +IMPL_THUNK(646) +IMPL_THUNK(647) +IMPL_THUNK(648) +IMPL_THUNK(649) +IMPL_THUNK(650) +IMPL_THUNK(651) +IMPL_THUNK(652) +IMPL_THUNK(653) +IMPL_THUNK(654) +IMPL_THUNK(655) +IMPL_THUNK(656) +IMPL_THUNK(657) +IMPL_THUNK(658) +IMPL_THUNK(659) +IMPL_THUNK(660) +IMPL_THUNK(661) +IMPL_THUNK(662) +IMPL_THUNK(663) +IMPL_THUNK(664) +IMPL_THUNK(665) +IMPL_THUNK(666) +IMPL_THUNK(667) +IMPL_THUNK(668) +IMPL_THUNK(669) +IMPL_THUNK(670) +IMPL_THUNK(671) +IMPL_THUNK(672) +IMPL_THUNK(673) +IMPL_THUNK(674) +IMPL_THUNK(675) +IMPL_THUNK(676) +IMPL_THUNK(677) +IMPL_THUNK(678) +IMPL_THUNK(679) +IMPL_THUNK(680) +IMPL_THUNK(681) +IMPL_THUNK(682) +IMPL_THUNK(683) +IMPL_THUNK(684) +IMPL_THUNK(685) +IMPL_THUNK(686) +IMPL_THUNK(687) +IMPL_THUNK(688) +IMPL_THUNK(689) +IMPL_THUNK(690) +IMPL_THUNK(691) +IMPL_THUNK(692) +IMPL_THUNK(693) +IMPL_THUNK(694) +IMPL_THUNK(695) +IMPL_THUNK(696) +IMPL_THUNK(697) +IMPL_THUNK(698) +IMPL_THUNK(699) +IMPL_THUNK(700) +IMPL_THUNK(701) +IMPL_THUNK(702) +IMPL_THUNK(703) +IMPL_THUNK(704) +IMPL_THUNK(705) +IMPL_THUNK(706) +IMPL_THUNK(707) +IMPL_THUNK(708) +IMPL_THUNK(709) +IMPL_THUNK(710) +IMPL_THUNK(711) +IMPL_THUNK(712) +IMPL_THUNK(713) +IMPL_THUNK(714) +IMPL_THUNK(715) +IMPL_THUNK(716) +IMPL_THUNK(717) +IMPL_THUNK(718) +IMPL_THUNK(719) +IMPL_THUNK(720) +IMPL_THUNK(721) +IMPL_THUNK(722) +IMPL_THUNK(723) +IMPL_THUNK(724) +IMPL_THUNK(725) +IMPL_THUNK(726) +IMPL_THUNK(727) +IMPL_THUNK(728) +IMPL_THUNK(729) +IMPL_THUNK(730) +IMPL_THUNK(731) +IMPL_THUNK(732) +IMPL_THUNK(733) +IMPL_THUNK(734) +IMPL_THUNK(735) +IMPL_THUNK(736) +IMPL_THUNK(737) +IMPL_THUNK(738) +IMPL_THUNK(739) +IMPL_THUNK(740) +IMPL_THUNK(741) +IMPL_THUNK(742) +IMPL_THUNK(743) +IMPL_THUNK(744) +IMPL_THUNK(745) +IMPL_THUNK(746) +IMPL_THUNK(747) +IMPL_THUNK(748) +IMPL_THUNK(749) +IMPL_THUNK(750) +IMPL_THUNK(751) +IMPL_THUNK(752) +IMPL_THUNK(753) +IMPL_THUNK(754) +IMPL_THUNK(755) +IMPL_THUNK(756) +IMPL_THUNK(757) +IMPL_THUNK(758) +IMPL_THUNK(759) +IMPL_THUNK(760) +IMPL_THUNK(761) +IMPL_THUNK(762) +IMPL_THUNK(763) +IMPL_THUNK(764) +IMPL_THUNK(765) +IMPL_THUNK(766) +IMPL_THUNK(767) +IMPL_THUNK(768) +IMPL_THUNK(769) +IMPL_THUNK(770) +IMPL_THUNK(771) +IMPL_THUNK(772) +IMPL_THUNK(773) +IMPL_THUNK(774) +IMPL_THUNK(775) +IMPL_THUNK(776) +IMPL_THUNK(777) +IMPL_THUNK(778) +IMPL_THUNK(779) +IMPL_THUNK(780) +IMPL_THUNK(781) +IMPL_THUNK(782) +IMPL_THUNK(783) +IMPL_THUNK(784) +IMPL_THUNK(785) +IMPL_THUNK(786) +IMPL_THUNK(787) +IMPL_THUNK(788) +IMPL_THUNK(789) +IMPL_THUNK(790) +IMPL_THUNK(791) +IMPL_THUNK(792) +IMPL_THUNK(793) +IMPL_THUNK(794) +IMPL_THUNK(795) +IMPL_THUNK(796) +IMPL_THUNK(797) +IMPL_THUNK(798) +IMPL_THUNK(799) +IMPL_THUNK(800) +IMPL_THUNK(801) +IMPL_THUNK(802) +IMPL_THUNK(803) +IMPL_THUNK(804) +IMPL_THUNK(805) +IMPL_THUNK(806) +IMPL_THUNK(807) +IMPL_THUNK(808) +IMPL_THUNK(809) +IMPL_THUNK(810) +IMPL_THUNK(811) +IMPL_THUNK(812) +IMPL_THUNK(813) +IMPL_THUNK(814) +IMPL_THUNK(815) +IMPL_THUNK(816) +IMPL_THUNK(817) +IMPL_THUNK(818) +IMPL_THUNK(819) +IMPL_THUNK(820) +IMPL_THUNK(821) +IMPL_THUNK(822) +IMPL_THUNK(823) +IMPL_THUNK(824) +IMPL_THUNK(825) +IMPL_THUNK(826) +IMPL_THUNK(827) +IMPL_THUNK(828) +IMPL_THUNK(829) +IMPL_THUNK(830) +IMPL_THUNK(831) +IMPL_THUNK(832) +IMPL_THUNK(833) +IMPL_THUNK(834) +IMPL_THUNK(835) +IMPL_THUNK(836) +IMPL_THUNK(837) +IMPL_THUNK(838) +IMPL_THUNK(839) +IMPL_THUNK(840) +IMPL_THUNK(841) +IMPL_THUNK(842) +IMPL_THUNK(843) +IMPL_THUNK(844) +IMPL_THUNK(845) +IMPL_THUNK(846) +IMPL_THUNK(847) +IMPL_THUNK(848) +IMPL_THUNK(849) +IMPL_THUNK(850) +IMPL_THUNK(851) +IMPL_THUNK(852) +IMPL_THUNK(853) +IMPL_THUNK(854) +IMPL_THUNK(855) +IMPL_THUNK(856) +IMPL_THUNK(857) +IMPL_THUNK(858) +IMPL_THUNK(859) +IMPL_THUNK(860) +IMPL_THUNK(861) +IMPL_THUNK(862) +IMPL_THUNK(863) +IMPL_THUNK(864) +IMPL_THUNK(865) +IMPL_THUNK(866) +IMPL_THUNK(867) +IMPL_THUNK(868) +IMPL_THUNK(869) +IMPL_THUNK(870) +IMPL_THUNK(871) +IMPL_THUNK(872) +IMPL_THUNK(873) +IMPL_THUNK(874) +IMPL_THUNK(875) +IMPL_THUNK(876) +IMPL_THUNK(877) +IMPL_THUNK(878) +IMPL_THUNK(879) +IMPL_THUNK(880) +IMPL_THUNK(881) +IMPL_THUNK(882) +IMPL_THUNK(883) +IMPL_THUNK(884) +IMPL_THUNK(885) +IMPL_THUNK(886) +IMPL_THUNK(887) +IMPL_THUNK(888) +IMPL_THUNK(889) +IMPL_THUNK(890) +IMPL_THUNK(891) +IMPL_THUNK(892) +IMPL_THUNK(893) +IMPL_THUNK(894) +IMPL_THUNK(895) +IMPL_THUNK(896) +IMPL_THUNK(897) +IMPL_THUNK(898) +IMPL_THUNK(899) +IMPL_THUNK(900) +IMPL_THUNK(901) +IMPL_THUNK(902) +IMPL_THUNK(903) +IMPL_THUNK(904) +IMPL_THUNK(905) +IMPL_THUNK(906) +IMPL_THUNK(907) +IMPL_THUNK(908) +IMPL_THUNK(909) +IMPL_THUNK(910) +IMPL_THUNK(911) +IMPL_THUNK(912) +IMPL_THUNK(913) +IMPL_THUNK(914) +IMPL_THUNK(915) +IMPL_THUNK(916) +IMPL_THUNK(917) +IMPL_THUNK(918) +IMPL_THUNK(919) +IMPL_THUNK(920) +IMPL_THUNK(921) +IMPL_THUNK(922) +IMPL_THUNK(923) +IMPL_THUNK(924) +IMPL_THUNK(925) +IMPL_THUNK(926) +IMPL_THUNK(927) +IMPL_THUNK(928) +IMPL_THUNK(929) +IMPL_THUNK(930) +IMPL_THUNK(931) +IMPL_THUNK(932) +IMPL_THUNK(933) +IMPL_THUNK(934) +IMPL_THUNK(935) +IMPL_THUNK(936) +IMPL_THUNK(937) +IMPL_THUNK(938) +IMPL_THUNK(939) +IMPL_THUNK(940) +IMPL_THUNK(941) +IMPL_THUNK(942) +IMPL_THUNK(943) +IMPL_THUNK(944) +IMPL_THUNK(945) +IMPL_THUNK(946) +IMPL_THUNK(947) +IMPL_THUNK(948) +IMPL_THUNK(949) +IMPL_THUNK(950) +IMPL_THUNK(951) +IMPL_THUNK(952) +IMPL_THUNK(953) +IMPL_THUNK(954) +IMPL_THUNK(955) +IMPL_THUNK(956) +IMPL_THUNK(957) +IMPL_THUNK(958) +IMPL_THUNK(959) +IMPL_THUNK(960) +IMPL_THUNK(961) +IMPL_THUNK(962) +IMPL_THUNK(963) +IMPL_THUNK(964) +IMPL_THUNK(965) +IMPL_THUNK(966) +IMPL_THUNK(967) +IMPL_THUNK(968) +IMPL_THUNK(969) +IMPL_THUNK(970) +IMPL_THUNK(971) +IMPL_THUNK(972) +IMPL_THUNK(973) +IMPL_THUNK(974) +IMPL_THUNK(975) +IMPL_THUNK(976) +IMPL_THUNK(977) +IMPL_THUNK(978) +IMPL_THUNK(979) +IMPL_THUNK(980) +IMPL_THUNK(981) +IMPL_THUNK(982) +IMPL_THUNK(983) +IMPL_THUNK(984) +IMPL_THUNK(985) +IMPL_THUNK(986) +IMPL_THUNK(987) +IMPL_THUNK(988) +IMPL_THUNK(989) +IMPL_THUNK(990) +IMPL_THUNK(991) +IMPL_THUNK(992) +IMPL_THUNK(993) +IMPL_THUNK(994) +IMPL_THUNK(995) +IMPL_THUNK(996) +IMPL_THUNK(997) +IMPL_THUNK(998) +IMPL_THUNK(999) +IMPL_THUNK(1000) +IMPL_THUNK(1001) +IMPL_THUNK(1002) +IMPL_THUNK(1003) +IMPL_THUNK(1004) +IMPL_THUNK(1005) +IMPL_THUNK(1006) +IMPL_THUNK(1007) +IMPL_THUNK(1008) +IMPL_THUNK(1009) +IMPL_THUNK(1010) +IMPL_THUNK(1011) +IMPL_THUNK(1012) +IMPL_THUNK(1013) +IMPL_THUNK(1014) +IMPL_THUNK(1015) +IMPL_THUNK(1016) +IMPL_THUNK(1017) +IMPL_THUNK(1018) +IMPL_THUNK(1019) +IMPL_THUNK(1020) +IMPL_THUNK(1021) +IMPL_THUNK(1022) +IMPL_THUNK(1023) +IMPL_THUNK(1024) + +#endif + +__declspec(selectany) GUID CComModule::m_libid = {0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}; + +#ifdef _ATL_STATIC_REGISTRY +#define UpdateRegistryFromResource UpdateRegistryFromResourceS +#else +#define UpdateRegistryFromResource UpdateRegistryFromResourceD +#endif + +///////////////////////////////////////////////////////////////////////////////////////////// +// Thread Pooling classes + +class _AtlAptCreateObjData +{ +public: + _ATL_CREATORFUNC* pfnCreateInstance; + const IID* piid; + HANDLE hEvent; + LPSTREAM pStream; + HRESULT hRes; +}; + +class CComApartment +{ +public: + CComApartment() + { + m_nLockCnt = 0; + } + static UINT ATL_CREATE_OBJECT; + static DWORD WINAPI _Apartment(void* pv) + { + return ((CComApartment*)pv)->Apartment(); + } + DWORD Apartment() + { + CoInitialize(NULL); + MSG msg; + while(GetMessage(&msg, 0, 0, 0)) + { + if (msg.message == ATL_CREATE_OBJECT) + { + _AtlAptCreateObjData* pdata = (_AtlAptCreateObjData*)msg.lParam; + IUnknown* pUnk = NULL; + pdata->hRes = pdata->pfnCreateInstance(NULL, IID_IUnknown, (void**)&pUnk); + if (SUCCEEDED(pdata->hRes)) + pdata->hRes = CoMarshalInterThreadInterfaceInStream(*pdata->piid, pUnk, &pdata->pStream); + if (SUCCEEDED(pdata->hRes)) + { + pUnk->Release(); + ATLTRACE2(atlTraceCOM, 2, _T("Object created on thread = %d\n"), GetCurrentThreadId()); + } + SetEvent(pdata->hEvent); + } + DispatchMessage(&msg); + } + CoUninitialize(); + return 0; + } + LONG Lock() {return CComGlobalsThreadModel::Increment(&m_nLockCnt);} + LONG Unlock(){return CComGlobalsThreadModel::Decrement(&m_nLockCnt); + } + LONG GetLockCount() {return m_nLockCnt;} + + DWORD m_dwThreadID; + HANDLE m_hThread; + LONG m_nLockCnt; +}; + +__declspec(selectany) UINT CComApartment::ATL_CREATE_OBJECT = 0; + +class CComSimpleThreadAllocator +{ +public: + CComSimpleThreadAllocator() + { + m_nThread = 0; + } + int GetThread(CComApartment* /*pApt*/, int nThreads) + { + if (++m_nThread == nThreads) + m_nThread = 0; + return m_nThread; + } + int m_nThread; +}; + +template +class CComAutoThreadModule : public CComModule +{ +public: + HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = NULL, int nThreads = GetDefaultThreads()); + ~CComAutoThreadModule(); + HRESULT CreateInstance(void* pfnCreateInstance, REFIID riid, void** ppvObj); + LONG Lock(); + LONG Unlock(); + DWORD dwThreadID; + int m_nThreads; + CComApartment* m_pApartments; + ThreadAllocator m_Allocator; + static int GetDefaultThreads() + { + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwNumberOfProcessors * 4; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// CComBSTR + +class CComBSTR + { +public: + BSTR m_str; + CComBSTR() + { + m_str = NULL; + } + /*explicit*/ CComBSTR(int nSize) + { + m_str = ::SysAllocStringLen(NULL, nSize); + } + /*explicit*/ CComBSTR(int nSize, LPCOLESTR sz) + { + m_str = ::SysAllocStringLen(sz, nSize); + } + /*explicit*/ CComBSTR(LPCOLESTR pSrc) + { + m_str = ::SysAllocString(pSrc); + } + /*explicit*/ CComBSTR(const CComBSTR& src) + { + m_str = src.Copy(); + } + /*explicit*/ CComBSTR(REFGUID src) + { + LPOLESTR szGuid; + StringFromCLSID(src, &szGuid); + m_str = ::SysAllocString(szGuid); + CoTaskMemFree(szGuid); + } + CComBSTR& operator=(const CComBSTR& src) + { + if (m_str != src.m_str) + { + if (m_str) + ::SysFreeString(m_str); + m_str = src.Copy(); + } + return *this; + } + + CComBSTR& operator=(LPCOLESTR pSrc) + { + ::SysFreeString(m_str); + m_str = ::SysAllocString(pSrc); + return *this; + } + + ~CComBSTR() + { + ::SysFreeString(m_str); + } + unsigned int Length() const + { + return (m_str == NULL)? 0 : SysStringLen(m_str); + } + operator BSTR() const + { + return m_str; + } + BSTR* operator&() + { + return &m_str; + } + BSTR Copy() const + { + return ::SysAllocStringLen(m_str, ::SysStringLen(m_str)); + } + HRESULT CopyTo(BSTR* pbstr) + { + ATLASSERT(pbstr != NULL); + if (pbstr == NULL) + return E_POINTER; + *pbstr = ::SysAllocStringLen(m_str, ::SysStringLen(m_str)); + if (*pbstr == NULL) + return E_OUTOFMEMORY; + return S_OK; + } + void Attach(BSTR src) + { + ATLASSERT(m_str == NULL); + m_str = src; + } + BSTR Detach() + { + BSTR s = m_str; + m_str = NULL; + return s; + } + void Empty() + { + ::SysFreeString(m_str); + m_str = NULL; + } + bool operator!() const + { + return (m_str == NULL); + } + HRESULT Append(const CComBSTR& bstrSrc) + { + return Append(bstrSrc.m_str, SysStringLen(bstrSrc.m_str)); + } + HRESULT Append(LPCOLESTR lpsz) + { + return Append(lpsz, ocslen(lpsz)); + } + // a BSTR is just a LPCOLESTR so we need a special version to signify + // that we are appending a BSTR + HRESULT AppendBSTR(BSTR p) + { + return Append(p, SysStringLen(p)); + } + HRESULT Append(LPCOLESTR lpsz, int nLen) + { + int n1 = Length(); + BSTR b; + b = ::SysAllocStringLen(NULL, n1+nLen); + if (b == NULL) + return E_OUTOFMEMORY; + memcpy(b, m_str, n1*sizeof(OLECHAR)); + memcpy(b+n1, lpsz, nLen*sizeof(OLECHAR)); + b[n1+nLen] = NULL; + SysFreeString(m_str); + m_str = b; + return S_OK; + } + HRESULT ToLower() + { + USES_CONVERSION; + if (m_str != NULL) + { + LPTSTR psz = CharLower(OLE2T(m_str)); + if (psz == NULL) + return E_OUTOFMEMORY; + BSTR b = T2BSTR(psz); + if (psz == NULL) + return E_OUTOFMEMORY; + SysFreeString(m_str); + m_str = b; + } + return S_OK; + } + HRESULT ToUpper() + { + USES_CONVERSION; + if (m_str != NULL) + { + LPTSTR psz = CharUpper(OLE2T(m_str)); + if (psz == NULL) + return E_OUTOFMEMORY; + BSTR b = T2BSTR(psz); + if (psz == NULL) + return E_OUTOFMEMORY; + SysFreeString(m_str); + m_str = b; + } + return S_OK; + } + bool LoadString(HINSTANCE hInst, UINT nID) + { + USES_CONVERSION; + TCHAR sz[512]; + UINT nLen = ::LoadString(hInst, nID, sz, 512); + ATLASSERT(nLen < 511); + SysFreeString(m_str); + m_str = (nLen != 0) ? SysAllocString(T2OLE(sz)) : NULL; + return (nLen != 0); + } + bool LoadString(UINT nID) + { + return LoadString(_pModule->m_hInstResource, nID); + } + + CComBSTR& operator+=(const CComBSTR& bstrSrc) + { + AppendBSTR(bstrSrc.m_str); + return *this; + } + bool operator<(BSTR bstrSrc) const + { + if (bstrSrc == NULL && m_str == NULL) + return false; + if (bstrSrc != NULL && m_str != NULL) + return wcscmp(m_str, bstrSrc) < 0; + return m_str == NULL; + } + bool operator==(BSTR bstrSrc) const + { + if (bstrSrc == NULL && m_str == NULL) + return true; + if (bstrSrc != NULL && m_str != NULL) + return wcscmp(m_str, bstrSrc) == 0; + return false; + } + bool operator<(LPCSTR pszSrc) const + { + if (pszSrc == NULL && m_str == NULL) + return false; + USES_CONVERSION; + if (pszSrc != NULL && m_str != NULL) + return wcscmp(m_str, A2W(pszSrc)) < 0; + return m_str == NULL; + } + bool operator==(LPCSTR pszSrc) const + { + if (pszSrc == NULL && m_str == NULL) + return true; + USES_CONVERSION; + if (pszSrc != NULL && m_str != NULL) + return wcscmp(m_str, A2W(pszSrc)) == 0; + return false; + } +#ifndef OLE2ANSI + CComBSTR(LPCSTR pSrc) + { + m_str = A2WBSTR(pSrc); + } + + CComBSTR(int nSize, LPCSTR sz) + { + m_str = A2WBSTR(sz, nSize); + } + + void Append(LPCSTR lpsz) + { + USES_CONVERSION; + LPCOLESTR lpo = A2COLE(lpsz); + Append(lpo, ocslen(lpo)); + } + + CComBSTR& operator=(LPCSTR pSrc) + { + ::SysFreeString(m_str); + m_str = A2WBSTR(pSrc); + return *this; + } +#endif + HRESULT WriteToStream(IStream* pStream) + { + ATLASSERT(pStream != NULL); + ULONG cb; + ULONG cbStrLen = m_str ? SysStringByteLen(m_str)+sizeof(OLECHAR) : 0; + HRESULT hr = pStream->Write((void*) &cbStrLen, sizeof(cbStrLen), &cb); + if (FAILED(hr)) + return hr; + return cbStrLen ? pStream->Write((void*) m_str, cbStrLen, &cb) : S_OK; + } + HRESULT ReadFromStream(IStream* pStream) + { + ATLASSERT(pStream != NULL); + ATLASSERT(m_str == NULL); // should be empty + ULONG cbStrLen = 0; + HRESULT hr = pStream->Read((void*) &cbStrLen, sizeof(cbStrLen), NULL); + if ((hr == S_OK) && (cbStrLen != 0)) + { + //subtract size for terminating NULL which we wrote out + //since SysAllocStringByteLen overallocates for the NULL + m_str = SysAllocStringByteLen(NULL, cbStrLen-sizeof(OLECHAR)); + if (m_str == NULL) + hr = E_OUTOFMEMORY; + else + hr = pStream->Read((void*) m_str, cbStrLen, NULL); + } + if (hr == S_FALSE) + hr = E_FAIL; + return hr; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// CComVariant + +class CComVariant : public tagVARIANT +{ +// Constructors +public: + CComVariant() + { + vt = VT_EMPTY; + } + ~CComVariant() + { + Clear(); + } + + CComVariant(const VARIANT& varSrc) + { + vt = VT_EMPTY; + InternalCopy(&varSrc); + } + + CComVariant(const CComVariant& varSrc) + { + vt = VT_EMPTY; + InternalCopy(&varSrc); + } + + CComVariant(BSTR bstrSrc) + { + vt = VT_EMPTY; + *this = bstrSrc; + } + CComVariant(LPCOLESTR lpszSrc) + { + vt = VT_EMPTY; + *this = lpszSrc; + } + +#ifndef OLE2ANSI + CComVariant(LPCSTR lpszSrc) + { + vt = VT_EMPTY; + *this = lpszSrc; + } +#endif + + CComVariant(bool bSrc) + { + vt = VT_BOOL; +#pragma warning(disable: 4310) // cast truncates constant value + boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE; +#pragma warning(default: 4310) // cast truncates constant value + } + + CComVariant(int nSrc) + { + vt = VT_I4; + lVal = nSrc; + } + CComVariant(BYTE nSrc) + { + vt = VT_UI1; + bVal = nSrc; + } + CComVariant(short nSrc) + { + vt = VT_I2; + iVal = nSrc; + } + CComVariant(long nSrc, VARTYPE vtSrc = VT_I4) + { + ATLASSERT(vtSrc == VT_I4 || vtSrc == VT_ERROR); + vt = vtSrc; + lVal = nSrc; + } + CComVariant(float fltSrc) + { + vt = VT_R4; + fltVal = fltSrc; + } + CComVariant(double dblSrc) + { + vt = VT_R8; + dblVal = dblSrc; + } + CComVariant(CY cySrc) + { + vt = VT_CY; + cyVal.Hi = cySrc.Hi; + cyVal.Lo = cySrc.Lo; + } + CComVariant(IDispatch* pSrc) + { + vt = VT_DISPATCH; + pdispVal = pSrc; + // Need to AddRef as VariantClear will Release + if (pdispVal != NULL) + pdispVal->AddRef(); + } + CComVariant(IUnknown* pSrc) + { + vt = VT_UNKNOWN; + punkVal = pSrc; + // Need to AddRef as VariantClear will Release + if (punkVal != NULL) + punkVal->AddRef(); + } + +// Assignment Operators +public: + CComVariant& operator=(long* nSrc) + { + if (vt != VT_I4) + { + InternalClear(); + vt = VT_BYREF|VT_I4; + } + plVal = nSrc; + return *this; + } + CComVariant& operator=(VARIANT_BOOL* pbSrc) + { + if (vt != VT_BOOL) + { + InternalClear(); + vt = VT_BYREF|VT_BOOL; + } + pboolVal = pbSrc; + return *this; + } + CComVariant& operator=(const VARIANT* varSrc) + { + InternalCopy(varSrc); + return *this; + } + CComVariant& operator=(BSTR* bstrSrc) + { + InternalClear(); + vt = VT_BYREF|VT_BSTR; + pbstrVal = bstrSrc; + return *this; + } + + CComVariant& operator=(const CComVariant& varSrc) + { + InternalCopy(&varSrc); + return *this; + } + CComVariant& operator=(const VARIANT& varSrc) + { + InternalCopy(&varSrc); + return *this; + } + + CComVariant& operator=(BSTR bstrSrc) + { + InternalClear(); + vt = VT_BSTR; + bstrVal = ::SysAllocString(bstrSrc); + if (bstrVal == NULL && bstrSrc != NULL) + { + vt = VT_ERROR; + scode = E_OUTOFMEMORY; + } + return *this; + } + + CComVariant& operator=(LPCOLESTR lpszSrc) + { + InternalClear(); + vt = VT_BSTR; + bstrVal = ::SysAllocString(lpszSrc); + + if (bstrVal == NULL && lpszSrc != NULL) + { + vt = VT_ERROR; + scode = E_OUTOFMEMORY; + } + return *this; + } + + #ifndef OLE2ANSI + CComVariant& operator=(LPCSTR lpszSrc) + { + USES_CONVERSION; + InternalClear(); + vt = VT_BSTR; + bstrVal = ::SysAllocString(A2COLE(lpszSrc)); + + if (bstrVal == NULL && lpszSrc != NULL) + { + vt = VT_ERROR; + scode = E_OUTOFMEMORY; + } + return *this; + } + #endif + + CComVariant& operator=(bool bSrc) + { + if (vt != VT_BOOL) + { + InternalClear(); + vt = VT_BOOL; + } + #pragma warning(disable: 4310) // cast truncates constant value + boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE; + #pragma warning(default: 4310) // cast truncates constant value + return *this; + } + + CComVariant& operator=(int nSrc) + { + if (vt != VT_I4) + { + InternalClear(); + vt = VT_I4; + } + lVal = nSrc; + + return *this; + } + + CComVariant& operator=(BYTE nSrc) + { + if (vt != VT_UI1) + { + InternalClear(); + vt = VT_UI1; + } + bVal = nSrc; + return *this; + } + + CComVariant& operator=(short nSrc) + { + if (vt != VT_I2) + { + InternalClear(); + vt = VT_I2; + } + iVal = nSrc; + return *this; + } + + CComVariant& operator=(long nSrc) + { + if (vt != VT_I4) + { + InternalClear(); + vt = VT_I4; + } + lVal = nSrc; + return *this; + } + + CComVariant& operator=(unsigned long nSrc) + { + if (vt != VT_UI4) + { + InternalClear(); + vt = VT_UI4; + } + lVal = nSrc; + return *this; + } + + CComVariant& operator=(float fltSrc) + { + if (vt != VT_R4) + { + InternalClear(); + vt = VT_R4; + } + fltVal = fltSrc; + return *this; + } + + CComVariant& operator=(double dblSrc) + { + if (vt != VT_R8) + { + InternalClear(); + vt = VT_R8; + } + dblVal = dblSrc; + return *this; + } + + CComVariant& operator=(CY cySrc) + { + if (vt != VT_CY) + { + InternalClear(); + vt = VT_CY; + } + cyVal.Hi = cySrc.Hi; + cyVal.Lo = cySrc.Lo; + return *this; + } + + CComVariant& operator=(IDispatch* pSrc) + { + InternalClear(); + vt = VT_DISPATCH; + pdispVal = pSrc; + // Need to AddRef as VariantClear will Release + if (pdispVal != NULL) + pdispVal->AddRef(); + return *this; + } + + CComVariant& operator=(IUnknown* pSrc) + { + InternalClear(); + vt = VT_UNKNOWN; + punkVal = pSrc; + + // Need to AddRef as VariantClear will Release + if (punkVal != NULL) + punkVal->AddRef(); + return *this; + } + + +// Comparison Operators +public: + bool operator==(const VARIANT& varSrc) const + { + if (this == &varSrc) + return true; + + // Variants not equal if types don't match + if (vt != varSrc.vt) + return false; + + // Check type specific values + switch (vt) + { + case VT_EMPTY: + case VT_NULL: + return true; + + case VT_BOOL: + return boolVal == varSrc.boolVal; + + case VT_UI1: + return bVal == varSrc.bVal; + + case VT_I2: + return iVal == varSrc.iVal; + + case VT_I4: + return lVal == varSrc.lVal; + + case VT_R4: + return fltVal == varSrc.fltVal; + + case VT_R8: + return dblVal == varSrc.dblVal; + + case VT_BSTR: + return (::SysStringByteLen(bstrVal) == ::SysStringByteLen(varSrc.bstrVal)) && + (::memcmp(bstrVal, varSrc.bstrVal, ::SysStringByteLen(bstrVal)) == 0); + + case VT_ERROR: + return scode == varSrc.scode; + + case VT_DISPATCH: + return pdispVal == varSrc.pdispVal; + + case VT_UNKNOWN: + return punkVal == varSrc.punkVal; + + default: + ATLASSERT(false); + // fall through + } + + return false; + } + bool operator!=(const VARIANT& varSrc) const {return !operator==(varSrc);} + bool operator<(const VARIANT& varSrc) const {return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT, 0)==VARCMP_LT;} + bool operator>(const VARIANT& varSrc) const {return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT, 0)==VARCMP_GT;} + +// Operations +public: + HRESULT Clear() { return ::VariantClear(this); } + HRESULT Copy(const VARIANT* pSrc) { return ::VariantCopy(this, const_cast(pSrc)); } + HRESULT Attach(VARIANT* pSrc) + { + // Clear out the variant + HRESULT hr = Clear(); + if (!FAILED(hr)) + { + // Copy the contents and give control to CComVariant + memcpy(this, pSrc, sizeof(VARIANT)); + pSrc->vt = VT_EMPTY; + hr = S_OK; + } + return hr; + } + + HRESULT Detach(VARIANT* pDest) + { + // Clear out the variant + HRESULT hr = ::VariantClear(pDest); + if (!FAILED(hr)) + { + // Copy the contents and remove control from CComVariant + memcpy(pDest, this, sizeof(VARIANT)); + vt = VT_EMPTY; + hr = S_OK; + } + return hr; + } + + HRESULT ChangeType(VARTYPE vtNew, const VARIANT* pSrc = NULL) + { + VARIANT* pVar = const_cast(pSrc); + // Convert in place if pSrc is NULL + if (pVar == NULL) + pVar = this; + // Do nothing if doing in place convert and vts not different + return ::VariantChangeType(this, pVar, 0, vtNew); + } + + HRESULT WriteToStream(IStream* pStream); + HRESULT ReadFromStream(IStream* pStream); + +// Implementation +public: + HRESULT InternalClear() + { + HRESULT hr = Clear(); + ATLASSERT(SUCCEEDED(hr)); + if (FAILED(hr)) + { + vt = VT_ERROR; + scode = hr; + } + return hr; + } + + void InternalCopy(const VARIANT* pSrc) + { + HRESULT hr = Copy(pSrc); + if (FAILED(hr)) + { + vt = VT_ERROR; + scode = hr; + } + } +}; + +inline HRESULT CComVariant::WriteToStream(IStream* pStream) +{ + HRESULT hr = pStream->Write(&vt, sizeof(VARTYPE), NULL); + if (FAILED(hr)) + return hr; + + int cbWrite = 0; + switch (vt) + { + case VT_UNKNOWN: + case VT_DISPATCH: + { + CComPtr spStream; + if (punkVal != NULL) + { + hr = punkVal->QueryInterface(IID_IPersistStream, (void**)&spStream); + if (FAILED(hr)) + return hr; + } + if (spStream != NULL) + return OleSaveToStream(spStream, pStream); + else + return WriteClassStm(pStream, CLSID_NULL); + } + case VT_UI1: + case VT_I1: + cbWrite = sizeof(BYTE); + break; + case VT_I2: + case VT_UI2: + case VT_BOOL: + cbWrite = sizeof(short); + break; + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_INT: + case VT_UINT: + case VT_ERROR: + cbWrite = sizeof(long); + break; + case VT_R8: + case VT_CY: + case VT_DATE: + cbWrite = sizeof(double); + break; + default: + break; + } + if (cbWrite != 0) + return pStream->Write((void*) &bVal, cbWrite, NULL); + + CComBSTR bstrWrite; + CComVariant varBSTR; + if (vt != VT_BSTR) + { + hr = VariantChangeType(&varBSTR, this, VARIANT_NOVALUEPROP, VT_BSTR); + if (FAILED(hr)) + return hr; + bstrWrite = varBSTR.bstrVal; + } + else + bstrWrite = bstrVal; + + return bstrWrite.WriteToStream(pStream); +} + +inline HRESULT CComVariant::ReadFromStream(IStream* pStream) +{ + ATLASSERT(pStream != NULL); + HRESULT hr; + hr = VariantClear(this); + if (FAILED(hr)) + return hr; + VARTYPE vtRead; + hr = pStream->Read(&vtRead, sizeof(VARTYPE), NULL); + if (hr == S_FALSE) + hr = E_FAIL; + if (FAILED(hr)) + return hr; + + vt = vtRead; + int cbRead = 0; + switch (vtRead) + { + case VT_UNKNOWN: + case VT_DISPATCH: + { + punkVal = NULL; + hr = OleLoadFromStream(pStream, + (vtRead == VT_UNKNOWN) ? IID_IUnknown : IID_IDispatch, + (void**)&punkVal); + if (hr == REGDB_E_CLASSNOTREG) + hr = S_OK; + return S_OK; + } + case VT_UI1: + case VT_I1: + cbRead = sizeof(BYTE); + break; + case VT_I2: + case VT_UI2: + case VT_BOOL: + cbRead = sizeof(short); + break; + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_INT: + case VT_UINT: + case VT_ERROR: + cbRead = sizeof(long); + break; + case VT_R8: + case VT_CY: + case VT_DATE: + cbRead = sizeof(double); + break; + default: + break; + } + if (cbRead != 0) + { + hr = pStream->Read((void*) &bVal, cbRead, NULL); + if (hr == S_FALSE) + hr = E_FAIL; + return hr; + } + CComBSTR bstrRead; + + hr = bstrRead.ReadFromStream(pStream); + if (FAILED(hr)) + return hr; + vt = VT_BSTR; + bstrVal = bstrRead.Detach(); + if (vtRead != VT_BSTR) + hr = ChangeType(vtRead); + return hr; +} + +///////////////////////////////////////////////////////////////////////////// +// CRegKey + +class CRegKey +{ +public: + CRegKey(); + ~CRegKey(); + +// Attributes +public: + operator HKEY() const; + HKEY m_hKey; + +// Operations +public: + LONG SetValue(DWORD dwValue, LPCTSTR lpszValueName); + LONG QueryValue(DWORD& dwValue, LPCTSTR lpszValueName); + LONG QueryValue(LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount); + LONG SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); + + LONG SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); + static LONG WINAPI SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName, + LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); + + LONG Create(HKEY hKeyParent, LPCTSTR lpszKeyName, + LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, + REGSAM samDesired = KEY_ALL_ACCESS, + LPSECURITY_ATTRIBUTES lpSecAttr = NULL, + LPDWORD lpdwDisposition = NULL); + LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName, + REGSAM samDesired = KEY_ALL_ACCESS); + LONG Close(); + HKEY Detach(); + void Attach(HKEY hKey); + LONG DeleteSubKey(LPCTSTR lpszSubKey); + LONG RecurseDeleteKey(LPCTSTR lpszKey); + LONG DeleteValue(LPCTSTR lpszValue); +}; + +inline CRegKey::CRegKey() +{m_hKey = NULL;} + +inline CRegKey::~CRegKey() +{Close();} + +inline CRegKey::operator HKEY() const +{return m_hKey;} + +inline HKEY CRegKey::Detach() +{ + HKEY hKey = m_hKey; + m_hKey = NULL; + return hKey; +} + +inline void CRegKey::Attach(HKEY hKey) +{ + ATLASSERT(m_hKey == NULL); + m_hKey = hKey; +} + +inline LONG CRegKey::DeleteSubKey(LPCTSTR lpszSubKey) +{ + ATLASSERT(m_hKey != NULL); + return RegDeleteKey(m_hKey, lpszSubKey); +} + +inline LONG CRegKey::DeleteValue(LPCTSTR lpszValue) +{ + ATLASSERT(m_hKey != NULL); + return RegDeleteValue(m_hKey, (LPTSTR)lpszValue); +} + +inline LONG CRegKey::Close() +{ + LONG lRes = ERROR_SUCCESS; + if (m_hKey != NULL) + { + lRes = RegCloseKey(m_hKey); + m_hKey = NULL; + } + return lRes; +} + +inline LONG CRegKey::Create(HKEY hKeyParent, LPCTSTR lpszKeyName, + LPTSTR lpszClass, DWORD dwOptions, REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecAttr, LPDWORD lpdwDisposition) +{ + ATLASSERT(hKeyParent != NULL); + DWORD dw; + HKEY hKey = NULL; + LONG lRes = RegCreateKeyEx(hKeyParent, lpszKeyName, 0, + lpszClass, dwOptions, samDesired, lpSecAttr, &hKey, &dw); + if (lpdwDisposition != NULL) + *lpdwDisposition = dw; + if (lRes == ERROR_SUCCESS) + { + lRes = Close(); + m_hKey = hKey; + } + return lRes; +} + +inline LONG CRegKey::Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired) +{ + ATLASSERT(hKeyParent != NULL); + HKEY hKey = NULL; + LONG lRes = RegOpenKeyEx(hKeyParent, lpszKeyName, 0, samDesired, &hKey); + if (lRes == ERROR_SUCCESS) + { + lRes = Close(); + ATLASSERT(lRes == ERROR_SUCCESS); + m_hKey = hKey; + } + return lRes; +} + +inline LONG CRegKey::QueryValue(DWORD& dwValue, LPCTSTR lpszValueName) +{ + DWORD dwType = NULL; + DWORD dwCount = sizeof(DWORD); + LONG lRes = RegQueryValueEx(m_hKey, (LPTSTR)lpszValueName, NULL, &dwType, + (LPBYTE)&dwValue, &dwCount); + ATLASSERT((lRes!=ERROR_SUCCESS) || (dwType == REG_DWORD)); + ATLASSERT((lRes!=ERROR_SUCCESS) || (dwCount == sizeof(DWORD))); + return lRes; +} + +inline LONG CRegKey::QueryValue(LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount) +{ + ATLASSERT(pdwCount != NULL); + DWORD dwType = NULL; + LONG lRes = RegQueryValueEx(m_hKey, (LPTSTR)lpszValueName, NULL, &dwType, + (LPBYTE)szValue, pdwCount); + ATLASSERT((lRes!=ERROR_SUCCESS) || (dwType == REG_SZ) || + (dwType == REG_MULTI_SZ) || (dwType == REG_EXPAND_SZ)); + return lRes; +} + +inline LONG WINAPI CRegKey::SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName) +{ + ATLASSERT(lpszValue != NULL); + CRegKey key; + LONG lRes = key.Create(hKeyParent, lpszKeyName); + if (lRes == ERROR_SUCCESS) + lRes = key.SetValue(lpszValue, lpszValueName); + return lRes; +} + +inline LONG CRegKey::SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName) +{ + ATLASSERT(lpszValue != NULL); + CRegKey key; + LONG lRes = key.Create(m_hKey, lpszKeyName); + if (lRes == ERROR_SUCCESS) + lRes = key.SetValue(lpszValue, lpszValueName); + return lRes; +} + +inline LONG CRegKey::SetValue(DWORD dwValue, LPCTSTR lpszValueName) +{ + ATLASSERT(m_hKey != NULL); + return RegSetValueEx(m_hKey, lpszValueName, NULL, REG_DWORD, + (BYTE * const)&dwValue, sizeof(DWORD)); +} + +inline LONG CRegKey::SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName) +{ + ATLASSERT(lpszValue != NULL); + ATLASSERT(m_hKey != NULL); + return RegSetValueEx(m_hKey, lpszValueName, NULL, REG_SZ, + (BYTE * const)lpszValue, (lstrlen(lpszValue)+1)*sizeof(TCHAR)); +} + +inline LONG CRegKey::RecurseDeleteKey(LPCTSTR lpszKey) +{ + CRegKey key; + LONG lRes = key.Open(m_hKey, lpszKey, KEY_READ | KEY_WRITE); + if (lRes != ERROR_SUCCESS) + return lRes; + FILETIME time; + DWORD dwSize = 256; + TCHAR szBuffer[256]; + while (RegEnumKeyEx(key.m_hKey, 0, szBuffer, &dwSize, NULL, NULL, NULL, + &time)==ERROR_SUCCESS) + { + lRes = key.RecurseDeleteKey(szBuffer); + if (lRes != ERROR_SUCCESS) + return lRes; + dwSize = 256; + } + key.Close(); + return DeleteSubKey(lpszKey); +} + +inline HRESULT CComModule::RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc) +{ + CRegKey keyProgID; + LONG lRes = keyProgID.Create(HKEY_CLASSES_ROOT, lpszProgID, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE); + if (lRes == ERROR_SUCCESS) + { + keyProgID.SetValue(lpszUserDesc); + keyProgID.SetKeyValue(_T("CLSID"), lpszCLSID); + return S_OK; + } + return HRESULT_FROM_WIN32(lRes); +} + +#ifdef _ATL_STATIC_REGISTRY +#include + +// Statically linking to Registry Ponent +inline HRESULT WINAPI CComModule::UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister, + struct _ATL_REGMAP_ENTRY* pMapEntries) +{ + USES_CONVERSION; + ATL::CRegObject ro; + TCHAR szModule[_MAX_PATH]; + GetModuleFileName(_pModule->GetModuleInstance(), szModule, _MAX_PATH); + + LPOLESTR pszModule; + if ((m_hInst == NULL) || (m_hInst == GetModuleHandle(NULL))) // register as EXE + { + // Convert to short path to work around bug in NT4's CreateProcess + TCHAR szModuleShort[_MAX_PATH]; + int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH); + + if (cbShortName == _MAX_PATH) + return E_OUTOFMEMORY; + + pszModule = (cbShortName == 0 || cbShortName == ERROR_INVALID_PARAMETER) ? T2OLE(szModule) : T2OLE(szModuleShort); + } + else + pszModule = T2OLE(szModule); + + int nLen = ocslen(pszModule); + LPOLESTR pszModuleQuote = (LPOLESTR)alloca((nLen*2+1)*sizeof(OLECHAR)); + ReplaceSingleQuote(pszModuleQuote, pszModule); + ro.AddReplacement(OLESTR("Module"), pszModuleQuote); + if (NULL != pMapEntries) + { + while (NULL != pMapEntries->szKey) + { + ATLASSERT(NULL != pMapEntries->szData); + ro.AddReplacement(pMapEntries->szKey, pMapEntries->szData); + pMapEntries++; + } + } + + LPCOLESTR szType = OLESTR("REGISTRY"); + return (bRegister) ? ro.ResourceRegister(pszModule, nResID, szType) : + ro.ResourceUnregister(pszModule, nResID, szType); +} + +inline HRESULT WINAPI CComModule::UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister, + struct _ATL_REGMAP_ENTRY* pMapEntries) +{ + USES_CONVERSION; + ATL::CRegObject ro; + TCHAR szModule[_MAX_PATH]; + GetModuleFileName(_pModule->GetModuleInstance(), szModule, _MAX_PATH); + + LPOLESTR pszModule; + if ((m_hInst == NULL) || (m_hInst == GetModuleHandle(NULL))) // register as EXE + { + // Convert to short path to work around bug in NT4's CreateProcess + TCHAR szModuleShort[_MAX_PATH]; + int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH); + + if (cbShortName == _MAX_PATH) + return E_OUTOFMEMORY; + + pszModule = (cbShortName == 0 || cbShortName == ERROR_INVALID_PARAMETER) ? T2OLE(szModule) : T2OLE(szModuleShort); + } + else + pszModule = T2OLE(szModule); + + int nLen = ocslen(pszModule); + LPOLESTR pszModuleQuote = (LPOLESTR)alloca((nLen*2+1)*sizeof(OLECHAR)); + ReplaceSingleQuote(pszModuleQuote, pszModule); + ro.AddReplacement(OLESTR("Module"), pszModuleQuote); + if (NULL != pMapEntries) + { + while (NULL != pMapEntries->szKey) + { + ATLASSERT(NULL != pMapEntries->szData); + ro.AddReplacement(pMapEntries->szKey, pMapEntries->szData); + pMapEntries++; + } + } + + LPCOLESTR szType = OLESTR("REGISTRY"); + LPCOLESTR pszRes = T2COLE(lpszRes); + return (bRegister) ? ro.ResourceRegisterSz(pszModule, pszRes, szType) : + ro.ResourceUnregisterSz(pszModule, pszRes, szType); +} +#endif //_ATL_STATIC_REGISTRY + +inline HRESULT WINAPI CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, + LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister) +{ + if (bRegister) + { + return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, nDescID, + dwFlags); + } + else + return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID); +} + +inline HRESULT WINAPI CComModule::RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, + LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags) +{ + static const TCHAR szProgID[] = _T("ProgID"); + static const TCHAR szVIProgID[] = _T("VersionIndependentProgID"); + static const TCHAR szLS32[] = _T("LocalServer32"); + static const TCHAR szIPS32[] = _T("InprocServer32"); + static const TCHAR szThreadingModel[] = _T("ThreadingModel"); + static const TCHAR szAUTPRX32[] = _T("AUTPRX32.DLL"); + static const TCHAR szApartment[] = _T("Apartment"); + static const TCHAR szBoth[] = _T("both"); + USES_CONVERSION; + HRESULT hRes = S_OK; + TCHAR szDesc[256]; + LoadString(m_hInst, nDescID, szDesc, 256); + TCHAR szModule[_MAX_PATH]; + GetModuleFileName(m_hInst, szModule, _MAX_PATH); + + LPOLESTR lpOleStr; + StringFromCLSID(clsid, &lpOleStr); + LPTSTR lpsz = OLE2T(lpOleStr); + + hRes = RegisterProgID(lpsz, lpszProgID, szDesc); + if (hRes == S_OK) + hRes = RegisterProgID(lpsz, lpszVerIndProgID, szDesc); + LONG lRes = ERROR_SUCCESS; + if (hRes == S_OK) + { + CRegKey key; + lRes = key.Open(HKEY_CLASSES_ROOT, _T("CLSID"), KEY_READ | KEY_WRITE); + if (lRes == ERROR_SUCCESS) + { + lRes = key.Create(key, lpsz, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE); + if (lRes == ERROR_SUCCESS) + { + key.SetValue(szDesc); + key.SetKeyValue(szProgID, lpszProgID); + key.SetKeyValue(szVIProgID, lpszVerIndProgID); + + if ((m_hInst == NULL) || (m_hInst == GetModuleHandle(NULL))) // register as EXE + { + // Convert to short path to work around bug in NT4's CreateProcess + TCHAR szModuleShort[_MAX_PATH]; + int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH); + TCHAR* pszModule; + + if (cbShortName == _MAX_PATH) + return E_OUTOFMEMORY; + + pszModule = (cbShortName == 0 || cbShortName == ERROR_INVALID_PARAMETER) ? szModule : szModuleShort; + + key.SetKeyValue(szLS32, pszModule); + } + else + { + key.SetKeyValue(szIPS32, (dwFlags & AUTPRXFLAG) ? szAUTPRX32 : szModule); + LPCTSTR lpszModel = (dwFlags & THREADFLAGS_BOTH) ? szBoth : + (dwFlags & THREADFLAGS_APARTMENT) ? szApartment : NULL; + if (lpszModel != NULL) + key.SetKeyValue(szIPS32, lpszModel, szThreadingModel); + } + } + } + } + CoTaskMemFree(lpOleStr); + if (lRes != ERROR_SUCCESS) + hRes = HRESULT_FROM_WIN32(lRes); + return hRes; +} + +inline HRESULT WINAPI CComModule::UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, + LPCTSTR lpszVerIndProgID) +{ + USES_CONVERSION; + CRegKey key; + + key.Attach(HKEY_CLASSES_ROOT); + if (lpszProgID != NULL && lstrcmpi(lpszProgID, _T(""))) + key.RecurseDeleteKey(lpszProgID); + if (lpszVerIndProgID != NULL && lstrcmpi(lpszVerIndProgID, _T(""))) + key.RecurseDeleteKey(lpszVerIndProgID); + LPOLESTR lpOleStr; + StringFromCLSID(clsid, &lpOleStr); + LPTSTR lpsz = OLE2T(lpOleStr); + if (key.Open(key, _T("CLSID"), KEY_READ | KEY_WRITE) == ERROR_SUCCESS) + key.RecurseDeleteKey(lpsz); + CoTaskMemFree(lpOleStr); + return S_OK; +} + +///////////////////////////////////////////////////////////////////////////// +// Large Block Allocation Helper - CVBufHelper & CVirtualBuffer + + +template +class CVBufHelper +{ +public: + virtual T* operator()(T* pCurrent) {return pCurrent;} +}; + +template +class CVirtualBuffer +{ +protected: + CVirtualBuffer() {} + T* m_pBase; + T* m_pCurrent; + T* m_pTop; + int m_nMaxElements; +public: + CVirtualBuffer(int nMaxElements) + { + m_nMaxElements = nMaxElements; + m_pBase = (T*) VirtualAlloc(NULL, sizeof(T) * nMaxElements, + MEM_RESERVE, PAGE_READWRITE); + m_pTop = m_pCurrent = m_pBase; + // Commit first page - chances are this is all that will be used + VirtualAlloc(m_pBase, sizeof(T), MEM_COMMIT, PAGE_READWRITE); + } + ~CVirtualBuffer() + { + VirtualFree(m_pBase, 0, MEM_RELEASE); + } + int Except(LPEXCEPTION_POINTERS lpEP) + { + EXCEPTION_RECORD* pExcept = lpEP->ExceptionRecord; + if (pExcept->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) + return EXCEPTION_CONTINUE_SEARCH; + BYTE* pAddress = (LPBYTE) pExcept->ExceptionInformation[1]; + VirtualAlloc(pAddress, sizeof(T), MEM_COMMIT, PAGE_READWRITE); + return EXCEPTION_CONTINUE_EXECUTION; + } + void Seek(int nElement) + { + m_pCurrent = &m_pBase[nElement]; + } + void SetAt(int nElement, const T& Element) + { + __try + { + T* p = &m_pBase[nElement] + *p = Element; + m_pTop = p > m_pTop ? p : m_pTop; + } + __except(Except(GetExceptionInformation())) + { + } + + } + template + void WriteBulk(Q& helper) + { + __try + { + m_pCurrent = helper(m_pBase); + m_pTop = m_pCurrent > m_pTop ? m_pCurrent : m_pTop; + } + __except(Except(GetExceptionInformation())) + { + } + } + void Write(const T& Element) + { + __try + { + *m_pCurrent = Element; + m_pCurrent++; + m_pTop = m_pCurrent > m_pTop ? m_pCurrent : m_pTop; + } + __except(Except(GetExceptionInformation())) + { + } + } + T& Read() + { + return *m_pCurrent; + } + operator BSTR() + { + BSTR bstrTemp; + __try + { + bstrTemp = SysAllocStringByteLen((char*) m_pBase, + (UINT) ((BYTE*)m_pTop - (BYTE*)m_pBase)); + } + __except(Except(GetExceptionInformation())) + { + } + return bstrTemp; + } + const T& operator[](int nElement) const + { + return m_pBase[nElement]; + } + operator T*() + { + return m_pBase; + } +}; + +typedef CVirtualBuffer CVirtualBytes; + + +inline HRESULT WINAPI AtlDumpIID(REFIID iid, LPCTSTR pszClassName, HRESULT hr) +{ + if (atlTraceQI & ATL_TRACE_CATEGORY) + { + USES_CONVERSION; + CRegKey key; + TCHAR szName[100]; + DWORD dwType,dw = sizeof(szName); + + LPOLESTR pszGUID = NULL; + StringFromCLSID(iid, &pszGUID); + OutputDebugString(pszClassName); + OutputDebugString(_T(" - ")); + + // Attempt to find it in the interfaces section + key.Open(HKEY_CLASSES_ROOT, _T("Interface"), KEY_READ); + if (key.Open(key, OLE2T(pszGUID), KEY_READ) == S_OK) + { + *szName = 0; + RegQueryValueEx(key.m_hKey, (LPTSTR)NULL, NULL, &dwType, (LPBYTE)szName, &dw); + OutputDebugString(szName); + goto cleanup; + } + // Attempt to find it in the clsid section + key.Open(HKEY_CLASSES_ROOT, _T("CLSID"), KEY_READ); + if (key.Open(key, OLE2T(pszGUID), KEY_READ) == S_OK) + { + *szName = 0; + RegQueryValueEx(key.m_hKey, (LPTSTR)NULL, NULL, &dwType, (LPBYTE)szName, &dw); + OutputDebugString(_T("(CLSID\?\?\?) ")); + OutputDebugString(szName); + goto cleanup; + } + OutputDebugString(OLE2T(pszGUID)); + cleanup: + if (hr != S_OK) + OutputDebugString(_T(" - failed")); + OutputDebugString(_T("\n")); + CoTaskMemFree(pszGUID); + } + return hr; +} + +#pragma pack(pop) + +// WM_FORWARDMSG - used to forward a message to another window for processing +// WPARAM - DWORD dwUserData - defined by user +// LPARAM - LPMSG pMsg - a pointer to the MSG structure +// return value - 0 if the message was not processed, nonzero if it was +#define WM_FORWARDMSG 0x037F + +}; //namespace ATL +using namespace ATL; + +//only suck in definition if static linking +#ifndef _ATL_DLL_IMPL +#ifndef _ATL_DLL +#define _ATLBASE_IMPL +#endif +#endif + +#ifdef _ATL_REDEF_NEW +#pragma pop_macro("new") +#undef _ATL_REDEF_NEW +#endif + +#endif // __ATLBASE_H__ + +//All exports go here +#ifdef _ATLBASE_IMPL + +#ifndef _ATL_DLL_IMPL +namespace ATL +{ +#endif + +///////////////////////////////////////////////////////////////////////////// +// statics + +static UINT WINAPI AtlGetDirLen(LPCOLESTR lpszPathName) +{ + ATLASSERT(lpszPathName != NULL); + + // always capture the complete file name including extension (if present) + LPCOLESTR lpszTemp = lpszPathName; + for (LPCOLESTR lpsz = lpszPathName; *lpsz != NULL; ) + { + LPCOLESTR lp = CharNextO(lpsz); + // remember last directory/drive separator + if (*lpsz == OLESTR('\\') || *lpsz == OLESTR('/') || *lpsz == OLESTR(':')) + lpszTemp = lp; + lpsz = lp; + } + + return lpszTemp-lpszPathName; +} + +///////////////////////////////////////////////////////////////////////////// +// QI support + +ATLINLINE ATLAPI AtlInternalQueryInterface(void* pThis, + const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject) +{ + ATLASSERT(pThis != NULL); + // First entry in the com map should be a simple map entry + ATLASSERT(pEntries->pFunc == _ATL_SIMPLEMAPENTRY); + if (ppvObject == NULL) + return E_POINTER; + *ppvObject = NULL; + if (InlineIsEqualUnknown(iid)) // use first interface + { + IUnknown* pUnk = (IUnknown*)((int)pThis+pEntries->dw); + pUnk->AddRef(); + *ppvObject = pUnk; + return S_OK; + } + while (pEntries->pFunc != NULL) + { + BOOL bBlind = (pEntries->piid == NULL); + if (bBlind || InlineIsEqualGUID(*(pEntries->piid), iid)) + { + if (pEntries->pFunc == _ATL_SIMPLEMAPENTRY) //offset + { + ATLASSERT(!bBlind); + IUnknown* pUnk = (IUnknown*)((int)pThis+pEntries->dw); + pUnk->AddRef(); + *ppvObject = pUnk; + return S_OK; + } + else //actual function call + { + HRESULT hRes = pEntries->pFunc(pThis, + iid, ppvObject, pEntries->dw); + if (hRes == S_OK || (!bBlind && FAILED(hRes))) + return hRes; + } + } + pEntries++; + } + return E_NOINTERFACE; +} + +///////////////////////////////////////////////////////////////////////////// +// Smart Pointer helpers + +ATLINLINE ATLAPI_(IUnknown*) AtlComPtrAssign(IUnknown** pp, IUnknown* lp) +{ + if (lp != NULL) + lp->AddRef(); + if (*pp) + (*pp)->Release(); + *pp = lp; + return lp; +} + +ATLINLINE ATLAPI_(IUnknown*) AtlComQIPtrAssign(IUnknown** pp, IUnknown* lp, REFIID riid) +{ + IUnknown* pTemp = *pp; + *pp = NULL; + if (lp != NULL) + lp->QueryInterface(riid, (void**)pp); + if (pTemp) + pTemp->Release(); + return *pp; +} + +///////////////////////////////////////////////////////////////////////////// +// Inproc Marshaling helpers + +//This API should be called from the same thread that called +//AtlMarshalPtrInProc +ATLINLINE ATLAPI AtlFreeMarshalStream(IStream* pStream) +{ + if (pStream != NULL) + { + LARGE_INTEGER l; + l.QuadPart = 0; + pStream->Seek(l, STREAM_SEEK_SET, NULL); + CoReleaseMarshalData(pStream); + pStream->Release(); + } + return S_OK; +} + +ATLINLINE ATLAPI AtlMarshalPtrInProc(IUnknown* pUnk, const IID& iid, IStream** ppStream) +{ + HRESULT hRes = CreateStreamOnHGlobal(NULL, TRUE, ppStream); + if (SUCCEEDED(hRes)) + { + hRes = CoMarshalInterface(*ppStream, iid, + pUnk, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLESTRONG); + if (FAILED(hRes)) + { + (*ppStream)->Release(); + *ppStream = NULL; + } + } + return hRes; +} + +ATLINLINE ATLAPI AtlUnmarshalPtr(IStream* pStream, const IID& iid, IUnknown** ppUnk) +{ + *ppUnk = NULL; + HRESULT hRes = E_INVALIDARG; + if (pStream != NULL) + { + LARGE_INTEGER l; + l.QuadPart = 0; + pStream->Seek(l, STREAM_SEEK_SET, NULL); + hRes = CoUnmarshalInterface(pStream, iid, (void**)ppUnk); + } + return hRes; +} + +ATLINLINE ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent) +{ + DWORD dwRet; + MSG msg; + + while(1) + { + dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT); + + if (dwRet == WAIT_OBJECT_0) + return TRUE; // The event was signaled + + if (dwRet != WAIT_OBJECT_0 + 1) + break; // Something else happened + + // There is one or more window message available. Dispatch them + while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0) + return TRUE; // Event is now signaled. + } + } + return FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Connection Point Helpers + +ATLINLINE ATLAPI AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw) +{ + CComPtr pCPC; + CComPtr pCP; + HRESULT hRes = pUnkCP->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC); + if (SUCCEEDED(hRes)) + hRes = pCPC->FindConnectionPoint(iid, &pCP); + if (SUCCEEDED(hRes)) + hRes = pCP->Advise(pUnk, pdw); + return hRes; +} + +ATLINLINE ATLAPI AtlUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw) +{ + CComPtr pCPC; + CComPtr pCP; + HRESULT hRes = pUnkCP->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC); + if (SUCCEEDED(hRes)) + hRes = pCPC->FindConnectionPoint(iid, &pCP); + if (SUCCEEDED(hRes)) + hRes = pCP->Unadvise(dw); + return hRes; +} + +///////////////////////////////////////////////////////////////////////////// +// IDispatch Error handling + +ATLINLINE ATLAPI AtlSetErrorInfo(const CLSID& clsid, LPCOLESTR lpszDesc, DWORD dwHelpID, + LPCOLESTR lpszHelpFile, const IID& iid, HRESULT hRes, HINSTANCE hInst) +{ + USES_CONVERSION; + TCHAR szDesc[1024]; + szDesc[0] = NULL; + // For a valid HRESULT the id should be in the range [0x0200, 0xffff] + if (HIWORD(lpszDesc) == 0) //id + { + UINT nID = LOWORD((DWORD)lpszDesc); + ATLASSERT((nID >= 0x0200 && nID <= 0xffff) || hRes != 0); + if (LoadString(hInst, nID, szDesc, 1024) == 0) + { + ATLASSERT(FALSE); + lstrcpy(szDesc, _T("Unknown Error")); + } + lpszDesc = T2OLE(szDesc); + if (hRes == 0) + hRes = MAKE_HRESULT(3, FACILITY_ITF, nID); + } + + CComPtr pICEI; + if (SUCCEEDED(CreateErrorInfo(&pICEI))) + { + CComPtr pErrorInfo; + pICEI->SetGUID(iid); + LPOLESTR lpsz; + ProgIDFromCLSID(clsid, &lpsz); + if (lpsz != NULL) + pICEI->SetSource(lpsz); + if (dwHelpID != 0 && lpszHelpFile != NULL) + { + pICEI->SetHelpContext(dwHelpID); + pICEI->SetHelpFile(const_cast(lpszHelpFile)); + } + CoTaskMemFree(lpsz); + pICEI->SetDescription((LPOLESTR)lpszDesc); + if (SUCCEEDED(pICEI->QueryInterface(IID_IErrorInfo, (void**)&pErrorInfo))) + SetErrorInfo(0, pErrorInfo); + } + return (hRes == 0) ? DISP_E_EXCEPTION : hRes; +} + +///////////////////////////////////////////////////////////////////////////// +// Module + +struct _ATL_MODULE20 +{ +// Attributes +public: + UINT cbSize; + HINSTANCE m_hInst; + HINSTANCE m_hInstResource; + HINSTANCE m_hInstTypeLib; + _ATL_OBJMAP_ENTRY* m_pObjMap; + LONG m_nLockCnt; + HANDLE m_hHeap; + CRITICAL_SECTION m_csTypeInfoHolder; + CRITICAL_SECTION m_csWindowCreate; + CRITICAL_SECTION m_csObjMap; +}; + +typedef _ATL_MODULE _ATL_MODULE30; + +struct _ATL_OBJMAP_ENTRY20 +{ + const CLSID* pclsid; + HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister); + _ATL_CREATORFUNC* pfnGetClassObject; + _ATL_CREATORFUNC* pfnCreateInstance; + IUnknown* pCF; + DWORD dwRegister; + _ATL_DESCRIPTIONFUNC* pfnGetObjectDescription; +}; + +typedef _ATL_OBJMAP_ENTRY _ATL_OBJMAP_ENTRY30; + +inline _ATL_OBJMAP_ENTRY* _NextObjectMapEntry(_ATL_MODULE* pM, _ATL_OBJMAP_ENTRY* pEntry) +{ + if (pM->cbSize == sizeof(_ATL_MODULE20)) + return (_ATL_OBJMAP_ENTRY*)(((BYTE*)pEntry) + sizeof(_ATL_OBJMAP_ENTRY20)); + return pEntry+1; +} + +//Although these functions are big, they are only used once in a module +//so we should make them inline. + +ATLINLINE ATLAPI AtlModuleInit(_ATL_MODULE* pM, _ATL_OBJMAP_ENTRY* p, HINSTANCE h) +{ + ATLASSERT(pM != NULL); + if (pM == NULL) + return E_INVALIDARG; +#ifdef _ATL_DLL_IMPL + if ((pM->cbSize != _nAtlModuleVer1Size) && (pM->cbSize != sizeof(_ATL_MODULE))) + return E_INVALIDARG; +#else + ATLASSERT(pM->cbSize == sizeof(_ATL_MODULE)); +#endif + pM->m_pObjMap = p; + pM->m_hInst = pM->m_hInstTypeLib = pM->m_hInstResource = h; + pM->m_nLockCnt=0L; + pM->m_hHeap = NULL; + InitializeCriticalSection(&pM->m_csTypeInfoHolder); + InitializeCriticalSection(&pM->m_csWindowCreate); + InitializeCriticalSection(&pM->m_csObjMap); +#ifdef _ATL_DLL_IMPL + if (pM->cbSize > _nAtlModuleVer1Size) +#endif + { + pM->m_pCreateWndList = NULL; + pM->m_bDestroyHeap = true; + pM->m_dwHeaps = 0; + pM->m_nHeap = 0; + pM->m_phHeaps = NULL; + pM->m_pTermFuncs = NULL; + if (pM->m_pObjMap != NULL) + { + _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; + while (pEntry->pclsid != NULL) + { + pEntry->pfnObjectMain(true); //initialize class resources + pEntry = _NextObjectMapEntry(pM, pEntry); + } + } + } + + return S_OK; +} + +ATLINLINE ATLAPI AtlModuleRegisterClassObjects(_ATL_MODULE* pM, DWORD dwClsContext, DWORD dwFlags) +{ + ATLASSERT(pM != NULL); + if (pM == NULL) + return E_INVALIDARG; + ATLASSERT(pM->m_pObjMap != NULL); + _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; + HRESULT hRes = S_OK; + while (pEntry->pclsid != NULL && hRes == S_OK) + { + hRes = pEntry->RegisterClassObject(dwClsContext, dwFlags); + pEntry = _NextObjectMapEntry(pM, pEntry); + } + return hRes; +} + +ATLINLINE ATLAPI AtlModuleRevokeClassObjects(_ATL_MODULE* pM) +{ + ATLASSERT(pM != NULL); + if (pM == NULL) + return E_INVALIDARG; + ATLASSERT(pM->m_pObjMap != NULL); + _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; + HRESULT hRes = S_OK; + while (pEntry->pclsid != NULL && hRes == S_OK) + { + hRes = pEntry->RevokeClassObject(); + pEntry = _NextObjectMapEntry(pM, pEntry); + } + return hRes; +} + +ATLINLINE ATLAPI AtlModuleGetClassObject(_ATL_MODULE* pM, REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + ATLASSERT(pM != NULL); + if (pM == NULL) + return E_INVALIDARG; + ATLASSERT(pM->m_pObjMap != NULL); + _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; + HRESULT hRes = S_OK; + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + while (pEntry->pclsid != NULL) + { + if ((pEntry->pfnGetClassObject != NULL) && InlineIsEqualGUID(rclsid, *pEntry->pclsid)) + { + if (pEntry->pCF == NULL) + { + EnterCriticalSection(&pM->m_csObjMap); + if (pEntry->pCF == NULL) + hRes = pEntry->pfnGetClassObject(pEntry->pfnCreateInstance, IID_IUnknown, (LPVOID*)&pEntry->pCF); + LeaveCriticalSection(&pM->m_csObjMap); + } + if (pEntry->pCF != NULL) + hRes = pEntry->pCF->QueryInterface(riid, ppv); + break; + } + pEntry = _NextObjectMapEntry(pM, pEntry); + } + if (*ppv == NULL && hRes == S_OK) + hRes = CLASS_E_CLASSNOTAVAILABLE; + return hRes; +} + +ATLINLINE ATLAPI AtlModuleTerm(_ATL_MODULE* pM) +{ + ATLASSERT(pM != NULL); + if (pM == NULL) + return E_INVALIDARG; + ATLASSERT(pM->m_hInst != NULL); + if (pM->m_pObjMap != NULL) + { + _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; + while (pEntry->pclsid != NULL) + { + if (pEntry->pCF != NULL) + pEntry->pCF->Release(); + pEntry->pCF = NULL; +#ifdef _ATL_DLL_IMPL + if (pM->cbSize > _nAtlModuleVer1Size) +#endif + pEntry->pfnObjectMain(false); //cleanup class resources + pEntry = _NextObjectMapEntry(pM, pEntry); + } + } + DeleteCriticalSection(&pM->m_csTypeInfoHolder); + DeleteCriticalSection(&pM->m_csWindowCreate); + DeleteCriticalSection(&pM->m_csObjMap); + +#ifdef _ATL_DLL_IMPL + if (pM->cbSize > _nAtlModuleVer1Size) +#endif + { + _ATL_TERMFUNC_ELEM* pElem = pM->m_pTermFuncs; + _ATL_TERMFUNC_ELEM* pNext = NULL; + while (pElem != NULL) + { + pElem->pFunc(pElem->dw); + pNext = pElem->pNext; + delete pElem; + pElem = pNext; + } + if (pM->m_hHeap != NULL && pM->m_bDestroyHeap) + { +#ifndef _ATL_NO_MP_HEAP + if (pM->m_phHeaps != NULL) + { + for (DWORD i = 0; i <= pM->m_dwHeaps; i++) + HeapDestroy(pM->m_phHeaps[i]); + } +#endif + HeapDestroy(pM->m_hHeap); + } + } + return S_OK; +} + +ATLINLINE ATLAPI AtlModuleAddTermFunc(_ATL_MODULE* pM, _ATL_TERMFUNC* pFunc, DWORD dw) +{ + HRESULT hr = S_OK; + _ATL_TERMFUNC_ELEM* pNew = NULL; + ATLTRY(pNew = new _ATL_TERMFUNC_ELEM); + if (pNew == NULL) + hr = E_OUTOFMEMORY; + else + { + pNew->pFunc = pFunc; + pNew->dw = dw; + EnterCriticalSection(&pM->m_csStaticDataInit); + pNew->pNext = pM->m_pTermFuncs; + pM->m_pTermFuncs = pNew; + LeaveCriticalSection(&pM->m_csStaticDataInit); + } + return hr; +} + +ATLINLINE ATLAPI AtlRegisterClassCategoriesHelper( REFCLSID clsid, + const struct _ATL_CATMAP_ENTRY* pCatMap, BOOL bRegister ) +{ + CComPtr< ICatRegister > pCatRegister; + HRESULT hResult; + const struct _ATL_CATMAP_ENTRY* pEntry; + CATID catid; + + if( pCatMap == NULL ) + { + return( S_OK ); + } + + hResult = CoCreateInstance( CLSID_StdComponentCategoriesMgr, NULL, + CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pCatRegister ); + if( FAILED( hResult ) ) + { + // Since not all systems have the category manager installed, we'll allow + // the registration to succeed even though we didn't register our + // categories. If you really want to register categories on a system + // without the category manager, you can either manually add the + // appropriate entries to your registry script (.rgs), or you can + // redistribute comcat.dll. + return( S_OK ); + } + + hResult = S_OK; + pEntry = pCatMap; + while( pEntry->iType != _ATL_CATMAP_ENTRY_END ) + { + catid = *pEntry->pcatid; + if( bRegister ) + { + if( pEntry->iType == _ATL_CATMAP_ENTRY_IMPLEMENTED ) + { + hResult = pCatRegister->RegisterClassImplCategories( clsid, 1, + &catid ); + } + else + { + ATLASSERT( pEntry->iType == _ATL_CATMAP_ENTRY_REQUIRED ); + hResult = pCatRegister->RegisterClassReqCategories( clsid, 1, + &catid ); + } + if( FAILED( hResult ) ) + { + return( hResult ); + } + } + else + { + if( pEntry->iType == _ATL_CATMAP_ENTRY_IMPLEMENTED ) + { + pCatRegister->UnRegisterClassImplCategories( clsid, 1, &catid ); + } + else + { + ATLASSERT( pEntry->iType == _ATL_CATMAP_ENTRY_REQUIRED ); + pCatRegister->UnRegisterClassReqCategories( clsid, 1, &catid ); + } + } + pEntry++; + } + + return( S_OK ); +} + +ATLINLINE ATLAPI AtlModuleRegisterServer(_ATL_MODULE* pM, BOOL bRegTypeLib, const CLSID* pCLSID) +{ + ATLASSERT(pM != NULL); + if (pM == NULL) + return E_INVALIDARG; + ATLASSERT(pM->m_hInst != NULL); + ATLASSERT(pM->m_pObjMap != NULL); + _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; + HRESULT hRes = S_OK; + for (;pEntry->pclsid != NULL; pEntry = _NextObjectMapEntry(pM, pEntry)) + { + if (pCLSID == NULL) + { + if (pEntry->pfnGetObjectDescription != NULL && + pEntry->pfnGetObjectDescription() != NULL) + continue; + } + else + { + if (!IsEqualGUID(*pCLSID, *pEntry->pclsid)) + continue; + } + hRes = pEntry->pfnUpdateRegistry(TRUE); + if (FAILED(hRes)) + break; + if (pM->cbSize == sizeof(_ATL_MODULE)) + { + hRes = AtlRegisterClassCategoriesHelper( *pEntry->pclsid, + pEntry->pfnGetCategoryMap(), TRUE ); + if (FAILED(hRes)) + break; + } + } + if (SUCCEEDED(hRes) && bRegTypeLib) + hRes = AtlModuleRegisterTypeLib(pM, 0); + return hRes; +} + +ATLINLINE ATLAPI AtlModuleUnregisterServerEx(_ATL_MODULE* pM, BOOL bUnRegTypeLib, const CLSID* pCLSID) +{ + ATLASSERT(pM != NULL); + if (pM == NULL) + return E_INVALIDARG; + ATLASSERT(pM->m_hInst != NULL); + ATLASSERT(pM->m_pObjMap != NULL); + _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; + for (;pEntry->pclsid != NULL; pEntry = _NextObjectMapEntry(pM, pEntry)) + { + if (pCLSID == NULL) + { + if (pEntry->pfnGetObjectDescription != NULL + && pEntry->pfnGetObjectDescription() != NULL) + continue; + } + else + { + if (!IsEqualGUID(*pCLSID, *pEntry->pclsid)) + continue; + } + pEntry->pfnUpdateRegistry(FALSE); //unregister + if (pM->cbSize == sizeof(_ATL_MODULE) && pEntry->pfnGetCategoryMap != NULL) + AtlRegisterClassCategoriesHelper( *pEntry->pclsid, + pEntry->pfnGetCategoryMap(), FALSE ); + } + if (bUnRegTypeLib) + AtlModuleUnRegisterTypeLib(pM, 0); + return S_OK; +} + +ATLINLINE ATLAPI AtlModuleUnregisterServer(_ATL_MODULE* pM, const CLSID* pCLSID) +{ + return AtlModuleUnregisterServerEx(pM, FALSE, pCLSID); +} + +ATLINLINE ATLAPI AtlModuleUpdateRegistryFromResourceD(_ATL_MODULE* pM, LPCOLESTR lpszRes, + BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg) +{ + USES_CONVERSION; + ATLASSERT(pM != NULL); + HRESULT hRes = S_OK; + CComPtr p; + if (pReg != NULL) + p = pReg; + else + { + hRes = CoCreateInstance(CLSID_Registrar, NULL, + CLSCTX_INPROC_SERVER, IID_IRegistrar, (void**)&p); + } + if (SUCCEEDED(hRes)) + { + TCHAR szModule[_MAX_PATH]; + GetModuleFileName(pM->m_hInst, szModule, _MAX_PATH); + + LPOLESTR pszModule; + if ((pM->m_hInst == NULL) || (pM->m_hInst == GetModuleHandle(NULL))) // register as EXE + { + // Convert to short path to work around bug in NT4's CreateProcess + TCHAR szModuleShort[_MAX_PATH]; + int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH); + + if (cbShortName == _MAX_PATH) + return E_OUTOFMEMORY; + + pszModule = (cbShortName == 0 || cbShortName == ERROR_INVALID_PARAMETER) ? T2OLE(szModule) : T2OLE(szModuleShort); + } + else + pszModule = T2OLE(szModule); + + int nLen = ocslen(pszModule); + LPOLESTR pszModuleQuote = (LPOLESTR)alloca((nLen*2+1)*sizeof(OLECHAR)); + CComModule::ReplaceSingleQuote(pszModuleQuote, pszModule); + p->AddReplacement(OLESTR("Module"), pszModuleQuote); + + if (NULL != pMapEntries) + { + while (NULL != pMapEntries->szKey) + { + ATLASSERT(NULL != pMapEntries->szData); + p->AddReplacement((LPOLESTR)pMapEntries->szKey, (LPOLESTR)pMapEntries->szData); + pMapEntries++; + } + } + LPCOLESTR szType = OLESTR("REGISTRY"); + if (HIWORD(lpszRes)==0) + { + if (bRegister) + hRes = p->ResourceRegister(pszModule, ((UINT)LOWORD((DWORD)lpszRes)), szType); + else + hRes = p->ResourceUnregister(pszModule, ((UINT)LOWORD((DWORD)lpszRes)), szType); + } + else + { + if (bRegister) + hRes = p->ResourceRegisterSz(pszModule, lpszRes, szType); + else + hRes = p->ResourceUnregisterSz(pszModule, lpszRes, szType); + } + + } + return hRes; +} + +///////////////////////////////////////////////////////////////////////////// +// TypeLib Support + +ATLINLINE ATLAPI AtlModuleLoadTypeLib(_ATL_MODULE* pM, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib) +{ + *pbstrPath = NULL; + *ppTypeLib = NULL; + ATLASSERT(pM != NULL); + USES_CONVERSION; + ATLASSERT(pM->m_hInstTypeLib != NULL); + TCHAR szModule[_MAX_PATH+10]; + GetModuleFileName(pM->m_hInstTypeLib, szModule, _MAX_PATH); + if (lpszIndex != NULL) + lstrcat(szModule, OLE2CT(lpszIndex)); + LPOLESTR lpszModule = T2OLE(szModule); + HRESULT hr = LoadTypeLib(lpszModule, ppTypeLib); + if (!SUCCEEDED(hr)) + { + // typelib not in module, try .tlb instead + LPTSTR lpszExt = NULL; + LPTSTR lpsz; + for (lpsz = szModule; *lpsz != NULL; lpsz = CharNext(lpsz)) + { + if (*lpsz == _T('.')) + lpszExt = lpsz; + } + if (lpszExt == NULL) + lpszExt = lpsz; + lstrcpy(lpszExt, _T(".tlb")); + lpszModule = T2OLE(szModule); + hr = LoadTypeLib(lpszModule, ppTypeLib); + } + if (SUCCEEDED(hr)) + *pbstrPath = OLE2BSTR(lpszModule); + return hr; +} + +ATLINLINE ATLAPI AtlModuleUnRegisterTypeLib(_ATL_MODULE* pM, LPCOLESTR lpszIndex) +{ + typedef HRESULT (WINAPI *PFNRTL)(REFGUID, WORD, WORD, LCID, SYSKIND); + CComBSTR bstrPath; + CComPtr pTypeLib; + HRESULT hr = AtlModuleLoadTypeLib(pM, lpszIndex, &bstrPath, &pTypeLib); + if (SUCCEEDED(hr)) + { + TLIBATTR* ptla; + HRESULT hr = pTypeLib->GetLibAttr(&ptla); + if (SUCCEEDED(hr)) + { + HINSTANCE h = LoadLibrary(_T("oleaut32.dll")); + if (h != NULL) + { + PFNRTL pfn = (PFNRTL) GetProcAddress(h, "UnRegisterTypeLib"); + if (pfn != NULL) + hr = pfn(ptla->guid, ptla->wMajorVerNum, ptla->wMinorVerNum, ptla->lcid, ptla->syskind); + FreeLibrary(h); + } + pTypeLib->ReleaseTLibAttr(ptla); + } + } + return hr; +} + +ATLINLINE ATLAPI AtlModuleRegisterTypeLib(_ATL_MODULE* pM, LPCOLESTR lpszIndex) +{ + CComBSTR bstrPath; + CComPtr pTypeLib; + HRESULT hr = AtlModuleLoadTypeLib(pM, lpszIndex, &bstrPath, &pTypeLib); + if (SUCCEEDED(hr)) + { + OLECHAR szDir[_MAX_PATH]; + ocscpy(szDir, bstrPath); + szDir[AtlGetDirLen(szDir)] = 0; + hr = ::RegisterTypeLib(pTypeLib, bstrPath, szDir); + } + return hr; +} + +ATLINLINE ATLAPI_(DWORD) AtlGetVersion(void* /* pReserved */) +{ + return _ATL_VER; +} + +ATLINLINE ATLAPI_(void) AtlModuleAddCreateWndData(_ATL_MODULE* pM, _AtlCreateWndData* pData, void* pObject) +{ + pData->m_pThis = pObject; + pData->m_dwThreadID = ::GetCurrentThreadId(); + ::EnterCriticalSection(&pM->m_csWindowCreate); + pData->m_pNext = pM->m_pCreateWndList; + pM->m_pCreateWndList = pData; + ::LeaveCriticalSection(&pM->m_csWindowCreate); +} + +ATLINLINE ATLAPI_(void*) AtlModuleExtractCreateWndData(_ATL_MODULE* pM) +{ + void* pv = NULL; + ::EnterCriticalSection(&pM->m_csWindowCreate); + _AtlCreateWndData* pEntry = pM->m_pCreateWndList; + if(pEntry != NULL) + { + DWORD dwThreadID = ::GetCurrentThreadId(); + _AtlCreateWndData* pPrev = NULL; + while(pEntry != NULL) + { + if(pEntry->m_dwThreadID == dwThreadID) + { + if(pPrev == NULL) + pM->m_pCreateWndList = pEntry->m_pNext; + else + pPrev->m_pNext = pEntry->m_pNext; + pv = pEntry->m_pThis; + break; + } + pPrev = pEntry; + pEntry = pEntry->m_pNext; + } + } + ::LeaveCriticalSection(&pM->m_csWindowCreate); + return pv; +} + +///////////////////////////////////////////////////////////////////////////// +// General DLL Version Helpers + +inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo) +{ + ATLASSERT(pDllVersionInfo != NULL); + if(::IsBadWritePtr(pDllVersionInfo, sizeof(DWORD))) + return E_INVALIDARG; + + // We must get this function explicitly because some DLLs don't implement it. + DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion"); + if(pfnDllGetVersion == NULL) + return E_NOTIMPL; + + return (*pfnDllGetVersion)(pDllVersionInfo); +} + +inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo) +{ + HINSTANCE hInstDLL = ::LoadLibrary(lpstrDllName); + if(hInstDLL == NULL) + return E_FAIL; + HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo); + ::FreeLibrary(hInstDLL); + return hRet; +} + +// Common Control Versions: +// Win95/WinNT 4.0 maj=4 min=00 +// IE 3.x maj=4 min=70 +// IE 4.0 maj=4 min=71 +inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) +{ + ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); + if(::IsBadWritePtr(pdwMajor, sizeof(DWORD)) || ::IsBadWritePtr(pdwMinor, sizeof(DWORD))) + return E_INVALIDARG; + + DLLVERSIONINFO dvi; + ::ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + HRESULT hRet = AtlGetDllVersion(_T("comctl32.dll"), &dvi); + + if(SUCCEEDED(hRet)) + { + *pdwMajor = dvi.dwMajorVersion; + *pdwMinor = dvi.dwMinorVersion; + } + else if(hRet == E_NOTIMPL) + { + // If DllGetVersion is not there, then the DLL is a version + // previous to the one shipped with IE 3.x + *pdwMajor = 4; + *pdwMinor = 0; + hRet = S_OK; + } + + return hRet; +} + +// Shell Versions: +// Win95/WinNT 4.0 maj=4 min=00 +// IE 3.x, IE 4.0 without Web Integrated Desktop maj=4 min=00 +// IE 4.0 with Web Integrated Desktop maj=4 min=71 +// IE 4.01 with Web Integrated Desktop maj=4 min=72 +inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) +{ + ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); + if(::IsBadWritePtr(pdwMajor, sizeof(DWORD)) || ::IsBadWritePtr(pdwMinor, sizeof(DWORD))) + return E_INVALIDARG; + + DLLVERSIONINFO dvi; + ::ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + HRESULT hRet = AtlGetDllVersion(_T("shell32.dll"), &dvi); + + if(SUCCEEDED(hRet)) + { + *pdwMajor = dvi.dwMajorVersion; + *pdwMinor = dvi.dwMinorVersion; + } + else if(hRet == E_NOTIMPL) + { + // If DllGetVersion is not there, then the DLL is a version + // previous to the one shipped with IE 4.x + *pdwMajor = 4; + *pdwMinor = 0; + hRet = S_OK; + } + + return hRet; +} + +#ifndef _ATL_DLL_IMPL +}; //namespace ATL +#endif + +//Prevent pulling in second time +#undef _ATLBASE_IMPL + +#endif // _ATLBASE_IMPL + +///////////////////////////////////////////////////////////////////////////// diff --git a/Source/Client/IM-Client/IMClient/FileDescriptioDlg.cpp b/Source/Client/IM-Client/IMClient/FileDescriptioDlg.cpp new file mode 100644 index 0000000..261f25d --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileDescriptioDlg.cpp @@ -0,0 +1,346 @@ +// FileDescriptioDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "FileDescriptioDlg.h" +#include "LoadSkins.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CFileDescriptioDlg dialog +extern CString GetCurrentSkin(); + +CFileDescriptioDlg::CFileDescriptioDlg(CWnd* pParent /*=NULL*/) + : CResizableDialog(CFileDescriptioDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CFileDescriptioDlg) + m_strFileDescription = _T(""); + m_strFileName = _T(""); + //}}AFX_DATA_INIT + m_bReadOnlyMode = TRUE; +// SetBoundary(0,0); +// SetCaption(RGB(0,0,0),RGB(0,0,0),0); +} + + +void CFileDescriptioDlg::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CFileDescriptioDlg) + DDX_Control(pDX, IDOK, m_btnSend); + DDX_Control(pDX, IDC_FILENAME_STATIC, m_FileName); + DDX_Control(pDX, IDC_FILEDESCRIPTION_EDIT, m_ctrlDescription); + DDX_Text(pDX, IDC_FILEDESCRIPTION_EDIT, m_strFileDescription); + DDV_MaxChars(pDX, m_strFileDescription, 400); + DDX_Text(pDX, IDC_FILENAME_STATIC, m_strFileName); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CFileDescriptioDlg, CResizableDialog) + //{{AFX_MSG_MAP(CFileDescriptioDlg) + ON_WM_CAPTURECHANGED() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +BEGIN_EVENTSINK_MAP(CFileDescriptioDlg, CResizableDialog) +//{{AFX_EVENTSINK_MAP(CFileDescriptioDlg) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CFileDescriptioDlg message handlers + +BOOL CFileDescriptioDlg::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + m_ctrlDescription.SetReadOnly(m_bReadOnlyMode); + + if(m_bReadOnlyMode) + { + m_btnSend.SetWindowText(GetString(IDS_CLOSE_BTN_NAME)); + } + + ShowSizeGrip(TRUE); + +// m_Close.SetAutoPressed(TRUE); +// m_Close.SetCanStayPressed(FALSE); + +// m_Ok.SetAutoPressed(TRUE); +// m_Ok.SetCanStayPressed(FALSE); + +// m_FileName.SetTextColor(0xffffff); +// m_FileName.SetTransparent(TRUE); + +// CRect winRect; +// GetClientRect(&winRect); + +// m_FileName.SetWindowPos(NULL,18,43,winRect.Width()-36,16,SWP_NOZORDER|SWP_NOACTIVATE); + +// LoadSkin(); + AddAnchor(m_FileName.GetSafeHwnd(), CSize(0, 0), CSize(100, 0)); + AddAnchor(m_ctrlDescription.GetSafeHwnd(), CSize(0, 0), CSize(100, 100)); + AddAnchor(m_btnSend.GetSafeHwnd(), CSize(100, 100), CSize(100, 100)); + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_FILE_DESCRIPTION, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +LPCTSTR CFileDescriptioDlg::GetDescription() +{ + return m_strFileDescription; +} + +int CFileDescriptioDlg::DoModalEditMode(LPCTSTR Text) +{ + m_bReadOnlyMode = FALSE; + m_strFileDescription = Text; + return DoModal(); +} + +int CFileDescriptioDlg::DoModalReadMode(LPCTSTR Text) +{ + m_bReadOnlyMode = TRUE; + m_strFileDescription = Text; + return DoModal(); +} + +//DEL void CFileDescriptioDlg::LoadSkin() +//DEL { +//DEL LoadSkins m_LoadSkin; +//DEL +//DEL IStreamPtr pStream = NULL; +//DEL long Error = 0L; +//DEL +//DEL bstr_t bstrPath = L"IBN_SCHEMA://"; +//DEL bstrPath += (LPCTSTR)GetCurrentSkin(); +//DEL +//DEL m_LoadSkin.Load(bstr_t(bstrPath+"/Shell/FileD/fon.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL { +//DEL LPPICTURE Pic = NULL; +//DEL HRESULT hr = ::OleLoadPicture(pStream, 0, TRUE, IID_IPicture,(void**)&Pic); +//DEL if(SUCCEEDED(hr)) +//DEL { +//DEL m_ResizeFon.Create(Pic); +//DEL m_ResizeFon.AddAnchor(CRect(0,0,100,70),CSize(0,0),CSize(0,0)); +//DEL m_ResizeFon.AddAnchor(CRect(100,0,205,70),CSize(0,0),CSize(100,0),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(205,0,299,70),CSize(100,0),CSize(100,0)); +//DEL +//DEL m_ResizeFon.AddAnchor(CRect(0,70,100,179),CSize(0,0),CSize(0,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(100,70,205,179),CSize(0,0),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(205,70,299,179),CSize(100,0),CSize(100,100),CResizableImage::DUPLICATE); +//DEL +//DEL m_ResizeFon.AddAnchor(CRect(0,179,100,227),CSize(0,100),CSize(0,100)); +//DEL m_ResizeFon.AddAnchor(CRect(100,179,205,227),CSize(0,100),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(205,179,299,227),CSize(100,100),CSize(100,100)); +//DEL } +//DEL } +//DEL pStream = NULL; +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_x.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Close.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_ok.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Ok.LoadBitmapFromStream(pStream); +//DEL } + +//DEL void CFileDescriptioDlg::OnPaint() +//DEL { +//DEL CPaintDC dc(this); // device context for painting +//DEL +//DEL CRect m_Client; +//DEL GetClientRect(&m_Client); +//DEL m_ResizeFon.Render(dc.GetSafeHdc(),m_Client.Size()); +//DEL } + +//DEL void CFileDescriptioDlg::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL +//DEL CPoint inPoint = point; +//DEL ClientToScreen(&point); +//DEL +//DEL CRect StatusRect, miniRect; +//DEL GetClientRect(&StatusRect); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL CResizableDialog::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL CResizableDialog::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL CResizableDialog::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL CResizableDialog::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMLEFT; +//DEL else +//DEL nHitTest = HTLEFT; +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMRIGHT; +//DEL else +//DEL nHitTest = HTRIGHT; +//DEL else if(inPoint.ymessage==WM_KEYDOWN||pMsg->message==WM_SYSKEYDOWN) + { + //TRACE("\r\n WM_KEYDOWN wParam = 0x%X",pMsg->wParam); + if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_CONTROL)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_CTRLENTER,1)==0) + { + OnOK(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_SHIFT)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHIFTENTER,0)==0) + { + OnOK(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==VK_RETURN) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ENTER,0)==0) + { + OnOK(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==0x53&&(GetKeyState(VK_MENU)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ALTS,0)==0) + { + OnOK(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + } + return CResizableDialog::PreTranslateMessage(pMsg); +} diff --git a/Source/Client/IM-Client/IMClient/FileDescriptioDlg.h b/Source/Client/IM-Client/IMClient/FileDescriptioDlg.h new file mode 100644 index 0000000..3434228 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileDescriptioDlg.h @@ -0,0 +1,63 @@ +#if !defined(AFX_FILEDESCRIPTIODLG_H__BF321A70_55A1_4B3B_89B6_E35C8A16EDFC__INCLUDED_) +#define AFX_FILEDESCRIPTIODLG_H__BF321A70_55A1_4B3B_89B6_E35C8A16EDFC__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// FileDescriptioDlg.h : header file +// +#include "OfsNcDlg.h" +#include "ResizableImage.h" +#include "McButton.h" +#include "Label.h" + +///////////////////////////////////////////////////////////////////////////// +// CFileDescriptioDlg dialog + +class CFileDescriptioDlg : public CResizableDialog +{ +// Construction +public: + int DoModalEditMode(LPCTSTR Text = _T("")); + int DoModalReadMode(LPCTSTR Text = _T("")); + LPCTSTR GetDescription(); + CFileDescriptioDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CFileDescriptioDlg) + enum { IDD = IDD_FILEDESCRIPTION_DIALOG }; + CButton m_btnSend; + CLabel m_FileName; + CEdit m_ctrlDescription; + CString m_strFileDescription; + CString m_strFileName; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileDescriptioDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + BOOL m_bReadOnlyMode; + + CResizableImage m_ResizeFon; + // Generated message map functions + //{{AFX_MSG(CFileDescriptioDlg) + virtual BOOL OnInitDialog(); + afx_msg void OnCaptureChanged(CWnd *pWnd); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_FILEDESCRIPTIODLG_H__BF321A70_55A1_4B3B_89B6_E35C8A16EDFC__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/FileDownloadDlg.cpp b/Source/Client/IM-Client/IMClient/FileDownloadDlg.cpp new file mode 100644 index 0000000..4ae99f4 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileDownloadDlg.cpp @@ -0,0 +1,1780 @@ +// FileDownloadDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "FileDownloadDlg.h" +#include "resource.h" +#include "MainDlg.h" +#include "FileDescriptioDlg.h" +#include "ChooseFolder.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CFileDownloadDlg dialog +///TCHAR strDUStatus[3][20] = {"New","OffLine","Downloaded"}; +DWORD strDUStatus[3] = {IDS_FILE_NEW_NAME, IDS_FILE_OFFLINE_NAME, IDS_FILE_DOWNLOADED_NAME}; +//TCHAR strDUProgress[7][20] = {"","Wait","Wait","0%","","Cancel","Error"}; +DWORD strDUProgress[7]={IDS_FILE_EMPTY,IDS_FILE_WAIT_NAME ,IDS_FILE_WAIT_NAME ,IDS_FILE_START_NAME,IDS_FILE_EMPTY,IDS_FILE_CANCEL_NAME,IDS_FILE_ERROR_NAME}; + +CFileDownloadDlg::CFileDownloadDlg(CWnd* pParent /*=NULL*/) + : CResizableDialog(CFileDownloadDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CFileDownloadDlg) + m_bShowOfflineFiles = FALSE; + //}}AFX_DATA_INIT +// CoInitialize(NULL); + bWasSetComplet = FALSE; + pMessenger = NULL; + LoadOfflineFileHandle = 0; + m_lastUserId = 0; +} + +void CFileDownloadDlg::SetMessanger(CMainDlg *pMessenger) +{ + this->pMessenger = pMessenger; +} + +CFileDownloadDlg::~CFileDownloadDlg() +{ + m_LockList.Lock(); + try + { + for(int i = 0;i < ListArray.GetSize ();i++) + { + CDUFileInfo *pDUFileInfo = ListArray.GetAt(i); + delete pDUFileInfo; + } + ListArray.RemoveAll (); + } + catch(...) + {} + m_LockList.Unlock (); +} + + +void CFileDownloadDlg::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CFileDownloadDlg) + DDX_Control(pDX, IDC_REMEMBERLATER_BUTTON, m_btnRememberLater); + DDX_Control(pDX, IDC_OFFLINE_BUTTON, m_btnOffLine); + DDX_Control(pDX, IDC_CANCEL_BUTTON, m_btnCancel); + DDX_Control(pDX, IDC_DOWNLOAD_BUTTON, m_btnDownload); + DDX_Control(pDX, IDC_DELETE_BUTTON, m_btnDelete); + DDX_Control(pDX, IDC_FILE_DOWNLOAD_LIST, m_FileDownLoadList); + DDX_Check(pDX, IDC_SHOWOFFLINEFILES_CHECK, m_bShowOfflineFiles); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CFileDownloadDlg, CResizableDialog) + //{{AFX_MSG_MAP(CFileDownloadDlg) + ON_BN_CLICKED(IDOK, OnOk) + ON_WM_TIMER() + ON_WM_CLOSE() + ON_NOTIFY(LVN_ITEMCHANGED, IDC_FILE_DOWNLOAD_LIST, OnItemchangedFileDownloadList) + ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickFileDownloadList) + ON_NOTIFY(NM_DBLCLK, IDC_FILE_DOWNLOAD_LIST, OnDblclkFileDownloadList) + ON_NOTIFY(NM_RCLICK, IDC_FILE_DOWNLOAD_LIST, OnRclickFileDownloadList) + ON_COMMAND(ID_FILEDOWNLOAD_CANCELTRANSFORM, OnFiledownloadCanceltransform) + ON_UPDATE_COMMAND_UI(ID_FILEDOWNLOAD_CANCELTRANSFORM, OnUpdateFiledownloadCanceltransform) + ON_COMMAND(ID_FILEDOWNLOAD_CLEARRECORD, OnFiledownloadClearrecord) + ON_UPDATE_COMMAND_UI(ID_FILEDOWNLOAD_CLEARRECORD, OnUpdateFiledownloadClearrecord) + ON_COMMAND(ID_FILEDOWNLOAD_DOWNLOAD, OnFiledownloadDownload) + ON_UPDATE_COMMAND_UI(ID_FILEDOWNLOAD_DOWNLOAD, OnUpdateFiledownloadDownload) + ON_COMMAND(ID_FILEDOWNLOAD_INFORMATION, OnFiledownloadInformation) + ON_UPDATE_COMMAND_UI(ID_FILEDOWNLOAD_INFORMATION, OnUpdateFiledownloadInformation) + ON_COMMAND(ID_FILEDOWNLOAD_MOVETOOFFLINE, OnFiledownloadMovetooffline) + ON_UPDATE_COMMAND_UI(ID_FILEDOWNLOAD_MOVETOOFFLINE, OnUpdateFiledownloadMovetooffline) + ON_COMMAND(ID_FILEDOWNLOAD_OPEN, OnFiledownloadOpen) + ON_UPDATE_COMMAND_UI(ID_FILEDOWNLOAD_OPEN, OnUpdateFiledownloadOpen) + ON_BN_CLICKED(IDC_OFFLINE_BUTTON, OnOfflineButton) + ON_BN_CLICKED(IDC_DELETE_BUTTON, OnDeleteButton) + ON_BN_CLICKED(IDC_REMEMBERLATER_BUTTON, OnRememberlaterButton) + ON_BN_CLICKED(IDC_DOWNLOAD_BUTTON, OnDownloadButton) + ON_BN_CLICKED(IDC_CANCEL_BUTTON, OnCancelButton) + ON_BN_CLICKED(IDC_SHOWOFFLINEFILES_CHECK, OnShowofflinefilesCheck) + ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) + ON_MESSAGE(WM_DOWNLOAD_BEGIN,OnDownloadBegin) + ON_MESSAGE(WM_DOWNLOAD_STEP,OnDownloadStep) + ON_COMMAND(ID_FILEDOWNLOAD_GOTODIR, OnFiledownloadGotodir) + ON_UPDATE_COMMAND_UI(ID_FILEDOWNLOAD_GOTODIR, OnUpdateFiledownloadGotodir) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CFileDownloadDlg message handlers + +void CFileDownloadDlg::OnOk() +{ + // TODO: Add your control notification handler code here + +} + +void CFileDownloadDlg::OnCancel() +{ + // TODO: Add extra cleanup here + ///CResizableDialog::OnCancel(); +} + +void CFileDownloadDlg::OnOfflineButton() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos == NULL) return; + + if(pMessenger->ConnectEnable ()) + { + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + theNet2.LockTranslator(); + try + { + BSTR FileID = pDUFileInfo->strFileID.AllocSysString(); + if(pDUFileInfo->Handle = pSession->ConfirmFile(FileID,fcDoOffline)) + { + ChangeStatus(DS_OFFLINE,iSel); + ChangeProgress(DP_WAIT,iSel); + theNet2.AddToTranslator(pDUFileInfo->Handle,this->m_hWnd); + } + ::SysFreeString(FileID); + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + } + BlockOrUnBlock(); +} + +void CFileDownloadDlg::OnDeleteButton() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos == NULL) return; + + if(pMessenger->ConnectEnable ()) + { + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + theNet2.LockTranslator(); + try + { + BSTR FileID = pDUFileInfo->strFileID.AllocSysString(); + if(pDUFileInfo->Handle = pSession->ConfirmFile(FileID,fcDelete)) + { + ChangeProgress(DP_WAIT,iSel); + theNet2.AddToTranslator(pDUFileInfo->Handle,this->m_hWnd); + } + ::SysFreeString(FileID); + } + catch(...) + { + } + + theNet2.UnlockTranslator(); + } + } + BlockOrUnBlock(); +} + +void CFileDownloadDlg::OnRememberlaterButton() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos == NULL) return; + + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + ChangeProgress(DP_COMPLET,iSel); + bWasSetComplet = TRUE; + } +} + +void CFileDownloadDlg::OnDownloadButton() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos == NULL) return; + + if(pMessenger->ConnectEnable ()) + { + if(m_FileDownLoadList.GetSelectedCount()==1) + { + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + CString strFullPath; + strFullPath.Format(_T("%s\\%s"),GetMyDocumetPath(pMessenger->GetUserRole(),pMessenger->GetUserID()),pDUFileInfo->strFileName); + CFileDialog SaveDlg(FALSE,NULL,/*pDUFileInfo->strFileName*/strFullPath,OFN_EXPLORER|OFN_OVERWRITEPROMPT,GetString(IDS_ALL_FILES_FORMAT),this); + + if(SaveDlg.DoModal ()==IDOK) + { + theNet2.LockTranslator(); + try + { + pDUFileInfo->strLocalPath = SaveDlg.GetPathName (); + BSTR Path = SaveDlg.GetPathName ().AllocSysString(); + pDUFileInfo->pFile->PuthWnd(long(this->GetSafeHwnd())); + pDUFileInfo->pFile->PutRealName(Path); + pDUFileInfo->pFile->Receive(&(pDUFileInfo->Handle)); + if(pDUFileInfo->Handle!=0) + { + theNet2.AddToTranslator(pDUFileInfo->Handle,this->m_hWnd); + ChangeProgress(DP_WAIT,iSel); + } + ::SysFreeString(Path); + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + } + } + else + { + CChooseFolder chooseFolder; + + CString strDirPath = GetMyDocumetPath(pMessenger->GetUserRole(),pMessenger->GetUserID()); + + if(chooseFolder.DoModal(GetString(IDS_SELECT_FOLDER_NAME),strDirPath,this->GetSafeHwnd())==IDOK) + { + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + theNet2.LockTranslator(); + try + { + CString strTmp = strDirPath + _T('\\')+pDUFileInfo->strFileName; + BSTR Path = strTmp.AllocSysString(); + + pDUFileInfo->pFile->PuthWnd(long(this->GetSafeHwnd())); + pDUFileInfo->pFile->PutRealName(Path); + pDUFileInfo->pFile->Receive(&(pDUFileInfo->Handle)); + pDUFileInfo->strLocalPath = Path; + + if(pDUFileInfo->Handle!=0) + { + theNet2.AddToTranslator(pDUFileInfo->Handle,this->m_hWnd); + ChangeProgress(DP_WAIT,iSel); + } + ::SysFreeString(Path); + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + } + } + } + BlockOrUnBlock(); +} + +BOOL CFileDownloadDlg::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + //m_FileStatusImageList.Create(IDB_DOWNLOAD_FILESTATUS,16,1,0xff00ff); + m_SortHeader.SubclassWindow(m_FileDownLoadList.GetHeaderCtrl()->GetSafeHwnd()); + + // TODO: Add extra initialization here + AddAnchor(IDC_OFFLINE_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_DELETE_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_REMEMBERLATER_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_DOWNLOAD_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_CANCEL_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_FILE_DOWNLOAD_LIST,CSize(0,0),CSize(100,100)); + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + // TODO: Add extra initialization here + DWORD ExStyle=m_FileDownLoadList.GetExtendedStyle (); + ExStyle|=LVS_EX_FULLROWSELECT; + m_FileDownLoadList.SetExtendedStyle (ExStyle); + + CString strSection = GetString(IDS_OFSMESSENGER); + CString strEntry = GetString(IDS_COLUMN_WIDTH); + + m_FileDownLoadList.InsertColumn (0,GetString(IDS_FILENAME_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("10"), 120)); + m_FileDownLoadList.InsertColumn (1,GetString(IDS_SENDER_NAME),LVCFMT_CENTER,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("11"), 110),1); + m_FileDownLoadList.InsertColumn (2,GetString(IDS_STATUS_NAME),LVCFMT_CENTER,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("12"), 90),2); + m_FileDownLoadList.InsertColumn (3,GetString(IDS_PROGRESS_NAME),LVCFMT_RIGHT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("13"), 60),3); + m_FileDownLoadList.InsertColumn (4,GetString(IDS_DATE_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("14"), 90),4); + m_FileDownLoadList.InsertColumn (5,GetString(IDS_FILESIZE_NAME),LVCFMT_RIGHT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("15"), 65),5); + m_FileDownLoadList.InsertColumn (6,GetString(IDS_DESCRIPTION_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("16"), 90 ),6); + + m_iSortingMode = GetOptionInt(IDS_OFSMESSENGER,IDS_INCOMING_FILE,3); + + //m_FileDownLoadList.SetImageList(&m_FileStatusImageList,LVSIL_SMALL); + m_FileDownLoadList.SetImageList(CImageList::FromHandle(GetSystemImageList(TRUE)),LVSIL_SMALL); + + ShowDialog(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +LRESULT CFileDownloadDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + if(pItem->EventType==NLT_EOffLineFiles) + { + theNet2.LockTranslator(); + + IFiles* pFiles = NULL; + + try + { + if(SUCCEEDED(AutoUnMarchaling(pItem,(LPUNKNOWN*)&pFiles))) + { + long Count = pFiles->GetCount(); + for(int i=1;i<=Count;i++) + { + IFilePtr pFilePtr = pFiles->GetItem(i); + + IUserPtr pSender = pFilePtr->GetSender (); + CUser User(pSender); + + if(!pMessenger->GetUserByGlobalId(User.GetGlobalID(),User)) + { + theNet2.LockTranslator(); + try + { + + long DetailsHandle = pSession->UserDetails(User.GetGlobalID(),1); + if(DetailsHandle) + theNet2.AddToTranslator(DetailsHandle,GetSafeHwnd()); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + + AddToOffline(User,pFilePtr); + + } + pFiles->Release(); + } + } + catch(...) + { + } + ASSERT(LoadOfflineFileHandle==pItem->Handel); + theNet2.RemoveFromTranslator(LoadOfflineFileHandle); + theNet2.UnlockTranslator(); + + } + else if(pItem->EventType==NLT_EDetails) + { + IUser *pUser = NULL; + if(SUCCEEDED(AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser))) + { + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(pItem->Handel); + try + { + CUser AddInfoUser(pUser); + RefreshSenderDetails(AddInfoUser); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + pUser->Release(); + } + } + else + { + long Handle = pItem->Handel; + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(pItem->Handel); + theNet2.UnlockTranslator(); + + int iIndex = GetItemFromHandle(Handle); + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iIndex); + + if(pDUFileInfo) + { + switch(pItem->EventType) + { + case NLT_ECommandOK: + if(pMessenger->ConnectEnable() && + pDUFileInfo->iProgress != DP_WAIT&& + pDUFileInfo->iProgress != DP_WAIT_DELETE) + { + ChangeStatus(DS_DOWNLOADED,iIndex); + + theNet2.LockTranslator(); + try + { + BSTR FileID = pDUFileInfo->strFileID.AllocSysString(); + pDUFileInfo->pFile->PuthWnd(0L); + if(pDUFileInfo->Handle = pSession->ConfirmFile(FileID,fcDelete)) + { + ChangeProgress(DP_WAIT,iIndex); + theNet2.AddToTranslator(pDUFileInfo->Handle,this->m_hWnd); + } + ::SysFreeString(FileID); + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + else + { + if(pDUFileInfo->iProgress==DP_WAIT_DELETE) + { + m_LockList.Lock(); + try + { + for(int i = (ListArray.GetSize () - 1); i >= 0;i--) + { + CDUFileInfo *pUFileInfoList = ListArray.GetAt(i); + if(pUFileInfoList == pDUFileInfo) + { + delete pUFileInfoList; + ListArray.RemoveAt (i); + } + } + } + catch(...) + {} + m_LockList.Unlock(); + m_FileDownLoadList.DeleteItem(iIndex); + } + else + ChangeProgress(DP_NONE,iIndex); + } + + if(pDUFileInfo->iStatus==DS_OFFLINE&&!m_bShowOfflineFiles) + { + m_LockList.Lock(); + try + { + for(int i = (ListArray.GetSize () - 1); i >= 0;i--) + { + CDUFileInfo *pUFileInfoList = ListArray.GetAt(i); + if(pUFileInfoList == pDUFileInfo) + { + delete pUFileInfoList; + ListArray.RemoveAt (i); + } + } + } + catch(...) + {} + m_LockList.Unlock(); + m_FileDownLoadList.DeleteItem(iIndex); + } + + break; + case NLT_ECommandError: + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + + if(LoadOfflineFileHandle) + { + LoadOfflineFileHandle = 0L; + MessageBox(GetString(IDS_IBN_FILE_MANAGER_NAME),GetString(IDS_CANT_LOAD_OFFLINE_FILES),MB_OK|MB_ICONSTOP); + } + else + { + if(pItem->Long1==etCANCEL) + ChangeProgress(DP_CANCEL,iIndex); + else + ChangeProgress(DP_ERROR ,iIndex); + } + break; + } + } + } + + BlockOrUnBlock(); + + delete pItem; + return 0; +} + +LRESULT CFileDownloadDlg::OnDownloadBegin(WPARAM w,LPARAM l) +{ + int iIndex = GetItemFromHandle(long(w)); + if(iIndex==-1) ASSERT(FALSE); + ChangeProgress(DP_PROCENT,iIndex,0); + CDUFileInfo *pDUFileInfo = (CDUFileInfo *)m_FileDownLoadList.GetItemData (iIndex); + pDUFileInfo->Size = (long)l; + //CTime tStartTime = CTime::GetCurrentTime(); + //pDUFileInfo->dwTime = (DWORD)tStartTime.GetTime(); + return 0; +} + +LRESULT CFileDownloadDlg::OnDownloadStep(WPARAM w,LPARAM l) +{ + int iIndex = GetItemFromHandle(long(w)); + if(iIndex==-1) ASSERT(FALSE); + ChangeProgress(DP_PROCENT,iIndex,long(l)); + return 0; +} + + + +void CFileDownloadDlg::BlockOrUnBlock() +{ +/* BOOL bFlagSee1,bFlagSee2, bFlagSee3; + + if(LoadOfflineFileHandle) + { + bFlagSee1 = FALSE; + bFlagSee2 = TRUE; + bFlagSee3 = FALSE; + } + else + { + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee1 = bFlagSee2 = bFlagSee3 = TRUE; + + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pDUFileInfop->iStatus == DS_NEW) + { + bFlagSee1&=TRUE; + bFlagSee2&=FALSE; + bFlagSee3&=TRUE; + } + else + if(pDUFileInfop->iStatus == DS_OFFLINE && pDUFileInfop->iProgress == DP_NONE) + { + bFlagSee3&=TRUE; + bFlagSee1&=FALSE; + bFlagSee2&=FALSE; + } + else + { + bFlagSee3&=FALSE; + bFlagSee1&=FALSE; + bFlagSee2&=TRUE; + } + + if(pDUFileInfop->iProgress == DP_COMPLET) + { + bFlagSee3&=FALSE; + bFlagSee1&=FALSE; + bFlagSee2&=FALSE; + } + } + } + else + { + bFlagSee1=FALSE; + bFlagSee2=FALSE; + bFlagSee3 = FALSE; + } + } +*/ + GetDlgItem(IDC_SHOWOFFLINEFILES_CHECK)->EnableWindow(!LoadOfflineFileHandle); + +// m_btnRememberLater.EnableWindow (bFlagSee1); +// m_btnOffLine.EnableWindow (bFlagSee1); +// m_btnDownload.EnableWindow (bFlagSee3); +// m_btnDelete.EnableWindow (bFlagSee3); + +// m_btnCancel.EnableWindow (bFlagSee2); +} + +void CFileDownloadDlg::OnTimer(UINT nIDEvent) +{ + // TODO: Add your message handler code here and/or call default + if(nIDEvent==IDC_DOWNLOAD_TIMER) + { + /*if(bWasSetComplet) + { + m_LockList.Lock(); + try + { + for(int i = (ListArray.GetSize () - 1); i >= 0;i--) + { + CDUFileInfo *pDUFileInfo = ListArray.GetAt(i); + if(pDUFileInfo->iProgress == DP_COMPLET) + { + if(pDUFileInfo->iStatus==DS_OFFLINE&&m_bShowOfflineFiles) + { + pDUFileInfo->iProgress = DP_NONE; + } + else + { + delete pDUFileInfo; + ListArray.RemoveAt (i); + } + } + } + } + catch(...) + {} + m_LockList.Unlock(); + bWasSetComplet = FALSE; + BuildList(); + BlockOrUnBlock(); + } + else + { + //// Анимация Иконок .... //// + }*/ + } + + CResizableDialog::OnTimer(nIDEvent); +} + +void CFileDownloadDlg::OnClose() +{ + // TODO: Add your message handler code here and/or call default + //KillTimer(IDC_DOWNLOAD_TIMER); + + CString strSection = GetString(IDS_OFSMESSENGER); + CString strEntry = GetString(IDS_COLUMN_WIDTH); + + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("10"), m_FileDownLoadList.GetColumnWidth(0)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("11"), m_FileDownLoadList.GetColumnWidth(1)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("12"), m_FileDownLoadList.GetColumnWidth(2)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("13"), m_FileDownLoadList.GetColumnWidth(3)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("14"), m_FileDownLoadList.GetColumnWidth(4)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("15"), m_FileDownLoadList.GetColumnWidth(5)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("16"), m_FileDownLoadList.GetColumnWidth(6)); + + WriteOptionInt(IDS_OFSMESSENGER,IDS_INCOMING_FILE,m_iSortingMode); + + CResizableDialog::OnClose(); +} + +void CFileDownloadDlg::ShowDialog() +{ + //SetTimer(IDC_DOWNLOAD_TIMER,1000,NULL); + ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(); + SetFocus(); +} + +void CFileDownloadDlg::OnItemchangedFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + // TODO: Add your control notification handler code here + BlockOrUnBlock(); + *pResult = 0; +} + +int CALLBACK CFileDownloadDlg::CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + CDUFileInfo *pDUFileInfo1=(CDUFileInfo *)(lParam1); + CDUFileInfo *pDUFileInfo2=(CDUFileInfo *)(lParam2); + + int bValAddon = (lParamSort>=0?1:-1); + + switch(bValAddon*lParamSort) + { + case 1: + // File Name [1/28/2002] + if(pDUFileInfo1->strFileNamestrFileName) return -1*bValAddon; + if(pDUFileInfo1->strFileName>pDUFileInfo2->strFileName) return 1*bValAddon; + break; + case 2: + // Sender [1/28/2002] + if(pDUFileInfo1->Sender.GetShowName()Sender.GetShowName()) return -1*bValAddon; + if(pDUFileInfo1->Sender.GetShowName()>pDUFileInfo2->Sender.GetShowName()) return 1*bValAddon; + break; + case 3: + //// Сортировка по статусу ... + if(pDUFileInfo1->iStatusiStatus) return -1*bValAddon; + if(pDUFileInfo1->iStatus>pDUFileInfo2->iStatus) return 1*bValAddon; + break; + case 4: + // Progress [1/28/2002] + if(pDUFileInfo1->iProgressiProgress) return -1*bValAddon; + if(pDUFileInfo1->iProgress>pDUFileInfo2->iProgress) return 1*bValAddon; + break; + case 5: + // Est.Time [1/28/2002] + if(pDUFileInfo1->dwTimedwTime) return -1*bValAddon; + if(pDUFileInfo1->dwTime>pDUFileInfo2->dwTime) return 1*bValAddon; + break; + case 6: + // FileSize [1/28/2002] + if(pDUFileInfo1->SizeSize) return -1*bValAddon; + if(pDUFileInfo1->Size>pDUFileInfo2->Size) return 1*bValAddon; + break; + case 7: + // Description [1/28/2002] + if(pDUFileInfo1->strMessagestrMessage) return -1*bValAddon; + if(pDUFileInfo1->strMessage>pDUFileInfo2->strMessage) return 1*bValAddon; + break; + } + + return 0; +} + +void CFileDownloadDlg::SortList(int Mode) +{ + /// Mode in Futeres ... + m_FileDownLoadList.SortItems (CompareListItem,(LPARAM)Mode); + + m_SortHeader.SetSortArrow((m_iSortingMode>0?m_iSortingMode:-m_iSortingMode)-1,(m_iSortingMode>0?TRUE:FALSE)); +} + +void CFileDownloadDlg::ChangeStatus(DFileStatus duNewStatus,int iElement) +{ + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iElement); + pDUFileInfo->iStatus = duNewStatus; + m_FileDownLoadList.SetItemText (iElement,2,GetString(strDUStatus[duNewStatus])); + + if(duNewStatus== DS_DOWNLOADED) + { + SaveFileToHistory(pDUFileInfo); + } +} + +BOOL CFileDownloadDlg::FindInList(CString FID) +{ + int nSize=m_FileDownLoadList.GetItemCount (); + + for(int i=0; i < nSize; i++) + { + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (i); + if(pDUFileInfo->strFileID == FID) + return TRUE; + } + + return FALSE; + + +} + +void CFileDownloadDlg::ChangeProgress(DProgressStatus NewProgress, int iElement, long dwGetSize) +{ + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iElement); + + // OZ: Ignore old progress + if(NewProgress == DP_PROCENT && dwGetSize>0 && pDUFileInfo->iProgress == DP_ERROR) + return; + + pDUFileInfo->iProgress = NewProgress; + + if(NewProgress == DP_PROCENT) + { + CString strtmp; + long dwSize=pDUFileInfo->Size; + + // Oleg Zhuk: Fix Problem incorrect transmission percentages [12/4/2003] + long lProgress = long(dwGetSize*1.0/dwSize*100); + if(lProgress>100) + lProgress = 100; + if(lProgress<0) + lProgress = 0; + // Oleg Zhuk End:[12/4/2003] + + strtmp.Format(_T("%d%%"), lProgress); + m_FileDownLoadList.SetItemText (iElement,3,strtmp); + } + else + m_FileDownLoadList.SetItemText (iElement,3,GetString(strDUProgress[NewProgress])); + +} + +int CFileDownloadDlg::GetItemFromHandle(long Handle) +{ + int nSize=m_FileDownLoadList.GetItemCount (); + + for(int i=0; i < nSize; i++) + { + CDUFileInfo *pDUFileInfo=(CDUFileInfo *)m_FileDownLoadList.GetItemData (i); + if(pDUFileInfo->Handle == Handle) + return i; + } + + return -1; +} + +//DEL int CFileDownloadDlg::GetSelectedItem() +//DEL { +//DEL POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); +//DEL return m_FileDownLoadList.GetNextSelectedItem(pos); +//DEL } + +void CFileDownloadDlg::BuildList() +{ + CString tmp; + + m_LockList.Lock(); + //Возможно Умное Удалене .... :) + try + { + m_FileDownLoadList.DeleteAllItems (); + + for(int i = 0;i < ListArray.GetSize ();i++) + { + CDUFileInfo *pDUFileInfo = ListArray.GetAt(i); + int iSubIndex = m_FileDownLoadList.InsertItem (LVIF_TEXT|LVIF_PARAM|LVIF_IMAGE,i,pDUFileInfo->strFileName,0,0,GetIconIndexInSystemImageList(TRUE,pDUFileInfo->strFileName),(LPARAM)pDUFileInfo); + m_FileDownLoadList.SetItemText (iSubIndex,1,LPCTSTR(pDUFileInfo->Sender.GetShowName())); + m_FileDownLoadList.SetItemText (iSubIndex,2,GetString(strDUStatus[pDUFileInfo->iStatus])); + m_FileDownLoadList.SetItemText (iSubIndex,3,GetString(strDUProgress[pDUFileInfo->iProgress])); + // Create Date String [6/19/2002] + SYSTEMTIME sysFileTime = TimeTToSystemTime(pDUFileInfo->dwTime); + TCHAR szDate[MAX_PATH]=_T(""), szTime[MAX_PATH]=_T(""); + + GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&sysFileTime,NULL,szDate,MAX_PATH); + GetTimeFormat(LOCALE_USER_DEFAULT,NULL,&sysFileTime,NULL,szTime,MAX_PATH); + + CString strDataFormat; + strDataFormat.Format(_T("%s %s"),szDate,szTime); + // End Create Date String [6/19/2002] + + m_FileDownLoadList.SetItemText (iSubIndex,4,strDataFormat);// Est.Time ... + m_FileDownLoadList.SetItemText (iSubIndex,5,ByteSizeToStr(pDUFileInfo->Size)); + m_FileDownLoadList.SetItemText (iSubIndex,6,LPCTSTR(pDUFileInfo->strMessage)); + } + + SortList(m_iSortingMode); + } + catch(...) + {} + m_LockList.Unlock(); +} + +void CFileDownloadDlg::AddToDownload(CUser &Sender,IFile *pFile) +{ + CString FID = (char*)pFile->GetFID(); + + if(FindInList(FID)) return; + + + CDUFileInfo *pDUFileInfo = new CDUFileInfo; + + pDUFileInfo->pFile = pFile; + pDUFileInfo->bOut = FALSE; + pDUFileInfo->Size = pFile->GetSize(); + pDUFileInfo->dwTime = pFile->Getdate_time(); + pDUFileInfo->iProgress = DP_NONE; + pDUFileInfo->iStatus = DS_NEW; + pDUFileInfo->strFileID = FID; + _bstr_t Test = pFile->GetRealName(); + pDUFileInfo->strFileName = (char*)Test; + pDUFileInfo->strFileURL = "Not use"; + pDUFileInfo->strLocalPath = ""; + pDUFileInfo->strMessage = (char*)pFile->GetBody(); + pDUFileInfo->strRecepient = "You"; + pDUFileInfo->Sender = Sender; + pDUFileInfo->Handle = 0; + + m_LockList.Lock(); + try + { + ListArray.Add (pDUFileInfo); + } + catch(...) + {} + m_LockList.Unlock(); + + + BuildList(); + + BlockOrUnBlock(); + + //ShowDialog(); +} + + +void CFileDownloadDlg::OnCancelButton() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos==NULL) return; + + if(pMessenger->ConnectEnable () ) + { + if(LoadOfflineFileHandle) + { + try + { + pSession->CancelOperation(LoadOfflineFileHandle); + } + catch(...) + { + } + } + else + { + while(pos) + { + CDUFileInfo *pDUFileInfo = NULL; + + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + pDUFileInfo = (CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + try + { + pSession->CancelOperation(pDUFileInfo->Handle); + } + catch(...) + { + } + } + } + } + BlockOrUnBlock(); +} + +void CFileDownloadDlg::AddToOffline(CUser &Sender, IFile *pFile) +{ + CString FID = (char*)pFile->GetFID(); + + if(FindInList(FID)) return; + + CDUFileInfo *pDUFileInfo = new CDUFileInfo; + + pDUFileInfo->pFile = pFile; + pDUFileInfo->bOut = FALSE; + pDUFileInfo->Size = pFile->GetSize(); + pDUFileInfo->dwTime = pFile->Getdate_time(); + pDUFileInfo->iProgress = DP_NONE; + pDUFileInfo->iStatus = DS_OFFLINE; + pDUFileInfo->strFileID = FID; + pDUFileInfo->strFileName = (char*)pFile->GetRealName(); + pDUFileInfo->strFileURL = "Not use"; + pDUFileInfo->strLocalPath = ""; + pDUFileInfo->strMessage = (char*)pFile->GetBody(); + pDUFileInfo->strRecepient = _T("You"); + pDUFileInfo->Sender = Sender; + pDUFileInfo->Handle = 0; + + m_LockList.Lock(); + try + { + ListArray.Add (pDUFileInfo); + } + catch(...) + {} + m_LockList.Unlock(); + + + BuildList(); + + BlockOrUnBlock(); + + ShowDialog(); +} + +void CFileDownloadDlg::OnShowofflinefilesCheck() +{ + ///UpdateData(); + + if(m_bShowOfflineFiles) + { + // Load Offline Files from Server [1/28/2002] + if(pMessenger->ConnectEnable()) + { + theNet2.LockTranslator(); + try + { + + LoadOfflineFileHandle = pSession->LoadOffLineFiles(); + if(LoadOfflineFileHandle) + theNet2.AddToTranslator(LoadOfflineFileHandle,GetSafeHwnd()); + } + catch (...) + { + } + theNet2.UnlockTranslator(); + } + } + else + { + // Delete All Offline Files + m_LockList.Lock(); + //Возможно Умное Удалене .... :) + try + { + for(int i = (ListArray.GetSize ()-1);i >=0 ;i--) + { + CDUFileInfo *pDUFileInfo = ListArray.GetAt(i); + if(pDUFileInfo->iStatus==DS_OFFLINE) + { + ListArray.RemoveAt(i); + delete pDUFileInfo; + pDUFileInfo = NULL; + } + } + } + catch(...) + {} + m_LockList.Unlock(); + BuildList(); + } + BlockOrUnBlock(); +} + +void CFileDownloadDlg::OnItemclickFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; + + if((phdn->iItem+1)==(m_iSortingMode>=0?m_iSortingMode:-m_iSortingMode)) + m_iSortingMode = -1*m_iSortingMode; + else + m_iSortingMode = phdn->iItem+1; + + SortList(m_iSortingMode); + + *pResult = 0; +} + +void CFileDownloadDlg::OnDblclkFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + if(pNMListView->iItem!=-1) + { + CDUFileInfo *pDUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (pNMListView->iItem); + + if(pDUFileInfop!=NULL) + { + if(pDUFileInfop->iStatus!=DS_DOWNLOADED) + { + if(pDUFileInfop->iProgress!=DP_WAIT&& + pDUFileInfop->iProgress!=DP_WAIT_DELETE&& + pDUFileInfop->iProgress!=DP_PROCENT) + { + OnDownloadButton(); + } + } + else + { + OnFiledownloadOpen(); + } + /*CFileDescriptioDlg DescrDlg(this); + DescrDlg.m_strFileName = pDUFileInfop->strFileName; + DescrDlg.DoModalReadMode(pDUFileInfop->strMessage);*/ + } + } + + *pResult = 0; +} + +void CFileDownloadDlg::RefreshSenderDetails(CUser &User) +{ + BOOL bWasChange = FALSE; + m_LockList.Lock(); + try + { + for(int i = 0;i < ListArray.GetSize ();i++) + { + CDUFileInfo *pDUFileInfo = ListArray.GetAt(i); + if(pDUFileInfo->Sender==User) + { + pDUFileInfo->Sender = User; + bWasChange = TRUE; + } + } + } + catch(...) + {} + m_LockList.Unlock (); + + if(bWasChange) + { + BuildList(); + BlockOrUnBlock(); + } +} + +void CFileDownloadDlg::DeleteAllItem() +{ + m_bShowOfflineFiles = FALSE; + while(ListArray.GetSize () ) + { + delete ListArray.GetAt (0); + ListArray.RemoveAt (0); + } + m_FileDownLoadList.DeleteAllItems (); + m_lastUserId = 0; +} + +BOOL CFileDownloadDlg::LoadFilesHistory() +{ + if(m_lastUserId==pMessenger->GetUserID()) + return TRUE; + + m_lastUserId=pMessenger->GetUserID(); + + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),pMessenger->GetUserRole(),pMessenger->GetUserID()); + + CString strUploadedFilesXML = GetRegFileText(strSection,GetString(IDS_INCOMING_FILE)); + + /************************************************************************/ + /* + + + + + + + + + + */ + /************************************************************************/ + HRESULT hr = S_OK; + + if(!strUploadedFilesXML.IsEmpty()) + { + // Step 1. Load to XML Document [3/26/2002] + CComPtr pDoc = NULL; + hr = pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + if(SUCCEEDED(hr)) + { + VARIANT_BOOL varLoad = VARIANT_FALSE; + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + + if(SUCCEEDED(hr)&&varLoad==VARIANT_TRUE) + { + CComPtr pFileList = NULL; + hr = pDoc->selectNodes(CComBSTR(L"file_history/file"),&pFileList); + if(SUCCEEDED(hr)&&pFileList!=NULL) + { + long Count = 0; + pFileList->get_length(&Count); + for(long i=0;i pFile = NULL; + pFileList->get_item(i,&pFile); + if(pFile!=NULL) + { + CComVariant varFID; + CComBSTR bsBody, bsRealName, bsSize, bsSenderId, bsPath, bsDate; + GetAttribute(pFile,CComBSTR(L"fid"),&varFID); + GetTextByPath(pFile,CComBSTR(L"body"),&bsBody); + GetTextByPath(pFile,CComBSTR(L"real_name"),&bsRealName); + GetTextByPath(pFile,CComBSTR(L"size"),&bsSize); + GetTextByPath(pFile,CComBSTR(L"sender_id"),&bsSenderId); + GetTextByPath(pFile,CComBSTR(L"path"),&bsPath); + GetTextByPath(pFile,CComBSTR(L"date"),&bsDate); + + CDUFileInfo *pNewFile = new CDUFileInfo; + + pNewFile->strFileID = varFID.bstrVal; + pNewFile->Size = _wtol(bsSize); + pNewFile->dwTime = _wtol(bsDate); + pNewFile->Handle = 0; + pNewFile->iProgress = DP_COMPLET; + pNewFile->iStatus = DS_DOWNLOADED; + pNewFile->strFileName = bsRealName; + pNewFile->strMessage = bsBody; + pNewFile->strLocalPath = bsPath; + pNewFile->Sender.SetGlobalID(_wtol(bsSenderId)); + + if(!pMessenger->GetUserByGlobalId(pNewFile->Sender.GetGlobalID(),pNewFile->Sender)) + { + // TODO: Load User Details [3/27/2002] + theNet2.LockTranslator(); + try + { + + long DetailsHandle = pSession->UserDetails(pNewFile->Sender.GetGlobalID(),1); + if(DetailsHandle) + theNet2.AddToTranslator(DetailsHandle,GetSafeHwnd()); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + + m_LockList.Lock(); + try + { + ListArray.Add (pNewFile); + } + catch(...) + { + } + m_LockList.Unlock(); + + } + + } + BuildList(); + } + } + } + } + + return SUCCEEDED(hr); +} + +BOOL CFileDownloadDlg::SaveFileToHistory(CDUFileInfo *pDUFileInfo) +{ + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),pMessenger->GetUserRole(),pMessenger->GetUserID()); + + CString strUploadedFilesXML = GetRegFileText(strSection,GetString(IDS_INCOMING_FILE)); + + /************************************************************************/ + /* + + + + + + + + + + + */ + /************************************************************************/ + HRESULT hr = S_OK; + + // Step 1. Load to XML Document [3/26/2002] + CComPtr pDoc = NULL; + hr = pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + if(SUCCEEDED(hr)) + { + VARIANT_BOOL varLoad = VARIANT_FALSE; + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + + strUploadedFilesXML = _T(""); + + if(varLoad!=VARIANT_TRUE) + { + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + } + + if(SUCCEEDED(hr)&&varLoad==VARIANT_TRUE) + { + CComPtr pFileHistory = NULL; + + hr = pDoc->selectSingleNode(CComBSTR(L"file_history"),&pFileHistory); + if(pFileHistory==NULL) + { + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + hr = pDoc->selectSingleNode(CComBSTR(L"file_history"),&pFileHistory); + } + + if(pFileHistory!=NULL) + { + CComPtr pFileCurrent = NULL; + + CString strFindFile; + strFindFile.Format(_T("file[@fid=\"%d\"]"),pDUFileInfo->strFileID); + + pFileHistory->selectSingleNode(CComBSTR(strFindFile),&pFileCurrent); + + if(pFileCurrent==NULL) + { + hr = insertSingleNode(pFileHistory,CComBSTR(L"file"),NULL,NULL,&pFileCurrent); + + if(pFileCurrent!=NULL) + { + CComBSTR bsSize, bsSenderId, bsDate; + VarBstrFromI4(pDUFileInfo->Size,NULL,LOCALE_NOUSEROVERRIDE,&bsSize); + VarBstrFromI4(pDUFileInfo->Sender.GetGlobalID(),NULL,LOCALE_NOUSEROVERRIDE,&bsSenderId); + VarBstrFromI4(pDUFileInfo->dwTime,NULL,LOCALE_NOUSEROVERRIDE,&bsDate); + + + insertSingleAttribut(pFileCurrent,CComBSTR(L"fid"),CComVariant(pDUFileInfo->strFileID)); + insertSingleNode(pFileCurrent,CComBSTR(L"body"),NULL,CComBSTR((LPCTSTR)pDUFileInfo->strMessage)); + insertSingleNode(pFileCurrent,CComBSTR(L"real_name"),NULL,CComBSTR((LPCTSTR)pDUFileInfo->strFileName)); + insertSingleNode(pFileCurrent,CComBSTR(L"size"),NULL,bsSize); + insertSingleNode(pFileCurrent,CComBSTR(L"path"),NULL,CComBSTR(pDUFileInfo->strLocalPath)); + insertSingleNode(pFileCurrent,CComBSTR(L"sender_id"),NULL,bsSenderId); + insertSingleNode(pFileCurrent,CComBSTR(L"date"),NULL,bsDate); + } + } + } + if(SUCCEEDED(hr)) + { + CComBSTR bsOutXML; + pDoc->get_xml(&bsOutXML); + SetRegFileText(strSection,GetString(IDS_INCOMING_FILE),CString(bsOutXML)); + } + } + } + + return SUCCEEDED(hr); +} + +void CFileDownloadDlg::OnRclickFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + CPoint point; + GetCursorPos(&point); + CMenu menu; + menu.LoadMenu(IDR_MESSENGER_MENU); + CMenu* popup = menu.GetSubMenu(6); + UpdateMenu(this,popup); + popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); + + *pResult = 0; +} + +void CFileDownloadDlg::OnFiledownloadCanceltransform() +{ + OnCancelButton(); + +} + +void CFileDownloadDlg::OnUpdateFiledownloadCanceltransform(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pUFileInfop->iProgress != DP_WAIT &&pUFileInfop->iProgress != DP_PROCENT) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +void CFileDownloadDlg::OnFiledownloadClearrecord() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus==DS_DOWNLOADED) + { + RemoveFileFromHistory(pUFileInfop); + + m_LockList.Lock(); + try + { + for(int i = (ListArray.GetSize () - 1); i >= 0;i--) + { + CDUFileInfo *pUFileInfoList = ListArray.GetAt(i); + if(pUFileInfoList == pUFileInfop) + { + delete pUFileInfoList; + ListArray.RemoveAt (i); + } + } + } + catch(...) + {} + m_LockList.Unlock(); + + m_FileDownLoadList.DeleteItem(iSel); + + pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + } + else + { + theNet2.LockTranslator(); + try + { + BSTR FileID = pUFileInfop->strFileID.AllocSysString(); + if(pUFileInfop->Handle = pSession->ConfirmFile(FileID,fcDelete)) + { + ChangeProgress(DP_WAIT_DELETE,iSel); + theNet2.AddToTranslator(pUFileInfop->Handle,this->m_hWnd); + } + ::SysFreeString(FileID); + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + } + } +} + +void CFileDownloadDlg::OnUpdateFiledownloadClearrecord(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pUFileInfop->iProgress == DP_WAIT || pUFileInfop->iProgress == DP_PROCENT) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +void CFileDownloadDlg::OnFiledownloadDownload() +{ + OnDownloadButton(); +} + +void CFileDownloadDlg::OnUpdateFiledownloadDownload(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pUFileInfop->iProgress == DP_WAIT ||pUFileInfop->iProgress == DP_PROCENT ||pUFileInfop->iStatus==DS_DOWNLOADED) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +void CFileDownloadDlg::OnFiledownloadInformation() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pDUFileInfop!=NULL) + { + CFileDescriptioDlg DescrDlg(this); + DescrDlg.m_strFileName = pDUFileInfop->strFileName; + DescrDlg.DoModalReadMode(pDUFileInfop->strMessage); + } + } + +} + +void CFileDownloadDlg::OnUpdateFiledownloadInformation(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + } + + pCmdUI->Enable(bFlagSee); + +} + +void CFileDownloadDlg::OnFiledownloadMovetooffline() +{ + OnOfflineButton(); +} + +void CFileDownloadDlg::OnUpdateFiledownloadMovetooffline(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pUFileInfop->iProgress == DP_WAIT ||pUFileInfop->iProgress == DP_PROCENT ||pUFileInfop->iStatus!=DS_NEW) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +void CFileDownloadDlg::OnFiledownloadOpen() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pDUFileInfop!=NULL) + { + long hInstance = (long)ShellExecute(GetSafeHwnd(),_T("open"),pDUFileInfop->strLocalPath,NULL,NULL,SW_SHOWNORMAL); + + if(hInstance<=32) + { + switch(hInstance) + { + case SE_ERR_NOASSOC: + case SE_ERR_ASSOCINCOMPLETE: + { + CString sOpenWithDlgPath = _T("shell32.dll,OpenAs_RunDLL ") + pDUFileInfop->strLocalPath; + ShellExecute(NULL,_T("open"),_T("Rundll32.exe"), sOpenWithDlgPath, NULL, SW_SHOWNORMAL); + } + break; + default: + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + + MessageBox((LPCTSTR)lpMsgBuf,GetString(IDS_OPEN_FILE_ERROR_NAME),MB_OK | MB_ICONINFORMATION ); + + // Free the buffer. + LocalFree( lpMsgBuf ); + } + } + } + } +} + +void CFileDownloadDlg::OnUpdateFiledownloadOpen(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus!=DS_DOWNLOADED) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +BOOL CFileDownloadDlg::RemoveFileFromHistory(CDUFileInfo *pDUFileInfo) +{ + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),pMessenger->GetUserRole(),pMessenger->GetUserID()); + + CString strUploadedFilesXML = GetRegFileText(strSection,GetString(IDS_INCOMING_FILE)); + + HRESULT hr = S_OK; + + // Step 1. Load to XML Document [3/26/2002] + CComPtr pDoc = NULL; + hr = pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + if(SUCCEEDED(hr)) + { + VARIANT_BOOL varLoad = VARIANT_FALSE; + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + + if(SUCCEEDED(hr)&&varLoad==VARIANT_TRUE) + { + CComPtr pFileHistory = NULL; + + hr = pDoc->selectSingleNode(CComBSTR(L"file_history"),&pFileHistory); + + if(pFileHistory!=NULL) + { + CComPtr pFileCurrent = NULL; + + CString strFindFile; + strFindFile.Format(_T("file[@fid=\"%s\"]"),pDUFileInfo->strFileID); + + pFileHistory->selectSingleNode(CComBSTR(strFindFile),&pFileCurrent); + + if(pFileCurrent!=NULL) + { + hr = pFileHistory->removeChild(pFileCurrent,NULL); + if(SUCCEEDED(hr)) + { + CComBSTR bsOutXML; + pDoc->get_xml(&bsOutXML); + SetRegFileText(strSection,GetString(IDS_INCOMING_FILE),CString(bsOutXML)); + } + } + } + } + } + + return SUCCEEDED(hr); +} + +void CFileDownloadDlg::OnFiledownloadGotodir() +{ + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pDUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pDUFileInfop!=NULL) + { + CString strDir = pDUFileInfop->strLocalPath.Left(pDUFileInfop->strLocalPath.ReverseFind(_T('\\'))); + long hInstance = (long)ShellExecute(GetSafeHwnd(),_T("explore"),strDir,NULL,NULL,SW_SHOWNORMAL); + if(hInstance<=32) + { + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + + MessageBox((LPCTSTR)lpMsgBuf,GetString(IDS_OPEN_FILE_ERROR_NAME),MB_OK | MB_ICONINFORMATION ); + + // Free the buffer. + LocalFree( lpMsgBuf ); + } + } + } +} + +void CFileDownloadDlg::OnUpdateFiledownloadGotodir(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileDownLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileDownLoadList.GetNextSelectedItem(pos); + + CDUFileInfo *pUFileInfop=(CDUFileInfo *)m_FileDownLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus!=DS_DOWNLOADED) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + + +BOOL CFileDownloadDlg::PreTranslateMessage(MSG* pMsg) +{ + if(pMsg->message==WM_KEYDOWN) + { + switch(pMsg->wParam) + { + case VK_ESCAPE: + if(m_FileDownLoadList.GetEditControl() && pMsg->hwnd==m_FileDownLoadList.GetEditControl()->GetSafeHwnd()) + { + } + else + ((CDialog*)GetParent())->EndDialog(IDCANCEL); + break; + } + } + + return CResizableDialog::PreTranslateMessage(pMsg); +} \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/FileDownloadDlg.h b/Source/Client/IM-Client/IMClient/FileDownloadDlg.h new file mode 100644 index 0000000..b08a429 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileDownloadDlg.h @@ -0,0 +1,161 @@ +#if !defined(AFX_FILEDOWNLOADDLG_H__C7DF052D_6E04_4947_8AE0_0BB1F961A79E__INCLUDED_) +#define AFX_FILEDOWNLOADDLG_H__C7DF052D_6E04_4947_8AE0_0BB1F961A79E__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// FileDownloadDlg.h : header file +// +#include "ResizableDialog.h" +#include "User.h" + +///////////////////////////////////////////////////////////////////////////// +// CFileDownloadDlg dialog +class CMainDlg; + +#include "SortHeaderCtrl.h" + +class CFileDownloadDlg : public CResizableDialog +{ +private: + +enum DFileStatus +{ + DS_NEW = 0, + DS_OFFLINE , + DS_DOWNLOADED , +}; + +enum DProgressStatus +{ + DP_NONE = 0, + DP_WAIT, + DP_WAIT_DELETE, + DP_PROCENT , + DP_COMPLET, + DP_CANCEL, + DP_ERROR +}; + +struct CDUFileInfo +{ + CString strFileID; + CString strFileName; + CString strFileURL; + CString strLocalPath; + CUser Sender; + CString strRecepient; + CString strMessage; + long Size; + time_t dwTime; + BOOL bOut; // TRUE UpLoad File ; FALSE Download File; + DFileStatus iStatus; + DProgressStatus iProgress; + long Handle; + IFilePtr pFile; +}; + +// Construction +public: + CFileDownloadDlg(CWnd* pParent = NULL); // standard constructor + virtual ~CFileDownloadDlg(); +// Dialog Data + //{{AFX_DATA(CFileDownloadDlg) + enum { IDD = IDD_DOWNLOAD_DIALOG }; + CButton m_btnRememberLater; + CButton m_btnOffLine; + CButton m_btnCancel; + CButton m_btnDownload; + CButton m_btnDelete; + CListCtrl m_FileDownLoadList; + BOOL m_bShowOfflineFiles; + + CImageList m_FileStatusImageList; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileDownloadDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +public: + BOOL LoadFilesHistory(); + void DeleteAllItem(); + void RefreshSenderDetails(CUser& User); + void AddToOffline(CUser &Sender,IFile *pFile); + void SetMessanger(CMainDlg *pMessenger); + void AddToDownload(CUser &Sender,IFile *pFile); + void ShowDialog(); + afx_msg void OnOfflineButton(); + afx_msg void OnDeleteButton(); + afx_msg void OnRememberlaterButton(); + afx_msg void OnDownloadButton(); + afx_msg void OnCancelButton(); + afx_msg void OnShowofflinefilesCheck(); + +protected: + CSortHeaderCtrl m_SortHeader; + BOOL RemoveFileFromHistory(CDUFileInfo *pDUFileInfo); + long LoadOfflineFileHandle; + CMainDlg *pMessenger; + ISessionPtr pSession; + void BlockOrUnBlock(); + BOOL bWasSetComplet; + CCriticalSection m_LockList; + CArray ListArray; + long m_lastUserId; + + BOOL SaveFileToHistory(CDUFileInfo *pDUFileInfo); + void BuildList(); + int GetItemFromHandle(long Handle); + void ChangeProgress(DProgressStatus NewProgress, int iElement, long dwGetSize=0L); + BOOL FindInList(CString FID); + void ChangeStatus(DFileStatus duNewStatus,int iElement); + void SortList(int Mode=2); + static int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + //DWORD Handle; + CArray Array; + LRESULT OnNetEvent(WPARAM w,LPARAM l); + LRESULT OnDownloadBegin(WPARAM w,LPARAM l); + LRESULT OnDownloadStep(WPARAM w,LPARAM l); + + int m_iSortingMode; + // Generated message map functions + //{{AFX_MSG(CFileDownloadDlg) + afx_msg void OnOk(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnTimer(UINT nIDEvent); + afx_msg void OnClose(); + afx_msg void OnItemchangedFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnItemclickFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnDblclkFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickFileDownloadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnFiledownloadCanceltransform(); + afx_msg void OnUpdateFiledownloadCanceltransform(CCmdUI* pCmdUI); + afx_msg void OnFiledownloadClearrecord(); + afx_msg void OnUpdateFiledownloadClearrecord(CCmdUI* pCmdUI); + afx_msg void OnFiledownloadDownload(); + afx_msg void OnUpdateFiledownloadDownload(CCmdUI* pCmdUI); + afx_msg void OnFiledownloadInformation(); + afx_msg void OnUpdateFiledownloadInformation(CCmdUI* pCmdUI); + afx_msg void OnFiledownloadMovetooffline(); + afx_msg void OnUpdateFiledownloadMovetooffline(CCmdUI* pCmdUI); + afx_msg void OnFiledownloadOpen(); + afx_msg void OnUpdateFiledownloadOpen(CCmdUI* pCmdUI); + afx_msg void OnFiledownloadGotodir(); + afx_msg void OnUpdateFiledownloadGotodir(CCmdUI* pCmdUI); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_FILEDOWNLOADDLG_H__C7DF052D_6E04_4947_8AE0_0BB1F961A79E__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/FileDownloader.cpp b/Source/Client/IM-Client/IMClient/FileDownloader.cpp new file mode 100644 index 0000000..7e59fcb --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileDownloader.cpp @@ -0,0 +1,152 @@ +// FileDownloader.cpp: implementation of the CFileDownloader class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "ofstv.h" +#include "FileDownloader.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CFileDownloader::CFileDownloader() +{ + m_strUrl = _T(""); + m_MessageWnd = 0; + m_RetMessage = 0; + m_hWorkTread = NULL; + m_dwWorkTreadId = 0; + m_Data = NULL; +} + +CFileDownloader::~CFileDownloader() +{ + if(m_Data) + { + m_Data->Release(); + m_Data = NULL; + } +} + +////////////////////////////////////////////////////////////////////////// +BOOL CFileDownloader::Init(HWND hWnd, UINT msg) +{ + m_MessageWnd = hWnd; + m_RetMessage = msg; + return TRUE; +} + +BOOL CFileDownloader::Load(LPCTSTR szUrl) +{ + if(IsDownload()) + return FALSE; + + if(szUrl!=NULL) + m_strUrl = szUrl; + + if(m_strUrl.IsEmpty()) + return FALSE; + + + m_hWorkTread = CreateThread(NULL,0,trWorkThread,(LPVOID)this,0,&m_dwWorkTreadId); + + return IsDownload(); +} + +BOOL CFileDownloader::Save(LPCTSTR szPath) +{ + if(!m_Data) + return FALSE; + + HANDLE hFile = CreateFile(szPath,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + + if(hFile==INVALID_HANDLE_VALUE) + return FALSE; + + LARGE_INTEGER li = {0,0}; + m_Data->Seek(li,STREAM_SEEK_SET ,NULL); + + const ULONG BufferSize = 60000; + + BYTE Buffer[BufferSize]; + DWORD dwRealReadToBuffer = 0; + + do + { + if(SUCCEEDED(m_Data->Read(Buffer,BufferSize,&dwRealReadToBuffer))) + WriteFile(hFile,Buffer,dwRealReadToBuffer,&dwRealReadToBuffer,NULL); + } + while(BufferSize==dwRealReadToBuffer); + + CloseHandle(hFile); + + return TRUE; +} + + +DWORD CFileDownloader::trWorkThread(LPVOID lParam) +{ + ((CFileDownloader*)lParam)->DownloadBody(); + return 0; +} + +BOOL CFileDownloader::IsDownload() +{ + if(m_hWorkTread) + return TRUE; + else + return FALSE; +} + +void CFileDownloader::DownloadBody() +{ + if(m_Data) + { + m_Data->Release(); + m_Data = NULL; + } + + HRESULT ErrorCode = m_HTTPDownloader.Load(m_strUrl,&m_Data); + + CloseHandle(m_hWorkTread); + m_hWorkTread = NULL; + + PostMessage(m_MessageWnd,m_RetMessage,ErrorCode,NULL); + +} + +BOOL CFileDownloader::StopDownload(DWORD WaitTime) +{ + if(IsDownload()) + { + m_HTTPDownloader.Abort(); + DWORD dwExitCode = WaitForSingleObject(m_hWorkTread,WaitTime); + if(dwExitCode==WAIT_TIMEOUT) + { + TerminateThread(m_hWorkTread,2); + CloseHandle(m_hWorkTread); + m_hWorkTread = NULL; + } + } + return TRUE; +} + +BOOL CFileDownloader::Clear() +{ + if(IsDownload()) + return FALSE; + + if(m_Data) + { + m_Data->Release(); + m_Data = NULL; + } + return TRUE; +} diff --git a/Source/Client/IM-Client/IMClient/FileDownloader.h b/Source/Client/IM-Client/IMClient/FileDownloader.h new file mode 100644 index 0000000..99042ed --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileDownloader.h @@ -0,0 +1,39 @@ +// FileDownloader.h: interface for the CFileDownloader class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_FILEDOWNLOADER_H__DFC272F7_58F8_4631_AA12_B44536D6A479__INCLUDED_) +#define AFX_FILEDOWNLOADER_H__DFC272F7_58F8_4631_AA12_B44536D6A479__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "HttpDownloader.h" + +class CFileDownloader +{ +public: + CFileDownloader(); + virtual ~CFileDownloader(); +public: + BOOL Clear(); + BOOL StopDownload(DWORD WaitTime=1000); + BOOL IsDownload(); + BOOL Init(HWND hWnd, UINT msg); + BOOL Load(LPCTSTR szUrl); + BOOL Save(LPCTSTR szPath); +private: + void DownloadBody(); + CHttpDownloader m_HTTPDownloader; + CString m_strUrl; + HWND m_MessageWnd; + UINT m_RetMessage; + HANDLE m_hWorkTread; + DWORD m_dwWorkTreadId; + LPSTREAM m_Data; +protected: + static DWORD WINAPI trWorkThread(LPVOID lParam); +}; + +#endif // !defined(AFX_FILEDOWNLOADER_H__DFC272F7_58F8_4631_AA12_B44536D6A479__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/FileExplore.cpp b/Source/Client/IM-Client/IMClient/FileExplore.cpp new file mode 100644 index 0000000..358da44 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileExplore.cpp @@ -0,0 +1,1454 @@ +// FileExplore.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "FileExplore.h" +#include "GlobalFunction.h" + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + + +#define WM_HANDLE_DRAG (WM_USER + 100) +#define WM_REFRESHPATH (WM_USER + 101) + +///////////////////////////////////////////////////////////////////////////// +// CFileExplore dialog + + +CFileExplore::CFileExplore(CWnd* pParent /*=NULL*/) + : CResizableDialog(CFileExplore::IDD, pParent),m_OleFileListDropSource(this),m_OleDirTreeDropTarget(this),m_OleFileListDropTarget(this) +{ + //{{AFX_DATA_INIT(CFileExplore) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + m_strDefaultPath = _T(""); + m_strStartFolder = _T(""); + m_hRoot = NULL; + m_bSplitterMove = FALSE; + m_dwBkColor = GetSysColor(COLOR_MENU); + + m_pDragImage = NULL; + m_bImageHidden = TRUE; +} + + +void CFileExplore::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CFileExplore) + DDX_Control(pDX, IDC_VSPLITTER, m_VSplitter); + DDX_Control(pDX, IDC_FILE_LIST, m_FileList); + DDX_Control(pDX, IDC_DIRECTORY_TREE, m_DirTree); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CFileExplore, CResizableDialog) +//{{AFX_MSG_MAP(CFileExplore) + ON_NOTIFY(TVN_ITEMEXPANDED, IDC_DIRECTORY_TREE, OnItemexpandedDirectoryTree) + ON_NOTIFY(TVN_SELCHANGED, IDC_DIRECTORY_TREE, OnSelchangedDirectoryTree) + ON_WM_LBUTTONDOWN() + ON_WM_LBUTTONUP() + ON_WM_SETCURSOR() + ON_WM_CANCELMODE() + ON_WM_MOUSEMOVE() + ON_WM_ERASEBKGND() + ON_WM_DESTROY() + ON_WM_CLOSE() + ON_NOTIFY(NM_RCLICK, IDC_DIRECTORY_TREE, OnRclickDirectoryTree) + ON_NOTIFY(NM_RCLICK, IDC_FILE_LIST, OnRclickFileList) + ON_NOTIFY(NM_DBLCLK, IDC_FILE_LIST, OnDblclkFileList) + ON_NOTIFY(TVN_ENDLABELEDIT, IDC_DIRECTORY_TREE, OnEndlabeleditDirectoryTree) + ON_NOTIFY(LVN_ENDLABELEDIT, IDC_FILE_LIST, OnEndlabeleditFileList) + ON_NOTIFY(LVN_BEGINDRAG, IDC_FILE_LIST, OnBegindragFileList) + ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickFileList) + //}}AFX_MSG_MAP + ON_MESSAGE(WM_HANDLE_DRAG, OnHandleDrag) + ON_MESSAGE(WM_REFRESHPATH,OnRefreshPath) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CFileExplore message handlers + +void CFileExplore::OnOK() +{ +} + +void CFileExplore::OnCancel() +{ +} + +BOOL CFileExplore::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + //m_CheckHeader.Create(IDB_TRAYSTATUS_BITMAP,16,0,0xFF00FF); + //m_FileList.GetHeaderCtrl()->SetImageList(&m_CheckHeader); + m_SortHeader.SubclassWindow(m_FileList.GetHeaderCtrl()->GetSafeHwnd()); + + m_iSortingMode = GetOptionInt(IDS_OFSMESSENGER,IDS_FILEL,1); + + m_hSplitter = AfxGetApp()->LoadCursor(IDC_SPLITH); + + ShowSizeGrip(FALSE); + + //m_FileList.SetExtendedStyle (m_FileList.GetExtendedStyle ()|LVS_EX_FULLROWSELECT); + + m_FileList.SetImageList(CImageList::FromHandle(GetSystemImageList(TRUE)),LVSIL_SMALL); + + CString strSection = GetString(IDS_OFSMESSENGER); + CString strEntry = GetString(IDS_COLUMN_WIDTH); + + m_FileList.InsertColumn(0,GetString(IDS_FILENAME_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("30"), 150)); + m_FileList.InsertColumn(1,GetString(IDS_FILESIZE_NAME),LVCFMT_RIGHT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("33"), 80),3); + m_FileList.InsertColumn(2,GetString(IDS_FILETYPE_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("32"), 130),2); + m_FileList.InsertColumn(3,GetString(IDS_FILEMODIFIED_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("31"), 125),1); + + + m_DirTree.SetImageList(CImageList::FromHandle(GetSystemImageList(TRUE)),TVSIL_NORMAL); + + //m_hRoot = CreateTreeItem(TVI_ROOT,GetString(IDS_MYDOCUMENTS)); + //LoadTreeByPath(m_hRoot,m_strStartFolder); + //m_DirTree.Expand(m_hRoot,TVE_EXPAND); + +/* CString strDefaultPath = GetDefaultPath(); + CString strPathAddon = GetStartFolder(); + while(!strDefaultPath.IsEmpty()) + { + int Pos = strDefaultPath.Find(_T('\\')); + if(Pos==-1) + { + strPathAddon += _T('\\')+strDefaultPath; + } + else + { + strPathAddon += _T('\\')+strDefaultPath.Left(Pos); + strDefaultPath = strDefaultPath.Mid(Pos+1); + } + LoadTreeByPath(m_hRoot,m_strStartFolder); + }*/ + + AddAnchor(&m_DirTree,CSize(0,0),CSize(0,100)); + AddAnchor(&m_VSplitter,CSize(0,0),CSize(0,100)); + AddAnchor(&m_FileList,CSize(0,0),CSize(100,100)); + + HANDLE hHanle1 = GetProp(m_FileList.GetSafeHwnd(),(LPCTSTR)(DWORD)0xC01C); + + m_OleFileListDropTarget.Register(&m_FileList); + m_OleDirTreeDropTarget.Register(&m_DirTree); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CFileExplore::SetDefaultPath(LPCTSTR strPath) +{ + m_strDefaultPath = strPath; +} + +LPCTSTR CFileExplore::GetDefaultPath() +{ + return m_strDefaultPath; +} + +void CFileExplore::SetStartFolder(LPCTSTR strPath) +{ + if(m_strStartFolder.CompareNoCase(strPath)) + { + m_strStartFolder = strPath; + + if(IsWindow(GetSafeHwnd())) + { + m_DirTree.DeleteAllItems(); + //m_FileList.DeleteAllItems(); + FileListDeleteAllItem(); + m_hRoot = CreateTreeItem(TVI_ROOT,GetString(IDS_MYDOCUMENTS)); + LoadTreeByPath(m_hRoot,m_strStartFolder); + m_DirTree.Expand(m_hRoot,TVE_EXPAND); + m_DirTree.SelectItem(m_hRoot); + + m_FolderNotify.Stop(); + m_FolderNotify.DeleteAllPath(); + m_FolderNotify.AddPath(strPath,TRUE,FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_SIZE); + m_FolderNotify.Start(GetSafeHwnd(),WM_REFRESHPATH); + } + } +} + +LPCTSTR CFileExplore::GetStartFolder() +{ + return m_strStartFolder; +} + +BOOL CFileExplore::LoadFilesByPath(LPCTSTR Path) +{ + //m_FileList.DeleteAllItems(); + FileListDeleteAllItem(); + + CString strFilePath; + strFilePath.Format(_T("%s\\*.*"),Path); + WIN32_FIND_DATA FindData = {0}; + HANDLE hFile = FindFirstFile(strFilePath,&FindData); + if(hFile==INVALID_HANDLE_VALUE) + return FALSE; + + do + { + if(!(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) + { + int iIconIndex = GetIconIndexInSystemImageList(TRUE,FindData.cFileName); + + SHFILEINFO hFileInfo = {0}; + SHGetFileInfo(FindData.cFileName,FindData.dwFileAttributes,&hFileInfo,sizeof(hFileInfo),SHGFI_TYPENAME|SHGFI_USEFILEATTRIBUTES); + + SYSTEMTIME sysFileTime = {0}; + TCHAR szDate[MAX_PATH]=_T(""), szTime[MAX_PATH]=_T(""); + FileTimeToSystemTime(&FindData.ftLastWriteTime,&sysFileTime); + GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&sysFileTime,NULL,szDate,MAX_PATH); + GetTimeFormat(LOCALE_USER_DEFAULT,NULL,&sysFileTime,NULL,szTime,MAX_PATH); + + CString strDataFormat; + strDataFormat.Format(_T("%s %s"),szDate,szTime); + + CFileItem *pNewFileItem = new CFileItem; + + pNewFileItem->strFileName = FindData.cFileName; + pNewFileItem->dwFileSize = FindData.nFileSizeLow; + memcpy(&pNewFileItem->ftData,&FindData.ftLastWriteTime,sizeof(ULARGE_INTEGER)); + pNewFileItem->strFileType = hFileInfo.szTypeName; + + int iSubIndex = m_FileList.InsertItem(0,pNewFileItem->strFileName,iIconIndex); + + m_FileList.SetItemText(iSubIndex ,1,ByteSizeToStr(pNewFileItem->dwFileSize)); + m_FileList.SetItemText(iSubIndex ,2,pNewFileItem->strFileType); + m_FileList.SetItemText(iSubIndex ,3,strDataFormat); + + m_FileList.SetItemData(iSubIndex,DWORD(pNewFileItem)); + } + } + while(FindNextFile(hFile,&FindData)); + FindClose(hFile); + + SortList(m_iSortingMode); + + return TRUE; +} + +int CFileExplore::LoadTreeByPath(HTREEITEM hItem, LPCTSTR Path, BOOL bSubRoot) +{ + int RetValue = 0; + + CString strFilePath; + strFilePath.Format(_T("%s\\*.*"),Path); + WIN32_FIND_DATA FindData = {0}; + HANDLE hFile = FindFirstFile(strFilePath,&FindData); + if(hFile==INVALID_HANDLE_VALUE) + return RetValue; + + if(m_DirTree.ItemHasChildren(hItem)) + { + HTREEITEM hNextItem; + HTREEITEM hChildItem = m_DirTree.GetChildItem(hItem); + + while (hChildItem != NULL) + { + hNextItem = m_DirTree.GetNextItem(hChildItem, TVGN_NEXT); + m_DirTree.DeleteItem(hChildItem); + hChildItem = hNextItem; + } + } + + do + { + if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY&& + _tcscmp(FindData.cFileName,_T("."))&& + _tcscmp(FindData.cFileName,_T(".."))) + { + RetValue++; + HTREEITEM hNewItem = CreateTreeItem(hItem,FindData.cFileName); + if(!bSubRoot) + { + CString strTmpPath; + strTmpPath.Format(_T("%s\\%s"),Path,FindData.cFileName); + LoadTreeByPath(hNewItem,strTmpPath,TRUE); + } + //CreateTreeItem(hNewItem,_T("")); + } + } + while(FindNextFile(hFile,&FindData)); + FindClose(hFile); + + return RetValue; +} + +void CFileExplore::OnItemexpandedDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; + + if(pNMTreeView) + { + HTREEITEM hItem = pNMTreeView->itemNew.hItem, hTmpItem; + if(hItem) + { + CString strItemPath; + + hTmpItem = hItem; + + while(hTmpItem!=m_hRoot) + { + strItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strItemPath; + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + LoadTreeByPath(hItem,m_strStartFolder+strItemPath); + //LoadFilesByPath(m_strStartFolder+strItemPath); + } + } + + *pResult = 0; +} + +//DEL void CFileExplore::OnItemexpandingDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult) +//DEL { +//DEL TRACE("\r\n --- OnItemexpandingDirectoryTree ---"); +//DEL NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; +//DEL // TODO: Add your control notification handler code here +//DEL +//DEL *pResult = 0; +//DEL } + +//DEL void CFileExplore::OnGetdispinfoDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult) +//DEL { +//DEL TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; +//DEL // TODO: Add your control notification handler code here +//DEL +//DEL *pResult = 0; +//DEL } + +HTREEITEM CFileExplore::CreateTreeItem(HTREEITEM hParentItem, LPCTSTR Name) +{ + SHFILEINFO shfi = {0}; + SHGetFileInfo(Name, FILE_ATTRIBUTE_DIRECTORY,&shfi, sizeof(shfi),SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_SMALLICON); + int IconIndex = shfi.iIcon; + + TVINSERTSTRUCT tvInsert = {0}; + tvInsert.hParent = hParentItem; + tvInsert.hInsertAfter = TVI_SORT; + tvInsert.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + tvInsert.item.pszText = (LPTSTR)Name; + tvInsert.item.iImage = IconIndex; + tvInsert.item.iSelectedImage = IconIndex; + + return m_DirTree.InsertItem(&tvInsert); +} + +void CFileExplore::OnSelchangedDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; + + if(pNMTreeView) + { + HTREEITEM hItem = pNMTreeView->itemNew.hItem, hTmpItem; + if(hItem) + { + CString strItemPath; + + hTmpItem = hItem; + + while(hTmpItem!=m_hRoot) + { + strItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strItemPath; + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + LoadFilesByPath(m_strStartFolder+strItemPath); + } + } + + *pResult = 0; +} + +void CFileExplore::OnLButtonDown(UINT nFlags, CPoint point) +{ + BeginVSplitterMove(point); + + CResizableDialog::OnLButtonDown(nFlags, point); +} + +void CFileExplore::OnLButtonUp(UINT nFlags, CPoint point) +{ + EndVSplitterMove(TRUE,point); + + CResizableDialog::OnLButtonUp(nFlags, point); +} + +BOOL CFileExplore::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +{ + CPoint point, tmpPoint; + GetCursorPos(&point); + tmpPoint = point; + ScreenToClient(&point); + if(VSplitterHitTest(point)||IsVSplitterMove()) + { + SetCursor(m_hSplitter); + return TRUE; + } + + return CResizableDialog::OnSetCursor(pWnd, nHitTest, message); +} + +void CFileExplore::OnCancelMode() +{ + CResizableDialog::OnCancelMode(); + + EndVSplitterMove(FALSE,CPoint(0,0)); +} + +void CFileExplore::OnMouseMove(UINT nFlags, CPoint point) +{ + VSplitterMove(point); + + CResizableDialog::OnMouseMove(nFlags, point); +} + +BOOL CFileExplore::BeginVSplitterMove(CPoint &point) +{ + CRect rectVSplitter, rectWindow; + m_VSplitter.GetWindowRect(&rectVSplitter); + ScreenToClient(&rectVSplitter); + + if(rectVSplitter.PtInRect(point)) + { + SetCapture(); + m_bSplitterMove = TRUE; + GetClientRect(&rectWindow); + m_iMinPosition = 10; + m_iMaxPosition = rectWindow.Width()-20; + + m_VSplitter.GetWindowRect(&rectVSplitter); + m_rectLast = rectVSplitter; + + CWindowDC dc(GetDesktopWindow()); + dc.DrawDragRect(rectVSplitter,CSize(3,3),NULL,CSize(3,3)); + return TRUE; + } + return FALSE; +} + +BOOL CFileExplore::IsVSplitterMove() +{ + return m_bSplitterMove; +} + +BOOL CFileExplore::VSplitterMove(CPoint &newPoint) +{ + if(!IsVSplitterMove()) + return FALSE; + + CRect rectVSplitter; + m_VSplitter.GetWindowRect(&rectVSplitter); + + int XValue = newPoint.x; + + if(XValuem_iMaxPosition) + XValue = m_iMaxPosition; + + CWindowDC dc(GetDesktopWindow()); + dc.DrawDragRect(&m_rectLast,CSize(3,3),NULL,CSize(3,3)); + + CPoint ptScreen = newPoint; + ptScreen.x = XValue; + + ClientToScreen(&ptScreen); + rectVSplitter.OffsetRect(ptScreen.x - rectVSplitter.left,0); + m_rectLast = rectVSplitter; + + dc.DrawDragRect(&m_rectLast,CSize(3,3),NULL,CSize(3,3)); + + return TRUE; +} + +BOOL CFileExplore::EndVSplitterMove(BOOL Move, CPoint &point) +{ + if(!IsVSplitterMove()) + return FALSE; + + m_bSplitterMove = FALSE; + ReleaseCapture(); + + CWindowDC dc(GetDesktopWindow()); + dc.DrawDragRect(&m_rectLast,CSize(3,3),NULL,CSize(3,3)); + + if(Move) + { + CRect rectVSplitter,rectDirTree, rectFileList; + m_VSplitter.GetWindowRect(&rectVSplitter); + + int _CX = m_rectLast.left - rectVSplitter.left; + + ScreenToClient(&rectVSplitter); + rectVSplitter.OffsetRect(_CX,0); + + m_DirTree.GetWindowRect(&rectDirTree); + ScreenToClient(&rectDirTree); + rectDirTree.right += _CX; + + m_FileList.GetWindowRect(&rectFileList); + ScreenToClient(&rectFileList); + rectFileList.left += _CX; + + m_VSplitter.MoveWindow(rectVSplitter); + m_DirTree.MoveWindow(rectDirTree); + m_FileList.MoveWindow(rectFileList); + + Invalidate(TRUE); + UpdateWindow(); + + m_DirTree.Invalidate(); + m_FileList.Invalidate(); + m_VSplitter.Invalidate(); + + AddAnchor(&m_DirTree,CSize(0,0),CSize(0,100)); + AddAnchor(&m_VSplitter,CSize(0,0),CSize(0,100)); + AddAnchor(&m_FileList,CSize(0,0),CSize(100,100)); + } + + return TRUE; +} + +BOOL CFileExplore::VSplitterHitTest(CPoint &point) +{ + CRect rectVSplitter; + m_VSplitter.GetWindowRect(&rectVSplitter); + ScreenToClient(&rectVSplitter); + if(rectVSplitter.PtInRect(point)) + return TRUE; + return FALSE; +} + +void CFileExplore::SetBkColor(COLORREF RgbColor) +{ + m_dwBkColor = RgbColor; + if(IsWindow(GetSafeHwnd())) + { + CPaintDC dc(this); + dc.SetBkColor(m_dwBkColor); + Invalidate(); + } +} + +COLORREF CFileExplore::GetBkColor() +{ + return m_dwBkColor; +} + +BOOL CFileExplore::OnEraseBkgnd( CDC * pDc) +{ + CRect rectWin; + GetClientRect(&rectWin); + pDc->FillSolidRect(&rectWin,GetBkColor()); + return FALSE; +} + +void CFileExplore::OnDestroy() +{ + CResizableDialog::OnDestroy(); +} + +void CFileExplore::OnClose() +{ + FileListDeleteAllItem(); + + CString strSection = GetString(IDS_OFSMESSENGER); + CString strEntry = GetString(IDS_COLUMN_WIDTH); + + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("30"), m_FileList.GetColumnWidth(0)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("31"), m_FileList.GetColumnWidth(1)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("32"), m_FileList.GetColumnWidth(2)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("33"), m_FileList.GetColumnWidth(3)); + + WriteOptionInt(IDS_OFSMESSENGER,IDS_FILEL,m_iSortingMode); + + CResizableDialog::OnClose(); +} + +BOOL CFileExplore::PreTranslateMessage(MSG* pMsg) +{ + if(pMsg->message==WM_KEYDOWN) + { + switch(pMsg->wParam) + { + case VK_F5: + Refresh(); + break; + case VK_DELETE: + if(pMsg->hwnd==m_DirTree.GetSafeHwnd()) + Delete(); + else if(pMsg->hwnd==m_FileList.GetSafeHwnd()) + Delete(TRUE); + break; + case VK_F2: + if(pMsg->hwnd==m_DirTree.GetSafeHwnd()) + { + HTREEITEM hItem = m_DirTree.GetSelectedItem(); + if(hItem) + m_DirTree.EditLabel(hItem); + } + else if(pMsg->hwnd==m_FileList.GetSafeHwnd()) + { + POSITION Pos = m_FileList.GetFirstSelectedItemPosition(); + if(Pos) + { + int iIndex = m_FileList.GetNextSelectedItem(Pos); + m_FileList.EditLabel(iIndex); + } + } + break; + case VK_ESCAPE: + if(m_DirTree.GetEditControl()&&pMsg->hwnd==m_DirTree.GetEditControl()->GetSafeHwnd()) + { + m_DirTree.SendMessage(TVM_ENDEDITLABELNOW,TRUE); + } + else if(m_FileList.GetEditControl() && pMsg->hwnd==m_FileList.GetEditControl()->GetSafeHwnd()) + { + //m_FileList.SendMessage(LVM_CANCELEDITLABEL,0,0); + } + else + ((CDialog*)GetParent())->EndDialog(IDCANCEL); + break; + case VK_RETURN: + if(m_DirTree.GetEditControl()&&pMsg->hwnd==m_DirTree.GetEditControl()->GetSafeHwnd()) + { + m_DirTree.SendMessage(TVM_ENDEDITLABELNOW,FALSE); + } + break; + } + } + else if(pMsg->message==WM_SYSKEYDOWN) + { + switch(pMsg->wParam) + { + case VK_RETURN: + if((GetKeyState(VK_MENU)>>1)) + { + if(pMsg->hwnd==m_FileList.GetSafeHwnd()) + ShowDetails(TRUE); + else if(pMsg->hwnd==m_DirTree.GetSafeHwnd()) + ShowDetails(); + } + break; + } + } + + return CResizableDialog::PreTranslateMessage(pMsg); +} + +void CFileExplore::Refresh() +{ + HTREEITEM hItem = m_DirTree.GetSelectedItem(), hTmpItem, hFileDirItem; + if(hItem==NULL) + hItem = m_hRoot; + if(hItem) + { + CString strItemPath, strFileDir; + + hFileDirItem = hTmpItem = hItem; + + if(hItem != m_hRoot) + { + strFileDir = m_DirTree.GetItemText(hItem); + hFileDirItem = hTmpItem = m_DirTree.GetParentItem(hItem); + } + + while(hTmpItem!=m_hRoot) + { + strItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strItemPath; + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + + LoadTreeByPath(hFileDirItem,m_strStartFolder+strItemPath); + if(!strFileDir.IsEmpty()&&m_DirTree.ItemHasChildren(hFileDirItem)) + { + hTmpItem = m_DirTree.GetChildItem(hFileDirItem); + while (hTmpItem != NULL) + { + if(strFileDir.CompareNoCase(m_DirTree.GetItemText(hTmpItem))==0) + { + hFileDirItem = hTmpItem; + strItemPath += _T('\\') + strFileDir; + break; + } + hTmpItem = m_DirTree.GetNextItem(hTmpItem, TVGN_NEXT); + } + LoadTreeByPath(hFileDirItem,m_strStartFolder+strItemPath); + } + + m_DirTree.SelectItem(hFileDirItem); + + if(hFileDirItem==m_hRoot) + LoadFilesByPath(m_strStartFolder+strItemPath); + } +} + +void CFileExplore::OnRclickDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + CPoint point, DirPoint; + GetCursorPos(&point); + + DirPoint = point; + m_DirTree.ScreenToClient(&DirPoint); + + HTREEITEM hItemHitTest = m_DirTree.HitTest(DirPoint); + if(hItemHitTest) + { + m_DirTree.SelectItem(hItemHitTest); + + HTREEITEM hItem = m_DirTree.GetSelectedItem(), hTmpItem; + + if(hItem) + { + long TreeAddon = 1; + if(m_DirTree.ItemHasChildren(hItem)) + { + TreeAddon |= 2; + if(m_DirTree.GetItemState(hItem,TVIS_EXPANDED)&TVIS_EXPANDED) + TreeAddon |= 4; + } + + CString strDirPath; + hTmpItem = hItem; + while(hTmpItem!=m_hRoot) + { + strDirPath = _T("\\") + m_DirTree.GetItemText(hTmpItem)+strDirPath; + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + + int RetCom = ShowContextMenu(TreeAddon,GetSafeHwnd(),m_strStartFolder+strDirPath, point.x, point.y, NULL,&m_pContextMenu2, &m_pContextMenu3); + + switch(RetCom) + { + case 19: + m_DirTree.EditLabel(hItem); + break; + case 0x8001: + m_DirTree.Expand(hItem,TreeAddon&4?TVE_COLLAPSE:TVE_EXPAND); + break; + case 0x8002: + { + CString strNewDirPath; + long Index = 2; + strNewDirPath.Format(GetString(IDS_NEWFOLDER_FORMAT),m_strStartFolder+strDirPath); + do + { + if(!CreateDirectory(strNewDirPath,NULL)) + { + if(GetLastError()==0xb7) + { + strNewDirPath.Format(GetString(IDS_NEWFOLDERN_FORMAT),m_strStartFolder+strDirPath,Index); + Index++; + continue; + } + } + + break; + } + while(TRUE); + } + + break; + } + } + } + + *pResult = 0; +} + +void CFileExplore::OnRclickFileList(NMHDR* pNMHDR, LRESULT* pResult) +{ + CPoint point; + GetCursorPos(&point); + + HTREEITEM hItem = m_DirTree.GetSelectedItem(); + POSITION pos = m_FileList.GetFirstSelectedItemPosition(); + if(hItem!=NULL&&pos!=NULL) + { + CString strDirPath; + while(hItem!=m_hRoot) + { + strDirPath = _T("\\") + m_DirTree.GetItemText(hItem)+strDirPath; + hItem = m_DirTree.GetParentItem(hItem); + } + + int nItem = m_FileList.GetNextSelectedItem(pos); + strDirPath = m_strStartFolder + strDirPath + _T('\\') + m_FileList.GetItemText(nItem,0); + + int RetCmd = ShowContextMenu(0,GetSafeHwnd(), strDirPath, point.x, point.y, NULL,&m_pContextMenu2, &m_pContextMenu3); + if(RetCmd==19) + { + m_FileList.EditLabel(nItem); + } + } + + *pResult = 0; +} + +void CFileExplore::OnDblclkFileList(NMHDR* pNMHDR, LRESULT* pResult) +{ + HTREEITEM hItem = m_DirTree.GetSelectedItem(); + POSITION pos = m_FileList.GetFirstSelectedItemPosition(); + if(hItem!=NULL&&pos!=NULL) + { + CString strDirPath; + while(hItem!=m_hRoot) + { + strDirPath = _T("\\") + m_DirTree.GetItemText(hItem)+strDirPath; + hItem = m_DirTree.GetParentItem(hItem); + } + + int nItem = m_FileList.GetNextSelectedItem(pos); + strDirPath = m_strStartFolder + strDirPath + _T('\\') + m_FileList.GetItemText(nItem,0); + + long hInstance = (long)ShellExecute(GetSafeHwnd(),_T("open"),strDirPath,NULL,NULL,SW_SHOWNORMAL); + + if(hInstance<=32) + { + switch(hInstance) + { + case SE_ERR_NOASSOC: + case SE_ERR_ASSOCINCOMPLETE: + { + CString sOpenWithDlgPath = _T("shell32.dll,OpenAs_RunDLL ") + strDirPath; + ShellExecute(NULL,_T("open"),_T("Rundll32.exe"), sOpenWithDlgPath, NULL, SW_SHOWNORMAL); + } + break; + default: + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + + MessageBox((LPCTSTR)lpMsgBuf,GetString(IDS_OPEN_FILE_ERROR_NAME),MB_OK | MB_ICONINFORMATION ); + + // Free the buffer. + LocalFree( lpMsgBuf ); + } + } + + } + + *pResult = 0; +} + +void CFileExplore::Delete(BOOL bUseFile) +{ + HTREEITEM hItem = m_DirTree.GetSelectedItem(), hTmpItem; + + if(hItem&&(hItem!=m_hRoot||bUseFile)) + { + CString strItemPath; + + hTmpItem = hItem; + + LPTSTR buf = NULL; + + while(hTmpItem!=m_hRoot) + { + strItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strItemPath; + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + + CString strDir = m_strStartFolder+strItemPath; + + if(bUseFile) + { + POSITION pos = m_FileList.GetFirstSelectedItemPosition(); + if(pos==NULL) + return; + + CStringArray FileList; + DWORD dwAllBufferSize = 0; + DWORD dwBufferOffset = 0; + + while(pos) + { + int nItem = m_FileList.GetNextSelectedItem(pos); + + CString strTmp = strDir + _T('\\') + m_FileList.GetItemText(nItem,0); + dwAllBufferSize += (strTmp.GetLength()+1); + + FileList.Add(strDir+_T('\\') + m_FileList.GetItemText(nItem,0)); + } + + buf = new TCHAR[dwAllBufferSize+2]; + ZeroMemory(buf,(dwAllBufferSize+2)*sizeof(TCHAR)); + + for(int i=0;i>1)?0:FOF_ALLOWUNDO); + + res = SHFileOperation(&fo); + + if(buf) + delete []buf; + + if(!bUseFile) + { + hItem = m_DirTree.GetParentItem(hItem); + m_DirTree.SelectItem(hItem); + } + + //Refresh(); + } +} + +void CFileExplore::OnEndlabeleditDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult) +{ + TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; + + *pResult = 0; + + if(pTVDispInfo->item.pszText) + { + HTREEITEM hItem = m_DirTree.GetSelectedItem(), hTmpItem; + + if(hItem&&hItem!=m_hRoot) + { + CString strSrcItemPath, strDestItemPath; + + strDestItemPath.Format(_T("\\%s"),pTVDispInfo->item.pszText); + + hTmpItem = hItem; + + while(hTmpItem!=m_hRoot) + { + if(!strSrcItemPath.IsEmpty()) + strDestItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strDestItemPath; + strSrcItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strSrcItemPath; + + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + + int res; + SHFILEOPSTRUCT fo = {0}; + + TCHAR bufSrc[_MAX_PATH + 1], bufDest[_MAX_PATH + 1]; // allow one more character + _tcscpy(bufSrc, m_strStartFolder+strSrcItemPath); // copy caller's path name + _tcscpy(bufDest, m_strStartFolder+strDestItemPath); // copy caller's path name + bufSrc[_tcslen(bufSrc)+1]=0; // need two NULLs at end + bufDest[_tcslen(bufDest)+1]=0; // need two NULLs at end + + fo.hwnd = GetSafeHwnd(); // хэндл окна-владельца прогресс-диалога + fo.pFrom = bufSrc; + fo.pTo = bufDest; + fo.wFunc = FO_RENAME; + + *pResult = !(res = SHFileOperation(&fo)); + } + + } +} + +void CFileExplore::OnEndlabeleditFileList(NMHDR* pNMHDR, LRESULT* pResult) +{ + LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; + + *pResult = 0; + + if(pDispInfo->item.pszText) + { + + HTREEITEM hItem = m_DirTree.GetSelectedItem(), hTmpItem; + + if(hItem) + { + CString strSrcItemPath = _T("\\"), strDestItemPath; + + hTmpItem = hItem; + + while(hTmpItem!=m_hRoot) + { + strSrcItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strSrcItemPath; + + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + + strDestItemPath = strSrcItemPath; + + strSrcItemPath += m_FileList.GetItemText(pDispInfo->item.iItem,pDispInfo->item.iSubItem); + strDestItemPath += pDispInfo->item.pszText; + + int res; + SHFILEOPSTRUCT fo = {0}; + + TCHAR bufSrc[_MAX_PATH + 1], bufDest[_MAX_PATH + 1]; // allow one more character + _tcscpy(bufSrc, m_strStartFolder+strSrcItemPath); // copy caller's path name + _tcscpy(bufDest, m_strStartFolder+strDestItemPath); // copy caller's path name + bufSrc[_tcslen(bufSrc)+1]=0; // need two NULLs at end + bufDest[_tcslen(bufDest)+1]=0; // need two NULLs at end + + fo.hwnd = GetSafeHwnd(); // хэндл окна-владельца прогресс-диалога + fo.pFrom = bufSrc; + fo.pTo = bufDest; + fo.wFunc = FO_RENAME; + + *pResult = !(res = SHFileOperation(&fo)); + } + + } +} + +void CFileExplore::ShowDetails(BOOL bUseFile) +{ + HTREEITEM hItem = m_DirTree.GetSelectedItem(), hTmpItem; + + if(hItem&&hItem!=m_hRoot) + { + CString strItemPath; + + hTmpItem = hItem; + + while(hTmpItem!=m_hRoot) + { + strItemPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strItemPath; + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + + if(bUseFile) + { + POSITION pos = m_FileList.GetFirstSelectedItemPosition(); + if(pos==NULL) + return; + int nItem = m_FileList.GetNextSelectedItem(pos); + strItemPath += _T('\\') + m_FileList.GetItemText(nItem,0); + } + + ShowContextMenu(0,GetSafeHwnd(),m_strStartFolder+strItemPath,0,0,(LPCTSTR)20,&m_pContextMenu2, &m_pContextMenu3); + } +} + +void CFileExplore::OnBegindragFileList(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + + HTREEITEM hItem = m_DirTree.GetSelectedItem(), hTmpItem; + + if(hItem) + { + CString strFolderPath; + + hTmpItem = hItem; + + while(hTmpItem!=m_hRoot) + { + strFolderPath = _T('\\') + m_DirTree.GetItemText(hTmpItem)+ strFolderPath; + hTmpItem = m_DirTree.GetParentItem(hTmpItem); + } + + CStringArray m_FileArray; + + DWORD dwAllStringSize = 0; + int iFirstItem = -1; + + POSITION pos = m_FileList.GetFirstSelectedItemPosition(); + while(pos!=NULL) + { + CString strItemPath; + + int nItem = m_FileList.GetNextSelectedItem(pos); + + if(iFirstItem==-1) + iFirstItem = nItem; + + ////////////////////////////////////////////////////////////////////////// + strItemPath = m_strStartFolder + strFolderPath + _T('\\') + m_FileList.GetItemText(nItem,0); + ////////////////////////////////////////////////////////////////////////// + + m_FileArray.Add(strItemPath); + + dwAllStringSize += (strItemPath.GetLength()+1)*sizeof(TCHAR); + } + + if(m_FileArray.GetSize()) + { + COleDataSource *pDataSource = new COleDataSource(); + + DROPFILES pFile = {0}; + pFile.pFiles = sizeof(DROPFILES); + + //long lStringLen = (strItemPath.GetLength())*sizeof(TCHAR); + + HGLOBAL hgCF_HDROPData = GlobalAlloc(GPTR, sizeof(DROPFILES)+dwAllStringSize+2*sizeof(TCHAR)/*End Char*/); + + LPVOID lpCF_HDROPData = (LPSTR)GlobalLock(hgCF_HDROPData); + + memcpy(lpCF_HDROPData, (LPCVOID)&pFile,sizeof(DROPFILES)); + + DWORD dwWriteOffset = sizeof(DROPFILES); + for(int i =0;iCacheGlobalData( CF_HDROP, hgCF_HDROPData); + + PostMessage(WM_HANDLE_DRAG, (UINT)pDataSource, iFirstItem); + } + } + + *pResult = 0; +} + +LONG CFileExplore::OnHandleDrag( UINT pDataSource, LONG nSelectedItem) +{ + ////////////////////////////////////////////////////////////////////////// + CPoint point, pointClient; + GetCursorPos(&point); + + pointClient = point; + ScreenToClient(&pointClient); + + m_pDragImage = m_FileList.CreateDragImage(nSelectedItem, &pointClient); + m_pDragImage->Add(m_FileList.CreateDragImage(nSelectedItem, &pointClient)->ExtractIcon(0)); + + // changes the cursor to the drag image (DragMove() is still required + m_bImageHidden = FALSE; + m_pDragImage->BeginDrag(0, CPoint(8, 8)); + m_pDragImage->BeginDrag(1, CPoint(8, 16)); + m_pDragImage->DragEnter(GetDesktopWindow(), point); + + DROPEFFECT retVal = ((COleDataSource*)pDataSource)->DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE,NULL, &m_OleFileListDropSource); + + //Refresh(); + + delete (COleDataSource*)pDataSource; + + m_pDragImage->DragLeave(GetDesktopWindow()); + m_pDragImage->EndDrag(); + + delete m_pDragImage; + m_pDragImage = NULL; + + return 0; +} + +////////////////////////////////////////////////////////////////////////// +// Overrides +SCODE CFileExplore::COleFileListDropSource::GiveFeedback(DROPEFFECT dropEffect) +{ + CPoint point; + GetCursorPos(&point); + + if(m_pFE) + { + CRect rctWindow; + m_pFE->GetWindowRect(&rctWindow); + + if(rctWindow.PtInRect(point)&&WindowFromPoint(point)&& + (WindowFromPoint(point)->GetSafeHwnd()==m_pFE->m_FileList.GetSafeHwnd()|| + WindowFromPoint(point)->GetSafeHwnd()==m_pFE->GetSafeHwnd())) + { + if(m_pFE->m_bImageHidden) + { + m_pFE->m_bImageHidden = FALSE; + m_pFE->m_pDragImage->DragEnter(m_pFE->GetDesktopWindow(), point); + } + + m_pFE->m_pDragImage->DragMove(point); + } + else + { + if(!m_pFE->m_bImageHidden) + { + m_pFE->m_bImageHidden = TRUE; + m_pFE->m_pDragImage->DragLeave(m_pFE->GetDesktopWindow()); + } + } + } + + return m_bDragStarted ? DRAGDROP_S_USEDEFAULTCURSORS : S_OK; +} + +DROPEFFECT CFileExplore::COleFEDropTarget::OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point ) +{ + if(!pDataObject->IsDataAvailable(CF_HDROP)) + { + m_dropEffectCurrent = DROPEFFECT_NONE; + return m_dropEffectCurrent; + } + + // Check if the control key was pressed + if((dwKeyState & MK_CONTROL) == MK_CONTROL) + { + m_dropEffectCurrent = DROPEFFECT_COPY; + return m_dropEffectCurrent; + } + else + { + // We don't do move yet + m_dropEffectCurrent = DROPEFFECT_MOVE; + return DROPEFFECT_MOVE; + } +} + +BOOL CFileExplore::COleFEDropTarget::OnDrop( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point ) +{ + m_pFE->m_DirTree.SelectDropTarget(NULL); + + BOOL bDirMode = pWnd->IsKindOf(RUNTIME_CLASS(CTreeCtrl)); + + CString strDestPath; + HTREEITEM hRootItem, hTmpItem; + + if(bDirMode) + { + UINT uFlags; + hRootItem = m_pFE->m_DirTree.HitTest(point,&uFlags); + } + else + hRootItem = m_pFE->m_DirTree.GetSelectedItem(); + + if(hRootItem) + { + hTmpItem = hRootItem; + while(hTmpItem!=m_pFE->m_hRoot) + { + strDestPath = _T('\\') + m_pFE->m_DirTree.GetItemText(hTmpItem)+ strDestPath; + hTmpItem = m_pFE->m_DirTree.GetParentItem(hTmpItem); + } + strDestPath = m_pFE->m_strStartFolder + strDestPath; + + HGLOBAL hMem = pDataObject->GetGlobalData(CF_HDROP); + HDROP hDrop = (HDROP)GlobalLock(hMem); + + UINT FileCount = DragQueryFile(hDrop,0xFFFFFFFF,NULL,0); + + for(UINT i=0;iGetSafeHwnd(); // хэндл окна-владельца прогресс-диалога + fo.pFrom = bufSrc; + fo.pTo = bufDest; + fo.wFunc = ((dropEffect==DROPEFFECT_MOVE)?FO_MOVE:FO_COPY); + + res = SHFileOperation(&fo); + } + } + + m_pFE->m_DirTree.SelectItem(hRootItem); + //m_pFE->Refresh(); + + GlobalUnlock(hMem); + + } + + return TRUE; +} + +DROPEFFECT CFileExplore::COleFEDropTarget::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point ) +{ + BOOL bDirMode = pWnd->IsKindOf(RUNTIME_CLASS(CTreeCtrl)); + + if(bDirMode) + { + UINT uFlags; + HTREEITEM hItem = m_pFE->m_DirTree.HitTest(point,&uFlags); + + TRACE(_T("\r\n --- OnDragOver --- %d"), uFlags); + + if(hItem!=NULL&&(TVHT_ONITEM&uFlags)) + { + m_pFE->m_DirTree.SelectDropTarget(hItem); + } + else if(uFlags==TVHT_ONITEMBUTTON) + { + m_pFE->m_DirTree.Expand(hItem,TVE_EXPAND); + } + } + + if((dwKeyState & MK_CONTROL) == MK_CONTROL) + { + m_dropEffectCurrent = DROPEFFECT_COPY; + return m_dropEffectCurrent; + } + else + { + // We don't do move yet + m_dropEffectCurrent = DROPEFFECT_MOVE; + return DROPEFFECT_MOVE; + } +} +void CFileExplore::COleFEDropTarget::OnDragLeave(CWnd* pWnd) +{ + m_pFE->m_DirTree.SelectDropTarget(NULL); + + COleDropTarget::OnDragLeave(pWnd); +} + +LRESULT CFileExplore::OnRefreshPath(WPARAM, LPARAM) +{ + //TRACE("\r\n --- CFileExplore::OnRefreshPath (%d) \"%s\" ---",Index, strPath); + Refresh(); + return 0; +} + +void CFileExplore::OnItemclickFileList(NMHDR* pNMHDR, LRESULT* pResult) +{ + HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; + + if((phdn->iItem+1)==(m_iSortingMode>=0?m_iSortingMode:-m_iSortingMode)) + m_iSortingMode = -1*m_iSortingMode; + else + m_iSortingMode = phdn->iItem+1; + + SortList(m_iSortingMode); + + + *pResult = 0; +} + +void CFileExplore::SortList(int Mode) +{ + HDITEM hItem = {0}; + +// m_FileList.GetHeaderCtrl()->GetItem(Mode-1,&hItem); +// +// hItem.mask = HDI_IMAGE| HDI_FORMAT; +// hItem.iImage = 1; +// hItem.fmt |= HDF_IMAGE; +// +// m_FileList.GetHeaderCtrl()->SetItem(Mode-1,&hItem); + + m_FileList.SortItems (CompareListItem,(LPARAM)Mode); + + m_SortHeader.SetSortArrow((m_iSortingMode>0?m_iSortingMode:-m_iSortingMode)-1,(m_iSortingMode>0?TRUE:FALSE)); +} + +int CALLBACK CFileExplore::CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + CFileItem *pItem1 = (CFileItem *)lParam1; + CFileItem *pItem2 = (CFileItem *)lParam2; + + if(IsBadReadPtr(pItem1,sizeof(CFileItem))|| IsBadReadPtr(pItem2,sizeof(CFileItem))) + return 0; + + int bValAddon = (lParamSort>=0?1:-1); + + switch(bValAddon*lParamSort) + { + case 1: + if(pItem1->strFileNamestrFileName) return -1*bValAddon; + if(pItem1->strFileName>pItem2->strFileName) return 1*bValAddon; + break; + case 2: + if(pItem1->dwFileSizedwFileSize) return -1*bValAddon; + if(pItem1->dwFileSize>pItem2->dwFileSize) return 1*bValAddon; + break; + case 3: + if(pItem1->strFileTypestrFileType) return -1*bValAddon; + if(pItem1->strFileType>pItem2->strFileType) return 1*bValAddon; + break; + case 4: + if(pItem1->ftData.QuadPartftData.QuadPart) return -1*bValAddon; + if(pItem1->ftData.QuadPart>pItem2->ftData.QuadPart) return 1*bValAddon; + break; + } + + return 0; +} + +void CFileExplore::FileListDeleteAllItem() +{ + for(int iItemIndex = 0; iItemIndexHandleMenuMsg(message, wParam, lParam); + } + + if(m_pContextMenu3) + if(message==WM_MENUCHAR) + { + LRESULT lr = 0; + m_pContextMenu3->HandleMenuMsg2(message, wParam, lParam,&lr); + return lr; + } + + return CResizableDialog::WindowProc(message,wParam,lParam); +} diff --git a/Source/Client/IM-Client/IMClient/FileExplore.h b/Source/Client/IM-Client/IMClient/FileExplore.h new file mode 100644 index 0000000..d29cb43 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileExplore.h @@ -0,0 +1,167 @@ +#if !defined(AFX_FILEEXPLORE_H__EB58A900_C47E_4699_AB77_6AF4E0F34DEF__INCLUDED_) +#define AFX_FILEEXPLORE_H__EB58A900_C47E_4699_AB77_6AF4E0F34DEF__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// FileExplore.h : header file +// +#include "FolderChangeNotfication.h" + +///////////////////////////////////////////////////////////////////////////// +// CFileExplore dialog +#include "ResizableDialog.h" +#include "SortHeaderCtrl.h" + +class CFileExplore : public CResizableDialog +{ +// Construction +public: + void ShowDetails(BOOL bUseFile = FALSE); + void Delete(BOOL bUseFile = FALSE); + void Refresh(); + COLORREF GetBkColor(); + void SetBkColor(COLORREF RgbColor); + + LPCTSTR GetStartFolder(); + void SetStartFolder(LPCTSTR strPath); + LPCTSTR GetDefaultPath(); + void SetDefaultPath(LPCTSTR strPath); + CFileExplore(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CFileExplore) + enum { IDD = IDD_FILES_EXPLORER }; + CStatic m_VSplitter; + CListCtrl m_FileList; + CTreeCtrl m_DirTree; + //}}AFX_DATA +public: + + class CFileItem + { + public: + CString strFileName; + DWORD dwFileSize; + CString strFileType; + ULARGE_INTEGER ftData; + }; + + class COleFileListDropSource : public COleDropSource + { + public: + COleFileListDropSource(CFileExplore* pFE = NULL):m_pFE(pFE) + { + }; + // Overrides + SCODE GiveFeedback(DROPEFFECT dropEffect); + private: + CFileExplore* m_pFE; + }; + + class COleFEDropTarget : public COleDropTarget + { + public: + COleFEDropTarget(CFileExplore* pFE = NULL):m_pFE(pFE) + { + m_dropEffectCurrent = DROPEFFECT_NONE; + }; + // Overrides + DROPEFFECT OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point ); + DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point ); + void OnDragLeave(CWnd* pWnd); + BOOL OnDrop( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point ); + private: + DROPEFFECT m_dropEffectCurrent; + CFileExplore* m_pFE; + }; + + friend COleFileListDropSource; + friend COleFEDropTarget; +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileExplore) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + void FileListDeleteAllItem(); + static int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + void SortList(int isorMode); + BOOL VSplitterHitTest(CPoint &point); + BOOL EndVSplitterMove(BOOL Move, CPoint &point); + BOOL VSplitterMove(CPoint &newPoint); + BOOL IsVSplitterMove(); + BOOL BeginVSplitterMove(CPoint& point); + + HTREEITEM CreateTreeItem(HTREEITEM hParentItem, LPCTSTR Name); + BOOL LoadFilesByPath(LPCTSTR Path); + int LoadTreeByPath(HTREEITEM hItem, LPCTSTR Path, BOOL bSubRoot = FALSE); + + // Generated message map functions + //{{AFX_MSG(CFileExplore) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + virtual LRESULT WindowProc(UINT message,WPARAM wParam,LPARAM lParam); + afx_msg void OnItemexpandedDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnSelchangedDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); + afx_msg void OnCancelMode(); + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + afx_msg BOOL OnEraseBkgnd( CDC * pDc); + afx_msg void OnDestroy(); + afx_msg void OnClose(); + afx_msg void OnRclickDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickFileList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnDblclkFileList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnEndlabeleditDirectoryTree(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnEndlabeleditFileList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnBegindragFileList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnItemclickFileList(NMHDR* pNMHDR, LRESULT* pResult); + //}}AFX_MSG + afx_msg LONG OnHandleDrag( UINT, LONG ); + afx_msg LRESULT OnRefreshPath(WPARAM, LPARAM); + DECLARE_MESSAGE_MAP() + +private: + CSortHeaderCtrl m_SortHeader; + //CImageList m_CheckHeader; + int m_iSortingMode; + CString m_strDefaultPath; + CString m_strStartFolder; + COLORREF m_dwBkColor; + + // VSlider Addon [3/20/2002] + HTREEITEM m_hRoot; + BOOL m_bSplitterMove; + long m_iMaxPosition; + long m_iMinPosition; + CRect m_rectLast; + HCURSOR m_hSplitter; + + // Drag&Drop Addon [3/22/2002] + COleFileListDropSource m_OleFileListDropSource; + COleFEDropTarget m_OleFileListDropTarget; + COleFEDropTarget m_OleDirTreeDropTarget; + + CImageList *m_pDragImage; + BOOL m_bImageHidden; + + CComPtr m_pContextMenu2; + + CComPtr m_pContextMenu3; + + CFolderChangeNotification m_FolderNotify; +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_FILEEXPLORE_H__EB58A900_C47E_4699_AB77_6AF4E0F34DEF__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/FileManagerDlg.cpp b/Source/Client/IM-Client/IMClient/FileManagerDlg.cpp new file mode 100644 index 0000000..3480ff0 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileManagerDlg.cpp @@ -0,0 +1,795 @@ +// FileManagerDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "FileManagerDlg.h" +#include "MainDlg.h" +#include "LoadSkins.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg dialog +extern CString GetCurrentSkin(); + +CFileManagerDlg::CFileManagerDlg(CMainDlg *pMessenger,CWnd* pParent /*=NULL*/) + : COFSNcDlg2(CFileManagerDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CFileManagerDlg) + //}}AFX_DATA_INIT + m_pMessenger = pMessenger; + SetBoundary(0,0); + SetCaption(RGB(0,0,0),RGB(0,0,0),0); + m_strSkinSettings = _T("/Shell/FileManager/skin.xml"); + m_crSplitter = CLR_NONE; +} + +CFileManagerDlg::~CFileManagerDlg() +{ +} + + +void CFileManagerDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CFileManagerDlg) + DDX_Control(pDX, IDC_MCCLOSE, m_btnX); + DDX_Control(pDX, IDC_MCMINI, m_btnMin); + DDX_Control(pDX, IDC_MCMAXI2, m_btnMax); + DDX_Control(pDX, IDC_MCMAXIMINI, m_btnRestore); + DDX_Control(pDX, IDC_MCMENU, m_btnMenu); + DDX_Control(pDX, IDC_BTN_LIBRARY, m_btnLibrary); + DDX_Control(pDX, IDC_BTN_RECEIVED, m_btnReceived); + DDX_Control(pDX, IDC_BTN_SENT, m_btnSent); + DDX_Control(pDX, IDC_DOWN_SHOWOFFLINE, m_DownShowOffline); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CFileManagerDlg, COFSNcDlg2) +//{{AFX_MSG_MAP(CFileManagerDlg) + ON_WM_TIMER() + ON_WM_CLOSE() + ON_WM_CAPTURECHANGED() + ON_WM_DESTROY() + ON_WM_CREATE() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +BEGIN_EVENTSINK_MAP(CFileManagerDlg, COFSNcDlg2) +//{{AFX_EVENTSINK_MAP(CFileManagerDlg) + ON_EVENT(CFileManagerDlg, IDC_BTN_LIBRARY, -600 /* Click */, OnClickBtnLibrary, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_BTN_RECEIVED, -600 /* Click */, OnClickBtnReceived, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_BTN_SENT, -600 /* Click */, OnClickBtnSent, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_MCCLOSE, -600 /* Click */, OnClickMcclose, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_MCMINI, -600 /* Click */, OnClickMcmini, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_MCMENU, -600 /* Click */, OnClickMcmenu, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_MCMAXI2, -600 /* Click */, OnClickMcmaxi, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_MCMAXIMINI, -600 /* Click */, OnClickMcmaximini, VTS_NONE) + ON_EVENT(CFileManagerDlg, IDC_DOWN_SHOWOFFLINE, -600 /* Click */, OnClickMcDownShowOffline, VTS_NONE) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg message handlers + +//DEL void CFileManagerDlg::OnClickMcLibrary() +//DEL { +//DEL // m_Transfer.SetPressed(FALSE); +//DEL // m_Library.SetPressed(TRUE); +//DEL m_FileUploadDlg.ShowWindow(SW_HIDE); +//DEL m_FileExplore.ShowWindow(SW_SHOWNOACTIVATE); +//DEL // m_SendDelete.ShowWindow(SW_HIDE); +//DEL // m_SendUpload.ShowWindow(SW_HIDE); +//DEL // m_SendCancel.ShowWindow(SW_HIDE); +//DEL // m_ctrlSending.ShowWindow(SW_HIDE); +//DEL +//DEL m_FileDownlaodDlg.ShowWindow(SW_HIDE); +//DEL // m_DownOffline.ShowWindow(SW_HIDE); +//DEL // m_DownDelete.ShowWindow(SW_HIDE); +//DEL // m_DownRemindLater.ShowWindow(SW_HIDE); +//DEL // m_DownDownload.ShowWindow(SW_HIDE); +//DEL // m_DownCancel.ShowWindow(SW_HIDE); +//DEL m_DownShowOffline.ShowWindow(SW_HIDE); +//DEL } + +//DEL void CFileManagerDlg::OnClickMcTransfer() +//DEL { +//DEL // m_Transfer.SetPressed(TRUE); +//DEL // m_Library.SetPressed(FALSE); +//DEL m_FileExplore.ShowWindow(SW_HIDE); +//DEL m_FileUploadDlg.ShowWindow(SW_SHOWNOACTIVATE); +//DEL // m_SendDelete.ShowWindow(SW_SHOWNORMAL); +//DEL // m_SendUpload.ShowWindow(SW_SHOWNORMAL); +//DEL // m_SendCancel.ShowWindow(SW_SHOWNORMAL); +//DEL // m_ctrlSending.ShowWindow(SW_SHOWNOACTIVATE); +//DEL +//DEL m_FileDownlaodDlg.ShowWindow(SW_SHOWNOACTIVATE); +//DEL // m_DownOffline.ShowWindow(SW_SHOWNORMAL); +//DEL // m_DownDelete.ShowWindow(SW_SHOWNORMAL); +//DEL // m_DownRemindLater.ShowWindow(SW_SHOWNORMAL); +//DEL // m_DownDownload.ShowWindow(SW_SHOWNORMAL); +//DEL // m_DownCancel.ShowWindow(SW_SHOWNORMAL); +//DEL m_DownShowOffline.ShowWindow(SW_SHOWNOACTIVATE); +//DEL } + +void CFileManagerDlg::OnOK() +{ +} + +void CFileManagerDlg::OnCancel() +{ + COFSNcDlg2::OnCancel(); +} + +//DEL void CFileManagerDlg::LoadSkin() +//DEL { +//DEL LoadSkins m_LoadSkin; +//DEL +//DEL IStreamPtr pStream = NULL; +//DEL long Error = 0L; +//DEL +//DEL bstr_t bstrPath = L"IBN_SCHEMAmpa://"; +//DEL bstrPath += (LPCTSTR)GetCurrentSkin(); +//DEL +//DEL m_LoadSkin.Load(bstr_t(bstrPath+"/Shell/FileM/fon.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL { +//DEL LPPICTURE Pic = NULL; +//DEL HRESULT hr = ::OleLoadPicture(pStream, 0, TRUE, IID_IPicture,(void**)&Pic); +//DEL if(SUCCEEDED(hr)) +//DEL { +//DEL m_ResizeFon.Create(Pic); +//DEL m_ResizeFon.AddAnchor(CRect(0,0,224,82),CSize(0,0),CSize(0,0)); +//DEL m_ResizeFon.AddAnchor(CRect(225,0,385,82),CSize(0,0),CSize(100,0),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(386,0,399,82),CSize(100,0),CSize(100,0)); +//DEL +//DEL m_ResizeFon.AddAnchor(CRect(0,83,224,100),CSize(0,0),CSize(0,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(225,83,385,100),CSize(0,0),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(386,83,399,100),CSize(100,0),CSize(100,100),CResizableImage::DUPLICATE); +//DEL +//DEL m_ResizeFon.AddAnchor(CRect(0,101,224,150),CSize(0,100),CSize(0,100)); +//DEL m_ResizeFon.AddAnchor(CRect(225,101,385,150),CSize(0,100),CSize(100,100),CResizableImage::DUPLICATE); +//DEL m_ResizeFon.AddAnchor(CRect(386,101,399,150),CSize(100,100),CSize(100,100)); +//DEL } +//DEL } +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_x.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_btnX.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_minimize.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_btnMin.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_menu.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_btnMenu.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_maximize.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_btnMax.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Common/btn_restore.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_btnRestore.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL /*m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/ClearInactive.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_SendDelete.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/Upload.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_SendUpload.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/CancelTransfer.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_SendCancel.LoadBitmapFromStream(pStream); +//DEL pStream = NULL;*/ +//DEL +//DEL /*m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/Offline.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_DownOffline.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/ClearInactive.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_DownDelete.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/RemindLater.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_DownRemindLater.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/Resume.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_DownDownload.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/CancelTransfer.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_DownCancel.LoadBitmapFromStream(pStream); +//DEL pStream = NULL;*/ +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/show_offline.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_DownShowOffline.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/Library.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Library.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_LoadSkin.Load(bstrPath+bstr_t("/Shell/FileM/Transfer.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Transfer.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL } + +BOOL CFileManagerDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + m_ToolTip.AddTool(&m_btnMin,IDS_TIP_MINIMIZE); + //m_ToolTip.AddTool(&m_btnMenu,IDS_TIP_MENU); + m_ToolTip.AddTool(&m_btnMax,IDS_TIP_MAXIMIZE); + m_ToolTip.AddTool(&m_btnRestore,IDS_TIP_RESTORY); + ////////////////////////////////////////////////////////////////////////// + + CRect ClRect; + GetWindowRect(ClRect); +// m_FileUploadDlg.Create(CFileUploadDlg::IDD,this); +// m_FileUploadDlg.SetWindowPos(NULL,15,106,ClRect.Width()-30,ClRect.Height()/2-100,SWP_NOZORDER|SWP_SHOWWINDOW); +// m_FileUploadDlg.SetMessenger(m_pMessenger); + +// m_FileDownlaodDlg.Create(CFileDownloadDlg::IDD,this); +// m_FileDownlaodDlg.SetWindowPos(NULL,15,ClRect.Height()/2+30,ClRect.Width()-30,ClRect.Height()/2-70,SWP_NOZORDER|SWP_SHOWWINDOW); +// m_FileDownlaodDlg.SetMessanger(m_pMessenger); + +// m_FileExplore.Create(CFileExplore::IDD,this); +// m_FileExplore.SetWindowPos(NULL,15,96,ClRect.Width()-30,ClRect.Height()-135,SWP_NOZORDER|SWP_SHOWWINDOW); +// m_FileExplore.SetBkColor(0x666666); + +// ShowSizeGrip(FALSE); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + +// LoadSkin(); + +// m_btnMin.SetAutoPressed(TRUE); +// m_btnMin.SetCanStayPressed(FALSE); +// m_btnX.SetAutoPressed(TRUE); +// m_btnX.SetCanStayPressed(FALSE); +// m_btnMenu.SetAutoPressed(TRUE); +// m_btnMenu.SetCanStayPressed(FALSE); +// m_btnMax.SetAutoPressed(TRUE); +// m_btnMax.SetCanStayPressed(FALSE); +// m_btnRestore.SetAutoPressed(TRUE); +// m_btnRestore.SetCanStayPressed(FALSE); + + // m_SendDelete.SetAutoPressed(TRUE); + // m_SendDelete.SetCanStayPressed(FALSE); + // m_SendUpload.SetAutoPressed(TRUE); + // m_SendUpload.SetCanStayPressed(FALSE); + // m_SendCancel.SetAutoPressed(TRUE); + // m_SendCancel.SetCanStayPressed(FALSE); + + // m_DownOffline.SetAutoPressed(TRUE); + // m_DownOffline.SetCanStayPressed(FALSE); + // m_DownDelete.SetAutoPressed(TRUE); + // m_DownDelete.SetCanStayPressed(FALSE); + // m_DownRemindLater.SetAutoPressed(TRUE); + // m_DownRemindLater.SetCanStayPressed(FALSE); + // m_DownDownload.SetAutoPressed(TRUE); + // m_DownDownload.SetCanStayPressed(FALSE); + // m_DownCancel.SetAutoPressed(TRUE); + // m_DownCancel.SetCanStayPressed(FALSE); + +// m_DownShowOffline.SetAutoPressed(TRUE); +// m_DownShowOffline.SetCanStayPressed(TRUE); +// m_DownShowOffline.SetPressed(FALSE); + +// m_Library.SetAutoPressed(FALSE); +// m_Library.SetCanStayPressed(TRUE); +// m_Library.SetPressed(FALSE); + +// m_Transfer.SetAutoPressed(FALSE); +// m_Transfer.SetCanStayPressed(TRUE); +// m_Transfer.SetPressed(TRUE); + +// m_btnX.SetWindowPos(NULL,382,13,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_btnMin.SetWindowPos(NULL,360,13,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_btnMenu.SetWindowPos(NULL,13,14,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_Transfer.SetWindowPos(NULL,137,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_Library.SetWindowPos(NULL,14,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// m_ctrlReceiving.SetTextColor(0xffffff); +// m_ctrlReceiving.SetTransparent(TRUE); +// m_ctrlReceiving.SetFontName(_T("Arial")); +// m_ctrlReceiving.SetFontSize(-8); +// m_ctrlReceiving.SetWindowPos(NULL,20,ClRect.Height()/2+10,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// m_ctrlSending.SetTextColor(0xffffff); +// m_ctrlSending.SetTransparent(TRUE); +// m_ctrlSending.SetFontName(_T("Arial")); +// m_ctrlSending.SetFontSize(-8); +// m_ctrlSending.SetWindowPos(NULL,20,91,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// AddAnchor(m_ctrlSending.GetSafeHwnd(),CSize(0,0),CSize(0,0)); +// AddAnchor(m_ctrlReceiving.GetSafeHwnd(),CSize(0,50),CSize(100,50)); + +// AddAnchor(m_FileUploadDlg.GetSafeHwnd(),CSize(0,0),CSize(100,50)); +// AddAnchor(m_FileDownlaodDlg.GetSafeHwnd(),CSize(0,50),CSize(100,100)); +// AddAnchor(m_FileExplore.GetSafeHwnd(),CSize(0,0),CSize(100,100)); + + OnClickBtnLibrary(); + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_FILEMANAGER, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +//DEL void CFileManagerDlg::OnPaint() +//DEL { +//DEL CPaintDC dc(this); // device context for painting +//DEL +//DEL CRect m_Client; +//DEL GetClientRect(&m_Client); +//DEL m_ResizeFon.Render(dc.GetSafeHdc(),m_Client.Size()); +//DEL } + +//DEL BOOL CFileManagerDlg::OnEraseBkgnd( CDC* pDC ) +//DEL { +//DEL return TRUE; +//DEL } + +//DEL BOOL CFileManagerDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +//DEL { +//DEL if(!(GetStyle()&WS_MAXIMIZE)) +//DEL { +//DEL CRect StatusRect, miniRect; +//DEL +//DEL GetClientRect(&StatusRect); +//DEL +//DEL CPoint point, inPoint; +//DEL +//DEL ::GetCursorPos(&point); +//DEL inPoint = point; +//DEL ScreenToClient(&inPoint); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL nHitTest = HTBOTTOMLEFT; +//DEL else +//DEL nHitTest = HTLEFT; +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMRIGHT; +//DEL else +//DEL nHitTest = HTRIGHT; +//DEL else if(inPoint.yminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yShowGeneralMenu(); +} + +void CFileManagerDlg::AddToDownload(CUser &Sender, IFile *pFile) +{ + pFrgWindow = GetForegroundWindow(); + OnClickBtnReceived(); + m_FileDownlaodDlg.AddToDownload(Sender,pFile); + ShowDialog(TRUE); +} + +void CFileManagerDlg::AddToUpLoad(CString FileName, CString Login, long RecepientID, LPCTSTR strDescription) +{ + OnClickBtnSent(); + m_FileUploadDlg.AddToUpLoad(FileName, Login, RecepientID, strDescription); + ShowDialog(); +} + +void CFileManagerDlg::RefreshSenderDetails(CUser &User) +{ + m_FileDownlaodDlg.RefreshSenderDetails(User); +} + +void CFileManagerDlg::OnTimer(UINT nIDEvent) +{ + if(nIDEvent==101) + { + if(IsWindow(m_FileUploadDlg.GetSafeHwnd())) + { + // m_SendDelete.EnableWindow(m_FileUploadDlg.GetDlgItem(IDC_DELETEFILE_BUTTON)->IsWindowEnabled()); + // m_SendUpload.EnableWindow(m_FileUploadDlg.GetDlgItem(IDC_UPLOAD_BUTTON)->IsWindowEnabled()); + // m_SendCancel.EnableWindow(m_FileUploadDlg.GetDlgItem(IDC_CANCEL_BUTTON)->IsWindowEnabled()); + } + if(IsWindow(m_FileDownlaodDlg.GetSafeHwnd())) + { + // m_DownOffline.EnableWindow(m_FileDownlaodDlg.GetDlgItem(IDC_OFFLINE_BUTTON)->IsWindowEnabled()); + // m_DownDelete.EnableWindow(m_FileDownlaodDlg.GetDlgItem(IDC_DELETE_BUTTON)->IsWindowEnabled()); + // m_DownRemindLater.EnableWindow(m_FileDownlaodDlg.GetDlgItem(IDC_REMEMBERLATER_BUTTON)->IsWindowEnabled()); + // m_DownDownload.EnableWindow(m_FileDownlaodDlg.GetDlgItem(IDC_DOWNLOAD_BUTTON)->IsWindowEnabled()); + // m_DownCancel.EnableWindow(m_FileDownlaodDlg.GetDlgItem(IDC_CANCEL_BUTTON)->IsWindowEnabled()); + } + } + + COFSNcDlg2::OnTimer(nIDEvent); +} + +void CFileManagerDlg::ShowDialog(BOOL bAfterDownload) +{ + if(!bAfterDownload) + { + if(GetStyle()&WS_MAXIMIZE) + { + ShowWindow(SW_SHOW); + } + else + { + ShowWindow(SW_SHOWNORMAL); + } + SetForegroundWindow(); + SetFocus(); + } + else + { + if(!(GetStyle()&WS_VISIBLE)) + { + ShowWindow(SW_SHOWMINNOACTIVE); + if(pFrgWindow) + pFrgWindow->PostMessage(WM_ACTIVATE,WA_ACTIVE,0); + } + + /*::FlashWindow(GetSafeHwnd(),TRUE);*/ + + FLASHWINFO flashInfo = {0}; + flashInfo.cbSize = sizeof(FLASHWINFO); + flashInfo.hwnd = GetSafeHwnd(); + flashInfo.dwFlags = FLASHW_ALL; + flashInfo.uCount = 5; + flashInfo.dwTimeout = 500; + + ::FlashWindowEx(&flashInfo); + + } + //SetTimer(101,100,NULL); +} + +void CFileManagerDlg::OnClose() +{ + KillTimer(101); + + COFSNcDlg2::OnClose(); +} + +void CFileManagerDlg::OnClickMcSendDelete() +{ + m_FileUploadDlg.OnDeletefileButton(); +} + +void CFileManagerDlg::OnClickMcSendUpload() +{ + m_FileUploadDlg.OnUploadButton(); +} + +void CFileManagerDlg::OnClickMcSendCancel() +{ + m_FileUploadDlg.OnCancelButton(); +} + +void CFileManagerDlg::OnClickMcDownOffline() +{ + m_FileDownlaodDlg.OnOfflineButton(); +} + +void CFileManagerDlg::OnClickMcDownDelete() +{ + m_FileDownlaodDlg.OnDeleteButton(); +} + +void CFileManagerDlg::OnClickMcDownRemlater() +{ + m_FileDownlaodDlg.OnRememberlaterButton(); +} + +void CFileManagerDlg::OnClickMcDownDownload() +{ + m_FileDownlaodDlg.OnDownloadButton(); +} + +void CFileManagerDlg::OnClickMcDownCancel() +{ + m_FileDownlaodDlg.OnCancelButton(); +} + +void CFileManagerDlg::OnClickMcDownShowOffline() +{ + m_FileDownlaodDlg.m_bShowOfflineFiles = !m_FileDownlaodDlg.m_bShowOfflineFiles; + m_FileDownlaodDlg.OnShowofflinefilesCheck(); +} + +void CFileManagerDlg::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_FILEMANAGER,RectToString(rWindow)); + + COFSNcDlg2::OnCaptureChanged(pWnd); +} + + + +void CFileManagerDlg::OnDestroy() +{ + COFSNcDlg2::OnDestroy(); + // TODO: Add your message handler code here + m_FileDownlaodDlg.SendMessage(WM_CLOSE); + m_FileDownlaodDlg.DestroyWindow(); + m_FileUploadDlg.SendMessage(WM_CLOSE); + m_FileUploadDlg.DestroyWindow(); + m_FileExplore.SendMessage(WM_CLOSE); + m_FileExplore.DestroyWindow(); + +} + +void CFileManagerDlg::OnClickMcmaxi() +{ + ShowWindow(SW_MAXIMIZE); +} + +void CFileManagerDlg::OnClickMcmaximini() +{ + ShowWindow(SW_RESTORE); +} + +void CFileManagerDlg::AddToUpload2(CString FileName, CString Login, CString RecepientID, LPCTSTR strDescription) +{ + OnClickBtnSent(); + m_FileUploadDlg.AddToUpload2(FileName, Login, RecepientID, strDescription); + ShowDialog(); +} + +void CFileManagerDlg::DeleteAllItem() +{ + m_DownShowOffline.SetPressed(FALSE); + m_FileUploadDlg.DeleteAllItem(); + m_FileDownlaodDlg.DeleteAllItem(); +} + +void CFileManagerDlg::SetUserDocumetFolder(LPCTSTR strPath) +{ + m_FileUploadDlg.LoadFilesHistory(); + m_FileDownlaodDlg.LoadFilesHistory(); + m_FileExplore.SetStartFolder(strPath); +} + + +void CFileManagerDlg::AddToUpload3(LPCTSTR XML) +{ + OnClickBtnSent(); + m_FileUploadDlg.AddToUpload3(XML); + ShowDialog(); +} + +void CFileManagerDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Maximize"), &m_btnMax, TRUE, FALSE, 1); + LoadButton(pXmlRoot, _T("Restore"), &m_btnRestore, TRUE, FALSE, 2); + + LoadButton(pXmlRoot, _T("Menu"), &m_btnMenu, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Library"), &m_btnLibrary, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Received"), &m_btnReceived, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Sent"), &m_btnSent, TRUE, TRUE); + LoadButton(pXmlRoot, _T("ShowAll"), &m_DownShowOffline, TRUE, TRUE); + + LoadRectangle2(pXmlRoot, _T("Files"), m_FileExplore.GetSafeHwnd(), TRUE); + LoadRectangle2(pXmlRoot, _T("Files"), m_FileDownlaodDlg.GetSafeHwnd(), FALSE); + LoadRectangle2(pXmlRoot, _T("Files"), m_FileUploadDlg.GetSafeHwnd(), FALSE); + + CComBSTR bs; + SelectChildNode(pXmlRoot, CComBSTR(L"Color[@Name='Splitter']"), NULL, &bs); + if(bs.m_str != NULL) + { + long cr; + int n = swscanf(bs.m_str, L"0x%06x", &cr); + if(n == 1) + { + m_crSplitter = cr; + m_FileExplore.SetBkColor(m_crSplitter); + } + } +} + +void CFileManagerDlg::OnClickBtnLibrary() +{ + m_btnLibrary.SetPressed(TRUE); + m_btnReceived.SetPressed(FALSE); + m_btnSent.SetPressed(FALSE); + + m_FileExplore.ShowWindow(SW_SHOWNOACTIVATE); + m_FileDownlaodDlg.ShowWindow(SW_HIDE); + m_FileUploadDlg.ShowWindow(SW_HIDE); + + m_DownShowOffline.ShowWindow(SW_HIDE); +} + +void CFileManagerDlg::OnClickBtnReceived() +{ + m_btnLibrary.SetPressed(FALSE); + m_btnReceived.SetPressed(TRUE); + m_btnSent.SetPressed(FALSE); + + m_FileExplore.ShowWindow(SW_HIDE); + m_FileDownlaodDlg.ShowWindow(SW_SHOWNOACTIVATE); + m_FileUploadDlg.ShowWindow(SW_HIDE); + + m_DownShowOffline.ShowWindow(SW_SHOWNOACTIVATE); +} + +void CFileManagerDlg::OnClickBtnSent() +{ + m_btnLibrary.SetPressed(FALSE); + m_btnReceived.SetPressed(FALSE); + m_btnSent.SetPressed(TRUE); + + m_FileExplore.ShowWindow(SW_HIDE); + m_FileDownlaodDlg.ShowWindow(SW_HIDE); + m_FileUploadDlg.ShowWindow(SW_SHOWNOACTIVATE); + + m_DownShowOffline.ShowWindow(SW_HIDE); +} + +int CFileManagerDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (COFSNcDlg2::OnCreate(lpCreateStruct) == -1) + return -1; + + m_FileUploadDlg.Create(CFileUploadDlg::IDD,this); + m_FileUploadDlg.SetMessenger(m_pMessenger); + + m_FileDownlaodDlg.Create(CFileDownloadDlg::IDD,this); + m_FileDownlaodDlg.SetMessanger(m_pMessenger); + + m_FileExplore.Create(CFileExplore::IDD,this); + + return 0; +} + diff --git a/Source/Client/IM-Client/IMClient/FileManagerDlg.h b/Source/Client/IM-Client/IMClient/FileManagerDlg.h new file mode 100644 index 0000000..f10e55f --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileManagerDlg.h @@ -0,0 +1,111 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +//}}AFX_INCLUDES +#if !defined(AFX_FILEMANAGERDLG_H__6665B388_2B9E_4BC6_87BE_0EC2727C64F8__INCLUDED_) +#define AFX_FILEMANAGERDLG_H__6665B388_2B9E_4BC6_87BE_0EC2727C64F8__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// FileManagerDlg.h : header file +// + +#include "OfsNCDlg2.h" +#include "Label.h" +#include "ResizableImage.h" +#include "McButton.h" + +#include "FileDownloadDlg.h" +#include "FileUploadDlg.h" +#include "FileExplore.h" +#include "Label.h" + +class CMainDlg; +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg dialog + +class CFileManagerDlg : public COFSNcDlg2 +{ +// Construction +public: + void AddToUpload3(LPCTSTR XML); + void SetUserDocumetFolder(LPCTSTR strPath); + void DeleteAllItem(); + void AddToUpload2(CString FileName, CString Login, CString RecepientID, LPCTSTR strDescription); + void ShowDialog(BOOL bAfterDownload = FALSE); + void RefreshSenderDetails(CUser &User); + void AddToUpLoad(CString FileName, CString Login,long RecepientID, LPCTSTR strDescription); + void AddToDownload(CUser &Sender,IFile *pFile); + CFileManagerDlg(CMainDlg *pMessenger,CWnd* pParent = NULL); // standard constructor + ~CFileManagerDlg(); +// Dialog Data + //{{AFX_DATA(CFileManagerDlg) + enum { IDD = IDD_FILEMANAGER_DIALOG }; + CMcButton m_btnX; + CMcButton m_btnMin; + CMcButton m_btnMax; + CMcButton m_btnRestore; + CMcButton m_btnMenu; + CMcButton m_btnLibrary; + CMcButton m_btnReceived; + CMcButton m_btnSent; + CMcButton m_DownShowOffline; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileManagerDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation + protected: + COLORREF m_crSplitter; + void LoadSkin(IXMLDOMNode *pXmlRoot); + CMainDlg* m_pMessenger; +// CResizableImage m_ResizeFon; + CFileDownloadDlg m_FileDownlaodDlg; + CFileUploadDlg m_FileUploadDlg; + CFileExplore m_FileExplore; + CWnd *pFrgWindow; + + // Generated message map functions + //{{AFX_MSG(CFileManagerDlg) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnTimer(UINT nIDEvent); + afx_msg void OnClose(); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnDestroy(); + afx_msg void OnClickBtnLibrary(); + afx_msg void OnClickBtnReceived(); + afx_msg void OnClickBtnSent(); + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + void OnClickMcclose(); + void OnClickMcmini(); + void OnClickMcmenu(); + void OnClickMcSendDelete(); + void OnClickMcSendUpload(); + void OnClickMcSendCancel(); + void OnClickMcDownOffline(); + void OnClickMcDownDelete(); + void OnClickMcDownRemlater(); + void OnClickMcDownDownload(); + void OnClickMcDownCancel(); + void OnClickMcDownShowOffline(); + void OnClickMcmaxi(); + void OnClickMcmaximini(); + + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_FILEMANAGERDLG_H__6665B388_2B9E_4BC6_87BE_0EC2727C64F8__INCLUDED_) + diff --git a/Source/Client/IM-Client/IMClient/FileUploadDlg.cpp b/Source/Client/IM-Client/IMClient/FileUploadDlg.cpp new file mode 100644 index 0000000..947bd19 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileUploadDlg.cpp @@ -0,0 +1,1570 @@ +// FileUploadDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "FileUploadDlg.h" +#include "resource.h" +#include "MainDlg.h" +#include "FileDescriptioDlg.h" +#include "SupportXMLFunction.h" +#include "MessageDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CFileUploadDlg dialog +// TCHAR strUFileStatus[3][20] = {"Incomplete", "Complete", "Incomplete"}; +DWORD strUFileStatus[4] = {IDS_FILE_INCOMPLETE_NAME, IDS_FILE_COMPLETE_NAME,IDS_FILE_INCOMPLETE_NAME, IDS_FILE_PUBLISHED_NAME}; +// TCHAR strUFileProgress[6][20] = {"", "Wait", "0%", "", "Cancel", "Error" }; +DWORD strUFileProgress[6] = {IDS_FILE_EMPTY,IDS_FILE_WAIT_NAME ,IDS_FILE_START_NAME,IDS_FILE_EMPTY,IDS_FILE_CANCEL_NAME,IDS_FILE_ERROR_NAME}; + +CFileUploadDlg::CFileUploadDlg(CWnd* pParent /*=NULL*/) + : CResizableDialog(CFileUploadDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CFileUploadDlg) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + //CoInitialize(NULL); + bWasSetComplet = FALSE; + m_lastUserId = 0; + + //CMcLoaderImpl test; +} + +CFileUploadDlg::~CFileUploadDlg() +{ + while(ListArray.GetSize () ) + { + CUFileInfo *pItem = ListArray.GetAt (0); + delete ListArray.GetAt (0); + ListArray.RemoveAt (0); + } +} + + +void CFileUploadDlg::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CFileUploadDlg) + DDX_Control(pDX, IDC_CANCEL_BUTTON, m_btnCancel); + DDX_Control(pDX, IDC_DELETEFILE_BUTTON, m_btnDeleteFile); + DDX_Control(pDX, IDC_UPLOAD_BUTTON, m_btnUpLoadFile); + DDX_Control(pDX, IDC_FILE_UPLOAD_LIST, m_FileUpLoadList); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CFileUploadDlg, CResizableDialog) + //{{AFX_MSG_MAP(CFileUploadDlg) + ON_BN_CLICKED(IDOK, OnOk) + ON_WM_CLOSE() + ON_WM_TIMER() + ON_NOTIFY(LVN_ITEMCHANGED, IDC_FILE_UPLOAD_LIST, OnItemchangedFileUploadList) + ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickFileUploadList) + ON_NOTIFY(NM_DBLCLK, IDC_FILE_UPLOAD_LIST, OnDblclkFileUploadList) + ON_NOTIFY(NM_RCLICK, IDC_FILE_UPLOAD_LIST, OnRclickFileUploadList) + ON_COMMAND(ID_FILESUPLOAD_CANCELTRANSFER, OnFilesuploadCanceltransfer) + ON_UPDATE_COMMAND_UI(ID_FILESUPLOAD_CANCELTRANSFER, OnUpdateFilesuploadCanceltransfer) + ON_COMMAND(ID_FILESUPLOAD_CLEARRECORD, OnFilesuploadClearrecord) + ON_UPDATE_COMMAND_UI(ID_FILESUPLOAD_CLEARRECORD, OnUpdateFilesuploadClearrecord) + ON_COMMAND(ID_FILESUPLOAD_UPLOAD, OnFilesuploadUpload) + ON_UPDATE_COMMAND_UI(ID_FILESUPLOAD_UPLOAD, OnUpdateFilesuploadUpload) + ON_BN_CLICKED(IDC_DELETEFILE_BUTTON, OnDeletefileButton) + ON_BN_CLICKED(IDC_UPLOAD_BUTTON, OnUploadButton) + ON_BN_CLICKED(IDC_CANCEL_BUTTON, OnCancelButton) + ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) + ON_MESSAGE(WM_UPLOAD_BEGIN,OnUploadBegin) + ON_MESSAGE(WM_UPLOAD_STEP,OnUploadStep) + ON_MESSAGE(WM_UPLOAD_APP_PROGRESS,OnUploadAppProgress) + ON_MESSAGE(WM_UPLOAD_APP_COMPLETED,OnUploadAppCompleted) + ON_COMMAND(ID_FILESUPLOAD_INFORMATION, OnFilesuploadInformation) + ON_UPDATE_COMMAND_UI(ID_FILESUPLOAD_INFORMATION, OnUpdateFilesuploadInformation) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CFileUploadDlg message handlers + +void CFileUploadDlg::OnOk() +{ + // TODO: Add your control notification handler code here + +} + +void CFileUploadDlg::OnCancel() +{ + // TODO: Add extra cleanup here + + ///CResizableDialog::OnCancel(); +} + +void CFileUploadDlg::OnDeletefileButton() +{ + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + int CorrectIndex = 0; + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + m_LockList.Lock(); + try + { + delete ListArray.GetAt (iSel - CorrectIndex); + ListArray.RemoveAt (iSel - CorrectIndex); + CorrectIndex++; + } + catch(...) + { + } + m_LockList.Unlock(); + } + BuildList(); + BlockOrUnBlock(); +} + +void CFileUploadDlg::OnUploadButton() +{ + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + if(pMessenger->ConnectEnable()&&pos) + { + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + + if(pUFileInfop->pMcFileUp==NULL) + { + try + { + pUFileInfop->pFile = pSession->CreateFile(); + BSTR FileName = pUFileInfop->strFileName.AllocSysString(); + pUFileInfop->pFile->PutRealName(FileName); + ::SysFreeString(FileName); + //pUFileInfop->pFile->PutFID(GUIDGen()); + IUsersPtr pUsers = pUFileInfop->pFile->GetRecipients(); + + if(pUFileInfop->RecepientID==-1) + { + CString strTmp = pUFileInfop->strRecepientID; + while(!strTmp.IsEmpty()) + { + long RecepientID = _ttol((LPCTSTR)strTmp); + + if(strTmp.Find(',')!=-1) + strTmp = strTmp.Mid(strTmp.Find(',')+1); + else + strTmp.Empty(); + + if(RecepientID) + { + IUserPtr pUser = pUsers->AddUser(); + pUser->PutValue("@id",RecepientID); + } + } + } + else + { + IUserPtr pUser = pUsers->AddUser(); + pUser->PutValue("@id",pUFileInfop->RecepientID); + } + + pUFileInfop->pFile->PuthWnd(long(this->m_hWnd)); + pUFileInfop->pFile->PutBody((LPCTSTR)pUFileInfop->strDescription); + theNet2.LockTranslator(); + try + { + HRESULT hr = pUFileInfop->pFile->Send(&(pUFileInfop->Handle)); + if(SUCCEEDED(hr)&&pUFileInfop->Handle) + { + theNet2.AddToTranslator(pUFileInfop->Handle,this->m_hWnd); + //CTime tStartTtime = CTime::GetCurrentTime(); + //pUFileInfop->dwTime = (DWORD)tStartTtime.GetTime () ; + ChangeStatus(US_NEW,iSel); + ChangeProgress(UP_WAIT, iSel); + } + } + catch(...) + { + } + theNet2.UnlockTranslator(); + } + catch(...) + { + } + } + else + { + if(SUCCEEDED(pUFileInfop->pMcFileUp->Send(GetSafeHwnd(),WM_UPLOAD_APP_PROGRESS,WM_UPLOAD_APP_COMPLETED,pMessenger->GetServerPath(),pMessenger->GetSID()))) + { + pUFileInfop->Handle = (long)pUFileInfop->pMcFileUp; + ChangeStatus(US_NEW,iSel); + ChangeProgress(UP_WAIT, iSel); + } + } + } + + BlockOrUnBlock(); + } +} + +void CFileUploadDlg::OnCancelButton() +{ + CUFileInfo *pUFileInfo = NULL; + + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos==NULL) return; + + if(pMessenger->ConnectEnable ()) + { + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + pUFileInfo = (CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + if(pUFileInfo->pMcFileUp==NULL) + { + if(pUFileInfo->Handle) + pSession->CancelOperation(pUFileInfo->Handle); + } + else + { + try + { + (*(pUFileInfo->pMcFileUp))->Stop(); + } + catch(_com_error&) + { + ASSERT(FALSE); + } + } + } + } + + BlockOrUnBlock(); +} + +void CFileUploadDlg::OnClose() +{ + // TODO: Add your message handler code here and/or call default + //KillTimer(IDC_UPLOAD_TIMER); + + CString strSection = GetString(IDS_OFSMESSENGER); + CString strEntry = GetString(IDS_COLUMN_WIDTH); + + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("20"), m_FileUpLoadList.GetColumnWidth(0)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("21"), m_FileUpLoadList.GetColumnWidth(1)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("22"), m_FileUpLoadList.GetColumnWidth(2)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("23"), m_FileUpLoadList.GetColumnWidth(3)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("24"), m_FileUpLoadList.GetColumnWidth(4)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("25"), m_FileUpLoadList.GetColumnWidth(5)); + AfxGetApp()->WriteProfileInt(strSection, strEntry+_T("26"), m_FileUpLoadList.GetColumnWidth(6)); + + WriteOptionInt(IDS_OFSMESSENGER,IDS_OUTGOING_FILE,m_iSortingMode); + + CResizableDialog::OnClose(); +} + +BOOL CFileUploadDlg::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + //m_FileStatusImageList.Create(IDB_DOWNLOAD_FILESTATUS,16,1,0xff00ff); + m_SortHeader.SubclassWindow(m_FileUpLoadList.GetHeaderCtrl()->GetSafeHwnd()); + + pSession = theNet2.GetSession(); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + AddAnchor(IDC_DELETEFILE_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_UPLOAD_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_CANCEL_BUTTON,CSize(100,100),CSize(100,100)); + AddAnchor(IDC_FILE_UPLOAD_LIST,CSize(0,0),CSize(100,100)); + + // TODO: Add extra initialization here + DWORD ExStyle=m_FileUpLoadList.GetExtendedStyle (); + ExStyle|=LVS_EX_FULLROWSELECT; + m_FileUpLoadList.SetExtendedStyle (ExStyle); + + CString strSection = GetString(IDS_OFSMESSENGER); + CString strEntry = GetString(IDS_COLUMN_WIDTH); + + m_FileUpLoadList.InsertColumn (0,GetString(IDS_FILENAME_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("20"), 120)); + m_FileUpLoadList.InsertColumn (1,GetString(IDS_RECIPIENT_NAME),LVCFMT_CENTER,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("21"), 110),1); + m_FileUpLoadList.InsertColumn (2,GetString(IDS_STATUS_NAME),LVCFMT_CENTER,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("22"), 90),2); + m_FileUpLoadList.InsertColumn (3,GetString(IDS_PROGRESS_NAME),LVCFMT_RIGHT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("23"), 60),3); + m_FileUpLoadList.InsertColumn (4,GetString(IDS_DATE_NAME),LVCFMT_LEFT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("24"), 90),4); + m_FileUpLoadList.InsertColumn (5,GetString(IDS_FILESIZE_NAME),LVCFMT_RIGHT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("25"), 65),5); + m_FileUpLoadList.InsertColumn (6,GetString(IDS_DESCRIPTION_NAME),LVCFMT_RIGHT,AfxGetApp()->GetProfileInt(strSection, strEntry+_T("26"), 90),6); + + //m_FileStatusImageList.Attach(GetSystemImageList(TRUE)); + m_iSortingMode = GetOptionInt(IDS_OFSMESSENGER,IDS_OUTGOING_FILE,3); + + m_FileUpLoadList.SetImageList(CImageList::FromHandle(GetSystemImageList(TRUE)),LVSIL_SMALL); + + ShowDialog(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CFileUploadDlg::OnTimer(UINT nIDEvent) +{ + if(bWasSetComplet) + { +/* + m_LockList.Lock(); + try + { + for(int i = (ListArray.GetSize () - 1); i >= 0;i--) + { + CUFileInfo *pUFileInfo = ListArray.GetAt(i); + if(pUFileInfo->iProgress == UP_COMPLET) + { + delete pUFileInfo; + ListArray.RemoveAt (i); + } + } + } + catch(...) + {} + m_LockList.Unlock(); + + bWasSetComplet = FALSE; + BuildList(); + BlockOrUnBlock();*/ + + } + else + { + //// Анимация Иконок .... //// + } + + CResizableDialog::OnTimer(nIDEvent); +} + +void CFileUploadDlg::BlockOrUnBlock() +{ + /*BOOL bFlagSee1 = TRUE, bFlagSee2 = TRUE; + + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus == US_NEW || pUFileInfop->iStatus == US_STOP) + { + bFlagSee1&=TRUE; + bFlagSee2&=FALSE; + } + else + { + bFlagSee1&=FALSE; + bFlagSee2&=TRUE; + } + + if(pUFileInfop->iProgress == UP_COMPLET) + { + bFlagSee1&=FALSE; + bFlagSee2&=FALSE; + } + } + } + else + { + bFlagSee1=FALSE; + bFlagSee2=FALSE; + } + + m_btnUpLoadFile.EnableWindow (bFlagSee1); + m_btnDeleteFile.EnableWindow (bFlagSee1); + m_btnCancel.EnableWindow (bFlagSee2);*/ +} + +LRESULT CFileUploadDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + long Handle = pItem->Handel; + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(pItem->Handel); + theNet2.UnlockTranslator(); + + int iIndex = GetItemFromHandle(Handle); + if(iIndex!=-1) + { + switch(pItem->EventType) + { + case NLT_ECommandOK: + ChangeStatus(US_UPLOAD,iIndex); + ChangeProgress(UP_COMPLET,iIndex); + break; + case NLT_ECommandError: + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + + ChangeStatus(US_STOP,iIndex); + if(pItem->Long1==etCANCEL) + ChangeProgress(UP_CANCEL,iIndex); + else + ChangeProgress(UP_ERROR ,iIndex); + break; + } + } + + BlockOrUnBlock(); + + delete pItem; + return 0; +} + +LRESULT CFileUploadDlg::OnUploadBegin(WPARAM w,LPARAM l) +{ + TRACE(_T("\r\n CFileUploadDlg::OnUploadBegin LP = %d"), l); + int iIndex = GetItemFromHandle(long(w)); + if(iIndex!=-1) + { + ChangeProgress(UP_PROCENT,iIndex,0); + CUFileInfo *pUFileInfo = (CUFileInfo *)m_FileUpLoadList.GetItemData (iIndex); + pUFileInfo->BufferSize = (long)l; + //CTime tStartTime = CTime::GetCurrentTime(); + //pUFileInfo->dwTime = (DWORD)tStartTime.GetTime(); + } + return 0; +} + +LRESULT CFileUploadDlg::OnUploadStep(WPARAM w,LPARAM l) +{ + TRACE(_T("\r\n CFileUploadDlg::OnUploadStep LP = %d"), l); + int iIndex = GetItemFromHandle(long(w)); + if(iIndex!=-1) + ChangeProgress(UP_PROCENT,iIndex,(long)l); + return 0; +} + +void CFileUploadDlg::ShowDialog() +{ + ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(); + SetFocus(); + //SetTimer(IDC_UPLOAD_TIMER,1000,NULL); +} + +void CFileUploadDlg::AddToUpLoad(CString FileName, CString Login,long RecepientID, LPCTSTR strDescription) +{ + if(!TestFile(FileName)) + return; + + CUFileInfo *pNewFile = new CUFileInfo; + + CFile UploadFile(FileName,CFile::modeRead|CFile::shareDenyNone); + + pNewFile->Size = UploadFile.GetLength(); + UploadFile.Close(); + + CTime tStartTtime = CTime::GetCurrentTime(); + pNewFile->dwTime = (DWORD)tStartTtime.GetTime () ; + + pNewFile->Handle = 0; + pNewFile->iProgress = UP_WAIT; + pNewFile->iStatus = US_NEW; + pNewFile->strFileName = FileName; + pNewFile->RecepientID = RecepientID; + pNewFile->RecepientStr = Login; + pNewFile->strDescription = strDescription; + pNewFile->pMcFileUp = NULL; + + m_LockList.Lock(); + try + { + ListArray.Add (pNewFile); + } + catch(...) + { + } + m_LockList.Unlock(); + + if(pMessenger->ConnectEnable()) + { + try + { + CUFileInfo *pUFileInfop=(CUFileInfo *)pNewFile; + + pUFileInfop->pFile = pSession->CreateFile(); + BSTR FileName = pUFileInfop->strFileName.AllocSysString(); + pUFileInfop->pFile->PutRealName(FileName); + ::SysFreeString(FileName); + + IUsersPtr pUsers = pUFileInfop->pFile->GetRecipients(); + IUserPtr pUser = pUsers->AddUser(); + pUser->PutValue("@id",pUFileInfop->RecepientID); + pUFileInfop->pFile->PuthWnd(long(this->m_hWnd)); + pUFileInfop->pFile->PutBody((LPCTSTR)pUFileInfop->strDescription); + theNet2.LockTranslator(); + try + { + HRESULT hr = pUFileInfop->pFile->Send(&(pUFileInfop->Handle)); + if(SUCCEEDED(hr)&&pUFileInfop->Handle) + { + theNet2.AddToTranslator(pUFileInfop->Handle,this->m_hWnd); + //CTime tStartTtime = CTime::GetCurrentTime(); + //pUFileInfop->dwTime = (DWORD)tStartTtime.GetTime () ; + } + } + catch(...) + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + theNet2.UnlockTranslator(); + } + catch(...) + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + + BlockOrUnBlock(); + } + else + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + + BuildList(); + //ShowDialog(); +} + +void CFileUploadDlg::BuildList() +{ + CString tmp; + + m_LockList.Lock(); + //Возможно Умное Удалене .... :) + try + { + m_FileUpLoadList.DeleteAllItems (); + + + for(int i = 0;i < ListArray.GetSize ();i++) + { + CUFileInfo *pUFileInfo = ListArray.GetAt(i); + CString strTmp = pUFileInfo->strFileName; + strTmp = strTmp.Mid(strTmp.ReverseFind('\\')+1); + + int iSubIndex = m_FileUpLoadList.InsertItem (LVIF_TEXT|LVIF_PARAM|LVIF_IMAGE,i,strTmp,0,0,GetIconIndexInSystemImageList(TRUE,strTmp),(LPARAM)pUFileInfo); + m_FileUpLoadList.SetItemText (iSubIndex,1,LPCTSTR(pUFileInfo->RecepientStr)); + m_FileUpLoadList.SetItemText (iSubIndex,2,GetString(strUFileStatus[pUFileInfo->iStatus])); + m_FileUpLoadList.SetItemText (iSubIndex,3,GetString(strUFileProgress[pUFileInfo->iProgress])); + + // Create Date String [6/19/2002] + SYSTEMTIME sysFileTime = TimeTToSystemTime(pUFileInfo->dwTime); + TCHAR szDate[MAX_PATH]=_T(""), szTime[MAX_PATH]=_T(""); + + GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&sysFileTime,NULL,szDate,MAX_PATH); + GetTimeFormat(LOCALE_USER_DEFAULT,NULL,&sysFileTime,NULL,szTime,MAX_PATH); + + CString strDataFormat; + strDataFormat.Format(_T("%s %s"),szDate,szTime); + // End Create Date String [6/19/2002] + + m_FileUpLoadList.SetItemText (iSubIndex,4,strDataFormat);// Date ... + + m_FileUpLoadList.SetItemText (iSubIndex,5,ByteSizeToStr(pUFileInfo->Size)); + m_FileUpLoadList.SetItemText (iSubIndex,6,LPCTSTR(pUFileInfo->strDescription)); + } + + SortList(m_iSortingMode); + } + catch(...) + {} + m_LockList.Unlock(); +} + +void CFileUploadDlg::SortList(int Mode) +{ + m_FileUpLoadList.SortItems (CompareListItem,(LPARAM)Mode); + m_SortHeader.SetSortArrow((m_iSortingMode>0?m_iSortingMode:-m_iSortingMode)-1,(m_iSortingMode>0?TRUE:FALSE)); +} + +int CALLBACK CFileUploadDlg::CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + CUFileInfo *pDUFileInfo1=(CUFileInfo *)(lParam1); + CUFileInfo *pDUFileInfo2=(CUFileInfo *)(lParam2); + + int bValAddon = (lParamSort>=0?1:-1); + + CString strFileName1, strFileName2; + + switch(bValAddon*lParamSort) + { + case 1: + // File Name [1/28/2002] + strFileName1 = pDUFileInfo1->strFileName.Right(pDUFileInfo1->strFileName.GetLength() - pDUFileInfo1->strFileName.ReverseFind(_T('\\'))); + strFileName2 = pDUFileInfo2->strFileName.Right(pDUFileInfo2->strFileName.GetLength() - pDUFileInfo2->strFileName.ReverseFind(_T('\\'))); + + if(strFileName1strFileName2) return 1*bValAddon; + break; + case 2: + // Sender [1/28/2002] + if(pDUFileInfo1->RecepientStr RecepientStr) return -1*bValAddon; + if(pDUFileInfo1->RecepientStr>pDUFileInfo2->RecepientStr) return 1*bValAddon; + break; + case 3: + //// Сортировка по статусу ... + if(pDUFileInfo1->iStatusiStatus) return -1*bValAddon; + if(pDUFileInfo1->iStatus>pDUFileInfo2->iStatus) return 1*bValAddon; + break; + case 4: + // Progress [1/28/2002] + if(pDUFileInfo1->iProgressiProgress) return -1*bValAddon; + if(pDUFileInfo1->iProgress>pDUFileInfo2->iProgress) return 1*bValAddon; + break; + case 5: + // Est.Time [1/28/2002] + if(pDUFileInfo1->dwTimedwTime) return -1*bValAddon; + if(pDUFileInfo1->dwTime>pDUFileInfo2->dwTime) return 1*bValAddon; + break; + case 6: + // FileSize [1/28/2002] + if(pDUFileInfo1->SizeSize) return -1*bValAddon; + if(pDUFileInfo1->Size>pDUFileInfo2->Size) return 1*bValAddon; + break; + case 7: + // Description [1/28/2002] + //if(pDUFileInfo1->strMessagestrMessage) return -1; + //if(pDUFileInfo1->strMessage>pDUFileInfo2->strMessage) return 1; + break; + } + + return 0; +} + +void CFileUploadDlg::ChangeStatus(UFileStatus duNewStatus,int iElement) +{ + CUFileInfo *pUFileInfo=(CUFileInfo *)m_FileUpLoadList.GetItemData (iElement); + pUFileInfo->iStatus = duNewStatus; + m_FileUpLoadList.SetItemText (iElement,2,GetString(strUFileStatus[duNewStatus])); + +} + + +void CFileUploadDlg::ChangeProgress(UFileProgress NewProgress, int iElement, long dwGetSize) +{ + CUFileInfo *pDUFileInfo=(CUFileInfo *)m_FileUpLoadList.GetItemData (iElement); + pDUFileInfo->iProgress = NewProgress; + + if(NewProgress == UP_COMPLET) + { + // Save item to Upolad DB + bWasSetComplet = TRUE; + pDUFileInfo->pFile = NULL; + if(pDUFileInfo->strFID.IsEmpty()) + pDUFileInfo->strFID = (LPCTSTR)GUIDGen(); + SaveFileToHistory(pDUFileInfo); + } + + if(NewProgress == UP_PROCENT) + { + CString strtmp; + long Size=pDUFileInfo->BufferSize; + + // Oleg Zhuk: Fix Problem incorrect transmission percentages [12/4/2003] + long lProgress = long(dwGetSize*1.0/Size*100); + if(lProgress>100) + lProgress = 100; + if(lProgress<0) + lProgress = 0; + // Oleg Zhuk End:[12/4/2003] + + strtmp.Format (_T("%d%%"), lProgress); + m_FileUpLoadList.SetItemText (iElement,3,strtmp); + } + else + m_FileUpLoadList.SetItemText (iElement,3,GetString(strUFileProgress[NewProgress])); + +} + +int CFileUploadDlg::GetItemFromHandle(long Handle) +{ + int nSize = m_FileUpLoadList.GetItemCount (); + + for(int i=0; i < nSize; i++) + { + CUFileInfo *pDUFileInfo=(CUFileInfo *)m_FileUpLoadList.GetItemData (i); + if(pDUFileInfo!=NULL && pDUFileInfo->Handle == Handle) + return i; + } + + return -1; +} + +//DEL int CFileUploadDlg::GetSelectedItem() +//DEL { +//DEL POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); +//DEL return m_FileUpLoadList.GetNextSelectedItem(pos); +//DEL } + +void CFileUploadDlg::OnItemchangedFileUploadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + // TODO: Add your control notification handler code here + BlockOrUnBlock(); + + *pResult = 0; +} + +void CFileUploadDlg::SetMessenger(CMainDlg *pMessenger) +{ + this->pMessenger = pMessenger; +} + +void CFileUploadDlg::OnItemclickFileUploadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; + + if((phdn->iItem+1)==(m_iSortingMode>=0?m_iSortingMode:-m_iSortingMode)) + m_iSortingMode = -1*m_iSortingMode; + else + m_iSortingMode = phdn->iItem+1; + + SortList(m_iSortingMode); + + *pResult = 0; +} + +void CFileUploadDlg::OnDblclkFileUploadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + + if(pNMListView->iItem!=-1) + { + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (pNMListView->iItem); + + if(pUFileInfop!=NULL&& + pUFileInfop->iProgress!=UP_WAIT&& + pUFileInfop->iProgress!=UP_PROCENT) + { + CFileDescriptioDlg DescrDlg(this); + DescrDlg.m_strFileName = pUFileInfop->strFileName; + + if(pUFileInfop->iStatus==US_UPLOAD||pUFileInfop->iStatus==US_PUBLISHED) + { + DescrDlg.DoModalReadMode(pUFileInfop->strDescription); + } + else + if(DescrDlg.DoModalEditMode(pUFileInfop->strDescription)==IDOK) + { + pUFileInfop->strDescription = DescrDlg.GetDescription(); + m_FileUpLoadList.SetItemText (pNMListView->iItem,6,pUFileInfop->strDescription); + } + } + } + + *pResult = 0; +} + +void CFileUploadDlg::AddToUpload2(CString FileName, CString Login, CString RecepientID, LPCTSTR strDescription) +{ + if(!TestFile(FileName)) + return; + + CUFileInfo *pNewFile = new CUFileInfo; + + CFile UploadFile(FileName,CFile::modeRead|CFile::shareDenyNone); + + pNewFile->Size = UploadFile.GetLength(); + UploadFile.Close(); + + CTime tStartTtime = CTime::GetCurrentTime(); + pNewFile->dwTime = (DWORD)tStartTtime.GetTime () ; + pNewFile->Handle = 0; + pNewFile->iProgress = UP_WAIT; + pNewFile->iStatus = US_NEW; + pNewFile->strFileName = FileName; + pNewFile->RecepientID = -1; + pNewFile->strRecepientID = RecepientID; + pNewFile->RecepientStr = Login; + pNewFile->strDescription = strDescription; + pNewFile->pMcFileUp = NULL; + + m_LockList.Lock(); + try + { + ListArray.Add (pNewFile); + } + catch(...) + { + } + m_LockList.Unlock(); + + //ShowDialog(); + + if(pMessenger->ConnectEnable()) + { + try + { + CUFileInfo *pUFileInfop=(CUFileInfo *)pNewFile; + + pUFileInfop->pFile = pSession->CreateFile(); + BSTR FileName = pUFileInfop->strFileName.AllocSysString(); + pUFileInfop->pFile->PutRealName(FileName); + ::SysFreeString(FileName); + + IUsersPtr pUsers = pUFileInfop->pFile->GetRecipients(); + CString strTmp = pUFileInfop->strRecepientID; + while(!strTmp.IsEmpty()) + { + long RecepientID = _ttol((LPCTSTR)strTmp); + + if(strTmp.Find(',')!=-1) + strTmp = strTmp.Mid(strTmp.Find(',')+1); + else + strTmp.Empty(); + + if(RecepientID) + { + IUserPtr pUser = pUsers->AddUser(); + pUser->PutValue("@id",RecepientID); + } + } + pUFileInfop->pFile->PuthWnd(long(this->m_hWnd)); + pUFileInfop->pFile->PutBody((LPCTSTR)pUFileInfop->strDescription); + theNet2.LockTranslator(); + try + { + HRESULT hr = pUFileInfop->pFile->Send(&(pUFileInfop->Handle)); + if(SUCCEEDED(hr)&&pUFileInfop->Handle) + { + theNet2.AddToTranslator(pUFileInfop->Handle,this->m_hWnd); + //CTime tStartTtime = CTime::GetCurrentTime(); + //pUFileInfop->dwTime = (DWORD)tStartTtime.GetTime () ; + } + } + catch(...) + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + theNet2.UnlockTranslator(); + } + catch(...) + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + + BlockOrUnBlock(); + } + else + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + + BuildList(); +} + +void CFileUploadDlg::DeleteAllItem() +{ + while(ListArray.GetSize () ) + { + delete ListArray.GetAt (0); + ListArray.RemoveAt (0); + } + m_FileUpLoadList.DeleteAllItems(); + + m_lastUserId = 0; + + m_pFromSender = NULL; +} + +BOOL CFileUploadDlg::LoadFilesHistory() +{ + if(m_lastUserId==pMessenger->GetUserID()) + return TRUE; + + m_pFromSender = NULL; + + m_pFromSender.CreateInstance(CLSID_FormSender); + + try + { + // Init Net Settings [4/1/2002] + m_pFromSender->PutUseProxyAuth(VARIANT_FALSE); + + CComBSTR bsProxy; + + switch(GetOptionInt(IDS_NETOPTIONS,IDS_ACCESSTYPE,INTERNET_OPEN_TYPE_PRECONFIG)) + { + case INTERNET_OPEN_TYPE_PRECONFIG: + m_pFromSender->put_ProxyType(ptDefault); + if(GetOptionInt(IDS_NETOPTIONS,IDS_USEFIREWALL,FALSE)) + { + m_pFromSender->PutUseProxyAuth(VARIANT_TRUE); + m_pFromSender->PutProxyUserName((LPCTSTR)GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, _T(""))); + m_pFromSender->PutProxyPassword((LPCTSTR)(GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, _T("")))); + } + break; + case INTERNET_OPEN_TYPE_DIRECT: + m_pFromSender->PutProxyType(ptDirect); + break; + case INTERNET_OPEN_TYPE_PROXY: + m_pFromSender->PutProxyType(ptCustom); + m_pFromSender->PutProxyServer((LPCTSTR)GetOptionString(IDS_NETOPTIONS, IDS_PROXYNAME, _T(""))); + + if(!GetOptionString(IDS_NETOPTIONS, IDS_PROXYPORT, _T("")).IsEmpty()) + { + m_pFromSender->PutProxyPort(_ttol(GetOptionString(IDS_NETOPTIONS, IDS_PROXYPORT, _T("")))); + } + + if(GetOptionInt(IDS_NETOPTIONS,IDS_USEFIREWALL,FALSE)) + { + m_pFromSender->PutUseProxyAuth(VARIANT_TRUE); + m_pFromSender->PutProxyUserName((LPCTSTR)(GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, _T("")))); + m_pFromSender->PutProxyPassword((LPCTSTR)(GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, _T("")))); + } + + break; + } + } + catch (_com_error&) + { + ASSERT(FALSE); + } + + + + m_lastUserId=pMessenger->GetUserID(); + + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),pMessenger->GetUserRole(),pMessenger->GetUserID()); + + CString strUploadedFilesXML = GetRegFileText(strSection,GetString(IDS_OUTGOING_FILE)); + + /************************************************************************/ + /* + + + + + + + + + */ + /************************************************************************/ + HRESULT hr = S_OK; + + if(!strUploadedFilesXML.IsEmpty()) + { + // Step 1. Load to XML Document [3/26/2002] + CComPtr pDoc = NULL; + hr = pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + if(SUCCEEDED(hr)) + { + VARIANT_BOOL varLoad = VARIANT_FALSE; + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + + if(SUCCEEDED(hr)&&varLoad==VARIANT_TRUE) + { + CComPtr pFileList = NULL; + hr = pDoc->selectNodes(CComBSTR(L"file_history/file"),&pFileList); + if(SUCCEEDED(hr)&&pFileList!=NULL) + { + long Count = 0; + pFileList->get_length(&Count); + for(long i=0;i pFile = NULL; + pFileList->get_item(i,&pFile); + if(pFile!=NULL) + { + CComVariant varFID; + CComBSTR bsBody, bsRealName, bsSize, bsRecipients, bsTime; + GetAttribute(pFile,CComBSTR(L"fid"),&varFID); + GetTextByPath(pFile,CComBSTR(L"body"),&bsBody); + GetTextByPath(pFile,CComBSTR(L"real_name"),&bsRealName); + GetTextByPath(pFile,CComBSTR(L"size"),&bsSize); + GetTextByPath(pFile,CComBSTR(L"recipients"),&bsRecipients); + GetTextByPath(pFile,CComBSTR(L"date"),&bsTime); + + CUFileInfo *pNewFile = new CUFileInfo; + + pNewFile->strFID = varFID.bstrVal; + pNewFile->Size = _wtol(bsSize); + pNewFile->dwTime = _wtol(bsTime); + pNewFile->Handle = 0; + pNewFile->RecepientStr = bsRecipients; + + + pNewFile->iStatus = pNewFile->RecepientStr==GetString(IDS_APP_NAME)?US_PUBLISHED:US_UPLOAD; + pNewFile->iProgress = UP_COMPLET; + + pNewFile->strFileName = bsRealName; + pNewFile->strDescription = bsBody; + + m_LockList.Lock(); + try + { + ListArray.Add (pNewFile); + } + catch(...) + { + } + m_LockList.Unlock(); + + } + + } + BuildList(); + } + } + } + } + + return SUCCEEDED(hr); +} + +BOOL CFileUploadDlg::SaveFileToHistory(CUFileInfo *pUFileInfo) +{ + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),pMessenger->GetUserRole(),pMessenger->GetUserID()); + + CString strUploadedFilesXML = GetRegFileText(strSection,GetString(IDS_OUTGOING_FILE)); + + /************************************************************************/ + /* + + + + + + + + + + */ + /************************************************************************/ + HRESULT hr = S_OK; + + // Step 1. Load to XML Document [3/26/2002] + CComPtr pDoc = NULL; + hr = pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + if(SUCCEEDED(hr)) + { + VARIANT_BOOL varLoad = VARIANT_FALSE; + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + + strUploadedFilesXML = _T(""); + + if(varLoad!=VARIANT_TRUE) + { + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + } + + if(SUCCEEDED(hr)&&varLoad==VARIANT_TRUE) + { + CComPtr pFileHistory = NULL; + + hr = pDoc->selectSingleNode(CComBSTR(L"file_history"),&pFileHistory); + if(pFileHistory==NULL) + { + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + hr = pDoc->selectSingleNode(CComBSTR(L"file_history"),&pFileHistory); + } + + if(pFileHistory!=NULL) + { + CComPtr pFileCurrent = NULL; + + CString strFindFile; + strFindFile.Format(_T("file[@fid=\"%d\"]"),pUFileInfo->strFID); + + pFileHistory->selectSingleNode(CComBSTR(strFindFile),&pFileCurrent); + + if(pFileCurrent==NULL) + { + hr = insertSingleNode(pFileHistory,CComBSTR(L"file"),NULL,NULL,&pFileCurrent); + + if(pFileCurrent!=NULL) + { + CComBSTR bsSize, bsDate; + VarBstrFromI4(pUFileInfo->Size,NULL,LOCALE_NOUSEROVERRIDE,&bsSize); + VarBstrFromI4(pUFileInfo->dwTime,NULL,LOCALE_NOUSEROVERRIDE,&bsDate); + + insertSingleAttribut(pFileCurrent,CComBSTR(L"fid"),CComVariant(pUFileInfo->strFID)); + insertSingleNode(pFileCurrent,CComBSTR(L"body"),NULL,CComBSTR((LPCTSTR)pUFileInfo->strDescription)); + insertSingleNode(pFileCurrent,CComBSTR(L"real_name"),NULL,CComBSTR((LPCTSTR)pUFileInfo->strFileName)); + insertSingleNode(pFileCurrent,CComBSTR(L"size"),NULL,bsSize); + insertSingleNode(pFileCurrent,CComBSTR(L"recipients"),NULL,CComBSTR((LPCTSTR)pUFileInfo->RecepientStr)); + insertSingleNode(pFileCurrent,CComBSTR(L"date"),NULL,bsDate); + } + } + } + if(SUCCEEDED(hr)) + { + CComBSTR bsOutXML; + pDoc->get_xml(&bsOutXML); + SetRegFileText(strSection,GetString(IDS_OUTGOING_FILE),CString(bsOutXML)); + } + } + } + + return SUCCEEDED(hr); +} + +void CFileUploadDlg::OnRclickFileUploadList(NMHDR* pNMHDR, LRESULT* pResult) +{ + CPoint point; + GetCursorPos(&point); + CMenu menu; + menu.LoadMenu(IDR_MESSENGER_MENU); + CMenu* popup = menu.GetSubMenu(5); + UpdateMenu(this,popup); + popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); + + *pResult = 0; +} + +void CFileUploadDlg::OnFilesuploadCanceltransfer() +{ + OnCancelButton(); +} + +void CFileUploadDlg::OnUpdateFilesuploadCanceltransfer(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus != US_NEW) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +void CFileUploadDlg::OnFilesuploadClearrecord() +{ + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + if(!pUFileInfop->strFID.IsEmpty()) + { + RemoveFileFromHistory(pUFileInfop); + } + + m_LockList.Lock(); + try + { + for(int i = (ListArray.GetSize () - 1); i >= 0;i--) + { + CUFileInfo *pUFileInfoList = ListArray.GetAt(i); + if(pUFileInfoList == pUFileInfop) + { + delete pUFileInfoList; + ListArray.RemoveAt (i); + break; + } + } + } + catch(...) + {} + m_LockList.Unlock(); + + m_FileUpLoadList.DeleteItem(iSel); + + pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + } + } +} + +void CFileUploadDlg::OnUpdateFilesuploadClearrecord(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus == US_NEW) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +void CFileUploadDlg::OnFilesuploadUpload() +{ + OnUploadButton(); +} + +void CFileUploadDlg::OnUpdateFilesuploadUpload(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus != US_STOP) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +BOOL CFileUploadDlg::RemoveFileFromHistory(CUFileInfo *pUFileInfo) +{ + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),pMessenger->GetUserRole(),pMessenger->GetUserID()); + + CString strUploadedFilesXML = GetRegFileText(strSection,GetString(IDS_OUTGOING_FILE)); + + HRESULT hr = S_OK; + + // Step 1. Load to XML Document [3/26/2002] + CComPtr pDoc = NULL; + hr = pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + if(SUCCEEDED(hr)) + { + VARIANT_BOOL varLoad = VARIANT_FALSE; + hr = pDoc->loadXML(CComBSTR(strUploadedFilesXML),&varLoad); + + if(SUCCEEDED(hr)&&varLoad==VARIANT_TRUE) + { + CComPtr pFileHistory = NULL; + + hr = pDoc->selectSingleNode(CComBSTR(L"file_history"),&pFileHistory); + + if(pFileHistory!=NULL) + { + CComPtr pFileCurrent = NULL; + + CString strFindFile; + strFindFile.Format(_T("file[@fid=\"%s\"]"),pUFileInfo->strFID); + + pFileHistory->selectSingleNode(CComBSTR(strFindFile),&pFileCurrent); + + if(pFileCurrent!=NULL) + { + hr = pFileHistory->removeChild(pFileCurrent,NULL); + if(SUCCEEDED(hr)) + { + CComBSTR bsOutXML; + pDoc->get_xml(&bsOutXML); + SetRegFileText(strSection,GetString(IDS_OUTGOING_FILE),CString(bsOutXML)); + } + } + } + } + } + + return SUCCEEDED(hr); +} + +void CFileUploadDlg::OnFilesuploadInformation() +{ + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + + CFileDescriptioDlg DescrDlg(this); + DescrDlg.m_strFileName = pUFileInfop->strFileName; + + if(pUFileInfop->iStatus==US_UPLOAD||pUFileInfop->iStatus==US_PUBLISHED) + { + DescrDlg.DoModalReadMode(pUFileInfop->strDescription); + } + else + if(DescrDlg.DoModalEditMode(pUFileInfop->strDescription)==IDOK) + { + pUFileInfop->strDescription = DescrDlg.GetDescription(); + m_FileUpLoadList.SetItemText (iSel,6,pUFileInfop->strDescription); + } + } +} + +void CFileUploadDlg::OnUpdateFilesuploadInformation(CCmdUI* pCmdUI) +{ + BOOL bFlagSee = FALSE; + + POSITION pos = m_FileUpLoadList.GetFirstSelectedItemPosition(); + + if(pos) + { + bFlagSee = TRUE; + while(pos) + { + int iSel = m_FileUpLoadList.GetNextSelectedItem(pos); + + CUFileInfo *pUFileInfop=(CUFileInfo *)m_FileUpLoadList.GetItemData (iSel); + + if(pUFileInfop->iStatus==US_NEW) + { + bFlagSee = FALSE; + break; + } + } + } + + pCmdUI->Enable(bFlagSee); +} + +void CFileUploadDlg::AddToUpload3(LPCTSTR XML) +{ + //AfxMessageBox("Not Implemented."); + //return; + + USES_CONVERSION; + + CComBSTR bsXML = XML; + + CUFileInfo *pNewFile = new CUFileInfo; + pNewFile->pMcFileUp = new CMcLoaderImpl(m_pFromSender); + + HRESULT hr = pNewFile->pMcFileUp->SetXML(bsXML); + + if(SUCCEEDED(hr)) + { + //CString FileName = pNewFile->pMcFileUp->GetFilePath(); + + //if(!TestFile(FileName)) + //{ + // delete pNewFile->pMcFileUp; + // delete pNewFile; + // return; + //} + + //CFile UploadFile(FileName,CFile::modeRead|CFile::shareDenyNone); + + pNewFile->Size = (*pNewFile->pMcFileUp)->GetFormSize(); + pNewFile->BufferSize = pNewFile->Size; + + //UploadFile.Close(); + CTime tStartTtime = CTime::GetCurrentTime(); + pNewFile->dwTime = (DWORD)tStartTtime.GetTime () ; + + pNewFile->Handle = (long)pNewFile->pMcFileUp; + pNewFile->iProgress = UP_WAIT; + pNewFile->iStatus = US_NEW; + pNewFile->strFileName = W2CT(pNewFile->pMcFileUp->GetTitle()); + pNewFile->RecepientID = 0; + pNewFile->RecepientStr = GetString(IDS_APP_NAME); + pNewFile->strDescription = _T(""); + + m_LockList.Lock(); + try + { + ListArray.Add (pNewFile); + } + catch(...) + { + } + m_LockList.Unlock(); + + if(pMessenger->ConnectEnable()) + { + HRESULT hr = pNewFile->pMcFileUp->Send(GetSafeHwnd(),WM_UPLOAD_APP_PROGRESS,WM_UPLOAD_APP_COMPLETED,pMessenger->GetServerPath(),pMessenger->GetSID()); + if(FAILED(hr)) + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + } + else + { + pNewFile->iProgress = UP_ERROR; + pNewFile->iStatus = US_STOP; + } + + BuildList(); + } + else + { + delete pNewFile->pMcFileUp; + delete pNewFile; + } +} + +LRESULT CFileUploadDlg::OnUploadAppProgress(WPARAM w,LPARAM l) +{ + int iIndex = GetItemFromHandle(long(w)); + if(iIndex!=-1) + { + CUFileInfo *pUFileInfo = (CUFileInfo *)m_FileUpLoadList.GetItemData (iIndex); + ChangeProgress(UP_PROCENT,iIndex,l); + } + return 0; +} + +LRESULT CFileUploadDlg::OnUploadAppCompleted(WPARAM w,LPARAM l) +{ + int iIndex = GetItemFromHandle(long(w)); + if(iIndex!=-1) + { + if(l==0) + { + //All Ok + CUFileInfo *pUFileInfo = (CUFileInfo *)m_FileUpLoadList.GetItemData (iIndex); + if(pUFileInfo->pMcFileUp) + { + ChangeStatus(US_PUBLISHED,iIndex); + ChangeProgress(UP_COMPLET,iIndex); + + pUFileInfo->Handle = 0; + delete pUFileInfo->pMcFileUp; + pUFileInfo->pMcFileUp = NULL; + } + } + else + { + // Error + ChangeStatus(US_STOP,iIndex); + ChangeProgress(UP_ERROR ,iIndex); + } + } + return 0; +} + +BOOL CFileUploadDlg::TestFile(LPCTSTR FilePath) +{ + // New Action [7/22/2002] + /************************************************************************/ + /* When dragging a file that is already open by an application, + the IBN should not allow the user to attempt the send and log + it in the file manager. It should open up a dialog that says + "The file you are trying to send is currently open. Please close the + file and then send it again." + */ + /************************************************************************/ + + BOOL bRetFlag = FALSE; + + HANDLE hFile = CreateFile(FilePath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0); + + if(hFile==INVALID_HANDLE_VALUE) + { + if(GetLastError()==32) + { + CMessageDlg BadFile(IDS_BAD_FILE,this); + + CString strMessage; + strMessage.Format(GetString(IDS_CANT_UPLOAD_FILE_ERROR_2_FORMAT),FilePath); + + BadFile.Show(strMessage,MB_OK); + } + else + { + LPVOID lpMsgBuf; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, 0,NULL + ); + // Process any inserts in lpMsgBuf. + CString strMessage; + strMessage.Format(GetString(IDS_CANT_UPLOAD_FILE_ERROR_FORMAT),FilePath,(LPCTSTR)lpMsgBuf); + + CMessageDlg BadFile(IDS_BAD_FILE,this); + if(BadFile.Show(strMessage,MB_YESNO)==IDYES) + { + bRetFlag = TRUE; + } + + //MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); + // Free the buffer. + LocalFree( lpMsgBuf ); + } + } + else + { + bRetFlag = TRUE; + CloseHandle(hFile); + } + + return bRetFlag; +} + +BOOL CFileUploadDlg::PreTranslateMessage(MSG* pMsg) +{ + if(pMsg->message==WM_KEYDOWN) + { + switch(pMsg->wParam) + { + case VK_ESCAPE: + if(m_FileUpLoadList.GetEditControl() && pMsg->hwnd==m_FileUpLoadList.GetEditControl()->GetSafeHwnd()) + { + } + else + ((CDialog*)GetParent())->EndDialog(IDCANCEL); + break; + } + } + + return CResizableDialog::PreTranslateMessage(pMsg); +} \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/FileUploadDlg.h b/Source/Client/IM-Client/IMClient/FileUploadDlg.h new file mode 100644 index 0000000..7edd764 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FileUploadDlg.h @@ -0,0 +1,166 @@ +#if !defined(AFX_FILEUPLOADDLG_H__098B08BA_D249_4D9F_8074_7E7C7BE520F7__INCLUDED_) +#define AFX_FILEUPLOADDLG_H__098B08BA_D249_4D9F_8074_7E7C7BE520F7__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// FileUploadDlg.h : header file +// +#include "ResizableDialog.h" +#include "McLoaderImpl.h" +#include "SortHeaderCtrl.h" +///////////////////////////////////////////////////////////////////////////// +// CFileUploadDlg dialog +class CMainDlg; + +class CFileUploadDlg : public CResizableDialog +{ +private: +enum UFileStatus +{ + US_NEW = 0, + US_UPLOAD, + US_STOP, + US_PUBLISHED +}; + +enum UFileProgress +{ + UP_NONE = 0, + UP_WAIT, + UP_PROCENT , + UP_COMPLET, + UP_CANCEL, + UP_ERROR, +}; + +struct CUFileInfo +{ + CUFileInfo() + { + pMcFileUp = NULL; + }; + + ~CUFileInfo() + { + if(pMcFileUp) + { + try + { + delete pMcFileUp; + } + catch (...) + { + ASSERT(FALSE); + } + } + }; + + CString strFileName; + CString RecepientStr; + long RecepientID; + CString strRecepientID; + long Size; + long BufferSize; + long Handle; + time_t dwTime; + UFileProgress iProgress; + UFileStatus iStatus; + IFilePtr pFile; + CString strDescription; + CString strFID; + CMcLoaderImpl *pMcFileUp; +}; + +// Construction +public: + void AddToUpload3(LPCTSTR XML); + BOOL LoadFilesHistory(); + void DeleteAllItem(); + void AddToUpload2(CString FileName, CString Login, CString RecepientID, LPCTSTR strDescription); + void AddToUpLoad(CString FileName, CString Login,long RecepientId, LPCTSTR strDescription); + void ShowDialog(); + void SetMessenger(CMainDlg *pMessenger); + CFileUploadDlg(CWnd* pParent = NULL); // standard constructor + virtual ~CFileUploadDlg(); + afx_msg void OnDeletefileButton(); + afx_msg void OnUploadButton(); + afx_msg void OnCancelButton(); + +// Dialog Data + //{{AFX_DATA(CFileUploadDlg) + enum { IDD = IDD_DIALOG_FILE_UPLOAD }; + CButton m_btnCancel; + CButton m_btnDeleteFile; + CButton m_btnUpLoadFile; + CListCtrl m_FileUpLoadList; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileUploadDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + CSortHeaderCtrl m_SortHeader; + + BOOL TestFile(LPCTSTR FilePath); + BOOL RemoveFileFromHistory(CUFileInfo *pUFileInfo); + BOOL SaveFileToHistory(CUFileInfo *pDUFileInfo); + + CImageList m_FileStatusImageList; + CMainDlg *pMessenger; + ISessionPtr pSession; + BOOL bWasSetComplet; + long m_lastUserId; + IFormSenderPtr m_pFromSender; + + int m_iSortingMode; + + static int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + int GetItemFromHandle(long Handle); + void ChangeProgress(UFileProgress NewProgress, int iElement, long dwGetSize=0L); + void ChangeStatus(UFileStatus duNewStatus,int iElement); + void SortList(int Mode=2); + CCriticalSection m_LockList; + void BuildList(); + CArray ListArray; + LRESULT OnNetEvent(WPARAM w,LPARAM l); + LRESULT OnUploadBegin(WPARAM w,LPARAM l); + LRESULT OnUploadStep(WPARAM w,LPARAM l); + void BlockOrUnBlock(); + // Generated message map functions + //{{AFX_MSG(CFileUploadDlg) + afx_msg void OnOk(); + virtual void OnCancel(); + afx_msg void OnClose(); + virtual BOOL OnInitDialog(); + afx_msg void OnTimer(UINT nIDEvent); + afx_msg void OnItemchangedFileUploadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnItemclickFileUploadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnDblclkFileUploadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickFileUploadList(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnFilesuploadCanceltransfer(); + afx_msg void OnUpdateFilesuploadCanceltransfer(CCmdUI* pCmdUI); + afx_msg void OnFilesuploadClearrecord(); + afx_msg void OnUpdateFilesuploadClearrecord(CCmdUI* pCmdUI); + afx_msg void OnFilesuploadUpload(); + afx_msg void OnUpdateFilesuploadUpload(CCmdUI* pCmdUI); + afx_msg void OnFilesuploadInformation(); + afx_msg void OnUpdateFilesuploadInformation(CCmdUI* pCmdUI); + afx_msg LRESULT OnUploadAppProgress(WPARAM w,LPARAM l); + afx_msg LRESULT OnUploadAppCompleted(WPARAM w,LPARAM l); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_FILEUPLOADDLG_H__098B08BA_D249_4D9F_8074_7E7C7BE520F7__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/FolderChangeNotfication.cpp b/Source/Client/IM-Client/IMClient/FolderChangeNotfication.cpp new file mode 100644 index 0000000..00e3426 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FolderChangeNotfication.cpp @@ -0,0 +1,226 @@ +// FolderChangeNotfication.cpp: implementation of the CFolderChangeNotification class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "FolderChangeNotfication.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CFolderChangeNotification::CFolderChangeNotification() +{ + m_hArray.reserve(32); + m_PathList.reserve(32); + + m_hWorkThread = NULL; + m_hEventWnd = NULL; + m_dwCallbackMsg = NULL; +} + +CFolderChangeNotification::~CFolderChangeNotification() +{ + Stop(); + DeleteAllPath(); +} + +HRESULT CFolderChangeNotification::Start(HWND hEventWindow, DWORD dwCallbackMsg) +{ + if(m_hWorkThread||!m_PathList.size()) + return E_FAIL; + + if(!IsWindow(hEventWindow)||!dwCallbackMsg) + return E_INVALIDARG; + + m_hEventWnd = hEventWindow; + m_dwCallbackMsg = dwCallbackMsg; + + // Step1 [3/25/2002] + + DWORD dwTreadId = 0; + if(!(m_hWorkThread = CreateThread(NULL,30000,thWorkThread,this,CREATE_SUSPENDED,&dwTreadId))) + return HRESULT_FROM_WIN32(GetLastError()); + + ////////////////////////////////////////////////////////////////////////// + // Step 1. Create Nofify Object [3/23/2002] + m_hArray.push_back(CreateEvent(NULL,FALSE,FALSE,NULL)); + + // Step 2. Add End Work Notify Object [3/23/2002] + std::vector<_FCItem>::iterator iItem = m_PathList.begin(); + while(iItem!=m_PathList.end()) + { + (*iItem).hEvent = FindFirstChangeNotification((*iItem).lpPathName,(*iItem).bWatchSubtree,(*iItem).dwNotifyFilter); + if((*iItem).hEvent!=INVALID_HANDLE_VALUE) + { + m_hArray.push_back((*iItem).hEvent); + } + iItem++; + } + + ResumeThread(m_hWorkThread); + + return S_OK; +} + +HRESULT CFolderChangeNotification::Stop(DWORD dwTimeOut) +{ + if(!m_hWorkThread) + return E_FAIL; + + SetEvent(m_hArray[0]); + + if(WaitForSingleObject(m_hWorkThread,dwTimeOut)==WAIT_TIMEOUT) + { + TerminateThread(m_hWorkThread,2); + } + + CloseHandle(m_hWorkThread); + m_hWorkThread = NULL; + + std::vector::iterator iItem = m_hArray.begin(); + while(iItem!=m_hArray.end()) + { + if((*iItem)) + { + FindCloseChangeNotification((*iItem)); + } + iItem++; + } + m_hArray.clear(); + + return S_OK; +} + +BOOL CFolderChangeNotification::IsStarted() +{ + return (m_hWorkThread!=NULL); +} + +DWORD WINAPI CFolderChangeNotification::thWorkThread(LPVOID pParam) +{ + CFolderChangeNotification *pThis = (CFolderChangeNotification *)pParam; + pThis->thWorkTreadBody(); + return 0; +} + +void CFolderChangeNotification::thWorkTreadBody() +{ + //TRACE(_T("\r\n--- FindNextChangeNotification Start ---")); + ////////////////////////////////////////////////////////////////////////// + // Step 3. Wait [3/23/2002] + const HANDLE *pHandeleArray = &(*m_hArray.begin()); + + while (TRUE) + { + DWORD dwRetValue = WaitForMultipleObjects(m_hArray.size(),pHandeleArray,FALSE,INFINITE); + + DWORD dwSignalEventIndex = dwRetValue-WAIT_OBJECT_0; + if(dwSignalEventIndex) + { + if(dwSignalEventIndex>=0&&dwSignalEventIndex::iterator iItem = m_PathList.begin();iItem!=m_PathList.end();iItem++) + { + if((*iItem).hEvent==hEventSet) + { + PostMessage(m_hEventWnd,m_dwCallbackMsg,iRealVectorIndex,0); + break; + } + iRealVectorIndex++; + } + } + else + { + // break [3/25/2002] + ASSERT(FALSE); + break; + } + } + else + { + // Exit [3/25/2002] + break; + } + } + //TRACE(_T("\r\n--- FindNextChangeNotification End ---")); + // End [3/23/2002] + ////////////////////////////////////////////////////////////////////////// +} + +HRESULT CFolderChangeNotification::AddPath(LPCTSTR strPath, BOOL bWatchSubtree, DWORD dwNotifyFilter) +{ + if(m_hWorkThread!=NULL) + return E_FAIL; + + if(strPath==NULL) + return E_INVALIDARG; + + _FCItem Item = {0}; + + Item.lpPathName = new TCHAR[_tcslen(strPath)+1]; + _tcscpy(Item.lpPathName,strPath); + Item.bWatchSubtree = bWatchSubtree; + Item.dwNotifyFilter = dwNotifyFilter; + Item.hEvent = NULL; + + m_PathList.push_back(Item); + + return S_OK; +} + + +HRESULT CFolderChangeNotification::DeleteAllPath() +{ + if(m_hWorkThread!=NULL) + return E_FAIL; + + std::vector<_FCItem>::iterator iItem = m_PathList.begin(); + while(iItem!=m_PathList.end()) + { + if((*iItem).lpPathName) + { + delete [](*iItem).lpPathName; + (*iItem).lpPathName = NULL; + } + iItem++; + } + m_PathList.clear(); + return S_OK; +} + + +long CFolderChangeNotification::GetPathCount() +{ + return m_PathList.size(); +} + +LPCTSTR CFolderChangeNotification::GetPathItem(long Index,BOOL *pbWatchSubtree, DWORD *pdwNotifyFilter) +{ + if(Index<0||Index>=m_PathList.size()) + return NULL; + + long TmpIndex = 0; + + const _FCItem iItem = m_PathList[Index]; + + if (pbWatchSubtree) + *pbWatchSubtree = iItem.bWatchSubtree; + if (pdwNotifyFilter) + *pdwNotifyFilter = iItem.dwNotifyFilter; + + return iItem.lpPathName; +} + diff --git a/Source/Client/IM-Client/IMClient/FolderChangeNotfication.h b/Source/Client/IM-Client/IMClient/FolderChangeNotfication.h new file mode 100644 index 0000000..0639db8 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/FolderChangeNotfication.h @@ -0,0 +1,60 @@ +// FolderChangeNotfication.h: interface for the CFolderChangeNotification class. +// +////////////////////////////////////////////////////////////////////// +#include +#include + +#if !defined(AFX_FOLDERCHANGENOTFICATION_H__C4FFEBE1_155F_4575_98B2_F43BC68A79A8__INCLUDED_) +#define AFX_FOLDERCHANGENOTFICATION_H__C4FFEBE1_155F_4575_98B2_F43BC68A79A8__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +class CFolderChangeNotification +{ +public: + struct _FCItem + { + LPTSTR lpPathName; + BOOL bWatchSubtree; + DWORD dwNotifyFilter; + HANDLE hEvent; + }; + +public: + LPCTSTR GetPathItem(long Index,BOOL *pbWatchSubtree = NULL, DWORD *spdwNotifyFilter = NULL); + long GetPathCount(); + BOOL IsStarted(); + HRESULT DeleteAllPath(); + HRESULT AddPath(LPCTSTR strPath, BOOL bWatchSubtree, DWORD dwNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME| + FILE_NOTIFY_CHANGE_DIR_NAME| + FILE_NOTIFY_CHANGE_ATTRIBUTES| + FILE_NOTIFY_CHANGE_SIZE| + FILE_NOTIFY_CHANGE_LAST_WRITE| + FILE_NOTIFY_CHANGE_LAST_ACCESS| + FILE_NOTIFY_CHANGE_CREATION| + FILE_NOTIFY_CHANGE_SECURITY); + CFolderChangeNotification(); + virtual ~CFolderChangeNotification(); + + HRESULT Start(HWND hEventWindow, DWORD dwCallbackMsg); + HRESULT Stop(DWORD dwTimeOut = INFINITE); + +protected: + static DWORD WINAPI thWorkThread(LPVOID pParam); + +private: + void thWorkTreadBody(); + +private: + HANDLE m_hWorkThread; + std::vector<_FCItem> m_PathList; + + HWND m_hEventWnd; + DWORD m_dwCallbackMsg; + + std::vector m_hArray; +}; + +#endif // !defined(AFX_FOLDERCHANGENOTFICATION_H__C4FFEBE1_155F_4575_98B2_F43BC68A79A8__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/GlobalFunction.cpp b/Source/Client/IM-Client/IMClient/GlobalFunction.cpp new file mode 100644 index 0000000..eff3da3 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GlobalFunction.cpp @@ -0,0 +1,1902 @@ +#include "StdAfx.h" +#include "OfsTv.h" +#include "GlobalFunction.h" +#include +#include +#include +#include "McSettings.h" +#include + +extern COfsTvApp theApp; +extern CMcSettings g_settings; + +#define HIMETRIC_PER_INCH 2540 +#define MAP_PIX_TO_LOGHIM(x,ppli) ( (HIMETRIC_PER_INCH*(x) + ((ppli)>>1)) / (ppli) ) +#define MAP_LOGHIM_TO_PIX(x,ppli) ( ((ppli)*(x) + HIMETRIC_PER_INCH/2) / HIMETRIC_PER_INCH ) + +void HiMetricToPixel(const SIZEL *lpSizeInHiMetric, LPSIZEL lpSizeInPix) +{ + int nPixelsPerInchX; // Pixels per logical inch along width + int nPixelsPerInchY; // Pixels per logical inch along height + + HDC hDCScreen = GetDC(NULL); + _ASSERTE(hDCScreen != NULL); + nPixelsPerInchX = GetDeviceCaps(hDCScreen, LOGPIXELSX); + nPixelsPerInchY = GetDeviceCaps(hDCScreen, LOGPIXELSY); + ReleaseDC(NULL, hDCScreen); + + lpSizeInPix->cx = MAP_LOGHIM_TO_PIX(lpSizeInHiMetric->cx, nPixelsPerInchX); + lpSizeInPix->cy = MAP_LOGHIM_TO_PIX(lpSizeInHiMetric->cy, nPixelsPerInchY); +} + + +void UpdateMenu(CWnd *pWnd, CMenu *pMenu) +{ + CCmdUI cmdUI; + cmdUI.m_pMenu = pMenu; + cmdUI.m_nIndexMax = pMenu->GetMenuItemCount(); + for (cmdUI.m_nIndex = 0; cmdUI.m_nIndex < cmdUI.m_nIndexMax; ++cmdUI.m_nIndex) + { + CMenu* pSubMenu = pMenu->GetSubMenu(cmdUI.m_nIndex); + if(pSubMenu==NULL) + { + cmdUI.m_nID = pMenu->GetMenuItemID(cmdUI.m_nIndex); + cmdUI.DoUpdate(pWnd, FALSE); + } + else + { + UpdateMenu(pWnd, pSubMenu); + } + + } +} + + +CString GetString(UINT nID) +{ + CString str; + str.LoadString(nID); + return str; +} + +CString GetOptionString(UINT nSectionID, UINT nEntryID, LPCTSTR lpszDefault) +{ + return theApp.GetProfileString(GetString(nSectionID), GetString(nEntryID), lpszDefault); +} + +UINT GetOptionInt(UINT nSectionID, UINT nEntryID, int nDefault) +{ + return theApp.GetProfileInt(GetString(nSectionID), GetString(nEntryID), nDefault); +} + +BOOL WriteOptionString(UINT nSectionID, UINT nEntryID, LPCTSTR lpszValue) +{ + return theApp.WriteProfileString(GetString(nSectionID), GetString(nEntryID), lpszValue); +} + +BOOL WriteOptionInt(UINT nSectionID, UINT nEntryID, int nValue) +{ + return theApp.WriteProfileInt(GetString(nSectionID), GetString(nEntryID), nValue); +} + +_bstr_t DelSpace(_bstr_t &wstr) +{ + CString str = (char*)wstr; + int findPos ; + while((findPos = str.Find(_T("-"), 0)) != -1) + { + str=str.Mid(0,findPos)+str.Mid(findPos+1); + } + + wstr = str; + + return wstr; +} + +INT CALLBACK NEnumFontNameProc(LOGFONT *plf, TEXTMETRIC *ptm, INT nFontType, LPARAM lParam) +{ + CComboBox* comboBox = (CComboBox*) lParam; + + comboBox->AddString(plf->lfFaceName); + + return TRUE; +} + +CString RectToString(const CRect &m_Rect) +{ + CString m_TmpString; + m_TmpString.Format(_T("%ld;%ld;%ld;%ld"), m_Rect.left ,m_Rect.top ,m_Rect.right, m_Rect.bottom); + return m_TmpString; +} + +CRect StringToRect(const CString &m_StrRect) +{ + CRect mTmpRect = CRect(0,0,0,0); + + char *pEnd = (char*)(LPCTSTR)m_StrRect; + mTmpRect.left = strtol(pEnd,&pEnd,10); + ASSERT(pEnd!=NULL); + if(!pEnd) return mTmpRect; + pEnd++; + mTmpRect.top = strtol(pEnd,&pEnd,10); + ASSERT(pEnd!=NULL); + if(!pEnd) return mTmpRect; + pEnd++; + mTmpRect.right = strtol(pEnd,&pEnd,10); + ASSERT(pEnd!=NULL); + if(!pEnd) return mTmpRect; + pEnd++; + mTmpRect.bottom = strtol(pEnd,&pEnd,10); + + return mTmpRect; +} + +void Pack(CString &strPack,const CString &strPath) +{ + int Length = strPath.GetLength(); + int j = 0; + for(int i=0;i 0) + { + // if the buffer is too small, just + // allocate a new buffer (slow but sure) + int nOldLength = SysStringLen(lpszData); + int nNewLength = nOldLength + (nReplacementLen-nSourceLen)*nCount; + if (nOldLength < nNewLength) + { + LPWSTR pstr = lpszData; + lpszData = SysAllocStringLen(pstr,nNewLength); + SysFreeString(BSTR(pstr)); + } + + // else, we just do it in-place + lpszStart = lpszData; + lpszEnd = lpszData + nNewLength; + + // loop again to actually do the work + if(lpszStart < lpszEnd) + { + while (lpszStart < lpszEnd) + { + while ( (lpszTarget = wcsstr(lpszStart, lpszOld)) != NULL) + { + int nBalance = nOldLength - (lpszTarget - lpszData + nSourceLen); + memmove(lpszTarget + nReplacementLen, lpszTarget + nSourceLen, + nBalance * sizeof(WCHAR)); + memcpy(lpszTarget, lpszNew, nReplacementLen*sizeof(WCHAR)); + lpszStart = lpszTarget + nReplacementLen; + lpszStart[nBalance] = '\0'; + nOldLength += (nReplacementLen - nSourceLen); + } + lpszStart += wcslen(lpszStart) + 1; + } + ASSERT(lpszData[nNewLength] == '\0'); + } + else + { + SysFreeString(lpszData); + lpszData = SysAllocString(L""); + } + + } + + return nCount; +} + +class ParserState +{ +public: + BOOL IsTag; + BOOL IsSingleTag; + BOOL IsClosedTag; + + CComBSTR TagName; + CComBSTR Text; + + ParserState() + { + ParserState(CComBSTR(L"")); + } + + ParserState(const ParserState& src) + { + *this = src; + } + + const ParserState& operator=(const ParserState& src) + { + IsTag = src.IsTag; + IsSingleTag = src.IsSingleTag; + IsClosedTag = src.IsClosedTag; + TagName = src.TagName; + Text = src.Text; + return *this; + } + + ParserState(CComBSTR strText) + { + Text = strText; + + IsTag = FALSE; + IsClosedTag = FALSE; + IsSingleTag = FALSE; + + if(Text.Length()>0) + { + BSTR tmpVariable = (BSTR)Text; + + IsTag = tmpVariable[0]==L'<'; + IsClosedTag = tmpVariable[1]==L'/'; + + if(!IsClosedTag) + IsSingleTag = tmpVariable[Text.Length()-2]==L'/'; + + if(IsTag) + { + for(unsigned int Index = (IsClosedTag?2:1);Index') + break; + + TagName += CComBSTR(1,tmpVariable+Index); + } + + if(TagName==L"BR"||TagName==L"IMG") + IsClosedTag = TRUE; + } + } + } +}; + +BOOL IsClosedTag(CArray &ParserStack, int &StopPos, int CheckTagIndex) +{ + ParserState stateToCheck = ParserStack[CheckTagIndex]; + + for(int Index = CheckTagIndex+1; Index<=StopPos;Index++) + { + ParserState state = ParserStack[Index]; + + if(state.IsTag&&state.TagName==stateToCheck.TagName) + { + if(!state.IsClosedTag) + { + int TmpStopPos = StopPos ; + BOOL bTmpVal = IsClosedTag(ParserStack,TmpStopPos,Index); + + if(!bTmpVal) + return FALSE; + + Index = TmpStopPos; + } + else + return TRUE; + } + } + + return FALSE; +} + +CComBSTR SplitHTML(unsigned int MaxLen, CComBSTR &bsText) +{ + USES_CONVERSION; + + CComBSTR bsRetVal = L""; + + /*if(bsText.Length() ParserStack; + int State = 0; + CComBSTR currentValue; + WCHAR Sim[3] = L""; + + for(unsigned int Index = 0; Index0) + { + if(currentValue.Length()>MaxLen) + { + int Div = MaxLen/2; + + unsigned int StringLen = currentValue.Length(); + WCHAR* BeginPos = (BSTR)currentValue; + + int AddOnSpace = 0; + for(unsigned int Pos=0;Pos') + { + State = 0; + currentValue += Sim; + ParserStack.Add(ParserState(currentValue)); + currentValue.Empty(); + } + else + currentValue += Sim; + break; + } + } + + // Add Final Item [9/24/2004] + if(currentValue.Length()>0) + { + ParserStack.Add(ParserState(currentValue)); + currentValue.Empty(); + } + + // Remove Empty tags [9/24/2004] + BOOL bFoundReplace = FALSE; + + do + { + bFoundReplace = FALSE; + + for(int ParsedItemIndex = ParserStack.GetSize()-1; ParsedItemIndex>=0; ParsedItemIndex--) + { + ParserState current = ParserStack.GetAt(ParsedItemIndex); + + if(!current.IsTag) + { + CComBSTR bsSpaceTest = current.Text; + + Replace(bsSpaceTest.m_str,L"\r\n",L""); + Replace(bsSpaceTest.m_str,L" ",L""); + Replace(bsSpaceTest.m_str,L" ",L""); + + if(wcslen(bsSpaceTest)==0) + { + ParserStack.RemoveAt(ParsedItemIndex); + continue; + } + } + + if(current.IsTag&&!current.IsClosedTag&&!current.IsSingleTag) + { + if((ParsedItemIndex+1)(MaxLen)) + { + // Close Open Tags + for(int BackIndex = ParsedItemIndex; BackIndex>=0;BackIndex--) + { + ParserState stackItem = ParserStack.GetAt(BackIndex); + + if(stackItem.IsTag && !stackItem.IsSingleTag && !stackItem.IsClosedTag) + { + if(!IsClosedTag(ParserStack,ParsedItemIndex,BackIndex)) + { + bsRetVal += L""; + + CComBSTR tmpVal = stackItem.Text; + tmpVal += bsText; + bsText = tmpVal; + } + } + } + + // Append Open Tags + for(int NewIndex = ParsedItemIndex+1; NewIndex",L""); + Replace(string,L"

",L"
"); + + Replace(string,L"",L""); + Replace(string,L"",L""); + + Replace(string,L"",L""); + Replace(string,L"",L""); + + return; + + /*// Remove Empty Tag [10/7/2002] + LPWSTR srcFreeTagStr = NULL; + UINT stringLen = 0; + + LPCWSTR strEmptyShablon[10] = {L">",L"
",L"\r\n",L" ",L"> "}; + //size_t szEmptyShablon = wcslen(strEmptyShablon); + + if((stringLen = SysStringLen(string))>0) + { + srcFreeTagStr = new WCHAR[stringLen+1]; + wcscpy(srcFreeTagStr,string); + + stringLen = wcslen(string); + + while(true) + { + // Step 3. Check \r\n is end ??? + LPWSTR lpszStartDel = srcFreeTagStr+stringLen-1; + + if(lpszStartDel is end ??? + lpszStartDel = srcFreeTagStr+stringLen-wcslen(strEmptyShablon[0]); + + if(lpszStartDel=srcFreeTagStr&&*lpszStartDel!=L'<') + lpszStartDel--; + + *lpszStartDel = NULL; + + stringLen = wcslen(srcFreeTagStr); + + continue; + } + // Step 2. Check  
is end ??? + + lpszStartDel = srcFreeTagStr+stringLen-wcslen(strEmptyShablon[1]); + + if(lpszStartDel  is end ??? + lpszStartDel = srcFreeTagStr+stringLen-wcslen(strEmptyShablon[4]); + + if(lpszStartDel=srcFreeTagStr&&*lpszStartDel!=L'<') + lpszStartDel--; + + *lpszStartDel = NULL; + + stringLen = wcslen(srcFreeTagStr); + + continue; + } + + + // Just Exit [10/7/2002] + break; + } + + SysFreeString(string); + string = SysAllocString(srcFreeTagStr); + + delete [] srcFreeTagStr; + }*/ +} + +void RoundExitAddon(CWnd *m_hWnd,int Step /*= 10*/,DWORD dwTime/* = 25*/) +{ + if(!IsWindow(m_hWnd->GetSafeHwnd())) return; + + CRect m_Ret; + m_hWnd->GetWindowRect(&m_Ret); + CRgn m_Rgn; m_Rgn.CreateEllipticRgn(0,0,0,0); + + int imin = min(m_Ret.Width(),m_Ret.Height()); + int x0 = m_Ret.Width()/2; + int y0 = m_Ret.Height()/2; + int h = imin/(2*Step); + + for(int i = Step;i>0;i--) + { + m_Rgn.DeleteObject(); + m_Rgn.CreateEllipticRgn(x0-i*h,y0-i*h,x0+i*h,y0+i*h); + m_hWnd->SetWindowRgn(m_Rgn,TRUE); + m_hWnd->UpdateWindow(); + Sleep(dwTime); + } +} + +void FitRectToWindow(CRect &r) +{ + // Solve multi monitor problem + return; + + RECT rd; + SystemParametersInfo(SPI_GETWORKAREA, 0, &rd, 0); + + // first check right and bottom edges + if(r.right > rd.right) + r.OffsetRect(rd.right - r.right, 0); + if(r.bottom > rd.bottom) + r.OffsetRect(0, rd.bottom - r.bottom); + + // then check left and top edges + if(r.left < rd.left) + r.OffsetRect(rd.left - r.left, 0); + if(r.top < rd.top) + r.OffsetRect(0, rd.top - r.top); +} +/* +void FitRectToWindow(CRect &ModRect) +{ + RECT rd; + SystemParametersInfo(SPI_GETWORKAREA, 0, &rd, 0); + long WindowsCX = rd.right - rd.left; + long WindowsCY = rd.bottom - rd.top; +// long WindowsCX = GetSystemMetrics(SM_CXFULLSCREEN); +// long WindowsCY = GetSystemMetrics(SM_CYFULLSCREEN); + if(ModRect.left<0) + { + ModRect.right += -ModRect.left + 10; + ModRect.left = 10; + } + if(ModRect.top<0) + { + ModRect.bottom += -ModRect.top +10; + ModRect.top = 10; + } + if(ModRect.right>WindowsCX) + { + ModRect.left -= ModRect.right-WindowsCX + 10; + ModRect.right = WindowsCX-10; + } + if(ModRect.bottom>WindowsCY) + { + ModRect.top -= ModRect.bottom-WindowsCY + 10; + ModRect.bottom = WindowsCY-10; + } + if(ModRect.left<0) ModRect.left = 10; + if(ModRect.top<0) ModRect.top = 10; + if(ModRect.right>WindowsCX) ModRect.right = WindowsCX-10; + if(ModRect.bottom>WindowsCY) ModRect.bottom = WindowsCY-10; +} +*/ + +HRESULT LoadDATAFromStream(IN IStream* pDataStream,OUT BYTE **pBuffer, OUT DWORD *pSize) +{ + if(pDataStream==NULL||pBuffer==NULL||pSize==NULL) + return E_INVALIDARG; + + HRESULT hr = S_OK; + + try + { + IStreamPtr pTMPStream = NULL; + CreateStreamOnHGlobal(NULL,TRUE,&pTMPStream); + + const ULONG Read = 1000; + ULONG pRealyRead = 0, pRealyWrite = 0; + BYTE pRead[Read+1]; + + do + { + pDataStream->Read((LPVOID)pRead,Read,&pRealyRead); + pTMPStream->Write((LPVOID)pRead,pRealyRead,&pRealyWrite); + *pSize += pRealyWrite; + } + while(Read==pRealyRead); + + LARGE_INTEGER lI = {0,0}; + ULARGE_INTEGER uI; + pTMPStream->Seek(lI,STREAM_SEEK_SET,&uI); + + *pBuffer = (BYTE*)GlobalAlloc(GPTR,*pSize); + + pTMPStream->Read((void*)*pBuffer,*pSize,&pRealyRead); + + } + catch(_com_error &e) + { + hr = e.Error(); + } + + return hr; +} + +void TestDirAndCreateDir(LPCTSTR Path) +{ + CString strPath = Path, strTmp; + while(TRUE) + { + int Index = strPath.Find('\\'); + if(Index==-1) + break; + strTmp += strPath.Left(Index+1); + CreateDirectory(strTmp,NULL); + strPath = strPath.Mid(Index+1); + } +} + +HIMAGELIST GetSystemImageList(BOOL fSmall) +{ + USES_CONVERSION; + + HIMAGELIST himl; + SHFILEINFO sfi = {0}; + + himl = (HIMAGELIST)SHGetFileInfo(TEXT(".txt"), FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES|SHGFI_SYSICONINDEX |(fSmall ? SHGFI_SMALLICON : SHGFI_LARGEICON)); + + return himl; +} + +int GetIconIndexInSystemImageList(BOOL fSmall, LPCTSTR Path) +{ + SHFILEINFO shfi; + memset(&shfi,0,sizeof(shfi)); + SHGetFileInfo(Path, FILE_ATTRIBUTE_NORMAL,&shfi, sizeof(shfi),SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|(fSmall ? SHGFI_SMALLICON : SHGFI_LARGEICON)); + return shfi.iIcon; +} + +BOOL IsTVFileType(BSTR URL) +{ + // Determine MIME type + BOOL bResult = FALSE; + HRESULT hr; + LPWSTR pStrMimeType = NULL; + + hr = FindMimeFromData(NULL, URL, NULL, 0, NULL, 0, &pStrMimeType, 0); + if(hr == NOERROR) + { + if(0 == wcsicmp(pStrMimeType, L"application/x-shockwave-flash")) + return TRUE; + + if(0 == wcsicmp(pStrMimeType, L"audio/wav")) + return TRUE; + if(0 == wcsicmp(pStrMimeType, L"audio/mpeg")) + return TRUE; + + if(0 == wcsicmp(pStrMimeType, L"video/avi")) + return TRUE; + if(0 == wcsicmp(pStrMimeType, L"video/mpeg")) + return TRUE; + if(0 == wcsicmp(pStrMimeType, L"video/x-ms-asf")) + return TRUE; + } + + return bResult; +} + +HRESULT GetTargetRect(LPDISPATCH pDisp, long &cx, long &cy, long &tearoff, long &fullscreen) +{ + HRESULT hr = E_FAIL; + + CComPtr pBrowser = NULL; + CComPtr pDoc = NULL; + CComPtr pDispDoc = NULL; + CComPtr pEle = NULL; + CComVariant value; + WCHAR* szNULL = L"\0"; + + hr = pDisp->QueryInterface(__uuidof(IWebBrowser2), (void**)&pBrowser); + if(pBrowser == NULL) return hr; + hr = pBrowser->get_Document(&pDispDoc); + if(pDispDoc == NULL) return hr; + hr = pDispDoc->QueryInterface(__uuidof(IHTMLDocument2), (void**)&pDoc); + if(pDoc == NULL) return hr; + + // when document is loaded + hr = pDoc->get_activeElement(&pEle); + if(pEle == NULL) return hr; + + pEle->getAttribute(CComBSTR(L"tearoff"), 0, &value); + if(value.vt == VT_BSTR && value.bstrVal != NULL) + tearoff = wcstol(value.bstrVal, &szNULL, 10); + pEle->getAttribute(CComBSTR(L"height"), 0, &value); + if(value.vt == VT_BSTR && value.bstrVal != NULL) + cy = wcstol(value.bstrVal, &szNULL, 10); + pEle->getAttribute(CComBSTR(L"width"), 0, &value); + if(value.vt == VT_BSTR && value.bstrVal != NULL) + { + if(tearoff > 0 && 0 == wcscmp(value.bstrVal, L"100%")) + { + fullscreen = 1; + cx = 400; + cy = 300; + } + else + cx = wcstol(value.bstrVal, &szNULL, 10); + } + + return hr; +} + +CString GetProductLanguage() +{ + CString strRetVal; + + +#ifndef RADIUS + if(!McRegGetString(HKEY_CURRENT_USER,_T("Software\\Mediachase\\Instant Business Network\\4.5\\ClientTools"),_T("Language"), strRetVal,_T("1033"))) + { + McRegGetString(HKEY_LOCAL_MACHINE,_T("Software\\Mediachase\\Instant Business Network\\4.5\\ClientTools"),_T("Language"), strRetVal,_T("1033")); + } +#else + if(!McRegGetString(HKEY_CURRENT_USER,_T("Software\\Radius-Soft\\MagRul\\4.5\\ClientTools"),_T("Language"), strRetVal,_T("1033"))) + { + McRegGetString(HKEY_LOCAL_MACHINE,_T("Software\\Radius-Soft\\MagRul\\4.5\\ClientTools"),_T("Language"), strRetVal,_T("1033")); + } +#endif + + return strRetVal; +} + +CString GetProductPath() +{ + CString strRetVal; + +#ifndef RADIUS + if(!McRegGetString(HKEY_CURRENT_USER,_T("Software\\Mediachase\\Instant Business Network\\4.5\\ClientTools"),_T("Path"), strRetVal,_T(""))) + { + McRegGetString(HKEY_LOCAL_MACHINE,_T("Software\\Mediachase\\Instant Business Network\\4.5\\ClientTools"),_T("Path"), strRetVal,_T("")); + } +#else + if(!McRegGetString(HKEY_CURRENT_USER,_T("Software\\Radius-Soft\\MagRul\\4.5\\ClientTools"),_T("Path"), strRetVal,_T(""))) + { + McRegGetString(HKEY_LOCAL_MACHINE,_T("Software\\Radius-Soft\\MagRul\\4.5\\ClientTools"),_T("Path"), strRetVal,_T("")); + } +#endif + + return strRetVal; +} + +CComPtr AppendWithSort(IXMLDOMNode* parentNode, IXMLDOMNode* newChildNode, BSTR bstCmpAttributeName) +{ + CComPtr retValNode; + + VARIANT_BOOL hasChildNodes = VARIANT_FALSE; + + HRESULT hr = parentNode->hasChildNodes(&hasChildNodes); + + if(hasChildNodes==VARIANT_TRUE) + { + CComVariant varNewItemText; + GetAttribute(newChildNode,bstCmpAttributeName,&varNewItemText); + varNewItemText.ChangeType(VT_BSTR); + CComBSTR bstNewItemTex = varNewItemText.bstrVal; + + CComPtr childNodes; + hr = parentNode->get_childNodes(&childNodes); + + long lCount; + hr = childNodes->get_length(&lCount); + + for(int index=0;index childNode; + hr = childNodes->get_item(index, &childNode); + + CComVariant varItemText; + GetAttribute(childNode,bstCmpAttributeName,&varItemText); + varItemText.ChangeType(VT_BSTR); + CComBSTR bstItemTex = varItemText.bstrVal; + + if(bstNewItemTexinsertBefore(newChildNode, varRef, &retValNode); + break; + } + } + + if(retValNode==NULL) + hr = parentNode->appendChild(newChildNode, &retValNode); + + } + else + { + hr = parentNode->appendChild(newChildNode, &retValNode); + } + + + return retValNode; +} + + + +BOOL McPlaySound(UINT SoundId) +{ +// return PlaySound(GetOptionString(IDS_SOUND,SoundId,_T("")),NULL,SND_FILENAME|SND_ASYNC|SND_NODEFAULT); + CString str; + if(g_settings.GetString(IDS_SOUND, SoundId, str, _T(""))) + { + if(str.GetLength()!=0) + { + DWORD dwFileAtr = GetFileAttributes(str); + + if(dwFileAtr==INVALID_FILE_ATTRIBUTES) + { + g_settings.SetStringFromLocal2Current(IDS_SOUND, SoundId); + g_settings.GetString(IDS_SOUND, SoundId, str, _T("")); + } + + return PlaySound(str, NULL, SND_FILENAME|SND_ASYNC|SND_NODEFAULT); + } + } + + return FALSE; +} + +CMap g_mapOpenedWindows; +void AddWindowToClose(CWnd *pWnd) +{ + g_mapOpenedWindows.SetAt(pWnd, TRUE); +} + +void RemoveWindowToClose(CWnd *pWnd) +{ + g_mapOpenedWindows.RemoveKey(pWnd); +} + +void CloseAllWindows() +{ + CWnd *pWnd = NULL; + BOOL val; + POSITION pos = g_mapOpenedWindows.GetStartPosition(); + while(pos != NULL) + { + g_mapOpenedWindows.GetNextAssoc(pos, pWnd, val); + if(!IsBadReadPtr(pWnd,sizeof(CWnd))) + { + if(IsWindow(pWnd->GetSafeHwnd())) + pWnd->SendMessage(WM_CLOSE); + } + } + g_mapOpenedWindows.RemoveAll(); +} + +HRESULT Array2Stream(VARIANT varData, IStream** ppDataStream) +{ + if(ppDataStream==NULL) + return E_INVALIDARG; + + HRESULT hr = E_FAIL; + + if(varData.vt&VT_ARRAY) + { + SAFEARRAY *pSafeArray = varData.parray; + + void HUGEP *pData = NULL; + + hr = SafeArrayAccessData(pSafeArray,&pData); + + if(SUCCEEDED(hr)) + { + ULONG pDataRead = 0; + ULONG pDataPos = 0; + + CreateStreamOnHGlobal(NULL,TRUE,ppDataStream); + + HRESULT hr = (*ppDataStream)->Write(pData,pSafeArray->rgsabound[0].cElements,&pDataRead); + if(SUCCEEDED(hr)) + { + LARGE_INTEGER lPos = {0}; + ULARGE_INTEGER lNowPos; + + hr = (*ppDataStream)->Seek(lPos,STREAM_SEEK_SET,&lNowPos); + } + + SafeArrayUnaccessData(pSafeArray); + } + } + + return hr; +} + +CString GetAppDataDir() +{ + static CString strRetValue; + + if(!strRetValue.IsEmpty()) + return strRetValue; + + TCHAR pBuff[MAX_PATH]; + + // Oleg Addon + CRegKey AppDataKey; + if(AppDataKey.Open(HKEY_CURRENT_USER,_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"),KEY_READ)==ERROR_SUCCESS) + { + DWORD BuffSize = MAX_PATH; + + if(AppDataKey.QueryValue(pBuff,_T("AppData"),&BuffSize)==ERROR_SUCCESS) + { + for(int Step = 1; Step<4; Step++) + { + switch(Step) + { + case 1: + strRetValue = pBuff; + break; + case 2: + strRetValue += _T("\\"); + strRetValue += GetString(IDS_REGISTRY_KEY); + break; + case 3: + strRetValue += _T("\\"); + strRetValue += GetString(IDR_MAINFRAME); + break; + } + + CreateDirectory(strRetValue,NULL); + } + } + } + return strRetValue; +} + +CString GetRegFileText(LPCTSTR lpszSection, LPCTSTR lpszEntry) +{ + CString strRetData; + CString strFileName = theApp.GetProfileString(lpszSection, lpszEntry, NULL); + if(!strFileName.IsEmpty()) + { + HANDLE hFile = CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if(hFile!= INVALID_HANDLE_VALUE) + { + DWORD dwFileSize = 0; + dwFileSize = GetFileSize(hFile, NULL); + LPBYTE pData = new BYTE[dwFileSize+2]; + if(pData != NULL) + { + memset(pData, 0, dwFileSize+2); + DWORD dwRealRead = 0; + ReadFile(hFile, reinterpret_cast(pData), dwFileSize, &dwRealRead, NULL); + if(dwRealRead >= 2) + { + USES_CONVERSION; + LPTSTR szData; + WORD byteOrderIndicator = *reinterpret_cast(pData); + if(byteOrderIndicator == 0xFFFE) + szData = W2T(reinterpret_cast(pData+2)); + else + szData = A2T(reinterpret_cast(pData)); + DWORD dwDataSize = _tcslen(szData); + LPTSTR szBuff = strRetData.GetBuffer(dwDataSize+1); + _tcscpy(szBuff, szData); + strRetData.ReleaseBuffer(); + } + delete[] pData; + } + CloseHandle(hFile); + } + else + { + theApp.WriteProfileString(lpszSection,lpszEntry,NULL); + } + } + + return strRetData; +} + +BOOL SetRegFileText(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR pData) +{ + BOOL bRetVal = FALSE; + if(pData==NULL||IsBadStringPtr(pData,MAX_PATH)) + return bRetVal; + + CString strFileName = theApp.GetProfileString(lpszSection,lpszEntry,NULL); + if(strFileName.IsEmpty()) + { + CString strDataDirPath = GetAppDataDir(); + LPTSTR Buf = strFileName.GetBuffer(MAX_PATH); + GetTempFileName(strDataDirPath,_T("McData"),0,Buf); + strFileName.ReleaseBuffer(); + theApp.WriteProfileString(lpszSection,lpszEntry,strFileName); + } + + if(!strFileName.IsEmpty()) + { + HANDLE hFile = CreateFile(strFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + + if(hFile!= INVALID_HANDLE_VALUE) + { + USES_CONVERSION; + LPWSTR wszData = T2W(const_cast(pData)); + DWORD dwBuffLen = wcslen(wszData)*sizeof(WCHAR); + DWORD dwWritten = 0; + WORD byteOrderIndicator = 0xFFFE; + WriteFile(hFile,(LPVOID)&byteOrderIndicator, 2, &dwWritten, NULL); + WriteFile(hFile,(LPVOID)wszData, dwBuffLen, &dwWritten, NULL); + SetEndOfFile(hFile); + CloseHandle(hFile); + bRetVal = TRUE; + } + } + + return bRetVal; +} + + +CString ByteSizeToStr(DWORD dwSize) +{ + CString strRet; + + if(dwSize<512) + strRet.Format(GetString(IDS_DATA_BYTE_FORMAT),dwSize); + else + if(dwSize<1000*1024) + strRet.Format(GetString(IDS_DATA_KBYTE_FORMAT),dwSize/1024.0); + else + strRet.Format(GetString(IDS_DATA_MBYTE_FORMAT),dwSize/(1024.0*1000)); + + return strRet; +} + +CString GetMyDocumetPath(LPCTSTR UserRoleName, int UserId) +{ + CString strUserId; + strUserId.Format(_T("%d"), UserId); + + CString strMyDocumentPath = theApp.GetProfileString(GetString(IDS_INFO) + _T("\\") + UserRoleName+_T("\\")+strUserId,GetString(IDS_RECEIVED_FILES)); + if(strMyDocumentPath.IsEmpty()) + { + CRegKey MyDocReg; + if(MyDocReg.Open(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"),KEY_READ)==ERROR_SUCCESS) + { + TCHAR strBuff[MAX_PATH]; + DWORD dwBuffSize = MAX_PATH; + int Val; + if((Val=MyDocReg.QueryValue(strBuff,_T("Personal"),&dwBuffSize))==ERROR_SUCCESS) + { + CString StrFormat = _T("%s\\"); + StrFormat += GetString(IDS_IBN_RECEIVED_FILE_NAME); + strMyDocumentPath.Format(StrFormat,strBuff); + CreateDirectory(strMyDocumentPath,NULL); + } + } + } + return strMyDocumentPath; +} + +BOOL SetMyDocumetPath(LPCTSTR UserRoleName, int UserId, LPCTSTR Path) +{ + CString strUserId; + strUserId.Format(_T("%d"), UserId); + + return theApp.WriteProfileString(GetString(IDS_INFO) + _T("\\") + UserRoleName+_T("\\")+strUserId,GetString(IDS_RECEIVED_FILES),Path); +} + +int ShowContextMenu(long TreeAddon, HWND hWnd, LPCTSTR pszPath, int x, int y, LPCTSTR stVer, IContextMenu2 **pContextMenu2,IContextMenu3 **pContextMenu3) +{ + USES_CONVERSION; + + // Строим полное имя файла/каталога + TCHAR tchFullPath[10000]; + GetFullPathName(pszPath, sizeof(tchFullPath)/sizeof(TCHAR), tchFullPath, NULL); + + // Получаем интерфейс IShellFolder рабочего стола + IShellFolder *pDesktopFolder; + SHGetDesktopFolder(&pDesktopFolder); + + // Преобразуем заданный путь в LPITEMIDLIST + LPITEMIDLIST pidl; + pDesktopFolder->ParseDisplayName(hWnd, NULL, T2OLE(tchFullPath), NULL, &pidl, NULL); + + // Ищем последний идентификатор в полученном списке pidl + LPITEMIDLIST pLastId = pidl; + + if(pLastId==NULL) + return 0; + + USHORT temp; + while(1) + { + int offset = pLastId->mkid.cb; + temp = *(USHORT*)((BYTE*)pLastId + offset); + + if(temp == 0) + break; + + pLastId = (LPITEMIDLIST)((BYTE*)pLastId + offset); + } + + // Получаем интерфейс IShellFolder родительского объекта для заданного файла/каталога + // Примечание: родительский каталог идентифицируется списком pidl за вычетом последнего + // элемента, поэтому мы временно зануляем pLastId->mkid.cb, отрезая его от списка + temp = pLastId->mkid.cb; + pLastId->mkid.cb = 0; + IShellFolder *pFolder = NULL; + pDesktopFolder->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&pFolder); + + // Получаем интерфейс IContextMenu для заданного файла/каталога + // Примечание: относительно родительского объекта заданный файл/каталог идентифицируется + // единственным элементом pLastId + pLastId->mkid.cb = temp; + IContextMenu *pContextMenu; + pFolder->GetUIObjectOf(hWnd, 1, (LPCITEMIDLIST *)&pLastId, IID_IContextMenu, NULL, (void**)&pContextMenu); + + if(pContextMenu2) + { + pContextMenu->QueryInterface(IID_IContextMenu2,(LPVOID*)pContextMenu2); + } + + if(pContextMenu3) + { + pContextMenu->QueryInterface(IID_IContextMenu3,(LPVOID*)pContextMenu3); + } + + UINT nCmd = 0; + + HMENU hPopupMenu = CreatePopupMenu(); + + // Заполняем меню + + if(TreeAddon) + { + InsertMenu(hPopupMenu,0,MF_BYPOSITION|MF_DEFAULT|MF_STRING|(TreeAddon&2?MF_ENABLED:MF_GRAYED),0x8001,TreeAddon&4?GetString(IDS_COLLAPSE_NAME):GetString(IDS_EXPAND_NAME)); + pContextMenu->QueryContextMenu(hPopupMenu, 1, 1, 0x7FFF, CMF_EXPLORE|CMF_CANRENAME); + } + else + pContextMenu->QueryContextMenu(hPopupMenu, 0, 1, 0x7FFF, CMF_EXPLORE|CMF_CANRENAME); + + if(TreeAddon) + { + //InsertMenu(hPopupMenu,0,MF_BYPOSITION|MF_DEFAULT|MF_STRING|(TreeAddon&2?MF_ENABLED:MF_GRAYED),0x8001,TreeAddon&4?_T("Collapse"):_T("Expand")); + InsertMenu(hPopupMenu,1,MF_BYPOSITION|MF_SEPARATOR,0,0); + InsertMenu(hPopupMenu,2,MF_BYPOSITION|MF_ENABLED|MF_STRING,0x8002,GetString(IDS_NEW_CHILD_FOLDER_NAME)); + InsertMenu(hPopupMenu,3,MF_BYPOSITION|MF_SEPARATOR,0,0); + } + + if(stVer==NULL) + { + // Создаём меню + // Отображаем меню + nCmd = TrackPopupMenu(hPopupMenu, + TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_RETURNCMD, x, y, 0, hWnd, 0); + } + else + { + nCmd = (UINT)stVer; + } + + DestroyMenu(hPopupMenu); + + // Выполняем команду (если она была выбрана) + if(nCmd>=1&&nCmd<=0x7FFF) + { + CMINVOKECOMMANDINFO ici; + ZeroMemory(&ici, sizeof(CMINVOKECOMMANDINFO)); + ici.cbSize = sizeof(CMINVOKECOMMANDINFO); + + ici.hwnd = hWnd; + ici.lpVerb = reinterpret_cast(MAKEINTRESOURCE(nCmd-1)); + ici.nShow = SW_SHOWNORMAL; + + pContextMenu->InvokeCommand(&ici); + } + + // Получаем интерфейс IMalloc + IMalloc *pMalloc; + SHGetMalloc(&pMalloc); + + // Освобождаем память, выделенную для pidl + if(pMalloc) + pMalloc->Free(pidl); + + // Освобождаем все полученные интерфейсы + if(pDesktopFolder) + pDesktopFolder->Release(); + if(pFolder) + pFolder->Release(); + if(pContextMenu2&&(*pContextMenu2)) + { + (*pContextMenu2)->Release(); + *pContextMenu2 = NULL; + } + if(pContextMenu3&&(*pContextMenu3)) + { + (*pContextMenu3)->Release(); + *pContextMenu3 = NULL; + } + + if(pContextMenu) + pContextMenu->Release(); + if(pMalloc) + pMalloc->Release(); + + return nCmd; +} + +HRESULT NavigateNewWindow(LPUNKNOWN pBrowserDispatch, LPCTSTR strUrl) +{ + if(GetOptionInt(IDS_OFSMESSENGER,IDS_GET_DEFAULT_BROWSER_FROM_REGISTRY,TRUE)==0) + return E_FAIL; + + HRESULT hr = S_OK; + + ATL::CUrl urlParser; + + if(!urlParser.CrackUrl(strUrl)|| + urlParser.GetScheme()>ATL_URL_SCHEME_HTTPS|| + urlParser.GetScheme()<0) + return E_INVALIDARG; + + TCHAR Browser[MAX_PATH] = _T(""); + TCHAR buf[MAX_PATH] = _T(""); + + HKEY hKey; + DWORD Size = 256; + + if(RegOpenKeyEx (HKEY_CLASSES_ROOT, _T("http\\shell\\open\\command"),0, KEY_QUERY_VALUE, &hKey)==ERROR_SUCCESS) + { + if(RegQueryValueEx (hKey, NULL, NULL, NULL, (LPBYTE)buf, &Size)==ERROR_SUCCESS) + { + int i; + + int pos; + int len; + TCHAR *EXE = _T(".exe"); + + // Отрежем то, что после пути с именем + // Найдем, где кончается путь + if (buf[0] == _TEXT('\"')) + { + lstrcpy (Browser, &buf[1]); + } + else + { + lstrcpy (Browser, buf); + } + + len = lstrlen (Browser); + pos = len - 4; + for (i = 0; i < len - 3; i++) + { + if (!_tcsncicmp (&Browser[i], EXE, 4)) + { + pos = i; + break; + } + } + Browser[pos + 4] = 0; + + if(!ShellExecute(::GetDesktopWindow(), _T("open"), Browser,strUrl, NULL, SW_SHOWDEFAULT)) + hr = HRESULT_FROM_WIN32(GetLastError()); + + } + else + hr = HRESULT_FROM_WIN32(GetLastError()); + + RegCloseKey (hKey); + } + else + hr = HRESULT_FROM_WIN32(GetLastError()); + + return hr; + +/* USES_CONVERSION; + + HRESULT hr = E_FAIL; + LPUNKNOWN pDispatch = pBrowserDispatch; + if(pDispatch) + { + CComQIPtr spWB2(pDispatch); + if(spWB2) + { + CComPtr spDispDoc = NULL; + spWB2->get_Document(&spDispDoc); + if(spDispDoc) + { + CComQIPtr spDoc(spDispDoc); + if(spDoc) + { + CComPtr spWindow = NULL; + spDoc->get_parentWindow(&spWindow); + + if(spWindow) + { + CComPtr spTmpWindow = NULL; + try + { + CComBSTR bstrUrl = T2OLE(strUrl); + + if(SUCCEEDED(spWindow->open(bstrUrl,NULL,NULL,VARIANT_FALSE,&spTmpWindow))) + return S_OK; + } + catch (...) + { + } + } + } + } + } + } + return hr; */ +} + +SYSTEMTIME TimeTToSystemTime(time_t &TimeT) +{ + SYSTEMTIME retValue = {0}; + + struct tm *newtime; + newtime = localtime( &TimeT); /* Convert to local time. */ + retValue.wYear = newtime->tm_year+1900; + retValue.wMonth = newtime->tm_mon+1; + retValue.wDay = newtime->tm_mday; + retValue.wHour = newtime->tm_hour; + retValue.wMinute = newtime->tm_min; + retValue.wDayOfWeek = newtime->tm_wday; + retValue.wSecond = newtime->tm_sec; + + return retValue; +} + +BOOL SetItemToColorStorage(LPCTSTR UserRole, int UserId, DWORD dwId, LPCTSTR strText, DWORD dwColor) +{ + USES_CONVERSION; + + // Confert RGB Color to BGR [8/28/2002] + //dwColor = RGB(GetBValue(dwColor),GetGValue(dwColor),GetRValue(dwColor)); + // Confert RGB Color to BGR [8/28/2002] + + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),UserRole,UserId); + + CString strColorXML = GetRegFileText(strSection,GetString(IDS_SELECT_COLOR)); + + CComPtr pColorDoc = NULL; + pColorDoc.CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER); + + VARIANT_BOOL varLoad = VARIANT_FALSE; + + if(!strColorXML.IsEmpty()) + { + CComBSTR bsXML; + bsXML.Attach(strColorXML.AllocSysString()); + + pColorDoc->loadXML(bsXML,&varLoad); + + CString strQueryFormat; + strQueryFormat.Format(_T("colors/color_item[id=\"%d\"]"),dwId); + + CComBSTR bsQuery; + bsQuery.Attach(strQueryFormat.AllocSysString()); + + CComPtr pColorItemNode = NULL; + + pColorDoc->selectSingleNode(bsQuery,&pColorItemNode); + + if(pColorItemNode) + { + CComPtr pColorItemNodeParent = NULL; + pColorItemNode->get_parentNode(&pColorItemNodeParent); + + if(pColorItemNodeParent) + { + pColorItemNodeParent->removeChild(pColorItemNode,NULL); + } + } + + } + else + { + pColorDoc->loadXML(CComBSTR(L""),&varLoad); + } + + if(varLoad==VARIANT_FALSE) + return FALSE; + + + CComPtr pColorsNode = NULL; + + pColorDoc->selectSingleNode(CComBSTR(L"colors"),&pColorsNode); + + if(pColorsNode) + { + CComPtr pColorItemNode = NULL; + + insertSingleNode(pColorsNode,CComBSTR("color_item"),NULL,NULL,&pColorItemNode); + + if(pColorItemNode) + { + WCHAR wsBuffId[100],wsBuff[100]; + + _ltow(dwId,wsBuffId,10); + + //_ltow(dwColor,wsBuffColor,16); + swprintf(wsBuff,L"%02X%02X%02X",GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); + + insertSingleNode(pColorItemNode,CComBSTR("id"),NULL,CComBSTR(wsBuffId)); + insertSingleNode(pColorItemNode,CComBSTR("text"),NULL,CComBSTR(T2CW(strText))); + insertSingleNode(pColorItemNode,CComBSTR("color"),NULL,CComBSTR(wsBuff)); + + CComBSTR bsXML; + pColorDoc->get_xml(&bsXML); + + SetRegFileText(strSection,GetString(IDS_SELECT_COLOR),W2CT(bsXML)); + + return TRUE; + } + } + + return FALSE; +} + +BOOL GetItemFromColorStorage(LPCTSTR UserRole, int UserId, DWORD dwId, CString& strText, DWORD &dwColor) +{ + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),UserRole,UserId); + + CString strColorXML = GetRegFileText(strSection,GetString(IDS_SELECT_COLOR)); + + if(strColorXML.IsEmpty()) + return FALSE; + + CComPtr pColorDoc = NULL; + pColorDoc.CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER); + + CComBSTR bsXML; + bsXML.Attach(strColorXML.AllocSysString()); + + VARIANT_BOOL varLoad = VARIANT_FALSE; + + pColorDoc->loadXML(bsXML,&varLoad); + + if(varLoad==VARIANT_TRUE) + { + CString strQueryFormat; + strQueryFormat.Format(_T("colors/color_item[id=\"%d\"]"),dwId); + + CComBSTR bsQuery; + bsQuery.Attach(strQueryFormat.AllocSysString()); + + CComPtr pColorItemNode = NULL; + + pColorDoc->selectSingleNode(bsQuery,&pColorItemNode); + + if(pColorItemNode) + { + CComBSTR bsUserId, bsText, bsColor; + + GetTextByPath(pColorItemNode,CComBSTR(L"text"),&bsText); + GetTextByPath(pColorItemNode,CComBSTR(L"color"),&bsColor); + + strText = (BSTR)bsText; + + WCHAR *pEnd = NULL; + + dwColor = wcstol(bsColor,&pEnd,16); + + dwColor = RGB(GetBValue(dwColor),GetGValue(dwColor),GetRValue(dwColor)); + + return TRUE; + } + } + + return FALSE; +} + +BOOL GetColorFromColorStorage(LPCTSTR UserRole, int UserId, DWORD dwId, DWORD &dwColor) +{ + CString strTmp; + return GetItemFromColorStorage(UserRole,UserId,dwId,strTmp,dwColor); +} + +/************************************************************************/ +/* BNF Form from WWW.RSDN.RU + + ::= @ + ::= + ::= + ::= ['.' ] + ::= * + + - любые символы в диапазоне #33 (-) до #126 (~), кроме ()<>@,;:\/.[] (согласно RFC 822) +*/ +/************************************************************************/ +BOOL CheckEmailString(LPCTSTR strEmail) +{ + // Check strEmail Is Good String [9/2/2002] + if(IsBadStringPtr(strEmail,256)) + return FALSE; + + // [9/2/2002] + const TCHAR char_min = _T('-'); // #33 + const TCHAR char_max = _T('~'); // #126 + + // в этот диапазон входят: + // - + // . + // / + // 012456789 + // :;<=>? + // @ + // ABCDEFGHIJKLMNOPQRSTUVWXYZ + // [\]^ + // _ + // ` + // abcdefghijklmnopqrstuvwxyz + // { | } + // ~ + + enum State { er = -2, ok = -1, n1, n2, d1, d2, states_count }; + + // макросы для заполнения таблицы переходов (см.ниже) + #define t_4(st) st,st,st,st + #define t_6(st) st,st,st,st,st,st + #define t_10(st) t_6(st), t_4(st) + #define t_26(st) t_10(st), t_10(st), t_6(st) + + #define er_3 er,er,er + #define er_4 t_4(er) + #define er_6 t_6(er) + + #define t_dot(st) st, er + #define t_digits(st) t_10(st), er_6 + #define t_at(st) st + #define t_alpha(st) t_26(st), er_4, st, er, t_26(st), er_3, st + + #define t_all(end, dot, at, letter) \ + { end, letter, t_dot(dot), t_digits(letter), t_at(at), t_alpha(letter) } + + // под индексом [0] идет реакция на конец строки + // анализ символов начинается с [1]: index = c - char_min + 1 + + static const State transfer[states_count][char_max-char_min+2] = + { + t_all(er,er,er,n2), + t_all(er,n1,d1,n2), + t_all(er,er,er,d2), + t_all(ok,d1,er,d2), + }; + + #undef t_4 + #undef t_6 + #undef t_10 + #undef t_26 + #undef er_3 + #undef er_4 + #undef er_6 + #undef t_dot + #undef t_digits + #undef t_at + #undef t_alpha + #undef t_all + + State state = n1; + + while(true) + { + TCHAR c = *(strEmail++); + if(c==_T('\0')) + return transfer[state][0] == ok; + if(c < char_min || c > char_max) + return FALSE; + state = transfer[state][c - char_min + 1]; + if(state == er) + return FALSE; + } +} + +BOOL GetSendToLinkFileName(CString &Result) +{ + BOOL result = FALSE; + CString strFolder; + + if(McRegGetString(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"), _T("SendTo"), strFolder, NULL)) + { + if( GetProductLanguage() == "1049") + { + #ifndef RADIUS + Result.Format(_T("%s\\IBN Группа или пользователь.lnk"), strFolder); + #else + Result.Format(_T("%s\\MagRul Группа или пользователь.lnk"), strFolder); + #endif + } + else + { + #ifndef RADIUS + Result.Format(_T("%s\\IBN Group or User.lnk"), strFolder); + #else + Result.Format(_T("%s\\MagRul Group or User.lnk"), strFolder); + #endif + } + + result = TRUE; + } + return result; +} + +HRESULT CreateShortcut(LPCTSTR szTargetFile, LPCTSTR szArgs, LPCTSTR szLinkFile, LPCTSTR szDesc) +{ + HRESULT hr; + IShellLink* psl = NULL; + + // Get a pointer to the IShellLink interface. + hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast(&psl)); + if(SUCCEEDED(hr)) + { + IPersistFile* ppf = NULL; + + // Query IShellLink for the IPersistFile interface for + // saving the shell link in persistent storage. + hr = psl->QueryInterface(IID_IPersistFile, reinterpret_cast(&ppf)); + if(SUCCEEDED(hr)) + { +// WORD wsz[MAX_PATH]; + + // Set the path to the shell link target. + hr = psl->SetPath(szTargetFile); + + if(SUCCEEDED(hr)) + { + // Set arguments + hr = psl->SetArguments(szArgs); + if(SUCCEEDED(hr)) + { + // Set the description of the shell link. + hr = psl->SetDescription(szDesc); + + USES_CONVERSION; + // Save the link via the IPersistFile::Save method. + hr = ppf->Save(T2COLE(szLinkFile), TRUE); + } + } + + // Release pointer to IPersistFile. + ppf->Release(); + } + + // Release pointer to IShellLink. + psl->Release(); + } + return hr; +} + + +BOOL IsSendToLinkCreated() +{ + BOOL result = FALSE; + CString strFile; + + if(GetSendToLinkFileName(strFile)) + { + DWORD dw = GetFileAttributes(strFile); + if(dw != INVALID_FILE_ATTRIBUTES && (dw & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) + result = TRUE; + } + + return result; +} + +void CreateSendToLink() +{ + CString strLinkFile; + + if(GetSendToLinkFileName(strLinkFile)) + { + TCHAR szTarget[MAX_PATH]; + if(0 < GetModuleFileName(NULL, szTarget, MAX_PATH)) + { + CreateShortcut(szTarget, _T("files:"), strLinkFile, _T("IBN Client")); + } + } +} + +BOOL DeleteSendToLink() +{ + CString strFile; + if(GetSendToLinkFileName(strFile)) + return ::DeleteFile(strFile); + else + return FALSE; +} + +DWORD GetDllVersion(LPCTSTR lpszDllName) +{ + HINSTANCE hinstDll; + DWORD dwVersion = 0; + + /* For security purposes, LoadLibrary should be provided with a + fully-qualified path to the DLL. The lpszDllName variable should be + tested to ensure that it is a fully qualified path before it is used. */ + hinstDll = LoadLibrary(lpszDllName); + + if(hinstDll) + { + DLLGETVERSIONPROC pDllGetVersion; + pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, + "DllGetVersion"); + + /* Because some DLLs might not implement this function, you + must test for it explicitly. Depending on the particular + DLL, the lack of a DllGetVersion function can be a useful + indicator of the version. */ + + if(pDllGetVersion) + { + DLLVERSIONINFO dvi; + HRESULT hr; + + ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + + hr = (*pDllGetVersion)(&dvi); + + if(SUCCEEDED(hr)) + { + dwVersion = PACKVERSION(dvi.dwMajorVersion, dvi.dwMinorVersion); + } + } + + FreeLibrary(hinstDll); + } + return dwVersion; +} + diff --git a/Source/Client/IM-Client/IMClient/GlobalFunction.h b/Source/Client/IM-Client/IMClient/GlobalFunction.h new file mode 100644 index 0000000..2572f48 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GlobalFunction.h @@ -0,0 +1,84 @@ +#ifndef _OFS_GLOBAL_FUNCITON_H +#define _OFS_GLOBAL_FUNCITON_H + +CString GetString(UINT nID); +void UpdateMenu(CWnd *pWnd, CMenu *pMenu); +CString GetOptionString(UINT nSectionID, UINT nEntryID, LPCTSTR lpszDefault = NULL); +UINT GetOptionInt(UINT nSectionID, UINT nEntryID, int nDefault = 0); +BOOL WriteOptionString(UINT nSectionID, UINT nEntryID, LPCTSTR lpszValue); +BOOL WriteOptionInt(UINT nSectionID, UINT nEntryID, int nValue); +_bstr_t DelSpace(_bstr_t &wstr); +INT CALLBACK NEnumFontNameProc(LOGFONT *plf, TEXTMETRIC *ptm, INT nFontType, LPARAM lParam); +CString RectToString(const CRect &m_Rect); +CRect StringToRect(const CString &m_StrRect); +void Pack(CString &strPack,const CString &strPath); +void UnPack(CString &strPack,const CString &strPath); +int Replace(BSTR &lpszData, LPCWSTR lpszOld, LPCWSTR lpszNew); +void RemoveParagraf(BSTR &string); +void RoundExitAddon(CWnd *m_hWnd,int Step = 12,DWORD dwTime = 20); +void FitRectToWindow(CRect &ModRect); + +HRESULT LoadDATAFromStream(IN IStream* pDataStream,OUT BYTE **pBuffer, OUT DWORD *pSize); + +void TestDirAndCreateDir(LPCTSTR Path); + +HIMAGELIST GetSystemImageList(BOOL fSmall); + +int GetIconIndexInSystemImageList(BOOL fSmall,LPCTSTR Path); + +BOOL IsTVFileType(BSTR URL); +HRESULT GetTargetRect(LPDISPATCH pDisp, long &cx, long &cy, long &tearoff, long &fullscreen); + +BOOL McPlaySound(UINT SoundId); + +void AddWindowToClose(CWnd *pWnd); +void RemoveWindowToClose(CWnd *pWnd); +void CloseAllWindows(); + +HRESULT Array2Stream(VARIANT varData, IStream** ppDataStream); + +void HiMetricToPixel(const SIZEL *lpSizeInHiMetric, LPSIZEL lpSizeInPix); + +CString GetRegFileText(LPCTSTR lpszSection, LPCTSTR lpszEntry); +BOOL SetRegFileText(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR pData); +CString GetDataDir(); + +CString ByteSizeToStr(DWORD dwSize); + +CString GetAppDataDir(); + +CString GetMyDocumetPath(LPCTSTR UserRoleName, int UserId); + +BOOL SetMyDocumetPath(LPCTSTR UserRoleName, int UserId, LPCTSTR Path); + +int ShowContextMenu(long TreeAddon, HWND hWnd, LPCTSTR pszPath, int x, int y, LPCTSTR stVer = NULL , IContextMenu2 **pContextMenu2 = NULL, IContextMenu3 **pContextMenu3 = NULL); + +HRESULT NavigateNewWindow(LPUNKNOWN pBrowserDispatch, LPCTSTR strUrl); + +SYSTEMTIME TimeTToSystemTime(time_t &TimeT); + +BOOL SetItemToColorStorage(LPCTSTR UserRole, int UserId, DWORD dwId, LPCTSTR strText, DWORD dwColor); + +BOOL GetItemFromColorStorage(LPCTSTR UserRole, int UserId, DWORD dwId, CString& strText, DWORD &dwColor); + +BOOL GetColorFromColorStorage(LPCTSTR UserRole, int UserId, DWORD dwId, DWORD &dwColor); + +BOOL CheckEmailString(LPCTSTR strEmail); + +BOOL IsSendToLinkCreated(); +void CreateSendToLink(); +BOOL DeleteSendToLink(); + +CComPtr AppendWithSort(IXMLDOMNode* parentNode, IXMLDOMNode* newChildNode, BSTR bstCmpAttributeName); + +#define PACKVERSION(major,minor) MAKELONG(minor,major) +DWORD GetDllVersion(LPCTSTR lpszDllName); + +CComBSTR SplitHTML(unsigned int MaxLen, CComBSTR &bsText); + +CString GetProductLanguage(); + +CString GetProductPath(); + + +#endif // _OFS_GLOBAL_FUNCITON_H \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/GlobalMessengerDef.h b/Source/Client/IM-Client/IMClient/GlobalMessengerDef.h new file mode 100644 index 0000000..90019b6 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GlobalMessengerDef.h @@ -0,0 +1,248 @@ +#ifndef _GLOBAL_MESSENGER_DEF_H +#define _GLOBAL_MESSENGER_DEF_H + +#define ONLINE_SUPPORT_ID (1L) + +////////////////////////////////////////////////////////////////////////// +// [3/28/2002] +//#define _MC_GET_BUILD_COMMAND L"{371C39D2-3BA3-42d2-8B25-FDE2D7F633BE}" +//#define _MC_GET_IP_COMMAND L"{AABDE68F-4284-417f-B80E-3967A6A299C9}" + +////////////////////////////////////////////////////////////////////////// + +typedef enum +{ + fcRemindLater = 1, + fcDelete, + fcDoOffline + +} fcFile; + + +enum M_STATUS +{ + S_OFFLINE=0, + S_ONLINE, + S_INVISIBLE, + S_DND, // не беспокоить + S_AWAY, // нету + S_NA, // + S_OCCUPIED, + S_AWAITING, + S_UNKNOWN, // + S_WEBAPP, + S_NEW_MESSAGE, //must be the last + S_BLINK, // Blink Sign + S_BLANK, + S_ONLINESEPARATOR, // Разделитель ... + S_OFFLINESEPARATOR +}; + +enum M_CHAT_STATUS +{ + SC_INACTIVE = 0, + SC_ACTIVE = 1, +}; + +enum W_NETSTATUS +{ + W_CONNECTED = 2, + W_DISCONNECTED = 0, + W_CONNECTING = 1, +}; + +enum MESSENGER_MESSAGES +{ + WM_NOTIFY_MESSENGER_TRAY = WM_USER + 1, + WM_KILL_SEND_MESSAGE_DLG, + WM_KILL_COME_MESSAGE_DLG, + WM_KILL_SPLIT_MESSAGE_DLG, + WM_KILL_INFILE_DLG, + WM_KILL_DELUSER_MESSAGE_DLG, + WM_KILL_ADDUSER_MESSAGE_DLG, + WM_ANSWER_ON_MESSAGE, + WM_GET_NEXT_MESSAGE, + WM_UPDATE_STATUS, + WM_CHANGE_STATUS, + WM_NEW_CHILD_WINDOW, + WM_DHTML_EVENT, + WM_GET_NOWUSER_ID, + WM_NEW_PROMOCOME, + //WM_SHOWUSER_DETAILS, + WM_SEND_FILE, + WM_SENDGROUP_FILE, + WM_MCUPDATE_LOADED, + WM_INVOKE_STARTAUTO_UPDATE, + WM_UPDATE_CONTACTLIST, + WM_XMLLOADCOPLETED, + WM_INVOKE_CREATECHAT, + WM_INVOKE_SENDMESSAGE, + WM_SEND_FILE2, + WM_RESERVED_1 = WM_USER + 100, + WM_RESERVED_2 = WM_USER + 101, + WM_RESERVED_5 = WM_USER + 102, + WM_MAINFRAME_NAVIGATE, + WM_CASHLOAD_END, + WM_SHOWMESSAGEBOX, + WM_SHOW_ADDUSER, + WM_CHANGE_NEWMESSAGE, + WM_CHECK_SIGNAL_STATE, + WM_SAVE_TO_LOCALHISTORY_COMPLETE, + ///WM_LOAD_LASTVERSIONID_COMPLETE, + WM_SHOW_NEXTMESSAGE, + WM_SET_RECIPIENT, + WM_SET_SENDER, + WM_LOADAPP_COMPLETED, + WM_SHOW_LOGIN_DLG, + WM_ALERT_POPUP_MESSAGE_CLK, + WM_UPLOAD_APP_FILE, + WM_WF_STATE_CHANGE, + WM_RESERVED_3 = WM_USER + 201, + WM_RESERVED_4 = WM_USER + 202, + WM_DOWNLOAD_BEGIN = WM_USER + 520 , + WM_DOWNLOAD_STEP = WM_USER + 521, + WM_UPLOAD_BEGIN = WM_USER + 523 , + WM_UPLOAD_STEP = WM_USER + 524, + WM_UPLOAD_APP_PROGRESS, + WM_UPLOAD_APP_COMPLETED, + WM_PROCESS_COMMAND_LINE_MESSAGES +}; + +enum DHTM_Event_Type +{ + DHTMLE_ADDCONTACT, + DHTMLE_SENDMESSAGE, + DHTMLE_SENDFILE, +}; + +enum _DialogMode +{ + DM_McMessengerSundanceEdition = 0, + DM_McMessenger, + DM_Yahoo, + DM_ICQ +}; + +struct DHTMLE_ADDCONTACT_Container +{ + long user_id; + long role_id; + CString nick_name; + CString first_name; + CString last_name; + CString email; + CString role_name; +}; + +struct DHTMLE_SENDMESSAGE_Container +{ + long longUserID; + CString strNickName; + CString strRole; +}; + +struct DHTMLE_SENDPROMO_Container +{ + long longUserID; + CString strNickName; + CString strRole; +}; + +enum SEND_DATA_STATUS +{ + DS_ERROR = -1, + DS_NONE = 0, + DS_SEND = 1, + DS_COMPLETE = 2, +}; + +typedef enum McMessengerAppItemType +{ + APPT_NONE = 0, + APPT_INWINDOW, + APPT_BROWSEWINDOW, + APPT_EXWINDOW, + APPT_CONTACTLIST, + APPT_CHAT_CONTACTLIST, + APPT_IBN_ACTIONS + ///APPT_WEB_FOLDERS +} McAppItemType; + +struct McAppItem +{ + McAppItemType Type; + long Id; + CString Name; + CString ToolTip; + CString Url; + long Width; + long Height; + CComPtrIcon; + CString Version; + + McAppItem() + { + Id = 0; + Type = APPT_NONE; + }; + McAppItem(McAppItemType tType, LPCTSTR strName,LPCTSTR strToolTip,LPCTSTR strUrl) + { + Id = 0; + Type = tType; + Name = strName; + ToolTip = strToolTip; + Url = strUrl; + }; + CString GetVisualName() + { + CString strRet; + strRet.Format(_T("%s - %s"), Name, ToolTip); + return strRet; + } +}; + +static int nFontSizes[] = {8, 10, 12, 14, 18, 24, 36}; +const int nDropHeight = 200; + +#define _SHOW_IBN_ERROR_DLG_OK(MessageID) \ + {\ + CMessageDlg ErrorDlg##MessageID (MessageID,this); \ + ErrorDlg##MessageID.Show(GetString(MessageID),MB_OK);\ + } + +#endif + +#define SmileBuffSize (256) + +/*static WCHAR SmileBuff[SmileBuffSize][16] ={ + L":)", L":(", L";)", L":D", L":-/", + L":x", L":\">", L":p", L":O", L"X-(", + L":>", L"B-)", L">:)", L":((", L":))", + L":|", L"0:)", L":-B", L"=;", L"I-)", + L":-&", L":-$", L"[-(", L":o)", L";;)", + L":*", L":-s", L"/:)", L"8-|", L"8-}", + L"(:|", L"=P~", L":-?", L"#-o", L"=D>", + L":@)", L"3:-O", L":(|)", L"~:>", L"@};-", + L"%%-", L"**==", L"(~~)", L"~o)", L"*-:)", + L"8-X", L"=:)", L">-)", L":-L", L"<):)", + L"[-o<", L"@-)", L"$-)", L":-"",L":^o", + L"b-(", L":)>-", L"[-X", L"\\:D/", L">:D<"};*/ + +/*static WCHAR SmileBuff[SmileBuffSize][15] ={ + L":)", L":(", L";)", L":D", L";;)", + L">:D<", L":-/", L":x", L":\">", L":P", + L":-*", L"=((", L":-O", L"X(", L":>", + L"B-)", L":-S", L"#:-S", L">:)", L":((", + L":))", L":|", L"/:)", L"=))", L"O:)", + L":-B", L"=;", L"I-|", L"8-|", L"L-)", + L":-&", L":-$", L"[-(", L":O)", L"8-}", + L"<:-P", L"(:|", L"=P~", L":-?", L"#-o", + L"=D>", L":-SS", L"@-)", L":^o", L":-w", + L":-<", L">:P", L"<):)", L":@)", L"3:-O", + L":(|)", L"~:>", L"@};-", L"%%-", L"**==", + L"(~~)", L"~O)", L"*-:)", L"8-X", L"=:)", + L">-)", L":-L", L"[-O<", L"$-)", L":-\"", + L"b-(", L":)>-", L"[-X", L"\\:D/", L">:/", + L";))", L":-@", L"^:)^", L":-j", L"(*)" + }; +*/ \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/GroupAssingToDo.cpp b/Source/Client/IM-Client/IMClient/GroupAssingToDo.cpp new file mode 100644 index 0000000..3b53c2e --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GroupAssingToDo.cpp @@ -0,0 +1,1002 @@ +// MessageSplitDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "MainDlg.h" +#include "GroupAssingToDo.h" +#include "User.h" +#include "LoadSkins.h" +#include "CDib.h" +#include + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CGroupAssignToDoDlg dialog +extern CString GetCurrentSkin (); + +CGroupAssignToDoDlg::CGroupAssignToDoDlg(CMainDlg *pMessenger,CWnd* pParent /*=NULL*/) + : COFSNcDlg2(CGroupAssignToDoDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CGroupAssignToDoDlg) + //}}AFX_DATA_INIT + this->pMessenger = pMessenger; + m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = FALSE; + m_strSkinSettings = _T("/Shell/GroupAssignToDo/skin.xml"); +} + +CGroupAssignToDoDlg::~CGroupAssignToDoDlg() +{ +} + + +void CGroupAssignToDoDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CGroupAssignToDoDlg) + DDX_Control(pDX, IDC_USERINFO, m_UserInfo); + DDX_Control(pDX, IDC_CCOOTREECTRL, m_treectrl); + DDX_Control(pDX, IDC_BTN_MENU, m_btnMenu); + DDX_Control(pDX, IDC_BTN_MIN, m_btnMin); + DDX_Control(pDX, IDC_BTN_OPTIONS, m_btnOptions); + DDX_Control(pDX, IDC_BTN_SELECT_ALL, m_btnSelectAll); + DDX_Control(pDX, IDC_BTN_SELECT_NONE, m_btnSelectNone); + DDX_Control(pDX, IDC_BTN_SEND, m_btnSend); + DDX_Control(pDX, IDC_BTN_X, m_btnX); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CGroupAssignToDoDlg, COFSNcDlg2) + //{{AFX_MSG_MAP(CGroupAssignToDoDlg) + ON_BN_CLICKED(IDOK, OnOk) + ON_WM_CAPTURECHANGED() + ON_WM_MOVE() + ON_WM_SIZE() + ON_WM_DROPFILES() + ON_WM_CREATE() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CGroupAssignToDoDlg message handlers + +void CGroupAssignToDoDlg::OnOk() +{ +} + +void CGroupAssignToDoDlg::OnCancel() +{ + COFSNcDlg2::OnCancel(); +} + +BOOL CGroupAssignToDoDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + m_ToolTip.AddTool(&m_btnMin,IDS_TIP_MINIMIZE); + ////////////////////////////////////////////////////////////////////////// + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + /// Create Font ... + + CreateTree(); + + SetRecipientGroup(m_strRecepientGroupName); + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CGroupAssignToDoDlg::SetRecipientGroup(LPCTSTR strName) +{ + m_strRecepientGroupName = strName; + + CString strCaption; + + m_UserInfo.SetText(m_strRecepientGroupName); + + m_ContactList.Clear(); + + pMessenger->GetCopyContactList(m_ContactList); + + // Step 2. Init Check or Uncheck Mode [2/6/2002] + if(m_ContactList.InitIteration()) + { + CUser* pUser=NULL; + + if(POSITION pos = m_ContactList.InitIteration()) + { + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + switch(CLMode) + { + case 1: + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHOWOFFLINEFILES,TRUE)||(pUser->m_iStatus!=S_OFFLINE&&pUser->m_iStatus!=S_INVISIBLE)) + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + } + break; + case 2: + { + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(GetString(IDS_OFFLINE))==0); + } + else + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + } + break; + } + + } + } + } + + BuildTree(); +} + + +void CGroupAssignToDoDlg::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_GROUPASSIGNTODO,RectToString(rWindow)); + + COFSNcDlg2::OnCaptureChanged(pWnd); +} + + +void CGroupAssignToDoDlg::OnMove(int x, int y) +{ + COFSNcDlg2::OnMove(x, y); + + if(::IsWindow(GetParent()->GetSafeHwnd())) + GetParent()->UpdateWindow(); + if(::IsWindow(pMessenger->GetMessageParent()->GetSafeHwnd())) + pMessenger->GetMessageParent()->UpdateWindow(); +} + +void CGroupAssignToDoDlg::SetFon(HBITMAP hFon) +{ +/* + if(pFonBmp) + pFonBmp->DeleteObject(); + else + pFonBmp = new CBitmap; + + pFonBmp->Attach(hFon); + + BITMAP hb; + pFonBmp->GetBitmap(&hb); + sFon = CSize(hb.bmWidth ,hb.bmHeight); + + //SetMinTrackSize(sFon); + //SetWindowPos(NULL,-1,-1,sFon.cx,sFon.cy ,SWP_NOZORDER|SWP_NOMOVE); + + CPictureHolder tmpImage; + tmpImage.CreateFromBitmap(pFonBmp); + m_ResizeFon.Destroy(); + m_ResizeFon.Create(tmpImage.m_pPict); + + m_ResizeFon.AddAnchor(CRect(0,0,223,100),CSize(0,0),CSize(0,0)); + m_ResizeFon.AddAnchor(CRect(223,0,277,100),CSize(0,0),CSize(100,0),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,0,299,166),CSize(100,0),CSize(100,0)); + + m_ResizeFon.AddAnchor(CRect(0,100,223,165),CSize(0,0),CSize(0,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(223,100,277,165),CSize(0,0),CSize(100,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,100,299,165),CSize(100,0),CSize(100,100),CResizableImage::DUPLICATE); + + m_ResizeFon.AddAnchor(CRect(0,165,223,199),CSize(0,100),CSize(0,100)); + m_ResizeFon.AddAnchor(CRect(223,165,277,199),CSize(0,100),CSize(100,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,165,299,199),CSize(100,100),CSize(100,100)); + + CRect rgnRect; + GetWindowRect(&rgnRect); + CRgn WinRgn; + WinRgn.CreateRoundRectRgn(0,0,rgnRect.Width(),rgnRect.Height(),20,20); + SetWindowRgn(WinRgn,TRUE); +*/ + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_GROUPASSIGNTODO, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + +} + +//DEL void CGroupAssignToDoDlg::OnPaint() +//DEL { +//DEL CRect winRect, editRect; +//DEL GetWindowRect(winRect); +//DEL +//DEL CPaintDC dc(this); // device context for painting +//DEL //CMemDC memdc(&dc); +//DEL if(pFonBmp) +//DEL { +//DEL //CDC dc; +//DEL //dc.CreateCompatibleDC(&memdc); +//DEL //dc.SelectObject(pFonBmp); +//DEL //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); +//DEL //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); +//DEL CRect m_Client; +//DEL GetClientRect(&m_Client); +//DEL CSize winSize(m_Client.Width(),m_Client.Height()); +//DEL m_ResizeFon.Render(dc.GetSafeHdc(),winSize); +//DEL m_UserInfo.Invalidate(); +//DEL m_FileName.Invalidate(); +//DEL } +//DEL // Do not call COFSNcDlg2::OnPaint() for painting messages +//DEL } + +//DEL void CGroupAssignToDoDlg::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL CPoint inPoint = point; +//DEL ClientToScreen(&point); +//DEL +//DEL CRect StatusRect, miniRect; +//DEL GetClientRect(&StatusRect); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMLEFT; +//DEL else +//DEL nHitTest = HTLEFT; +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMRIGHT; +//DEL else +//DEL nHitTest = HTRIGHT; +//DEL else if(inPoint.ym_strType; + + BOOL isCheck = FALSE;//(m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treectrl.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + + m_treectrl.RootOpen(GroupTID,pUser->m_bHasNewMessages); + } + } + } + break; + case 2: + { + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos, pUser); i++) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + CString GroupName = pUser->m_strType; + + BOOL isCheck = FALSE;//(m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + GroupName= GetString(IDS_OFFLINE); + + if(!m_GroupTIDMap.Lookup(GetString(IDS_OFFLINE),(void*&)GroupTID)) + { + long ShablonId[10] = {0L,1L,0L,0L,0L,0L,0L,0L,0L,0L}; + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,GetString(IDS_OFFLINE),ShablonId); + m_GroupTIDMap.SetAt(GetString(IDS_OFFLINE),(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + } + else + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treectrl.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + + m_treectrl.RootOpen(GroupTID,pUser->m_bHasNewMessages); + } + } + } + break; + } + + UpdateGroupCheck(); +} + +void CGroupAssignToDoDlg::OnActionCcootreectrl(long TID, BOOL bGroupe) +{ + if(TID!= -1) + if(!bGroupe) + { + CUser *pUser=FindUserInVisualContactList(TID); + if(pUser) + { + pUser->m_bHasNewMessages = !pUser->m_bHasNewMessages; + // Change User Check in group [2/21/2002] + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + switch(CLMode) + { + case 1: + { + CString strGroupName; + strGroupName = pUser->m_strType; + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])+1)); + else + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])-1)); + + UpdateGroupID(strGroupName); + } + break; + case 2: + { + CString strGroupName; + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + strGroupName = GetString(IDS_OFFLINE); + else + strGroupName = pUser->m_strType; + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])+1)); + else + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])-1)); + + UpdateGroupID(strGroupName); + } + break; + }; + // [2/21/2002] + UpdateID(pUser->GetGlobalID()); + } + } + else + { + CString strGrouName; + + POSITION pos = m_GroupTIDMap.GetStartPosition(); + while(pos) + { + CString strKey; + long Data; + m_GroupTIDMap.GetNextAssoc(pos,strKey,(void*&)Data); + if(Data==TID) + { + strGrouName = strKey; + break; + } + } + + if(!strGrouName.IsEmpty()) + { + BOOL bCheck = !((BOOL)m_UserCheckInGroup[strGrouName]); + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + m_UserCheckInGroup.SetAt(strGrouName,(void*)0); + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + while(m_ContactList.GetNext(pos, pUser)) + { + switch(CLMode) + { + case 1: + { + if(strGrouName.CompareNoCase(pUser->m_strType)==0) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + } + break; + case 2: + { + // [2/21/2002] + if(strGrouName.CompareNoCase(GetString(IDS_OFFLINE))==0&& + (pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + else if(strGrouName.CompareNoCase(pUser->m_strType)==0&& + !(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + // [2/21/2002] + } + break; + } + } + } + UpdateGroupID(strGrouName); + } + } +} + +void CGroupAssignToDoDlg::OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState) +{ + // TODO: Add your control notification handler code here + +} + +void CGroupAssignToDoDlg::OnMenuCcootreectrl(long TID, BOOL bGroupe) +{ + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser) + { + CUser User = *pUser; + pMessenger->ShowUserMenu(User.GetGlobalID()); + } + } +} + +void CGroupAssignToDoDlg::OnSelectCcootreectrl(long TID, BOOL bGroupe) +{ +} + +void CGroupAssignToDoDlg::UpdateID(long UserId) +{ + CUser *pUser = m_ContactList.GetAt(UserId); + if(pUser) + { + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + m_treectrl.SetItemId(pUser->TID,m_ShablonId[pUser->m_bHasNewMessages+2]); + } +} + +CUser* CGroupAssignToDoDlg::FindUserInVisualContactList(long TID) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + return NULL; +} + +//DEL void CGroupAssignToDoDlg::OnClickMcselectAll() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = TRUE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +BOOL CGroupAssignToDoDlg::EnableRecepients() +{ + CUser *pRecipient = NULL; + BOOL bEnableContactUser = FALSE; + + if(POSITION pos = m_ContactList.InitIteration()) + { + while(m_ContactList.GetNext(pos,pRecipient)) + { + if(pRecipient->m_bHasNewMessages) + return TRUE; + } + } + return FALSE; +} + +//DEL void CGroupAssignToDoDlg::LoadSkin() +//DEL { +//DEL /////////////////////////////////////////////////////////////////////// +//DEL LoadSkins m_Load; +//DEL IStreamPtr pStream = NULL; +//DEL long Error = 0; +//DEL bstr_t Path = bstr_t("IBN_SCHEMA://") + (LPCTSTR)GetCurrentSkin(); +//DEL m_Load.Load(Path+bstr_t("/Shell/GroupFile/fon.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL { +//DEL CDib m_Dib(pStream); +//DEL CPaintDC dc(this); +//DEL SetFon(m_Dib.GetHBITMAP(dc)); +//DEL } +//DEL pStream = NULL; +//DEL +//DEL m_Load.Load(Path+bstr_t("/Common/btn_x.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Close.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_Load.Load(Path+bstr_t("/Common/btn_send.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Send.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL +//DEL m_Load.Load(Path+bstr_t("/Shell/GroupSend/selectall.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_SelectAll.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL /////////////////////////////////////////////////////////////////////// +//DEL } + +void CGroupAssignToDoDlg::UpdateGroupCheck() +{ + POSITION pos = m_UserCheckInGroup.GetStartPosition(); + while(pos) + { + CString strKey; + int Data; + m_UserCheckInGroup.GetNextAssoc(pos,strKey,(void*&)Data); + UpdateGroupID(strKey); + } +} + +void CGroupAssignToDoDlg::UpdateGroupID(LPCTSTR strName) +{ + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + if(m_UserCheckInGroup[strName]) + m_treectrl.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[1]); + else + m_treectrl.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[0]); +} + +//DEL void CGroupAssignToDoDlg::OnClickSend() +//DEL { +//DEL OnSendButton(); +//DEL } + +//DEL void CGroupAssignToDoDlg::OnClickSelectAll() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = TRUE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +//DEL void CGroupAssignToDoDlg::OnMcunselectall() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = FALSE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +void CGroupAssignToDoDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + m_btnMenu.ShowWindow(SW_HIDE); + m_btnOptions.ShowWindow(SW_HIDE); + m_btnMin.ShowWindow(SW_HIDE); + m_btnX.ShowWindow(SW_HIDE); + + m_btnSelectAll.ShowWindow(SW_HIDE); + m_btnSelectNone.ShowWindow(SW_HIDE); + + m_btnSend.ShowWindow(SW_HIDE); + + LoadButton(pXmlRoot, _T("Menu"), &m_btnMenu, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Options"), &m_btnOptions, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + + LoadButton(pXmlRoot, _T("SelectAll"), &m_btnSelectAll, TRUE, FALSE); + LoadButton(pXmlRoot, _T("SelectNone"), &m_btnSelectNone, TRUE, FALSE); + + LoadButton(pXmlRoot, _T("Send"), &m_btnSend, TRUE, FALSE); + + LoadLabel(pXmlRoot, _T("Recipient"), &m_UserInfo, TRUE); + + LoadRectangle(pXmlRoot, _T("Users"), &m_treectrl, TRUE); + +} + + + + +void CGroupAssignToDoDlg::OnClickBtnX() +{ + OnCancel(); +} + +void CGroupAssignToDoDlg::OnClickBtnMin() +{ + ShowWindow(SW_MINIMIZE); +} + +void CGroupAssignToDoDlg::OnClickBtnOptions() +{ + pMessenger->PreferenceDlg(this); +} + +void CGroupAssignToDoDlg::OnClickBtnMenu() +{ +} + +void CGroupAssignToDoDlg::OnClickBtnSelectAll() +{ + SelectAll(TRUE); +} + +void CGroupAssignToDoDlg::OnClickBtnSelectNone() +{ + SelectAll(FALSE); +} + +void CGroupAssignToDoDlg::OnClickBtnSend() +{ + Send(); +} + +void CGroupAssignToDoDlg::SelectAll(BOOL bSelect) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + pUser->m_bHasNewMessages = bSelect; + } + } + BuildTree(); +} + +void CGroupAssignToDoDlg::Send() +{ + UpdateData(TRUE); + + if(!EnableRecepients()) + return; + + COFSNcDlg2::OnOK(); +} + +int CGroupAssignToDoDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (COFSNcDlg2::OnCreate(lpCreateStruct) == -1) + return -1; + + return 0; +} + +BOOL CGroupAssignToDoDlg::PreTranslateMessage(MSG* pMsg) +{ + //TRACE("\r\n WM = 0x%X wParam = 0x%X (%d)",pMsg->message,pMsg->wParam, GetKeyState(VK_MENU)); + if(m_bWasCtrlExit&&m_bWasCtrlEnter) + { + m_bWasCtrlExit = m_bWasCtrlEnter = FALSE; + COFSNcDlg2::PreTranslateMessage(pMsg); + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + pMsg->lParam = 0; + } + else + if(pMsg->message==WM_KEYUP&& + pMsg->wParam==VK_CONTROL&& + m_bWasCtrlEnter) + { + //m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = TRUE; + } + else + if(pMsg->message==WM_KEYDOWN||pMsg->message==WM_SYSKEYDOWN) + { + //TRACE("\r\n WM_KEYDOWN wParam = 0x%X",pMsg->wParam); + if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_CONTROL)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_CTRLENTER,1)==0) + { + Send(); + return TRUE; + } + else + { + m_bWasCtrlEnter = TRUE; + } + } + else if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_SHIFT)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHIFTENTER,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==VK_RETURN) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ENTER,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==0x53&&(GetKeyState(VK_MENU)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ALTS,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + } + return COFSNcDlg2::PreTranslateMessage(pMsg); +} diff --git a/Source/Client/IM-Client/IMClient/GroupAssingToDo.h b/Source/Client/IM-Client/IMClient/GroupAssingToDo.h new file mode 100644 index 0000000..c0d268f --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GroupAssingToDo.h @@ -0,0 +1,109 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +#include "ccootree.h" +//}}AFX_INCLUDES +#if !defined(AFX_GROUPASSIGNTODO_H__A3808E64_9B01_4CDD_A936_ED8850C95FD7__INCLUDED_) +#define AFX_GROUPASSIGNTODO_H__A3808E64_9B01_4CDD_A936_ED8850C95FD7__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// MessageSplitDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +#include "OFSNCDlg2.h" +#include "Label.h" +#include "ResizableImage.h" +#include "UserCollection.h" +// CGroupAssignToDoDlg dialog + +class CGroupAssignToDoDlg : public COFSNcDlg2 +{ +// Construction +public: + void Send(); + void SelectAll(BOOL bSelect); + BOOL EnableRecepients(); + void SetBody(LPCTSTR strBody); + void SetFon(HBITMAP hFon); + void SetRecipientGroup(LPCTSTR strName); + CGroupAssignToDoDlg(CMainDlg *pMessenger,CWnd* pParent = NULL); // standard constructor + ~CGroupAssignToDoDlg(); + +// Dialog Data + //{{AFX_DATA(CGroupAssignToDoDlg) + enum { IDD = IDD_GROUP_ASSIGN_TODO }; + CLabel m_UserInfo; + CCCooTree m_treectrl; + CMcButton m_btnMenu; + CMcButton m_btnMin; + CMcButton m_btnOptions; + CMcButton m_btnSelectAll; + CMcButton m_btnSelectNone; + CMcButton m_btnSend; + CMcButton m_btnX; +//}}AFX_DATA + + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CGroupAssignToDoDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation +public: + CString m_strRecepientGroupName; + CUserCollection m_ContactList; + +protected: + CString m_strSetBody; + + BOOL m_bWasCtrlEnter, m_bWasCtrlExit; + + void LoadSkin(IXMLDOMNode *pXmlRoot); + CMapStringToPtr m_GroupTIDMap; + CMapStringToPtr m_UserCheckInGroup; + + void UpdateGroupCheck(); + void UpdateGroupID(LPCTSTR strName); + CUser* CGroupAssignToDoDlg::FindUserInVisualContactList(long TID); + void UpdateID(long UserId); + + void BuildTree(); + void CreateTree(); + CMainDlg *pMessenger; + + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + // Generated message map functions + //{{AFX_MSG(CGroupAssignToDoDlg) + afx_msg void OnOk(); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnMove(int x, int y); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnActionCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState); + afx_msg void OnMenuCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnSelectCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnClickBtnX(); + afx_msg void OnClickBtnMin(); + afx_msg void OnClickBtnOptions(); + afx_msg void OnClickBtnMenu(); + afx_msg void OnClickBtnSelectAll(); + afx_msg void OnClickBtnSelectNone(); + afx_msg void OnClickBtnSend(); + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // diff --git a/Source/Client/IM-Client/IMClient/GroupFileDescriptionDlg.cpp b/Source/Client/IM-Client/IMClient/GroupFileDescriptionDlg.cpp new file mode 100644 index 0000000..4a68405 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GroupFileDescriptionDlg.cpp @@ -0,0 +1,1473 @@ +// MessageSplitDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "MainDlg.h" +#include "GroupFileDescriptionDlg.h" +#include "User.h" +#include "LoadSkins.h" +#include "CDib.h" +#include + +#include "SmileManager.h" +#include "SelectSmileDlg.h" + +extern CSmileManager CurrentSmileManager; + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +#define WM_EDIT_UPDATE WM_USER + 201 +///////////////////////////////////////////////////////////////////////////// +// CGroupFileDescriptionDlg dialog +extern CString GetCurrentSkin (); + +CGroupFileDescriptionDlg::CGroupFileDescriptionDlg(CMainDlg *pMessenger,CWnd* pParent /*=NULL*/) + : COFSNcDlg2(CGroupFileDescriptionDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CGroupFileDescriptionDlg) + m_strFileName = _T(""); + //}}AFX_DATA_INIT + this->pMessenger = pMessenger; + m_bInitEdit = FALSE; + m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = FALSE; + m_strSkinSettings = _T("/Shell/GroupFile/skin.xml"); +// m_bLoadSkin = FALSE; +} + +CGroupFileDescriptionDlg::~CGroupFileDescriptionDlg() +{ +} + + +void CGroupFileDescriptionDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CGroupFileDescriptionDlg) + DDX_Control(pDX, IDC_FONT_COMBO, m_FontCombo); + DDX_Control(pDX, IDC_SIZE_COMBO, m_SizeCombo); + DDX_Control(pDX, IDC_USERINFO, m_UserInfo); + DDX_Control(pDX, IDC_CCOOTREECTRL, m_treectrl); + DDX_Control(pDX, IDC_BTN_BOLD, m_btnBold); + DDX_Control(pDX, IDC_BTN_COLOR, m_btnColor); + DDX_Control(pDX, IDC_BTN_ITALIC, m_btnItalic); + DDX_Control(pDX, IDC_BTN_MENU, m_btnMenu); + DDX_Control(pDX, IDC_BTN_MIN, m_btnMin); + DDX_Control(pDX, IDC_BTN_OPTIONS, m_btnOptions); + DDX_Control(pDX, IDC_BTN_SELECT_ALL, m_btnSelectAll); + DDX_Control(pDX, IDC_BTN_SELECT_NONE, m_btnSelectNone); + DDX_Control(pDX, IDC_BTN_SEND, m_btnSend); + DDX_Control(pDX, IDC_BTN_SMILES, m_btnSmiles); + DDX_Control(pDX, IDC_BTN_UNDERLINE, m_btnUnderline); + DDX_Control(pDX, IDC_BTN_X, m_btnX); + DDX_Text(pDX, IDC_USERINFO, m_strFileName); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CGroupFileDescriptionDlg, COFSNcDlg2) + //{{AFX_MSG_MAP(CGroupFileDescriptionDlg) + ON_BN_CLICKED(IDOK, OnOk) + ON_CBN_SELENDOK(IDC_FONT_COMBO, OnSelEndOkFontCombo) + ON_CBN_SELENDOK(IDC_SIZE_COMBO, OnSelEndOkSizeCombo) + ON_COMMAND(ID_EDITMENU_COPY, OnEditMenuCopy) + ON_COMMAND(ID_EDITMENU_CUT, OnEditMenuCut) + ON_COMMAND(ID_EDITMENU_DELETE, OnEditMenuDelete) + ON_COMMAND(ID_EDITMENU_PAST, OnEditMenuPaste) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_COPY, OnUpdateEditMenuCopy) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_CUT, OnUpdateEditMenuCut) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_DELETE, OnUpdateEditMenuDelete) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_PAST, OnUpdateEditMenuPaste) + ON_WM_CAPTURECHANGED() + ON_WM_MOVE() + ON_WM_SIZE() + ON_WM_DROPFILES() + ON_MESSAGE(WM_EDIT_UPDATE,OnEditUpdate) + ON_WM_CREATE() + //}}AFX_MSG_MAP + ON_MESSAGE(WM_SWM_SETBODY,OnSWMSetBody) + ON_COMMAND_RANGE(20000,20000+SmileBuffSize,OnSmileItem) +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CGroupFileDescriptionDlg message handlers + +void CGroupFileDescriptionDlg::OnOk() +{ +} + +void CGroupFileDescriptionDlg::OnCancel() +{ + COFSNcDlg2::OnCancel(); +} + +BOOL CGroupFileDescriptionDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + m_ToolTip.AddTool(&m_btnMin,IDS_TIP_MINIMIZE); + m_ToolTip.AddTool(&m_btnColor,IDS_TIP_FONT_COLOR); + m_ToolTip.AddTool(&m_btnBold,IDS_TIP_BOLD); + m_ToolTip.AddTool(&m_btnItalic,IDS_TIP_ITALIC); + m_ToolTip.AddTool(&m_btnUnderline,IDS_TIP_UNDERLINE); + m_ToolTip.AddTool(&m_btnSmiles,IDS_TIP_SMILES); + m_ToolTip.AddTool(&m_FontCombo,IDS_TIP_FONT); + m_ToolTip.AddTool(&m_SizeCombo,IDS_TIP_FONT_SIZE); + ////////////////////////////////////////////////////////////////////////// + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + /// Create Font ... +// m_font.Attach(GetStockObject(DEFAULT_GUI_FONT)); + + m_edit.InitInfoMessage(WM_EDIT_UPDATE); + m_edit.SetContextMenu(IDR_MESSENGER_MENU,1,this); + m_edit.SetEditMode(); + + CString str; + for (int i = 0; i < sizeof(nFontSizes)/sizeof(int); i++) + { + str.Format(_T("%d"), nFontSizes[i]); + m_SizeCombo.AddString(str); + } + + CreateTree(); + + ::EnumFontFamilies(GetDC()->m_hDC, (LPTSTR) NULL, (FONTENUMPROC)NEnumFontNameProc, (LPARAM)&(m_FontCombo)); + + m_bInitEdit = FALSE; + + // [4/29/2002] + CString strFontName = GetOptionString(IDS_OFSMESSENGER,IDS_FONT,_T("Arial")); + //int FontId = GetOptionInt(IDS_OFSMESSENGER,IDS_FONT,-1); + //if(FontId!=-1) + // m_FontCombo.GetLBText(FontId, strFontName); + CComBSTR bsFontName = strFontName; + + + m_edit.SetDefaultFontName(bsFontName); + m_edit.SetDefaultFontSize(nFontSizes[GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)]); + // [4/29/2002] + + // OZ 2007-02-01 + m_CoolMenuManager.Install(this); + + try + { + // Load Smiles + int SmileIndex = 0; + for(CSmileInfoListEnum item = CurrentSmileManager.GetSmiles().begin();item!=CurrentSmileManager.GetSmiles().end();item++, SmileIndex++) + { + CBitmap* pPreviewBmp = CurrentSmileManager.GetSmilePreview((*item).GetId()); + + if(pPreviewBmp!=NULL) + { + TOOLBARDATA Tdt = {1,16,16,1,0}; + WORD dwItemID[] = {20001+(*item).GetIndex()}; + + Tdt.items = (WORD*)dwItemID; + + m_CoolMenuManager.LoadToolbar(*pPreviewBmp,&Tdt,0x808080); + + pPreviewBmp->DeleteObject(); + delete pPreviewBmp; + } + } + + } + catch (...) + { + ASSERT(FALSE); + } + // + + m_edit.Clear(); + m_edit.SetFocus(); + + SetRecipientGroup(m_strRecepientGroupName); + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +//DEL void CGroupFileDescriptionDlg::OnSendButton() +//DEL { +//DEL UpdateData(TRUE); +//DEL +//DEL if(!EnableRecepients()) +//DEL return; +//DEL +//DEL COFSNcDlg2::OnOK(); +//DEL } + +void CGroupFileDescriptionDlg::SetRecipientGroup(LPCTSTR strName) +{ + m_strRecepientGroupName = strName; + + CString strCaption; +// GetWindowText(strCaption); +// strCaption += " with "; +// strCaption += strName; +// SetWindowText(strCaption); + +// strCaption = "To: "; +// strCaption += strName; + m_UserInfo.SetText(m_strFileName); + + m_ContactList.Clear(); + + pMessenger->GetCopyContactList(m_ContactList); + + // Step 2. Init Check or Uncheck Mode [2/6/2002] + if(m_ContactList.InitIteration()) + { + CUser* pUser=NULL; + + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + switch(CLMode) + { + case 1: + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHOWOFFLINEFILES,TRUE)||(pUser->m_iStatus!=S_OFFLINE&&pUser->m_iStatus!=S_INVISIBLE)) + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + } + break; + case 2: + { + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(GetString(IDS_OFFLINE))==0); + } + else + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + } + break; + } + } + } + } + + BuildTree(); +} + + +void CGroupFileDescriptionDlg::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_GROUPSENDFILE,RectToString(rWindow)); + + COFSNcDlg2::OnCaptureChanged(pWnd); +} + + +void CGroupFileDescriptionDlg::OnMove(int x, int y) +{ + COFSNcDlg2::OnMove(x, y); + + if(::IsWindow(GetParent()->GetSafeHwnd())) + GetParent()->UpdateWindow(); + if(::IsWindow(pMessenger->GetMessageParent()->GetSafeHwnd())) + pMessenger->GetMessageParent()->UpdateWindow(); +} + +void CGroupFileDescriptionDlg::SetFon(HBITMAP hFon) +{ +/* + if(pFonBmp) + pFonBmp->DeleteObject(); + else + pFonBmp = new CBitmap; + + pFonBmp->Attach(hFon); + + BITMAP hb; + pFonBmp->GetBitmap(&hb); + sFon = CSize(hb.bmWidth ,hb.bmHeight); + + //SetMinTrackSize(sFon); + //SetWindowPos(NULL,-1,-1,sFon.cx,sFon.cy ,SWP_NOZORDER|SWP_NOMOVE); + + CPictureHolder tmpImage; + tmpImage.CreateFromBitmap(pFonBmp); + m_ResizeFon.Destroy(); + m_ResizeFon.Create(tmpImage.m_pPict); + + m_ResizeFon.AddAnchor(CRect(0,0,223,100),CSize(0,0),CSize(0,0)); + m_ResizeFon.AddAnchor(CRect(223,0,277,100),CSize(0,0),CSize(100,0),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,0,299,166),CSize(100,0),CSize(100,0)); + + m_ResizeFon.AddAnchor(CRect(0,100,223,165),CSize(0,0),CSize(0,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(223,100,277,165),CSize(0,0),CSize(100,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,100,299,165),CSize(100,0),CSize(100,100),CResizableImage::DUPLICATE); + + m_ResizeFon.AddAnchor(CRect(0,165,223,199),CSize(0,100),CSize(0,100)); + m_ResizeFon.AddAnchor(CRect(223,165,277,199),CSize(0,100),CSize(100,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,165,299,199),CSize(100,100),CSize(100,100)); + + CRect rgnRect; + GetWindowRect(&rgnRect); + CRgn WinRgn; + WinRgn.CreateRoundRectRgn(0,0,rgnRect.Width(),rgnRect.Height(),20,20); + SetWindowRgn(WinRgn,TRUE); +*/ + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_GROUPSENDFILE, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + +} + +//DEL void CGroupFileDescriptionDlg::OnPaint() +//DEL { +//DEL CRect winRect, editRect; +//DEL GetWindowRect(winRect); +//DEL +//DEL CPaintDC dc(this); // device context for painting +//DEL //CMemDC memdc(&dc); +//DEL if(pFonBmp) +//DEL { +//DEL //CDC dc; +//DEL //dc.CreateCompatibleDC(&memdc); +//DEL //dc.SelectObject(pFonBmp); +//DEL //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); +//DEL //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); +//DEL CRect m_Client; +//DEL GetClientRect(&m_Client); +//DEL CSize winSize(m_Client.Width(),m_Client.Height()); +//DEL m_ResizeFon.Render(dc.GetSafeHdc(),winSize); +//DEL m_UserInfo.Invalidate(); +//DEL m_FileName.Invalidate(); +//DEL } +//DEL // Do not call COFSNcDlg2::OnPaint() for painting messages +//DEL } + +//DEL void CGroupFileDescriptionDlg::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL CPoint inPoint = point; +//DEL ClientToScreen(&point); +//DEL +//DEL CRect StatusRect, miniRect; +//DEL GetClientRect(&StatusRect); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMLEFT; +//DEL else +//DEL nHitTest = HTLEFT; +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMRIGHT; +//DEL else +//DEL nHitTest = HTRIGHT; +//DEL else if(inPoint.ym_strType; + + BOOL isCheck = FALSE;//(m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treectrl.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + + m_treectrl.RootOpen(GroupTID,pUser->m_bHasNewMessages); + } + } + } + break; + case 2: + { + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos, pUser); i++) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + CString GroupName = pUser->m_strType; + + BOOL isCheck = FALSE;//(m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + GroupName= GetString(IDS_OFFLINE); + + if(!m_GroupTIDMap.Lookup(GetString(IDS_OFFLINE),(void*&)GroupTID)) + { + long ShablonId[10] = {0L,1L,0L,0L,0L,0L,0L,0L,0L,0L}; + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,GetString(IDS_OFFLINE),ShablonId); + m_GroupTIDMap.SetAt(GetString(IDS_OFFLINE),(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + } + else + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treectrl.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + + m_treectrl.RootOpen(GroupTID,pUser->m_bHasNewMessages); + } + } + } + break; + } + + UpdateGroupCheck(); +} + +void CGroupFileDescriptionDlg::OnActionCcootreectrl(long TID, BOOL bGroupe) +{ + if(TID!= -1) + if(!bGroupe) + { + CUser *pUser=FindUserInVisualContactList(TID); + if(pUser) + { + pUser->m_bHasNewMessages = !pUser->m_bHasNewMessages; + // Change User Check in group [2/21/2002] + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + switch(CLMode) + { + case 1: + { + CString strGroupName; + strGroupName = pUser->m_strType; + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])+1)); + else + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])-1)); + + UpdateGroupID(strGroupName); + } + break; + case 2: + { + CString strGroupName; + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + strGroupName = GetString(IDS_OFFLINE); + else + strGroupName = pUser->m_strType; + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])+1)); + else + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])-1)); + + UpdateGroupID(strGroupName); + } + break; + }; + // [2/21/2002] + UpdateID(pUser->GetGlobalID()); + } + } + else + { + CString strGrouName; + + POSITION pos = m_GroupTIDMap.GetStartPosition(); + while(pos) + { + CString strKey; + long Data; + m_GroupTIDMap.GetNextAssoc(pos,strKey,(void*&)Data); + if(Data==TID) + { + strGrouName = strKey; + break; + } + } + + if(!strGrouName.IsEmpty()) + { + BOOL bCheck = !((BOOL)m_UserCheckInGroup[strGrouName]); + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + m_UserCheckInGroup.SetAt(strGrouName,(void*)0); + + while(m_ContactList.GetNext(pos, pUser)) + { + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + switch(CLMode) + { + case 1: + { + if(strGrouName.CompareNoCase(pUser->m_strType)==0) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + } + break; + case 2: + { + // [2/21/2002] + if(strGrouName.CompareNoCase(GetString(IDS_OFFLINE))==0&& + (pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + else if(strGrouName.CompareNoCase(pUser->m_strType)==0&& + !(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + // [2/21/2002] + } + break; + } + } + } + UpdateGroupID(strGrouName); + } + } +} + +void CGroupFileDescriptionDlg::OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState) +{ + // TODO: Add your control notification handler code here + +} + +void CGroupFileDescriptionDlg::OnMenuCcootreectrl(long TID, BOOL bGroupe) +{ + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser) + { + CUser User = *pUser; + pMessenger->ShowUserMenu(User.GetGlobalID()); + } + } +} + +void CGroupFileDescriptionDlg::OnSelectCcootreectrl(long TID, BOOL bGroupe) +{ +} + +void CGroupFileDescriptionDlg::UpdateID(long UserId) +{ + CUser *pUser = m_ContactList.GetAt(UserId); + if(pUser) + { + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + m_treectrl.SetItemId(pUser->TID,m_ShablonId[pUser->m_bHasNewMessages+2]); + } +} + +CUser* CGroupFileDescriptionDlg::FindUserInVisualContactList(long TID) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + return NULL; +} + +//DEL void CGroupFileDescriptionDlg::OnClickMcselectAll() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = TRUE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +BOOL CGroupFileDescriptionDlg::EnableRecepients() +{ + CUser *pRecipient = NULL; + BOOL bEnableContactUser = FALSE; + + if(POSITION pos = m_ContactList.InitIteration()) + { + while(m_ContactList.GetNext(pos,pRecipient)) + { + if(pRecipient->m_bHasNewMessages) + return TRUE; + } + } + return FALSE; +} + +//DEL void CGroupFileDescriptionDlg::LoadSkin() +//DEL { +//DEL /////////////////////////////////////////////////////////////////////// +//DEL LoadSkins m_Load; +//DEL IStreamPtr pStream = NULL; +//DEL long Error = 0; +//DEL bstr_t Path = bstr_t("IBN_SCHEMA://") + (LPCTSTR)GetCurrentSkin(); +//DEL m_Load.Load(Path+bstr_t("/Shell/GroupFile/fon.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL { +//DEL CDib m_Dib(pStream); +//DEL CPaintDC dc(this); +//DEL SetFon(m_Dib.GetHBITMAP(dc)); +//DEL } +//DEL pStream = NULL; +//DEL +//DEL m_Load.Load(Path+bstr_t("/Common/btn_x.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Close.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL m_Load.Load(Path+bstr_t("/Common/btn_send.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_Send.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL +//DEL +//DEL m_Load.Load(Path+bstr_t("/Shell/GroupSend/selectall.bmp"),&pStream,&Error); +//DEL if(pStream) +//DEL m_SelectAll.LoadBitmapFromStream(pStream); +//DEL pStream = NULL; +//DEL /////////////////////////////////////////////////////////////////////// +//DEL } + +void CGroupFileDescriptionDlg::UpdateGroupCheck() +{ + POSITION pos = m_UserCheckInGroup.GetStartPosition(); + while(pos) + { + CString strKey; + int Data; + m_UserCheckInGroup.GetNextAssoc(pos,strKey,(void*&)Data); + UpdateGroupID(strKey); + } +} + +void CGroupFileDescriptionDlg::UpdateGroupID(LPCTSTR strName) +{ + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + if(m_UserCheckInGroup[strName]) + m_treectrl.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[1]); + else + m_treectrl.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[0]); +} + +//DEL void CGroupFileDescriptionDlg::OnClickSend() +//DEL { +//DEL OnSendButton(); +//DEL } + +//DEL void CGroupFileDescriptionDlg::OnClickSelectAll() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = TRUE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +//DEL void CGroupFileDescriptionDlg::OnMcunselectall() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = FALSE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +void CGroupFileDescriptionDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + m_btnMenu.ShowWindow(SW_HIDE); + m_btnOptions.ShowWindow(SW_HIDE); + m_btnMin.ShowWindow(SW_HIDE); + m_btnX.ShowWindow(SW_HIDE); + + m_btnSelectAll.ShowWindow(SW_HIDE); + m_btnSelectNone.ShowWindow(SW_HIDE); + + m_btnColor.ShowWindow(SW_HIDE); + m_btnBold.ShowWindow(SW_HIDE); + m_btnItalic.ShowWindow(SW_HIDE); + m_btnUnderline.ShowWindow(SW_HIDE); + m_btnSmiles.ShowWindow(SW_HIDE); + m_btnSend.ShowWindow(SW_HIDE); + + LoadButton(pXmlRoot, _T("Menu"), &m_btnMenu, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Options"), &m_btnOptions, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + + LoadButton(pXmlRoot, _T("SelectAll"), &m_btnSelectAll, TRUE, FALSE); + LoadButton(pXmlRoot, _T("SelectNone"), &m_btnSelectNone, TRUE, FALSE); + + LoadButton(pXmlRoot, _T("Color"), &m_btnColor, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Bold"), &m_btnBold, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Italic"), &m_btnItalic, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Underline"), &m_btnUnderline, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Smiles"), &m_btnSmiles, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Send"), &m_btnSend, TRUE, FALSE); + + LoadLabel(pXmlRoot, _T("Recipient"), &m_UserInfo, TRUE); + + LoadRectangle(pXmlRoot, _T("Users"), &m_treectrl, TRUE); + LoadRectangle2(pXmlRoot, _T("Edit"), m_edit.GetSafeHwnd(), TRUE); + + LoadRectangle2(pXmlRoot, _T("ComboFont"), m_FontCombo.GetSafeHwnd(), TRUE); + LoadRectangle2(pXmlRoot, _T("ComboSize"), m_SizeCombo.GetSafeHwnd(), TRUE); +} + +void CGroupFileDescriptionDlg::OnEditMenuCopy() +{ + m_edit.ClipboardCopy(); +} + +void CGroupFileDescriptionDlg::OnEditMenuCut() +{ + m_edit.ClipboardCut(); +} + +void CGroupFileDescriptionDlg::OnEditMenuDelete() +{ + m_edit.ClipboardDelete(); +} + +void CGroupFileDescriptionDlg::OnEditMenuPaste() +{ + if (OpenClipboard()) + { + HANDLE hText = GetClipboardData(CF_TEXT); + + if(hText!=NULL) + { + CComBSTR strText = (LPCTSTR)GlobalLock(hText); + m_edit.InsertTEXT(strText); + GlobalUnlock(hText); + } + + CloseClipboard(); + } +} + +void CGroupFileDescriptionDlg::OnUpdateEditMenuCopy(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCopy()); +} + +void CGroupFileDescriptionDlg::OnUpdateEditMenuCut(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCut()); +} + +void CGroupFileDescriptionDlg::OnUpdateEditMenuDelete(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardDelete()); +} + +void CGroupFileDescriptionDlg::OnUpdateEditMenuPaste(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardPast()); +} + +void CGroupFileDescriptionDlg::SetBody(LPCTSTR strBody) +{ + m_strSetBody = strBody; + m_edit.InsertTEXT(CComBSTR(_T(""))); + m_edit.SetFocus(); +} + +LPARAM CGroupFileDescriptionDlg::OnSWMSetBody(WPARAM w, LPARAM l) +{ + // if(!Handle) + { + SetBody(LPCTSTR(w)); + } + return 0; +} + +CString CGroupFileDescriptionDlg::GetFileDescription() +{ + CComBSTR bsText; + CString Result; + + m_edit.GetTXT(&bsText); + if(bsText.Length() != 0) + { + //RemoveParagraf(bsText.m_str); + Result = CString(bsText.m_str).Left(400); + } + return Result; +} + +void CGroupFileDescriptionDlg::OnSelEndOkSizeCombo() +{ + SetFontSize(); +} + +void CGroupFileDescriptionDlg::OnSelEndOkFontCombo() +{ + SetFontFace(); +} + +void CGroupFileDescriptionDlg::OnSmileItem(UINT nID) +{ + // New Smile Addon [2007-02-06] + int SmileId = -1; + + if(nID==20000) + { + // Show Smile Select Popup Window. + CSelectSmileDlg dlgSelectSmile(this); + + if(dlgSelectSmile.DoModal()==IDOK) + { + SmileId = dlgSelectSmile.GetSelectedSmileIndex(); + } + } + else + SmileId = nID - 20001; + + if(SmileId>=0) + { + + CSmileInfo smileInfo = CurrentSmileManager.GetSmile(SmileId); + + if(smileInfo!=CSmileInfo::Empty) + { + + BOOL bShift = GetKeyState(VK_SHIFT)>>1; + + if(bShift) + { + CComBSTR strSmileHtml = smileInfo.GetHtmlSmile(); + m_edit.InsertHTML(strSmileHtml); + } + else + { + CComBSTR strSmileHtml = L""; + + m_edit.InsertHTML(strSmileHtml); + } + + m_edit.SetFocus(); + } + else + { + ASSERT(FALSE); + } + } + // +} + +void CGroupFileDescriptionDlg::SelectColor() +{ + CColorDialog m_Color(m_edit.GetColor(), CC_ANYCOLOR,this); + if(m_Color.DoModal()==IDOK) + { + m_edit.SetColor(m_Color.GetColor()); + } + m_edit.SetFocus(); +} + +void CGroupFileDescriptionDlg::InsertSmile() +{ + // New Smile Addon [2007-02-06] + CMenu smileMenu; + smileMenu.CreatePopupMenu(); + + int index = 0; + for(CSmileInfoListEnum item = CurrentSmileManager.GetSmiles().begin();item!=CurrentSmileManager.GetSmiles().end() && index<(3*8-1);item++,index++) + { + CString str; + str.Format("%s\t%s", (*item).GetText(), (*item).GetSmile()); + + if(index!=0 && (index%8)==0) + VERIFY(smileMenu.AppendMenu(MF_STRING|MF_ENABLED|MF_MENUBREAK, 20001 + (*item).GetIndex(), str)); + else + VERIFY(smileMenu.AppendMenu(MF_STRING|MF_ENABLED, 20001 + (*item).GetIndex(), str)); + + } + + smileMenu.AppendMenu(MF_STRING|MF_ENABLED, 20000, GetString(IDS_SMILES_MORE)); + + CPoint curPoint; + GetCursorPos(&curPoint); + smileMenu.TrackPopupMenu(TPM_LEFTBUTTON,curPoint.x,curPoint.y,this); + // +} + +void CGroupFileDescriptionDlg::SetFontBold() +{ + m_edit.SetBold(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_BOLD, m_btnBold.GetPressed()); +} + +void CGroupFileDescriptionDlg::SetFontItalic() +{ + m_edit.SetItalic(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_ITALIC,m_btnItalic.GetPressed()); +} + +void CGroupFileDescriptionDlg::SetFontUnderline() +{ + m_edit.SetUnderline(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE,m_btnUnderline.GetPressed()); +} + +void CGroupFileDescriptionDlg::SetFontSize() +{ + WriteOptionInt(IDS_OFSMESSENGER,IDS_SIZE,m_SizeCombo.GetCurSel()); + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + // [4/29/2002] + m_edit.SetDefaultFontSize(nFontSizes[m_SizeCombo.GetCurSel()]); + // [4/29/2002] + m_edit.SetFocus(); +} + +void CGroupFileDescriptionDlg::SetFontFace() +{ + int nIndex = m_FontCombo.GetCurSel(); + + CString strFontName; + m_FontCombo.GetLBText(nIndex, strFontName); + + WriteOptionString(IDS_OFSMESSENGER,IDS_FONT,strFontName); + + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName); + // [4/29/2002] + m_edit.SetDefaultFontName(bsFontName); + // [4/29/2002] + m_edit.SetFocus(); +} + +HRESULT CGroupFileDescriptionDlg::OnEditUpdate(WPARAM w, LPARAM l) +{ + if(!m_strSetBody.IsEmpty()) + { + CComBSTR bsSetBody = m_strSetBody; + m_edit.InsertHTML(bsSetBody); + m_strSetBody.Empty(); + } + + if(!m_bInitEdit) + { + m_bInitEdit = TRUE; + + /* + m_edit.SetTextSize(GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)+1); + CString strFontName = _T("Arial"); + int FontId = GetOptionInt(IDS_OFSMESSENGER,IDS_FONT,-1); + if(FontId!=-1) + m_FontCombo.GetLBText(FontId, strFontName); + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName);*/ + + + if(GetOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE,0)) + { + m_edit.SetUnderline(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ITALIC,0)) + { + m_edit.SetItalic(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_BOLD,0)) + { + m_edit.SetBold(); + } + + } + + m_edit.UpdateCmdControl(&m_btnBold, IDM_TRIED_BOLD, TRUE); + m_edit.UpdateCmdControl(&m_btnItalic, IDM_TRIED_ITALIC, TRUE); + m_edit.UpdateCmdControl(&m_btnUnderline, IDM_TRIED_UNDERLINE, TRUE); + + int TextSize = m_edit.GetTextSize(); + // [4/29/2002] + if(TextSize>=1) + m_SizeCombo.SetCurSel(m_edit.GetTextSize()-1); + else + { + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + } + // [4/29/2002] + + + CString strFontName = m_edit.GetFontName(); + + for (int i=0; i < m_FontCombo.GetCount(); ++i) + { + CString itemStr; + + m_FontCombo.GetLBText(i, itemStr); + + if ( itemStr == strFontName) + { + m_FontCombo.SetCurSel(i); + break; + } + } + + + return 0; +} + +void CGroupFileDescriptionDlg::OnClickBtnX() +{ + OnCancel(); +} + +void CGroupFileDescriptionDlg::OnClickBtnMin() +{ + ShowWindow(SW_MINIMIZE); +} + +void CGroupFileDescriptionDlg::OnClickBtnOptions() +{ + pMessenger->PreferenceDlg(this); +} + +void CGroupFileDescriptionDlg::OnClickBtnMenu() +{ +} + +void CGroupFileDescriptionDlg::OnClickBtnSelectAll() +{ + SelectAll(TRUE); +} + +void CGroupFileDescriptionDlg::OnClickBtnSelectNone() +{ + SelectAll(FALSE); +} + +void CGroupFileDescriptionDlg::OnClickBtnColor() +{ + SelectColor(); +} + +void CGroupFileDescriptionDlg::OnClickBtnBold() +{ + SetFontBold(); +} + +void CGroupFileDescriptionDlg::OnClickBtnItalic() +{ + SetFontItalic(); +} + +void CGroupFileDescriptionDlg::OnClickBtnUnderline() +{ + SetFontUnderline(); +} + +void CGroupFileDescriptionDlg::OnClickBtnSmiles() +{ + InsertSmile(); +} + +void CGroupFileDescriptionDlg::OnClickBtnSend() +{ + Send(); +} + +void CGroupFileDescriptionDlg::SelectAll(BOOL bSelect) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + pUser->m_bHasNewMessages = bSelect; + } + } + BuildTree(); +} + +void CGroupFileDescriptionDlg::Send() +{ + UpdateData(TRUE); + + if(!EnableRecepients()) + return; + + COFSNcDlg2::OnOK(); +} + +int CGroupFileDescriptionDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (COFSNcDlg2::OnCreate(lpCreateStruct) == -1) + return -1; + + CRect r(1,2,3,4); + m_edit.Create(NULL, NULL, WS_VISIBLE, r, this, IDC_DHTML_EDIT); + + return 0; +} + +BOOL CGroupFileDescriptionDlg::PreTranslateMessage(MSG* pMsg) +{ + //TRACE("\r\n WM = 0x%X wParam = 0x%X (%d)",pMsg->message,pMsg->wParam, GetKeyState(VK_MENU)); + if(m_bWasCtrlExit&&m_bWasCtrlEnter) + { + m_bWasCtrlExit = m_bWasCtrlEnter = FALSE; + COFSNcDlg2::PreTranslateMessage(pMsg); + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + pMsg->lParam = 0; + } + else + if(pMsg->message==WM_KEYUP&& + pMsg->wParam==VK_CONTROL&& + m_bWasCtrlEnter) + { + //m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = TRUE; + } + else + if(pMsg->message==WM_KEYDOWN||pMsg->message==WM_SYSKEYDOWN) + { + //TRACE("\r\n WM_KEYDOWN wParam = 0x%X",pMsg->wParam); + if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_CONTROL)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_CTRLENTER,1)==0) + { + Send(); + return TRUE; + } + else + { + m_bWasCtrlEnter = TRUE; + //pMsg->message = WM_KEYDOWN; + //pMsg->wParam = VK_RETURN; + //m_edit.SendMessage(WM_KEYDOWN,VK_RETURN); + } + } + else if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_SHIFT)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHIFTENTER,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==VK_RETURN) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ENTER,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==0x53&&(GetKeyState(VK_MENU)>>1)) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ALTS,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + } + return COFSNcDlg2::PreTranslateMessage(pMsg); +} diff --git a/Source/Client/IM-Client/IMClient/GroupFileDescriptionDlg.h b/Source/Client/IM-Client/IMClient/GroupFileDescriptionDlg.h new file mode 100644 index 0000000..3401dc8 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GroupFileDescriptionDlg.h @@ -0,0 +1,148 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +#include "ccootree.h" +//}}AFX_INCLUDES +#if !defined(AFX_GROUPFILEDESCRIPTIONDLG_H__A3808E64_9B01_4CDD_A936_ED8850C95FD7__INCLUDED_) +#define AFX_GROUPFILEDESCRIPTIONDLG_H__A3808E64_9B01_4CDD_A936_ED8850C95FD7__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// MessageSplitDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +#include "OFSNCDlg2.h" +#include "Label.h" +#include "ResizableImage.h" +#include "UserCollection.h" +// CGroupFileDescriptionDlg dialog + +#include "coolmenu.h" + +class CGroupFileDescriptionDlg : public COFSNcDlg2 +{ +// Construction +public: + void Send(); + void SelectAll(BOOL bSelect); + void SetFontFace(); + void SetFontSize(); + void SetFontUnderline(); + void SetFontItalic(); + void SetFontBold(); + void InsertSmile(); + void SelectColor(); + BOOL EnableRecepients(); + void SetBody(LPCTSTR strBody); + void SetFon(HBITMAP hFon); + void SetRecipientGroup(LPCTSTR strName); + CGroupFileDescriptionDlg(CMainDlg *pMessenger,CWnd* pParent = NULL); // standard constructor + ~CGroupFileDescriptionDlg(); + +// Dialog Data + //{{AFX_DATA(CGroupFileDescriptionDlg) + enum { IDD = IDD_GROUP_FILE_SEND_DIALOG }; + CComboBox m_FontCombo; + CComboBox m_SizeCombo; + CLabel m_UserInfo; + CCCooTree m_treectrl; + CMcButton m_btnColor; + CMcButton m_btnItalic; + CMcButton m_btnMenu; + CMcButton m_btnMin; + CMcButton m_btnOptions; + CMcButton m_btnSelectAll; + CMcButton m_btnSelectNone; + CMcButton m_btnSend; + CMcButton m_btnSmiles; + CMcButton m_btnUnderline; + CMcButton m_btnX; + CString m_strFileName; + CMcButton m_btnBold; + //}}AFX_DATA + +// CFont m_font; + COfsDhtmlEditCtrl m_edit; + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CGroupFileDescriptionDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation +public: + CString GetFileDescription(); + CString m_strRecepientGroupName; + CUserCollection m_ContactList; + +protected: + CString m_strSetBody; + LPARAM OnSWMSetBody(WPARAM w, LPARAM l); + BOOL m_bInitEdit; + BOOL m_bWasCtrlEnter, m_bWasCtrlExit; + void LoadSkin(IXMLDOMNode *pXmlRoot); + CMapStringToPtr m_GroupTIDMap; + CMapStringToPtr m_UserCheckInGroup; + + void UpdateGroupCheck(); + void UpdateGroupID(LPCTSTR strName); + CUser* CGroupFileDescriptionDlg::FindUserInVisualContactList(long TID); + void UpdateID(long UserId); + + void BuildTree(); + void CreateTree(); + CMainDlg *pMessenger; + + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + // Generated message map functions + //{{AFX_MSG(CGroupFileDescriptionDlg) + afx_msg void OnOk(); + afx_msg void OnSelEndOkFontCombo(); + afx_msg void OnSelEndOkSizeCombo(); + afx_msg void OnEditMenuCopy(); + afx_msg void OnEditMenuCut(); + afx_msg void OnEditMenuDelete(); + afx_msg void OnEditMenuPaste(); + afx_msg void OnUpdateEditMenuCopy(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditMenuCut(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditMenuDelete(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditMenuPaste(CCmdUI* pCmdUI); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnMove(int x, int y); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnActionCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState); + afx_msg void OnMenuCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnSelectCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnClickBtnX(); + afx_msg void OnClickBtnMin(); + afx_msg void OnClickBtnOptions(); + afx_msg void OnClickBtnMenu(); + afx_msg void OnClickBtnSelectAll(); + afx_msg void OnClickBtnSelectNone(); + afx_msg void OnClickBtnColor(); + afx_msg void OnClickBtnBold(); + afx_msg void OnClickBtnItalic(); + afx_msg void OnClickBtnUnderline(); + afx_msg void OnClickBtnSmiles(); + afx_msg void OnClickBtnSend(); + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + HRESULT OnEditUpdate(WPARAM w, LPARAM l); + void OnSmileItem(UINT nID); + DECLARE_MESSAGE_MAP() +private: + CCoolMenuManager m_CoolMenuManager; +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // diff --git a/Source/Client/IM-Client/IMClient/GroupMessageSendDlg.cpp b/Source/Client/IM-Client/IMClient/GroupMessageSendDlg.cpp new file mode 100644 index 0000000..95cecec --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GroupMessageSendDlg.cpp @@ -0,0 +1,1812 @@ +// MessageSplitDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "MainDlg.h" +#include "GroupMessageSendDlg.h" +#include "resource.h" +#include "User.h" +#include +//#include "MainFrm.h" +#include "MemDc.h" +//#include "smileyahoopopup.h" + +#include "SmileManager.h" +#include "SelectSmileDlg.h" + +extern CSmileManager CurrentSmileManager; + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +#define WM_EDIT_UPDATE WM_USER + 201 +///////////////////////////////////////////////////////////////////////////// +// CGroupMessageSendDlg dialog + + +CGroupMessageSendDlg::CGroupMessageSendDlg(CMainDlg *pMessenger,CWnd* pParent /*=NULL*/) + : COFSNcDlg2(CGroupMessageSendDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CGroupMessageSendDlg) + //}}AFX_DATA_INIT + this->pMessenger = pMessenger; + bBlock = FALSE; + Handle = 0L; + MessageTime = 0L; + bInitEdit = FALSE; + bIsKillWinodow = FALSE; + m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = FALSE; + m_strSkinSettings = _T("/Shell/GroupMessage/skin.xml"); + m_bLoadSkin = FALSE; + + m_bAutoSend = FALSE; +} + +CGroupMessageSendDlg::~CGroupMessageSendDlg() +{ +} + + +void CGroupMessageSendDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CGroupMessageSendDlg) + DDX_Control(pDX, IDC_FONT_COMBO, m_FontCombo); + DDX_Control(pDX, IDC_SIZE_COMBO, m_SizeCombo); + DDX_Control(pDX, IDC_USERINFO, m_UserInfo); + DDX_Control(pDX, IDC_CCOOTREECTRL, m_treectrl); + DDX_Control(pDX, IDC_BTN_BOLD, m_btnBold); + DDX_Control(pDX, IDC_BTN_COLOR, m_btnColor); + DDX_Control(pDX, IDC_BTN_ITALIC, m_btnItalic); + DDX_Control(pDX, IDC_BTN_MENU, m_btnMenu); + DDX_Control(pDX, IDC_BTN_MIN, m_btnMin); + DDX_Control(pDX, IDC_BTN_OPTIONS, m_btnOptions); + DDX_Control(pDX, IDC_BTN_SELECT_ALL, m_btnSelectAll); + DDX_Control(pDX, IDC_BTN_SELECT_NONE, m_btnSelectNone); + DDX_Control(pDX, IDC_BTN_SEND, m_btnSend); + DDX_Control(pDX, IDC_BTN_SMILES, m_btnSmiles); + DDX_Control(pDX, IDC_BTN_UNDERLINE, m_btnUnderline); + DDX_Control(pDX, IDC_BTN_X, m_btnX); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CGroupMessageSendDlg, COFSNcDlg2) + //{{AFX_MSG_MAP(CGroupMessageSendDlg) + ON_BN_CLICKED(IDOK, OnOk) + ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) + ON_CBN_SELENDOK(IDC_FONT_COMBO, OnSelEndOkFontCombo) + ON_CBN_SELENDOK(IDC_SIZE_COMBO, OnSelEndOkSizeCombo) + ON_COMMAND(ID_EDITMENU_COPY, OnEditMenuCopy) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_COPY, OnUpdateEditMenuCopy) + ON_COMMAND(ID_EDITMENU_CUT, OnEditMenuCut) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_CUT, OnUpdateEditMenuCut) + ON_COMMAND(ID_EDITMENU_DELETE, OnEditMenuDelete) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_DELETE, OnUpdateEditMenuDelete) + ON_COMMAND(ID_EDITMENU_PAST, OnEditMenuPaste) + ON_UPDATE_COMMAND_UI(ID_EDITMENU_PAST, OnUpdateEditMenuPaste) + ON_WM_CAPTURECHANGED() + ON_WM_MOVE() + ON_WM_SIZE() + ON_WM_DROPFILES() + ON_MESSAGE(WM_EDIT_UPDATE,OnEditUpdate) + //}}AFX_MSG_MAP + ON_MESSAGE(WM_SWM_SETBODY,OnSWMSetBody) + ON_COMMAND_RANGE(20000,20000+SmileBuffSize,OnSmileItem) +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CGroupMessageSendDlg message handlers + +void CGroupMessageSendDlg::OnOk() +{ + // TODO: Add your control notification handler code here +} + +void CGroupMessageSendDlg::OnCancel() +{ + // TODO: Add extra cleanup here + if((Handle==0L)||!pMessenger->ConnectEnable()) + { + //COFSNcDlg2::OnCancel(); + KillWindow(); + return; + } + pSession->CancelOperation(Handle); +} + +BOOL CGroupMessageSendDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + m_ToolTip.AddTool(&m_btnMin,IDS_TIP_MINIMIZE); + m_ToolTip.AddTool(&m_btnColor,IDS_TIP_FONT_COLOR); + m_ToolTip.AddTool(&m_btnBold,IDS_TIP_BOLD); + m_ToolTip.AddTool(&m_btnItalic,IDS_TIP_ITALIC); + m_ToolTip.AddTool(&m_btnUnderline,IDS_TIP_UNDERLINE); + m_ToolTip.AddTool(&m_btnSmiles,IDS_TIP_SMILES); + m_ToolTip.AddTool(&m_FontCombo,IDS_TIP_FONT); + m_ToolTip.AddTool(&m_SizeCombo,IDS_TIP_FONT_SIZE); + ////////////////////////////////////////////////////////////////////////// + + /// Create Font ... + m_font.Attach(GetStockObject(DEFAULT_GUI_FONT)); + + CRect rTmp(16,102,351,184); + m_edit.Create(NULL,NULL,WS_VISIBLE,rTmp,this,IDC_DHTML_EDIT); + m_edit.InitInfoMessage(WM_EDIT_UPDATE); + m_edit.SetContextMenu(IDR_MESSENGER_MENU,1,this); + m_edit.SetEditMode(); + + CString str; + for (int i = 0; i < sizeof(nFontSizes)/sizeof(int); i++) + { + str.Format(_T("%d"), nFontSizes[i]); + m_SizeCombo.AddString(str); + } + + CreateTree(); + + ::EnumFontFamilies(GetDC()->m_hDC, (LPTSTR) NULL, (FONTENUMPROC)NEnumFontNameProc, (LPARAM)&(m_FontCombo)); + + bInitEdit = FALSE; + // [4/29/2002] + //CString strFontName = _T("Arial"); + CString strFontName = GetOptionString(IDS_OFSMESSENGER,IDS_FONT,_T("Arial")); + //if(FontId!=-1) + // m_FontCombo.GetLBText(FontId, strFontName); + CComBSTR bsFontName = strFontName; + + + m_edit.SetDefaultFontName(bsFontName); + m_edit.SetDefaultFontSize(nFontSizes[GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)]); + // [4/29/2002] + + // OZ 2007-02-01 + m_CoolMenuManager.Install(this); + + try + { + // Load Smiles + int SmileIndex = 0; + for(CSmileInfoListEnum item = CurrentSmileManager.GetSmiles().begin();item!=CurrentSmileManager.GetSmiles().end();item++, SmileIndex++) + { + CBitmap* pPreviewBmp = CurrentSmileManager.GetSmilePreview((*item).GetId()); + + if(pPreviewBmp!=NULL) + { + TOOLBARDATA Tdt = {1,16,16,1,0}; + WORD dwItemID[] = {20001+(*item).GetIndex()}; + + Tdt.items = (WORD*)dwItemID; + + m_CoolMenuManager.LoadToolbar(*pPreviewBmp,&Tdt,0x808080); + + pPreviewBmp->DeleteObject(); + delete pPreviewBmp; + } + } + + } + catch (...) + { + ASSERT(FALSE); + } + // + + m_edit.Clear(); + m_edit.SetFocus(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +BOOL CGroupMessageSendDlg::PreTranslateMessage(MSG* pMsg) +{ + // TODO: Add your specialized code here and/or call the base class + //TRACE("\r\n WM = 0x%X wParam = 0x%X (%d)",pMsg->message,pMsg->wParam, GetKeyState(VK_MENU)); + if(m_bWasCtrlExit&&m_bWasCtrlEnter) + { + m_bWasCtrlExit = m_bWasCtrlEnter = FALSE; + COFSNcDlg2::PreTranslateMessage(pMsg); + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + pMsg->lParam = 0; + } + else + if(pMsg->message==WM_KEYUP&& + pMsg->wParam==VK_CONTROL&& + !bBlock&& + m_bWasCtrlEnter) + { + //m_bWasCtrlEnter = FALSE; + m_bWasCtrlExit = TRUE; + } + else + if(pMsg->message==WM_KEYDOWN||pMsg->message==WM_SYSKEYDOWN) + { + //TRACE("\r\n WM_KEYDOWN wParam = 0x%X",pMsg->wParam); + if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_CONTROL)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_CTRLENTER,1)==0) + { + Send(); + return TRUE; + } + else + { + m_bWasCtrlEnter = TRUE; + //pMsg->message = WM_KEYDOWN; + //pMsg->wParam = VK_RETURN; + //m_edit.SendMessage(WM_KEYDOWN,VK_RETURN); + } + } + else if(pMsg->wParam==VK_RETURN&&(GetKeyState(VK_SHIFT)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHIFTENTER,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==VK_RETURN&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ENTER,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + else if(pMsg->wParam==0x53&&(GetKeyState(VK_MENU)>>1)&&!bBlock) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ALTS,0)==0) + { + Send(); + return TRUE; + } + else + { + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_RETURN; + } + } + } + return COFSNcDlg2::PreTranslateMessage(pMsg); +} + +void CGroupMessageSendDlg::Block() +{ + bBlock=TRUE; + m_edit.EnableWindow(FALSE); + m_btnSend.EnableWindow(FALSE); + m_btnSelectAll.EnableWindow(FALSE); + m_btnSelectNone.EnableWindow(FALSE); + m_treectrl.EnableWindow(FALSE); +} + +void CGroupMessageSendDlg::UnBlock() +{ + bBlock=FALSE; + m_edit.EnableWindow(TRUE); + m_edit.SetFocus(); + m_btnSend.EnableWindow(TRUE); + m_btnSelectAll.EnableWindow(TRUE); + m_btnSelectNone.EnableWindow(TRUE); + m_treectrl.EnableWindow(TRUE); +} + +//DEL void CGroupMessageSendDlg::SetSender(CUser &user) +//DEL { +//DEL m_Sender = user; +//DEL m_edit.SetFocus(); +//DEL CString strName = _T("From: ")+m_Sender.GetShowName(); +//DEL } + +void CGroupMessageSendDlg::SetRecipientGroup(LPCTSTR strName) +{ + m_strRecepientGroupName = strName; + +// CString strCaption; +// GetWindowText(strCaption); +// strCaption += " with "; +// strCaption += strName; +// SetWindowText(strCaption); + +// strCaption = strName; + m_UserInfo.SetText(strName); + m_edit.SetFocus(); + + m_ContactList.Clear(); + + pMessenger->GetCopyContactList(m_ContactList); + + // Step 2. Init Check or Uncheck Mode [2/6/2002] + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser* pUser=NULL; + + //if(m_ContactList.InitIteration()) + //{ + for(int i=0; m_ContactList.GetNext(pos, pUser); i++) + { + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + switch(CLMode) + { + case 1: + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SHOWOFFLINEFILES,TRUE)||(pUser->m_iStatus!=S_OFFLINE&&pUser->m_iStatus!=S_INVISIBLE)) + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + } + break; + case 2: + { + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(GetString(IDS_OFFLINE))==0); + } + else + pUser->m_bHasNewMessages = (m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + } + break; + } + } + //} + } + + BuildTree(); +} + +LRESULT CGroupMessageSendDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + + switch(pItem->EventType) + { + case NLT_ECommandOK: + MessageTime = pItem->Long1; + + try + { + CUser *pRecipient = NULL; + BOOL bEnableContactUser = FALSE; + + if(POSITION pos = m_ContactList.InitIteration()) + { + while(m_ContactList.GetNext(pos, pRecipient)) + { + if(pRecipient->m_bHasNewMessages) + { + if(!pMessenger->AddMessageToDataBase(pRecipient->GetGlobalID(),pMessage->GetMID(),MessageTime,pMessage->GetBody())) + { + _SHOW_IBN_ERROR_DLG_OK(IDS_LOCDATABASE_ADDMESSAGE_ERROR); + } + } + } + } + } + catch(...) + { + } + + bInitEdit = FALSE; + KillWindow(); + break; + case NLT_ECommandError: + UnBlock(); + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + + break; + } + + delete pItem; + return 0; +} + +void CGroupMessageSendDlg::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + COFSNcDlg2::OnClose(); + if(!bIsKillWinodow) + { + m_ContactList.Clear(); + m_treectrl.DeleteTree(); + + bIsKillWinodow = TRUE; + DestroyWindow(); + delete this; + } +} + + +void CGroupMessageSendDlg::OnEditMenuCopy() +{ + m_edit.ClipboardCopy(); +} + +void CGroupMessageSendDlg::OnUpdateEditMenuCopy(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCopy()); +} + +void CGroupMessageSendDlg::OnEditMenuCut() +{ + m_edit.ClipboardCut(); +} + +void CGroupMessageSendDlg::OnUpdateEditMenuCut(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardCut()); +} + +void CGroupMessageSendDlg::OnEditMenuDelete() +{ + m_edit.ClipboardDelete(); +} + +void CGroupMessageSendDlg::OnUpdateEditMenuDelete(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardDelete()); +} + +void CGroupMessageSendDlg::OnEditMenuPaste() +{ + if (OpenClipboard()) + { + HANDLE hText = GetClipboardData(CF_TEXT); + + if(hText!=NULL) + { + CComBSTR strText = (LPCTSTR)GlobalLock(hText); + m_edit.InsertTEXT(strText); + GlobalUnlock(hText); + } + + CloseClipboard(); + } +} + +void CGroupMessageSendDlg::OnUpdateEditMenuPaste(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(m_edit.EnableClipboardPast()); +} + + + +void CGroupMessageSendDlg::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_GROUPSENDMESSAGE,RectToString(rWindow)); + + COFSNcDlg2::OnCaptureChanged(pWnd); +} + + +void CGroupMessageSendDlg::OnMove(int x, int y) +{ + COFSNcDlg2::OnMove(x, y); + + if(::IsWindow(GetParent()->GetSafeHwnd())) + GetParent()->UpdateWindow(); + if(::IsWindow(pMessenger->GetMessageParent()->GetSafeHwnd())) + pMessenger->GetMessageParent()->UpdateWindow(); +} + +void CGroupMessageSendDlg::SetFon(HBITMAP hFon) +{ +/* + if(pFonBmp) + pFonBmp->DeleteObject(); + else + pFonBmp = new CBitmap; + + pFonBmp->Attach(hFon); + + BITMAP hb; + pFonBmp->GetBitmap(&hb); + sFon = CSize(hb.bmWidth ,hb.bmHeight); + + //SetMinTrackSize(sFon); + //SetWindowPos(NULL,-1,-1,sFon.cx,sFon.cy ,SWP_NOZORDER|SWP_NOMOVE); + + CPictureHolder tmpImage; + tmpImage.CreateFromBitmap(pFonBmp); + m_ResizeFon.Destroy(); + m_ResizeFon.Create(tmpImage.m_pPict); + + m_ResizeFon.AddAnchor(CRect(0,0,223,67),CSize(0,0),CSize(0,0)); + m_ResizeFon.AddAnchor(CRect(223,0,277,67),CSize(0,0),CSize(100,0),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,0,299,67),CSize(100,0),CSize(100,0)); + + m_ResizeFon.AddAnchor(CRect(0,67,223,115),CSize(0,0),CSize(0,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(223,67,277,115),CSize(0,0),CSize(100,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,67,299,115),CSize(100,0),CSize(100,100),CResizableImage::DUPLICATE); + + m_ResizeFon.AddAnchor(CRect(0,115,223,149),CSize(0,100),CSize(0,100)); + m_ResizeFon.AddAnchor(CRect(223,115,277,149),CSize(0,100),CSize(100,100),CResizableImage::DUPLICATE); + m_ResizeFon.AddAnchor(CRect(277,115,299,149),CSize(100,100),CSize(100,100)); + + CRect rgnRect; + GetWindowRect(&rgnRect); + CRgn WinRgn; + WinRgn.CreateRoundRectRgn(0,0,rgnRect.Width(),rgnRect.Height(),20,20); + SetWindowRgn(WinRgn,TRUE); +*/ + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_GROUPSENDMESSAGE, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + +} + +//DEL void CGroupMessageSendDlg::OnPaint() +//DEL { +//DEL CRect winRect, editRect; +//DEL GetWindowRect(winRect); +//DEL +//DEL m_edit.GetWindowRect(&editRect); +//DEL ScreenToClient(&editRect); +//DEL +//DEL CPaintDC dc(this); // device context for painting +//DEL //CMemDC memdc(&dc); +//DEL if(pFonBmp) +//DEL { +//DEL //CDC dc; +//DEL //dc.CreateCompatibleDC(&memdc); +//DEL //dc.SelectObject(pFonBmp); +//DEL //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); +//DEL //memdc.BitBlt(0,0,sFon.cx,sFon.cy,&dc,0,0,SRCCOPY); +//DEL CRect m_Client; +//DEL GetClientRect(&m_Client); +//DEL CSize winSize(m_Client.Width(),m_Client.Height()); +//DEL m_ResizeFon.Render(dc.GetSafeHdc(),winSize); +//DEL m_UserInfo.Invalidate(); +//DEL } +//DEL // Do not call COFSNcDlg2::OnPaint() for painting messages +//DEL } + +//DEL void CGroupMessageSendDlg::OnLButtonDown(UINT nFlags, CPoint point) +//DEL { +//DEL CPoint inPoint = point; +//DEL ClientToScreen(&point); +//DEL +//DEL CRect StatusRect, miniRect; +//DEL GetClientRect(&StatusRect); +//DEL +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMLEFT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTLEFT,point); +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL COFSNcDlg2::OnNcLButtonDown(HTBOTTOMRIGHT,point); +//DEL else +//DEL COFSNcDlg2::OnNcLButtonDown(HTRIGHT,point); +//DEL else if(inPoint.yShowUserMenu(m_Recipient.GetGlobalID()); +} + +//void CGroupMessageSendDlg::OnClickMcmini() +//{ +// ShowWindow(SW_MINIMIZE); +//} + +//DEL void CGroupMessageSendDlg::OnClickMcoptions() +//DEL { +//DEL pMessenger->PreferenceDlg(this); +//DEL } + +//DEL void CGroupMessageSendDlg::OnDestroy() +//DEL { +//DEL COFSNcDlg2::OnDestroy(); +//DEL } + +void CGroupMessageSendDlg::OnSize(UINT nType, int cx, int cy) +{ + COFSNcDlg2::OnSize(nType, cx, cy); + + m_edit.SetFocus(); +} + +//DEL BOOL CGroupMessageSendDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +//DEL { +//DEL CRect StatusRect, miniRect; +//DEL +//DEL GetClientRect(&StatusRect); +//DEL +//DEL CPoint point, inPoint; +//DEL +//DEL ::GetCursorPos(&point); +//DEL inPoint = point; +//DEL ScreenToClient(&inPoint); +//DEL +//DEL //CRect ResizeRect(StatusRect.Width()-20,StatusRect.Height()-20,StatusRect.Width(),StatusRect.Height()); +//DEL //if(ResizeRect.PtInRect(inPoint)) +//DEL //{ +//DEL // SetCursor(LoadCursor(NULL,IDC_SIZENWSE)); +//DEL // return TRUE; +//DEL //} +//DEL miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); +//DEL +//DEL if(!miniRect.PtInRect(inPoint)) +//DEL { +//DEL if(inPoint.xminiRect.bottom) +//DEL nHitTest = HTBOTTOMLEFT; +//DEL else +//DEL nHitTest = HTLEFT; +//DEL else if(inPoint.x>miniRect.right) +//DEL if(inPoint.yminiRect.bottom) +//DEL nHitTest = HTBOTTOMRIGHT; +//DEL else +//DEL nHitTest = HTRIGHT; +//DEL else if(inPoint.ySendFileToUser(&m_Recipient,FileBuffer,strDescription); + // } + +} + +//DEL void CGroupMessageSendDlg::OnColorButton() +//DEL { +//DEL CColorDialog m_Color(m_edit.GetColor(), CC_ANYCOLOR,this); +//DEL if(m_Color.DoModal()==IDOK) +//DEL { +//DEL m_edit.SetColor(m_Color.GetColor()); +//DEL } +//DEL m_edit.SetFocus(); +//DEL } + +//DEL void CGroupMessageSendDlg::OnBoldCheck() +//DEL { +//DEL // TODO: Add your control notification handler code here +//DEL m_edit.SetBold(); +//DEL m_edit.SetFocus(); +//DEL WriteOptionInt(IDS_OFSMESSENGER,IDS_BOLD,m_BoldButton.GetCheck()); +//DEL } + +//DEL void CGroupMessageSendDlg::OnItalicCheck() +//DEL { +//DEL // TODO: Add your control notification handler code here +//DEL m_edit.SetItalic(); +//DEL m_edit.SetFocus(); +//DEL WriteOptionInt(IDS_OFSMESSENGER,IDS_ITALIC,m_ItalicButton.GetCheck()); +//DEL } + +//DEL void CGroupMessageSendDlg::OnUnderlineCheck() +//DEL { +//DEL // TODO: Add your control notification handler code here +//DEL m_edit.SetUnderline(); +//DEL m_edit.SetFocus(); +//DEL WriteOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE,m_UnderLineButton.GetCheck()); +//DEL } + +HRESULT CGroupMessageSendDlg::OnEditUpdate(WPARAM w, LPARAM l) +{ + if(!m_strSetBody.IsEmpty()) + { + CComBSTR bsSetBody = m_strSetBody; + m_edit.InsertHTML(bsSetBody); + m_strSetBody.Empty(); + + if(m_bAutoSend) + { + m_bAutoSend = FALSE; + Send(); + } + } + + if(!bInitEdit) + { + bInitEdit = TRUE; + + /* + m_edit.SetTextSize(GetOptionInt(IDS_OFSMESSENGER,IDS_SIZE,1)+1); + CString strFontName = _T("Arial"); + int FontId = GetOptionInt(IDS_OFSMESSENGER,IDS_FONT,-1); + if(FontId!=-1) + m_FontCombo.GetLBText(FontId, strFontName); + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName);*/ + + + if(GetOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE,0)) + { + //m_UnderLineButton.SetCheck(1); + m_edit.SetUnderline(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_ITALIC,0)) + { + //m_ItalicButton.SetCheck(1); + m_edit.SetItalic(); + } + if(GetOptionInt(IDS_OFSMESSENGER,IDS_BOLD,0)) + { + //m_BoldButton.SetCheck(1); + m_edit.SetBold(); + } + + } + + /* + CCmdUI m_Command; + + m_Command.m_nID = m_BoldButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_BoldButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_BOLD,TRUE); + + m_Command.m_nID = m_ItalicButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_ItalicButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_ITALIC,TRUE); + + m_Command.m_nID = m_UnderLineButton.GetDlgCtrlID(); + m_Command.m_pOther = (CWnd*)&m_UnderLineButton; + m_edit.UpdateCmdControl(&m_Command,IDM_TRIED_UNDERLINE,TRUE); + */ + m_edit.UpdateCmdControl(&m_btnBold, IDM_TRIED_BOLD, TRUE); + m_edit.UpdateCmdControl(&m_btnItalic, IDM_TRIED_ITALIC, TRUE); + m_edit.UpdateCmdControl(&m_btnUnderline, IDM_TRIED_UNDERLINE, TRUE); + + int TextSize = m_edit.GetTextSize(); + // [4/29/2002] + if(TextSize>=1) + m_SizeCombo.SetCurSel(m_edit.GetTextSize()-1); + else + { + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + } + // [4/29/2002] + + CString strFontName = m_edit.GetFontName(); + + for (int i=0; i < m_FontCombo.GetCount(); ++i) + { + CString itemStr; + + m_FontCombo.GetLBText(i, itemStr); + + if ( itemStr == strFontName) + { + m_FontCombo.SetCurSel(i); + break; + } + } + + + return 0; +} + +void CGroupMessageSendDlg::OnSelEndOkSizeCombo() +{ + SetFontSize(); +} + +void CGroupMessageSendDlg::OnSelEndOkFontCombo() +{ + SetFontFace(); +} + +void CGroupMessageSendDlg::OnSmileItem(UINT nID) +{ + // New Smile Addon [2007-02-06] + int SmileId = -1; + + if(nID==20000) + { + // Show Smile Select Popup Window. + CSelectSmileDlg dlgSelectSmile(this); + + if(dlgSelectSmile.DoModal()==IDOK) + { + SmileId = dlgSelectSmile.GetSelectedSmileIndex(); + } + } + else + SmileId = nID - 20001; + + if(SmileId>=0) + { + + CSmileInfo smileInfo = CurrentSmileManager.GetSmile(SmileId); + + if(smileInfo!=CSmileInfo::Empty) + { + + BOOL bShift = GetKeyState(VK_SHIFT)>>1; + + if(bShift) + { + CComBSTR strSmileHtml = smileInfo.GetHtmlSmile(); + m_edit.InsertHTML(strSmileHtml); + } + else + { + CComBSTR strSmileHtml = L""; + + m_edit.InsertHTML(strSmileHtml); + } + + m_edit.SetFocus(); + } + else + { + ASSERT(FALSE); + } + } + // +} + + +void CGroupMessageSendDlg::SetBody(LPCTSTR strBody, BOOL bAutoSend) +{ + m_bAutoSend = bAutoSend; + m_strSetBody = strBody; + m_edit.InsertTEXT(CComBSTR(_T(""))); + m_edit.SetFocus(); +} + +LPARAM CGroupMessageSendDlg::OnSWMSetBody(WPARAM w, LPARAM l) +{ + if(!Handle) + { + SetBody(LPCTSTR(w),l!=NULL); + } + return 0; +} + +void CGroupMessageSendDlg::CreateTree() +{ + + CBitmap hbmpCheckImage; + hbmpCheckImage.LoadBitmap(IDB_TREECHECK); + m_treectrl.SetImageList((long)hbmpCheckImage.Detach()); + + short PriorityIndex[10]; + for(int i=0;i<10;i++) + PriorityIndex[i] = -1; + + m_treectrl.SetPriority(PriorityIndex); + + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + short m_ShablonIcon[4][10] = + { + {2,-1,-1,-1,-1,-1,-1,-1,-1,-1}, /// Группа UnCheck + {3,-1,-1,-1,-1,-1,-1,-1,-1,-1}, /// Группа Check + {2,-1,-1,-1,-1,-1,-1,-1,-1,-1}, /// User UnCheck + {3,-1,-1,-1,-1,-1,-1,-1,-1,-1} /// User Check + }; + + DWORD m_ShablonRGBTextEnable [4] = + { + RGB(0,0,100), /// Группа ... + RGB(0,0,100), /// Группа ... + RGB(0,0,0), /// User + RGB(0,0,0) /// User + }; + + DWORD m_ShablonRGBTextSelect[4] = + { + RGB(0,0,200), /// Группа ... + RGB(0,0,200), /// Группа ... + RGB(0,0,0), /// User + RGB(0,0,0) /// User + }; + + for(int i = 0 ;i<4;i++) + { + m_treectrl.AddEffect(m_ShablonId[i],m_ShablonIcon[i],m_ShablonRGBTextEnable[i], + m_ShablonRGBTextSelect[i],RGB(255,255,255),RGB(200,200,200)); + } + + m_treectrl.SetEventMode(1); +} + +void CGroupMessageSendDlg::BuildTree() +{ + m_treectrl.DeleteTree(); + + m_UserCheckInGroup.RemoveAll(); + m_GroupTIDMap.RemoveAll(); + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + CUser* pUser=NULL; + + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + + switch(CLMode) + { + case 1: + { + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + CString GroupName = pUser->m_strType; + + BOOL isCheck = FALSE;//(m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treectrl.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + + m_treectrl.RootOpen(GroupTID,pUser->m_bHasNewMessages); + } + } + } + break; + case 2: + { + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + CString GroupName = pUser->m_strType; + + BOOL isCheck = FALSE;//(m_strRecepientGroupName.CompareNoCase(pUser->m_strType)==0); + + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + GroupName= GetString(IDS_OFFLINE); + + if(!m_GroupTIDMap.Lookup(GetString(IDS_OFFLINE),(void*&)GroupTID)) + { + long ShablonId[10] = {0L,1L,0L,0L,0L,0L,0L,0L,0L,0L}; + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,GetString(IDS_OFFLINE),ShablonId); + m_GroupTIDMap.SetAt(GetString(IDS_OFFLINE),(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + } + else + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treectrl.AddItem(0,pUser->m_strType,m_ShablonId[0+isCheck]); + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + m_UserCheckInGroup.SetAt(GroupName,(void*)0); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treectrl.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[pUser->m_bHasNewMessages+2]); + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(GroupName,(void*)(int(m_UserCheckInGroup[GroupName])+1)); + + m_treectrl.RootOpen(GroupTID,pUser->m_bHasNewMessages); + } + } + } + break; + } + + UpdateGroupCheck(); +} + +void CGroupMessageSendDlg::OnActionCcootreectrl(long TID, BOOL bGroupe) +{ + if(TID!= -1) + if(!bGroupe) + { + CUser *pUser=FindUserInVisualContactList(TID); + if(pUser) + { + pUser->m_bHasNewMessages = !pUser->m_bHasNewMessages; + // Change User Check in group [2/21/2002] + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + switch(CLMode) + { + case 1: + { + CString strGroupName; + strGroupName = pUser->m_strType; + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])+1)); + else + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])-1)); + + UpdateGroupID(strGroupName); + } + break; + case 2: + { + CString strGroupName; + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + strGroupName = GetString(IDS_OFFLINE); + else + strGroupName = pUser->m_strType; + + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])+1)); + else + m_UserCheckInGroup.SetAt(strGroupName,(void*)(int(m_UserCheckInGroup[strGroupName])-1)); + + UpdateGroupID(strGroupName); + } + break; + }; + // [2/21/2002] + UpdateID(pUser->GetGlobalID()); + } + } + else + { + CString strGrouName; + + POSITION pos = m_GroupTIDMap.GetStartPosition(); + while(pos) + { + CString strKey; + long Data; + m_GroupTIDMap.GetNextAssoc(pos,strKey,(void*&)Data); + if(Data==TID) + { + strGrouName = strKey; + break; + } + } + + if(!strGrouName.IsEmpty()) + { + BOOL bCheck = !((BOOL)m_UserCheckInGroup[strGrouName]); + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + m_UserCheckInGroup.SetAt(strGrouName,(void*)0); + + while(m_ContactList.GetNext(pos,pUser)) + { + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + switch(CLMode) + { + case 1: + { + if(strGrouName.CompareNoCase(pUser->m_strType)==0) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + } + break; + case 2: + { + // [2/21/2002] + if(strGrouName.CompareNoCase(GetString(IDS_OFFLINE))==0&& + (pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + else if(strGrouName.CompareNoCase(pUser->m_strType)==0&& + !(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE)) + { + pUser->m_bHasNewMessages = bCheck; + UpdateID(pUser->GetGlobalID()); + if(pUser->m_bHasNewMessages) + m_UserCheckInGroup.SetAt(strGrouName,(void*)(int(m_UserCheckInGroup[strGrouName])+1)); + } + // [2/21/2002] + } + break; + } + } + } + UpdateGroupID(strGrouName); + } + } +} + +void CGroupMessageSendDlg::OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState) +{ + // TODO: Add your control notification handler code here + +} + +void CGroupMessageSendDlg::OnMenuCcootreectrl(long TID, BOOL bGroupe) +{ + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser) + { + CUser User = *pUser; + pMessenger->ShowUserMenu(User.GetGlobalID()); + } + } +} + +void CGroupMessageSendDlg::OnSelectCcootreectrl(long TID, BOOL bGroupe) +{ + //OnActionCcootreectrl(TID, bGroupe); +} + +void CGroupMessageSendDlg::UpdateID(long UserId) +{ + CUser *pUser = m_ContactList.GetAt(UserId); + if(pUser) + { + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + m_treectrl.SetItemId(pUser->TID,m_ShablonId[pUser->m_bHasNewMessages+2]); + } +} + +CUser* CGroupMessageSendDlg::FindUserInVisualContactList(long TID) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + return NULL; +} + +//DEL void CGroupMessageSendDlg::OnClickMcselectAll() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = TRUE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +BOOL CGroupMessageSendDlg::EnableRecepients() +{ + CUser *pRecipient = NULL; + BOOL bEnableContactUser = FALSE; + + if(POSITION pos = m_ContactList.InitIteration()) + { + while(m_ContactList.GetNext(pos,pRecipient)) + { + if(pRecipient->m_bHasNewMessages) + return TRUE; + } + } + return FALSE; +} + +void CGroupMessageSendDlg::UpdateGroupCheck() +{ + POSITION pos = m_UserCheckInGroup.GetStartPosition(); + while(pos) + { + CString strKey; + int Data; + m_UserCheckInGroup.GetNextAssoc(pos,strKey,(void*&)Data); + UpdateGroupID(strKey); + } +} + +void CGroupMessageSendDlg::UpdateGroupID(LPCTSTR strName) +{ + long m_ShablonId[4][10] = { + {0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {1L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// Группа ... + {2L,0L,0L,0L,0L,0L,0L,0L,0L,0L}, /// User + {3L,0L,0L,0L,0L,0L,0L,0L,0L,0L} /// User + }; + + if(m_UserCheckInGroup[strName]) + m_treectrl.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[1]); + else + m_treectrl.SetItemId((long)m_GroupTIDMap[strName],m_ShablonId[0]); +} + +//DEL void CGroupMessageSendDlg::OnClickSelectAll() +//DEL { +//DEL } + +//DEL void CGroupMessageSendDlg::OnClickSend() +//DEL { +//DEL OnSendButton(); +//DEL } + +//DEL void CGroupMessageSendDlg::OnMcunselectall() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = FALSE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +void CGroupMessageSendDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + m_btnMenu.ShowWindow(SW_HIDE); + m_btnOptions.ShowWindow(SW_HIDE); + m_btnMin.ShowWindow(SW_HIDE); + m_btnX.ShowWindow(SW_HIDE); + + m_btnSelectAll.ShowWindow(SW_HIDE); + m_btnSelectNone.ShowWindow(SW_HIDE); + + m_btnColor.ShowWindow(SW_HIDE); + m_btnBold.ShowWindow(SW_HIDE); + m_btnItalic.ShowWindow(SW_HIDE); + m_btnUnderline.ShowWindow(SW_HIDE); + m_btnSmiles.ShowWindow(SW_HIDE); + m_btnSend.ShowWindow(SW_HIDE); + + LoadButton(pXmlRoot, _T("Menu"), &m_btnMenu, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Options"), &m_btnOptions, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + + LoadButton(pXmlRoot, _T("SelectAll"), &m_btnSelectAll, TRUE, FALSE); + LoadButton(pXmlRoot, _T("SelectNone"), &m_btnSelectNone, TRUE, FALSE); + + LoadButton(pXmlRoot, _T("Color"), &m_btnColor, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Bold"), &m_btnBold, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Italic"), &m_btnItalic, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Underline"), &m_btnUnderline, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Smiles"), &m_btnSmiles, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Send"), &m_btnSend, TRUE, FALSE); + + LoadLabel(pXmlRoot, _T("Recipient"), &m_UserInfo, TRUE); + + LoadRectangle(pXmlRoot, _T("Users"), &m_treectrl, TRUE); + LoadRectangle2(pXmlRoot, _T("Edit"), m_edit.GetSafeHwnd(), TRUE); + + LoadRectangle2(pXmlRoot, _T("ComboFont"), m_FontCombo.GetSafeHwnd(), TRUE); + LoadRectangle2(pXmlRoot, _T("ComboSize"), m_SizeCombo.GetSafeHwnd(), TRUE); +} + +void CGroupMessageSendDlg::SelectAll(BOOL bSelect) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + pUser->m_bHasNewMessages = bSelect; + } + } + BuildTree(); +} + +//DEL void CGroupMessageSendDlg::SelectNone() +//DEL { +//DEL if(m_ContactList.InitIteration()) +//DEL { +//DEL CUser *pUser=NULL; +//DEL +//DEL while(m_ContactList.GetNext(pUser)) +//DEL { +//DEL pUser->m_bHasNewMessages = FALSE; +//DEL } +//DEL } +//DEL BuildTree(); +//DEL } + +void CGroupMessageSendDlg::Send() +{ + UpdateData(TRUE); + + if(pMessenger->ConnectEnable() && !Handle) + { + // Testirovanie na ne pustoi Send List [2/20/2002] + + if(!EnableRecepients()) + return; + ////////////////////////////////////////////////////////////////////////// + + + CComBSTR bstText; + m_edit.GetHTML(&bstText); + + + // Replace Smile Images + int StartPos = 0, Length = 0; + CSmileInfo currentSmile = FindSmileImage(bstText.m_str, StartPos, Length); + + while(currentSmile!=CSmileInfo::Empty) + { + USES_CONVERSION; + + WCHAR *pBuffer = new WCHAR[Length+1]; + wcsncpy(pBuffer, ((LPCWSTR)bstText.m_str) + StartPos, Length); + pBuffer[Length] = 0; + + int LenPrev = bstText.Length(); + Replace(bstText.m_str,pBuffer, T2CW(currentSmile.GetHtmlSmile())); + + int LenNew = bstText.Length(); + + StartPos = 0; + Length = 0; + + delete pBuffer; + + currentSmile = FindSmileImage(bstText.m_str, StartPos, Length); + } + + /// + CComBSTR bstTmpText = (LPCWSTR)bstText; + bstText.Empty(); + bstText = bstTmpText; + /// + + CComBSTR bsGoodHtml; + while(bstText.Length()>0) + { + bsGoodHtml = SplitHTML(8192,bstText); + + //////// + RemoveParagraf(bsGoodHtml.m_str); + + // + CComBSTR bsTmpGoodHtml = (LPCWSTR)bsGoodHtml; + bsGoodHtml.Empty(); + bsGoodHtml = bsTmpGoodHtml; + //////// + + if(wcslen(bsGoodHtml) ==0) + continue; + + try + { + pMessage = pSession->CreateMessage(); + pMessage->PutMID(GUIDGen()); + pMessage->PutBody((BSTR)bsGoodHtml); + + IUsersPtr pResepients = pMessage->GetRecipients(); + + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pRecipient = NULL; + while(m_ContactList.GetNext(pos,pRecipient)) + { + if(pRecipient->m_bHasNewMessages) + { + IUserPtr pUser = pResepients->AddUser(); + pUser->PutValue("@id",pRecipient->GetGlobalID()); + } + } + + theNet2.LockTranslator(); + try + { + pMessage->Send(&Handle); + if(Handle) + { + Block(); + theNet2.AddToTranslator(Handle,this->m_hWnd); + } + } + catch(...) + {ASSERT(FALSE);} + theNet2.UnlockTranslator(); + } + } + catch(_com_error&) + { + m_edit.SetFocus(); + } + } + + } +} + +void CGroupMessageSendDlg::SelectColor() +{ + CColorDialog m_Color(m_edit.GetColor(), CC_ANYCOLOR,this); + if(m_Color.DoModal()==IDOK) + { + m_edit.SetColor(m_Color.GetColor()); + } + m_edit.SetFocus(); +} + +void CGroupMessageSendDlg::InsertSmile() +{ + // New Smile Addon [2007-02-06] + CMenu smileMenu; + smileMenu.CreatePopupMenu(); + + int index = 0; + for(CSmileInfoListEnum item = CurrentSmileManager.GetSmiles().begin();item!=CurrentSmileManager.GetSmiles().end() && index<(3*8-1);item++,index++) + { + CString str; + str.Format("%s\t%s", (*item).GetText(), (*item).GetSmile()); + + if(index!=0 && (index%8)==0) + VERIFY(smileMenu.AppendMenu(MF_STRING|MF_ENABLED|MF_MENUBREAK, 20001 + (*item).GetIndex(), str)); + else + VERIFY(smileMenu.AppendMenu(MF_STRING|MF_ENABLED, 20001 + (*item).GetIndex(), str)); + + } + + smileMenu.AppendMenu(MF_STRING|MF_ENABLED, 20000, GetString(IDS_SMILES_MORE)); + + CPoint curPoint; + GetCursorPos(&curPoint); + smileMenu.TrackPopupMenu(TPM_LEFTBUTTON,curPoint.x,curPoint.y,this); + // +} + +void CGroupMessageSendDlg::SetFontBold() +{ + m_edit.SetBold(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_BOLD, m_btnBold.GetPressed()); +} + +void CGroupMessageSendDlg::SetFontItalic() +{ + m_edit.SetItalic(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_ITALIC,m_btnItalic.GetPressed()); +} + +void CGroupMessageSendDlg::SetFontUnderline() +{ + m_edit.SetUnderline(); + m_edit.SetFocus(); + WriteOptionInt(IDS_OFSMESSENGER,IDS_UNDERLINE,m_btnUnderline.GetPressed()); +} + +void CGroupMessageSendDlg::SetFontSize() +{ + WriteOptionInt(IDS_OFSMESSENGER,IDS_SIZE,m_SizeCombo.GetCurSel()); + m_edit.SetTextSize(m_SizeCombo.GetCurSel()+1); + // [4/29/2002] + m_edit.SetDefaultFontSize(nFontSizes[m_SizeCombo.GetCurSel()]); + // [4/29/2002] + m_edit.SetFocus(); +} + +void CGroupMessageSendDlg::SetFontFace() +{ + int nIndex = m_FontCombo.GetCurSel(); + + CString strFontName; + m_FontCombo.GetLBText(nIndex, strFontName); + + WriteOptionString(IDS_OFSMESSENGER,IDS_FONT,strFontName); + + CComBSTR bsFontName = strFontName; + m_edit.SetFontName(bsFontName); + // [4/29/2002] + m_edit.SetDefaultFontName(bsFontName); + // [4/29/2002] + m_edit.SetFocus(); +} + +void CGroupMessageSendDlg::OnClickBtnX() +{ + OnCancel(); +} + +BOOL CGroupMessageSendDlg::Create(CWnd *pParentWnd) +{ + if(!COFSNcDlg2::Create(IDD, pParentWnd)) + { + TRACE0("Warning: failed to create CMessageSplitDlg3.\n"); + return FALSE; + } + if(!m_bLoadSkin) + COFSNcDlg2::LoadSkin(); + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_GROUPSENDMESSAGE, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL, rWindow.left, rWindow.top, rWindow.Width(), rWindow.Height(), SWP_NOZORDER|SWP_NOACTIVATE); + } + + return TRUE; +} + +void CGroupMessageSendDlg::OnClickBtnMin() +{ + ShowWindow(SW_MINIMIZE); +} + +void CGroupMessageSendDlg::OnClickBtnOptions() +{ + pMessenger->PreferenceDlg(this); +} + +void CGroupMessageSendDlg::OnClickBtnMenu() +{ +} + +void CGroupMessageSendDlg::OnClickBtnSelectAll() +{ + SelectAll(TRUE); +} + +void CGroupMessageSendDlg::OnClickBtnSelectNone() +{ + SelectAll(FALSE); +} + +void CGroupMessageSendDlg::OnClickBtnColor() +{ + m_bIgnoreActivate = TRUE; + SelectColor(); + m_bIgnoreActivate = FALSE; +} + +void CGroupMessageSendDlg::OnClickBtnBold() +{ + SetFontBold(); +} + +void CGroupMessageSendDlg::OnClickBtnItalic() +{ + SetFontItalic(); +} + +void CGroupMessageSendDlg::OnClickBtnUnderline() +{ + SetFontUnderline(); +} + +void CGroupMessageSendDlg::OnClickBtnSmiles() +{ + InsertSmile(); +} + +void CGroupMessageSendDlg::OnClickBtnSend() +{ + Send(); +} + +void CGroupMessageSendDlg::SetRecipientGroup(LPCTSTR strName, CUserCollection *pUsers) +{ + m_strRecepientGroupName = strName; + + m_UserInfo.SetText(strName); + + m_ContactList.Clear(); + + try + { + CUser* pUser=NULL; + + if(POSITION pos = pUsers->InitIteration()) + { + for(int i=0; pUsers->GetNext(pos,pUser); i++) + { + m_ContactList.SetAt(*pUser); + } + } + } + catch(...) + { + ASSERT(FALSE); + } + + BuildTree(); +} diff --git a/Source/Client/IM-Client/IMClient/GroupMessageSendDlg.h b/Source/Client/IM-Client/IMClient/GroupMessageSendDlg.h new file mode 100644 index 0000000..b7036c5 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/GroupMessageSendDlg.h @@ -0,0 +1,160 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +#include "ccootree.h" +//}}AFX_INCLUDES +#if !defined(AFX_GROUPMESSAGESENDDLG_H__BCFCBDFB_B8A3_4B25_BDE0_F0CAC1363835__INCLUDED_) +#define AFX_GROUPMESSAGESENDDLG_H__BCFCBDFB_B8A3_4B25_BDE0_F0CAC1363835__INCLUDED + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// MessageSplitDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +#include "OfsNCDlg.h" +#include ".\\OFSDhtmlEditCtrl\\OFSDhtmlCtrl.h" +#include "Label.h" +#include "ResizableImage.h" +#include "UserCollection.h" +// CGroupMessageSendDlg dialog + +class CGroupMessageSendDlg : public COFSNcDlg2 +{ +// Construction +public: + void SetRecipientGroup(LPCTSTR strName, CUserCollection* pUsers); + BOOL Create(CWnd *pParentWnd); + void SetFontFace(); + void SetFontSize(); + void SetFontUnderline(); + void SetFontItalic(); + void SetFontBold(); + void InsertSmile(); + void SelectColor(); + void Send(); + void SelectAll(BOOL bSelect); + void UpdateGroupCheck(); + BOOL EnableRecepients(); + void SetBody(LPCTSTR strBody, BOOL bAutoSend = FALSE); + void SetFon(HBITMAP hFon); + void SetRecipientGroup(LPCTSTR strName); + CGroupMessageSendDlg(CMainDlg *pMessenger,CWnd* pParent = NULL); // standard constructor + ~CGroupMessageSendDlg(); + +// Dialog Data + //{{AFX_DATA(CGroupMessageSendDlg) + enum { IDD = IDD_GROUP_MESSAGE_SEND_DIALOG }; + CComboBox m_FontCombo; + CComboBox m_SizeCombo; + CLabel m_UserInfo; + CCCooTree m_treectrl; + CMcButton m_btnBold; + CMcButton m_btnColor; + CMcButton m_btnItalic; + CMcButton m_btnMenu; + CMcButton m_btnMin; + CMcButton m_btnOptions; + CMcButton m_btnSelectAll; + CMcButton m_btnSelectNone; + CMcButton m_btnSend; + CMcButton m_btnSmiles; + CMcButton m_btnUnderline; + CMcButton m_btnX; + //}}AFX_DATA + + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CGroupMessageSendDlg) +public: + virtual BOOL PreTranslateMessage(MSG* pMsg); +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation +protected: + void LoadSkin(IXMLDOMNode *pXmlRoot); + void UpdateGroupID(LPCTSTR strName); + CMapStringToPtr m_GroupTIDMap; + CMapStringToPtr m_UserCheckInGroup; + + CUser* CGroupMessageSendDlg::FindUserInVisualContactList(long TID); + void UpdateID(long UserId); + CUserCollection m_ContactList; + void BuildTree(); + void CreateTree(); + BOOL m_bWasCtrlEnter, m_bWasCtrlExit; + BOOL m_bAutoSend; + CString m_strSetBody; + LPARAM OnSWMSetBody(WPARAM w, LPARAM l); +// CResizableImage m_ResizeFon; + BOOL bIsKillWinodow; +// CSize sFon; +// CBitmap *pFonBmp; +// IMpaWebCustomizerPtr m_WebCustomizer; + BOOL bInitEdit; + CFont m_font; + void KillWindow(); + long Handle; + long MessageTime; + CMainDlg *pMessenger; + CString m_strRecepientGroupName; + BOOL bBlock; + void UnBlock(); + void Block(); + CImageList FontStateList; + IMessagePtr pMessage; + ISessionPtr pSession; + COfsDhtmlEditCtrl m_edit; + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + // Generated message map functions + //{{AFX_MSG(CGroupMessageSendDlg) + afx_msg void OnOk(); + afx_msg LRESULT OnNetEvent(WPARAM w,LPARAM l); + afx_msg void OnSelEndOkFontCombo(); + afx_msg void OnSelEndOkSizeCombo(); + afx_msg void OnEditMenuCopy(); + afx_msg void OnEditMenuCut(); + afx_msg void OnEditMenuDelete(); + afx_msg void OnEditMenuPaste(); + afx_msg void OnUpdateEditMenuCopy(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditMenuCut(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditMenuDelete(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditMenuPaste(CCmdUI* pCmdUI); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnMove(int x, int y); + afx_msg void OnClickMcmenu(); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnDropFiles( HDROP hDropInfo ); + afx_msg void OnActionCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnDoDropCcootreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState); + afx_msg void OnMenuCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnSelectCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnClickBtnX(); + afx_msg void OnClickBtnMin(); + afx_msg void OnClickBtnOptions(); + afx_msg void OnClickBtnMenu(); + afx_msg void OnClickBtnSelectAll(); + afx_msg void OnClickBtnSelectNone(); + afx_msg void OnClickBtnColor(); + afx_msg void OnClickBtnBold(); + afx_msg void OnClickBtnItalic(); + afx_msg void OnClickBtnUnderline(); + afx_msg void OnClickBtnSmiles(); + afx_msg void OnClickBtnSend(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + HRESULT OnEditUpdate(WPARAM w, LPARAM l); + void OnSmileItem(UINT nID); + DECLARE_MESSAGE_MAP() +private: + CCoolMenuManager m_CoolMenuManager; +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // diff --git a/Source/Client/IM-Client/IMClient/HistoryDlg.cpp b/Source/Client/IM-Client/IMClient/HistoryDlg.cpp new file mode 100644 index 0000000..d8d6911 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/HistoryDlg.cpp @@ -0,0 +1,1376 @@ +// HistoryDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "HistoryDlg.h" +#include "MainDlg.h" +#include "loadskins.h" +#include "cdib.h" +#include "MessageDlg.h" + +#include "mcsettings.h" +#include "PageHistorySync.h" +#include "DlgTV.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +const GUID CGID_IWebBrowser = {0xED016940L,0xBD5B,0x11cf,0xBA,0x4E,0x00,0xC0,0x4F,0xD7,0x08,0x16}; + +#define HTMLID_FIND 1 +#define HTMLID_VIEWSOURCE 2 +#define HTMLID_OPTIONS 3 + +///////////////////////////////////////////////////////////////////////////// +// CHistoryDlg dialog +extern CString GetCurrentSkin(); + + +CHistoryDlg::CHistoryDlg(CWnd* pParent /*=NULL*/) + : COFSNcDlg2(CHistoryDlg::IDD, pParent) +{ + EnableAutomation(); + //{{AFX_DATA_INIT(CHistoryDlg) + //}}AFX_DATA_INIT + m_LastFirst = TRUE;//GetOptionInt(IDS_HISTORY,IDS_SORT,FALSE); + m_listType = GetOptionInt(IDS_HISTORY,IDS_MODE,1); + SetBoundary(0,0); + SetCaption(RGB(0,0,0),RGB(0,0,0),0); + m_SynchronizeteHandle = 0L; + pSaverDB = NULL; + m_strSkinSettings = _T("/Shell/History/skin.xml"); + pMessenger = NULL; +} + + +void CHistoryDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CHistoryDlg) + DDX_Control(pDX, IDC_USER_STATIC, m_ctrlUser); + DDX_Check(pDX, IDC_LASTFIRST, m_LastFirst); + DDX_Control(pDX, IDC_MCCLOSE, m_btnX); + DDX_Control(pDX, IDC_MCMINI, m_btnMin); + DDX_Control(pDX, IDC_MCMENU, m_btnMenu); + DDX_Control(pDX, IDC_MCINCOMING, m_btnIncoming); + DDX_Control(pDX, IDC_MCOUTGOING, m_btnOutgoing); + DDX_Control(pDX, IDC_MCDIALOG, m_btnDialog); + DDX_Control(pDX, IDC_MCMAXI, m_btnMax); + DDX_Control(pDX, IDC_MCMAXIMINI, m_btnRestore); + DDX_Control(pDX, IDC_CCOOTREECTRL, m_treebox); + DDX_Control(pDX,IDC_MCPROGRESSCTRL,m_Progress); + DDX_Control(pDX, ID_DHTML_CTRL, m_History); + DDX_Control(pDX, IDC_MCFIND, m_btnFind); + DDX_Control(pDX,IDC_TIMEFILTERMODE_COMBO,m_TimeFilterMode); + DDX_DateTimeCtrl(pDX,IDC_FROMTIME_DATETIMEPICKER,m_FromTime); + DDX_DateTimeCtrl(pDX,IDC_TOTIME_DATETIMEPICKER,m_ToTime); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CHistoryDlg, COFSNcDlg2) + //{{AFX_MSG_MAP(CHistoryDlg) + ON_BN_CLICKED(IDC_LASTFIRST, OnLastfirst) + ON_BN_CLICKED(IDC_DIALOG, OnDialog) + ON_BN_CLICKED(IDC_INCOMING, OnIncoming) + ON_WM_CAPTURECHANGED() + ON_BN_CLICKED(IDC_OUTGOING, OnOutgoing) + ON_WM_SETCURSOR() + ON_WM_LBUTTONDOWN() + ON_COMMAND(ID_HISTORY_SYNHRONIZEHISTORY, OnHistorySynhronizehistory) + ON_UPDATE_COMMAND_UI(ID_HISTORY_SYNHRONIZEHISTORY, OnUpdateHistorySynhronizehistory) + ON_COMMAND(ID_HISTORY_PREFERENCES, OnHistoryPreferences) + ON_WM_PAINT() + ON_WM_DESTROY() + ON_COMMAND(ID_HISTORY_FIND, OnHistoryFind) + ON_CBN_SELENDOK(IDC_TIMEFILTERMODE_COMBO, OnSelendokTimeFilterMode) + ON_NOTIFY(DTN_DATETIMECHANGE, IDC_FROMTIME_DATETIMEPICKER, OnDateTimeChangeFrom) + ON_NOTIFY(DTN_DATETIMECHANGE, IDC_TOTIME_DATETIMEPICKER, OnDateTimeChangeTo) + + //}}AFX_MSG_MAP + ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) + ON_MESSAGE(WM_SAVE_TO_LOCALHISTORY_COMPLETE,OnSaveToLHComplete) +END_MESSAGE_MAP() + +BEGIN_EVENTSINK_MAP(CHistoryDlg, COFSNcDlg2) +//{{AFX_EVENTSINK_MAP(CHistoryDlg) + ON_EVENT(CHistoryDlg, IDC_MCCLOSE, -600 /* Click */, OnClickMcclose, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCMINI, -600 /* Click */, OnClickMcmini, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCMAXI, -600 /* Click */, OnClickMcmaxi, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCMAXIMINI, -600 /* Click */, OnClickMcmaximini, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCMENU, -600 /* Click */, OnClickMcmenu, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCINCOMING, -600 /* Click */, OnClickIncoming, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCOUTGOING, -600 /* Click */, OnClickOutgoing, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCDIALOG, -600 /* Click */, OnClickDialog, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_MCFIND, -600 /* Click */, OnHistoryFind, VTS_NONE) + ON_EVENT(CHistoryDlg, IDC_CCOOTREECTRL, 1 /* Menu */, OnMenuCcootreectrl, VTS_I4 VTS_BOOL) + ON_EVENT(CHistoryDlg, IDC_CCOOTREECTRL, 2 /* Select */, OnSelectCcootreectrl, VTS_I4 VTS_BOOL) + ON_EVENT(CHistoryDlg, IDC_CCOOTREECTRL, 3 /* Action */, OnActionCcootreectrl, VTS_I4 VTS_BOOL) + ON_EVENT(CHistoryDlg, IDC_CCOOTREECTRL, 4 /* Action */, OnDoDropTreectrl, VTS_I4 VTS_BOOL VTS_UNKNOWN VTS_I4 VTS_I4) + ON_EVENT(CHistoryDlg, ID_DHTML_CTRL, 250 /* BeforeNavigate2 */, OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +BEGIN_INTERFACE_MAP(CHistoryDlg, CCmdTarget) +INTERFACE_PART(CHistoryDlg, __uuidof(_IMpaWebCustomizerEvents), Dispatch) +END_INTERFACE_MAP() + +BEGIN_DISPATCH_MAP(CHistoryDlg, CCmdTarget) +//{{AFX_DISPATCH_MAP(CHistoryDlg) +DISP_FUNCTION_ID(CHistoryDlg,"", 18, OnShowContextMenu, VT_EMPTY, VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_PI4) +//}}AFX_DISPATCH_MAP +END_DISPATCH_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CHistoryDlg message handlers + +void CHistoryDlg::OnOK() +{ + //m_History.webbrowser2.Navigate("about:blank",NULL,NULL,NULL,NULL); + //COFSNcDlg2::OnOK(); +} + +void CHistoryDlg::OnCancel() +{ + m_bEnableNavigate = TRUE; + m_History.Navigate(_T("about:blank"), NULL, NULL, NULL, NULL); + + m_treebox.DeleteTree(); + m_ContactList.Clear(); + + COFSNcDlg2::OnCancel(); +} + +void CHistoryDlg::OnLastfirst() +{ + UpdateData(TRUE); + WriteOptionInt(IDS_HISTORY,IDS_SORT,m_LastFirst); + Refresh(); +} + +void CHistoryDlg::OnDialog() +{ + m_listType = 1; + WriteOptionInt(IDS_HISTORY,IDS_MODE,m_listType); + Refresh(); +} + +void CHistoryDlg::OnOutgoing() +{ + m_listType = 3; + WriteOptionInt(IDS_HISTORY,IDS_MODE,m_listType); + Refresh(); +} + +void CHistoryDlg::OnIncoming() +{ + m_listType = 2; + WriteOptionInt(IDS_HISTORY,IDS_MODE,m_listType); + Refresh(); +} + +BOOL CHistoryDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + m_ToolTip.AddTool(&m_btnMin,IDS_TIP_MINIMIZE); + m_ToolTip.AddTool(&m_btnMax,IDS_TIP_MAXIMIZE); + m_ToolTip.AddTool(&m_btnRestore,IDS_TIP_RESTORY); + //m_ToolTip.AddTool(&m_btnMenu,IDS_TIP_MENU); + ////////////////////////////////////////////////////////////////////////// + + HRESULT hr = m_pWebCustomizer.CreateInstance(CLSID_MpaWebCustomizer); + + LPUNKNOWN pDispatch = m_History.GetControlUnknown(); + m_pWebCustomizer->PutRefWebBrowser((LPDISPATCH)pDispatch); + + InitMpaWebEvent(); + + pSession = theNet2.GetSession(); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + +// m_btnMin.SetAutoPressed(TRUE); +// m_btnMin.SetCanStayPressed(FALSE); +// m_btnX.SetAutoPressed(TRUE); +// m_btnX.SetCanStayPressed(FALSE); +// m_btnMenu.SetAutoPressed(TRUE); +// m_btnMenu.SetCanStayPressed(FALSE); +// m_btnMax.SetAutoPressed(TRUE); +// m_btnMax.SetCanStayPressed(FALSE); +// m_btnRestore.SetAutoPressed(TRUE); +// m_btnRestore.SetCanStayPressed(FALSE); + +// m_btnIncoming.SetAutoPressed(FALSE); +// m_btnIncoming.SetCanStayPressed(TRUE); +// m_btnIncoming.SetPressed(FALSE); +// m_btnOutgoing.SetAutoPressed(FALSE); +// m_btnOutgoing.SetCanStayPressed(TRUE); +// m_btnOutgoing.SetPressed(FALSE); +// m_btnDialog.SetAutoPressed(FALSE); +// m_btnDialog.SetCanStayPressed(TRUE); +// m_btnDialog.SetPressed(FALSE); + +// m_btnX.SetWindowPos(NULL,382,13,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_btnMin.SetWindowPos(NULL,360,13,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_btnMenu.SetWindowPos(NULL,13,14,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// m_btnIncoming.SetWindowPos(NULL,218,65,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_btnOutgoing.SetWindowPos(NULL,278,65,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +// m_btnDialog.SetWindowPos(NULL,338,65,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + + CRect windowRect; + GetClientRect(&windowRect); + + m_bEnableNavigate = TRUE; + m_History.Navigate(_T("about:blank"), NULL, NULL, NULL, NULL); + +// m_ctrlUser.SetTextColor(0xffffff); +// m_ctrlUser.SetTransparent(TRUE); +// m_ctrlUser.SetFontName(_T("Arial")); +// m_ctrlUser.SetFontSize(-8); +// m_ctrlUser.SetWindowPos(NULL,17,68,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// m_treebox.SetWindowPos(NULL,13,91,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); + +// m_History.SetWindowPos(NULL,218,92,windowRect.Width()-15-218, windowRect.Height()-44-92,SWP_NOZORDER|SWP_NOACTIVATE); + +// AddAnchor(m_ctrlUser.GetSafeHwnd(),CSize(0,0),CSize(0,0)); +// AddAnchor(&m_History,CSize(0,0),CSize(100,100)); + //AddAnchor(IDCANCEL,CSize(100,100),CSize(100,100)); + //AddAnchor(IDC_LASTFIRST,CSize(100,0),CSize(100,0)); + + switch(m_listType) + { + case 1: + //CheckRadioButton(IDC_INCOMING,IDC_DIALOG,IDC_DIALOG); + m_btnDialog.SetPressed(TRUE); + break; + case 2: + m_btnIncoming.SetPressed(TRUE); + //CheckRadioButton(IDC_INCOMING,IDC_DIALOG,IDC_INCOMING); + break; + case 3: + m_btnOutgoing.SetPressed(TRUE); + //CheckRadioButton(IDC_INCOMING,IDC_DIALOG,IDC_OUTGOING); + break; + } + +// LoadSkin(); + + // Time Filter Addon [5/20/2004] + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_ALL)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_TODAY)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_YESTERDAY)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_THISWEEK)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_LASTWEEK)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_THISMONTH)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_LASTMONTH)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_THISYEAR)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_LASTYEAR)); + m_TimeFilterMode.AddString(GetString(IDS_TIMEFILTER_CUSTOM)); + + // Load Options [5/20/2004] + m_TimeFilterMode.SetCurSel(GetOptionInt(IDS_HISTORY,IDS_TIMEFILTER,5)); + + OnSelendokTimeFilterMode(); + + if(GetOptionInt(IDS_HISTORY,IDS_TIMEFILTER,5)==9) + { + m_FromTime = GetOptionInt(IDS_HISTORY,IDS_FROMTIME_FILTER,0); + m_ToTime = GetOptionInt(IDS_HISTORY,IDS_TOTIME_FILTER,MAXLONG); + } + + UpdateData(FALSE); + + CreateTree(); + + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CHistoryDlg::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_HISTORY,RectToString(rWindow)); + + COFSNcDlg2::OnCaptureChanged(pWnd); +} + +void CHistoryDlg::ShowHistory(CUser &m_FriendUser) +{ + this->m_FriendUser = m_FriendUser; + m_ctrlUser.SetText(this->m_FriendUser.GetShowName()); + + m_ContactList.Clear(); + + pMessenger->GetCopyContactList(m_ContactList,TRUE); + + BuildContactList(); + + + UpdateData(FALSE); + + if(Refresh()) + { + CString strCaption; + strCaption.Format(GetString(IDS_HOSTORY_TITLE_FORMAT),m_FriendUser.GetShowName()); + SetWindowText(strCaption); + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_HISTORY, _T("")); + if(GetStyle()&WS_MAXIMIZE) + { + ShowWindow(SW_SHOW); + } + else + { + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + ShowWindow(SW_SHOWNORMAL); + } + SetForegroundWindow(); + } + m_ctrlUser.Invalidate(FALSE); +} + + +BOOL CHistoryDlg::Refresh() +{ + m_btnDialog.SetPressed(FALSE); + m_btnIncoming.SetPressed(FALSE); + m_btnOutgoing.SetPressed(FALSE); + + switch(m_listType) + { + case 1: + //CheckRadioButton(IDC_INCOMING,IDC_DIALOG,IDC_DIALOG); + m_btnDialog.SetPressed(TRUE); + break; + case 2: + m_btnIncoming.SetPressed(TRUE); + //CheckRadioButton(IDC_INCOMING,IDC_DIALOG,IDC_INCOMING); + break; + case 3: + m_btnOutgoing.SetPressed(TRUE); + //CheckRadioButton(IDC_INCOMING,IDC_DIALOG,IDC_OUTGOING); + break; + } + + if(pMessenger) + { + if(pMessenger->LocalDataBaseEnable()) + { + if(m_TimeFilterMode.GetCurSel()==0) + { + pMessenger->GetLocalHistory()->PutToTimeFilter(-1); + pMessenger->GetLocalHistory()->PutFromTimeFilter(-1); + } + else + { + UpdateTimerInterval(); + + pMessenger->GetLocalHistory()->PutToTimeFilter(m_ToTime.GetTime()); + pMessenger->GetLocalHistory()->PutFromTimeFilter(m_FromTime.GetTime()); + } + } + + IDispatchPtr pDispatch; + pDispatch.Attach(m_History.GetDocument()); + if(pDispatch!=NULL) + return pMessenger->GetMessages/*BySID*/(bstr_t(m_FriendUser.GetShowName()),m_FriendUser.GetGlobalID(), + !m_LastFirst,m_listType,(IUnknown*)pDispatch); + } + + return FALSE; +} + +void CHistoryDlg::SetMessenger(CMainDlg *pMessenger) +{ + this->pMessenger = pMessenger; +} + +void CHistoryDlg::RefreshIfNowThisUser(long Id) +{ + if((GetStyle()&WS_VISIBLE)&&(m_FriendUser.GetGlobalID()==Id)) + { + Refresh(); + } +} + + +BOOL CHistoryDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +{ + if(!(GetStyle()&WS_MAXIMIZE)) + { + CRect StatusRect, miniRect; + + GetClientRect(&StatusRect); + + CPoint point, inPoint; + + ::GetCursorPos(&point); + inPoint = point; + ScreenToClient(&inPoint); + + miniRect = StatusRect;miniRect.InflateRect(-9,-9,-9,-9); + + if(!miniRect.PtInRect(inPoint)) + { + if(inPoint.xminiRect.bottom) + nHitTest = HTBOTTOMLEFT; + else + nHitTest = HTLEFT; + else if(inPoint.x>miniRect.right) + if(inPoint.yminiRect.bottom) + nHitTest = HTBOTTOMRIGHT; + else + nHitTest = HTRIGHT; + else if(inPoint.yminiRect.bottom) + COFSNcDlg2::OnNcLButtonDown(HTBOTTOMLEFT,point); + else + COFSNcDlg2::OnNcLButtonDown(HTLEFT,point); + else if(inPoint.x>miniRect.right) + if(inPoint.yminiRect.bottom) + COFSNcDlg2::OnNcLButtonDown(HTBOTTOMRIGHT,point); + else + COFSNcDlg2::OnNcLButtonDown(HTRIGHT,point); + else if(inPoint.yTrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); +} + +void CHistoryDlg::OnClickIncoming() +{ + OnIncoming(); +} + +void CHistoryDlg::OnClickOutgoing() +{ + OnOutgoing(); +} + +void CHistoryDlg::OnClickDialog() +{ + OnDialog(); +} + +void CHistoryDlg::BuildContactList() +{ + CUser *pUser = NULL; + + m_treebox.DeleteTree(); + + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos, pUser); i++) + { + pUser->m_nIcon = -1; + if(pUser->IsSystemUser()) + pUser->TID = m_treebox.AddItem(0,pUser->GetShowName(),m_ShablonId[10]); + else + pUser->TID = m_treebox.AddItem(0,pUser->GetShowName(),m_ShablonId[9]); + } + } +} + +void CHistoryDlg::CreateTree() +{ + LoadSkins m_LoadSkin; + + IStreamPtr pStream = NULL; + long Error=0; + m_LoadSkin.Load(bstr_t(IBN_SCHEMA)+ bstr_t((LPCTSTR)GetProductLanguage())+bstr_t("/Shell/Main/status.bmp"),&pStream,&Error); + if(pStream) + { + CDib dib(pStream); + CPaintDC dc(this); + HBITMAP hBmp = dib.GetHBITMAP((HDC)dc); + m_treebox.SetImageList((long)hBmp); + if(hBmp) + DeleteObject(hBmp); + } + + short PriorityIndex[10]; + for(int i=0;i<10;i++) + PriorityIndex[i] = -1; + PriorityIndex[0] = 1; + PriorityIndex[1] = 0; + + m_treebox.SetPriority(PriorityIndex); + + for(int i = 0 ;iShowUserMenu(User.GetGlobalID()); + } + + } +} + +void CHistoryDlg::OnSelectCcootreectrl(long TID, BOOL bGroupe) +{ + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + if(pUser) + { + m_FriendUser = *pUser; + m_ctrlUser.SetText(m_FriendUser.GetShowName()); + + if(Refresh()) + { + CString strCaption; + strCaption.Format(GetString(IDS_HOSTORY_TITLE_FORMAT),m_FriendUser.GetShowName()); + SetWindowText(strCaption); + } + m_ctrlUser.Invalidate(FALSE); + } + } +} + +void CHistoryDlg::OnActionCcootreectrl(long TID, BOOL bGroupe) +{ + OnSelectCcootreectrl(TID, bGroupe) ; +} + +CUser* CHistoryDlg::FindUserInVisualContactList(long TID) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos, pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + return NULL; +} + +void CHistoryDlg::ShowHistory() +{ + pMessenger->GetCopyContactList(m_ContactList); + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser; + m_ContactList.GetNext(pos,pUser); + if(pUser) + ShowHistory(*pUser); + } +} + +void CHistoryDlg::OnDoDropTreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState) +{ + SetForegroundWindow(); + + if(!bGroupe) + { + CUser *pUser = FindUserInVisualContactList(TID); + + if(pUser) + { + COleDataObject pData; + pData.Attach((LPDATAOBJECT)pDataObject,FALSE); + + FORMATETC stFormatTEXT = {CF_TEXT,NULL,DVASPECT_CONTENT,-1,TYMED_HGLOBAL}; + FORMATETC stFormatHDROP = {CF_HDROP,NULL,DVASPECT_CONTENT,-1,TYMED_HGLOBAL}; + + STGMEDIUM outData = {0}; + + if(pData.GetData(CF_TEXT,&outData,&stFormatTEXT)) + { + LPCTSTR strText = (LPCTSTR)GlobalLock(outData.hGlobal); + pMessenger->SendMessageToUser(pUser,FALSE,strText); + GlobalUnlock(outData.hGlobal); + } + else if(pData.GetData(CF_HDROP,&outData,&stFormatHDROP)) + { + + SIZE_T Size = GlobalSize(outData.hGlobal); + HGLOBAL hGlobal = GlobalAlloc(GMEM_ZEROINIT,Size); + + memcpy(GlobalLock(hGlobal),GlobalLock(outData.hGlobal),Size); + + GlobalUnlock(hGlobal); + GlobalUnlock(outData.hGlobal); + + pMessenger->PostMessage(WM_SEND_FILE,pUser->GetGlobalID(),(LPARAM)hGlobal); + } + } + } +} + +void CHistoryDlg::OnHistorySynhronizehistory() +{ + CMcSettingsDlg dlg(this); + CPageHistorySync page1(GetString(IDS_HISTORY_SYNC_NAME)); + + dlg.AddPage(&page1); + + if(dlg.DoModal()==IDOK) + { + int Mode = GetOptionInt(IDS_HISTORY,IDS_SYNCMODE,0); + long m_FromTime, m_ToTime; + + switch(Mode) + { + case 0: + m_ToTime = time(NULL); + m_FromTime = m_ToTime - 60*60*24*1; // Секунды Минуты Часы Дни + break; + case 1: + m_ToTime = time(NULL); + m_FromTime = m_ToTime - 60*60*24*7; // Секунды Минуты Часы Дни + break; + case 2: + m_ToTime = time(NULL); + m_FromTime = m_ToTime - 60*60*24*31; // Секунды Минуты Часы Дни + break; + case 3: + m_ToTime = time(NULL); + m_FromTime = m_ToTime - 60*60*24*365; // Секунды Минуты Часы Дни + break; + case 4: + m_FromTime = GetOptionInt(IDS_HISTORY,IDS_FROMTIME,0); + m_ToTime = GetOptionInt(IDS_HISTORY,IDS_TOTIME,time(NULL)); + break; + } + + SinchronizateHistory(m_FromTime,m_ToTime); + } +} + +void CHistoryDlg::OnUpdateHistorySynhronizehistory(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(pMessenger->ConnectEnable(FALSE)&&!pSaverDB); +} + +void CHistoryDlg::SinchronizateHistory(long From, long To) +{ + theNet2.LockTranslator(); + try + { + m_SynchronizeteHandle = pSession->LoadSIDs(From, To); + if(m_SynchronizeteHandle) + { + m_Progress.ShowWindow(SW_NORMAL); + m_Progress.SetRange(0,100); + m_Progress.SetPos(0); + theNet2.AddToTranslator(m_SynchronizeteHandle,GetSafeHwnd()); + } + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); +} + +LRESULT CHistoryDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + IlocalSIDs *pSIDs = NULL; + IMessages *pMessagesList = NULL; + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(m_SynchronizeteHandle); + theNet2.UnlockTranslator(); + + switch(pItem->EventType) + { + case NLT_ESessionsList: + if(SUCCEEDED(AutoUnMarchaling(pItem,(LPUNKNOWN*)&pSIDs))) + { + try + { + LocalSIDUpdate(pSIDs); + } + catch(...) + { + ASSERT(FALSE); + } + pSIDs->Release(); + } + else + { + m_Progress.ShowWindow(SW_HIDE); + } + break; + case NLT_EMessagesList: + if(SUCCEEDED(AutoUnMarchaling(pItem,(LPUNKNOWN*)&pMessagesList))) + { + try + { + SaveMessagesToDataBase(pItem->Handel,pMessagesList); + pMessagesList->Release(); + } + catch(...) + { + ASSERT(FALSE); + } + } + else + { + m_Progress.ShowWindow(SW_HIDE); + if(pSaverDB) + { + delete pSaverDB; + pSaverDB = NULL; + } + } + break; + case NLT_ECommandError: + try + { + MessageBox(GetString(IDS_SYNC_HISTORY_ERROR_NAME),GetString(IDS_ERROR_TITLE)); + m_Progress.ShowWindow(SW_HIDE); + if(pSaverDB) + { + delete pSaverDB; + pSaverDB = NULL; + } + } + catch(...) + { + } + break; + } + + delete pItem; + return 0; +} + +void CHistoryDlg::LocalSIDUpdate(IlocalSIDs *pSid) +{ + long Size = pSid->GetCount(); + + + for(int i=1;i<=Size; i++) + { + IlocalSIDPtr pItem = pSid->GetItem(i); + + if(pItem==NULL) continue; + + bstr_t SID = pItem->GetSID(); + long Count = pItem->GetCount(); + long CountInHistory = 0; + + ////////////////////////////////////////////////////////////////////////// + IComHistIntPtr m_LocalHistory = pMessenger->GetLocalHistory(); + try + { + m_LocalHistory->GetCountForSID(SID,&CountInHistory); + } + catch(...) + { + ASSERT(FALSE); + continue; + } + ////////////////////////////////////////////////////////////////////////// + + if(CountInHistory!=Count) + { + m_LoadedSid.Add(SID); + } + } + + m_Progress.SetRange(0,m_LoadedSid.GetSize()); + CheckProgress(); + LoadNextSID(); + +} + +void CHistoryDlg::CheckProgress() +{ + if(m_LoadedSid.GetSize()) + { + m_Progress.StepIt(); + } + else + { + m_Progress.ShowWindow(SW_HIDE); + CMessageDlg m_Dlg(IDS_SYNCHRONIZE); + m_Dlg.Show(GetString(IDS_SYNC_HISTORY_COMPLETED_NAME)); + } +} + +BOOL CHistoryDlg::LoadNextSID() +{ + if(m_LoadedSid.GetSize()) + { + theNet2.LockTranslator(); + try + { + m_SynchronizeteHandle = pSession->LoadMessages(m_LoadedSid[0]); + if(m_SynchronizeteHandle) + { + theNet2.AddToTranslator(m_SynchronizeteHandle,GetSafeHwnd()); + } + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + + return TRUE; + } + return FALSE; +} + +void CHistoryDlg::SaveMessagesToDataBase(LONG Handle,IMessages *pMessagesList) +{ + IMessagesPtr pMessagesListPtr = pMessagesList; + pSaverDB = new CSaveDataBase( m_LoadedSid.GetAt(0), pMessenger->GetLocalHistory(),pMessagesListPtr,WM_SAVE_TO_LOCALHISTORY_COMPLETE,GetSafeHwnd()); + +} + +HRESULT CHistoryDlg::OnSaveToLHComplete(WPARAM w, LPARAM l) +{ + if(pSaverDB!=NULL) + { + delete pSaverDB; + pSaverDB = NULL; + } + m_LoadedSid.RemoveAt(0); + CheckProgress(); + LoadNextSID(); + + return 0; +} + + +void CHistoryDlg::OnHistoryPreferences() +{ + pMessenger->PreferenceDlg(this); +} + +void CHistoryDlg::OnClickMcmaxi() +{ + ShowWindow(SW_MAXIMIZE); +} + +void CHistoryDlg::OnClickMcmaximini() +{ + ShowWindow(SW_RESTORE); +} + +void CHistoryDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Maximize"), &m_btnMax, TRUE, FALSE, 1); + LoadButton(pXmlRoot, _T("Restore"), &m_btnRestore, TRUE, FALSE, 2); + + LoadButton(pXmlRoot, _T("Menu"), &m_btnMenu, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Incoming"), &m_btnIncoming, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Outgoing"), &m_btnOutgoing, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Dialog"), &m_btnDialog, TRUE, TRUE); + LoadButton(pXmlRoot, _T("Find"), &m_btnFind,TRUE,FALSE); + + LoadRectangle(pXmlRoot, _T("Users"), &m_treebox, TRUE); + LoadRectangle2(pXmlRoot, _T("History"), m_History.GetSafeHwnd(), TRUE, TRUE); + LoadProgress(pXmlRoot, _T("Synchronize"), &m_Progress, FALSE); + LoadLabel(pXmlRoot, _T("User"), &m_ctrlUser, TRUE); + + // Time Filter Addon [5/20/2004] + LoadRectangle(pXmlRoot,_T("TimeFilterMode"),&m_TimeFilterMode,TRUE); + LoadRectangle2(pXmlRoot,_T("FromTimeFilter"),GetDlgItem(IDC_FROMTIME_DATETIMEPICKER)->GetSafeHwnd() ,TRUE); + LoadRectangle2(pXmlRoot,_T("ToTimeFilter"),GetDlgItem(IDC_TOTIME_DATETIMEPICKER)->GetSafeHwnd(),TRUE); +} + +void CHistoryDlg::OnPaint() +{ + COFSNcDlg2::OnPaint(); + m_ctrlUser.Invalidate(); +} + +void CHistoryDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel) +{ + /*if(IsTVFileType(URL->bstrVal)) + { + long cx = 0, cy = 0, tearoff = 0, fullscreen = 0; + GetTargetRect(pDisp, cx, cy, tearoff, fullscreen); + + CDlgTV *pDlg = new CDlgTV; + if(pDlg) + { + pDlg->CreateAutoKiller(URL->bstrVal, GetDesktopWindow(), cx, cy); + *Cancel = TRUE; + } + } + else*/ + { + if(m_bEnableNavigate) + { + m_bEnableNavigate = FALSE; + return; + } + else + { + *Cancel = TRUE; + CString strUrl(URL->bstrVal); + + strUrl = pMessenger->ChangeUrlForCurrentDomain(strUrl); + + m_bEnableNavigate = TRUE; + + if(S_OK != ::NavigateNewWindow(m_History.GetControlUnknown(), strUrl)) + ShellExecute(::GetDesktopWindow(), _T("open"), strUrl, NULL, NULL, SW_SHOWDEFAULT); + + m_bEnableNavigate = FALSE; + } + } +} + +void CHistoryDlg::InitMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + IConnectionPointPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + LPUNKNOWN pInterEvent = GetInterface(&IID_IUnknown); + hr = m_pSessionConnectionPoint->Advise(pInterEvent ,&m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + +void CHistoryDlg::CloseMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + IConnectionPointPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + hr = m_pSessionConnectionPoint->Unadvise(m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + + +void CHistoryDlg::OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow) +{ + *pShow = 0; + + HRESULT hr = S_OK; + HINSTANCE hinstSHDOCLC; + HWND hwnd; + HMENU hMenu; + + CComPtr spCT; + CComPtr spWnd; + + hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT); + if(SUCCEEDED(hr)) + { + hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd); + if(SUCCEEDED(hr)) + { + hr = spWnd->GetWindow(&hwnd); + + if(SUCCEEDED(hr)) + { + hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); + + hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(24641)); + + hMenu = GetSubMenu(hMenu, 4); + + int iSelection = ::TrackPopupMenu(hMenu, + TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, x, y, 0, hwnd, (RECT*)NULL); + + // Пересылаем выбранную команду окну броузера + LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); + + FreeLibrary(hinstSHDOCLC); + } + } + } +} + +void CHistoryDlg::OnDestroy() +{ + CloseMpaWebEvent(); + + COFSNcDlg2::OnDestroy(); +} + + +void CHistoryDlg::OnHistoryFind() +{ + CComPtr lpDispatch = NULL; + CComPtr lpOleCommandTarget = NULL; + + // Get the IDispatch of the document. + // + lpDispatch.Attach(m_History.GetDocument()); + if (lpDispatch) + { + // Get a pointer for the IOleCommandTarget interface. + // + lpDispatch->QueryInterface(IID_IOleCommandTarget, (void**)&lpOleCommandTarget); + + if(lpOleCommandTarget) + { + // Invoke the given command id + // for the WebBrowser control. + HRESULT hr = lpOleCommandTarget->Exec(&CGID_IWebBrowser, HTMLID_FIND, 0, NULL, NULL); + } + } +} + +int CHistoryDlg::UpdateTimerInterval() +{ + CTime currBeginTime = CTime::GetCurrentTime(); + CTime currEndTime = currBeginTime; + int dow = currBeginTime.GetDayOfWeek() - 2; + if(dow == 0) + dow = 6; // Sunday + + int filter = m_TimeFilterMode.GetCurSel(); + switch(filter) + { + case 0: //IDS_TIMEFILTER_ALL + m_FromTime = CTime((time_t)0); + m_ToTime = CTime((time_t)MAXLONG); + break; + case 1: //IDS_TIMEFILTER_TODAY + break; + case 2: //IDS_TIMEFILTER_YESTERDAY + currBeginTime -= CTimeSpan(1, 0, 0, 0); + currEndTime = currBeginTime; + break; + case 3: //IDS_TIMEFILTER_THISWEEK + currBeginTime -= CTimeSpan(7, 0, 0, 0); + break; + case 4: //IDS_TIMEFILTER_LASTWEEK + currBeginTime -= CTimeSpan(7*2, 0, 0, 0); + currEndTime -= CTimeSpan(7, 0, 0, 0); + break; + case 5: //IDS_TIMEFILTER_THISMONTH + currBeginTime -= CTimeSpan(31, 0, 0, 0); + break; + case 6: //IDS_TIMEFILTER_LASTMONTH + currBeginTime -= CTimeSpan(31*2, 0, 0, 0); + currEndTime -= CTimeSpan(31, 0, 0, 0); + break; + case 7: //IDS_TIMEFILTER_THISYEAR + currBeginTime -= CTimeSpan(365, 0, 0, 0); + break; + case 8: //IDS_TIMEFILTER_LASTYEAR + currBeginTime -= CTimeSpan(365*2, 0, 0, 0); + currEndTime -= CTimeSpan(365, 0, 0, 0); + break; + case 9: //IDS_TIMEFILTER_CUSTOM + GetDlgItem(IDC_FROMTIME_DATETIMEPICKER)->EnableWindow(TRUE); + GetDlgItem(IDC_TOTIME_DATETIMEPICKER)->EnableWindow(TRUE); + //currBeginTime = currBeginTime - CTimeSpan(7,0,0,0); + break; + } + + if(filter > 0 && filter<9) + { + m_FromTime = CTime(currBeginTime.GetYear(), currBeginTime.GetMonth(), currBeginTime.GetDay(), 0, 0, 0); + m_ToTime = CTime(currEndTime.GetYear(), currEndTime.GetMonth(), currEndTime.GetDay(), 23, 59, 59); + } + + UpdateData(FALSE); + + return filter; + +} + +void CHistoryDlg::OnSelendokTimeFilterMode() +{ + + GetDlgItem(IDC_FROMTIME_DATETIMEPICKER)->EnableWindow(FALSE); + GetDlgItem(IDC_TOTIME_DATETIMEPICKER)->EnableWindow(FALSE); + + int filter = UpdateTimerInterval(); + + UpdateData(FALSE); + + if(pMessenger!=NULL) + { + WriteOptionInt(IDS_HISTORY,IDS_FROMTIME_FILTER, m_FromTime.GetTime()); + WriteOptionInt(IDS_HISTORY,IDS_TOTIME_FILTER, m_ToTime.GetTime()); + WriteOptionInt(IDS_HISTORY,IDS_TIMEFILTER, filter == -1 ? 0 : filter); + + Refresh(); + } +} + +void CHistoryDlg::OnDateTimeChangeFrom (NMHDR* pNMHDR, LRESULT* pResult) +{ + UpdateData(); + + WriteOptionInt(IDS_HISTORY,IDS_FROMTIME_FILTER,m_FromTime.GetTime()); + + if(pMessenger!=NULL) + Refresh(); +} + +void CHistoryDlg::OnDateTimeChangeTo(NMHDR* pNMHDR, LRESULT* pResult) +{ + UpdateData(); + + WriteOptionInt(IDS_HISTORY,IDS_TOTIME_FILTER,m_ToTime.GetTime()); + + if(pMessenger!=NULL) + Refresh(); + +} + + diff --git a/Source/Client/IM-Client/IMClient/HistoryDlg.h b/Source/Client/IM-Client/IMClient/HistoryDlg.h new file mode 100644 index 0000000..deb07f9 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/HistoryDlg.h @@ -0,0 +1,146 @@ +//{{AFX_INCLUDES() +#include "ccootree.h" +#include "webbrowser2.h" +//}}AFX_INCLUDES +#if !defined(AFX_HISTORYDLG_H__241D0929_C03B_4F70_ADB1_35D4ACE99150__INCLUDED_) +#define AFX_HISTORYDLG_H__241D0929_C03B_4F70_ADB1_35D4ACE99150__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// HistoryDlg.h : header file +// +#include "OfsNCDlg2.h" +#include "Usercollection.h" +#include "ResizableImage.h" +#include "McButton.h" +#include "McProgress.h" +#include "Label.h" +#include "SaveDataBase.h" + +class CMainDlg; +///////////////////////////////////////////////////////////////////////////// +// CHistoryDlg dialog + +class CHistoryDlg : public COFSNcDlg2 +{ +// Construction +public: + void ShowHistory(); + void CreateTree(); + void BuildContactList(); + void RefreshIfNowThisUser(long Id); + void SetMessenger(CMainDlg *pMessenger); + CUser m_FriendUser; + BOOL Refresh(); + void ShowHistory(CUser &m_FriendUser); + CHistoryDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CHistoryDlg) + enum { IDD = IDD_DIALOG_HISORY }; + CLabel m_ctrlUser; + BOOL m_LastFirst; + long m_listType; //1,2,3 + CMcButton m_btnX; + CMcButton m_btnMin; + CMcButton m_btnMax; + CMcButton m_btnRestore; + CMcButton m_btnMenu; + CMcButton m_btnDialog; + CMcButton m_btnIncoming; + CMcButton m_btnOutgoing; + CMcButton m_btnFind; + CCCooTree m_treebox; + CMcProgress m_Progress; + CWebBrowser2 m_History; + // Time Filter Addon [5/20/2004] + CComboBox m_TimeFilterMode; + CTime m_FromTime; + CTime m_ToTime; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CHistoryDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + int UpdateTimerInterval(); + void InitMpaWebEvent(); + void CloseMpaWebEvent(); + + BOOL m_bEnableNavigate; + void LoadSkin(IXMLDOMNode *pXmlRoot); + ISessionPtr pSession; + + HRESULT OnSaveToLHComplete(WPARAM w, LPARAM l); + void SaveMessagesToDataBase(LONG Handle,IMessages *pMessagesList); + BOOL LoadNextSID(); + void CheckProgress(); + void LocalSIDUpdate(IlocalSIDs *pSid); + void SinchronizateHistory(long From, long To); + void OnDoDropTreectrl(long TID, BOOL bGroupe, LPUNKNOWN pDataObject, long DropEffect, long LastKeyState); + CUser* FindUserInVisualContactList(long TID); + + CMainDlg *pMessenger; + CResizableImage m_ResizeFon; + CUserCollection m_ContactList; + long m_SynchronizeteHandle; + CSaveDataBase *pSaverDB; + CArray m_LoadedSid; + IMpaWebCustomizerPtr m_pWebCustomizer; + DWORD m_dwSessionCookie; + + // Generated message map functions + //{{AFX_MSG(CHistoryDlg) + virtual void OnOK(); + virtual void OnCancel(); + afx_msg void OnLastfirst(); + afx_msg void OnDialog(); + afx_msg void OnIncoming(); + virtual BOOL OnInitDialog(); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnOutgoing(); + afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnClickMcclose(); + afx_msg void OnClickMcmini(); + afx_msg void OnClickMcmaxi(); + afx_msg void OnClickMcmaximini(); + afx_msg void OnClickMcmenu(); + afx_msg void OnClickIncoming(); + afx_msg void OnClickOutgoing(); + afx_msg void OnClickDialog(); + afx_msg void OnMenuCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnSelectCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnActionCcootreectrl(long TID, BOOL bGroupe); + afx_msg void OnHistorySynhronizehistory(); + afx_msg void OnUpdateHistorySynhronizehistory(CCmdUI* pCmdUI); + afx_msg void OnHistoryPreferences(); + afx_msg void OnPaint(); + afx_msg void OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel); + afx_msg void OnDestroy(); + afx_msg void OnHistoryFind(); + afx_msg void OnSelendokTimeFilterMode(); + afx_msg void OnDateTimeChangeFrom (NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnDateTimeChangeTo(NMHDR* pNMHDR, LRESULT* pResult); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + afx_msg void OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow); + DECLARE_INTERFACE_MAP() + DECLARE_DISPATCH_MAP() + + LRESULT OnNetEvent(WPARAM w,LPARAM l); + + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_HISTORYDLG_H__241D0929_C03B_4F70_ADB1_35D4ACE99150__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/HttpDownloader.cpp b/Source/Client/IM-Client/IMClient/HttpDownloader.cpp new file mode 100644 index 0000000..20de735 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/HttpDownloader.cpp @@ -0,0 +1,628 @@ +// HttpDownloader.cpp: implementation of the CHttpDownloader class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "HttpDownloader.h" +#include "Resource.h" +#include "GlobalFunction.h" + +#include "atlenc.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CHttpDownloader::CHttpDownloader() +{ + m_hInternet = 0; + m_hConnect = 0; + m_hRequest = 0; + m_longAbort = FALSE; + m_pStream = NULL; + m_hWnd = NULL; + m_nMessage = 0; + m_dwTotalSize = 0; + m_dwDownloaded = 0; + + m_dwTimeout = 60000; + m_dwConnectRetryCount = 3; + + m_ProxyType = GetOptionInt(IDS_NETOPTIONS, IDS_ACCESSTYPE, INTERNET_OPEN_TYPE_PRECONFIG); + m_ProxyName.Format(_T("http=http://%s:%s"), GetOptionString(IDS_NETOPTIONS, IDS_PROXYNAME, _T("")), GetOptionString(IDS_NETOPTIONS, IDS_PROXYPORT, _T(""))); + +// m_UseFireWall = GetOptionInt(IDS_NETOPTIONS, IDS_USEFIREWALL, FALSE); +// m_FireWallUser = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, ""); +// m_FireWallPass = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, ""); + + m_hEvent = ::CreateEvent(NULL, TRUE, TRUE, NULL); +} + +CHttpDownloader::~CHttpDownloader() +{ + Clear(); + if(m_pStream) + { + m_pStream->Release(); + m_pStream = NULL; + } + CloseHandle(m_hEvent); +} + +HRESULT CHttpDownloader::ConnectToServer(_bstr_t &strBuffer) +{ + BOOL bResult; + DWORD dwStatus; + DWORD nTimeoutCounter; + _bstr_t strMethod; + _bstr_t strUrl = m_request.url; + + LPCTSTR szProxyName = NULL; + if(m_ProxyType == INTERNET_OPEN_TYPE_PROXY) + szProxyName = m_ProxyName; + +//// InternetOpen \\\\ + if(!m_hInternet) + m_hInternet = InternetOpen(_T("McHttpDownloader"), m_ProxyType, szProxyName, NULL, INTERNET_FLAG_ASYNC); + if(!m_hInternet) + { + strBuffer = _T("InternetOpen failed"); + return E_FAIL; + } + + + InternetSetStatusCallback(m_hInternet, (INTERNET_STATUS_CALLBACK)CallbackFunc); +//// InternetOpen //// + + if(m_longAbort > 0) + return E_ABORT; + +//// InternetConnect \\\\ + if(!m_hConnect) + { + m_hConnect = InternetConnect(m_hInternet, m_request.server, (short)m_request.port, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, (DWORD)&m_context); + } + if(m_hConnect == NULL) + { + strBuffer = _T("InternetConnect failed"); + return INET_E_CANNOT_CONNECT; + } +//// InternetConnect //// + + nTimeoutCounter = 0; + +NewConnect: + + strMethod = _T("GET"); + strBuffer = _T(""); + +//// OpenRequest \\\\ + if(m_hRequest) + { + ::InternetCloseHandle(m_hRequest); + m_hRequest = NULL; + } + + if(m_longAbort > 0) + return E_ABORT; + + DWORD dwFlags = + INTERNET_FLAG_KEEP_CONNECTION | + INTERNET_FLAG_NO_CACHE_WRITE | + INTERNET_FLAG_RELOAD | + INTERNET_FLAG_PRAGMA_NOCACHE | + INTERNET_FLAG_NO_UI | + INTERNET_FLAG_NO_COOKIES | + INTERNET_FLAG_IGNORE_CERT_CN_INVALID | + INTERNET_FLAG_NO_AUTO_REDIRECT | + INTERNET_FLAG_HYPERLINK | + (m_request.bUseSSL ? + (INTERNET_FLAG_SECURE/*| + INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS| + INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP*/) + : + 0); + + m_context.op = HTTP_DOWNLOADER_OP_OPEN_REQUEST; + m_hRequest = HttpOpenRequest(m_hConnect, strMethod, strUrl, _T("HTTP/1.1"), NULL, NULL, dwFlags, (DWORD)&m_context); + if(m_hRequest == NULL) + { + strBuffer = _T("HttpOpenRequest failed"); + return E_FAIL; + } + + if(m_ProxyType == INTERNET_OPEN_TYPE_PROXY) + { + if(GetOptionInt(IDS_NETOPTIONS,IDS_USEFIREWALL,0)) + { + CString fireWallUser = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, _T("")); + CString fireWallPass = GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, _T("")); + + ////////////////////////////////////////////////////////////////////////// + + int HeaderLen = ATL::ProxyAuthorizationStringGetRequiredLength(fireWallUser, fireWallPass); + LPTSTR strHeader = new TCHAR[HeaderLen+1]; + ZeroMemory(strHeader,HeaderLen+1); + + HRESULT hr = ATL::ProxyAuthorizationString(fireWallUser, fireWallPass, strHeader, &HeaderLen); + + ASSERT(hr==S_OK); + + HttpAddRequestHeaders(m_hRequest, strHeader, HeaderLen, HTTP_ADDREQ_FLAG_ADD ); + + delete []strHeader; + ////////////////////////////////////////////////////////////////////////// + } + } + +//// OpenRequest //// + +NewRequest: + + if(m_longAbort > 0) + return E_ABORT; + + m_context.op = HTTP_DOWNLOADER_OP_SEND_REQUEST; + bResult = HttpSendRequest(m_hRequest, NULL , 0, (LPVOID)(BYTE*)(LPCTSTR)strBuffer, lstrlen(strBuffer)); + if(!bResult && 997 == GetLastError()) // Overlapped I/O operation is in progress. + bResult = WaitForComplete(m_dwTimeout); // Resolve host name, connect, send request, receive response. + if(!bResult) + { + DWORD dwErrCode = GetLastError(); +// ATLTRACE("Send Request error = %d \r\n",dwErrCode); + + if(dwErrCode == 6) // The handle is invalid. + goto NewConnect; + + if(dwErrCode == ERROR_INTERNET_TIMEOUT) // timeout + { + if(++nTimeoutCounter < m_dwConnectRetryCount) + goto NewConnect; + else + { + strBuffer = _T("Timeout"); + return E_FAIL;//INET_E_CONNECTION_TIMEOUT; + } + } + + strBuffer = _T("SendRequest failed"); + return E_FAIL; + } + + dwStatus = GetHttpStatus(); + + if(dwStatus == 401 || dwStatus == 407) // Denied or Proxy asks password + { + if(ERROR_INTERNET_FORCE_RETRY == + InternetErrorDlg(GetDesktopWindow(), m_hRequest, + ERROR_INTERNET_INCORRECT_PASSWORD, + FLAGS_ERROR_UI_FILTER_FOR_ERRORS | + FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | + FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, + NULL)) + { + goto NewRequest; + } + + } + + if(dwStatus != 200) // Not OK + { + strBuffer = _T("SendRequest returned with error"); + return INET_E_CANNOT_CONNECT; + } + + return S_OK; +} + +DWORD CHttpDownloader::GetHttpStatus() +{ + LPVOID lpOutBuffer = new char[4]; + DWORD dwSize = 4; + DWORD Status = 0; + DWORD err = 0; + BOOL bResult; + +ret: + m_context.op = HTTP_DOWNLOADER_OP_GET_STATUS; + bResult = HttpQueryInfo(m_hRequest, HTTP_QUERY_STATUS_CODE, (LPVOID)lpOutBuffer, &dwSize, NULL); + if(!bResult&&997 == GetLastError()) + WaitForComplete(m_dwTimeout); + if(!bResult) + { + err = GetLastError(); + + if(err == ERROR_HTTP_HEADER_NOT_FOUND) + { + return false; //throw(); + } + else + { + if (err == ERROR_INSUFFICIENT_BUFFER) + { + if(lpOutBuffer!=NULL) + delete[] lpOutBuffer; + + lpOutBuffer = new char[dwSize]; + goto ret; + } + else + { + return Status; //throw(); + } + } + } + else + { +// ATLTRACE("HTTP STATUS - %s \r\n", lpOutBuffer); + Status = atol((char*)lpOutBuffer); + delete[] lpOutBuffer; + lpOutBuffer = NULL; + + return Status; + } +} + +HRESULT CHttpDownloader::WorkFunction() +{ + HRESULT hr; + _bstr_t strBuffer; + + strBuffer = _T(""); + + if(m_longAbort > 0) + { + hr = E_ABORT; + goto EndWorkFunc; + } + + if(m_request.pCritSect) + EnterCriticalSection(m_request.pCritSect); + + if(m_longAbort > 0) + { + hr = E_ABORT; + goto EndWorkFunc; + } + + hr = ConnectToServer(strBuffer); + if(FAILED(hr)) + goto EndWorkFunc; + + hr = ReadData(strBuffer); + if(FAILED(hr) || m_dwDownloaded < m_dwTotalSize) + { + strBuffer = _T("Cannot read data"); + goto EndWorkFunc; + } + +EndWorkFunc: + +// TRACE(_T("HTTP OPERATION = %d\n"), m_context.op); + + Clear(); + + if(m_pStream) + { + LARGE_INTEGER li = {0, 0}; + hr = m_pStream->Seek(li, STREAM_SEEK_SET, NULL); + } + + if(m_request.pCritSect) + { + try + { + LeaveCriticalSection(m_request.pCritSect); + } + catch(...) + { +// MCTRACE(0, _T("LeaveCriticalSection(%08x)"), m_request.pCritSect); + } + } + + return hr; +} + +HRESULT CHttpDownloader::ReadData(_bstr_t &strBuffer) +{ + HRESULT hr = E_FAIL; + IStream *pStream = NULL; + INTERNET_BUFFERS ib ={0}; + ULONG ulWritten; + BOOL bResult; + DWORD dwErr; + + TCHAR buf[32]; + DWORD dwBufferLength; + TCHAR *szNULL = _T("\x0"); + + + // Get file size + dwBufferLength = 32*sizeof(TCHAR); + if(::HttpQueryInfo(m_hRequest, HTTP_QUERY_CONTENT_LENGTH, buf, &dwBufferLength, NULL)) + { + m_dwTotalSize = _tcstoul(buf, &szNULL, 10); + if(m_hWnd != NULL && m_nMessage != 0) + ::PostMessage(m_hWnd, m_nMessage, m_dwDownloaded, m_dwTotalSize); + } + + //Check MD5 hash + if(m_request.md5 != NULL && _tcslen(m_request.md5) >= 22) + { + dwBufferLength = 32*sizeof(TCHAR); + if(::HttpQueryInfo(m_hRequest, HTTP_QUERY_CONTENT_MD5, buf, &dwBufferLength, NULL)) + { + if(0 == _tcsnicmp(m_request.md5, buf, 22)) + { + if(m_hWnd != NULL && m_nMessage != 0) + ::PostMessage(m_hWnd, m_nMessage, m_dwTotalSize, m_dwTotalSize); + } + return S_OK; + } + } + + + hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream); + if(FAILED(hr)) + { + return hr; + } + + ib.lpcszHeader = NULL; + ib.dwHeadersLength = NULL; + ib.lpvBuffer = new TCHAR[COMMAND_BUFF_SIZE_PART]; + ib.dwBufferLength = COMMAND_BUFF_SIZE_PART; + ib.dwStructSize = sizeof(ib); + + do + { + ib.dwBufferLength = COMMAND_BUFF_SIZE_PART; + + if(m_longAbort > 0) + { + hr = E_ABORT; + break; + } + + m_context.op = HTTP_DOWNLOADER_OP_READ_DATA; + bResult = InternetReadFileEx(m_hRequest, &ib, IRF_ASYNC | IRF_USE_CONTEXT, (DWORD)&m_context); + dwErr = GetLastError(); + if(!bResult && dwErr == 997) // Overlapped I/O operation is in progress. + { + bResult = WaitForComplete(m_dwTimeout); + if(bResult) + continue; + } + + if(bResult) + { + if(ib.dwBufferLength) + { + hr = pStream->Write(ib.lpvBuffer, ib.dwBufferLength, &ulWritten); + if(FAILED(hr)) + { + strBuffer = _T("Cannot write to stream"); + break; + } + m_dwDownloaded += ib.dwBufferLength; + if(m_hWnd != NULL && m_nMessage != 0) + ::PostMessage(m_hWnd, m_nMessage, m_dwDownloaded, m_dwTotalSize); + } + } + else + { + hr = E_FAIL; + break; + } +// Sleep(1); + } while(ib.dwBufferLength); + + if(ib.lpvBuffer) + { + delete[] ib.lpvBuffer; + ib.lpvBuffer = NULL; + } + + if(SUCCEEDED(hr) && pStream) + { + m_pStream = pStream; + return hr; + } + else + { + if(pStream) + pStream->Release(); + pStream = NULL; + } + + return hr; +} + +HRESULT CHttpDownloader::Load(LPCTSTR szUrl, IStream **ppStream, LPCTSTR szMD5) +{ + HRESULT hr = E_FAIL; + + m_longAbort = 0; + Clear(); + + *ppStream = NULL; + m_dwDownloaded = 0; + m_dwTotalSize = 0; + + m_request.md5 = szMD5; + hr = ParseUrl(szUrl); + if(SUCCEEDED(hr)) + { + if(m_pStream) + { + m_pStream->Release(); + m_pStream = NULL; + } + + m_context.op = HTTP_DOWNLOADER_OP_IDLE; + m_context.hEvent = m_hEvent; + SetEvent(m_hEvent); + + hr = WorkFunction(); + if(SUCCEEDED(hr)) + { + m_pStream->AddRef(); + *ppStream = m_pStream; + } + } + return hr; +} + +HRESULT CHttpDownloader::ParseUrl(LPCTSTR szUrlIn) +{ + if(!lstrlen(szUrlIn)) + return INET_E_INVALID_URL; + + URL_COMPONENTS uc; + memset(&uc, 0, sizeof(uc)); + uc.dwStructSize = sizeof(uc); + + TCHAR szServer[1024]; + TCHAR szUrl[1024]; +// TCHAR szScheme[1024]; + + uc.lpszHostName = szServer; + uc.dwHostNameLength = sizeof(szServer); + uc.lpszUrlPath = szUrl; + uc.dwUrlPathLength = sizeof(szUrl); + +// uc.lpszScheme =szScheme; +// uc.dwSchemeLength = sizeof(szScheme); + + if(!InternetCrackUrl(szUrlIn, lstrlen(szUrlIn), 0, &uc)) + return INET_E_INVALID_URL; + + if(uc.nScheme==INTERNET_SCHEME_HTTPS) + m_request.bUseSSL = TRUE; + + if(lstrlen(szServer)) + m_request.server = szServer; + if(uc.nPort != 0) + m_request.port = uc.nPort; + if(lstrlen(szUrl)) + m_request.url = szUrl; + + return S_OK; +} + + +void CHttpDownloader::EnableProgress(HWND hWnd, UINT nMessage) +{ + m_hWnd = hWnd; + m_nMessage = nMessage; +} + +void CHttpDownloader::Abort() +{ + InterlockedExchange(&m_longAbort, 1); + Clear(); + SetEvent(m_hEvent); +} + +void CHttpDownloader::Clear() +{ + if(m_hRequest) + { + InternetCloseHandle(m_hRequest); + m_hRequest = NULL; + } + if(m_hConnect) + { + InternetCloseHandle(m_hConnect); + m_hConnect = NULL; + } + if(m_hInternet) + { + InternetCloseHandle(m_hInternet); + m_hInternet = NULL; + } +} + +void __stdcall CHttpDownloader::CallbackFunc(HINTERNET hInternet, DWORD dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength) +{ + // TRACE(_T("INTERNET CALLBACK %08x %08x %d\n"), hInternet, dwContext, dwInternetStatus); + if(IsBadWritePtr((LPVOID)dwContext,sizeof(CHttpDownloader :: HttpDownloaderContext))) + return; + + CHttpDownloader::HttpDownloaderContext *pContext = (CHttpDownloader::HttpDownloaderContext*)dwContext; + INTERNET_ASYNC_RESULT* pINTERNET_ASYNC_RESULT = NULL; + + BOOL bRetVal = FALSE; + + switch (dwInternetStatus) + { + case INTERNET_STATUS_REQUEST_COMPLETE: + pINTERNET_ASYNC_RESULT = (INTERNET_ASYNC_RESULT*)lpvStatusInformation; + + if(pINTERNET_ASYNC_RESULT->dwError!=ERROR_INTERNET_OPERATION_CANCELLED) + { + pContext->dwError = pINTERNET_ASYNC_RESULT->dwError; + bRetVal = SetEvent(pContext->hEvent); + } + break; + + /* + case INTERNET_STATUS_RESPONSE_RECEIVED: + if(pContext) + { + if(pContext->op == HTTP_DOWNLOADER_OP_READ_DATA) + SetEvent(pContext->hEvent); + } + break;*/ + + + case INTERNET_STATUS_RESOLVING_NAME: + case INTERNET_STATUS_NAME_RESOLVED: + case INTERNET_STATUS_CONNECTING_TO_SERVER: + case INTERNET_STATUS_CONNECTED_TO_SERVER: + case INTERNET_STATUS_SENDING_REQUEST: + case INTERNET_STATUS_REQUEST_SENT: + case INTERNET_STATUS_RECEIVING_RESPONSE: + case INTERNET_STATUS_CTL_RESPONSE_RECEIVED: + case INTERNET_STATUS_PREFETCH: + case INTERNET_STATUS_CLOSING_CONNECTION: + case INTERNET_STATUS_CONNECTION_CLOSED: + case INTERNET_STATUS_HANDLE_CREATED: + case INTERNET_STATUS_HANDLE_CLOSING: + case INTERNET_STATUS_REDIRECT: + case INTERNET_STATUS_INTERMEDIATE_RESPONSE: + case INTERNET_STATUS_STATE_CHANGE: + default: + break; + } +} + +BOOL CHttpDownloader::WaitForComplete(DWORD dwMilliseconds) +{ + ResetEvent(m_hEvent); + DWORD dw = WaitForSingleObject(m_hEvent, dwMilliseconds); + //TRACE("\r\n == after WaitForSingleObject == \r\n"); + if(m_longAbort > 0) + { +// TRACE(_T("WaitForComplete: ABORTED, OP = %d\n"), m_context.op); + SetLastError(ERROR_INTERNET_CONNECTION_ABORTED); + return FALSE; + } + if(dw == WAIT_TIMEOUT) + { +// TRACE(_T("WaitForComplete: TIMEOUT, OP = %d\n"), m_context.op); + SetLastError(ERROR_INTERNET_TIMEOUT); + return FALSE; + } + + if(m_context.dwError != ERROR_SUCCESS) + return FALSE; + + return (dw == WAIT_OBJECT_0); +} diff --git a/Source/Client/IM-Client/IMClient/HttpDownloader.h b/Source/Client/IM-Client/IMClient/HttpDownloader.h new file mode 100644 index 0000000..c92ab0a --- /dev/null +++ b/Source/Client/IM-Client/IMClient/HttpDownloader.h @@ -0,0 +1,93 @@ +// HttpDownloader.h: interface for the CHttpDownloader class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_HTTPDOWNLOADER_H__FECDAEE1_D128_4C33_BD01_0257769458FF__INCLUDED_) +#define AFX_HTTPDOWNLOADER_H__FECDAEE1_D128_4C33_BD01_0257769458FF__INCLUDED_ + +#include +#include + +#define COMMAND_BUFF_SIZE_PART 1024 + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +typedef enum +{ + HTTP_DOWNLOADER_OP_IDLE = 0, + HTTP_DOWNLOADER_OP_CONNECT, + HTTP_DOWNLOADER_OP_OPEN_REQUEST, + HTTP_DOWNLOADER_OP_SEND_REQUEST, + HTTP_DOWNLOADER_OP_READ_DATA, + HTTP_DOWNLOADER_OP_GET_STATUS +} HTTP_DOWNLOADER_OPERATION; + +class CHttpDownloader +{ +public: + CHttpDownloader(); + ~CHttpDownloader(); + + struct HttpDownloaderContext + { + HTTP_DOWNLOADER_OPERATION op; + HANDLE hEvent; + DWORD dwError; // Set in internet callback func + } m_context; + +protected: + BOOL WaitForComplete(DWORD dwMilliseconds); + static void __stdcall CallbackFunc(HINTERNET hInternet, DWORD dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength); + HANDLE m_hEvent; + void Clear(); + DWORD m_dwTotalSize; + DWORD m_dwDownloaded; + HWND m_hWnd; // Window handle for progress notification + UINT m_nMessage; // Message for progress notification. WPARAM = Downloaded, LPARAM = Total Size + + struct tagRequestInfo + { + CRITICAL_SECTION *pCritSect; + DWORD port; + _bstr_t server; + _bstr_t url; + LPCTSTR md5; + BOOL bUseSSL; + + tagRequestInfo() + { + port = 0; + pCritSect = NULL; + md5 = NULL; + bUseSSL = FALSE; + } + } m_request; + +// static HttpDownloaderContext m_context; + + HINTERNET m_hInternet; + HINTERNET m_hConnect; + HINTERNET m_hRequest; + + long m_longAbort; + IStream *m_pStream; + + HRESULT WorkFunction(); + HRESULT ParseUrl(LPCTSTR szUrlIn); + HRESULT ReadData(_bstr_t &strBuffer); + HRESULT ConnectToServer(_bstr_t &strBuffer); + DWORD GetHttpStatus(); + public: + DWORD m_ProxyType; + CString m_ProxyName; + + DWORD m_dwConnectRetryCount; + DWORD m_dwTimeout; + void Abort(); + void EnableProgress(HWND hWnd, UINT nMessage); + HRESULT Load(LPCTSTR szUrl, IStream **ppStream, LPCTSTR szMD5 = NULL); +}; + +#endif // !defined(AFX_HTTPDOWNLOADER_H__FECDAEE1_D128_4C33_BD01_0257769458FF__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/IBNTO_MESSAGE.cpp b/Source/Client/IM-Client/IMClient/IBNTO_MESSAGE.cpp new file mode 100644 index 0000000..84e1f78 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IBNTO_MESSAGE.cpp @@ -0,0 +1,83 @@ +// IBNTO_MESSAGE.cpp: implementation of the IBNTO_MESSAGE class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "IBNTO_MESSAGE.h" +#include + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +IBNTO_MESSAGE::IBNTO_MESSAGE() +{ +} + +IBNTO_MESSAGE::~IBNTO_MESSAGE() +{ +} + +BOOL IBNTO_MESSAGE::Parse(LPCTSTR szURL) +{ + BOOL ret = FALSE; + LPCTSTR szIbnTo = _T("ibnto:"); + CString str = szURL; + str.MakeLower(); + int n = str.Find(szIbnTo); + if(n >= 0) + { + LPCTSTR szBegin = szURL + n + _tcslen(szIbnTo); + LPCTSTR szEnd = szURL + _tcslen(szURL); + LPCTSTR sz = szBegin; + // Get login and domain + while(sz < szEnd && *sz != _T('?')) + sz++; + str = CString(szBegin, sz-szBegin); + + CStringArray MailboxArray; + + int CommaIndex = -1; + while((CommaIndex = str.Find(_T(",")))>0) + { + MailboxArray.Add(str.Mid(0,CommaIndex)); + str = str.Mid(CommaIndex+1); + } + if(str.GetLength()>0) + MailboxArray.Add(str); + + for(int MailboxArrayIndex = 0 ; MailboxArrayIndex 0) + { + CString strLogin = str.Left(n); + Unescape(&strLogin); + CString strDomain = str.Mid(n+1); + Unescape(&strDomain); + + Logins.Add(LoginItem(strLogin,strDomain)); + } + } + + sz++; + szBegin = sz; + // Get message body + while(sz < szEnd) + sz++; + Message = CString(szBegin, sz-szBegin); + Unescape(&Message); + ret = TRUE; + } + return ret; +} + +void IBNTO_MESSAGE::Unescape(CString* pstr) +{ + DWORD dwSize = pstr->GetLength(); + LPTSTR sz = pstr->GetBuffer(dwSize); + HRESULT hr = UrlUnescape(sz, NULL, &dwSize, URL_DONT_UNESCAPE_EXTRA_INFO|URL_UNESCAPE_INPLACE); + pstr->ReleaseBuffer(); +} \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/IBNTO_MESSAGE.h b/Source/Client/IM-Client/IMClient/IBNTO_MESSAGE.h new file mode 100644 index 0000000..921b63c --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IBNTO_MESSAGE.h @@ -0,0 +1,44 @@ +// IBNTO_MESSAGE.h: interface for the IBNTO_MESSAGE class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_IBNTO_MESSAGE_H__04997910_7F65_436A_9EE7_EE2128025222__INCLUDED_) +#define AFX_IBNTO_MESSAGE_H__04997910_7F65_436A_9EE7_EE2128025222__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +struct LoginItem +{ + LoginItem() + { + Login = _T(""); + Domain = _T(""); + } + + LoginItem(LPCTSTR Login, LPCTSTR Domain) + { + this->Login = Login; + this->Domain = Domain; + } + + CString Login; + CString Domain; +}; + +class IBNTO_MESSAGE +{ +public: + CArray Logins; + + CString Message; + + IBNTO_MESSAGE(); + virtual ~IBNTO_MESSAGE(); + + BOOL Parse(LPCTSTR szURL); + void Unescape(CString* pstr); +}; + +#endif // !defined(AFX_IBNTO_MESSAGE_H__04997910_7F65_436A_9EE7_EE2128025222__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/IBNToHandlerWindow.cpp b/Source/Client/IM-Client/IMClient/IBNToHandlerWindow.cpp new file mode 100644 index 0000000..95b030c --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IBNToHandlerWindow.cpp @@ -0,0 +1,139 @@ +// IBNToHandlerWindow.cpp: implementation of the CIBNToHandlerWindow class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "IBNToHandlerWindow.h" + +extern UINT g_IbnToMessage; + +BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM l) +{ + BOOL bResult = TRUE; + TCHAR szBuf[100]; + EnumWindowsParams *p = reinterpret_cast(l); + + if(p == NULL) + return FALSE; + + if(::GetClassName(hWnd, szBuf, 100)) + { + if(!_tcscmp(szBuf, p->szWindowClass)) + { + if(::GetWindowText(hWnd, szBuf, 100)) + { + if(!_tcscmp(szBuf, p->szWindowName)) + { + // Send message + COPYDATASTRUCT cds; + cds.dwData = p->dwMessage; + cds.lpData = (LPVOID)p->szCmdLine; + cds.cbData = (_tcslen(p->szCmdLine)+1)*sizeof(TCHAR); + if(1 == SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cds)) + { + bResult = FALSE; + p->bResult = TRUE; + } + } + } + } + } + return bResult; +} + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CIBNToHandlerWindow::CIBNToHandlerWindow() +{ + +} + +CIBNToHandlerWindow::~CIBNToHandlerWindow() +{ + +} + +BEGIN_MESSAGE_MAP(CIBNToHandlerWindow, CWnd) +//{{AFX_MSG_MAP(CIBNToHandlerWindow) + ON_MESSAGE(WM_COPYDATA, OnCopyData) +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +void CIBNToHandlerWindow::SetMainHWND(HWND hWnd) +{ + m_hMainWnd = hWnd; +} + +BOOL CIBNToHandlerWindow::Create() +{ + BOOL bResult = FALSE; + +// if(RegisterWindowClass()) + bResult = CWnd::CreateEx(0,MC_IBNTO_CLASS_NAME, MC_IBNTO_WINDOW_NAME, WS_OVERLAPPED, + CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, ::GetDesktopWindow(), 0); + + return bResult; +} + +LRESULT CIBNToHandlerWindow::OnCopyData(WPARAM w, LPARAM l) +{ + LRESULT ret = 0; + COPYDATASTRUCT * pData = (COPYDATASTRUCT*)l; + if(pData != NULL) + { + if(pData->dwData == IBN_MSG_IBNTO) + ret = ::SendMessage(m_hMainWnd, g_IbnToMessage, (WPARAM)pData->lpData, (LPARAM)pData->dwData); + else if(pData->dwData == IBN_MSG_FILES) + ret = ::SendMessage(m_hMainWnd, g_IbnToMessage, (WPARAM)pData->lpData, (LPARAM)pData->dwData); + } + return ret; +} + +IBNTO_MESSAGE* CIBNToHandlerWindow::GetIbnToCommand() +{ + CString cmd = GetCommandLine(); + + IBNTO_MESSAGE *pmsg = new IBNTO_MESSAGE; + if(pmsg->Parse(cmd)) + return pmsg; + delete pmsg; + return NULL; +} + +BOOL CIBNToHandlerWindow::SendIbnToCommand() +{ + CString cmd = GetCommandLine(); + EnumWindowsParams p; + p.dwMessage = IBN_MSG_IBNTO; + p.szWindowClass = MC_IBNTO_CLASS_NAME; + p.szWindowName = MC_IBNTO_WINDOW_NAME; + p.szCmdLine = cmd; + p.bResult = FALSE; + ::EnumWindows(EnumWindowsProc, (LPARAM)&p); + return p.bResult; +} + +SENDTO_MESSAGE* CIBNToHandlerWindow::GetFilesCommand() +{ + CString cmd = GetCommandLine(); + SENDTO_MESSAGE *pmsg = new SENDTO_MESSAGE; + if(pmsg->Parse(cmd)) + return pmsg; + delete pmsg; + return NULL; +} + +BOOL CIBNToHandlerWindow::SendFilesCommand() +{ + CString cmd = GetCommandLine(); + EnumWindowsParams p; + p.dwMessage = IBN_MSG_FILES; + p.szWindowClass = MC_IBNTO_CLASS_NAME; + p.szWindowName = MC_IBNTO_WINDOW_NAME; + p.szCmdLine = cmd; + p.bResult = FALSE; + ::EnumWindows(EnumWindowsProc, (LPARAM)&p); + return p.bResult; +} \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/IBNToHandlerWindow.h b/Source/Client/IM-Client/IMClient/IBNToHandlerWindow.h new file mode 100644 index 0000000..7723c88 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IBNToHandlerWindow.h @@ -0,0 +1,62 @@ +// IBNToHandlerWindow.h: interface for the CIBNToHandlerWindow class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_IBNTOHANDLERWINDOW_H__58D4DC4A_2A4A_4E65_B1E6_1CA16DC92DEF__INCLUDED_) +#define AFX_IBNTOHANDLERWINDOW_H__58D4DC4A_2A4A_4E65_B1E6_1CA16DC92DEF__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "IBNTO_MESSAGE.h" +#include "SENDTO_MESSAGE.h" + +#define MC_IBNTO_CLASS_NAME _T("#32770")//_T("{64A03E25-020D-4925-977B-730A686643D4}") +#define MC_IBNTO_WINDOW_NAME _T("{D6DB3F1D-A59E-42e5-BB49-19086A3E7300}") + +enum IBN_MESSAGE +{ + IBN_MSG_IBNTO + , IBN_MSG_FILES +}; + +struct EnumWindowsParams +{ + LPCTSTR szWindowClass; + LPCTSTR szWindowName; + BOOL bResult; + LPCTSTR szCmdLine; + DWORD dwMessage; +}; + +class CIBNToHandlerWindow : public CWnd +{ +public: + CIBNToHandlerWindow(); + virtual ~CIBNToHandlerWindow(); + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CMcUpdateWindow) + //}}AFX_VIRTUAL + +// Implementation +public: + void SetMainHWND(HWND hWnd); + BOOL Create(); + IBNTO_MESSAGE* GetIbnToCommand(); + SENDTO_MESSAGE* GetFilesCommand(); + BOOL SendIbnToCommand(); + BOOL SendFilesCommand(); + + // Generated message map functions +protected: + HWND m_hMainWnd; + //{{AFX_MSG(CMcUpdateWindow) + afx_msg LRESULT OnCopyData(WPARAM w, LPARAM l); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +#endif // !defined(AFX_IBNTOHANDLERWINDOW_H__58D4DC4A_2A4A_4E65_B1E6_1CA16DC92DEF__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/IBNUpdate.cpp b/Source/Client/IM-Client/IMClient/IBNUpdate.cpp new file mode 100644 index 0000000..b98249c --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IBNUpdate.cpp @@ -0,0 +1,186 @@ +// IBNUpdate.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "IBNUpdate.h" + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CIBNUpdate dialog + + +CIBNUpdate::CIBNUpdate(CWnd* pParent /*=NULL*/) + : CDialog(CIBNUpdate::IDD, pParent) +{ + //{{AFX_DATA_INIT(CIBNUpdate) + //}}AFX_DATA_INIT +} + +CIBNUpdate::~CIBNUpdate() +{ + if(m_McUpdateDownload.IsDownload()) + { + m_McUpdateDownload.StopDownload(100); + } +} + +void CIBNUpdate::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CIBNUpdate) + DDX_Control(pDX, IDC_DOWNLOAD_STATIC, m_stDownload); + DDX_Control(pDX, IDC_START_STATIC, m_stStart); + DDX_Control(pDX, IDC_ANIMATE, m_Anim); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CIBNUpdate, CDialog) + //{{AFX_MSG_MAP(CIBNUpdate) + ON_BN_CLICKED(IDC_START_BUTTON, OnStartButton) + ON_WM_CLOSE() + //}}AFX_MSG_MAP + ON_MESSAGE(WM_MCUPDATE_LOADED,OnMcUpdateLoaded) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CIBNUpdate message handlers + +void CIBNUpdate::OnOK() +{ +} + +BOOL CIBNUpdate::OnInitDialog() +{ + CDialog::OnInitDialog(); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + m_Anim.Open(IDR_SEND_DATA_AVI); + + + m_McUpdateDownload.Init(GetSafeHwnd(),WM_MCUPDATE_LOADED); + + OnStartButton() ; + + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CIBNUpdate::OnStartButton() +{ + GetDlgItem(IDC_START_BUTTON)->EnableWindow(FALSE); + + m_stDownload.ShowWindow(SW_HIDE); + m_stStart.ShowWindow(SW_HIDE); + + m_McUpdateDownload.Load(m_strMcUpdateURL); + + SetWindowText(GetString(IDS_IBN_UPDATE_TITLE)); + + m_Anim.Play(0,-1,-1); +} + +void CIBNUpdate::OnCancel() +{ + if(m_McUpdateDownload.IsDownload()) + { + m_McUpdateDownload.StopDownload(100); + } + else + { + CDialog::OnCancel(); + } + +} + +void CIBNUpdate::InitBeforCreate(LPCTSTR strMcUpdateURL, LPCTSTR strMcUpdatePath, LPCTSTR strMcUpdateParam) +{ + m_strMcUpdateURL = strMcUpdateURL; + m_strMcUpdatePath = strMcUpdatePath; + m_strMcUpdateParam = strMcUpdateParam; +} + +LRESULT CIBNUpdate::OnMcUpdateLoaded(WPARAM w, LPARAM l) +{ + m_Anim.Stop(); + + if(w) + { + m_McUpdateDownload.Clear(); + + GetDlgItem(IDC_START_BUTTON)->EnableWindow(TRUE); + SetWindowText(GetString(IDS_IBN_UPDATE_ERROR_TITLE)); + } + else + { + m_stDownload.ShowWindow(SW_SHOW); + + + m_McUpdateDownload.Save(m_strMcUpdatePath+_T("McUpdate.exe")); + m_McUpdateDownload.Clear(); + + //long hInstance = (long)ShellExecute(::GetDesktopWindow(),_T("open"),m_strMcUpdatePath,m_strMcUpdateParam,NULL,SW_SHOWDEFAULT); + + //if(hInstance<=32) + + //MCTRACE(9,"Invoke_StartAutoUpdate Run ShellExecute"); + + //HINSTANCE hInst = ShellExecute(::GetDesktopWindow(),NULL,m_strMcUpdatePath,m_strMcUpdateParam,NULL,SW_SHOWNORMAL); + STARTUPINFO startInfo = {0}; + startInfo.cb = sizeof(STARTUPINFO); + + PROCESS_INFORMATION procInfo = {0}; + + if(CreateProcess(NULL,(LPTSTR)(LPCTSTR)(m_strMcUpdateParam),NULL,NULL,FALSE,0,0,m_strMcUpdatePath,&startInfo,&procInfo)) + { + CloseHandle(procInfo.hProcess); + CloseHandle(procInfo.hThread); + + m_stStart.ShowWindow(SW_SHOW); + OnCancel(); + } + else + { + //MCTRACE(9,"Invoke_StartAutoUpdate ShellExecute Error = %08X",GetLastError()); + + GetDlgItem(IDC_START_BUTTON)->EnableWindow(TRUE); + SetWindowText(GetString(IDS_IBN_UPDATE_ERROR2_TITLE)); + + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + + MessageBox((LPCTSTR)lpMsgBuf,GetString(IDS_OPEN_FILE_ERROR_NAME),MB_OK | MB_ICONINFORMATION ); + + // Free the buffer. + LocalFree( lpMsgBuf ); + } + } + + return 0; +} + +void CIBNUpdate::OnClose() +{ + DestroyWindow(); + delete this; +} diff --git a/Source/Client/IM-Client/IMClient/IBNUpdate.h b/Source/Client/IM-Client/IMClient/IBNUpdate.h new file mode 100644 index 0000000..982ed7f --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IBNUpdate.h @@ -0,0 +1,60 @@ +#if !defined(AFX_IBNUPDATE_H__74FE0997_2A18_4888_AA72_882FA7C9E85F__INCLUDED_) +#define AFX_IBNUPDATE_H__74FE0997_2A18_4888_AA72_882FA7C9E85F__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// IBNUpdate.h : header file +// +#include "FileDownloader.h" + +///////////////////////////////////////////////////////////////////////////// +// CIBNUpdate dialog + +class CIBNUpdate : public CDialog +{ +// Construction +public: + void InitBeforCreate(LPCTSTR strMcUpdateURL, LPCTSTR strMcUpdatePath, LPCTSTR strMcUpdateParam); + CIBNUpdate(CWnd* pParent = NULL); // standard constructor + ~CIBNUpdate(); + +// Dialog Data + //{{AFX_DATA(CIBNUpdate) + enum { IDD = IDD_MCUPDATE_DIALOG }; + CStatic m_stDownload; + CStatic m_stStart; + CAnimateCtrl m_Anim; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CIBNUpdate) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + CFileDownloader m_McUpdateDownload; + CString m_strMcUpdateURL; + CString m_strMcUpdatePath; + CString m_strMcUpdateParam; + + // Generated message map functions + //{{AFX_MSG(CIBNUpdate) + virtual void OnOK(); + virtual BOOL OnInitDialog(); + afx_msg void OnStartButton(); + virtual void OnCancel(); + afx_msg void OnClose(); + //}}AFX_MSG + LRESULT OnMcUpdateLoaded(WPARAM w, LPARAM l); + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_IBNUPDATE_H__74FE0997_2A18_4888_AA72_882FA7C9E85F__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/IBNWFGlobalFunctions.h b/Source/Client/IM-Client/IMClient/IBNWFGlobalFunctions.h new file mode 100644 index 0000000..75b09f9 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IBNWFGlobalFunctions.h @@ -0,0 +1,402 @@ +#pragma once + +using namespace ATL; + +#include "atlcrypt.h" +#include "atlconv.h" + +////////////////////////////////////////////////////////////////////////// + +typedef struct _IBN_CRYPT_DATA +{ + DWORD dwSize; + DWORD dwCRC32; + DWORD dwTime; + DWORD dwLoginOffset; // in Bytes + DWORD dwLoginSize; // in Bytes + DWORD dwPassOffset; // in Bytes + DWORD dwPassSize; // in Bytes +} IBN_CRYPT_DATA, *LPIBN_CRYPT_DATA; + +////////////////////////////////////////////////////////////////////////// + +inline BYTE McCoHexSim2Byte(TCHAR ch) //throw(...) +{ + if (ch >= _T('0') && ch <= _T('9')) return ch - _T('0'); + if (ch >= _T('a') && ch <= _T('f')) return ch - _T('a') + 0xA; + if (ch >= _T('A') && ch <= _T('F')) return ch - _T('A') + 0xA; + throw 1; +} + +inline BOOL McCoHexStr2Bin(LPCTSTR hexsign, BYTE* pbarray) +{ + if(IsBadWritePtr(pbarray,_tcslen(hexsign)/2)) + return FALSE; + + try + { + while(*hexsign) + { + BYTE aa = McCoHexSim2Byte(*hexsign++); + BYTE bb = McCoHexSim2Byte(*hexsign++); + *pbarray++ = (BYTE)(aa << 4 | bb); + } + } + catch(...) + { + return FALSE; + } + return TRUE; +} + +inline TCHAR McCoByte2HexSimLo(BYTE Num) //throw() +{ + Num &= 0xF; + + if (Num<10) + return _T('0') + Num; + else + return _T('A') + Num - 10; + + throw 1; +} + +inline TCHAR McCoByte2HexSimHi(BYTE Num) //throw(...) +{ + return McCoByte2HexSimLo((Num&0xF0)>>4); +} + + +inline BOOL McCoBin2HexStr(const BYTE* pbarray, DWORD dwArraySize, TCHAR* hexsign) +{ + if(IsBadReadPtr(pbarray,dwArraySize)) + return FALSE; + + if(IsBadWritePtr(hexsign,(2*dwArraySize+1)*sizeof(TCHAR))) + return FALSE; + + try + { + ZeroMemory(hexsign,(2*dwArraySize+1)*sizeof(TCHAR)); + while(dwArraySize-->0) + { + *hexsign = McCoByte2HexSimHi(*pbarray);hexsign++; + *hexsign = McCoByte2HexSimLo(*pbarray);hexsign++; + pbarray++; + } + } + catch(...) + { + return FALSE; + } + return TRUE; +} + +////////////////////////////////////////////////////////////////////////// + +inline DWORD McCoCRC32(DWORD crc, LPBYTE buf, size_t len) +{ + const static DWORD crc_table[256] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, + 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, + 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, + 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, + 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, + 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, + 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, + 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, + 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, + 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, + 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, + 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, + 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, + 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, + 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, + 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, + 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, + 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, + 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, + 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, + 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, + 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, + 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, + 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, + 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, + 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, + 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, + 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, + 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, + 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, + 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, + 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, + 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, + 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, + 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, + 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, + 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, + 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, + 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, + 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, + 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, + 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, + 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, + 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, + 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, + 0x2d02ef8dL + }; + +#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); +#define DO2(buf) DO1(buf); DO1(buf); +#define DO4(buf) DO2(buf); DO2(buf); +#define DO8(buf) DO4(buf); DO4(buf); + + crc = crc ^ 0xffffffffL; + + while (len >= 8) + { + DO8(buf); + len -= 8; + } + + if (len) + do + { + DO1(buf); + } + while (--len); + +#undef DO1 +#undef DO2 +#undef DO4 +#undef DO8 + + return crc ^ 0xffffffffL; +} + +////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////// +// Crypt Help Function [9/12/2002] +////////////////////////////////////////////////////////////////////////// + +inline HRESULT IBNCryptDataEncode(CCryptKey &hKey, LPBYTE DataBuff, DWORD dwDataBuffSize, LPBYTE *lpEncryptDataBuff, DWORD *lpdwEncryptDataBuffSize) +{ + if(IsBadReadPtr(DataBuff,dwDataBuffSize)) + return E_INVALIDARG; + + if(IsBadWritePtr(lpEncryptDataBuff,sizeof(LPBYTE))) + return E_INVALIDARG; + + if(IsBadWritePtr(lpdwEncryptDataBuffSize,sizeof(DWORD))) + return E_INVALIDARG; + + *lpEncryptDataBuff = new BYTE[(dwDataBuffSize/1024+1)*1024]; + *lpdwEncryptDataBuffSize = 0; + + memcpy(*lpEncryptDataBuff,DataBuff,dwDataBuffSize); + + DWORD dwReadDataPointer = 0; + + BOOL bFinal = FALSE; + + do + { + DWORD dwNeedReadSize = min(1000,dwDataBuffSize-dwReadDataPointer); + + bFinal = ((dwReadDataPointer+dwNeedReadSize)>=dwDataBuffSize); + + HRESULT hr = S_OK; + if(hr = hKey.Encrypt(bFinal,(*lpEncryptDataBuff+dwReadDataPointer),&dwNeedReadSize,1000)) + { + delete [] *lpEncryptDataBuff; + *lpEncryptDataBuff = NULL; + *lpdwEncryptDataBuffSize = 0; + return hr; + } + + dwReadDataPointer += 1000; + *lpdwEncryptDataBuffSize += dwNeedReadSize; + } + while(!bFinal); + + return S_OK; +} + +inline HRESULT IBNCryptDataDecode(CCryptKey &hKey,LPBYTE DataBuff, DWORD dwDataBuffSize, LPBYTE *lpDecodeDataBuff, DWORD *lpdwDecodeDataBuffSize) +{ + if(IsBadReadPtr(DataBuff,dwDataBuffSize)) + return E_INVALIDARG; + + if(IsBadWritePtr(lpDecodeDataBuff,sizeof(LPBYTE))) + return E_INVALIDARG; + + if(IsBadWritePtr(lpdwDecodeDataBuffSize,sizeof(DWORD))) + return E_INVALIDARG; + + + *lpDecodeDataBuff = new BYTE[(dwDataBuffSize/1024+1)*1024]; + *lpdwDecodeDataBuffSize = 0; + + memcpy(*lpDecodeDataBuff,DataBuff,dwDataBuffSize); + + DWORD dwReadDataPointer = 0; + + BOOL bFinal = FALSE; + + do + { + DWORD dwNeedReadSize = min(1000,dwDataBuffSize-dwReadDataPointer); + + bFinal = ((dwReadDataPointer+dwNeedReadSize)>=dwDataBuffSize); + + HRESULT hr = S_OK; + if(hr = hKey.Decrypt(bFinal,(*lpDecodeDataBuff+dwReadDataPointer),&dwNeedReadSize)) + { + return hr; + } + + dwReadDataPointer += 1000; + *lpdwDecodeDataBuffSize += dwNeedReadSize; + } + while(!bFinal); + + return S_OK; +} + +inline HRESULT LoginPassword2HexSTR(CCryptKey &hKey, LPCTSTR strLogin, LPCTSTR strPassword, LPTSTR *lppHexStrBuff) +{ + USES_CONVERSION; + + if(IsBadReadPtr(strLogin,(_tcsclen(strLogin) + 1)*sizeof(TCHAR))) + return E_INVALIDARG; + + if(IsBadReadPtr(strPassword,(_tcsclen(strPassword)+1)*sizeof(TCHAR))) + return E_INVALIDARG; + + // Step 1. Create Data Buffer[9/12/2002] + IBN_CRYPT_DATA DataHeader = {0}; + + DataHeader.dwSize = sizeof(IBN_CRYPT_DATA); + DataHeader.dwTime = (DWORD)time(NULL); + + DataHeader.dwLoginSize = static_cast((_tcsclen(strLogin)+1)*sizeof(WCHAR)); + DataHeader.dwLoginOffset= sizeof(IBN_CRYPT_DATA); + DataHeader.dwPassSize = static_cast((_tcsclen(strPassword)+1)*sizeof(WCHAR)); + DataHeader.dwPassOffset = sizeof(IBN_CRYPT_DATA) + DataHeader.dwLoginSize; + + DWORD dwTotalSize = sizeof(IBN_CRYPT_DATA) + DataHeader.dwLoginSize + DataHeader.dwPassSize; + + LPBYTE pTmpBuff = new BYTE[dwTotalSize]; + + ZeroMemory(pTmpBuff,dwTotalSize); + + memcpy(pTmpBuff,&DataHeader,sizeof(IBN_CRYPT_DATA)); + memcpy(pTmpBuff+DataHeader.dwLoginOffset,T2CW(strLogin),DataHeader.dwLoginSize); + memcpy(pTmpBuff+DataHeader.dwPassOffset,T2CW(strPassword),DataHeader.dwPassSize); + + ((LPIBN_CRYPT_DATA)pTmpBuff)->dwCRC32 = McCoCRC32(0,pTmpBuff,dwTotalSize); + + // Step 2. Encode data [9/12/2002] + LPBYTE pEncodeDataBuff = NULL; + DWORD dwEncodeDataBuffSize = 0; + HRESULT hr = IBNCryptDataEncode(hKey,pTmpBuff,dwTotalSize,&pEncodeDataBuff,&dwEncodeDataBuffSize); + + if(hr==S_OK) + { + *lppHexStrBuff = new TCHAR[dwEncodeDataBuffSize*2+1]; + if(!McCoBin2HexStr(pEncodeDataBuff,dwEncodeDataBuffSize,*lppHexStrBuff)) + { + delete [] *lppHexStrBuff; + *lppHexStrBuff = NULL; + hr = E_FAIL; + } + } + + // Free Resourse [9/12/2002] + if(pEncodeDataBuff) + delete [] pEncodeDataBuff; + + if(pTmpBuff) + delete [] pTmpBuff; + + return hr; +} +////////////////////////////////////////////////////////////////////////// +// !!! Need strInUser is UPPER String !!! [9/13/2002] +inline BOOL CommonUser2WinUser(LPCTSTR strInUser, CString& strOutUser) +{ + USES_CONVERSION; + + DWORD dwCRC = McCoCRC32(0, reinterpret_cast(T2W(const_cast(strInUser))), _tcsclen(strInUser)*sizeof(WCHAR)); + strOutUser.Format(_T("IBN_%08X"),dwCRC); + + return TRUE; +} + +inline BOOL ExtractLoginAndPasswordFromData(CCryptKey &hKey, LPCTSTR strData, CString& strLogin, CString& strPassword) +{ + USES_CONVERSION; + + DWORD dwDataSize = static_cast(_tcslen(strData)); + + if(dwDataSize==0||dwDataSize%2!=0) + return FALSE; + + LPBYTE pEncodeBuff = new BYTE[dwDataSize/2]; + + BOOL bRetFlag = FALSE; + + if(McCoHexStr2Bin(strData,pEncodeBuff)) + { + LPBYTE pDecodeBuff = NULL; + DWORD dwDecodeBuffSize = NULL; + if(IBNCryptDataDecode(hKey,pEncodeBuff,dwDataSize/2,&pDecodeBuff,&dwDecodeBuffSize)==S_OK) + { + if(dwDecodeBuffSize>=sizeof(IBN_CRYPT_DATA)) + { + LPIBN_CRYPT_DATA pDataHeader = (LPIBN_CRYPT_DATA)pDecodeBuff; + + DWORD dwCRC32 = pDataHeader->dwCRC32; + pDataHeader->dwCRC32 = 0; + + if(pDataHeader->dwSize==sizeof(IBN_CRYPT_DATA)&& + dwCRC32==McCoCRC32(0,pDecodeBuff,dwDecodeBuffSize)) + { + LPCWSTR pLoginData = (LPCWSTR)(LPBYTE(pDataHeader) + pDataHeader->dwLoginOffset); + LPCWSTR pPassData = (LPCWSTR)(LPBYTE(pDataHeader) + pDataHeader->dwPassOffset); + + if(!IsBadReadPtr(pLoginData,pDataHeader->dwLoginSize)&& + !IsBadReadPtr(pPassData,pDataHeader->dwPassSize)) + { + // We are Find Lofin and Password [9/12/2002] + bRetFlag = TRUE; + try + { + strLogin = pLoginData; + strPassword = pPassData; + } + catch (...) + { + bRetFlag = FALSE; + } + // [9/12/2002] + } + } + } + } + if(pDecodeBuff) + delete []pDecodeBuff; + + } + + if(pEncodeBuff) + delete [] pEncodeBuff; + + return bRetFlag; +} diff --git a/Source/Client/IM-Client/IMClient/IMClient.vcxproj b/Source/Client/IM-Client/IMClient/IMClient.vcxproj new file mode 100644 index 0000000..54f141f --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IMClient.vcxproj @@ -0,0 +1,470 @@ +п»ї + + + + Debug + Win32 + + + Release_MagRul + Win32 + + + Release_IBN + Win32 + + + + SAK + SAK + MFCProj + IMClient + SAK + SAK + + + + Application + Dynamic + MultiByte + + + Application + Dynamic + MultiByte + + + Application + Dynamic + MultiByte + + + + + + + + + + + + + + + + + + + false + $(LibraryPath);$(SolutionDir)$(Configuration) + + + true + $(LibraryPath);$(SolutionDir)$(Configuration) + + + false + $(LibraryPath);$(SolutionDir)$(Configuration) + + + + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + OldStyle + WIN32;NDEBUG;_WINDOWS;_DEVELOVER_VERSION_WITH_DUMP_L1;%(PreprocessorDefinitions) + true + Use + stdafx.h + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Release_MDMP\OfsTv.tlb + true + Win32 + + + NDEBUG;%(PreprocessorDefinitions) + + + true + + + true + true + Windows + cximage.lib;jpeg.lib;msxml2.lib;wininet.lib;Version.lib;Winmm.lib;Shlwapi.lib;%(AdditionalDependencies) + type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*';%(AdditionalManifestDependencies) + + + + + + Default + false + Disabled + true + true + EditAndContinue + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + Use + stdafx.h + EnableFastChecks + + + true + _DEBUG;%(PreprocessorDefinitions) + .\Debug\OfsTv.tlb + true + Win32 + + + _DEBUG;%(PreprocessorDefinitions) + + + true + + + true + true + Windows + cximage.lib;jpeg.lib;msxml2.lib;wininet.lib;Version.lib;Winmm.lib;Shlwapi.lib;%(AdditionalDependencies) + type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*';%(AdditionalManifestDependencies) + + + + + + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + OldStyle + RADIUS;WIN32;NDEBUG;_WINDOWS;_DEVELOVER_VERSION_WITH_DUMP_L1;%(PreprocessorDefinitions) + true + Use + stdafx.h + + + true + NDEBUG;%(PreprocessorDefinitions) + .\MagRul_Release_MDMP\OfsTv.tlb + true + Win32 + + + RADIUS;NDEBUG;%(PreprocessorDefinitions) + + + true + + + true + true + Windows + cximage.lib;jpeg.lib;msxml2.lib;wininet.lib;Version.lib;Winmm.lib;Shlwapi.lib;%(AdditionalDependencies) + type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*';%(AdditionalManifestDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + stdafx.h + Create + stdafx.h + Create + stdafx.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + + + + + + + + + + + RC + + + + + Document + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/IMClient.vcxproj.filters b/Source/Client/IM-Client/IMClient/IMClient.vcxproj.filters new file mode 100644 index 0000000..d3d805f --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IMClient.vcxproj.filters @@ -0,0 +1,827 @@ +п»ї + + + + {95be0442-f2e1-46be-b4c8-409309e2d2e8} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {ddc0b20e-1b1a-4834-ac06-026207cbf111} + h;hpp;hxx;hm;inl + + + {26a0ae79-1c13-4f24-8cac-75b9ed498114} + 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 + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Header Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + + + + \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/IMClient.vcxproj.vspscc b/Source/Client/IM-Client/IMClient/IMClient.vcxproj.vspscc new file mode 100644 index 0000000..b6d3289 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IMClient.vcxproj.vspscc @@ -0,0 +1,10 @@ +п»ї"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/Source/Client/IM-Client/IMClient/IbnCommandWnd.cpp b/Source/Client/IM-Client/IMClient/IbnCommandWnd.cpp new file mode 100644 index 0000000..fa1f249 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IbnCommandWnd.cpp @@ -0,0 +1,395 @@ +// IbnCommandWnd.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "IbnCommandWnd.h" +#include "MainDlg.h" +#include "GlobalMessengerDef.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CIbnCommandWnd + +CIbnCommandWnd::CIbnCommandWnd(CMainDlg *pMessenger) +{ + this->pMessenger = pMessenger; +} + +CIbnCommandWnd::~CIbnCommandWnd() +{ +} + + +BEGIN_MESSAGE_MAP(CIbnCommandWnd, CWnd) +//{{AFX_MSG_MAP(CIbnCommandWnd) +ON_WM_COPYDATA() +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CIbnCommandWnd message handlers +BOOL CIbnCommandWnd::OnCopyData(CWnd *pWnd, COPYDATASTRUCT *pCopyDataStruct) +{ + CComBSTR bstrCommandXML = (LPCWSTR)pCopyDataStruct->lpData; + + CComBSTR bstrCommandResponse; + + if(bstrCommandXML==L"clientInfo") + { + bstrCommandResponse = BuildClientInfoXml(); + } + else if(bstrCommandXML==L"contactList") + { + bstrCommandResponse = BuildContactListXml(); + } + else + { + CComPtr xmlCommandDoc = NULL; + xmlCommandDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + + VARIANT_BOOL varSuc = VARIANT_FALSE; + xmlCommandDoc->loadXML(bstrCommandXML,&varSuc); + + if(varSuc==VARIANT_TRUE) + { + CComPtr pRootNode; + xmlCommandDoc->selectSingleNode(CComBSTR(L"clientInfo"),&pRootNode); + + if(pRootNode!=NULL) + { + bstrCommandResponse = BuildClientInfoXml(); + } + else + { + xmlCommandDoc->selectSingleNode(CComBSTR(L"contactList"),&pRootNode); + if(pRootNode!=NULL) + { + bstrCommandResponse = BuildContactListXml(); + } + else + { + xmlCommandDoc->selectSingleNode(CComBSTR(L"sendFile"),&pRootNode); + if(pRootNode!=NULL) + { + SendFile(pRootNode); + } + + // TODO: Not Supported Command + } + } + + } + } + + if(bstrCommandResponse.Length()>0) + { + // Send WM_COPYDATA + COPYDATASTRUCT copyDs = {0}; + + copyDs.cbData = (bstrCommandResponse.Length()+1)*2; // Specifies the size, in bytes, of the data pointed to by the lpData member. + copyDs.lpData = (PVOID)(BSTR)bstrCommandResponse; // Pointer to data to be passed to the receiving application. This member can be NULL. + + LRESULT bResult = pWnd->SendMessage(WM_COPYDATA, + (WPARAM)GetSafeHwnd(), + (LPARAM)©Ds); + } + + return TRUE; +} + +CComBSTR CIbnCommandWnd::BuildClientInfoXml() +{ + CComBSTR bstrCommandXML; + + bstrCommandXML += L""; + + CComPtr xmlResponseDoc = NULL; + xmlResponseDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + + VARIANT_BOOL varSuc = VARIANT_FALSE; + xmlResponseDoc->loadXML(bstrCommandXML,&varSuc); + + CComPtr xmlLoginNode; + CComPtr xmlFirstNameNode; + CComPtr xmlLastNameNode; + CComPtr xmlEmailNode; + CComPtr xmlStatusNode; + + xmlResponseDoc->selectSingleNode(CComBSTR(L"clientInfo/response/login"),&xmlLoginNode); + xmlResponseDoc->selectSingleNode(CComBSTR(L"clientInfo/response/firstName"),&xmlFirstNameNode); + xmlResponseDoc->selectSingleNode(CComBSTR(L"clientInfo/response/lastName"),&xmlLastNameNode); + xmlResponseDoc->selectSingleNode(CComBSTR(L"clientInfo/response/email"),&xmlEmailNode); + xmlResponseDoc->selectSingleNode(CComBSTR(L"clientInfo/response/status"),&xmlStatusNode); + + xmlLoginNode->put_text(CComBSTR((LPCTSTR)pMessenger->GetCurrentUser().m_strLogin)); + xmlFirstNameNode->put_text(CComBSTR((LPCTSTR)pMessenger->GetCurrentUser().m_strFirstName)); + xmlLastNameNode->put_text(CComBSTR((LPCTSTR)pMessenger->GetCurrentUser().m_strLastName)); + xmlEmailNode->put_text(CComBSTR((LPCTSTR)pMessenger->GetCurrentUser().m_strEMail)); + + WCHAR Buff[20] = L""; + _ltow(pMessenger->GetCurrentUser().m_iStatus,Buff,10); + xmlStatusNode->put_text(CComBSTR(Buff)); + + + bstrCommandXML.Empty(); + xmlResponseDoc->get_xml(&bstrCommandXML); + + return bstrCommandXML; +} + +CComBSTR CIbnCommandWnd::BuildContactListXml() +{ + USES_CONVERSION; + + CUserCollection UsersContactList; + pMessenger->GetCopyContactList(UsersContactList); + + CComPtr pTreeItemDoc = NULL; + + pTreeItemDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + + VARIANT_BOOL varSuc = VARIANT_FALSE; + CComBSTR bsDefaultXML = L""; + + pTreeItemDoc->loadXML(bsDefaultXML,&varSuc); + + CComPtr pRootNode; + pTreeItemDoc->selectSingleNode(CComBSTR(L"contactList/response"),&pRootNode); + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + CUser* pUser=NULL; + + int GroupGlobalId = -1; + if(POSITION pos = UsersContactList.InitIteration()) + { + for(int i=0; UsersContactList.GetNext(pos, pUser); i++) + { + // Step 1. Проверить создавали ли мы группу??? + CComBSTR GroupName = pUser->m_strType; + + if(CLMode==2) + { + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + GroupName = GetString(IDS_OFFLINE); + } + } + + BOOL isCheck = FALSE; + + CComBSTR bsGroupPath = L"contactList/response/group[@name='"; + bsGroupPath += GroupName; + bsGroupPath += L"']"; + + CComPtr pGroupNode; + + pTreeItemDoc->selectSingleNode(bsGroupPath,&pGroupNode); + + if(pGroupNode==NULL) + { + CComPtr pTmpGroupNode; + + pTreeItemDoc->createNode(CComVariant(NODE_ELEMENT),CComBSTR(L"group"),NULL,&pTmpGroupNode); + + SetAttribute(pTmpGroupNode,CComBSTR(L"name"),CComVariant(GroupName)); + + pGroupNode = AppendWithSort(pRootNode, pTmpGroupNode, CComBSTR(L"text")); + } + + // Step 3. добавить пользователя [1/28/2002] + CComPtr pUserNode; + + insertSingleNode(pGroupNode, CComBSTR(L"user"), NULL, NULL, &pUserNode); + + WCHAR buffUserId[20] = L""; + _ltow(pUser->GetGlobalID(),buffUserId,10); + + WCHAR buffUserStatus[20] = L""; + _ltow(pUser-> GetStatus(),buffUserStatus,10); + + insertSingleNode(pUserNode, CComBSTR(L"id"), NULL, CComBSTR(buffUserId)); + insertSingleNode(pUserNode, CComBSTR(L"login"), NULL, CComBSTR((LPCTSTR)pUser->m_strLogin)); + insertSingleNode(pUserNode, CComBSTR(L"firstName"), NULL, CComBSTR((LPCTSTR)pUser->m_strFirstName)); + insertSingleNode(pUserNode, CComBSTR(L"lastName"), NULL, CComBSTR((LPCTSTR)pUser->m_strLastName)); + insertSingleNode(pUserNode, CComBSTR(L"email"), NULL, CComBSTR((LPCTSTR)pUser->m_strEMail)); + insertSingleNode(pUserNode, CComBSTR(L"status"), NULL, CComBSTR(buffUserStatus)); + } + } + + CComBSTR bsRetVal; + pTreeItemDoc->get_xml(&bsRetVal); + + return bsRetVal; +} + +void CIbnCommandWnd::SendFile(CComPtr &pRootNode) +{ + USES_CONVERSION; + + CComBSTR bsTmpFileName; + + + CComPtr pFileNode; + pRootNode->selectSingleNode(CComBSTR(L"request/file"),&pFileNode); + if(pFileNode==NULL) + return; + pFileNode->get_text(&bsTmpFileName); + + CComPtr pRecipientIdNodeList = NULL; + pRootNode->selectNodes(CComBSTR(L"request/recipients/id"),&pRecipientIdNodeList); + if(pRecipientIdNodeList==NULL) + return; + + SendFileInfo *pSendFileInfo = new SendFileInfo(); + + long listLength = 0; + pRecipientIdNodeList->get_length(&listLength); + + CString strRecepientId = _T(""); + + for(int index=0;index pIdNode = NULL; + pRecipientIdNodeList->get_item(index,&pIdNode); + + pIdNode->get_text(&bsUserId); + + strRecepientId = W2CT(bsUserId); + + pSendFileInfo->RecepientID += strRecepientId; + pSendFileInfo->RecepientID += _T(","); + } + + + + if(listLength==1) + { + int globalId = _ttol(strRecepientId); + CUser user; + if(pMessenger->GetUserByGlobalId(globalId, user)) + { + pSendFileInfo->RecepientName = user.GetShowName(); + } + else + pSendFileInfo->RecepientName = _T("Screen Capture User Group"); + } + else + pSendFileInfo->RecepientName = _T("Screen Capture User Group"); + pSendFileInfo->Description = GetString(IDS_SCREEN_CAPTURE_NAME); + pSendFileInfo->File = W2CT(bsTmpFileName); + + pMessenger->PostMessage(WM_SEND_FILE2, (WPARAM)pSendFileInfo); +} + + +BOOL CIbnCommandWnd::SendScreenCaptureCommand(CComBSTR Command, CComBSTR Mode, CComBSTR RecipientsXml) +{ + // Create Hwnd String + WCHAR wsTmpBuf[20]; + _ltow((long)pMessenger->GetSafeHwnd(),wsTmpBuf,10); + + CComBSTR bstrClientHwnd = wsTmpBuf; + + // Create Xml Command + CComBSTR sendXML; + + sendXML += CComBSTR(L"<"); + sendXML += Command; + sendXML += CComBSTR(L">"); + + sendXML += CComBSTR(L""); + sendXML += CComBSTR(L""); + sendXML += bstrClientHwnd; + sendXML += CComBSTR(L""); + + sendXML += CComBSTR(L""); + sendXML += Mode; + sendXML += L""; + + if(RecipientsXml.Length()>0) + { + sendXML += CComBSTR(L""); + sendXML += RecipientsXml; + sendXML += L""; + } + + sendXML += CComBSTR(L""); + + sendXML += CComBSTR(L""); + + // Test Only + //sendXML = L""; + + // TODO: Find Screen Capture Window + LPCTSTR szScreenCaptureClassName = _T("#32770"); + LPCTSTR szScreenCaptureWindowName = _T("{19791104-A59E-42e5-BB49-200706080000}"); + + CWnd *pScreenCaptureCommandWnd = FindWindow(szScreenCaptureClassName,szScreenCaptureWindowName); + + if(pScreenCaptureCommandWnd==NULL) + { + // TODO: + CString screenCapurePath = pMessenger->ScreenCapturePath(); + + // Run Screen Capture + if(screenCapurePath.GetLength()>0) + { + HINSTANCE retVal = ShellExecute(::GetDesktopWindow(),NULL,screenCapurePath,_T(""),NULL,SW_SHOWNORMAL); + + if((int)retVal>32) + { + // Find Screen Capture Window Again + for(int index=0;index<20;index++) + { + Sleep(500); + + pScreenCaptureCommandWnd = FindWindow(szScreenCaptureClassName,szScreenCaptureWindowName); + if(pScreenCaptureCommandWnd!=NULL) + break; + } + } + } + + } + + if(pScreenCaptureCommandWnd!=NULL) + { + // Send WM_COPYDATA + COPYDATASTRUCT copyDs = {0}; + + copyDs.cbData = (sendXML.Length()+1)*2; // Specifies the size, in bytes, of the data pointed to by the lpData member. + copyDs.lpData = (PVOID)(BSTR)sendXML; // Pointer to data to be passed to the receiving application. This member can be NULL. + + LRESULT bResult = pScreenCaptureCommandWnd->SendMessage(WM_COPYDATA, + (WPARAM)GetSafeHwnd(), + (LPARAM)©Ds); + + return TRUE; + } + + return FALSE; +} + +BOOL CIbnCommandWnd::Create() +{ + BOOL bResult = FALSE; + + bResult = CWnd::CreateEx(0, + MC_IBNCOMMAND_CLASS_NAME, + MC_IBNCOMMAND_WINDOW_NAME, WS_OVERLAPPED, + CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, ::GetDesktopWindow(), 0); + + return bResult; +} diff --git a/Source/Client/IM-Client/IMClient/IbnCommandWnd.h b/Source/Client/IM-Client/IMClient/IbnCommandWnd.h new file mode 100644 index 0000000..ad8c0d8 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/IbnCommandWnd.h @@ -0,0 +1,60 @@ +#if !defined(AFX_IBNCOMMANDWND_H__866CAD5C_C122_487C_B84B_316D543C2C58__INCLUDED_) +#define AFX_IBNCOMMANDWND_H__866CAD5C_C122_487C_B84B_316D543C2C58__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// IbnCommandWnd.h : header file +// + +#define MC_IBNCOMMAND_CLASS_NAME _T("#32770") +#define MC_IBNCOMMAND_WINDOW_NAME _T("{19791104-A59E-42e5-BB49-19086A3E7300}") + + +class CMainDlg; +///////////////////////////////////////////////////////////////////////////// +// CIbnCommandWnd window + +class CIbnCommandWnd : public CWnd +{ +// Construction +public: + CIbnCommandWnd(CMainDlg *pMessenger); + +// Attributes +private: + CMainDlg *pMessenger; + +// Operations +public: + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CIbnCommandWnd) + //}}AFX_VIRTUAL + +// Implementation +public: + BOOL Create(); + BOOL SendScreenCaptureCommand(CComBSTR Command, CComBSTR Mode, CComBSTR RecipientsXml); + virtual ~CIbnCommandWnd(); + + // Generated message map functions +protected: + CComBSTR BuildClientInfoXml(); + CComBSTR BuildContactListXml(); + void SendFile(CComPtr &pRootNode); + + //{{AFX_MSG(CIbnCommandWnd) + afx_msg BOOL OnCopyData(CWnd *pWnd, COPYDATASTRUCT *pCopyDataStruct); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_IBNCOMMANDWND_H__866CAD5C_C122_487C_B84B_316D543C2C58__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/Inet/CoolInet2.cpp b/Source/Client/IM-Client/IMClient/Inet/CoolInet2.cpp new file mode 100644 index 0000000..119ce5c --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Inet/CoolInet2.cpp @@ -0,0 +1,298 @@ +// CoolInet2.cpp: implementation of the CCoolInet2 class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +//#include "OfsMessenger.h" +#include "CoolInet2.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +bstr_t GUIDGen() +{ + GUID NewGuid; + CoCreateGuid(&NewGuid); + LPOLESTR strW; + StringFromCLSID(NewGuid,&strW); + CString str = strW; + CoTaskMemFree((void*)strW); + return str.Mid(1,36); +} + +CCoolInet2::CCoolInet2():hWorkThread(0),hExitWork(0),hExitEvent(0), + hMarshalingEndEvent(0) +{ + CoInitialize(NULL); + + p_InetSession = NULL; + bGetMarshaling = FALSE; + + + hWorkThread = CreateThread(NULL,2048,WorkThread,(LPVOID)this,CREATE_SUSPENDED,&IDWorkThread); + ASSERT(hWorkThread); + + hExitWork = CreateEvent(NULL,TRUE,FALSE,NULL); + ASSERT(hExitWork); + + hExitEvent = CreateEvent(NULL,TRUE,FALSE,NULL); + ASSERT(hExitEvent); + + hMarshalingEndEvent = CreateEvent(NULL,TRUE,FALSE,NULL); + ASSERT(hMarshalingEndEvent); + + hStartEvent = CreateEvent(NULL,TRUE,FALSE,NULL); + ASSERT(hStartEvent); + + MarshalEvent = CreateEvent(NULL,TRUE,FALSE,NULL); + ASSERT(MarshalEvent); + + ResumeThread(hWorkThread); + + DWORD dwResult = WaitForSingleObject(hStartEvent,30000); + + if(dwResult!=WAIT_OBJECT_0) + ASSERT(TRUE); + + InitializeCriticalSection(&m_lock); + +} + +CCoolInet2::~CCoolInet2() +{ + /// Освободить захваченные конекты поинты ... + try + { + SetEvent(hExitEvent); + WaitForSingleObject(hWorkThread,10000); + } + catch(...) + { + } +/// EnterCriticalSection(&m_lock); +// LeaveCriticalSection(&m_lock); + CloseHandle(MarshalEvent); + CloseHandle(hExitEvent); + CloseHandle(hMarshalingEndEvent); + CloseHandle(hStartEvent); + CloseHandle(hExitWork); + CloseHandle(hWorkThread); + DeleteCriticalSection(&m_lock); + + CoUninitialize(); +} +//// Команды косвенного обращения к Translatoru +void CCoolInet2::InitEventWindow(HWND hEventWnd) +{ + m_InetSessionEvent.m_NetLibTranslator.NLT_SetEventWindow(hEventWnd); +} +void CCoolInet2::LockTranslator() +{ + m_InetSessionEvent.m_NetLibTranslator.Lock(); +} + +void CCoolInet2::AddToTranslator(LONG Handle,HWND hReturnToWnd) +{ + m_InetSessionEvent.m_NetLibTranslator.NLT_AddToTranslate(Handle,hReturnToWnd); +} + +void CCoolInet2::RemoveFromTranslator(LONG &Handle) +{ + m_InetSessionEvent.m_NetLibTranslator.NLT_Remove(Handle); + Handle = 0; +} + +void CCoolInet2::UnlockTranslator() +{ + m_InetSessionEvent.m_NetLibTranslator.UnLock(); +} + +////............................................ + +DWORD CCoolInet2::WorkThread(LPVOID pParam) +{ + CCoolInet2 *pMain = (CCoolInet2 *)pParam; + + HRESULT hr = CoInitialize(NULL); + + pMain->WorkSession(); + + CoUninitialize(); + + return 0; +} + +BOOL CCoolInet2::WorkSession() +{ + try + { + CreateSession(); + InitEventContainer(); + + HANDLE MasEvent[2]={MarshalEvent,hExitEvent}; + + SetEvent(hStartEvent); + + while(TRUE) + { + MSG msg ; + + while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + DispatchMessage(&msg); + } + + DWORD dwResult = MsgWaitForMultipleObjects(2,MasEvent,FALSE,INFINITE,QS_ALLINPUT); + + if((dwResult - WAIT_OBJECT_0 ) ==0) + { + HRESULT hr = CoMarshalInterThreadInterfaceInStream(__uuidof(ISession),p_InetSession,ppSession); + + if(FAILED(hr)) + ppSession = NULL; + + ResetEvent(MarshalEvent); + SetEvent(hMarshalingEndEvent); + } + if((dwResult - WAIT_OBJECT_0 )==1) + { + //ASSERT(FALSE); + break; + } + /// Обработка Сообщений Windows... + } + CloseEventContainer(); + CloseSession(); + } + catch(...) + { + ASSERT(FALSE); + return FALSE; + } + + SetEvent(hExitWork); + + return TRUE; +} + +void CCoolInet2::InitEventContainer() +{ + IConnectionPointContainer* pCPContainer = NULL; + IConnectionPointPtr m_pSessionConnectionPoint; + p_InetSession->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + HRESULT hr = pCPContainer->FindConnectionPoint(__uuidof(_ISessionEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + LPUNKNOWN pInterEvent = m_InetSessionEvent.GetInterface(&IID_IUnknown); + hr = m_pSessionConnectionPoint->Advise(pInterEvent ,&dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + +void CCoolInet2::CloseEventContainer() +{ + IConnectionPointContainer* pCPContainer = NULL; + IConnectionPointPtr m_pSessionConnectionPoint; + p_InetSession->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + HRESULT hr = pCPContainer->FindConnectionPoint(__uuidof(_ISessionEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { +// LPUNKNOWN pInterEvent = m_InetSessionEvent.GetInterface(&IID_IUnknown); + hr = m_pSessionConnectionPoint->Unadvise(dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } + dwSessionCookie = 0; +} + +void CCoolInet2::CreateSession() +{ + ///{567B302A-1DBF-4A75-8E46-65F54A58D91D} + const CLSID CLSID_ATLNetLibV10 = {0x567B302A,0x1DBF,0x4A75, + 0x8E,0x46,0x65,0xF5,0x4A,0x58,0xD9,0x1D}; + + HRESULT hr = ::CoCreateInstance(CLSID_ATLNetLibV10,NULL,CLSCTX_INPROC_SERVER,__uuidof(ISession),(LPVOID*)&p_InetSession); + if(FAILED(hr)) + ASSERT(FALSE); +} + +void CCoolInet2::CloseSession() +{ + long hr = p_InetSession->Release(); + p_InetSession = NULL; +} + +BOOL CCoolInet2::SessionMarshaling(LPSTREAM *ppStm) +{ + EnterCriticalSection(&m_lock); + try + { + ppSession = ppStm; + + ResetEvent(hMarshalingEndEvent); + SetEvent(MarshalEvent); + + DWORD pReturn = WaitForSingleObject(hMarshalingEndEvent,30000); + + if(pReturn!=WAIT_OBJECT_0) + ASSERT(FALSE); + + bGetMarshaling = FALSE; + ppSession = NULL; + } + catch(...) + { + ASSERT(FALSE); + } + LeaveCriticalSection(&m_lock); + + return (ppStm!=NULL)?TRUE:FALSE; +} + +ISession* CCoolInet2::GetSession() +{ + IStream *pStream = NULL; + SessionMarshaling(&pStream); + if(pStream==NULL) return NULL; + + ISession* pSession = NULL; + + HRESULT hr = CoGetInterfaceAndReleaseStream(pStream,__uuidof(ISession),(LPVOID*)&pSession); + + //pSession->AddRef(); + + if(SUCCEEDED(hr)) + return pSession; + + return NULL; +} + diff --git a/Source/Client/IM-Client/IMClient/Inet/CoolInet2.h b/Source/Client/IM-Client/IMClient/Inet/CoolInet2.h new file mode 100644 index 0000000..c96955b --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Inet/CoolInet2.h @@ -0,0 +1,60 @@ +// CoolInet2.h: interface for the CCoolInet2 class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_COOLINET2_H__390CD6E9_40FB_42B9_A652_9A965A8737B7__INCLUDED_) +#define AFX_COOLINET2_H__390CD6E9_40FB_42B9_A652_9A965A8737B7__INCLUDED_ + +#include "EventContainer.h" + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +////////////////////////////////////////////////////////////////////// +// Класс Собирающей в себе : Транслятор, Событер - Диспитер, +// и предостовляющий ISession* +////////////////////////////////////////////////////////////////////// +bstr_t GUIDGen(); + +class CCoolInet2 +{ +public: + ISession* GetSession(); + BOOL SessionMarshaling(LPSTREAM* ppStm); + BOOL WorkSession(); + CCoolInet2(); + virtual ~CCoolInet2(); + /// Команды косвенного обращения к Translatoru + void InitEventWindow(HWND hEventWnd); + void LockTranslator(); + void AddToTranslator(LONG Handle,HWND hReturnToWnd); + void RemoveFromTranslator(LONG &Handle); + void UnlockTranslator(); +protected: + DWORD IDWorkThread; + HANDLE hWorkThread; + IStream **ppSession; + BOOL bGetMarshaling; +protected: + HANDLE hExitWork; + HANDLE hExitEvent; + HANDLE hStartEvent; + HANDLE hMarshalingEndEvent; + HANDLE MarshalEvent; + CRITICAL_SECTION m_lock; +protected: + ISession *p_InetSession; +protected: + CEventContainer m_InetSessionEvent; +protected: + void CloseSession(); + void CreateSession(); + void CloseEventContainer(); + void InitEventContainer(); + static DWORD WINAPI WorkThread(LPVOID pParam); +// IConnectionPointPtr m_pSessionConnectionPoint; + DWORD dwSessionCookie; + +}; + +#endif // !defined(AFX_COOLINET2_H__390CD6E9_40FB_42B9_A652_9A965A8737B7__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/Inet/EventContainer.cpp b/Source/Client/IM-Client/IMClient/Inet/EventContainer.cpp new file mode 100644 index 0000000..966dd14 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Inet/EventContainer.cpp @@ -0,0 +1,865 @@ +// EventContainer.cpp : implementation file +// + +#include "stdafx.h" +#include "EventContainer.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// + +HRESULT AutoUnMarchaling(NLT_Container *pContainer, LPUNKNOWN* ppv) +{ + if(pContainer == NULL||pContainer->pMarshalStream==NULL) + return NLT_CONTAINER_ERROR; + + switch(pContainer->EventType) + { + case NTL_ENone: + return NLT_OK; + case NTL_EChangeState: + return NLT_OK; + case NTL_EChangedStatus: + return pContainer->UnMarchaling(__uuidof(IUser),ppv); + case NTL_EMessage: + return pContainer->UnMarchaling(__uuidof(IMessage),ppv); + case NTL_EPromo: + return pContainer->UnMarchaling(__uuidof(IPromo),ppv); + case NTL_EFile: + return pContainer->UnMarchaling(__uuidof(IFile),ppv); + case NTL_EAdd: + return pContainer->UnMarchaling(__uuidof(IUser),ppv); + case NTL_EAddR: + return pContainer->UnMarchaling(__uuidof(IUser),ppv); + case NTL_EReklama: + return NLT_OK; + case NTL_EContactList: + return pContainer->UnMarchaling(__uuidof(IUsers),ppv); + case NTL_EIgnoryList: + return pContainer->UnMarchaling(__uuidof(IUsers),ppv); + case NLT_EDetails: + return pContainer->UnMarchaling(__uuidof(IUser),ppv); + case NLT_ECommandOK: + return NLT_OK; + case NLT_ECommandError: + return NLT_OK; + case NLT_ESessionsList: + return pContainer->UnMarchaling(__uuidof(IlocalSIDs),ppv); + case NLT_EOffLineFiles: + return pContainer->UnMarchaling(__uuidof(IFiles),ppv); + case NLT_EMessagesList: + return pContainer->UnMarchaling(__uuidof(IMessages),ppv); + case NLT_EPromosList: + return pContainer->UnMarchaling(__uuidof(IPromos),ppv); + case NLT_ESelfStatus: + return NLT_OK; + case NLT_EChatList: + return pContainer->UnMarchaling(__uuidof(IChats),ppv); + case NLT_EChatStatus: + return pContainer->UnMarchaling(__uuidof(IUsers),ppv); + case NLT_EChatCreate: + return pContainer->UnMarchaling(__uuidof(IChat),ppv); + case NLT_EChatUserStatus: + return pContainer->UnMarchaling(__uuidof(IUser),ppv); + case NLT_EChatInvite: + return pContainer->UnMarchaling(__uuidof(IChat),ppv); + case NLT_EChatLeave: + return pContainer->UnMarchaling(__uuidof(IUser),ppv); + case NLT_EChatMessage: + return pContainer->UnMarchaling(__uuidof(IChat),ppv); + case NLT_EChatFile: + return pContainer->UnMarchaling(__uuidof(IChat),ppv); + case NLT_EChatAccept: + return pContainer->UnMarchaling(__uuidof(IChat),ppv); + default: + return NLT_EVENT_NO_SUPPORT; + } +} + +HRESULT AutoUnMarchaling2(NLT_Container *pContainer, LPUNKNOWN* ppv) +{ + if(pContainer == NULL||pContainer->pMarshalStream2==NULL) + return NLT_CONTAINER_ERROR; + + switch(pContainer->EventType) + { + case NTL_ENone: + return NLT_OK; + case NTL_EChangeState: + return NLT_OK; + case NTL_EChangedStatus: + return NLT_OK; + case NTL_EMessage: + return NLT_OK; + case NTL_EPromo: + return NLT_OK; + case NTL_EFile: + return NLT_OK; + case NTL_EAdd: + return NLT_OK; + case NTL_EAddR: + return NLT_OK; + case NTL_EReklama: + return NLT_OK; + case NTL_EContactList: + return NLT_OK; + case NTL_EIgnoryList: + return NLT_OK; + case NLT_EDetails: + return NLT_OK; + case NLT_ECommandOK: + return NLT_OK; + case NLT_ECommandError: + return NLT_OK; + case NLT_ESessionsList: + return NLT_OK; + case NLT_EOffLineFiles: + return NLT_OK; + case NLT_EMessagesList: + return NLT_OK; + case NLT_EPromosList: + return NLT_OK; + case NLT_ESelfStatus: + return NLT_OK; + case NLT_EChatList: + return NLT_OK; + case NLT_EChatStatus: + return NLT_OK; + case NLT_EChatCreate: + return NLT_OK; + case NLT_EChatUserStatus: + return pContainer->UnMarchaling2(__uuidof(IChat),ppv); + case NLT_EChatInvite: + return pContainer->UnMarchaling2(__uuidof(IUser),ppv); + case NLT_EChatLeave: + return pContainer->UnMarchaling2(__uuidof(IChat),ppv); + case NLT_EChatMessage: + return pContainer->UnMarchaling2(__uuidof(IMessage),ppv); + case NLT_EChatFile: + return NLT_OK; + case NLT_EChatAccept: + return pContainer->UnMarchaling2(__uuidof(IUser),ppv); + default: + return NLT_EVENT_NO_SUPPORT; + } +} + +HRESULT AutoUnMarchaling3(NLT_Container *pContainer, LPUNKNOWN* ppv) +{ + if(pContainer == NULL||pContainer->pMarshalStream3==NULL) + return NLT_CONTAINER_ERROR; + + switch(pContainer->EventType) + { + case NTL_ENone: + return NLT_OK; + case NTL_EChangeState: + return NLT_OK; + case NTL_EChangedStatus: + return NLT_OK; + case NTL_EMessage: + return NLT_OK; + case NTL_EPromo: + return NLT_OK; + case NTL_EFile: + return NLT_OK; + case NTL_EAdd: + return NLT_OK; + case NTL_EAddR: + return NLT_OK; + case NTL_EReklama: + return NLT_OK; + case NTL_EContactList: + return NLT_OK; + case NTL_EIgnoryList: + return NLT_OK; + case NLT_EDetails: + return NLT_OK; + case NLT_ECommandOK: + return NLT_OK; + case NLT_ECommandError: + return NLT_OK; + case NLT_ESessionsList: + return NLT_OK; + case NLT_EOffLineFiles: + return NLT_OK; + case NLT_EMessagesList: + return NLT_OK; + case NLT_EPromosList: + return NLT_OK; + case NLT_ESelfStatus: + return NLT_OK; + case NLT_EChatList: + return NLT_OK; + case NLT_EChatStatus: + return NLT_OK; + case NLT_EChatCreate: + return NLT_OK; + case NLT_EChatUserStatus: + return NLT_OK; + case NLT_EChatInvite: + return pContainer->UnMarchaling3(__uuidof(IUser),ppv); + case NLT_EChatLeave: + return NLT_OK; + case NLT_EChatMessage: + return NLT_OK; + case NLT_EChatFile: + return NLT_OK; + default: + return NLT_EVENT_NO_SUPPORT; + } +} + + +///////////////////////////////////////////////////////////////////////////// +// CEventContainer + +IMPLEMENT_DYNCREATE(CEventContainer, CCmdTarget) + +CEventContainer::CEventContainer() +{ + EnableAutomation(); +} + +CEventContainer::~CEventContainer() +{ +} + +BEGIN_MESSAGE_MAP(CEventContainer, CCmdTarget) + //{{AFX_MSG_MAP(CEventContainer) + // NOTE - the ClassWizard will add and remove mapping macros here. + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +BEGIN_DISPATCH_MAP(CEventContainer, CCmdTarget) + //{{AFX_DISPATCH_MAP(CEventContainer) + DISP_FUNCTION_ID(CEventContainer,"ChangedState", 1, OnChangedState, VT_EMPTY, VTS_I4 VTS_I4 VTS_I4) + DISP_FUNCTION_ID(CEventContainer,"eChangedStatus",2, One_ChangedStatus, VT_EMPTY, VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"eMessage", 3, One_Message, VT_EMPTY, VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"ePromo", 4, One_Promo, VT_EMPTY, VTS_DISPATCH VTS_BSTR) + DISP_FUNCTION_ID(CEventContainer,"eFile", 5, One_File, VT_EMPTY, VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"eAdd", 6, One_Add, VT_EMPTY, VTS_DISPATCH VTS_BSTR) + DISP_FUNCTION_ID(CEventContainer,"eAddR", 7, One_AddR, VT_EMPTY, VTS_DISPATCH VTS_I4) + DISP_FUNCTION_ID(CEventContainer,"eReklama", 8, One_Reklama, VT_EMPTY, VTS_BSTR) + DISP_FUNCTION_ID(CEventContainer,"ContactList", 9, OnContactList, VT_EMPTY, VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"IgnoreList", 10, OnIgnoreList, VT_EMPTY, VTS_I4 VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"Details", 11, OnDetails, VT_EMPTY, VTS_I4 VTS_DISPATCH VTS_I4) + DISP_FUNCTION_ID(CEventContainer,"CommandOK", 12, OnCommandOk, VT_EMPTY, VTS_I4 VTS_I4) + DISP_FUNCTION_ID(CEventContainer,"CommandError", 13, OnCommandError, VT_EMPTY, VTS_I4 VTS_I4 VTS_I4) + DISP_FUNCTION_ID(CEventContainer,"SessionsList", 14, OnSessionsList , VT_EMPTY, VTS_I4 VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"OffLineFiles", 15, OnOffLineFiles , VT_EMPTY, VTS_I4 VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"MessagesList", 16, OnMessagesList , VT_EMPTY, VTS_I4 VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"PromosList", 17, OnPromosList , VT_EMPTY, VTS_I4 VTS_DISPATCH VTS_BSTR) + DISP_FUNCTION_ID(CEventContainer,"SelfStatus", 18, OnSelfStatus, VT_EMPTY, VTS_I4) + DISP_FUNCTION_ID(CEventContainer,"eSysMess", 19, OneSysMess, VT_EMPTY, VTS_I4 VTS_BSTR) + DISP_FUNCTION_ID(CEventContainer,"ChatList", 20, OnChatList, VT_EMPTY, VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"ChatStatus", 21, OnChatStatus, VT_EMPTY, VTS_I4 VTS_DISPATCH VTS_BSTR) + DISP_FUNCTION_ID(CEventContainer,"ChatCreate", 22, OnChatCreate, VT_EMPTY, VTS_I4 VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"eChatUserStatus", 23, OneChatUserStatus, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"eChatInvite", 24, OneChatInvite, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_BSTR) + DISP_FUNCTION_ID(CEventContainer,"eChatLeave", 25, OneChatLeave, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"eChatMessage", 26, OneChatMessage, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"eChatFile", 27, OneChatFile, VT_EMPTY, VTS_DISPATCH) + DISP_FUNCTION_ID(CEventContainer,"eChatAccept", 28, OneChatAccept, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_I4) +// DISP_FUNCTION_ID(CEventContainer,"", 0x, On , VT_EMPTY, VTS_) + //}}AFX_DISPATCH_MAP +END_DISPATCH_MAP() + +// Note: we add support for IID_IEventContainer to support typesafe binding +// from VBA. This IID must match the GUID that is attached to the +// dispinterface in the .ODL file. +// Необходимо Добавить Интерфейсы Событий к которым вы хотите подключится +// использую IConnectionPoint +BEGIN_INTERFACE_MAP(CEventContainer, CCmdTarget) + INTERFACE_PART(CEventContainer, __uuidof(_ISessionEvents), Dispatch) +END_INTERFACE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CEventContainer message handlers + +void CEventContainer::OnChangedState(long State,long ErrorType,long ErrorCode) +{ + //MCTRACE(8,"[Event] OnChangedState State = %ld ErrorType = %ld ErrorCode = %ld\n",State,ErrorType,ErrorCode); + TRACE(_T("\r\n[Event] OnChangedState State = %ld ErrorType = %ld ErrorCode = %ld\n"), State, ErrorType, ErrorCode); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + + pContainer->EventType = NTL_EChangeState; + + pContainer->Long1 = State; + pContainer->Long2 = ErrorType; + pContainer->Long3 = ErrorCode; + + if(!pContainer->Send(hWnd)) + delete pContainer; + } +} + +void CEventContainer::One_ChangedStatus(IUser* pUser) +{ + //MCTRACE(8,"[Event] One_ChangedStatus\n"); + TRACE(_T("\r\n[Event] One_ChangedStatus\n")); + + // [7/24/2002] + //CString strLogin = (char*)_bstr_t(pUser->GetValue(bstr_t("nick_name"))); + //TRACE("\r\n[Event] One_ChangedStatus --- %s\n",strLogin); + // [7/24/2002] + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + + pContainer->EventType = NTL_EChangedStatus; + HRESULT hr = pContainer->Marchaling(__uuidof(IUser),(LPUNKNOWN)pUser); + if(FAILED(hr)||!pContainer->Send(hWnd)) + { + if(SUCCEEDED(hr)) pUser->Release(); + delete pContainer; + } + } +} + +void CEventContainer::One_Message(IMessage* pMessage) +{ + //MCTRACE(8,"[Event] One_Message\n"); + TRACE(_T("\r\n[Event] One_Message\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EMessage; + HRESULT hr = pContainer->Marchaling(__uuidof(IMessage),(LPUNKNOWN)pMessage); + if(FAILED(hr)||!pContainer->Send(hWnd)) + { + if(SUCCEEDED(hr)) pMessage->Release(); + delete pContainer; + } + } +} + +void CEventContainer::One_Promo(IPromo* pPromo,LPCTSTR PromoAsString) +{ + //MCTRACE(8,"[Event] One_Promo\n"); + TRACE(_T("\r\n[Event] One_Promo\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EPromo; + pContainer->String1 = PromoAsString; + HRESULT hr = pContainer->Marchaling(__uuidof(IPromo),(LPUNKNOWN)pPromo); + if(FAILED(hr)||!pContainer->Send(hWnd)) + { + if(SUCCEEDED(hr)) pPromo->Release(); + delete pContainer; + } + } +} + +void CEventContainer::One_File(IFile* pFile) +{ + //MCTRACE(8,"\r\n[Event] One_File\n"); + TRACE(_T("\r\n[Event] One_File\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EFile; + HRESULT hr = pContainer->Marchaling(__uuidof(IFile),(LPUNKNOWN)pFile); + if(FAILED(hr)||!pContainer->Send(hWnd)) + { + if(SUCCEEDED(hr)) pFile->Release(); + delete pContainer; + } + } +} + +void CEventContainer::One_Add(IUser* pUser, LPCTSTR bstrMessage) +{ + //MCTRACE(8,"\r\n[Event] One_Add\n"); + TRACE(_T("\r\n[Event] One_Add\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EAdd; + HRESULT hr = pContainer->Marchaling(__uuidof(IUser),(LPUNKNOWN)pUser); + pContainer->String1 = bstrMessage; + if(FAILED(hr)||!pContainer->Send(hWnd)) + { + if(SUCCEEDED(hr)) + pUser->Release(); + delete pContainer; + } + } +} + +void CEventContainer::One_AddR(IUser* User, long nResult) +{ + //MCTRACE(8,"\r\n[Event] One_AddR\n"); + TRACE(_T("\r\n[Event] One_AddR\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EAddR; + HRESULT hr = pContainer->Marchaling(__uuidof(IUser),(LPUNKNOWN)User); + pContainer->Long1 = nResult; + if(FAILED(hr)||!pContainer->Send(hWnd)) + { + if(SUCCEEDED(hr)) + User->Release(); + delete pContainer; + } + } +} + +void CEventContainer::One_Reklama(LPCTSTR bstrURL) +{ + //MCTRACE(8,"[Event] One_Reklama\n"); + TRACE(_T("\r\n[Event] One_Reklama\n")); + HWND hWnd = NULL; + m_NetLibTranslator.Lock(); + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + m_NetLibTranslator.UnLock(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EReklama; + pContainer->String1 = bstrURL; + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + } +} + +void CEventContainer::OnContactList(IUsers* pUsers) +{ + //MCTRACE(8,"[Event] OnContactList\n"); + TRACE(_T("\r\n[Event] OnContactList\n")); + HWND hWnd = NULL; + m_NetLibTranslator.Lock(); + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + m_NetLibTranslator.UnLock(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EContactList; + HRESULT hr = pContainer->Marchaling(__uuidof(IUsers),(LPUNKNOWN)pUsers); + if(/*FAILED(hr)||*/!pContainer->Send(hWnd)) + { + if(SUCCEEDED(hr)) + pUsers->Release(); + delete pContainer; + } + } +} + +void CEventContainer::OnIgnoreList(long Handle,IUsers* pUsers) +{ + //MCTRACE(8,"[Event] OnIgnoreList\n"); + TRACE(_T("\r\n[Event] OnIgnoreList\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NTL_EIgnoryList; + HRESULT hr = pContainer->Marchaling(__uuidof(IUsers),(LPUNKNOWN)pUsers); + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + } +} + +void CEventContainer::OnDetails(long Handle, IUser* pUser,long type) +{ + //MCTRACE(8,"[Event] OnDetails\n"); + TRACE(_T("\r\n[Event] OnDetails\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EDetails; + pContainer->Handel = Handle; + HRESULT hr = pContainer->Marchaling(__uuidof(IUser),(LPUNKNOWN)pUser); + pContainer->Send(hWnd); + } +} + +void CEventContainer::OnCommandOk(long Handle, long AddVal) +{ + //MCTRACE(8,"[Event] OnCommandOk\n"); + TRACE(_T("\r\n[Event] OnCommandOk\n")); + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_ECommandOK; + pContainer->Handel = Handle; + pContainer->Long1 = AddVal; + pContainer->Send(hWnd); + } + +} + +void CEventContainer::OnCommandError(long Handle,long ErrorType,long ErrorCode) +{ + //MCTRACE(8,"[Event] OnCommandError Handle = %ld, Type = %ld Code = %ld\n",Handle, ErrorType, ErrorCode); + TRACE(_T("\r\n[Event] OnCommandError Handle = %ld, Type = %ld Code = %ld\n"), Handle, ErrorType, ErrorCode); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_ECommandError; + pContainer->Handel = Handle; + pContainer->Long1 = ErrorType; + pContainer->Long2 = ErrorCode; + pContainer->Send(hWnd); + } +} + +void CEventContainer::OnSessionsList(long Handle, IlocalSIDs* plocalSIDs) +{ + //MCTRACE(8,"[Event] OnSessionsList\n"); + TRACE(_T("\r\n[Event] OnSessionsList\n")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_ESessionsList; + pContainer->Handel = Handle; + HRESULT hr = pContainer->Marchaling(__uuidof(IlocalSIDs),(LPUNKNOWN)plocalSIDs); + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + } +} + +void CEventContainer::OnOffLineFiles(long Handle, IFiles* pFiles) +{ + //MCTRACE(8,"[Event] OnOffLineFiles\n"); + TRACE(_T("\r\n[Event] OnOffLineFiles\n")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EOffLineFiles; + pContainer->Handel = Handle; + HRESULT hr = pContainer->Marchaling(__uuidof(IFiles),(LPUNKNOWN)pFiles); + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + + } +} + +void CEventContainer::OnMessagesList(long Handle, IMessages* pMessages) +{ + //MCTRACE(8,"[Event] OnMessagesList\n"); + TRACE(_T("\r\n[Event] OnMessagesList\n")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EMessagesList; + pContainer->Handel = Handle; + HRESULT hr = pContainer->Marchaling(__uuidof(IMessages),(LPUNKNOWN)pMessages); + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + } +} + +void CEventContainer::OnPromosList(long Handle, IPromos* pPromos, LPCTSTR PromoAsString) +{ + //MCTRACE(8,"[Event] OnPromosList\n"); + TRACE(_T("\r\n[Event] OnPromosList\n")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EPromosList; + pContainer->Handel = Handle; + pContainer->String1 = PromoAsString; + if(pPromos) + HRESULT hr = pContainer->Marchaling(__uuidof(IPromos),(LPUNKNOWN)pPromos); + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + } +} + +void CEventContainer::OnSelfStatus(long Status) +{ + //MCTRACE(8,"[Event] OnSelfStatus\n"); + TRACE(_T("\r\n[Event] OnSelfStatus\n")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_ESelfStatus; + pContainer->Long1 = Status; + pContainer->Send(hWnd); + } +} + +void CEventContainer::OneSysMess(long Code, LPCTSTR Description) +{ + //MCTRACE(8,"[Event] OneSysMess Code = %d, Description = %s\n",Code,Description); + TRACE(_T("\r\n[Event] OneSysMess Code = %d, Description = %s\n"), Code, Description); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_ESysMess; + pContainer->Long1 = Code; + pContainer->String1 = Description; + + pContainer->Send(hWnd); + } +} + +void CEventContainer::OnChatList(IChats *pChats) +{ + //MCTRACE(8,"[Event] OnChatList"); + TRACE(_T("\r\n[Event] OnChatList")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatList; + HRESULT hr = pContainer->Marchaling(__uuidof(IChats),(LPUNKNOWN)pChats); + + pContainer->Send(hWnd); + } +} + +void CEventContainer::OnChatStatus(long Handle, IUsers *pUsers, LPCTSTR bsLog) +{ + //MCTRACE(8,"[Event] OnChatStatus"); + TRACE(_T("\r\n[Event] OnChatStatus")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatStatus; + pContainer->Handel = Handle; + + HRESULT hr = pContainer->Marchaling(__uuidof(IUsers),(LPUNKNOWN)pUsers); + + pContainer->String1 = bsLog; + + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + } +} + +void CEventContainer::OnChatCreate(long Handle, IChat *pChat) +{ + //MCTRACE(8,"[Event] OnChatCreate"); + TRACE(_T("\r\n[Event] OnChatCreate")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetWindow(Handle); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatCreate; + pContainer->Handel = Handle; + + HRESULT hr = pContainer->Marchaling(__uuidof(IChat),(LPUNKNOWN)pChat); + + if(!pContainer->Send(hWnd)) + { + delete pContainer; + } + } +} + +void CEventContainer::OneChatUserStatus(IUser *pUser, IChat *pChat) +{ + //MCTRACE(8,"[Event] OneChatUserStatus"); + TRACE(_T("\r\n[Event] OneChatUserStatus")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatUserStatus; + + HRESULT hr = pContainer->Marchaling(__uuidof(IUser),(LPUNKNOWN)pUser); + hr = pContainer->Marchaling2(__uuidof(IChat),(LPUNKNOWN)pChat); + + pContainer->Send(hWnd); + } +} + +void CEventContainer::OneChatInvite(IChat *pChat, IUser *pUser, IUser *pInvitedFriend, LPCTSTR Invitation) +{ + //MCTRACE(8,"[Event] OneChatInvite"); + TRACE(_T("\r\n[Event] OneChatInvite")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatInvite; + + HRESULT hr = pContainer->Marchaling(__uuidof(IChat),(LPUNKNOWN)pChat); + hr = pContainer->Marchaling2(__uuidof(IUser),(LPUNKNOWN)pUser); + hr = pContainer->Marchaling3(__uuidof(IUser),(LPUNKNOWN)pInvitedFriend); + + pContainer->String1 = Invitation; + + pContainer->Send(hWnd); + } +} + +void CEventContainer::OneChatLeave(IUser *pUser, IChat *pChat) +{ + //MCTRACE(8,"[Event] OneChatLeave"); + TRACE(_T("\r\n[Event] OneChatLeave")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatLeave; + + HRESULT hr = pContainer->Marchaling(__uuidof(IUser),(LPUNKNOWN)pUser); + hr = pContainer->Marchaling2(__uuidof(IChat),(LPUNKNOWN)pChat); + + pContainer->Send(hWnd); + } +} + +void CEventContainer::OneChatMessage(IChat *pChat, IMessage *pMessage) +{ + //MCTRACE(8,"[Event] OneChatMessage"); + TRACE(_T("\r\n[Event] OneChatMessage")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatMessage; + + HRESULT hr = pContainer->Marchaling(__uuidof(IChat),(LPUNKNOWN)pChat); + hr = pContainer->Marchaling2(__uuidof(IMessage),(LPUNKNOWN)pMessage); + + pContainer->Send(hWnd); + } +} + +void CEventContainer::OneChatFile(IChat *pChat) +{ + //MCTRACE(8,"[Event] OneChatFile"); + TRACE(_T("\r\n[Event] OneChatFile")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatFile; + + HRESULT hr = pContainer->Marchaling(__uuidof(IChat),(LPUNKNOWN)pChat); + + pContainer->Send(hWnd); + } +} + +void CEventContainer::OneChatAccept(IChat* pChat, IUser* pUser, long Result) +{ + //MCTRACE(8,"[Event] OneChatAccept"); + TRACE(_T("\r\n[Event] OneChatAccept")); + + HWND hWnd = NULL; + hWnd = m_NetLibTranslator.NLT_GetEventWindow(); + /// ????? Работа с окном ... + if(IsWindow(hWnd)) + { + NLT_Container *pContainer = new NLT_Container; + pContainer->EventType = NLT_EChatAccept; + + HRESULT hr = pContainer->Marchaling(__uuidof(IChat),(LPUNKNOWN)pChat); + hr = pContainer->Marchaling2(__uuidof(IUser),(LPUNKNOWN)pUser); + pContainer->Long1 = Result; + + pContainer->Send(hWnd); + } +} \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/Inet/EventContainer.h b/Source/Client/IM-Client/IMClient/Inet/EventContainer.h new file mode 100644 index 0000000..7de7d58 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Inet/EventContainer.h @@ -0,0 +1,91 @@ +#if !defined(AFX_EVENTCONTAINER_H__E873D884_6A00_42C1_B801_D83591C18CF4__INCLUDED_) +#define AFX_EVENTCONTAINER_H__E873D884_6A00_42C1_B801_D83591C18CF4__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// EventContainer.h : header file +// +#include "NetLibTranslator.h" +///////////////////////////////////////////////////////////////////////////// +// CEventContainer command target +///////////////////////////////////////////////////////////////////////////// +/// Функция для Автоматического разМаршалинга Интефейсов из NLT_Container'ов +/// [in] pContainer - Указатель на контейнер. +/// [out]ppv - Указатель на интерфейс. +/// Возвращает NLT_OK (0L) - Все нормально +/// NLT_CONTAINER_ERROR - Пустой указатель на контейнер +/// NLT_EVENT_NO_SUPPORT - Данный контейнер не поддерживается :( +/// или Ошибка при работе с Com'oм +HRESULT AutoUnMarchaling(NLT_Container *pContainer,LPUNKNOWN* ppv); +HRESULT AutoUnMarchaling2(NLT_Container *pContainer,LPUNKNOWN* ppv); +HRESULT AutoUnMarchaling3(NLT_Container *pContainer,LPUNKNOWN* ppv); + +///////////////////////////////////////////////////////////////////////////// +/// Класс по отлову Событий от ATL_NetLib.dll + +class CEventContainer : public CCmdTarget +{ + DECLARE_DYNCREATE(CEventContainer) +public: + CEventContainer(); // protected constructor used by dynamic creation + virtual ~CEventContainer(); + // Attributes +public: + CNetLibTranslator m_NetLibTranslator; + // Operations +public: + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CEventContainer) + //}}AFX_VIRTUAL + + // Implementation +protected: + void OneChatAccept(IChat* pChat, IUser* pUser, long Result); + void OneChatFile(IChat* pChat); + void OneChatMessage(IChat* pChat, IMessage* pMessage); + void OneChatLeave(IUser* pUser, IChat* pChat); + void OneChatInvite(IChat* pChat, IUser* pUser, IUser* pInvitedFriend, LPCTSTR Invitation); + void OneChatUserStatus(IUser* pUser, IChat* pChat); + void OnChatCreate(long Handle, IChat* pChat); + void OnChatStatus(long Handle, IUsers* pUsers, LPCTSTR bsLog); + void OnChatList(IChats* pChats); + void OneSysMess(long Code, LPCTSTR Description); + void OnChangedState(long State,long ErrorType,long ErrorCode); + void One_ChangedStatus(IUser* pUser); + void One_Message(IMessage* pMessage); + void One_Promo(IPromo* pPromo, LPCTSTR PromoAsString); + void One_File(IFile* pFile); + void One_Add(IUser* pUser, LPCTSTR bstrMessage); + void One_AddR(IUser* User, long nResult); + void One_Reklama(LPCTSTR bstrURL); + void OnContactList(IUsers* pUsers); + void OnIgnoreList(long Handle, IUsers* pUsers); + void OnDetails(long Handle, IUser* pUser,long type); + void OnCommandOk(long Handle, long AddVal); + void OnCommandError(long Handle,long ErrorType,long ErrorCode); + void OnSessionsList(long Handle, IlocalSIDs* plocalSIDs); + void OnOffLineFiles(long Handle, IFiles* pFiles); + void OnMessagesList(long Handle, IMessages* pMessages); + void OnPromosList(long Handle, IPromos* pPromos,LPCTSTR PromoAsString); + void OnSelfStatus(long Status); + //void OnDetails(IUser* pUser); + // Generated message map functions + //{{AFX_MSG(CEventContainer) + // NOTE - the ClassWizard will add and remove member functions here. + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + // Generated OLE dispatch map functions + //{{AFX_DISPATCH(CEventContainer) + //}}AFX_DISPATCH + DECLARE_DISPATCH_MAP() + DECLARE_INTERFACE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_EVENTCONTAINER_H__E873D884_6A00_42C1_B801_D83591C18CF4__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/Inet/NetLibTranslator.cpp b/Source/Client/IM-Client/IMClient/Inet/NetLibTranslator.cpp new file mode 100644 index 0000000..d6aa2ce --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Inet/NetLibTranslator.cpp @@ -0,0 +1,107 @@ +// MeTranslator.cpp: implementation of the CMeTranslator class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +//#include "OfsMessenger.h" +#include "NetLibTranslator.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CNetLibTranslator::CNetLibTranslator() +{ + hEventWnd = NULL; + InitializeCriticalSection(&m_lock); + NLT_Map.InitHashTable(100); +} + +CNetLibTranslator::~CNetLibTranslator() +{ + DeleteCriticalSection(&m_lock); +} + +HWND CNetLibTranslator::NLT_GetWindow(LONG Handle) +{ + HWND hWnd = NULL; + try + { + Translator_Item *pItem = NULL; + if(NLT_Map.Lookup(Handle,pItem)) + { + hWnd = pItem->hReturnToWnd; + } + } + catch(...) + { + ASSERT(FALSE); + } + + return hWnd; +} + + +DWORD CNetLibTranslator::NLT_AddToTranslate(LONG Handle, HWND hReturnToWnd) +{ + try + { + Translator_Item *pItem = new Translator_Item; + pItem->hReturnToWnd = hReturnToWnd; + NLT_Map.SetAt(Handle,pItem); + } + catch(...) + { + ASSERT(FALSE); + } + + return 0; +} + +DWORD CNetLibTranslator::NLT_Remove(LONG Handle) +{ + try + { + Translator_Item *pItem = NULL; + if(NLT_Map.Lookup(Handle,pItem)) + { + if(pItem!=NULL) + { + delete pItem; pItem = NULL; + } + NLT_Map.RemoveKey(Handle); + } + } + catch(...) + { + ASSERT(FALSE); + } + + return 0; +} + +void CNetLibTranslator::NLT_SetEventWindow(HWND hWnd) +{ + hEventWnd = hWnd; +} + +HWND CNetLibTranslator::NLT_GetEventWindow() +{ + return hEventWnd; +} + +void CNetLibTranslator::Lock() +{ + EnterCriticalSection(&m_lock); +} + +void CNetLibTranslator::UnLock() +{ + LeaveCriticalSection(&m_lock); +} diff --git a/Source/Client/IM-Client/IMClient/Inet/NetLibTranslator.h b/Source/Client/IM-Client/IMClient/Inet/NetLibTranslator.h new file mode 100644 index 0000000..f7871c1 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Inet/NetLibTranslator.h @@ -0,0 +1,211 @@ +// MeTranslator.h: interface for the CMeTranslator class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_METRANSLATOR_H__1A51B4DB_3041_4B7F_962A_B669BB3906A0__INCLUDED_) +#define AFX_METRANSLATOR_H__1A51B4DB_3041_4B7F_962A_B669BB3906A0__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include + +enum NTL_Event_ID /// тип События от которого содержатся данные +{ + NTL_ENone = 0L, + NTL_EChangeState, + NTL_EChangedStatus, + NTL_EMessage, + NTL_EPromo, + NTL_EFile, + NTL_EAdd, + NTL_EAddR, + NTL_EReklama, + NTL_EContactList, + NTL_EIgnoryList, + NLT_EDetails, + NLT_ECommandOK, + NLT_ECommandError, + NLT_ESessionsList, + NLT_EOffLineFiles, + NLT_EMessagesList, + NLT_EPromosList, + NLT_ESelfStatus, + NLT_ESysMess, + NLT_EChatList, + NLT_EChatStatus, + NLT_EChatCreate, + NLT_EChatUserStatus, + NLT_EChatInvite, + NLT_EChatLeave, + NLT_EChatMessage, + NLT_EChatFile, + NLT_EChatAccept +}; +///// Ошибки NLT +const HRESULT NLT_OK = 0L; +const HRESULT NLT_CONTAINER_ERROR = -1L; +const HRESULT NLT_EVENT_NO_SUPPORT = -2L; + +///// Событие +const DWORD WM_NLT_CONTAINER_EVENT = WM_USER + 0x0301; + +/// Структура Хранилище Данных +struct NLT_Container +{ + NLT_Container():Handel(0), pMarshalStream(NULL),pMarshalStream2(NULL),pMarshalStream3(NULL), + Long1(0),Long2(0),Long3(0),String1(L"") + { + EventType = NTL_ENone; + UnMarshalEvent = CreateEvent(NULL,FALSE,FALSE,NULL); + }; + ~NLT_Container() + { + CloseHandle(UnMarshalEvent); + if(pMarshalStream!=NULL) + { + pMarshalStream->Release(); + pMarshalStream = NULL; + } + if(pMarshalStream2!=NULL) + { + pMarshalStream2->Release(); + pMarshalStream2 = NULL; + } + if(pMarshalStream3!=NULL) + { + pMarshalStream3->Release(); + pMarshalStream3 = NULL; + } + }; + BOOL Send(HWND hWnd) + { + BOOL bSend = ::PostMessage(hWnd,WM_NLT_CONTAINER_EVENT,(WPARAM)this,NULL); +// if(bSend&&pMarshalStream!=NULL) +// { +// WaitForSingleObject(UnMarshalEvent,INFINITE); +// } + return bSend; + }; + + + /// Уже автоматически Увеличивает Счетчик, в потоке где будет + /// использоваться этот объект остается лишь освободить + HRESULT Marchaling(REFIID riid, LPUNKNOWN pUnk) + { + // 10.04.2002 added by Artyom + if(pUnk == NULL) + return E_POINTER; + // end + + HRESULT hr = CoMarshalInterThreadInterfaceInStream(riid,pUnk,&pMarshalStream); + ASSERT(SUCCEEDED(hr)); + return hr; + }; + + HRESULT UnMarchaling(REFIID riid,LPUNKNOWN *pUnk) + { + HRESULT hr = CoGetInterfaceAndReleaseStream(pMarshalStream,riid,(void**)pUnk); +// ASSERT(SUCCEEDED(hr)); + if(SUCCEEDED(hr)) + { + pMarshalStream = NULL; + } + + return hr; + }; + + HRESULT Marchaling2(REFIID riid, LPUNKNOWN pUnk) + { + // 10.04.2002 added by Artyom + if(pUnk == NULL) + return E_POINTER; + // end + + HRESULT hr = CoMarshalInterThreadInterfaceInStream(riid,pUnk,&pMarshalStream2); + ASSERT(SUCCEEDED(hr)); + return hr; + }; + + HRESULT UnMarchaling2(REFIID riid,LPUNKNOWN *pUnk) + { + HRESULT hr = CoGetInterfaceAndReleaseStream(pMarshalStream2,riid,(void**)pUnk); +// ASSERT(SUCCEEDED(hr)); + if(SUCCEEDED(hr)) + { + pMarshalStream2 = NULL; + } + + return hr; + }; + + HRESULT Marchaling3(REFIID riid, LPUNKNOWN pUnk) + { + // 10.04.2002 added by Artyom + if(pUnk == NULL) + return E_POINTER; + // end + + HRESULT hr = CoMarshalInterThreadInterfaceInStream(riid,pUnk,&pMarshalStream3); + ASSERT(SUCCEEDED(hr)); + return hr; + }; + + HRESULT UnMarchaling3(REFIID riid,LPUNKNOWN *pUnk) + { + HRESULT hr = CoGetInterfaceAndReleaseStream(pMarshalStream3,riid,(void**)pUnk); +// ASSERT(SUCCEEDED(hr)); + if(SUCCEEDED(hr)) + { + pMarshalStream3 = NULL; + } + + return hr; + }; + + LONG Handel; + NTL_Event_ID EventType; + IStream *pMarshalStream; + IStream *pMarshalStream2; + IStream *pMarshalStream3; + LONG Long1; + LONG Long2; + LONG Long3; + _bstr_t String1; +protected: + HANDLE UnMarshalEvent; +}; + +/// Хранилище Окон куда перенаправляются события +/// При многопотоковой работе необходимо использовать +/// Lock и Unlock. +class CNetLibTranslator +{ +public: + struct Translator_Item + { + Translator_Item():hReturnToWnd(NULL) + {}; + HWND hReturnToWnd; + }; +private: + HWND hEventWnd; + /// 1. Лист Сообщений. + CMap NLT_Map; + CRITICAL_SECTION m_lock; +public: + void Lock(); + void UnLock(); + void NLT_SetEventWindow(HWND hWnd); + HWND NLT_GetWindow(LONG Handle); /// only fot CEventContainer ... + HWND NLT_GetEventWindow(); + DWORD NLT_AddToTranslate(LONG Handle, HWND hReturnToWnd); + DWORD NLT_Remove(LONG Handle); + + CNetLibTranslator(); + virtual ~CNetLibTranslator(); + +}; + +#endif \ No newline at end of file diff --git a/Source/Client/IM-Client/IMClient/InviteChatDlg.cpp b/Source/Client/IM-Client/IMClient/InviteChatDlg.cpp new file mode 100644 index 0000000..bce3102 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/InviteChatDlg.cpp @@ -0,0 +1,595 @@ +// InviteChatDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "InviteChatDlg.h" +#include "GlobalFunction.h" +#include "MainDlg.h" +//#include "MainFrm.h" +#include "LoadSkins.h" +#include "ExDispid.h" +#include "ChatCreateDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CInviteChatDlg dialog +extern CString GetCurrentSkin(); + +CInviteChatDlg::CInviteChatDlg(CMainDlg* pParent) +: CResizableDialog(CInviteChatDlg::IDD, pParent) +{ + EnableAutomation(); + //{{AFX_DATA_INIT(CInviteChatDlg) + //}}AFX_DATA_INIT + Handle = 0; + pMessenger = pParent; + bIsKillWinodow = FALSE; + m_dwSessionCookie = 0; +} + + +void CInviteChatDlg::DoDataExchange(CDataExchange* pDX) +{ + CResizableDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CInviteChatDlg) + //DDX_Control(pDX, IDC_FRAME_EDIT, m_frameEdit); + DDX_Control(pDX, IDC_NICK_EDIT, m_Nick); + DDX_Control(pDX, IDC_MCACCEPT, m_Accept); + DDX_Control(pDX, IDC_MCDENY, m_Deny); + DDX_Control(pDX, IDC_MCUSERDETAILS, m_Details); + DDX_Control(pDX, IDC_EDIT_EXPLORER, m_edit); + DDX_Control(pDX, IDC_MCCHATDETAILS,m_ChatDetails); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CInviteChatDlg, CResizableDialog) +//{{AFX_MSG_MAP(CInviteChatDlg) +//ON_BN_CLICKED(ID_DANY, OnDany) +ON_COMMAND(ID_EDITMENU_COPY, OnEditmenuCopy) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_COPY, OnUpdateEditmenuCopy) +ON_COMMAND(ID_EDITMENU_CUT, OnEditmenuCut) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_CUT, OnUpdateEditmenuCut) +ON_COMMAND(ID_EDITMENU_DELETE, OnEditmenuDelete) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_DELETE, OnUpdateEditmenuDelete) +ON_COMMAND(ID_EDITMENU_PAST, OnEditmenuPast) +ON_UPDATE_COMMAND_UI(ID_EDITMENU_PAST, OnUpdateEditmenuPast) +ON_WM_CAPTURECHANGED() +ON_BN_CLICKED(IDC_MCUSERDETAILS, OnMcUserDetails) +ON_BN_CLICKED(IDC_MCACCEPT, OnMcAccept) +ON_WM_CANCELMODE() +ON_BN_CLICKED(IDC_MCDENY, OnMcDeny) +ON_BN_CLICKED(IDC_MCCHATDETAILS,OnMcChatDetails) +//}}AFX_MSG_MAP +ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) +END_MESSAGE_MAP() + +BEGIN_EVENTSINK_MAP(CInviteChatDlg, CResizableDialog) +//{{AFX_EVENTSINK_MAP(CInviteChatDlg) +ON_EVENT(CInviteChatDlg, IDC_EDIT_EXPLORER, DISPID_DOCUMENTCOMPLETE, OnWebDocumentCompleted, VTS_DISPATCH VTS_PVARIANT) +//}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +BEGIN_INTERFACE_MAP(CInviteChatDlg, CCmdTarget) +INTERFACE_PART(CInviteChatDlg, __uuidof(_IMpaWebCustomizerEvents), Dispatch) +END_INTERFACE_MAP() + +BEGIN_DISPATCH_MAP(CInviteChatDlg, CCmdTarget) +//{{AFX_DISPATCH_MAP(CHistoryDlg) +DISP_FUNCTION_ID(CInviteChatDlg,"", 18, OnShowContextMenu, VT_EMPTY, VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_PI4) +//}}AFX_DISPATCH_MAP +END_DISPATCH_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CInviteChatDlg message handlers + +void CInviteChatDlg::OnOK() +{ +} + +void CInviteChatDlg::OnCancel() +{ + if(Handle&&pMessenger->ConnectEnable()) + { + pSession->CancelOperation(Handle); + } + else + KillWindow(); +} + + + +BOOL CInviteChatDlg::OnInitDialog() +{ + CResizableDialog::OnInitDialog(); + + HRESULT hr = m_pWebCustomizer.CreateInstance(CLSID_MpaWebCustomizer); + + LPUNKNOWN pDispatch = m_edit.GetControlUnknown(); + m_pWebCustomizer->PutRefWebBrowser((LPDISPATCH)pDispatch); + + InitMpaWebEvent(); + + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),TRUE); + + CRect winRect; + GetWindowRect(&winRect); + + CRect rTmp(15,70,winRect.Width()-15,winRect.Height()-50); + + CRect r; + + AddAnchor(m_Nick.GetSafeHwnd(), CSize(0,0), CSize(0,0)); + AddAnchor(m_edit.GetSafeHwnd(), CSize(0,0), CSize(100,100)); + AddAnchor(m_Deny.GetSafeHwnd(), CSize(100,100), CSize(100,100)); + AddAnchor(m_Accept.GetSafeHwnd(), CSize(100,100), CSize(100,100)); + AddAnchor(m_Details.GetSafeHwnd(), CSize(0,100), CSize(0,100)); + AddAnchor(m_ChatDetails.GetSafeHwnd(), CSize(0,100), CSize(0,100)); + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDS_INVITE_CHAT, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + + m_Nick.Invalidate(FALSE); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + + +void CInviteChatDlg::SetInfo(CChat &Chat, CUser &user, BSTR Data) +{ + USES_CONVERSION; + + m_User = user; + + m_Chat = Chat; + + CString strNickText; + strNickText.Format(GetString(IDS_INVITE_CHAT_NICK_NAME),m_User.GetShowName()); + m_Nick.SetWindowText(strNickText); + + m_bsHTML = L""; + m_bsHTML += Data; + m_bsHTML += L""; + + m_edit.Navigate(_T("about:blank"),0,0,0,0); + + CString strWindowsCaption; + strWindowsCaption.Format(GetString(IDD_INVITE_CHAT_DIALOG_TEXT),W2CT(m_Chat.GetName())); + + SetWindowText(strWindowsCaption); + + UpdateData(FALSE); + + if(m_User.IsBad()) + { + if(!Handle) + { + if(pMessenger->ConnectEnable()) + { + theNet2.LockTranslator(); + try + { + Handle = pSession->UserDetails(m_User.GetGlobalID(),1); + if(Handle) + { + Block(); + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + } + } + catch (_com_error&) + { + ASSERT(FALSE); + } + + theNet2.UnlockTranslator(); + } + } + } +} + +void CInviteChatDlg::UnBlock() +{ + m_Accept.EnableWindow(TRUE); + m_Deny.EnableWindow(TRUE); +} + +void CInviteChatDlg::Block() +{ + m_Accept.EnableWindow(FALSE); + m_Deny.EnableWindow(FALSE); +} + +LRESULT CInviteChatDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + NLT_Container *pItem = (NLT_Container *)w; + ASSERT(pItem!=NULL); + + UnBlock(); + switch(pItem->EventType) + { + case NLT_EDetails: + { + IUser *pUser = NULL; + HRESULT hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + + if(SUCCEEDED(hr)) + { + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + try + { + CUser InfoUser(pUser); + m_User = InfoUser; + + CString strNickText; + strNickText.Format(GetString(IDS_INVITE_CHAT_NICK_NAME),m_User.GetShowName()); + m_Nick.SetWindowText(strNickText); + + UpdateData(FALSE); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + pUser->Release(); + } + } + break; + case NLT_EChatCreate: + { + IChat *pChat = NULL; + HRESULT hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pChat); + if(hr==S_OK) + { + // Step 1. Add new Chat to ChatsCollections [8/9/2002] + pMessenger->AddNewChat(pChat,SC_INACTIVE); + // Step 2. Connect to Chat [9/7/2002] + CChat Chat(pChat); + pMessenger->SetChatStatus(Chat.GetId(),SC_ACTIVE,CMainDlg::HCI_OPEN_CHAT_WINDOW); + // Step 2. Free Interface [8/9/2002] + pChat->Release(); + } + // Step 3. Close the Window + KillWindow(); + } + break; + case NLT_ECommandOK: + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + KillWindow(); + break; + case NLT_ECommandError: + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(Handle); + theNet2.UnlockTranslator(); + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + } + } + MessageBox(GetString(IDS_INVITECHAT_ERROR),GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONSTOP); + break; + } + + delete pItem; + return 0; +} + +void CInviteChatDlg::KillWindow() +{ + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + CResizableDialog::OnClose(); + if(!bIsKillWinodow) + { + CloseMpaWebEvent(); + bIsKillWinodow = TRUE; + DestroyWindow(); + delete this; + } +} + +void CInviteChatDlg::OnDany() +{ + if(!Handle) + { + if(pMessenger->ConnectEnable()) + { + theNet2.LockTranslator(); + try + { + Handle = m_Chat->Accept(0); + if(Handle) + { + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + Block(); + } + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + theNet2.UnlockTranslator(); + } + } +} + +void CInviteChatDlg::OnEditmenuCopy() +{ + //pCmdUI->Enable(m_edit.EnableClipboardCopy()); +} + +void CInviteChatDlg::OnUpdateEditmenuCopy(CCmdUI* pCmdUI) +{ + //pCmdUI->Enable(m_edit.EnableClipboardCopy()); +} + +void CInviteChatDlg::OnEditmenuCut() +{ +} + +void CInviteChatDlg::OnUpdateEditmenuCut(CCmdUI* pCmdUI) +{ +} + +void CInviteChatDlg::OnEditmenuDelete() +{ +} + +void CInviteChatDlg::OnUpdateEditmenuDelete(CCmdUI* pCmdUI) +{ +} + +void CInviteChatDlg::OnEditmenuPast() +{ +} + +void CInviteChatDlg::OnUpdateEditmenuPast(CCmdUI* pCmdUI) +{ +} + + +void CInviteChatDlg::OnAuthorizationRequest() +{ + DHTMLE_ADDCONTACT_Container *pData = new DHTMLE_ADDCONTACT_Container; + + pData->email = m_User.m_strEMail; + pData->first_name = m_User.m_strFirstName; + pData->last_name = m_User.m_strLastName; + pData->nick_name = m_User.m_strLogin; + pData->role_id = m_User.m_RoleID; + pData->role_name = m_User.m_strType; + pData->user_id = m_User.GlobalID; + + pMessenger->SendMessage(WM_DHTML_EVENT,(WPARAM)DHTMLE_ADDCONTACT,(LPARAM)pData); + + KillWindow(); +} + +void CInviteChatDlg::OnGetuserdetailsButton() +{ + pMessenger->ShowUserDetails(m_User.GetGlobalID()); +} + +void CInviteChatDlg::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDS_INVITE_CHAT,RectToString(rWindow)); + + CResizableDialog::OnCaptureChanged(pWnd); +} + + +void CInviteChatDlg::OnMcUserDetails() +{ + OnGetuserdetailsButton(); +} + +void CInviteChatDlg::OnMcAddToContact() +{ + OnAuthorizationRequest(); +} + +void CInviteChatDlg::OnMcAccept() +{ + if(!Handle) + { + if(pMessenger->ConnectEnable()) + { + theNet2.LockTranslator(); + //Handle = pSession->AddUserReply(m_User.GetGlobalID(),1); + try + { + Handle = m_Chat->Accept(1); + if(Handle) + { + theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); + Block(); + } + } + catch(_com_error&) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + } +} + +void CInviteChatDlg::OnMcDeny() +{ + OnDany(); +} + +void CInviteChatDlg::InitMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + CComPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + LPUNKNOWN pInterEvent = GetInterface(&IID_IUnknown); + hr = m_pSessionConnectionPoint->Advise(pInterEvent ,&m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + +void CInviteChatDlg::CloseMpaWebEvent() +{ + IConnectionPointContainer* pCPContainer = NULL; + CComPtr m_pSessionConnectionPoint; + HRESULT hr = m_pWebCustomizer->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPContainer); + + if (pCPContainer) + { + hr = pCPContainer->FindConnectionPoint(__uuidof(_IMpaWebCustomizerEvents),&m_pSessionConnectionPoint); + if(SUCCEEDED(hr)) + { + hr = m_pSessionConnectionPoint->Unadvise(m_dwSessionCookie); + pCPContainer->Release(); + } + else + { + ASSERT(FALSE); + } + } + else + { + ASSERT(FALSE); + } +} + + +void CInviteChatDlg::OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow) +{ + *pShow = 0; + + HRESULT hr = S_OK; + HINSTANCE hinstSHDOCLC; + HWND hwnd; + HMENU hMenu; + + CComPtr spCT; + CComPtr spWnd; + + hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT); + if(SUCCEEDED(hr)) + { + hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd); + if(SUCCEEDED(hr)) + { + hr = spWnd->GetWindow(&hwnd); + + if(SUCCEEDED(hr)) + { + hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); + + hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(24641)); + + hMenu = GetSubMenu(hMenu, 4); + + int iSelection = ::TrackPopupMenu(hMenu, + TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, x, y, 0, hwnd, (RECT*)NULL); + + // Пересылаем выбранную команду окну броузера + LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); + + FreeLibrary(hinstSHDOCLC); + } + } + } +} + +void CInviteChatDlg::OnWebDocumentCompleted(IDispatch *pDisp, VARIANT *URL) +{ + // Step1. Получить HTML Document [5/7/2002] + CComPtr pHtmlDoc; + pHtmlDoc.Attach((IHTMLDocument2*)m_edit.GetDocument()); + + // Step 2. Try Load HTML to WebBrowser + CComPtr pPersistStream = NULL; + + if(pHtmlDoc&&m_bsHTML.Length()) + { + HRESULT hr = pHtmlDoc->QueryInterface(IID_IPersistStreamInit,(void**)&pPersistStream); + if(SUCCEEDED(hr)) + { + hr = pPersistStream->InitNew(); + + HGLOBAL hMem = NULL; + + ULONG StrRealSize = (m_bsHTML.Length()+1)*2; + hMem = GlobalAlloc(GPTR, StrRealSize+2); + LPBYTE pBuf = (LPBYTE)GlobalLock(hMem); + ////////////////////////////////////////////////////////////////////////// + // !!! CAUTION [6/18/2002] + // Обязательно добавлять, перед Unicode - данными, + // иначе IE не правильно будет определять, не английские Unicode символы. + // !!! CAUTION [6/18/2002] + ////////////////////////////////////////////////////////////////////////// + pBuf[0]=0xFF; + pBuf[1]=0xFE; + ////////////////////////////////////////////////////////////////////////// + memcpy((LPVOID)(pBuf+2),(void*)m_bsHTML,StrRealSize); + ////////////////////////////////////////////////////////////////////////// + GlobalUnlock(hMem); + + CComPtr pDataStream = NULL; + CreateStreamOnHGlobal(hMem,TRUE,&pDataStream); + + hr = pPersistStream->Load(pDataStream); + + } + m_bsHTML.Empty(); + } +} + +void CInviteChatDlg::OnMcChatDetails() +{ + USES_CONVERSION; + CChatCreateDlg *pChatDetailsDlg = new CChatCreateDlg(pMessenger); + + pChatDetailsDlg->Create(CChatCreateDlg::CCDM_DETAIL,W2CT(m_Chat.GetName()),W2CT(m_Chat.GetDescription()),NULL,&(m_Chat.GetUsers()),m_Chat.GetId()); + pMessenger->AddToAllCloseWindow(pChatDetailsDlg->GetSafeHwnd()); + // Load UserCollections to CChatCreateDlg [8/8/2002] + pChatDetailsDlg->ShowWindow(SW_SHOW); +} diff --git a/Source/Client/IM-Client/IMClient/InviteChatDlg.h b/Source/Client/IM-Client/IMClient/InviteChatDlg.h new file mode 100644 index 0000000..59a046d --- /dev/null +++ b/Source/Client/IM-Client/IMClient/InviteChatDlg.h @@ -0,0 +1,117 @@ +//{{AFX_INCLUDES() +#include "webbrowser2.h" +//}}AFX_INCLUDES +#if !defined(AFX_InviteChatDlg_H__EDC9A951_2F0D_4865_9669_395BDA4E8E64__INCLUDED_) +#define AFX_InviteChatDlg_H__EDC9A951_2F0D_4865_9669_395BDA4E8E64__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// InviteChatDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CInviteChatDlg dialog +#include "OfsNcDlg.h" +#include "ResizableImage.h" +#include "McButton.h" +#include "Label.h" + +//#include ".\\OFSDhtmlEditCtrl\\OFSDhtmlCtrl.h" +#include "user.h" // Added by ClassView +#include "chat.h" + +class CMainDlg; + + +class CInviteChatDlg : public CResizableDialog +{ +// Construction +public: + CInviteChatDlg(CMainDlg* pParent); // standard constructor + + void SetInfo(CChat &Chat, CUser &user, BSTR Data); +// Dialog Data + //{{AFX_DATA(CInviteChatDlg) + enum { IDD = IDD_INVITE_CHAT_DIALOG }; + CStatic m_frameEdit; + CStatic m_Nick; + CButton m_Accept; + CButton m_Deny; + CButton m_Details; + CButton m_ChatDetails; + CWebBrowser2 m_edit; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CInviteChatDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation + +private: + CUser m_User; + CChat m_Chat; + +protected: + void InitMpaWebEvent(); + void CloseMpaWebEvent(); + + IMpaWebCustomizerPtr m_pWebCustomizer; + DWORD m_dwSessionCookie; + CComBSTR m_bsHTML; + + void KillWindow(); + CMainDlg *pMessenger; + ISessionPtr pSession; + long Handle; + void UnBlock(); + void Block(); + //COfsDhtmlEditCtrl m_edit; + BOOL bIsKillWinodow; + // Generated message map functions + //{{AFX_MSG(CInviteChatDlg) + virtual void OnOK(); + virtual void OnCancel(); + virtual BOOL OnInitDialog(); + afx_msg void OnMcChatDetails(); + afx_msg void OnDany(); + afx_msg void OnEditmenuCopy(); + afx_msg void OnUpdateEditmenuCopy(CCmdUI* pCmdUI); + afx_msg void OnEditmenuCut(); + afx_msg void OnUpdateEditmenuCut(CCmdUI* pCmdUI); + afx_msg void OnEditmenuDelete(); + afx_msg void OnUpdateEditmenuDelete(CCmdUI* pCmdUI); + afx_msg void OnEditmenuPast(); + afx_msg void OnUpdateEditmenuPast(CCmdUI* pCmdUI); + afx_msg void OnAuthorizationRequest(); + afx_msg void OnGetuserdetailsButton(); + afx_msg void OnCaptureChanged(CWnd *pWnd); + afx_msg void OnClickMcclose(); + afx_msg void OnClickMcmini(); + afx_msg void OnClickMcdeny(); + afx_msg void OnClickMcadd(); + afx_msg void OnClickMcdetails(); + afx_msg void OnMcUserDetails(); + afx_msg void OnMcAddToContact(); + afx_msg void OnMcAccept(); + afx_msg void OnMcDeny(); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + LRESULT OnNetEvent(WPARAM w,LPARAM l); + afx_msg void OnShowContextMenu(long dwID, long x, long y, IUnknown *pcmdTarget, IDispatch *pdispReserved, long* pShow); + void OnWebDocumentCompleted(IDispatch* pDisp, VARIANT* URL); + DECLARE_INTERFACE_MAP() + DECLARE_DISPATCH_MAP() + + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_InviteChatDlg_H__EDC9A951_2F0D_4865_9669_395BDA4E8E64__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/Label.cpp b/Source/Client/IM-Client/IMClient/Label.cpp new file mode 100644 index 0000000..0f68882 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Label.cpp @@ -0,0 +1,1218 @@ +// Label.cpp : implementation file +// + +#include "stdafx.h" +#include "Label.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +BEGIN_MESSAGE_MAP(CLabel, CStatic) + //{{AFX_MSG_MAP(CLabel) + ON_WM_TIMER() + ON_WM_LBUTTONDOWN() + ON_WM_SETCURSOR() + ON_WM_SYSCOLORCHANGE() + ON_WM_PAINT() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CLabel Version 1.2 +// +// From now on I'll try to keep a log of fixes and enhancements... +// +// The new feature were added due to the response of people. +// All I ask is to all you programmers out there, is if you add, fix or +// enhance this code, sent me a copy and I'll send the copy on to www.codeproject.com +// +// Happy Software Engineer :) +// +// New features include: +// +// A. Support for 3D Fonts +// B. Support for background transparency +// C. More comments provided +// D. If alignment is 'centered' and the window text is seperated by '\r\n' +// the will be centered accordingly - requested by someone @ nasa ;) +// E. Support for font rotation. +// F. Respond to System Color Change +// G. OnPaint improved performance - using Double Buffering Technique +// +// Thanks to: +// Mark McDowell - For suggestion on 'Increasing the flexibility of "hypertext" setting...' +// Erich Ruth - For suggestion on 'Font Rotation' +// + +///////////////////////////////////////////////////////////////////////////// +// CLabel Version 1.3 +// +// A. Added SS_LEFTNOWORDWRAP to include wordwrap +// B. Fix repainting problem +// C. Fix SetBkColor +// D. Added SS_CENTER + +// Thanks to: +// Marius - Added styling problem. +// Azing Vondeling & Broker - Spotting painting Problem. +// Mel Stober - Back Color & SS_CENTER +// +///////////////////////////////////////////////////////////////////////////// +// CLabel Version 1.4 +// +// A. Fix to transparency mode +// B. Added new SetText3DHiliteColor to change the 3D Font face color - default is white. +// +// Thanks to: +// michael.groeger - Spotting Transparency with other controls bug. +// +// +///////////////////////////////////////////////////////////////////////////// +// CLabel Version 1.5 +// +// A. Sanity handle check +// B. Support Interface Charset +// C. Check compilition with _UNICODE +// D. Fix hyperlink feature +// E. Support default Dialog Font +// F. Inclusion of SS_OWNERDRAW via control creation and subclassing +// G. Modification to Text aligmnent code +// H. New background gradient fill function +// +// Thanks to: +// Steve Kowald - Using null handles +// Alan Chan - Supporting International Windows +// Dieter Fauth - Request for default Dialog font +// Herb Illfelder - Text Alignment code +// +// +///////////////////////////////////////////////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::CLabel +// +// Description: Default contructor +// +// INPUTS: +// +// RETURNS: +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel::CLabel() +{ + m_crText = GetSysColor(COLOR_WINDOWTEXT); + +// 1.1 + m_hBackBrush = NULL; + + + m_crHiColor = 0; + m_crLoColor = 0; + + m_bTimer = FALSE; + m_bState = FALSE; + m_bTransparent = FALSE; + m_bLink = TRUE; + m_hCursor = NULL; + m_Type = None; + m_bFont3d = FALSE; + m_bNotifyParent = FALSE; + m_bToolTips = FALSE; + m_bRotation = FALSE; + m_fillmode = Normal; + m_cr3DHiliteColor = RGB(255,255,255); + + m_hwndBrush = ::CreateSolidBrush(GetSysColor(COLOR_3DFACE)); +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::~CLabel +// +// Description: +// +// INPUTS: +// +// RETURNS: +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// NT ALMOND 15092000 1.5 Handle Check +////////////////////////////////////////////////////////////////////////// +CLabel::~CLabel() +{ + // Clean up + m_font.DeleteObject(); + ::DeleteObject(m_hwndBrush); + + // Stop Checking complaining + if (m_hBackBrush) + ::DeleteObject(m_hBackBrush); + +} + +void CLabel::UpdateSurface() +{ + CRect (rc); + GetWindowRect(rc); + RedrawWindow(); + + if(GetParent()) + { + GetParent()->ScreenToClient(rc); + GetParent()->InvalidateRect(rc,TRUE); + GetParent()->UpdateWindow(); + } +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::ReconstructFont +// +// Description: Helper function to build font after it was changed +// +// INPUTS: +// +// RETURNS: +// +// NOTES: PROTECTED +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +void CLabel::ReconstructFont() +{ + m_font.DeleteObject(); + BOOL bCreated = m_font.CreateFontIndirect(&m_lf); + + ASSERT(bCreated); +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::OnPaint +// +// Description: Handles all the drawing code for the label +// +// INPUTS: +// +// RETURNS: +// +// NOTES: Called by Windows... not by USER +// Probably needs tiding up a some point. +// Different states will require this code to be reworked. +// +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 22/10/98 1.0 Origin +// NT ALMOND 15092000 1.5 Handle Check +// NT ALMOND 15092000 1.5 Alignment mods +// NT ALMOND 15092000 1.5 Gradient Fill Mode +////////////////////////////////////////////////////////////////////////// + +void CLabel::OnPaint() +{ + CPaintDC dc(this); // device context for painting + + DWORD dwFlags = 0; + + CRect rc; + GetClientRect(rc); + CString strText; + GetWindowText(strText); + CBitmap bmp; + + + /////////////////////////////////////////////////////// + // + // Set up for double buffering... + // + CDC* pDCMem; + + if (!m_bTransparent) + { + pDCMem = new CDC; + pDCMem->CreateCompatibleDC(&dc); + bmp.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height()); + pDCMem->SelectObject(&bmp); + } + else + { + pDCMem = &dc; + } + + UINT nMode = pDCMem->SetBkMode(TRANSPARENT); + + + COLORREF crText = pDCMem->SetTextColor(m_crText); + CFont *pOldFont = pDCMem->SelectObject(&m_font); + + + // Fill in backgound if not transparent + if (!m_bTransparent) + { + if (m_fillmode == Normal) + { + CBrush br; + + if (m_hBackBrush != NULL) + br.Attach(m_hBackBrush); + else + br.Attach(m_hwndBrush); + + pDCMem->FillRect(rc,&br); + + br.Detach(); + } + else // Gradient Fill + { + DrawGradientFill(pDCMem, &rc, m_crLoColor, m_crHiColor, 100); + } + + } + + + // If the text is flashing turn the text color on + // then to the color of the window background. + + LOGBRUSH lb; + ZeroMemory(&lb,sizeof(lb)); + + // Stop Checking complaining + if (m_hBackBrush) + ::GetObject(m_hBackBrush,sizeof(lb),&lb); + + + // Something to do with flashing + if (!m_bState && m_Type == Text) + pDCMem->SetTextColor(lb.lbColor); + + DWORD style = GetStyle(); + + switch (style & SS_TYPEMASK) + { + case SS_RIGHT: + dwFlags = DT_RIGHT | DT_WORDBREAK; + break; + + case SS_CENTER: + dwFlags = SS_CENTER | DT_WORDBREAK; + break; + + case SS_LEFTNOWORDWRAP: + dwFlags = DT_LEFT; + break; + + default: // treat other types as left + case SS_LEFT: + dwFlags = DT_LEFT | DT_WORDBREAK; + break; + } + + + // If the text centered make an assumtion that + // the will want to center verticly as well + if (style & SS_CENTERIMAGE) + { +// dwFlags = DT_CENTER; + + // Apply + if (strText.Find(_T("\r\n")) == -1) + { + dwFlags |= DT_VCENTER; + + // And because DT_VCENTER only works with single lines + dwFlags |= DT_SINGLELINE; + } + } + + // + // 3333 DDDDD + // 3 D D + // 33 D D E F X + // 3 D D + // 3333 DDDDD + // + // + if (m_bRotation) + { + int nAlign = pDCMem->SetTextAlign (TA_BASELINE); + + CPoint pt; + GetViewportOrgEx (pDCMem->m_hDC,&pt) ; + SetViewportOrgEx (pDCMem->m_hDC,rc.Width() / 2, rc.Height() / 2, NULL) ; + pDCMem->TextOut (0, 0, strText) ; + SetViewportOrgEx (pDCMem->m_hDC,pt.x / 2, pt.y / 2, NULL) ; + pDCMem->SetTextAlign (nAlign); + } + else + { + pDCMem->DrawText(strText,rc,dwFlags); + if (m_bFont3d) + { + pDCMem->SetTextColor(m_cr3DHiliteColor); + + if (m_3dType == Raised) + rc.OffsetRect(-1,-1); + else + rc.OffsetRect(1,1); + + pDCMem->DrawText(strText,rc,dwFlags); + m_3dType; + + } + } + + // Restore DC's State + pDCMem->SetBkMode(nMode); + pDCMem->SelectObject(pOldFont); + pDCMem->SetTextColor(crText); + + if (!m_bTransparent) + { + dc.BitBlt(0,0,rc.Width(),rc.Height(),pDCMem,0,0,SRCCOPY); + delete pDCMem; + } +} + + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::OnTimer +// +// Description: Used in conjunction with 'FLASH' functions +// +// INPUTS: Windows API +// +// RETURNS: Windows API +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +void CLabel::OnTimer(UINT nIDEvent) +{ + + m_bState = !m_bState; + + UpdateSurface(); + + CStatic::OnTimer(nIDEvent); +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::OnSetCursor +// +// Description: Used in conjunction with 'LINK' function +// +// INPUTS: Windows API +// +// RETURNS: Windows API +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +BOOL CLabel::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +{ + + if (m_hCursor) + { + ::SetCursor(m_hCursor); + return TRUE; + } + + return CStatic::OnSetCursor(pWnd, nHitTest, message); +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::OnLButtonDown +// +// Description: Called when a link is click on +// +// INPUTS: Windows API +// +// RETURNS: Windows API +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +void CLabel::OnLButtonDown(UINT nFlags, CPoint point) +{ + + if (!m_bNotifyParent) // Fix + { + CString strLink; + + GetWindowText(strLink); + ShellExecute(NULL,_T("open"),strLink,NULL,NULL,SW_SHOWNORMAL); + } + else + { + // To use notification in parent window + // Respond to a OnNotify in parent and disassemble the message + // + NMHDR nm; + + nm.hwndFrom = GetSafeHwnd(); + nm.idFrom = GetDlgCtrlID(); + nm.code = NM_LINKCLICK; + if(GetParent()) + GetParent()->SendMessage(WM_NOTIFY,nm.idFrom,(LPARAM) &nm); + } + + CStatic::OnLButtonDown(nFlags, point); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// THE FUNCTIONS START HERE :---- +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetText +// +// Description: Short cut to set window text - caption - label +// +// INPUTS: Text to use +// +// RETURNS: Reference to this +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetText(const CString& strText) +{ + + SetWindowText(strText); + UpdateSurface(); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetTextColor +// +// Description: Sets the text color +// +// INPUTS: True or false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 22/10/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetTextColor(COLORREF crText) +{ + + m_crText = crText; + + UpdateSurface(); + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetFontBold +// +// Description: Sets the font ot bold +// +// INPUTS: True or false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 22/10/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetFontBold(BOOL bBold) +{ + + m_lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL; + ReconstructFont(); + UpdateSurface(); + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetFontUnderline +// +// Description: Sets font underline attribue +// +// INPUTS: True of false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetFontUnderline(BOOL bSet) +{ + m_lf.lfUnderline = bSet; + ReconstructFont(); + UpdateSurface(); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetFontItalic +// +// Description: Sets font italic attribute +// +// INPUTS: True of false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetFontItalic(BOOL bSet) +{ + + m_lf.lfItalic = bSet; + ReconstructFont(); + UpdateSurface(); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetSunken +// +// Description: Sets sunken effect on border +// +// INPUTS: True of false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetSunken(BOOL bSet) +{ + + if (!bSet) + ModifyStyleEx(WS_EX_STATICEDGE,0,SWP_DRAWFRAME); + else + ModifyStyleEx(0,WS_EX_STATICEDGE,SWP_DRAWFRAME); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetBorder +// +// Description: Toggles the border on/off +// +// INPUTS: True of false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetBorder(BOOL bSet) +{ + + if (!bSet) + ModifyStyle(WS_BORDER,0,SWP_DRAWFRAME); + else + ModifyStyle(0,WS_BORDER,SWP_DRAWFRAME); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetFontSize +// +// Description: Sets the font size +// +// INPUTS: True of false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetFontSize(int nSize) +{ + CFont cf; + LOGFONT lf; + + //int lfHeight = -MulDiv(nSize, GetDeviceCaps(GetDesktopWindow()->GetDC()->GetSafeHdc(), LOGPIXELSY), 72); + + cf.CreatePointFont(nSize*100, m_lf.lfFaceName); + cf.GetLogFont(&lf); + + m_lf.lfHeight = nSize>0?-nSize:nSize; + m_lf.lfWidth = lf.lfWidth; + +// nSize*=-1; +// m_lf.lfHeight = nSize; + ReconstructFont(); + UpdateSurface(); + + return *this; +} + + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetBkColor +// +// Description: Sets background color +// +// INPUTS: Colorref of background color +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetBkColor(COLORREF crBkgnd, COLORREF crBkgndHigh , BackFillMode mode) +{ + + m_crLoColor = crBkgnd; + m_crHiColor = crBkgndHigh; + + m_fillmode = mode; + + if (m_hBackBrush) + ::DeleteObject(m_hBackBrush); + + + if (m_fillmode == Normal) + m_hBackBrush = ::CreateSolidBrush(crBkgnd); + + UpdateSurface(); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetFontName +// +// Description: Sets the fonts face name +// +// INPUTS: String containing font name +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// NT ALMOND 15092000 1.5 Support internation windows +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetFontName(const CString& strFont, BYTE byCharSet /* Default = ANSI_CHARSET */) +{ + CFont *pFont = GetFont(); + + LOGFONT lgpFont = {0}; + pFont->GetLogFont(&lgpFont); + + m_lf.lfCharSet = byCharSet?byCharSet:lgpFont.lfCharSet; + + _tcscpy(m_lf.lfFaceName,strFont); + ReconstructFont(); + UpdateSurface(); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::FlashText +// +// Description: As the function states +// +// INPUTS: True or false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::FlashText(BOOL bActivate) +{ + + if (m_bTimer) + KillTimer(1); + + if (bActivate) + { + m_bState = FALSE; + + m_bTimer = TRUE; + + SetTimer(1,500,NULL); + + m_Type = Text; + } + else + m_Type = None; // Fix + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::FlashBackground +// +// Description: As the function states +// +// INPUTS: True or false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::FlashBackground(BOOL bActivate) +{ + + if (m_bTimer) + KillTimer(1); + + if (bActivate) + { + m_bState = FALSE; + + m_bTimer = TRUE; + SetTimer(1,500,NULL); + + m_Type = Background; + } + + return *this; +} + + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetLink +// +// Description: Indicates the string is a link +// +// INPUTS: True or false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// NT ALMOND 26/08/99 1.2 Added flexbility of +// Sending Click meessage to parent +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetLink(BOOL bLink,BOOL bNotifyParent) +{ + + m_bLink = bLink; + m_bNotifyParent = bNotifyParent; + + if (bLink) + ModifyStyle(0,SS_NOTIFY); + else + ModifyStyle(SS_NOTIFY,0); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetLinkCursor +// +// Description: Sets the internet browers link +// +// INPUTS: Handle of cursor +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 26/08/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetLinkCursor(HCURSOR hCursor) +{ + + m_hCursor = hCursor; + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetTransparent +// +// Description: Sets the Label window to be transpaent +// +// INPUTS: True or false +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 22/10/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetTransparent(BOOL bSet) +{ + + m_bTransparent = bSet; + ModifyStyleEx(0,WS_EX_TRANSPARENT); // Fix for transparency + UpdateSurface(); + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetFont3D +// +// Description: Sets the 3D attribute of the font. +// +// INPUTS: True or false, Raised or Sunken +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 22/10/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetFont3D(BOOL bSet,Type3D type) +{ + + m_bFont3d = bSet; + m_3dType = type; + UpdateSurface(); + + + return *this; +} + +void CLabel::OnSysColorChange() +{ + + if (m_hwndBrush) + ::DeleteObject(m_hwndBrush); + + m_hwndBrush = ::CreateSolidBrush(GetSysColor(COLOR_3DFACE)); + + UpdateSurface(); + + +} + + + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetRotationAngle +// +// Description: Sets the rotation angle for the current font. +// +// INPUTS: Angle in Degress +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 22/10/98 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetRotationAngle(UINT nAngle,BOOL bRotation) +{ + // Arrrrh... + // Your looking in here why the font is rotating, aren't you? + // Well try setting the font name to 'Arial' or 'Times New Roman' + // Make the Angle 180 and set bRotation to true. + // + // Font rotation _ONLY_ works with TrueType fonts... + // + // + m_lf.lfEscapement = m_lf.lfOrientation = (nAngle * 10); + m_bRotation = bRotation; + + ReconstructFont(); + + UpdateSurface(); + + + return *this; +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::SetText3DHiliteColor +// +// Description: Sets the 3D font hilite color +// +// INPUTS: Color +// +// RETURNS: Reference to 'this' object +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 17/07/00 1.0 Origin +// +////////////////////////////////////////////////////////////////////////// +CLabel& CLabel::SetText3DHiliteColor(COLORREF cr3DHiliteColor) +{ + m_cr3DHiliteColor = cr3DHiliteColor; + UpdateSurface(); + + + return *this; +} + + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::PreSubclassWindow +// +// Description: Assigns default dialog font +// +// INPUTS: +// +// RETURNS: +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 15092000 1.5 Origin +////////////////////////////////////////////////////////////////////////// +void CLabel::PreSubclassWindow() +{ + + CStatic::PreSubclassWindow(); + + GetFont()->GetObject(sizeof(m_lf),&m_lf); + ReconstructFont(); + + +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::PreCreateWindow +// +// Description: +// +// INPUTS: +// +// RETURNS: +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 15092000 1.5 Origin +////////////////////////////////////////////////////////////////////////// +BOOL CLabel::PreCreateWindow(CREATESTRUCT& cs) +{ + return CStatic::PreCreateWindow(cs); +} + +////////////////////////////////////////////////////////////////////////// +// +// Function: CLabel::DrawGradientFill +// +// Description: Internal help function to gradient fill background +// +// INPUTS: +// +// RETURNS: +// +// NOTES: +// +// MODIFICATIONS: +// +// Name Date Version Comments +// NT ALMOND 15092000 1.5 Origin +////////////////////////////////////////////////////////////////////////// +void CLabel::DrawGradientFill(CDC* pDC, CRect* pRect, COLORREF crStart, COLORREF crEnd, int nSegments) +{ + // Get the starting RGB values and calculate the incremental + // changes to be applied. + + COLORREF cr; + int nR = GetRValue(crStart); + int nG = GetGValue(crStart); + int nB = GetBValue(crStart); + + int neB = GetBValue(crEnd); + int neG = GetGValue(crEnd); + int neR = GetRValue(crEnd); + + if(nSegments > pRect->Width()) + nSegments = pRect->Width(); + + int nDiffR = (neR - nR); + int nDiffG = (neG - nG); + int nDiffB = (neB - nB); + + int ndR = 256 * (nDiffR) / (max(nSegments,1)); + int ndG = 256 * (nDiffG) / (max(nSegments,1)); + int ndB = 256 * (nDiffB) / (max(nSegments,1)); + + nR *= 256; + nG *= 256; + nB *= 256; + + neR *= 256; + neG *= 256; + neB *= 256; + + int nCX = pRect->Width() / max(nSegments,1), nLeft = pRect->left, nRight; + pDC->SelectStockObject(NULL_PEN); + + for (int i = 0; i < nSegments; i++, nR += ndR, nG += ndG, nB += ndB) + { + // Use special code for the last segment to avoid any problems + // with integer division. + + if (i == (nSegments - 1)) + nRight = pRect->right; + else + nRight = nLeft + nCX; + + cr = RGB(nR / 256, nG / 256, nB / 256); + + { + CBrush br(cr); + CBrush* pbrOld = pDC->SelectObject(&br); + pDC->Rectangle(nLeft, pRect->top, nRight + 1, pRect->bottom); + pDC->SelectObject(pbrOld); + } + + // Reset the left side of the drawing rectangle. + + nLeft = nRight; + } +} diff --git a/Source/Client/IM-Client/IMClient/Label.h b/Source/Client/IM-Client/IMClient/Label.h new file mode 100644 index 0000000..e36fe8d --- /dev/null +++ b/Source/Client/IM-Client/IMClient/Label.h @@ -0,0 +1,105 @@ +#if !defined(AFX_LABEL_H__A4EABEC5_2E8C_11D1_B79F_00805F9ECE10__INCLUDED_) +#define AFX_LABEL_H__A4EABEC5_2E8C_11D1_B79F_00805F9ECE10__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 +// Label.h : header file +// + +#define NM_LINKCLICK WM_APP + 0x200 + +///////////////////////////////////////////////////////////////////////////// +// CLabel window + +class CLabel : public CStatic +{ +// Construction +public: + static enum FlashType {None, Text, Background }; + static enum Type3D { Raised, Sunken}; + static enum BackFillMode { Normal, Gradient }; + + CLabel(); + virtual CLabel& SetBkColor(COLORREF crBkgnd, COLORREF crBkgndHigh = 0, BackFillMode mode = Normal); + virtual CLabel& SetTextColor(COLORREF crText); + virtual CLabel& SetText(const CString& strText); + virtual CLabel& SetFontBold(BOOL bBold); + virtual CLabel& SetFontName(const CString& strFont, BYTE byCharSet = ANSI_CHARSET); + virtual CLabel& SetFontUnderline(BOOL bSet); + virtual CLabel& SetFontItalic(BOOL bSet); + virtual CLabel& SetFontSize(int nSize); + virtual CLabel& SetSunken(BOOL bSet); + virtual CLabel& SetBorder(BOOL bSet); + virtual CLabel& SetTransparent(BOOL bSet); + virtual CLabel& FlashText(BOOL bActivate); + virtual CLabel& FlashBackground(BOOL bActivate); + virtual CLabel& SetLink(BOOL bLink,BOOL bNotifyParent); + virtual CLabel& SetLinkCursor(HCURSOR hCursor); + virtual CLabel& SetFont3D(BOOL bSet,Type3D type=Raised); + virtual CLabel& SetRotationAngle(UINT nAngle,BOOL bRotation); + virtual CLabel& SetText3DHiliteColor(COLORREF cr3DHiliteColor); + + +// Attributes +public: +protected: + void UpdateSurface(); + void ReconstructFont(); + void DrawGradientFill(CDC* pDC, CRect* pRect, COLORREF crStart, COLORREF crEnd, int nSegments); + COLORREF m_crText; + COLORREF m_cr3DHiliteColor; + HBRUSH m_hwndBrush; + HBRUSH m_hBackBrush; + LOGFONT m_lf; + CFont m_font; + CString m_strText; + BOOL m_bState; + BOOL m_bTimer; + BOOL m_bLink; + BOOL m_bTransparent; + BOOL m_bFont3d; + BOOL m_bToolTips; + BOOL m_bNotifyParent; + BOOL m_bRotation; + FlashType m_Type; + HCURSOR m_hCursor; + Type3D m_3dType; + BackFillMode m_fillmode; + COLORREF m_crHiColor; + COLORREF m_crLoColor; + + // Operations +public: + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CLabel) + protected: + virtual void PreSubclassWindow(); + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + //}}AFX_VIRTUAL + +// Implementation +public: + virtual ~CLabel(); + + // Generated message map functions +protected: + //{{AFX_MSG(CLabel) + afx_msg void OnTimer(UINT nIDEvent); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); + afx_msg void OnSysColorChange(); + afx_msg void OnPaint(); + //}}AFX_MSG + + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Developer Studio will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_LABEL_H__A4EABEC5_2E8C_11D1_B79F_00805F9ECE10__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/LoadSkins.cpp b/Source/Client/IM-Client/IMClient/LoadSkins.cpp new file mode 100644 index 0000000..df85568 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/LoadSkins.cpp @@ -0,0 +1,447 @@ +// LoadSkins.cpp: implementation of the LoadSkins class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "LoadSkins.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif +#include +#include +#include "resource.h" +#include + +#define EDIT_BOX_LIMIT 0x7FFF // The Edit box limit + +#define MAX_SKIN_HASH_SIZE (32) + +typedef struct _StreamCashItem +{ + CComBSTR Path; + CComPtr Data; +} StreamCashItem; + +typedef std::list CStreamCashList; +typedef CStreamCashList::iterator CStreamCashListIterator; + +static CStreamCashList m_StreamCashList; + +// %%Classes: ---------------------------------------------------------------- +class CDownload { +public: + CDownload(); + ~CDownload(); + HRESULT DoDownload(BSTR URL, IStream** ppStream, HANDLE hBackEvent, long* ErrorCode); + +private: + IMoniker* m_pmk; + IBindCtx* m_pbc; + IBindStatusCallback* m_pbsc; + +}; + +class CBindStatusCallback : public IBindStatusCallback { +public: + // IUnknown methods + STDMETHODIMP QueryInterface(REFIID riid,void ** ppv); + STDMETHODIMP_(ULONG) AddRef() { return m_cRef++; } + STDMETHODIMP_(ULONG) Release() + { + if (--m_cRef == 0) + { delete this; return 0; } + return m_cRef; + } + + // IBindStatusCallback methods + STDMETHODIMP OnStartBinding(DWORD dwReserved, IBinding* pbinding); + STDMETHODIMP GetPriority(LONG* pnPriority); + STDMETHODIMP OnLowResource(DWORD dwReserved); + STDMETHODIMP OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, + LPCWSTR pwzStatusText); + STDMETHODIMP OnStopBinding(HRESULT hrResult, LPCWSTR szError); + STDMETHODIMP GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo); + STDMETHODIMP OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc, + STGMEDIUM* pstgmed); + STDMETHODIMP OnObjectAvailable(REFIID riid, IUnknown* punk); + + // constructors/destructors + CBindStatusCallback(IStream** pStream, long* ErrorCode, HANDLE hBackEvent); + ~CBindStatusCallback(); + + // data members + DWORD m_cRef; + long* m_ErrorCode; + IBinding* m_pbinding; + IStream* m_pstm; + IStream** m_ppStream; + DWORD m_cbOld; + HANDLE m_hBackEvent; +}; + + +// =========================================================================== +// CBindStatusCallback Implementation +// =========================================================================== + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::CBindStatusCallback +// --------------------------------------------------------------------------- +CBindStatusCallback::CBindStatusCallback(IStream** ppStream, long* ErrorCode, HANDLE hBackEvent) +{ + m_ErrorCode = ErrorCode; + m_ppStream = ppStream; + m_pbinding = NULL; + m_hBackEvent = hBackEvent; + m_pstm = NULL; + m_cRef = 1; + m_cbOld = 0; +} // CBindStatusCallback + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::~CBindStatusCallback +// --------------------------------------------------------------------------- +CBindStatusCallback::~CBindStatusCallback() +{ +} // ~CBindStatusCallback + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::QueryInterface +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::QueryInterface(REFIID riid, void** ppv) +{ + *ppv = NULL; + + if (riid==IID_IUnknown || riid==IID_IBindStatusCallback) + { + *ppv = this; + AddRef(); + return S_OK; + } + return E_NOINTERFACE; +} // CBindStatusCallback::QueryInterface + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::OnStartBinding +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::OnStartBinding(DWORD dwReserved, IBinding* pbinding) +{ + if (m_pbinding != NULL) + m_pbinding->Release(); + m_pbinding = pbinding; + if (m_pbinding != NULL) + { + m_pbinding->AddRef(); + + } + return S_OK; +} // CBindStatusCallback::OnStartBinding + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::GetPriority +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::GetPriority(LONG* pnPriority) +{ + return E_NOTIMPL; +} // CBindStatusCallback::GetPriority + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::OnLowResource +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::OnLowResource(DWORD dwReserved) +{ + return E_NOTIMPL; +} // CBindStatusCallback::OnLowResource + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::OnProgress +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) +{ + return(NOERROR); +} // CBindStatusCallback::OnProgress + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::OnStopBinding +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::OnStopBinding(HRESULT hrStatus, LPCWSTR pszError) +{ + + if (m_pbinding) + { + int i = m_pbinding->Release(); + m_pbinding = NULL; + } + SetEvent(m_hBackEvent); + return S_OK; +} // CBindStatusCallback::OnStopBinding + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::GetBindInfo +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindInfo) +{ + if (!pbindInfo || !pbindInfo->cbSize || !pgrfBINDF) + return E_INVALIDARG; + + *pgrfBINDF = /*BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE |*/ BINDF_PULLDATA /*| + BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE*/; + + // remember incoming cbSize + ULONG cbSize = pbindInfo->cbSize; + // zero out structure + memset(pbindInfo, 0, cbSize); + + // restore cbSize + pbindInfo->cbSize = cbSize; + pbindInfo->dwBindVerb = BINDVERB_GET; + + return S_OK; +} // CBindStatusCallback::GetBindInfo + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::OnDataAvailable +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC* pfmtetc, STGMEDIUM* pstgmed) +{ + HRESULT hr=S_OK; + DWORD dStrlength=0; + + // Get the Stream passed + if (BSCF_FIRSTDATANOTIFICATION & grfBSCF) + { + if (!m_pstm && pstgmed->tymed == TYMED_ISTREAM) + { + m_pstm = pstgmed->pstm; + if (m_pstm) + m_pstm->AddRef(); + } + } + + if (BSCF_LASTDATANOTIFICATION & grfBSCF) + { + if (m_pstm) + { + //*m_ppStream = m_pstm; + m_pstm->Release(); + *m_ErrorCode = 0; + } + hr=S_OK; // If it was the last data then we should return S_OK as we just finished reading everything + } + + return hr; +} // CBindStatusCallback::OnDataAvailable + +// --------------------------------------------------------------------------- +// %%Function: CBindStatusCallback::OnObjectAvailable +// --------------------------------------------------------------------------- +STDMETHODIMP +CBindStatusCallback::OnObjectAvailable(REFIID riid, IUnknown* punk) +{ + return E_NOTIMPL; +} // CBindStatusCallback::OnObjectAvailable + + +// =========================================================================== +// CDownload Implementation +// =========================================================================== + +// --------------------------------------------------------------------------- +// %%Function: CDownload::CDownload +// --------------------------------------------------------------------------- +CDownload::CDownload() +{ + m_pmk = 0; + m_pbc = 0; + m_pbsc = 0; +} // CDownload + +// --------------------------------------------------------------------------- +// %%Function: CDownload::~CDownload +// --------------------------------------------------------------------------- +CDownload::~CDownload() +{ + if (m_pmk) + m_pmk->Release(); + if (m_pbc) + m_pbc->Release(); + if (m_pbsc) + { + int i = m_pbsc->Release(); + ASSERT(i==0); + // delete m_pbsc; + } +} // ~CDownload + +// --------------------------------------------------------------------------- +// %%Function: CDownload::DoDownload +// --------------------------------------------------------------------------- +HRESULT +CDownload::DoDownload(BSTR URL, IStream** pStream, HANDLE hBackEvent, long* ErrorCode) +{ + HRESULT hr; + + hr = CreateURLMoniker(NULL, URL, &m_pmk); + if (FAILED(hr)) + goto LErrExit; + + m_pbsc = new CBindStatusCallback(pStream, ErrorCode, hBackEvent); + if (m_pbsc == NULL) + { + hr = E_OUTOFMEMORY; + goto LErrExit; + } + + hr = CreateBindCtx(0, &m_pbc); + if (FAILED(hr)) + goto LErrExit; + + hr = RegisterBindStatusCallback(m_pbc, + m_pbsc, + 0, + 0L); + if (FAILED(hr)) + goto LErrExit; + + hr = m_pmk->BindToStorage(m_pbc, 0, IID_IStream, (void**)pStream); + if (FAILED(hr)) + goto LErrExit; + + return hr; + +LErrExit: + if (m_pbc != NULL) + { + m_pbc->Release(); + m_pbc = NULL; + } + if (m_pbsc != NULL) + { + m_pbsc->Release(); + m_pbsc = NULL; + } + if (m_pmk != NULL) + { + m_pmk->Release(); + m_pmk = NULL; + } + if (*pStream) + { + (*pStream)->Release(); + *pStream = NULL; + } + return hr; +} // CDownload::DoDownload + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +LoadSkins::LoadSkins() +{ + InitializeCriticalSection(&m_lock); + +} + +LoadSkins::~LoadSkins() +{ + DeleteCriticalSection(&m_lock); +} + + + + +HRESULT LoadSkins::Load(BSTR URL, IStream **pStream, long* ErrorCode) +{ + if(pStream == NULL || URL == NULL) + return E_INVALIDARG; + + CDownload m_Download; + HANDLE hBackEvent; + HRESULT hr; + + ASSERT(*pStream==NULL); + + EnterCriticalSection(&m_lock); + + try + { + // Step 1. Check Stream in the Cash [7/26/2002] + for(CStreamCashListIterator ItemIndex = m_StreamCashList.begin(); + ItemIndex!=m_StreamCashList.end();ItemIndex++) + { + StreamCashItem Item = (*ItemIndex); + if(Item.Path==CComBSTR(URL)) + { + + hr = Item.Data->Clone(pStream); + if(hr==S_OK) + { + // May Be Remove ???? [7/26/2002] + //LARGE_INTEGER dlibMove = {0}; + //*pStream->Seek(dlibMove,0,0); + *ErrorCode = 0; + + //if(ItemIndex!= m_StreamCashList.begin()) + //{ + // m_StreamCashList.push_front((*ItemIndex)); + // m_StreamCashList.erase(ItemIndex); + //} + return hr; + } + else + { + ///TRACE("\r\n $$$ LoadSkins::Load/Remove Item From Cash $$$"); + // Remove Item From Cash [7/26/2002] + m_StreamCashList.erase(ItemIndex); + } + } + } + + // Step 2. Load Stream from Skin file [7/26/2002] + hBackEvent = CreateEvent(NULL,TRUE,FALSE,NULL); + + hr = m_Download.DoDownload(URL, pStream, hBackEvent, ErrorCode); + if(hr == S_OK) + { + ::WaitForSingleObject(hBackEvent,INFINITE); + + if(*ErrorCode==0&&*pStream) + { + //TRACE("\r\n LoadSkins::Load/New Item Present in the Hash"); + StreamCashItem newItem; + + newItem.Path = URL; + hr = (*pStream)->Clone(&newItem.Data); + m_StreamCashList.push_front(newItem); + + // Check Mas Cash List size [7/26/2002] + if(m_StreamCashList.size()>MAX_SKIN_HASH_SIZE) + { + m_StreamCashList.pop_back(); + } + } + } + CloseHandle(hBackEvent); + } + catch(...) + { + ASSERT(FALSE); + } + + LeaveCriticalSection(&m_lock); + + return hr; +} diff --git a/Source/Client/IM-Client/IMClient/LoadSkins.h b/Source/Client/IM-Client/IMClient/LoadSkins.h new file mode 100644 index 0000000..b5f2459 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/LoadSkins.h @@ -0,0 +1,24 @@ +// LoadSkins.h: interface for the LoadSkins class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_LOADSKINS_H__13F4491B_C199_489A_8E60_A52A9978DBD5__INCLUDED_) +#define AFX_LOADSKINS_H__13F4491B_C199_489A_8E60_A52A9978DBD5__INCLUDED_ + +#include +#include + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +class LoadSkins +{ + CRITICAL_SECTION m_lock; +public: + HRESULT Load(BSTR URL, IStream **pStream, long* ErrorCode); + LoadSkins(); + virtual ~LoadSkins(); +}; + +#endif // !defined(AFX_LOADSKINS_H__13F4491B_C199_489A_8E60_A52A9978DBD5__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/LogEX.h b/Source/Client/IM-Client/IMClient/LogEX.h new file mode 100644 index 0000000..ae4e4d8 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/LogEX.h @@ -0,0 +1,56 @@ +#ifndef __LOG__EX__ +#define __LOG__EX__ + +#define LOG_EX_WINDOW_NAME "{CD882CBA-DE79-429c-B195-732051E98C43}" +#define LOG_EX_WINDOW_CLASS "{173D6EE5-02DC-4239-884E-C0051639D11A}" + +#define LOG_SAVE_WINDOW_NAME "{337556F0-BE00-481c-98E5-D30EAB8070A8}" +#define LOG_SAVE_WINDOW_CLASS "{84E7E26D-2077-4645-92DF-E57C5B8AF548}" + +#define WM_SAVE_LOG_DATA WM_USER+1 +#define WM_GET_LOG_INFO WM_USER+2 + +#define LOGEX_TYPE_NORMAL 0 +#define LOGEX_TYPE_INFO 1 + +enum +{ + LOGEX_LEVEL0 = 0, + LOGEX_LEVEL1, + LOGEX_LEVEL2, + LOGEX_LEVEL3, + LOGEX_LEVEL4, + LOGEX_LEVEL5, + LOGEX_LEVEL6, + LOGEX_LEVEL7, + LOGEX_LEVEL8, + LOGEX_LEVEL9, + LOGEX_LEVEL_LAST +}; + +struct LOGEX_INFO +{ + SYSTEMTIME st; + DWORD dwProcID; + DWORD dwType; + DWORD dwUID; + DWORD dwLevel; +}; + +#ifdef LOGEX_EXPORTS +#define LOGEX_API __declspec(dllexport) +#else +#define LOGEX_API __declspec(dllimport) +#endif + +LOGEX_API void AddToLogEX(DWORD dwLevel, char *szFormat, ...); +LOGEX_API void AddToLogEX(DWORD dwLevel, BSTR format, ...); +LOGEX_API void AddToLogEX(DWORD dwLevel, PBYTE pData, DWORD dwSize); + +#ifdef _DOLOG +#define MCTRACE AddToLogEX +#else //_DOLOG +#define MCTRACE (void)0 +#endif //_DOLOG + +#endif //__LOG__EX__ diff --git a/Source/Client/IM-Client/IMClient/LoginDlg.cpp b/Source/Client/IM-Client/IMClient/LoginDlg.cpp new file mode 100644 index 0000000..20f9a69 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/LoginDlg.cpp @@ -0,0 +1,470 @@ +// LoginDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "LoginDlg.h" +#include "cdib.h" +#include "LoadSkins.h" +#include "GlobalFunction.h" +#include "DlgNetOptions2.h" + +#include "DlgPreferences.h" + +//#include "DlgTV.h" +//#include "WebWindow.h" +#include "MainDlg.h" +#include "ChatDlg.h" +#include "ChatCreateDlg.h" + +#include "IBNWFGlobalFunctions.h" + +#include "ScreenShotDlg.h" + + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +extern CString GetCurrentSkin(); + +extern CString strCommandLineLogin; +extern CString strCommandLinePassword; + +///////////////////////////////////////////////////////////////////////////// +// CLoginDlg dialog + +CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/) +: COFSNcDlg2(CLoginDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CLoginDlg) + m_LoginStr = _T(""); + m_PasswordStr = _T(""); + //}}AFX_DATA_INIT + m_Block = FALSE; + m_strSkinSettings = _T("/Shell/Login/skin.xml"); + m_bResizable = FALSE; +} + +CLoginDlg::~CLoginDlg() +{ + m_pAutoComplete = NULL; +} + + +void CLoginDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CLoginDlg) + DDX_Control(pDX, IDC_TITLE, m_title); + DDX_Control(pDX, IDC_EDIT_LOGIN, m_LoginEdit); + DDX_Control(pDX, IDC_EDIT_PASSWORD, m_PasswordEdit); + DDX_Control(pDX, IDC_BUTTON_CANCEL, m_btnCancel); + DDX_Control(pDX, IDC_BUTTON_X, m_btnX); + DDX_Control(pDX, IDC_BUTTON_LOGIN, m_btnLogin); + DDX_Text(pDX, IDC_EDIT_LOGIN, m_LoginStr); + DDX_Text(pDX, IDC_EDIT_PASSWORD, m_PasswordStr); + DDX_Control(pDX, IDC_BUTTON_REMEMBER, m_btnSavePassword); + DDX_Control(pDX, IDC_BUTTON_NETOPTIONS, m_btnNetOption); + DDX_Control(pDX, IDC_BUTTON_SSL, m_btnSSL); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CLoginDlg, COFSNcDlg2) + //{{AFX_MSG_MAP(CLoginDlg) + ON_WM_CLOSE() + ON_WM_LBUTTONDOWN() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +BEGIN_EVENTSINK_MAP(CLoginDlg, COFSNcDlg2) + //{{AFX_EVENTSINK_MAP(CLoginDlg) + ON_EVENT(CLoginDlg, IDC_BUTTON_X, -600 /* Click */, OnClickButtonX, VTS_NONE) + ON_EVENT(CLoginDlg, IDC_BUTTON_CANCEL, -600 /* Click */, OnClickButtonCancel, VTS_NONE) + ON_EVENT(CLoginDlg, IDC_BUTTON_NETOPTIONS, -600 /* Click */, OnClickButtonNetoption, VTS_NONE) + ON_EVENT(CLoginDlg, IDC_BUTTON_LOGIN, -600 /* Click */, OnClickButtonLogin, VTS_NONE) + //}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CLoginDlg message handlers + + +BOOL CLoginDlg::PreCreateWindow(CREATESTRUCT& cs) +{ + // TODO: Add your specialized code here and/or call the base class + cs.style &= ~WS_VISIBLE; + return COFSNcDlg2::PreCreateWindow(cs); +} + +void CLoginDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + m_btnCancel.ShowWindow(SW_HIDE); + m_btnX.ShowWindow(SW_HIDE); + m_btnSavePassword.ShowWindow(SW_HIDE); + m_btnNetOption.ShowWindow(SW_HIDE); + m_btnLogin.ShowWindow(SW_HIDE); + m_btnSSL.ShowWindow(SW_HIDE); + + LoadLabel(pXmlRoot, _T("Title"), &m_title, TRUE); + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Login"), &m_btnLogin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Cancel"), &m_btnCancel, TRUE, FALSE); + LoadButton(pXmlRoot, _T("SavePassword"), &m_btnSavePassword, TRUE, TRUE); + LoadButton(pXmlRoot, _T("ConnectionSettings"), &m_btnNetOption, TRUE, FALSE); + LoadButton(pXmlRoot, _T("SSL"), &m_btnSSL, TRUE, TRUE); + + LoadRectangle(pXmlRoot, _T("EditLogin"), &m_LoginEdit, TRUE); + LoadRectangle(pXmlRoot, _T("EditPassword"), &m_PasswordEdit, TRUE); +} + +BOOL CLoginDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + ////////////////////////////////////////////////////////////////////////// + + m_title.SetText(GetString(IDS_IBN_LOGIN_TITLE)); + SetWindowText(GetString(IDS_IBN_LOGIN_TITLE)); + + ////////////////////////////////////////////////////////////////////////// + + BOOL bRememberLogin = GetOptionInt(IDS_LOGIN,IDS_REMEMBER,TRUE); + +#ifndef RADIUS + #define CRYPT_PROV_CONTAINER_NAME _T("Mediachase") +#else + #define CRYPT_PROV_CONTAINER_NAME _T("Radius-Soft") +#endif + +#define CRYPT_KEYLENGTH 0x00280000L + +#define ENCRYPT_ALGORITHM CALG_RC4 +#define ENCRYPT_BLOCK_SIZE 1 + + if(strCommandLineLogin.GetLength()==0) + { + if(bRememberLogin) + { + CString strHashData = GetOptionString(IDS_LOGIN, IDS_NICKNAME, _T("")); + + CCryptProv m_hCryptProv; + CCryptDerivedKey m_hKey; + + HRESULT m_CryptInitErrorCode = m_hCryptProv.Initialize(PROV_RSA_FULL,CRYPT_PROV_CONTAINER_NAME,MS_DEF_PROV,NULL); + if(m_CryptInitErrorCode==0x80090016) + { + m_CryptInitErrorCode = m_hCryptProv.Initialize(PROV_RSA_FULL,CRYPT_PROV_CONTAINER_NAME,MS_DEF_PROV,CRYPT_NEWKEYSET); + } + + if(m_CryptInitErrorCode==S_OK) + { + // Create Key [9/12/2002] + CCryptMD5Hash hMD5Hash; + + m_CryptInitErrorCode = hMD5Hash.Initialize(m_hCryptProv,CRYPT_PROV_CONTAINER_NAME); + if(m_CryptInitErrorCode==S_OK) + { + m_CryptInitErrorCode = m_hKey.Initialize(m_hCryptProv,hMD5Hash,ENCRYPT_ALGORITHM,CRYPT_KEYLENGTH); + + if(m_CryptInitErrorCode==S_OK) + { + if(!ExtractLoginAndPasswordFromData(m_hKey,strHashData,m_LoginStr,m_PasswordStr)) + { + m_LoginStr.Empty(); + m_PasswordStr.Empty(); + } + } + } + } + } + } + else + { + m_LoginStr = strCommandLineLogin; + + if(strCommandLinePassword.GetLength()!=0) + m_PasswordStr = strCommandLinePassword; + } + + ////////////////////////////////////////////////////////////////////////// + + m_btnSSL.SetPressed(GetOptionInt(IDS_NETOPTIONS, IDS_USESSL, FALSE)); + + m_btnSavePassword.SetPressed(bRememberLogin); + m_btnCancel.EnableWindow(FALSE); + + UpdateData(FALSE); + + m_LoginEdit.SetFocus(); + + // Add Auto complete Mode [8/15/2003] + // Step 1. Create CLSID_AutoComplete + HRESULT hr = CoCreateInstance(CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER,IID_IAutoComplete, (LPVOID*)&m_pAutoComplete); + // Step 2. Create Custom autocomplete source + + if(SUCCEEDED(hr)) + hr = m_pAutoComplete->Init(m_LoginEdit.GetSafeHwnd(),(LPUNKNOWN)m_AutoCompleteSource.GetInterface(&IID_IUnknown),NULL,NULL); + + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CLoginDlg::OnClickButtonX() +{ + OnClose(); +} + +void CLoginDlg::OnClickButtonCancel() +{ + //Cancel Operation ... + if(IsBlock()) + { + if(::IsWindow(GetParent()->GetSafeHwnd())) + GetParent()->PostMessage(WM_CANCELLOGIN,0,0); + } +} + +void CLoginDlg::ShowLoginTooltip(BOOL bShow) +{ + static HWND _hwndToolTip = NULL; + static TOOLINFO _ti = {0}; + static CString _tooltipBody = GetString(IDS_LOGIN_TOOLTIP_BODY); + + if(!IsWindow(_hwndToolTip)) + { + _hwndToolTip = CreateWindow(TOOLTIPS_CLASS, + NULL, + WS_POPUP | TTS_NOPREFIX | TTS_BALLOON | TTS_ALWAYSTIP , + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + m_LoginEdit.GetSafeHwnd(), NULL, + AfxGetInstanceHandle(), + NULL); + + ASSERT(_hwndToolTip!=NULL); + + // Do the standard ToolTip coding. + _ti.cbSize = sizeof(_ti); + _ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT | TTF_CENTERTIP; + _ti.hwnd = m_LoginEdit.GetSafeHwnd(); + _ti.uId = (UINT)_ti.hwnd; + _ti.hinst = AfxGetInstanceHandle(); + _ti.lpszText = (LPTSTR)(LPCTSTR)_tooltipBody; + + m_LoginEdit.GetClientRect(&_ti.rect); + BOOL bRetVal = ::SendMessage(_hwndToolTip, TTM_ADDTOOL, 0, (LPARAM) &_ti ); + ASSERT(bRetVal); + bRetVal = ::SendMessage(_hwndToolTip, TTM_SETTITLE, (WPARAM)1, (LPARAM)(LPCTSTR)GetString(IDS_LOGIN_TOOLTIP_CAPTION)); + ASSERT(bRetVal); + } + + BOOL bRetVal = ::SendMessage(_hwndToolTip, TTM_TRACKACTIVATE, bShow, (LPARAM)&_ti); + ASSERT(bRetVal); +} + +void CLoginDlg::OnLButtonDown(UINT nFlags, CPoint point) +{ + if(GetDllVersion(_T("comctl32.dll")) >= PACKVERSION(5,8)) + { + ShowLoginTooltip(FALSE); + } + + COFSNcDlg2::OnLButtonDown(nFlags,point); +} + +void CLoginDlg::OnClickButtonLogin() +{ + UpdateData(); + + m_LoginStr.TrimLeft(); + m_LoginStr.TrimRight(); + + CString LoginStr = m_LoginStr; + + int StartPortPos = -1; + if((StartPortPos = LoginStr.Find(_T(":")))!=-1) + { + CString strPort = LoginStr.Mid(StartPortPos+1); + + LoginStr = LoginStr.Left(StartPortPos); + + int lPort = _ttol(strPort); + } + + + // Check: Login is E-Mail [9/2/2002] + if(CheckEmailString(LoginStr)) + { + if(GetDllVersion(_T("comctl32.dll")) >= PACKVERSION(5,8)) + { + ShowLoginTooltip(FALSE); + } + + WriteOptionInt(IDS_NETOPTIONS, IDS_USESSL, m_btnSSL.GetPressed()); + + if(!m_btnSavePassword.GetPressed()) + { + WriteOptionString(IDS_LOGIN, IDS_NICKNAME, _T("")); + //WriteOptionString(IDS_LOGIN,IDS_PASSWORD,""); + WriteOptionInt(IDS_LOGIN,IDS_REMEMBER,FALSE); + } + else + { +#ifndef RADIUS + #define CRYPT_PROV_CONTAINER_NAME _T("Mediachase") +#else + #define CRYPT_PROV_CONTAINER_NAME _T("Radius-Soft") +#endif + +#define CRYPT_KEYLENGTH 0x00280000L + +#define ENCRYPT_ALGORITHM CALG_RC4 +#define ENCRYPT_BLOCK_SIZE 1 + + //CString strHashData; + + CCryptProv m_hCryptProv; + CCryptDerivedKey m_hKey; + + HRESULT m_CryptInitErrorCode = m_hCryptProv.Initialize(PROV_RSA_FULL,CRYPT_PROV_CONTAINER_NAME,MS_DEF_PROV,NULL); + if(m_CryptInitErrorCode==0x80090016) + { + m_CryptInitErrorCode = m_hCryptProv.Initialize(PROV_RSA_FULL,CRYPT_PROV_CONTAINER_NAME,MS_DEF_PROV,CRYPT_NEWKEYSET); + } + + if(m_CryptInitErrorCode==S_OK) + { + // Create Key [9/12/2002] + CCryptMD5Hash hMD5Hash; + + m_CryptInitErrorCode = hMD5Hash.Initialize(m_hCryptProv,CRYPT_PROV_CONTAINER_NAME); + if(m_CryptInitErrorCode==S_OK) + { + m_CryptInitErrorCode = m_hKey.Initialize(m_hCryptProv,hMD5Hash,ENCRYPT_ALGORITHM,CRYPT_KEYLENGTH); + + if(m_CryptInitErrorCode==S_OK) + { + LPTSTR strHashData = NULL; + if(LoginPassword2HexSTR(m_hKey,m_LoginStr,m_PasswordStr,&strHashData)==S_OK) + { + WriteOptionString(IDS_LOGIN,IDS_NICKNAME,strHashData); + + delete [] strHashData; + strHashData = NULL; + } + } + } + } + + //WriteOptionString(IDS_LOGIN,IDS_NICKNAME,m_LoginStr); + //Pack(m_PasswordStr,CString("vTsfO")); + //WriteOptionString(IDS_LOGIN,IDS_PASSWORD,m_PasswordStr); + //UnPack(m_PasswordStr,CString("vTsfO")); + WriteOptionInt(IDS_LOGIN,IDS_REMEMBER,TRUE); + } + + + if(::IsWindow(GetParent()->GetSafeHwnd())) + GetParent()->PostMessage(WM_INETLOGIN,0,0); + } + else + { + // Error; Onvalide Login [9/2/2002] + + // Show Ballon Tooltip [9/9/2004] + if(GetDllVersion(_T("comctl32.dll")) >= PACKVERSION(5,8)) + { + ShowLoginTooltip(TRUE); + } + else + { + _SHOW_IBN_ERROR_DLG_OK(IDS_INVALID_LOGIN_OR_PASSWORD); + } + } + // [9/2/2002] +} + +void CLoginDlg::OnClose() +{ + if(!IsBlock()) + { + if(GetStyle()&WS_VISIBLE&&GetOptionInt(IDS_OFSMESSENGER,IDS_ANIMATION,FALSE)) + RoundExitAddon(this); + // TODO: Add your message handler code here and/or call default + if(IsWindow(GetParent()->GetSafeHwnd())) + GetParent()->PostMessage(WM_CLOSE); + COFSNcDlg2::OnClose(); + + } +} + +void CLoginDlg::OnOK() +{ + if(!IsBlock()) + OnClickButtonLogin(); +} + +void CLoginDlg::OnCancel() +{ +} + +void CLoginDlg::OnClickButtonNetoption() +{ +//#ifdef _DEBUG +// CWebWindow *pNewWindow = new CWebWindow; +// pNewWindow->CreateAutoKiller(_T("/Browser/Common/skin.xml"), this, GetDesktopWindow(), 100, 100, 500, 300, NULL, _T("d:\\humor\\a.htm"), FALSE, FALSE, TRUE, 0, TRUE); +// CMainDlg dlg; +// CChatDlg *pdlg = new CChatDlg((CMainDlg*)AfxGetMainWnd(), GetDesktopWindow()); +// pdlg->Create(GetDesktopWindow()); +// pdlg->SetWindowPos(NULL,0,0,300,200,SWP_NOZORDER|SWP_SHOWWINDOW); +// CChatCreateDlg dlg((CMainDlg*)AfxGetMainWnd()); +// dlg.DoModal(); +//#else + WriteOptionInt(IDS_NETOPTIONS, IDS_USESSL, m_btnSSL.GetPressed()); + + CDlgNetOptions2 dlg; + dlg.DoModal(); + + m_btnSSL.SetPressed(GetOptionInt(IDS_NETOPTIONS, IDS_USESSL, FALSE)); +//#endif +} + +void CLoginDlg::Block() +{ + m_Block = TRUE; + + m_btnSavePassword.EnableWindow(FALSE); + m_btnNetOption.EnableWindow(FALSE); + m_btnLogin.EnableWindow(FALSE); + m_LoginEdit.EnableWindow(FALSE); + m_PasswordEdit.EnableWindow(FALSE); + m_btnCancel.EnableWindow(FALSE); + m_btnCancel.EnableWindow(TRUE); + m_btnSSL.EnableWindow(FALSE); +} + +void CLoginDlg::UnBlock() +{ + m_Block = FALSE; + + m_btnSavePassword.EnableWindow(TRUE); + m_btnNetOption.EnableWindow(TRUE); + m_btnLogin.EnableWindow(TRUE); + m_LoginEdit.EnableWindow(TRUE); + m_PasswordEdit.EnableWindow(TRUE); + m_btnCancel.EnableWindow(FALSE); + m_btnSSL.EnableWindow(TRUE); +} + +BOOL CLoginDlg::IsBlock() +{ + return m_Block; +} diff --git a/Source/Client/IM-Client/IMClient/LoginDlg.h b/Source/Client/IM-Client/IMClient/LoginDlg.h new file mode 100644 index 0000000..4bdd9d6 --- /dev/null +++ b/Source/Client/IM-Client/IMClient/LoginDlg.h @@ -0,0 +1,98 @@ +//{{AFX_INCLUDES() +#include "mcbutton.h" +//}}AFX_INCLUDES +#if !defined(AFX_LOGINDLG_H__AEADEAB3_D1CD_4664_AA31_ABAE4F64B48C__INCLUDED_) +#define AFX_LOGINDLG_H__AEADEAB3_D1CD_4664_AA31_ABAE4F64B48C__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// LoginDlg.h : header file +// +#include "OFSNcDlg2.h" +#include "McLoginAutoCompleteSource.h" + +///////////////////////////////////////////////////////////////////////////// +// CLoginDlg dialog +#define WM_INETLOGIN (WM_USER + 100) +#define WM_CANCELLOGIN (WM_USER + 101) + +class CLoginDlg : public COFSNcDlg2 +{ +// Construction +public: + BOOL IsBlock(); + void UnBlock(); + void Block(); + CLoginDlg(CWnd* pParent = NULL); // standard constructor + ~CLoginDlg(); + + CString GetUserLogin() + { + int StartPortPos = -1; + if((StartPortPos = m_LoginStr.Find(_T(":")))!=-1) + { + return m_LoginStr.Left(StartPortPos); + } + + return m_LoginStr; + } + +// Dialog Data + //{{AFX_DATA(CLoginDlg) + enum { IDD = IDD_DIALOG_LOGIN }; + CLabel m_title; + CEdit m_LoginEdit; + CEdit m_PasswordEdit; + CMcButton m_btnCancel; + CMcButton m_btnX; + CMcButton m_btnLogin; + CMcButton m_btnSSL; + CString m_LoginStr; + CString m_PasswordStr; + CMcButton m_btnSavePassword; + CMcButton m_btnNetOption; + //}}AFX_DATA + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CLoginDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + //}}AFX_VIRTUAL + +// Implementation +protected: + void LoadSkin(IXMLDOMNode *pXmlRoot); + BOOL m_Block; + + CComPtr m_pAutoComplete; + CMcLoginAutoCompleteSource m_AutoCompleteSource; + + void ShowLoginTooltip(BOOL bShow = TRUE); +// CImageList m_ConnectImage; +// int intProgressIndex; + +// CBitmap m_pFonBMP; +// void LoadSkin(); + // Generated message map functions + //{{AFX_MSG(CLoginDlg) + virtual BOOL OnInitDialog(); + afx_msg void OnClickButtonX(); + afx_msg void OnClickButtonCancel(); + afx_msg void OnClickButtonLogin(); + afx_msg void OnClickButtonNetoption(); + afx_msg void OnClose(); + virtual void OnOK(); + virtual void OnCancel(); + void OnLButtonDown(UINT nFlags, CPoint point); + DECLARE_EVENTSINK_MAP() + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_LOGINDLG_H__AEADEAB3_D1CD_4664_AA31_ABAE4F64B48C__INCLUDED_) diff --git a/Source/Client/IM-Client/IMClient/MainDlg.cpp b/Source/Client/IM-Client/IMClient/MainDlg.cpp new file mode 100644 index 0000000..15e372b --- /dev/null +++ b/Source/Client/IM-Client/IMClient/MainDlg.cpp @@ -0,0 +1,12697 @@ +// MainDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "ofstv.h" +#include "MainDlg.h" + +#include "MainDlg.h" +#include "cdib.h" +#include "LoadSkins.h" +#include "McVersionInfo.h" +#include "mcsettings.h" +#include "locale.h" +#include "WebWindow.h" +#include "XMLParsel.h" + +#include "AddUserDlg.h" +#include "SaveDataBase.h" +#include "MessageDlg.h" +#include +#include "DlgTV.h" + +/////////////////////////////////////////////// +/// Определения для настроек ... +/////////////////////////////////////////////// +// Новая версия +#include "PageGeneral.h" +#include "PageDialogMode.h" +#include "PageContactListMode.h" +#include "PageHistorySync.h" +#include "PageStatusMode.h" +#include "PageLaunchMode.h" +#include "PageEditMode.h" +#include "PageSound.h" +#include "PageAlerts.h" +#include "PageApps.h" +#include "PageChat.h" + +#include "FileDescriptioDlg.h" +#include "McVersionInfo.h" +#include "GroupFileDescriptionDlg.h" +#include "GroupAssingToDo.h" + +#include "PopupMessage.h" +#include "IBNUpdate.h" + +#include "SelectServer.h" + +#include "ChatCreateDlg.h" +#include "DelChatDlg.h" +#include "InviteChatDlg.h" +#include "MonitorDialog.h" +#include +//#include "McCreateWebFolders.h" + +//#include "IBNWFGlobalFunctions.h" +#include "IBNTO_MESSAGE.h" + +#include "PageMesTemplate.h" +#include "SmileManager.h" + +#include "resource.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CMainDlg dialog +extern COfsTvApp theApp; +extern void SetCurrentSkin(CString strName); +extern CString GetCurrentSkin(); +extern UINT g_IbnToMessage; + +extern CSmileManager CurrentSmileManager; + +/// STARTUP Флаги для загрузки ... +const DWORD STARTUP_NONE = 0x0000; +const DWORD STARTUP_START = 0x0001; +const DWORD STARTUP_CONTACTLIST_LOAD = 0x0002; +const DWORD STARTUP_LOADAPP_LOAD = 0x0004; +const DWORD STARTUP_ALL = 0x0007; +/// EXIT Флаги на выход... +const DWORD EXIT_NONE = 0x0000; +const DWORD EXIT_START = 0x0001; +const DWORD EXIT_MESSENGER = 0x0002; +const DWORD EXIT_ALL = 0x0003; +const DWORD EXIT_LOGOFF = 0x0004; + +CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/):COFSNcDlg2(CMainDlg::IDD, pParent),pSession(NULL),m_FileManager(this), +m_OleMainDropTarget(this),m_IbnCommandWnd(this) +{ + //{{AFX_DATA_INIT(CMainDlg) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT + + m_strSkinSettings = _T("/Shell/Main/skin.xml"); + + // [4/5/2002] + setlocale(LC_ALL,"") ; + srand( (unsigned)time( NULL ) ); + + EnableAutomation(); + + hIcon = NULL; + dwStartUpInfo = STARTUP_NONE; + dwExitInfo = EXIT_NONE; + m_bNowMcUpdateDownload = FALSE; + m_strMcUpdatePath = _T(""); + m_strMcUpdateParam = _T(""); + m_AutoChangeStatusTimeLast = 0; + m_OldStatus = -1; + m_bAutoUpdateExit = FALSE; + m_hWndAddUserDialog = NULL; + m_pAppList = NULL; + m_LastUserStatus = S_ONLINE; + + BeforStatusInetStatus = W_DISCONNECTED; + + ////////////////////////////////////////////////////////////////////////// + dwCurrentStatus = W_DISCONNECTED; + bRepairConect = FALSE; + m_bShowOnlyOnline = FALSE; + CurrTID = -1; + CurrChatTID = -1; + bExitAfterDiskonect = FALSE; + MessageSendMode = GetOptionInt(IDS_OFSMESSENGER,IDS_MESSSAGEMODE,1); + MesPotokLen = 0; + + bEnableLocalHistory = FALSE; + m_LocalHistory = NULL; + SynchronizeteHandle = 0L; + pSaverDB = NULL; + bShowInfo = TRUE; + m_lLogonHandle = 0; + m_bUpdateUserStatus = FALSE; + m_bUpdateDlgWasShow = FALSE; + //m_bCatchNavigate = TRUE; + //m_pMcHost = NULL; + + m_McUpdateWnd = NULL; + + m_bIsSSLMode = FALSE; + + m_bSilentMode = FALSE; + + m_bUserDomainMode = TRUE; + + m_hWndNetMonitor = NULL; + + m_hRightButtonDDGlobal = NULL; + m_bRightButtonDDTID = -1; + + m_lPort = 0; + +} + +CMainDlg::~CMainDlg() +{ + if(m_pAppList) + { + delete m_pAppList; + m_pAppList = NULL; + } + + if(::IsWindow(m_DlgLog.GetSafeHwnd())) + m_DlgLog.DestroyWindow(); + + int Size = m_NewMessageArray.GetSize(); + for(int i=0;iStop(); + delete pSaverDB; + pSaverDB = NULL; + } +} + + +void CMainDlg::DoDataExchange(CDataExchange* pDX) +{ + COFSNcDlg2::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CMainDlg) + DDX_Control(pDX, IDC_BUTTON_X, m_btnX); + DDX_Control(pDX, IDC_BUTTON_MIN, m_btnMin); + DDX_Control(pDX, IDC_BUTTON_MENU, m_btnMenu); + + DDX_Control(pDX, IDC_CCOOTREECTRL, m_treebox); + DDX_Control(pDX, IDC_CCOCONFERENCECTRL, m_chatbox); + DDX_Control(pDX, IDC_STATUS_STATIC, m_StatusStatic); + DDX_Control(pDX, IDC_USER_STATIC, m_UserStatic); + DDX_Control(pDX, IDC_LOGO,m_picLogo); + DDX_Control(pDX, IDC_APP_BAR,m_AppBar); + DDX_Control(pDX, IDC_BUTTON_ALERTS, m_btnAlerts); + DDX_Control(pDX, IDC_BUTTON_APPS, m_btnApps); + DDX_Control(pDX, IDC_BUTTON_FILES, m_btnFiles); + DDX_Control(pDX, IDC_BUTTON_DIRECTORY, m_btnDirectory); + + DDX_Control(pDX, IDC_BUTTON_SHOWOFFLINE, m_btnShowOffline); + //}}AFX_DATA_MAP + //DDX_Control(pDX, ID_EXWINDOW_BROWSER, m_InWindow); + if(!IsWindow(m_InWindow.GetSafeHwnd())) + m_InWindow.CreateAsChild(this, this); + // if(!IsWindow(m_WebFolderView.GetSafeHwnd())) + // m_WebFolderView.Create(AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(WHITE_BRUSH), NULL), + // NULL,WS_OVERLAPPED|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN,CRect(10,10,20,20),this,777); +} + + +BEGIN_MESSAGE_MAP(CMainDlg, COFSNcDlg2) +//{{AFX_MSG_MAP(CMainDlg) +ON_COMMAND(ID_TREEGROUP_CONFERENCE_CREATENEW,OnTreegroupConferenceCreateNew) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_CONFERENCE_CREATENEW,OnUpdateTreegroupConferenceCreateNew) +ON_COMMAND(ID_TREEMENU_CONFERENCE_CREATENEW,OnTreemenuConferenceCreateNew) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_CONFERENCE_CREATENEW,OnUpdateTreemenuConferenceCreateNew) + +ON_COMMAND(ID_OPTIONS_CONFERENCE_CREATENEW,OnOptionsConferenceCreateNew) +ON_UPDATE_COMMAND_UI(ID_OPTIONS_CONFERENCE_CREATENEW,OnUpdateOptionsConferenceCreateNew) + +ON_COMMAND(ID_CHATTREEMENU_VIEWDETAILS,OnChatViewDetails) +ON_COMMAND(ID_CHATTREEMENU_HISTORY,OnChatMessageHistory) +ON_COMMAND(ID_CHATTREEMENU_STATUS_LEAVE,OnChatLeave) +ON_COMMAND(ID_CHATTREEMENU_EDITDETAILS,OnChatEditDetails) +ON_COMMAND(ID_CHATTREEMENU_ADDAFRIEND,OnChatAddaFriends) +ON_COMMAND(ID_CHATTREEMENU_STATUS_INACTIVE,OnChatStatusInactive) +ON_COMMAND(ID_CHATTREEMENU_STATUS_ACTIVE,OnChatStatusActive) +ON_COMMAND(ID_CHATTREEMENU_ATTACH,OnChatAttach) +ON_COMMAND(ID_CHATTREEMENU_SENDMESSAGE,OnChatSendMessage) + +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_VIEWDETAILS,OnUpdateChatViewDetails) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_HISTORY,OnUpdateChatMessageHistory) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_STATUS_LEAVE,OnUpdateChatLeave) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_EDITDETAILS,OnUpdateChatEditDetails) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_ADDAFRIEND,OnUpdateChatAddaFriends) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_STATUS_INACTIVE,OnUpdateChatStatusInactive) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_STATUS_ACTIVE,OnUpdateChatStatusActive) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_ATTACH,OnUpdateChatAttach) +ON_UPDATE_COMMAND_UI(ID_CHATTREEMENU_SENDMESSAGE,OnUpdateChatSendMessage) + +ON_COMMAND(ID_TRAY_SHOWNEWMESSAGE,OnTrayShowNewMessage) +ON_UPDATE_COMMAND_UI(ID_TRAY_SHOWNEWMESSAGE,OnUpdateTrayShowNewMessage) +ON_UPDATE_COMMAND_UI(ID_TRAY_MYSTATUS_ONLINE, OnUpdateTrayMystatusOnline) +ON_UPDATE_COMMAND_UI(ID_TRAY_MYSTATUS_OFFLINE, OnUpdateTrayMystatusOffline) +ON_COMMAND(ID_TRAY_MYSTATUS_ONLINE, OnTrayMystatusOnline) +ON_COMMAND(ID_TRAY_MYSTATUS_OFFLINE, OnTrayMystatusOffline) +ON_COMMAND(ID_STATUS_AWAY, OnStatusAway) +ON_UPDATE_COMMAND_UI(ID_STATUS_AWAY, OnUpdateStatusAway) +ON_COMMAND(ID_STATUS_DND, OnStatusDnd) +ON_UPDATE_COMMAND_UI(ID_STATUS_DND, OnUpdateStatusDnd) +ON_COMMAND(ID_STATUS_INVISIBLE, OnStatusInvisible) +ON_UPDATE_COMMAND_UI(ID_STATUS_INVISIBLE, OnUpdateStatusInvisible) +ON_COMMAND(ID_STATUS_NA, OnStatusNa) +ON_UPDATE_COMMAND_UI(ID_STATUS_NA, OnUpdateStatusNa) +ON_COMMAND(ID_STATUS_ONLINE, OnStatusOnline) +ON_UPDATE_COMMAND_UI(ID_STATUS_ONLINE, OnUpdateStatusOnline) +ON_WM_CLOSE() +ON_COMMAND(ID_TRAY_EXIT, OnTrayExit) +ON_COMMAND(ID_TRAY_PREFERENCES, OnTrayPreferences) +ON_COMMAND(ID_TRAY_REPORTABUG, OnTrayReportBug) +ON_COMMAND(ID_STATUS_OFFLINE, OnStatusOffline) +ON_UPDATE_COMMAND_UI(ID_STATUS_OFFLINE, OnUpdateStatusOffline) +ON_WM_CAPTURECHANGED() +ON_WM_TIMER() +ON_MESSAGE(WM_UPDATE_STATUS,OnUpdateStatus) +ON_MESSAGE(WM_SETTEXT,OnSetText) +ON_COMMAND(ID_DBLCLK_TRAY,OnDnlClkTray) +ON_COMMAND(ID_LCLK_TRAY,OnLClkTray) +ON_MESSAGE(WM_INETLOGIN,OnInetLogin) +ON_MESSAGE(WM_CANCELLOGIN,OnCancelLogin) +ON_MESSAGE(WM_SHOWMESSAGEBOX,OnShowMessageBox) +ON_MESSAGE(WM_SHOW_ADDUSER,OnShowAddUser) +ON_MESSAGE(WM_CHANGE_NEWMESSAGE,OnChangeNewMessage) +ON_MESSAGE(WM_UPDATE_EXIT,OnUpdateExit) +ON_MESSAGE(WM_INVOKE_STARTAUTO_UPDATE,OnInvokeStartAutoUploader) +ON_MESSAGE(WM_INVOKE_CREATECHAT,OnInvokeCreateChat) +ON_MESSAGE(WM_INVOKE_SENDMESSAGE,OnInvokeSendMessage) +ON_MESSAGE(WM_UPDATE_CONTACTLIST,OnUpdateContactList) +ON_MESSAGE(WM_LOADAPP_COMPLETED, OnLoadAppComleted) +ON_MESSAGE(WM_SHOW_LOGIN_DLG, OnShowLoginDlg) +ON_MESSAGE(WM_UPLOAD_APP_FILE, OnUploadAppFile) +ON_UPDATE_COMMAND_UI(ID_OPTIONS_LOGOFF,OnUpdateOptionsLogOff) +ON_COMMAND(ID_OPTIONS_LOGOFF, OnOptionsLogOff) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_SENDMESSAGE, OnUpdateTreemenuSendmessage) +ON_COMMAND(ID_TREEMENU_SENDMESSAGE, OnTreemenuSendmessage) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_SENDFILE, OnUpdateTreemenuSendfile) +ON_COMMAND(ID_TREEMENU_ASSIGNTODO, OnTreemenuAssignToDo) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_ASSIGNTODO, OnUpdateTreemenuAssignToDo) + +ON_COMMAND(ID_TREEMENU_SENDFILE, OnTreemenuSendfile) +ON_WM_LBUTTONDBLCLK() +ON_COMMAND(ID_TREEMENU_DELETEUSER, OnTreemenuDeleteuser) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_DELETEUSER, OnUpdateTreemenuDeleteuser) +ON_COMMAND(ID_TREEMENU_FLOATINGON, OnTreemenuFloatingon) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_FLOATINGON, OnUpdateTreemenuFloatingon) +ON_COMMAND(ID_TREEMENU_MESSAGESHISTORY, OnTreemenuMessageshistory) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_MESSAGESHISTORY, OnUpdateTreemenuMessageshistory) +ON_COMMAND(ID_TREEMENU_USERDETAILS, OnTreemenuUserdetails) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_USERDETAILS, OnUpdateTreemenuUserdetails) +ON_WM_LBUTTONDOWN() +ON_WM_LBUTTONUP() +ON_COMMAND(ID_OPTIONS_SYNCHRONIZEHISTORY, OnOptionsSynchronizehistory) +ON_UPDATE_COMMAND_UI(ID_OPTIONS_SYNCHRONIZEHISTORY, OnUpdateOptionsSynchronizehistory) +ON_COMMAND(ID_OPTIONS_ADDINIVITE_FINDUSERADDTOFRIENDS, OnOptionsAddiniviteFinduseraddtofriends) +ON_COMMAND(ID_OPTIONS_FILEMANAGER_DOWNLOAD, OnOptionsFilemanagerDownload) +ON_COMMAND(ID_OPTIONS_FILEMANAGER_UPLOAD, OnOptionsFilemanagerUpload) +ON_COMMAND(ID_OPTIONS_NETWORKMONITOR, OnNetworkMonitor) +ON_UPDATE_COMMAND_UI(ID_OPTIONS_NETWORKMONITOR, OnUpdateNetworkMonitor) +ON_WM_SETCURSOR() +ON_COMMAND(ID_OPTIONS_VIEWMYDETAILS, OnOptionsViewmydetails) +ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIEWMYDETAILS, OnUpdateOptionsViewmydetails) +ON_COMMAND(ID_TREEGROUP_SENDFILE, OnTreegroupSendfile) +ON_COMMAND(ID_TREEGROUP_SENDMESSAGE, OnTreegroupSendmessage) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_SENDFILE, OnUpdateTreegroupSendfile) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_SENDMESSAGE, OnUpdateTreegroupSendmessage) + +ON_COMMAND(ID_TREEGROUP_ASSIGNTODO, OnTreegroupAssignToDo) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_ASSIGNTODO, OnUpdateTreegroupAssignToDo) + +ON_COMMAND(ID_TREEMENU_SENDEMAIL, OnTreemenuSendemail) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_SENDEMAIL, OnUpdateTreemenuSendemail) +ON_COMMAND(ID_TREEGROUP_SENDEMAIL, OnTreegroupSendemail) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_SENDEMAIL, OnUpdateTreegroupSendemail) +ON_MESSAGE(WM_NLT_CONTAINER_EVENT,OnNetEvent) +ON_MESSAGE(WM_KILL_SEND_MESSAGE_DLG,OnKillSendMessageDlg) +ON_MESSAGE(WM_KILL_COME_MESSAGE_DLG,OnKillComeMessageDlg) +ON_MESSAGE(WM_KILL_SPLIT_MESSAGE_DLG,OnKillSplitMesageDlg) +ON_MESSAGE(WM_CHANGE_STATUS,OnChangeStatus) +ON_MESSAGE(WM_CHECK_SIGNAL_STATE,OnCheckSignalState) +ON_COMMAND(ID_OPTIONS_PREFERENCES, OnOptionsPreferences) +ON_WM_RENDERFORMAT() +ON_WM_DESTROY() +ON_MESSAGE(WM_SEND_FILE,OnSendFile) +ON_MESSAGE(WM_SEND_FILE2,OnSendFile2) +ON_MESSAGE(WM_SENDGROUP_FILE,OnSendGroupFile) +ON_MESSAGE(WM_KILL_DELUSER_MESSAGE_DLG,OnKillDelUserMessageDlg) +ON_MESSAGE(WM_KILL_ADDUSER_MESSAGE_DLG,OnKillAddUserMessageDlg) +ON_MESSAGE(WM_KILL_INFILE_DLG,OnKillInFileDlg) +ON_COMMAND_RANGE(20000,20100,OnAppItem) +ON_COMMAND_RANGE(20200,20500,OnInviteUserToConference) +ON_COMMAND_RANGE(20700,21000,OnInviteGroupToConference) +ON_COMMAND_RANGE(21100,21200,OnSendMessageTemplate) +ON_COMMAND_RANGE(21300,21400,OnSendGroupMessageTemplate) +ON_MESSAGE(WM_ALERT_POPUP_MESSAGE_CLK,OnAlertPopupClk) +ON_WM_SIZE() +ON_WM_PAINT() +ON_MESSAGE(WM_DHTML_EVENT,OnDhtmlEvent) +ON_WM_ACTIVATE() +ON_WM_SETFOCUS() +ON_WM_QUERYENDSESSION() +ON_WM_ENDSESSION() +ON_REGISTERED_MESSAGE(g_IbnToMessage, OnIBNToMessage) +ON_MESSAGE(WM_PROCESS_COMMAND_LINE_MESSAGES, OnProcessCommandLineMessages) +ON_WM_DROPFILES() + +ON_COMMAND(ID_RIGHTBUTTONDD_ASSIGNTODO,OnRightButtonAssignToDo) +ON_UPDATE_COMMAND_UI(ID_RIGHTBUTTONDD_ASSIGNTODO,OnUpdateRightButtonAssignToDo) + +ON_COMMAND(ID_RIGHTBUTTONDD_SENDFILE,OnRightButtonSendFile) +ON_UPDATE_COMMAND_UI(ID_RIGHTBUTTONDD_SENDFILE,OnUpdateRightButtonSendFile) + +ON_COMMAND(ID_RIGHTBUTTONDD_UPLOADFILE,OnRightButtonUploadFile) +ON_UPDATE_COMMAND_UI(ID_RIGHTBUTTONDD_UPLOADFILE,OnUpdateRightButtonUploadFile) + +ON_COMMAND(ID_RIGHTBUTTONDD_CANCEL,OnRightButtonCancel) +ON_UPDATE_COMMAND_UI(ID_RIGHTBUTTONDD_CANCEL,OnUpdateRightButtonCancel) + +ON_COMMAND(ID_RIGHTBUTTONDD_CREATEISSUE,OnRightButtonCreateIssue) +ON_UPDATE_COMMAND_UI(ID_RIGHTBUTTONDD_CREATEISSUE,OnUpdateRightButtonCreateIssue) + +ON_COMMAND(ID_TREEMENU_SENDSCREENSHOT,OnTreeMenuSendScreenShot) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_SENDSCREENSHOT,OnUpdateTreeMenuSendScreenShot) + +ON_COMMAND(ID_TREEMENU_SCREENCAPTURE_ASSINGTODO,OnTreeMenuScreenShotAssignToDo) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_SCREENCAPTURE_ASSINGTODO,OnUpdateTreeMenuScreenShotAssignToDo) + +ON_COMMAND(ID_TREEGROUP_SCREENCAPTURE_SEND,OnTreeGroupSendScreenShot) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_SCREENCAPTURE_SEND,OnUpdateTreeGroupSendScreenShot) + +ON_COMMAND(ID_TREEGROUP_SCREENCAPTURE_ASSIGNTODO,OnTreeGroupScreenShotAssignToDo) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_SCREENCAPTURE_ASSIGNTODO,OnUpdateTreeGroupScreenShotAssignToDo) + +ON_COMMAND(ID_TREEMENU_CREATEEVENT,OnTreeMenuCreateEvent) +ON_UPDATE_COMMAND_UI(ID_TREEMENU_CREATEEVENT,OnUpdateTreeMenuCreateEvent) + +ON_COMMAND(ID_TREEGROUP_CREATEEVENT,OnTreeGroupCreateEvent) +ON_UPDATE_COMMAND_UI(ID_TREEGROUP_CREATEEVENT,OnUpdateTreeGroupCreateEvent) + +// Addon [4/16/2004] +ON_COMMAND(ID_TOOLSMENU_SCREENCAPTURE_SEND, OnToolsMenuScreenCaptureSend) +ON_UPDATE_COMMAND_UI(ID_TOOLSMENU_SCREENCAPTURE_SEND, OnUpdateToolsMenuScreenCaptureSend) +ON_COMMAND(ID_TOOLSMENU_SCREENCAPTURE_ASSIGNTODO, OnToolsMenuScreenCaptureAssignToDo) +ON_UPDATE_COMMAND_UI(ID_TOOLSMENU_SCREENCAPTURE_ASSIGNTODO, OnUpdateToolsMenuScreenCaptureAssignToDo) +ON_COMMAND(ID_TOOLSMENU_SCREENCAPTURE_CREATEISSUE, OnToolsMenuScreenCaptureCreateIssue) +ON_UPDATE_COMMAND_UI(ID_TOOLSMENU_SCREENCAPTURE_CREATEISSUE, OnUpdateToolsMenuScreenCaptureCreateIssue) + +ON_COMMAND(ID_TOOLSMENU_MESSAGEHISTORY, OnToolsMenuMessageHistory) +ON_UPDATE_COMMAND_UI(ID_TOOLSMENU_MESSAGEHISTORY, OnUpdateToolsMenuMessageHistory) +ON_COMMAND(ID_TOOLSMENU_FILEMANAGE, OnToolsMenuFileManage) +ON_UPDATE_COMMAND_UI(ID_TOOLSMENU_FILEMANAGE, OnUpdateToolsMenuFileManage) +ON_COMMAND(ID_TOOLSMENU_IBNTOOLBOX, OnToolsMenuIbnToolbox) +ON_UPDATE_COMMAND_UI(ID_TOOLSMENU_IBNTOOLBOX, OnUpdateToolsMenuIbnToolbox) +ON_COMMAND(ID_TOOLSMENU_NETWORKMONITOR, OnToolsMenuNetworkMonitor) +ON_UPDATE_COMMAND_UI(ID_TOOLSMENU_NETWORKMONITOR, OnUpdateToolsMenuNetworkMonitor) + +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMainDlg message handlers + +BOOL CMainDlg::Create(CWnd *pParentWnd) +{ + //strNowSkinName = _T("default"); + strNowSkinName = GetProductLanguage(); + + SetCurrentSkin(strNowSkinName); + + if(!COFSNcDlg2::Create(IDD, pParentWnd)) + { + TRACE0("Warning: failed to create CMainDlg.\n"); + return FALSE; + } + if(!m_bLoadSkin) + COFSNcDlg2::LoadSkin(); + //ShowWindow(SW_SHOW); + return TRUE; +} + +void CMainDlg::OnOK() +{ +} + +void CMainDlg::OnCancel() +{ + COFSNcDlg2::OnCancel(); +} + +BEGIN_EVENTSINK_MAP(CMainDlg, COFSNcDlg2) +//{{AFX_EVENTSINK_MAP(CMainDlg) +ON_EVENT(CMainDlg, IDC_BUTTON_MIN, -600 /* Click */, OnClickButtonMin, VTS_NONE) +ON_EVENT(CMainDlg, IDC_BUTTON_X, -600 /* Click */, OnClickButtonX, VTS_NONE) +ON_EVENT(CMainDlg, IDC_BUTTON_MENU, -600 /* Click */, OnClickButtonMenu, VTS_NONE) + +ON_EVENT(CMainDlg, IDC_CCOOTREECTRL, 1 /* Menu */, OnMenuTreectrl, VTS_I4 VTS_BOOL) +ON_EVENT(CMainDlg, IDC_CCOOTREECTRL, 2 /* Select */, OnSelectTreectrl, VTS_I4 VTS_BOOL) +ON_EVENT(CMainDlg, IDC_CCOOTREECTRL, 3 /* Action */, OnActionTreectrl, VTS_I4 VTS_BOOL) +ON_EVENT(CMainDlg, IDC_CCOOTREECTRL, 4 /* Action */, OnDoDropTreectrl, VTS_I4 VTS_BOOL VTS_UNKNOWN VTS_I4 VTS_I4) + +ON_EVENT(CMainDlg, IDC_CCOCONFERENCECTRL, 1 /* Menu */, OnChatMenuTreectrl, VTS_I4 VTS_BOOL) +ON_EVENT(CMainDlg, IDC_CCOCONFERENCECTRL, 2 /* Select */, OnChatSelectTreectrl, VTS_I4 VTS_BOOL) +ON_EVENT(CMainDlg, IDC_CCOCONFERENCECTRL, 3 /* Action */, OnChatActionTreectrl, VTS_I4 VTS_BOOL) +ON_EVENT(CMainDlg, IDC_CCOCONFERENCECTRL, 4 /* Action */, OnChatDoDropTreectrl, VTS_I4 VTS_BOOL VTS_UNKNOWN VTS_I4 VTS_I4) + +//ON_EVENT(CMainDlg, ID_EXWINDOW_BROWSER, DISPID_BEFORENAVIGATE2 /* BeforeNavigate2 */, OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL) +//ON_EVENT(CMainDlg, ID_EXWINDOW_BROWSER, DISPID_NAVIGATECOMPLETE2 /* DocumentComplet */, OnNavigateComplete2, VTS_DISPATCH VTS_PVARIANT) + +ON_EVENT(CMainDlg, IDC_BUTTON_ALERTS, -600 /* Click */, OnClickButtonAlerts, VTS_NONE) +ON_EVENT(CMainDlg, IDC_BUTTON_APPS, -600 /* Click */, OnClickButtonApps, VTS_NONE) +ON_EVENT(CMainDlg, IDC_BUTTON_FILES, -600 /* Click */, OnClickButtonFiles, VTS_NONE) +ON_EVENT(CMainDlg, IDC_BUTTON_DIRECTORY, -600 /* Click */, OnClickButtonDirectory, VTS_NONE) +ON_EVENT(CMainDlg, IDC_BUTTON_SHOWOFFLINE, -600 /* Click */, OnClickButtonShowOfflineUser, VTS_NONE) +//}}AFX_EVENTSINK_MAP +END_EVENTSINK_MAP() + +BOOL CMainDlg::OnInitDialog() +{ + COFSNcDlg2::OnInitDialog(); + + ////////////////////////////////////////////////////////////////////////// + // Set Style, Default: Don't Show IBN int the Task Bar. [7/22/2002] + if(GetOptionInt(IDS_OFSMESSENGER,IDS_REMOVE_FROM_TASK_BAR,TRUE)) + { + ModifyStyleEx(0,WS_EX_TOOLWINDOW); + } + ////////////////////////////////////////////////////////////////////////// + + if(IsToolboxIstalled()) + { + m_OleMainDropTarget.Register(this); + } + + m_UserStatic.SetTransparent(TRUE); + m_UserStatic.SetFontName(CString("Verdana")); + m_UserStatic.SetFontBold(TRUE); + m_UserStatic.SetFontSize(10); + + m_StatusStatic.SetTransparent(TRUE); + m_StatusStatic.SetFontName(CString("Verdana")); + m_StatusStatic.SetFontBold(TRUE); + m_StatusStatic.SetFontSize(10); + + //m_StatusImageList.Create(IDB_TRAYSTATUS_BITMAP,16,1,0xff00ff); + + CBitmap bm; + + m_StatusImageList.Create(16,16,ILC_COLOR32|ILC_MASK, 0,4); + bm.LoadBitmap(IDB_TRAYSTATUS_BITMAP); + m_StatusImageList.Add(&bm,RGB(255,0,255)); + bm.DeleteObject (); + + + //m_McUpdateDownload.Init(GetSafeHwnd(),WM_MCUPDATE_LOADED); + + m_CoolMenuManager.Install((CFrameWnd*)this); + + LoadSkins LoadSkin; + + CurrentSmileManager.Init(); + + try + { + IStreamPtr pStream = NULL; + long Error = 0; + LoadSkin.Load(bstr_t(IBN_SCHEMA)+bstr_t((LPCTSTR)GetProductLanguage())+bstr_t("/Shell/Main/status.bmp"),&pStream,&Error); + if(pStream!=NULL) + { + CDib dib(pStream); + CPaintDC dc(this); + m_bmpStatus.Attach(dib.GetHBITMAP(dc)); + } + + TOOLBARDATA Tdt = {1,16,16,15,0}; + WORD dwItemID[] = {1,2,3,ID_STATUS_ONLINE,ID_STATUS_DND,ID_STATUS_AWAY,ID_STATUS_NA,4,5,6,7,ID_STATUS_OFFLINE,8,9,ID_STATUS_INVISIBLE}; + Tdt.items = (WORD*)dwItemID; + + m_CoolMenuManager.LoadToolbar(m_bmpStatus,&Tdt); + + } + catch (...) + { + ASSERT(FALSE); + } + + // create a view to occupy the client area of the frame + SetIcon(hIcon,FALSE); + SetIcon(hIcon,TRUE); + + CString strRect = GetOptionString(IDS_OFSMESSENGER, IDR_MAINFRAME, _T("")); + if(!strRect.IsEmpty()) + { + CRect rWindow = StringToRect(strRect); + FitRectToWindow(rWindow); + SetWindowPos(NULL,rWindow.left,rWindow.top,rWindow.Width(),rWindow.Height(),SWP_NOZORDER|SWP_NOACTIVATE); + } + + ////////////////////////////////////////////////////////////////////////// + // [4/5/2002] + m_FileManager.Create(CFileManagerDlg::IDD,GetDesktopWindow()); + + CRect rMessenger(53,57,52+194,57+236); + //m_treebox.Create(NULL,WS_VISIBLE|WS_CLIPCHILDREN,rMessenger,this,ID_COOTREE_CTRL); + pSession = theNet2.GetSession(); + ASSERT(pSession!=NULL); + + theNet2.InitEventWindow(this->m_hWnd); + + + //m_bCatchNavigate = FALSE; + + //m_InWindow.SetRegisterAsDropTarget(FALSE); + //m_InWindowDropTarget = new CMcMessengerDropTarget(this); + //m_InWindowDropTarget->Register(&m_InWindow); + //m_WebFolderView.ShowWindow(SW_HIDE); + + m_InWindow.ShowWindow(SW_HIDE); + m_InWindow.Navigate(bstr_t(IBN_SCHEMA)+ bstr_t((LPCTSTR)GetProductLanguage()) +_T("/Common/blank.html")); + //m_InWindow.m_browser.SetWindowPos(&m_treebox,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); + + CreateTree(); + // Addon for Conference [8/6/2002] + CreateChatTree(); + // OlegO [8/6/2002] + + m_HistoryDlg.Create(CHistoryDlg::IDD,GetDesktopWindow()); + m_HistoryDlg.SetMessenger(this); + + //SetWindowPos(&wndTopMost,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); + + //m_AppBar.m_AppCtrl.Create(13,55,this); + + LOGFONT lgFont = {0}; + + lgFont.lfHeight = -14; + lgFont.lfWeight = FW_BOLD; + lgFont.lfCharSet = DEFAULT_CHARSET; + _tcscpy(lgFont.lfFaceName, _T("Arial")); + + m_AppBar.m_AppCtrl.SetFont(&lgFont); + ////////////////////////////////////////////////////////////////////////// + + CreateTray(); + + m_DlgLog.m_LoginStr = _T(""); + m_DlgLog.m_PasswordStr = _T(""); + + ////////////////////////////////////////////////////////////////////////// + // Play Sound [2/27/2002] + McPlaySound(IDS_STARTUP_KEY); + ////////////////////////////////////////////////////////////////////////// + + m_DlgLog.Create(CLoginDlg::IDD,this); + + BOOL bCreateCommandWndResult = m_IbnCommandWnd.Create(); + + /*if(m_bSilentMode) + m_DlgLog.ShowWindow(SW_HIDE); + else + { + m_DlgLog.ShowWindow(SW_SHOWNORMAL); + m_DlgLog.UpdateWindow(); + m_DlgLog.SetForegroundWindow(); + m_DlgLog.SetFocus(); + }*/ + + ////////////////////////////////////////////////////////////////////////// + // McToolTipAddon + m_ToolTip.AddTool(&m_btnX,IDS_TIP_CLOSE); + m_ToolTip.AddTool(&m_btnMin,IDS_TIP_MINIMIZE); + m_ToolTip.AddTool(&m_btnShowOffline,IDS_SHOWOFFLINE_USERS); + //m_ToolTip.AddTool(&m_btnMenu,IDS_TIP_MENU); + ////////////////////////////////////////////////////////////////////////// + + if(GetOptionInt(IDS_OFSMESSENGER,IDS_AUTOLOGON,TRUE)&& + GetOptionInt(IDS_LOGIN,IDS_REMEMBER,TRUE)&& + !m_DlgLog.m_LoginStr.IsEmpty()) + { + if(m_bSilentMode) + m_DlgLog.ShowWindow(SW_HIDE); + else + { + m_DlgLog.ShowWindow(SW_SHOWNORMAL); + m_DlgLog.UpdateWindow(); + m_DlgLog.SetForegroundWindow(); + m_DlgLog.SetFocus(); + } + Login(); + } + else + { + m_DlgLog.ShowWindow(SW_SHOWNORMAL); + m_DlgLog.UpdateWindow(); + m_DlgLog.SetForegroundWindow(); + m_DlgLog.SetFocus(); + } + + + SetTimer(IDT_AUTOCHANGETIMER,10000,NULL); + SetTimer(IDT_LOADNOTSENDMESSAGES,60000,NULL); + SetTimer(IDT_MCSCREENCAPTUREEX,500,NULL); + //SetTimer(IDT_LOADNOTSENDMESSAGES,6000,NULL); + + return TRUE; +} + +void CMainDlg::OnClickButtonMin() +{ + //if(GetOptionInt(IDS_OFSMESSENGER,IDS_HIDEINTRAY,FALSE)==FALSE) + ShowWindow(SW_MINIMIZE); + //else + // ShowWindow(SW_HIDE); +} + +void CMainDlg::OnClickButtonX() +{ + if(GetOptionInt(IDS_OFSMESSENGER,IDS_MINIMIZE_ONCLOSE,TRUE)==FALSE) + OnClose(); + else + OnClickButtonMin(); +} + +void CMainDlg::LoadSkin(IXMLDOMNode *pXmlRoot) +{ + m_btnX.ShowWindow(SW_HIDE); + m_btnMin.ShowWindow(SW_HIDE); + m_btnMenu.ShowWindow(SW_HIDE); + m_btnAlerts.ShowWindow(SW_HIDE); + m_btnApps.ShowWindow(SW_HIDE); + m_btnFiles.ShowWindow(SW_HIDE); + m_btnDirectory.ShowWindow(SW_HIDE); + m_btnShowOffline.ShowWindow(SW_HIDE); + + m_treebox.ShowWindow(SW_HIDE); + m_chatbox.ShowWindow(SW_HIDE); + m_InWindow.ShowWindow(SW_HIDE); + //m_WebFolderView.ShowWindow(SW_HIDE); + m_UserStatic.ShowWindow(SW_HIDE); + m_StatusStatic.ShowWindow(SW_HIDE); + m_picLogo.ShowWindow(SW_HIDE); + m_AppBar.ShowWindow(SW_HIDE); + + + + LoadButton(pXmlRoot, _T("X"), &m_btnX, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Minimize"), &m_btnMin, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Menu"), &m_btnMenu, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Alerts"), &m_btnAlerts, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Apps"), &m_btnApps, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Files"), &m_btnFiles, TRUE, FALSE); + LoadButton(pXmlRoot, _T("Directory"), &m_btnDirectory, TRUE, FALSE); + LoadButton(pXmlRoot, _T("ShowOffline"), &m_btnShowOffline, TRUE, TRUE); + + LoadRectangle(pXmlRoot, _T("Browser"), &m_InWindow, FALSE); + //LoadRectangle(pXmlRoot, _T("Browser"), &m_WebFolderView, FALSE); + LoadRectangle(pXmlRoot, _T("Browser"), &m_chatbox, FALSE); + LoadRectangle(pXmlRoot, _T("Browser"), &m_treebox, TRUE); + + LoadRectangle(pXmlRoot, _T("UserShowName"), &m_UserStatic,TRUE); + LoadRectangle(pXmlRoot, _T("UserStatus"), &m_StatusStatic, TRUE); + LoadRectangle(pXmlRoot, _T("Logo"), &m_picLogo,TRUE); + + LoadAppBar(pXmlRoot); + + // [9/21/2004] + m_bShowOffline = GetOptionInt(IDS_OFSMESSENGER,IDS_SHOWOFFLINEFILES,TRUE); + m_btnShowOffline.SetPressed(m_bShowOffline); + // LoadRectangle2(pXmlRoot, _T("Status"), m_.GetSafeHwnd(), TRUE); +} + +void CMainDlg::OnClickButtonMenu() +{ + ShowGeneralMenu(CurrChatTID); +} + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +void CMainDlg::OnUpdateTrayMystatusOnline(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + pCmdUI->SetRadio(ConnectEnable()); +} + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +void CMainDlg::OnUpdateTrayMystatusOffline(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + pCmdUI->SetRadio(!ConnectEnable()); +} + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +void CMainDlg::OnTrayMystatusOnline() +{ + // TODO: Add your command handler code here + if(!ConnectEnable()) + { + Login2(); + } +} + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +void CMainDlg::OnTrayMystatusOffline() +{ +} + +//------------------------------------------------------------------------------- +// Name: CreateBar +// Desc: Создаются Бары. +//------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------- +// Name: CreateTray +// Desc: Создается иконка в трэе. +//------------------------------------------------------------------------------- +int CMainDlg::CreateTray() +{ + m_hMessengerTrayIcon = theApp.LoadIcon(IDR_MAINFRAME); + + m_MessengerTray.Create(NULL, // Parent window + WM_NOTIFY_MESSENGER_TRAY, + GetString(IDR_MAINFRAME), // tooltip + m_StatusImageList.ExtractIcon(0 + (IsSSLMode()?7:0)), // Icon to use + IDR_OFS_MENU); + + return 0; +} + +//------------------------------------------------------------------------------- +// Name: OnUpdateStatus +// Desc: Сообщение от Мессенжера об изменении статуса. +//------------------------------------------------------------------------------- +HRESULT CMainDlg::OnUpdateStatus(WPARAM w, LPARAM l) +{ + W_NETSTATUS NetStatus = (W_NETSTATUS)w; + + DWORD UserStatus = l; + + COLORREF color = RGB(0,166,81); + //CStaticOFS *pItem = NULL; + //OFSWinType Type; + int IconIndex = UserStatus; + + CString strText=_T(""); + + TRACE(_T("\r\nUpdate User Status = %d (%d)"), UserStatus, m_LastUserStatus); + + //m_StatusBar2.GetItem(IDS_STATUSNAME,Type,(void**)&pItem); + + switch(NetStatus) + { + case W_DISCONNECTED: + if(dwExitInfo & EXIT_START) + { + dwExitInfo |= EXIT_MESSENGER; + CheckExit(); + } + else if(dwExitInfo&EXIT_LOGOFF) + { + dwExitInfo = EXIT_NONE; + dwStartUpInfo = STARTUP_NONE; + m_DlgLog.UnBlock(); + } + else + { + m_DlgLog.UnBlock(); + } + + strText = GetString(IDS_OFFLINE); + color = RGB(255,0,0); + + + break; + case W_CONNECTING: + IconIndex = 6; + color = RGB(0xFF,0xFF,0); + strText = GetString(IDS_CONNECTING); + break; + case W_CONNECTED: + switch(BeforStatusInetStatus) + { + case W_DISCONNECTED: + case W_CONNECTING: + { + //OFSWinType m_Type; + //CStaticOFS *pItem = NULL; + //m_StatusBar2.GetItem(IDS_USERNAME,m_Type,(void**)&pItem); + //if(m_Type==OFSWT_STATIC) + //{ + //pItem->SetText(GetShowName()); + //pItem->SetColor(RGB(255,255,255)); + //} + m_UserStatic.SetText(GetShowName()); + m_UserStatic.SetTextColor(RGB(255,255,255)); + } + StartStartUpLoad(); + break; + case W_CONNECTED: + /// Продолжаем Обработку ситуации ... + break; + } + ////////////////////////////////////////////////////////////////////////// + // [1/21/2002] + ////////////////////////////////////////////////////////////////////////// + switch(UserStatus) + { + case S_OFFLINE: + strText = GetString(IDS_OFFLINE); + color = RGB(255,0,0); + break; + case S_ONLINE: + strText = GetString(IDS_ONLINE); + color = RGB(0,166,81); + m_LastUserStatus = S_ONLINE; + break; + case S_INVISIBLE: + strText = GetString(IDS_INVISIBLE); + color = RGB(0,166,81); + m_LastUserStatus = S_INVISIBLE; + break; + case S_DND: + strText = GetString(IDS_DND); + color = RGB(0,166,81); + m_LastUserStatus = S_DND; + break; + case S_AWAY: + strText = GetString(IDS_AWAY); + color = RGB(0,166,81); + m_LastUserStatus = S_AWAY; + break; + case S_NA: + strText = GetString(IDS_NA); + color = RGB(0,166,81); + m_LastUserStatus = S_NA; + break; + case S_OCCUPIED: + strText = GetString(IDS_OCCUPIED); + color = RGB(0,166,81); + m_LastUserStatus = IDS_OCCUPIED; + break; + case S_AWAITING: + strText = GetString(IDS_AWAITING); + color = RGB(0,166,81); + break; + case S_UNKNOWN: + strText = GetString(IDS_UNKNOWN); + color = RGB(0,166,81); + break; + } + ////////////////////////////////////////////////////////////////////////// + break; + } + + m_MessengerTray.SetIcon(m_StatusImageList.ExtractIcon(IconIndex + (IsSSLMode()?7:0))); + + //pItem->SetText(strText); + //pItem->SetColor(color); + m_StatusStatic.SetText(strText+_T(":")); + m_StatusStatic.SetTextColor(color); + + + CString strToolTip = GetString(IDS_TRAY_TOOLTIP_FORMAT); + + // Domen Addon [3/29/2004] + CString strTmp = strText; + strText.Format(_T("%s - %s"), m_DlgLog.m_LoginStr, strTmp); + + if(IsSSLMode()) + { + strText += _T(" (SSL)"); + } + // Domen Addon [3/29/2004] + strToolTip.Format(GetString(IDS_TRAY_TOOLTIP_FORMAT),strText); + + m_MessengerTray.SetTooltipText(strToolTip); + //pItem->SetText(strText); + //pItem->SetColor(color); + Invalidate(FALSE); + + BeforStatusInetStatus = NetStatus; + + return 0; +} + + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +void CMainDlg::OnStatusAway() +{ + m_AutoStatus.Reset(); + PostMessage(WM_CHANGE_STATUS,S_AWAY); +} + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +void CMainDlg::OnUpdateStatusAway(CCmdUI* pCmdUI) +{ + UpdateStatus(S_AWAY,pCmdUI); + +} + +void CMainDlg::OnStatusDnd() +{ + m_AutoStatus.Reset(); + PostMessage(WM_CHANGE_STATUS,S_DND); +} + +void CMainDlg::OnUpdateStatusDnd(CCmdUI* pCmdUI) +{ + UpdateStatus(S_DND,pCmdUI); + +} + +void CMainDlg::OnStatusInvisible() +{ + m_AutoStatus.Reset(); + PostMessage(WM_CHANGE_STATUS,S_INVISIBLE); + +} + +void CMainDlg::OnUpdateStatusInvisible(CCmdUI* pCmdUI) +{ + UpdateStatus(S_INVISIBLE,pCmdUI); + +} + +void CMainDlg::OnStatusNa() +{ + m_AutoStatus.Reset(); + PostMessage(WM_CHANGE_STATUS,S_NA); + +} + +void CMainDlg::OnUpdateStatusNa(CCmdUI* pCmdUI) +{ + UpdateStatus(S_NA,pCmdUI); + +} + +void CMainDlg::OnStatusOnline() +{ + m_AutoStatus.Reset(); + PostMessage(WM_CHANGE_STATUS,S_ONLINE); +} + +void CMainDlg::OnUpdateStatusOnline(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + UpdateStatus(S_ONLINE,pCmdUI); +} + +void CMainDlg::UpdateStatus(int Status,CCmdUI *pCmdUI) +{ + pCmdUI->Enable(dwStartUpInfo==STARTUP_ALL); + pCmdUI->SetCheck(GetUserStatus()==Status); +} + +//------------------------------------------------------------------------------- +// Name: Login +// Desc: Конектимся к Серверу. +//------------------------------------------------------------------------------- +void CMainDlg::Login() +{ + dwExitInfo = EXIT_NONE; + dwStartUpInfo = STARTUP_NONE; + + SetInetOption(); + + m_DlgLog.Block(); + + CString LoginStr = m_DlgLog.m_LoginStr; + + int StartPortPos = -1; + if((StartPortPos = LoginStr.Find(_T(":")))!=-1) + { + CString strPort = LoginStr.Mid(StartPortPos+1); + + LoginStr = LoginStr.Left(StartPortPos); + + m_lPort = _ttol(strPort); + } + else + m_lPort=0; + + SetEnvironmentVariable(_T("MpaUserLogin"), LoginStr); + SetEnvironmentVariable(_T("MpaUserPassword"),m_DlgLog.m_PasswordStr); + + LockShowInfo(); + + Login2(m_LastUserStatus); + +} + + +//------------------------------------------------------------------------------- +// Name: OnSetText +// Desc: Мои опыты. Можно убрать. +//------------------------------------------------------------------------------- +HRESULT CMainDlg::OnSetText(WPARAM w, LPARAM l) +{ + // Turn WS_VISIBLE style off before calling Windows to + // set the text. Reset to visible afterwards + DWORD dwStyle = ::GetWindowLong(*this, GWL_STYLE); + if (dwStyle & WS_VISIBLE) + ::SetWindowLong(*this, GWL_STYLE, (dwStyle & ~ WS_VISIBLE)); + //Default(); + DefWindowProc( WM_SETTEXT, 0, l); + if (dwStyle & WS_VISIBLE) + ::SetWindowLong(*this, GWL_STYLE, dwStyle); + + Invalidate(); + SetWindowPos(NULL, 0,0,0,0, + SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE); + + return 0; +} + +//------------------------------------------------------------------------------- +// Name: OnClose +// Desc: Закрытие программы но только в случае если был Logoff с сервером, а так +// просто прячем. +//------------------------------------------------------------------------------- +BOOL g_IsClosing = FALSE; +BOOL g_IsClosingByPost = FALSE; +void CMainDlg::OnClose() +{ + if(!g_IsClosingByPost) + { + g_IsClosingByPost = TRUE; + PostMessage(WM_CLOSE, 0, 0); + return; + } + g_IsClosingByPost = FALSE; + +TRACE(_T("\r\n CMainDlg::OnClose() 1")); + if(!g_IsClosing) + { +TRACE(_T("\r\n CMainDlg::OnClose() 2")); + g_IsClosing = TRUE; + + DWORD dwStyle = GetStyle(); + if(!(dwStyle&WS_VISIBLE) && !ConnectEnable(FALSE)) + { +TRACE(_T("\r\n CMainDlg::OnClose() 3")); + if(IsWindow(m_McUpdateWnd)) + ::PostMessage(m_McUpdateWnd, WM_CLOSE, 0, 0); + //m_McUpdateDownload.StopDownload(100); + KillTimer(IDT_AUTOCHANGETIMER); + KillTimer(IDT_LOADNOTSENDMESSAGES); + KillTimer(IDT_MCSCREENCAPTUREEX); + + CloseAllWindows(); + + COFSNcDlg2::OnClose(); + DestroyWindow(); + delete this; + return; + } +TRACE(_T("\r\n CMainDlg::OnClose() 4")); + + // TODO: Add your message handler code here and/or call default + if(dwExitInfo != EXIT_ALL) + { +TRACE(_T("\r\n CMainDlg::OnClose() 5")); + int ExitValue = 0; + + ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(); + + if(m_bAutoUpdateExit) + { +TRACE(_T("\r\n CMainDlg::OnClose() 6")); + m_MessageBox.SetAutoCloseTime(30); + ExitValue = m_MessageBox.Show(GetString(IDS_AUTOUPDATE_CLOSE_NAME), MB_YESNO); + m_MessageBox.SetAutoCloseTime(-1); + m_bAutoUpdateExit = FALSE; + } + else + { +TRACE(_T("\r\n CMainDlg::OnClose() 7")); + ExitValue = m_MessageBox.Show(GetString(IDS_DO_CLOSE_NAME), MB_YESNO); + } + + if(ExitValue == IDYES) + { +TRACE(_T("\r\n CMainDlg::OnClose() 8")); + if(IsWindow(m_hWndAddUserDialog)) + { + ::PostMessage(m_hWndAddUserDialog, WM_CLOSE, 0, 0); + } + m_hWndAddUserDialog = NULL; + + if(GetStyle()&WS_VISIBLE && GetOptionInt(IDS_OFSMESSENGER, IDS_ANIMATION, FALSE)) + RoundExitAddon(this); + + ShowWindow(SW_HIDE); + m_MessengerTray.RemoveIcon(); + if(ConnectEnable(FALSE)) + { +TRACE(_T("\r\n CMainDlg::OnClose() 9")); + dwExitInfo = EXIT_START; + LogOff(); + } + else + { +TRACE(_T("\r\n CMainDlg::OnClose() 10")); + if(IsWindow(m_McUpdateWnd)) + ::PostMessage(m_McUpdateWnd, WM_CLOSE, 0, 0); + + //m_McUpdateDownload.StopDownload(100); + KillTimer(IDT_AUTOCHANGETIMER); + KillTimer(IDT_LOADNOTSENDMESSAGES); + KillTimer(IDT_MCSCREENCAPTUREEX); + + CloseAllWindows(); + + COFSNcDlg2::OnClose(); + DestroyWindow(); + delete this; + } + } + } + else + { +TRACE(_T("\r\n CMainDlg::OnClose() 11")); + if(IsWindow(m_McUpdateWnd)) + ::PostMessage(m_McUpdateWnd,WM_CLOSE,0,0); + + //m_McUpdateDownload.StopDownload(100); + KillTimer(IDT_AUTOCHANGETIMER); + KillTimer(IDT_LOADNOTSENDMESSAGES); + KillTimer(IDT_MCSCREENCAPTUREEX); + + CloseAllWindows(); + + COFSNcDlg2::OnClose(); + DestroyWindow(); + delete this; + } +TRACE(_T("\r\n CMainDlg::OnClose() 12")); + + g_IsClosing = FALSE; + } +} + +//------------------------------------------------------------------------------- +// Name: OnInetLogin +// Desc: +//------------------------------------------------------------------------------- +HRESULT CMainDlg::OnInetLogin(WPARAM w, LPARAM l) +{ + m_LastUserStatus = S_ONLINE; + m_bUserDomainMode = TRUE; + + Login(); + return 0; +} + +//------------------------------------------------------------------------------- +// Name: StartStartUpLoad +// Desc: Прежде чем показать программу во всей красе: +// - Подключаем Мессенжер. +// - Кэшируем Данные. +// - Загружаем промосы. +//------------------------------------------------------------------------------- +void CMainDlg::StartStartUpLoad() +{ + if(dwStartUpInfo!=STARTUP_ALL) + { + dwStartUpInfo |= STARTUP_START; + /// Запросить Данные ... + /// strUserRole = (GetRoleID()==1)?_T("ProductBuyer"):_T("ProductSeller"); + + // Загрузить список апликейшинов [2/1/2002] + LoadOptions(); + TRACE(_T("\r\n CMainDlg::StartStartUpLoad (%d)"), dwStartUpInfo); + CheckAllStartUpWasLoad(); + } + +} + +//------------------------------------------------------------------------------- +// Name: CheckAllStartUpWasLoad +// Desc: Проверяет наличие всех условий необходимых для запуска программы. +//------------------------------------------------------------------------------- +void CMainDlg::CheckAllStartUpWasLoad() +{ + //TRACE(_T("\r\n CMainDlg::CheckAllStartUpWasLoad (%d)",dwStartUpInfo); + //MCTRACE(9,"[CMainDlg::CheckAllStartUpWasLoad] Code = %04X",dwStartUpInfo); + + if(dwStartUpInfo==STARTUP_ALL) + { + /// Все предварительная загрузка завершена + if(m_DlgLog.IsBlock()) + { + m_DlgLog.UnBlock(); + m_DlgLog.ShowWindow(SW_HIDE); + + //m_DlgLog.m_LoginStr = GetOptionString(IDS_LOGIN,IDS_NICKNAME,""); + //m_DlgLog.m_PasswordStr = GetOptionString(IDS_LOGIN,IDS_PASSWORD,""); + //UnPack(m_DlgLog.m_PasswordStr,CString("vTsfO")); + + m_DlgLog.UpdateData(FALSE); + + if(!m_bSilentMode) + { + ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(); + } + else + { + m_bSilentMode = FALSE; + } + + if(GetOptionInt(IDS_OFSMESSENGER,IDS_KEEPTOP,FALSE)) + SetWindowPos(&wndTopMost,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE); + else + SetWindowPos(&wndTop,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE); + + m_btnMin.ShowWindow(GetOptionInt(IDS_OFSMESSENGER,IDS_MINIMIZE_ONCLOSE,TRUE)?SW_HIDE:SW_SHOW); + + LoadUserProfile(); + UnlockShowInfo(); + } + } +} + +void CMainDlg::CheckExit() +{ + if(dwExitInfo == EXIT_ALL) + PostMessage(WM_CLOSE); + // COFSNcDlg2::OnClose(); +} + +//------------------------------------------------------------------------------- +// Name: CreateMessageDialog +// Desc: Показывает Информационное окно сообщения. +//------------------------------------------------------------------------------- +void CMainDlg::CreateMessageDialog(bstr_t &Path) +{ +/* +LoadSkins m_LoadSkin; +CPaintDC dc(this); + + IStreamPtr m_Stream = NULL; + long ErrorCode = 0; + m_LoadSkin.Load(bstr_t(Path+L"/Main/border.bmp"),&m_Stream,&ErrorCode); + if(m_Stream) + { + CDib m_Dib(m_Stream); + m_MessageBox.SetBoundaryBMP(m_Dib.GetHBITMAP(dc)); + } + + */ +} + +HRESULT CMainDlg::OnShowMessageBox(WPARAM w, LPARAM l) +{ + m_MessageBox.Show(GetString(UINT(w))); + return 0; +} + +HRESULT CMainDlg::OnShowAddUser(WPARAM w, LPARAM l) +{ + if(IsWindow(m_hWndAddUserDialog)) + { + CMcWindowAgent winAgent(m_hWndAddUserDialog); + winAgent.ShowWindow(SW_SHOWNORMAL); + winAgent.SetForegroundWindow(); + } + else + { + CWebWindow *m_pShowAddUser = new CWebWindow; + + CString strShowAddUserUrl; + strShowAddUserUrl.Format(CString(IBN_SCHEMA)+CString(_T("/%s/Browser/Find/index.html")),::GetCurrentSkin()); + + CRect winRect; + GetWindowRect(&winRect); + + m_pShowAddUser->CreateAutoKiller(_T("/Browser/Find/skin.xml"), this,GetDesktopWindow(),winRect.left-150,winRect.top+20,500,300,GetString(IDS_INSTANT_DIRECTORY_NAME),strShowAddUserUrl,FALSE,FALSE,TRUE,IDS_FINDUSER); + m_hWndAddUserDialog = m_pShowAddUser->GetSafeHwnd(); + } + + return 0; +} + +//------------------------------------------------------------------------------- +// Name: OnDnlClkTray +// Desc: +//------------------------------------------------------------------------------- + +void CMainDlg::OnDnlClkTray() +{ + if(dwStartUpInfo==STARTUP_ALL && + dwExitInfo==EXIT_NONE) + { + if(OnCheckSignalState(WM_CHECK_SIGNAL_STATE,0))//SendMessage(WM_CHECK_SIGNAL_STATE)) + { + // Reconect [2/27/2002] + if(!ConnectEnable(FALSE)) + { + OnStatusOnline(); + } + } + else + Invalidate(); + } +} + +void CMainDlg::OnLClkTray() +{ + if(dwStartUpInfo==STARTUP_ALL && + dwExitInfo==EXIT_NONE) + { + if(OnCheckSignalState(WM_CHECK_SIGNAL_STATE,0))//SendMessage(WM_CHECK_SIGNAL_STATE)) + { + BOOL bVisible = GetStyle()&WS_VISIBLE; + if(bVisible) + { + if(IsIconic()) + ShowWindow(SW_RESTORE); + else + ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(); + } + else + { + ShowWindow(SW_SHOWNORMAL); + } + } + else + Invalidate(); + } + else + { + m_DlgLog.ShowWindow(SW_SHOWNORMAL); + } +} + +//------------------------------------------------------------------------------- +// Name: SetInetOption +// Desc: Установить опции по умолчанию. +//------------------------------------------------------------------------------- +void CMainDlg::SetInetOption() +{ + INTERNET_PROXY_INFO m_ProxyInfo; + m_ProxyInfo.dwAccessType = (DWORD)GetOptionInt(IDS_NETOPTIONS,IDS_ACCESSTYPE,INTERNET_OPEN_TYPE_PRECONFIG); + + CString strProxy = GetOptionString(IDS_NETOPTIONS, IDS_PROXYNAME, _T("")) + _T(":") + GetOptionString(IDS_NETOPTIONS, IDS_PROXYPORT, _T("")); + m_ProxyInfo.lpszProxy = (LPCTSTR)strProxy; + m_ProxyInfo.lpszProxyBypass = (GetOptionInt(IDS_LOGIN,IDS_BYPASSENABLE,FALSE))?((LPCTSTR)_T("")):((LPCTSTR)_T("")); + + BOOL bFlag = InternetSetOption(NULL,INTERNET_OPTION_PROXY,&m_ProxyInfo,sizeof(INTERNET_PROXY_INFO)); + + HRESULT hr = UrlMkSetSessionOption(INTERNET_OPTION_PROXY,&m_ProxyInfo,sizeof(INTERNET_PROXY_INFO),0); +} + +//------------------------------------------------------------------------------- +// Name: OnChangeNewMessage +// Desc: Меняет число мессаг. Для Мигания в Трэе если больше 0. +//------------------------------------------------------------------------------- +HRESULT CMainDlg::OnChangeNewMessage(WPARAM w, LPARAM l) +{ + long NewMessageItem = (long)w; + if(NewMessageItem) + { + m_MessengerTray.StopAnimation(); + m_MessengerTray.SetIconList(IDI_NEWMESSAGE,IDI_EMPTY); + m_MessengerTray.Animate(300); + } + else + { + m_MessengerTray.StopAnimation(); + m_MessengerTray.SetIcon(m_StatusImageList.ExtractIcon(GetUserStatus() + (IsSSLMode()?7:0))); + } + return 0; +} + +void CMainDlg::OnTrayExit() +{ + m_DlgLog.PostMessage(WM_CLOSE); +} + +void CMainDlg::OnTrayPreferences() +{ + PreferenceDlg(this); +} + +void CMainDlg::OnTrayReportBug() +{ +#ifndef RADIUS + CString strUrl = _T("http://feedback.mediachase.com"); +#else + CString strUrl = _T("http://www.radius-group.ru"); +#endif + + if(S_OK!=NavigateNewWindow(NULL,strUrl)) + { + ShellExecute(::GetDesktopWindow(), _T("open"), strUrl, NULL, NULL, SW_SHOWDEFAULT); + } +} + + +void CMainDlg::OnStatusOffline() +{ + if(ConnectEnable(FALSE)) + { + dwStartUpInfo = STARTUP_NONE; + dwExitInfo = EXIT_LOGOFF; + ShowWindow(SW_HIDE); + m_DlgLog.ShowWindow(SW_SHOWNORMAL); + m_DlgLog.UpdateWindow(); + m_DlgLog.Block(); + m_DlgLog.SetForegroundWindow(); + m_DlgLog.SetFocus(); + LogOff(); + } + else + { + dwStartUpInfo = STARTUP_NONE; + dwExitInfo = EXIT_NONE; + ShowWindow(SW_HIDE); + m_DlgLog.ShowWindow(SW_SHOWNORMAL); + m_DlgLog.UpdateWindow(); + m_DlgLog.UnBlock(); + m_DlgLog.SetForegroundWindow(); + m_DlgLog.SetFocus(); + LogOff(); + } + + if(IsWindow(m_hWndAddUserDialog)) + { + ::PostMessage(m_hWndAddUserDialog,WM_CLOSE,0,0); + } + m_hWndAddUserDialog = NULL; +} + +void CMainDlg::OnUpdateStatusOffline(CCmdUI* pCmdUI) +{ + UpdateStatus(S_OFFLINE,pCmdUI); +} + +void CMainDlg::OnCaptureChanged(CWnd *pWnd) +{ + CRect rWindow; + GetWindowRect(&rWindow); + if(!IsIconic()) + WriteOptionString(IDS_OFSMESSENGER,IDR_MAINFRAME,RectToString(rWindow)); + + COFSNcDlg2::OnCaptureChanged(pWnd); +} + +LRESULT CMainDlg::OnUpdateExit(WPARAM w, LPARAM l) +{ + m_bAutoUpdateExit = TRUE; + PostMessage(WM_CLOSE); + return 0; +} + +void CMainDlg::Invoke_StartAutoUpdate(LPCTSTR strUpdateFileUrl) +{ + //MCTRACE(9,"Invoke_StartAutoUpdate %s",strUpdateFileUrl); + // Format "McUpdateUrl#BuildId#MCIUrl" [12/22/2001] + CString strFullUrl = strUpdateFileUrl, strMCIUrl = _T(""), + strMcUpdateURL = _T(""), strBuild = _T(""), + strDirPath = _T("") ; + + int DelimeterPos = strFullUrl.Find(_T('#'),0); + + if(DelimeterPos!=-1) + { + strMcUpdateURL = strFullUrl.Left(DelimeterPos); + strBuild = strFullUrl.Mid(DelimeterPos+1); + + DelimeterPos = strBuild.Find(_T('#'),0); + + if(DelimeterPos!=-1) + { + strMCIUrl = strBuild.Mid(DelimeterPos+1); + strBuild = strBuild.Left(DelimeterPos); + } + else + { + //MCTRACE(9,"Invoke_StartAutoUpdate Faile #2 (DelimeterPos!=-1)"); + ASSERT(FALSE); + return; + } + } + else + { + //MCTRACE(9,"Invoke_StartAutoUpdate Faile #1 (DelimeterPos!=-1)"); + ASSERT(FALSE); + return; + } + + // Modified by Oleg Zhuk [6/4/2004] + // Just Navigate to /public/update.aspx?ProductGuid= [6/4/2004] + + // Load Product GUID [3/26/2004] + CString strUpdateUrl; + + CString ProductGUID; +#ifndef RADIUS + McRegGetString(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Mediachase\\Instant Business Network\\4.5\\Client"),_T("ProductGUID"),ProductGUID,_T("")); +#else + McRegGetString(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Radius-Soft\\MagRul\\4.5\\Client"),_T("ProductGUID"),ProductGUID,_T("")); +#endif + + // ToDo: Remember Uncoment [3/2/2002] + strUpdateUrl.Format(_T("%s/public/update.aspx?ProductGUID=%s"),GetWebHOST(),ProductGUID); + + if(m_InWindow.NavigateNewWindow(strUpdateUrl)!=S_OK) + ShellExecute(NULL,_T("open"),strUpdateUrl,NULL,NULL,SW_SHOWNORMAL); +} + +LRESULT CMainDlg::OnMcUpdateLoaded(WPARAM w, LPARAM l) +{ +/*if(w) +{ +if(AfxMessageBox(_T("McUpdate component download Error. Try Again?",MB_YESNO))==IDYES) +{ +m_McUpdateDownload.Clear(); +m_McUpdateDownload.Load(NULL); +} +} +else +{ +m_McUpdateDownload.Save(m_strMcUpdatePath); +m_McUpdateDownload.Clear(); +ShellExecute(::GetDesktopWindow(),_T("open"),m_strMcUpdatePath,m_strMcUpdateParam,NULL,SW_SHOWDEFAULT); +}*/ + + return 0; +} + +LRESULT CMainDlg::OnInvokeStartAutoUploader(WPARAM w, LPARAM l) +{ + _bstr_t Url;Url.Assign((BSTR)w); + Invoke_StartAutoUpdate((LPCTSTR)Url); + return 0; +} + +LRESULT CMainDlg::OnUpdateContactList(WPARAM w, LPARAM l) +{ + //TRACE(_T("\r\n CMainDlg::OnUpdateContactList (%d)",dwStartUpInfo); + if(dwStartUpInfo!=STARTUP_ALL) + { + dwStartUpInfo|=STARTUP_CONTACTLIST_LOAD; + TRACE(_T("\r\n CMainDlg::OnUpdateContactList (%d)"), dwStartUpInfo); + CheckAllStartUpWasLoad(); + } + return 0; +} + +void CMainDlg::OnTimer(UINT nIDEvent) +{ + if(nIDEvent==IDT_AUTOCHANGETIMER) + { + if(ConnectEnable(FALSE)) + { + // Check User Activety [3/18/2004] + + // Check Cursor + CPoint tmpPoint; + GetCursorPos(&tmpPoint); + + if(m_oldCursorPos==tmpPoint) + { + if(GetUserStatus()!=S_INVISIBLE&&GetUserStatus()!=S_NA) + { + m_AutoChangeStatusTimeLast++; + + if(GetOptionInt(IDS_OFSMESSENGER, IDS_SETAWAY_ENABLE, TRUE)) + { + if(m_AutoStatus.IsReset()) + { + if(m_AutoChangeStatusTimeLast >= (GetOptionInt(IDS_OFSMESSENGER,IDS_SETAWAY,5)*6)) + { + m_AutoChangeStatusTimeLast = 0; + + m_AutoStatus.SetAway(GetUserStatus()); + + PostMessage(WM_CHANGE_STATUS,S_AWAY); + } + } + else if(GetOptionInt(IDS_OFSMESSENGER, IDS_SETNA_ENABLE, FALSE) && !m_AutoStatus.IsAutoNA()) + { + if(m_AutoChangeStatusTimeLast >= (GetOptionInt(IDS_OFSMESSENGER,IDS_SETNA,10)*6)) + { + m_AutoChangeStatusTimeLast = 0; + + m_AutoStatus.SetNA(GetUserStatus()); + + PostMessage(WM_CHANGE_STATUS,S_NA); + } + } + } + } + } + else + { + m_oldCursorPos=tmpPoint; + + if(!m_AutoStatus.IsReset()) + PostMessage(WM_CHANGE_STATUS,m_AutoStatus.OldUserStatus); + + ResetAutoChangeStatusTime(); + } + + } + else if(dwStartUpInfo==STARTUP_ALL) + { + // Try Auto Reconnect [3/18/2004] + TRACE1("\r\nReconnect Last User Status = %d",m_LastUserStatus); + + static long TimeRepeatCount = 0; + TimeRepeatCount++; + if(TimeRepeatCount>=6) + { + TimeRepeatCount=0; + if(!m_AutoStatus.IsReset()) + PostMessage(WM_CHANGE_STATUS,m_AutoStatus.State); + else + PostMessage(WM_CHANGE_STATUS,m_LastUserStatus); + } + } + /* + if(ConnectEnable(FALSE)) + { + CPoint tmpPoint; + GetCursorPos(&tmpPoint); + + if(m_oldCursorPos==tmpPoint&&GetUserStatus()!=S_INVISIBLE) + { + if(GetOptionInt(IDS_OFSMESSENGER,IDS_SETAWAY_ENABLE,TRUE)) + { + if(GetUserStatus()!=S_AWAY&&GetUserStatus()!=S_NA) + { + m_AutoChangeStatusTimeLast++; + if(m_AutoChangeStatusTimeLast>=(GetOptionInt(IDS_OFSMESSENGER,IDS_SETAWAY,5)*6)) + { + if(m_OldStatus==-1) + m_OldStatus = GetUserStatus(); + + PostMessage(WM_CHANGE_STATUS,S_AWAY); + m_AutoChangeStatusTimeLast = 0; + + } + } + else if((GetUserStatus()==S_AWAY)&& + GetOptionInt(IDS_OFSMESSENGER,IDS_SETNA_ENABLE,FALSE)&&GetUserStatus()!=S_NA) + { + m_AutoChangeStatusTimeLast++; + if(m_AutoChangeStatusTimeLast>=(GetOptionInt(IDS_OFSMESSENGER,IDS_SETNA,10)*6)) + { + if(m_OldStatus==-1) + m_OldStatus = GetUserStatus(); + + PostMessage(WM_CHANGE_STATUS,S_NA); + m_AutoChangeStatusTimeLast = 0; + } + } + } + } + else + { + m_oldCursorPos=tmpPoint; + + if(m_OldStatus!=-1) + { + m_LastUserStatus = m_OldStatus; + PostMessage(WM_CHANGE_STATUS,m_OldStatus); + m_OldStatus = -1; + } + + ResetAutoChangeStatusTime(); + } + } + else if(dwStartUpInfo==STARTUP_ALL) + { + + TRACE1("\r\nReconnect Last User Status = %d",m_LastUserStatus); + static long TimeRepeatCount = 0; + TimeRepeatCount++; + if(TimeRepeatCount>=6) + { + TimeRepeatCount=0; + PostMessage(WM_CHANGE_STATUS,m_LastUserStatus); + } + } + */ + } + else if(nIDEvent==IDT_LOADNOTSENDMESSAGES) + { + TRACE0("\r\n CMainDlg::OnTimer nIDEvent==IDT_LOADNOTSENDMESSAGES"); + if(ConnectEnable(FALSE)) + LoadNotSendedMessage(); + + // OZ 2009-03-04 AutoUpdateCheck + CheckAutoUpdate(); + + } + else if(nIDEvent==IDT_MCSCREENCAPTUREEX) + { + //if(m_MainDlgLock.Lock(100)) + { + int Size = m_ActiveExCaptureList.GetSize(); + for(int i=Size-1;i>=0;i--) + { + try + { + LPMcScreenCaptureItem pItem = m_ActiveExCaptureList[i]; + + long lStatus = 0; + pItem->Ptr->GetCompletionStatus(&lStatus); + if(lStatus==-1) + { + //IMcScreenCaptureItem* Item = m_ActiveExCaptureList[i]; + m_ActiveExCaptureList.RemoveAt(i); + delete pItem; + //Item->Release(); + } + else if(lStatus==6) + { + USES_CONVERSION; + + CComBSTR FileName; + CComBSTR TreeXML; + // Process Action [7/15/2004] + long lBtnState = -1; + pItem->Ptr->GetButtonsState(&lBtnState); + pItem->Ptr->GetFileName(&FileName); + pItem->Ptr->GetXML(&TreeXML); + + CString strTmpFileName = W2CT(FileName); + + CString strAllIBNUserList = GetSelectedUserStringFromXML(TreeXML); + + //CUserCollection ContactList; + //CreateScreenShotUsers(pItem->UserId,pItem->GroupName,ContactList); + + switch(lBtnState) + { + case 1: //IDS_CAPTURE_ACTION_SENDTO + { + if(ConnectEnable()) + { + CString strRecepientShowList; + + CString strUserId = _T(",")+strAllIBNUserList; + strUserId += ","; + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser = NULL; + while(m_ContactList.GetNext(pos,pUser)) + { + CString strCurrUserId; + strCurrUserId.Format(_T(",%d,"),pUser->GetGlobalID()); + + if(strUserId.Find(strCurrUserId)==0) + { + /*TCHAR Buff[MAX_PATH]; + _ltoa(pUser->GetGlobalID(),Buff,10); + strUserId += Buff; + strUserId += ",";*/ + + strRecepientShowList += pUser->GetShowName(); + strRecepientShowList += ","; + } + } + + if(!strUserId.IsEmpty()) + { + //CString strTmpFileName = SaveImageToTmpFolder(); + AddToUpload(strTmpFileName,strRecepientShowList,strUserId,GetString(IDS_SCREEN_CAPTURE_NAME)); + } + } + strUserId = strAllIBNUserList; + } + } + break; + case 2: //IDS_CAPTURE_ACTION_CREATEISSUE + { + //CString strTmpFileName = SaveImageToTmpFolder(); + CString strAllIBNUsers = strAllIBNUserList; + + /*if(POSITION pos = ContactList.InitIteration()) + { + CUser *pUser = NULL; + while(ContactList.GetNext(pos,pUser)) + { + if(pUser->m_bHasNewMessages) + { + CString strTmp; + if(strAllIBNUsers.GetLength()>0) + strAllIBNUsers += ","; + strTmp.Format("%d",pUser->GetGlobalID()); + strAllIBNUsers += strTmp; + } + } + }*/ + + CString strParametrs; + + if(strAllIBNUsers.GetLength()>0) + { + strParametrs.Format(_T("/CREATEINCIDENT /L \"%s\" /P \"%s\" /IBNRESOURCES \"%s\" \"%s\""),m_DlgLog.m_LoginStr, m_DlgLog.m_PasswordStr,strAllIBNUsers,strTmpFileName); + } + else + { + strParametrs.Format(_T("/CREATEINCIDENT /L \"%s\" /P \"%s\" \"%s\""),m_DlgLog.m_LoginStr, m_DlgLog.m_PasswordStr,strTmpFileName); + } + + if(m_bIsSSLMode) + strParametrs += _T(" /USESSL"); + + HINSTANCE retVal = ShellExecute(::GetDesktopWindow(),NULL,ToolboxPath(),strParametrs,NULL,SW_SHOWNORMAL); + } + break; + case 3: //IDS_CAPTURE_ACTION_ASSIGNTODO + { + //CString strTmpFileName = SaveImageToTmpFolder(); + CString strAllIBNUsers = strAllIBNUserList; + + /*if(POSITION pos = ContactList.InitIteration()) + { + CUser *pUser = NULL; + while(ContactList.GetNext(pos,pUser)) + { + if(pUser->m_bHasNewMessages) + { + CString strTmp; + if(strAllIBNUsers.GetLength()>0) + strAllIBNUsers += ","; + strTmp.Format("%d",pUser->GetGlobalID()); + strAllIBNUsers += strTmp; + } + } + }*/ + + CString strParametrs; + + if(strAllIBNUsers.GetLength()>0) + { + strParametrs.Format(_T("/CREATETODO /L \"%s\" /P \"%s\" /IBNRESOURCES \"%s\" \"%s\""),m_DlgLog.m_LoginStr, m_DlgLog.m_PasswordStr,strAllIBNUsers,strTmpFileName); + } + else + { + strParametrs.Format(_T("/CREATETODO /L \"%s\" /P \"%s\" \"%s\""),m_DlgLog.m_LoginStr, m_DlgLog.m_PasswordStr,strTmpFileName); + } + + if(m_bIsSSLMode) + strParametrs += _T(" /USESSL"); + + HINSTANCE retVal = ShellExecute(::GetDesktopWindow(),NULL,ToolboxPath(),strParametrs,NULL,SW_SHOWNORMAL); + } + break; + case 4://IDS_CAPTURE_ACTION_PUBLISH + { + //CString strTmpFileName = SaveImageToTmpFolder(); + + CString strParametrs; + + strParametrs.Format(_T("/UPLOAD /L \"%s\" /P \"%s\" \"%s\""),m_DlgLog.m_LoginStr, m_DlgLog.m_PasswordStr,strTmpFileName); + + if(m_bIsSSLMode) + strParametrs += _T(" /USESSL"); + + HINSTANCE retVal = ShellExecute(::GetDesktopWindow(),NULL,ToolboxPath(),strParametrs,NULL,SW_SHOWNORMAL); + } + break; + } + + m_ActiveExCaptureList.RemoveAt(i); + delete pItem; + } + } + catch(_com_error&) + { + m_ActiveExCaptureList.RemoveAt(i); + } + } + //m_MainDlgLock.Unlock(); + } + } + + COFSNcDlg2::OnTimer(nIDEvent); +} + +long CMainDlg::ResetAutoChangeStatusTime() +{ + long lTmp = m_AutoChangeStatusTimeLast; + m_AutoChangeStatusTimeLast = 0; + + m_AutoStatus.Reset(); + + return lTmp; +} + +HRESULT CMainDlg::OnCancelLogin(WPARAM w, LPARAM l) +{ + CancelLogon(); + return 0; +} + +LRESULT CMainDlg::OnLoadAppComleted(WPARAM w, LPARAM l) +{ + if(m_pAppList) + { + // Load to McMessenger App List [2/1/2002] + CComPtr pDocNew = NULL, pDocOldXML = NULL; + + if(SUCCEEDED(w)) + { + CComBSTR bsXML; + m_pAppList->GetXML(&bsXML); + + pDocNew.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + + if(pDocNew!=NULL) + { + VARIANT_BOOL varSuc = VARIANT_FALSE; + // Step 0. Load New XML [3/2/2002] + pDocNew->loadXML(bsXML,&varSuc); + // Step 1. Load Old XML [3/2/2002] + CString strOldXML = GetRegFileText(GetString(IDS_INFO)+_T("\\")+GetUserRole(),_T("")); + + if(strOldXML.IsEmpty()) + { + pDocOldXML = pDocNew; + } + else + { + pDocOldXML.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + + if(SUCCEEDED(pDocOldXML->loadXML(CComBSTR((LPCTSTR)strOldXML),&varSuc))&&varSuc==VARIANT_TRUE) + { + + // Step 2. Combinate Old XML and New XML to New XML [3/2/2002] + CComPtr pSrcOptionsNodeList = NULL; + pDocNew->selectNodes(CComBSTR(L"options/*"),&pSrcOptionsNodeList); + + if(pSrcOptionsNodeList) + { + CComPtr pDestOptionsItem = NULL; + pDocOldXML->selectSingleNode(CComBSTR(L"options"),&pDestOptionsItem); + + if(pDestOptionsItem!=NULL) + { + // Remove Version [3/7/2002] + CComPtr pDestVersionsItem = NULL; + pDestOptionsItem->selectSingleNode(CComBSTR(L"versions"),&pDestVersionsItem); + if(pDestVersionsItem) + pDestOptionsItem->removeChild(pDestVersionsItem,NULL); + + long ListLength = 0; + pSrcOptionsNodeList->get_length(&ListLength); + + for(long i=0;i pSrcItem = NULL; + CComPtr pDestItem = NULL; + pSrcOptionsNodeList->get_item(i,&pSrcItem); + if(pSrcItem) + { + CComPtr pSrcCloneItem = NULL; + pSrcItem->cloneNode(VARIANT_TRUE,&pSrcCloneItem); + + CComBSTR bstSrcNodeName; + pSrcCloneItem->get_nodeName(&bstSrcNodeName); + + pDestOptionsItem->selectSingleNode(bstSrcNodeName,&pDestItem); + + if(pDestItem) + { + CComPtr pDestParentNode = NULL; + pDestItem->get_parentNode(&pDestParentNode); + pDestParentNode->replaceChild(pSrcCloneItem,pDestItem,NULL); + } + else + { + pDestOptionsItem->appendChild(pSrcCloneItem,NULL); + } + } + } + } + } + else + { + pDocOldXML = pDocNew; + } + } + else + { + pDocOldXML = pDocNew; + } + } + // Step 3. Save XML to Reg [3/2/2002] + CComBSTR bstrOldXML; + pDocOldXML->get_xml(&bstrOldXML); + strOldXML = bstrOldXML; + + SetRegFileText(GetString(IDS_INFO)+_T("\\")+GetUserRole(),_T(""),strOldXML); + + LoadAppList(pDocOldXML); + } + } + + delete m_pAppList; + m_pAppList = NULL; + } + + if(dwStartUpInfo!=STARTUP_ALL) + { + dwStartUpInfo |= STARTUP_LOADAPP_LOAD; + + + + TRACE(_T("\r\n CMainDlg::OnLoadAppComleted (%d)"), dwStartUpInfo); + CheckAllStartUpWasLoad(); + } + + return 0; +} + +void CMainDlg::ShowIBNActions() +{ + int m_lDefaultView = 1; //GetOptionInt(IDS_OFSMESSENGER,IDS_VIEWMODE,1); + if(m_lDefaultView==0) + { + for(int itemIndex=0;itemIndex < m_AppArray.GetSize();itemIndex++) + { + McAppItem Item = m_AppArray[itemIndex]; +/* if(Item.Type==APPT_IBN_ACTIONS) + { + m_AppBar.m_AppCtrl.SetCheckButton(itemIndex); + + m_chatbox.ShowWindow(SW_HIDE); + m_treebox.ShowWindow(SW_HIDE); + m_InWindow.ShowWindow(SW_SHOW); + m_InWindow.SetFocus(); + m_InWindow.Navigate(Item.Url); + + break; + }*/ + } + } + +} + +void CMainDlg::LoadOptions() +{ + if(m_pAppList) + { + delete m_pAppList; + m_pAppList = NULL; + } + + // Load Ol [3/2/2002] + + m_pAppList = new CXmlDoc; + + m_pAppList->Init(GetSafeHwnd(),WM_LOADAPP_COMPLETED); + + CString strAppListUrl; + + // Step 1. Get Build [3/2/2002] + CMcVersionInfo verInfo; + long lStubsId = -1, lLogoId = -1; + + CString strOldXML = GetRegFileText(GetString(IDS_INFO)+_T("\\")+GetUserRole(),_T("")); + if(!strOldXML.IsEmpty()) + { + CComPtr pDoc = NULL; + pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + CComBSTR bsXML = strOldXML; + VARIANT_BOOL varLoad = VARIANT_FALSE; + if(SUCCEEDED(pDoc->loadXML(bsXML,&varLoad))&&varLoad==VARIANT_TRUE) + { + CComPtr pStubsNode = NULL; + pDoc->selectSingleNode(CComBSTR(L"options/stubs"),&pStubsNode); + if(pStubsNode) + { + // Step 2. Get Stubs Id [3/2/2002] + CComVariant varData; + GetAttribute(pStubsNode,CComBSTR(L"version"),&varData); + varData.ChangeType(VT_I4); + lStubsId = varData.lVal; + } + // Step 3. Get LogoId Id [3/2/2002] + CComPtr pLogoNode = NULL; + pDoc->selectSingleNode(CComBSTR(L"options/logos"),&pLogoNode); + if(pLogoNode) + { + // Step 2. Get Stubs Id [3/2/2002] + CComVariant varData; + GetAttribute(pLogoNode,CComBSTR(L"version"),&varData); + varData.ChangeType(VT_I4); + lLogoId = varData.lVal; + } + + if(dwStartUpInfo!=STARTUP_ALL) + { + LoadAppList(pDoc,TRUE); + dwStartUpInfo |= STARTUP_LOADAPP_LOAD; + + // Add IBN Actions View [12/15/2003] + //ShowIBNActions(); + + TRACE(_T("\r\n CMainDlg::OnLoadAppComleted (%d)"), dwStartUpInfo); + CheckAllStartUpWasLoad(); + } + } + } + else + LoadAppList(NULL,TRUE); + + // Load Product GUID [3/26/2004] + CString ProductGUID; +#ifndef RADIUS + McRegGetString(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Mediachase\\Instant Business Network\\4.5\\Client"),_T("ProductGUID"),ProductGUID,_T("")); +#else + McRegGetString(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Radius-Soft\\MagRul\\4.5\\Client"),_T("ProductGUID"),ProductGUID,_T("")); +#endif + + // ToDo: Remember Uncoment [3/2/2002] + strAppListUrl.Format(GetString(IDS_WEB_OPTIONS),GetServerPath(),GetSID(),lStubsId,lLogoId,(verInfo.GetProductVersionLS()&0xffff0000)>>16,ProductGUID); + + m_pAppList->Load(strAppListUrl); +} + +int CMainDlg::GetLastUserStatus() +{ + return m_LastUserStatus; +} + +LRESULT CMainDlg::OnShowLoginDlg(WPARAM w, LPARAM l) +{ + OnStatusOffline(); + return 0; +} + + +LRESULT CMainDlg::OnUploadAppFile(WPARAM w, LPARAM l) +{ + LPCTSTR strXML = (LPCTSTR)w; + + UploadAppFile(strXML); + + return 0; +} + +////////////////////////////////////////////////////////////////////////// +// CMessenger Part [4/5/2002] + +//------------------------------------------------------------------------------- +// Name: Login2 +// Desc: Первой версии в данном проекте нет, так что не пугайтесь. +// Отправляет запрос Logon на сервер. Сохраняет Login и Password во внешних +// переменных, настраивает конфигурацию сети для подключения к серверу, +// т.о. изменение настроек возможно только при очередном вызове. +//------------------------------------------------------------------------------- +void CMainDlg::Login2(int SetStatus) +{ + TCHAR str[256]; + GetEnvironmentVariable(_T("MpaUserLogin"), str,255); + m_User.m_strLogin = str; + GetEnvironmentVariable(_T("MpaUserPassword"),str,255); + m_strPassword = str; + m_User.m_iStatus = SetStatus; + + ConfigureNetwork(); + CString strTitle; + strTitle.Format(GetString(IDS_MAIN_TITLE_FORMAT),m_User.GetShowName()); + SetWindowText(strTitle); + + //ClearAll(); + + if(m_User.m_strLogin.IsEmpty() || m_strPassword.IsEmpty()) + { + // if(!PopupLoginAndPassword()) + // return; + } + + try + { + m_lLogonHandle = pSession->LogOn(bstr_t(m_User.m_strLogin),bstr_t(m_strPassword),LONG(m_User.m_iStatus)); + } + catch(...) + { + ASSERT(FALSE); + } +} + +//------------------------------------------------------------------------------- +// Name: ConfigureNetwork +// Desc: Делает настройку интернета перед конектом к серверу, если нет данных +// в реестре то загружает из скина, иначе остаются настройки по умолчанию. +//------------------------------------------------------------------------------- +BOOL CMainDlg::ConfigureNetwork() +{ + try + { + IConfigPtr pConfig = pSession->GetConfig(); + + /************************************************************************/ + /* Load Settings from Local Machine */ + /************************************************************************/ + HKEY hNetConfigKey = NULL; + CString strSubKeyName; + +#ifndef RADIUS + strSubKeyName = _T("SOFTWARE\\Mediachase\\Instant Business Network\\4.5\\Client\\NetOptions"); +#else + strSubKeyName = _T("SOFTWARE\\Radius-Soft\\MagRul\\4.5\\Client\\NetOptions"); +#endif + + if(RegOpenKeyEx(HKEY_CURRENT_USER,strSubKeyName,0,KEY_READ,&hNetConfigKey)==ERROR_SUCCESS) + { + // Enum All Server [6/26/2002] + CSelectServer SelectServerDlg; + + SelectServerDlg.m_ServerNameArr.Add(GetString(IDS_DEFAULT_NAME)); + + DWORD iIndex = 0; + while (true) + { + TCHAR strDirName[MAX_PATH+1]; + if(RegEnumKey(hNetConfigKey,iIndex,strDirName,MAX_PATH+1)!=ERROR_SUCCESS) + break; + + SelectServerDlg.m_ServerNameArr.Add(strDirName); + iIndex++; + } + + if(SelectServerDlg.m_ServerNameArr.GetSize()>1) + { + static CString strLastConnect = GetString(IDS_DEFAULT_NAME); + + if(dwStartUpInfo!=STARTUP_ALL) + { + if(SelectServerDlg.DoModal()==IDOK) + { + strLastConnect = SelectServerDlg.m_strServerName; + } + } + + if(strLastConnect!=GetString(IDS_DEFAULT_NAME)) + { + HKEY hTmpNetConfigKey; + if(RegOpenKeyEx(hNetConfigKey,strLastConnect,0,KEY_READ,&hTmpNetConfigKey)==ERROR_SUCCESS); + { + RegCloseKey(hNetConfigKey); + hNetConfigKey = hTmpNetConfigKey; + } + } + } + + // [6/26/2002] + //BOOL bIsSSLMode = FALSE; + TCHAR strData[MAX_PATH] = _T(""); + DWORD lDataSize = MAX_PATH; + DWORD dwType; + //long V = 0; + + + m_bIsSSLMode = FALSE; + + if(RegQueryValueEx(hNetConfigKey,GetString(IDS_USESSL),0,&dwType,(LPBYTE)strData,&lDataSize)==ERROR_SUCCESS) + { + if(dwType == REG_DWORD && lDataSize==4 && strData[0]!=0) + { + pConfig->put_UseSSL(VARIANT_TRUE); + m_bIsSSLMode = TRUE; + } + else + pConfig->put_UseSSL(VARIANT_FALSE); + + } + else + pConfig->put_UseSSL(VARIANT_FALSE); + + lDataSize = MAX_PATH; + + if(RegQueryValueEx(hNetConfigKey,_T("Server"),0,0,(LPBYTE)strData,&lDataSize)==ERROR_SUCCESS) + { + if(m_bUserDomainMode) + { + m_strServer = GetUserDomain(); + } + else + { + m_strServer = strData; + } + + pConfig->PutServer((LPCTSTR)m_strServer); + + if(m_bIsSSLMode) + m_strServerPath = _T("https://"); + else + m_strServerPath = _T("http://"); + + m_strServerPath += m_strServer; + } + else + { + if(m_bIsSSLMode) + m_strServerPath = _T("https://"); + else + m_strServerPath = _T("http://"); + + m_strServer = GetUserDomain(); + pConfig->PutServer((LPCTSTR)m_strServer); + m_strServerPath += m_strServer; + } + + lDataSize = MAX_PATH; + + if(m_lPort==0) + { + if(RegQueryValueEx(hNetConfigKey,_T("Port"),0,0,(LPBYTE)strData,&lDataSize)==ERROR_SUCCESS) + { + m_lPort = _tstol((LPCTSTR)strData); + if(m_lPort) + { + m_strServerPath += _T(":"); + m_strServerPath += strData; + } + } + else + { + m_strServerPath += _T(":"); + if(m_bIsSSLMode) + { + m_lPort = 443; + m_strServerPath += _T("443"); + } + else + { + m_lPort = 80; + m_strServerPath += _T("80"); + } + } + } + else + { + if(m_bIsSSLMode && m_lPort != 443 || m_lPort != 80) + { + TCHAR strPort[20] = _T(""); + _ltot(m_lPort, strPort,10); + + m_strServerPath += _T(":"); + m_strServerPath += strPort; + } + } + + pConfig->PutPort(m_lPort); + + lDataSize = MAX_PATH; + + if(RegQueryValueEx(hNetConfigKey,_T("Path"),0,0,(LPBYTE)strData,&lDataSize)==ERROR_SUCCESS) + { + pConfig->PutPath(strData); + + m_strPath = strData; + int PathIndex = m_strPath.ReverseFind(_T('/')); + if(PathIndex!=-1) + { + CString strPathTmp = m_strPath.Left(PathIndex); + PathIndex = strPathTmp.ReverseFind(_T('/')); + if(PathIndex!=-1) + { + m_strServerPath += _T('/'); + m_strServerPath += strPathTmp.Left(PathIndex); + } + } + } + else + { + m_strPath = "instmsg/ibn_server.dll"; + pConfig->PutPath((LPCTSTR)m_strPath); + } + + lDataSize = MAX_PATH; + + RegCloseKey(hNetConfigKey); + } + else + { + m_bIsSSLMode = FALSE; + pConfig->put_UseSSL(VARIANT_FALSE); + + m_strServer = GetUserDomain(); + pConfig->PutServer((LPCTSTR)m_strServer); + + m_strServerPath = _T("http://"); + m_strServerPath += m_strServer; + + if(m_lPort==0) + m_lPort = 80; + + pConfig->PutPort(m_lPort); + + if(m_lPort) + { + USES_CONVERSION; + + TCHAR strPort[20] = _T(""); + + _ltot(m_lPort, strPort,10); + + m_strServerPath += _T(":"); + m_strServerPath += strPort; + } + + m_strPath = "instmsg/ibn_server.dll"; + pConfig->PutPath((LPCTSTR)m_strPath); + } + /************************************************************************/ + /* End Load Settings from Local Machine */ + /************************************************************************/ + ////////////////////////////////////////////////////////////////////////// + + CString str,strReg; + long lValue; + strReg.Format(_T("%lu"), (DWORD)GetOptionInt(IDS_NETOPTIONS, IDS_ACCESSTYPE, INTERNET_OPEN_TYPE_PRECONFIG)); + if(!strReg.IsEmpty()) + { + lValue = _tstol((LPCTSTR)strReg); + pConfig->PutProxyType(lValue); + } + else + if(!str.IsEmpty()) + { + lValue = _tstol((LPCTSTR)str); + pConfig->PutProxyType(lValue); + } + + if(lValue==INTERNET_OPEN_TYPE_PROXY) + { + pConfig->PutProxyServerName((LPCTSTR)GetOptionString(IDS_NETOPTIONS, IDS_PROXYNAME, _T(""))); + pConfig->PutProxyServerPort(_tstol((LPCTSTR)GetOptionString(IDS_NETOPTIONS, IDS_PROXYPORT, _T("")))); + } + + if(lValue!=INTERNET_OPEN_TYPE_DIRECT&&GetOptionInt(IDS_NETOPTIONS,IDS_USEFIREWALL,0)) + { + pConfig->PutUseFirewall(VARIANT_TRUE); + pConfig->PutFireWallUserName((LPCTSTR)GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLUSER, _T(""))); + pConfig->PutFireWallPassword((LPCTSTR)GetOptionString(IDS_NETOPTIONS, IDS_FIREWALLPASS, _T(""))); + } + else + pConfig->PutUseFirewall(VARIANT_FALSE); + + } + catch(...) + { + ASSERT(FALSE); + } + + ////////////////////////////////////////////////////////////////////////// + CWebWindow::SetVariable(_T("ServerPath"), GetServerPath()); + ////////////////////////////////////////////////////////////////////////// + + return TRUE; +} + +//------------------------------------------------------------------------------- +// Name: ClearAll +// Desc: Очищает Контакт Лист, поток сообщений и т.д. для нового пользователя. +//------------------------------------------------------------------------------- +void CMainDlg::ClearAll() +{ + USES_CONVERSION; + + m_ContactList.Clear(); + m_ExternalContactList.Clear(); + m_ChatCollection.RemoveAll(); + m_HandleCommandMap.RemoveAll(); + + ////////////////////////////////////////////////////////////////////////// + CString strActiveChatId; + for(int iIndex = 0; iIndexRelease(); + } + catch(_com_error&) + { + ASSERT(FALSE); + } + } + m_SendMessagesMap.RemoveAll(); + ////////////////////////////////////////////////////////////////////////// + + PostMessage(WM_CHANGE_NEWMESSAGE,(WPARAM)m_NewMessageArray.GetSize()); + + //SetUIHandler(FALSE); +} + +//------------------------------------------------------------------------------- +// Name: PopupLoginAndPassword +// Desc: Считывает данные о пользователе и сохранет их в локальных переменных, +// делает проверку на коректность данных. +//------------------------------------------------------------------------------- +BOOL CMainDlg::PopupLoginAndPassword() +{ + const DWORD buffSize = 255; + TCHAR strLogin[buffSize],strPassword[buffSize]; + ::GetEnvironmentVariable(_T("MpaUserLogin"), strLogin,buffSize); + ::GetEnvironmentVariable(_T("MpaUserPassword"), strPassword,buffSize); + + m_User.m_strLogin = strLogin; + m_strPassword = strPassword; + + if(m_User.m_strLogin.IsEmpty() || m_strPassword.IsEmpty()) + { + return FALSE; + } + m_User.m_iStatus = S_ONLINE; + + return TRUE; +} + +//------------------------------------------------------------------------------- +// Name: Show +// Desc: Показывает или прячет окно +//------------------------------------------------------------------------------- +void CMainDlg::Show(BOOL bShow) +{ + if(bShow) + { + ShowWindow(SW_SHOW); + } + else + { + ShowWindow(SW_HIDE); + } +} + +//------------------------------------------------------------------------------- +// Name: OnNetEvent +// Desc: Обработка сообшщений от сервера, которые перенаправил сюда транслятор. +//------------------------------------------------------------------------------- +LRESULT CMainDlg::OnNetEvent(WPARAM w,LPARAM l) +{ + TRACE(_T("\r\n CMainDlg::OnNetEvent Start ... ")); + + NLT_Container *pItem = (NLT_Container*)w; + if(IsBadReadPtr(pItem,sizeof(NLT_Container))) + return -1; + + ASSERT(pItem!=NULL); + + long State = 0L; + long ErrorType = 0L; + long ErrorCode = 0L; + long nResult = 0L; + long Handle = 0L; + long CommandType = 0L; + + bstr_t bstrMessage = L""; + bstr_t bstrUrl = L""; + + IUser *pUser = NULL; + IMessage *pMessage = NULL; + IPromo *pPromo = NULL; + IFile *pFile = NULL; + IFiles *pFiles = NULL; + IUsers *pUsers = NULL; + IlocalSIDs *pSIDs = NULL; + IMessages *pMessagesList = NULL; + IChats *pChats = NULL; + IChat *pChat = NULL; + IUser *pUser2= NULL; + + CMessage *pMsg = NULL; + + + IUserPtr pMyUser = NULL; + + + long DetailsHandle = 0L; + + HRESULT hr = 0L; + if(IsLockShowInfo()&& + (pItem->EventType==NTL_EMessage|| + pItem->EventType==NTL_EFile|| + pItem->EventType==NTL_EAdd|| + pItem->EventType==NTL_EAddR|| + pItem->EventType==NTL_EChangedStatus|| + pItem->EventType==NLT_EChatInvite)) + { + m_SaveEventArray.Add(pItem); + return 0; + } + + //CString strTest; + + switch(pItem->EventType) + { + case NTL_ENone: + //MCTRACE(9,"[CMainDlg::OnNetEvent] Unknown Type ???"); + break; + case NTL_EChangeState: + //MCTRACE(9,"[CMainDlg::OnNetEvent] EChangeState (State = %d, ErrorType = %d, ErrorCode = %d)",pItem->Long1,pItem->Long2,pItem->Long3); + + State = pItem->Long1; + ErrorType = pItem->Long2; + ErrorCode = pItem->Long3; + + + //strTest.Format("[CMainDlg::OnNetEvent] EChangeState (State = %d, ErrorType = %d, ErrorCode = %d)",pItem->Long1,pItem->Long2,pItem->Long3); + //MessageBox(strTest); + + switch(State) + { + case W_DISCONNECTED: + dwCurrentStatus = W_DISCONNECTED; + m_User.m_iStatus = S_OFFLINE; + DisconnectAllChats(); + BuildContactList(); + BuildChatsList(); + m_lLogonHandle = 0; + break; + case W_CONNECTING: + dwCurrentStatus = W_CONNECTING; + break; + case W_CONNECTED: + if(dwCurrentStatus!=W_CONNECTED) + { + //MCTRACE(9,"[CMainDlg::OnNetEvent] EChangeState (W_CONNECTED && dwCurrentStatus!=W_CONNECTED )"); + pMyUser= pSession->GetSelfInfo(); + CString FullLogin = m_User.m_strLogin; + CUser user(pMyUser); + m_User = user; + m_User.m_strLogin = FullLogin; + CString strTitle; + strTitle.Format(GetString(IDS_MAIN_TITLE_FORMAT),m_User.GetShowName()); + SetWindowText(strTitle); + + // Auto Complete Addon [8/15/2003] + CString strLoginsXML = GetRegFileText(_T("Cookies"),_T("Logins")); + + CComBSTR bsXML = strLoginsXML; + VARIANT_BOOL varLoad = VARIANT_FALSE; + + CComPtr pDoc = NULL; + pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + + pDoc->loadXML(bsXML,&varLoad); + + if(varLoad!=VARIANT_TRUE) + { + bsXML = L""; + pDoc->loadXML(bsXML,&varLoad); + } + + CComPtr loginNode; + + CComBSTR bsLogin = FullLogin; + + CComBSTR bsPath = L"logins[login='"; + bsPath += bsLogin; + bsPath += L"']/login"; + + pDoc->selectSingleNode(bsPath,&loginNode); + + if(loginNode==NULL) + { + pDoc->createNode(CComVariant(NODE_ELEMENT),CComBSTR(L"login"),NULL,&loginNode); + + CComPtr loginsNode, newloginNode; + pDoc->selectSingleNode(CComBSTR(L"logins"),&loginsNode); + + loginNode->put_text(bsLogin); + + loginsNode->appendChild(loginNode,&newloginNode); + + bsXML.Empty(); + + pDoc->get_xml(&bsXML); + + strLoginsXML = bsXML; + SetRegFileText(_T("Cookies"),_T("Logins"),strLoginsXML); + } + + ///////////////////////////////////////////////////// + // Инициализировать Локальную Базу данных .... + ///////////////////////////////////////////////////// + if(!LocalDataBaseEnable()) + { + /************************************************************************/ + /* Load DB Path from Local Machine */ + /************************************************************************/ + CString strData = GetAppDataDir() + _T("\\History"); + + CreateDirectory(strData,NULL); + + ///strData += _T("\\history.dbf"); + // Set DB like UserLogin + .dbf [9/5/2003] + strData += _T("\\"); + strData += m_User.m_strLogin; + strData += _T(".dbf"); + + BOOL bReindex = GetOptionInt(IDS_HISTORY,IDS_REINDEX); + if(bReindex) + WriteOptionInt(IDS_HISTORY,IDS_REINDEX,0); + BOOL bInit = InitLocalDataBase(strData,bReindex); + ////////////////////////////////////////////////////////////////////////// + } + } + dwCurrentStatus = W_CONNECTED; + m_lLogonHandle = 0; + break; + } + + //MCTRACE(9,"[CMainDlg::OnNetEvent] EChangeState (PostMessage(WM_UPDATE_STATUS ... )"); + + SendMessage(WM_UPDATE_STATUS,(WPARAM)dwCurrentStatus,(LPARAM)m_User.m_iStatus); + + if(ErrorType) + ShowError(ErrorType,ErrorCode); + + if(State==W_DISCONNECTED&&m_bUpdateUserStatus) + { + m_bUpdateUserStatus = FALSE; + Login(); + } + + break; + case NTL_EChangedStatus: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NTL_EChangedStatus"); + //TRACE(_T("\r\n function AutoUnMarchaling Start ... "); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + //TRACE(_T("\r\n function AutoUnMarchaling End ... "); + if(SUCCEEDED(hr)) + { + ////////////////////////////////////////////////////////////////////////// + // Play Sound [2/27/2002] + if(long(pUser->GetValue(bstr_t("status")))==S_ONLINE) + { + //TRACE(_T("\r\n function McPlaySound Start ... "); + McPlaySound(IDS_ONLINE_ALERT_KEY); + //TRACE(_T("\r\n function McPlaySound End ... "); + } + ////////////////////////////////////////////////////////////////////////// + + ChangeUserStatus(pUser); + //TRACE(_T("\r\n function ChangeUserStatus End ... "); + pUser->Release(); + //TRACE(_T("\r\n CMainDlg::OnNetEvent EChangedStatus End ... "); + } + break; + case NTL_EMessage: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NTL_EMessage"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pMessage); + if(SUCCEEDED(hr)) + { + TRACE(_T("\r\n CMainDlg::OnNetEvent(NTL_EMessage)")); + + pMsg = new CMessage(pMessage); + + { + + if(LocalDataBaseEnable()&&(pSession!=NULL)) + { + m_MainDlgLock.Lock(2000); + + //try + //{ + m_LocalHistory->AddMessage(pMsg->GetSender().GetGlobalID(),m_User.GetGlobalID(), + pSession->GetSID(), bstr_t(LPCTSTR(pMsg->GetMessageID())),long(pMsg->GetTime()), + 0,bstr_t((BSTR)pMsg->GetMessage()),VARIANT_TRUE); + + m_MainDlgLock.Unlock(); + + RefreshHistoryFor(pMsg->GetSender().GetGlobalID()); + + CUser *puser = m_ContactList.GetAt(pMsg->GetSender().GetGlobalID()); + if(!puser) + puser = m_ExternalContactList.GetAt(pMsg->GetSender().GetGlobalID()); + + if(puser==NULL) + { + m_ExternalContactList.SetAt(pMsg->GetSender()); + /// Запросить дополнительную информацию ... + theNet2.LockTranslator(); + try + { + DetailsHandle = pSession->UserDetails(pMsg->GetSender().GetGlobalID(),1); + if(DetailsHandle) + theNet2.AddToTranslator(DetailsHandle,this->GetSafeHwnd()); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + else + pMsg->GetSender() = (*puser); + + NewMessage(pMsg); + + ////////////////////////////////////////////////////////////////////////// + // Play Sound [2/27/2002] + McPlaySound(IDS_INCOMING_MESSAGE_KEY); + TRACE(_T("\r\n CMainDlg::McPlaySound(IDS_INCOMING_MESSAGE)")); + //Beep(100,100); + ////////////////////////////////////////////////////////////////////////// + //} + //catch(...) + //{ + // ASSERT(FALSE); + //} + } + + pMessage->Release(); + } + } + break; + case NTL_EPromo: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NTL_EPromo"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pPromo); + if(SUCCEEDED(hr)) + { + PostMessage(WM_NEW_PROMOCOME,(WPARAM)(pItem->String1.copy())); + pPromo->Release(); + } + break; + case NTL_EFile: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NTL_EFile"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pFile); + if(SUCCEEDED(hr)) + { + ////////////////////////////////////////////////////////////////////////// + // Play Sound [2/27/2002] + McPlaySound(IDS_INCOMING_FILE_KEY); + ////////////////////////////////////////////////////////////////////////// + + IUserPtr pSender = pFile->GetSender (); + CUser *puser = FindUserInVisualContactListByGlobalId(pSender->GetValue("@id")); + + if(puser!=NULL) + { + //m_FileDownloadStatus.AddToDownload(*puser,pFile); + m_FileManager.AddToDownload(*puser,pFile); + } + else + { + CUser SenderUser(pSender); + ///Запросить информацию о пользователе + m_ExternalContactList.SetAt(SenderUser); + /// Запросить дополнительную информацию ... + theNet2.LockTranslator(); + try + { + DetailsHandle = pSession->UserDetails(SenderUser.GetGlobalID(),1); + if(DetailsHandle) + theNet2.AddToTranslator(DetailsHandle,this->GetSafeHwnd()); + } + catch(_com_error&) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + + //BuildContactListToUser(SenderUser.GetGlobalID()); + // Old COde [3/19/2003] + //BuildContactList(); + + //m_FileDownloadStatus.AddToDownload(SenderUser,pFile); + m_FileManager.AddToDownload(SenderUser,pFile); + } + + //::FlashWindow(m_FileManager.GetSafeHwnd(),TRUE); + + pFile->Release(); + } + break; + + case NTL_EAdd: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NTL_EAdd"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + if(SUCCEEDED(hr)) + { + ////////////////////////////////////////////////////////////////////////// + // Play Sound [2/27/2002] + McPlaySound(IDS_AUTHORIZATION_REQUEST_KEY); + ////////////////////////////////////////////////////////////////////////// + + ///AddUserRequest(pUser,pItem->String1); + CAddUserRequest *pDlg = new CAddUserRequest(this); + pDlg->Create(CAddUserRequest::IDD,GetDesktopWindow()); + + CUser SenderUser(pUser); + pDlg->SetSender(SenderUser,pItem->String1); + pDlg->ShowWindow(SW_SHOWNORMAL); + pDlg->SetForegroundWindow(); + + pUser->Release(); + } + break; + case NTL_EAddR: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NTL_EAddR"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + if(SUCCEEDED(hr)) + { + CUser AutUser(pUser), tmpAutUser; + nResult = pItem->Long1; + if(GetUserByGlobalId(AutUser.GetGlobalID(),tmpAutUser)) + { + CString strText; + if(nResult==2) + { + DeleteFromContact(AutUser.GetGlobalID()); + strText.Format(GetString(IDS_REQUEST_DENIED_FORMAT),AutUser.GetShowName()); + } + else + { + strText.Format(GetString(IDS_REQUEST_ACCEPT_FORMAT),AutUser.GetShowName()); + } + MessageBox(strText,GetString(IDS_IBN_ADD_FRIEND_TITLE),MB_OK|MB_ICONINFORMATION); + } + pUser->Release(); + } + break; + case NTL_EContactList: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NTL_EContactList"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUsers); + if(SUCCEEDED(hr)) + { + LoadUsers(pUsers); + pUsers->Release(); + } + PostMessage(WM_UPDATE_CONTACTLIST); + PostMessage(WM_PROCESS_COMMAND_LINE_MESSAGES); + break; + case NLT_ESelfStatus: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_ESelfStatus"); + m_User.m_iStatus = pItem->Long1; + SendMessage(WM_UPDATE_STATUS,(WPARAM)dwCurrentStatus,(LPARAM)m_User.m_iStatus); + break; + case NLT_EDetails: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EDetails"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + if(SUCCEEDED(hr)) + { + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(pItem->Handel); + try + { + CUser m_AddInfoUser(pUser), *pTmpUser = NULL; + + if((pTmpUser = m_ContactList.GetAt(m_AddInfoUser.GetGlobalID()))==NULL) + pTmpUser = m_ExternalContactList.GetAt(m_AddInfoUser.GetGlobalID()); + + if(pTmpUser) + { + pTmpUser->Update(m_AddInfoUser); + + BuildContactListToUser(pTmpUser->GetGlobalID()); + // OldCode [3/19/2003] + //BuildContactList(); + + RefreshUserInfo(m_AddInfoUser.GetGlobalID()); + } + pUser->Release(); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + } + break; + case NLT_ESessionsList: + break; + case NLT_EMessagesList: + /* + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pMessagesList); + if(SUCCEEDED(hr)) + { + theNet2.LockTranslator(); + try + { + SaveMessagesToDataBase(pItem->Handel,pMessagesList); + theNet2.RemoveFromTranslator(pItem->Handel); + pMessagesList->Release(); + } + catch(...) + { + ASSERT(FALSE); + } + theNet2.UnlockTranslator(); + }*/ + ASSERT(FALSE); + break; + case NLT_ECommandOK: + // Addon for Light Messages [9/5/2002] + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_ECommandOK"); + { + IMessage *pLightMessage = NULL; + if(m_SendMessagesMap.Lookup(pItem->Handel,pLightMessage)) + { + // Message from DB mark and Free Resorse [9/5/2002] + if(LocalDataBaseEnable()) + { + long MessageTime = pItem->Long1; + + try + { + m_LocalHistory->MarkMessagesAsSent(pLightMessage->GetMID(),(LPCTSTR)GetSID(),MessageTime); + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + // Refresh SendMessageDialog [9/5/2002] + + try + { + IUsersPtr pRecipients = pLightMessage->GetRecipients(); + + for(long iUserIndex = 1; iUserIndex<=pRecipients->GetCount();iUserIndex++) + { + IUserPtr pRecipient = pRecipients->GetItem(iUserIndex); + LONG lUserId = pRecipient->GetValue(L"@id"); + + HWND hDlgWnd = NULL; + if(m_SplitMessageDlgMap.Lookup(lUserId,hDlgWnd)&&::IsWindow(hDlgWnd)) + { + /// Да Открыт + CMcWindowAgent Agent(hDlgWnd); + Agent.Refresh(); + } + } + } + catch(_com_error&) + { + ASSERT(FALSE); + } + } + + // Free Resourse [9/5/2002] + m_SendMessagesMap.RemoveKey(pItem->Handel); + + if(pLightMessage) + pLightMessage->Release(); + } + } + // End Addon for Light Messages [9/5/2002] + + // Free Resourse [9/5/2002] + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(pItem->Handel); + theNet2.UnlockTranslator(); + + break; + case NLT_ECommandError: + { + _bstr_t MID; + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_ECommandError"); + { + IMessage *pLightMessage = NULL; + if(m_SendMessagesMap.Lookup(pItem->Handel,pLightMessage)) + { + // Message need delete from DB or skip for futer [9/5/2002] + + // TODO: We are need working with DB Marking. + + // Free Resourse [9/5/2002] + m_SendMessagesMap.RemoveKey(pItem->Handel); + + + if(pLightMessage) + { + MID = pLightMessage->GetMID(); + + pLightMessage->Release(); + } + } + } + // End Addon for Light Messages [9/5/2002] + + // Addon from Chat Change status [8/15/2002] + { + CString strValue; + + if(m_ChatHandleMap.Lookup(pItem->Handel,strValue)) + { + // Error from Chat status Change ... [8/15/2002] + m_ChatHandleMap.RemoveKey(pItem->Handel); + } + } + // End [8/15/2002] + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(pItem->Handel); + theNet2.UnlockTranslator(); + + if(pItem->Long1==etSERVER) + { + switch(pItem->Long2) + { + case ERR_UNABLE_CREATE_CONN: + _SHOW_IBN_ERROR_DLG_OK(IDS_SERVICENOTAVAILABLE); + break; + case ERR_WRONG_XML: + if(LocalDataBaseEnable()) + { + if(MID.length()>0) + { + long MessageTime = pItem->Long1; + + try + { + m_LocalHistory->MarkMessagesAsSent(MID,(LPCTSTR)GetSID(),MessageTime); + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + } + } + break; + } + } + } + break; + case NLT_EOffLineFiles: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EOffLineFiles"); + ASSERT(FALSE); + break; + case NLT_ESysMess: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_ESysMess"); + { + long Code = pItem->Long1; + _bstr_t Description = pItem->String1; + switch(Code) + { + case 2: + // Relogon [3/29/2002] + m_bUpdateUserStatus = TRUE; + SendMessage(WM_SHOW_LOGIN_DLG); + break; + case 3: + //UpdateWebStub + LoadOptions(); + break; + case 4: + // Alert [3/29/2002] + /************************************************************************/ + /* Description content a XML: + + AAA AAA + maybe empty + maybe empty + maybe empty + + */ + /************************************************************************/ + + { + HRESULT hr = S_OK; + + CComPtr pDoc = NULL; + hr = pDoc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + + if(SUCCEEDED(hr)) + { + VARIANT_BOOL varSuccess = VARIANT_FALSE; + pDoc->loadXML(Description,&varSuccess); + + if(varSuccess!=VARIANT_FALSE) + { + CComPtr pNode = NULL; + hr = pDoc->selectSingleNode(CComBSTR(L"alert"),&pNode); + if(pNode) + { + //USES_CONVERSION; + // Step 0. UnPack XML; + CComVariant varStubId; + CComBSTR /*bsApp, bsTitle, bsDescription,*/ bsUrl; + + long Id = 0; + + GetAttribute(pNode,CComBSTR(L"app_id"),&varStubId); + hr = varStubId.ChangeType(VT_I4); + + GetTextByPath(pNode,CComBSTR(L"url"),&bsUrl); + + // Step 1. Load XSLT + CComBSTR bstrtXSLT; + + try + { + LoadSkins m_LoadSkins; + IStreamPtr pStream = NULL; + bstr_t xsltPath = bstr_t(IBN_SCHEMA) +(LPCTSTR)GetCurrentSkin() + bstr_t("/Shell/Alert/alert.xslt"); + long Error = 0L; + m_LoadSkins.Load(xsltPath,&pStream,&Error); + + if(pStream) + { + + const ULONG Read = 1000; + ULONG pRealyRead = 0; + TCHAR pRead[Read+1]; + long i = 0; + do + { + i++; + hr = pStream->Read((LPVOID)pRead,Read,&pRealyRead); + pRead [pRealyRead] = '\0'; + bstrtXSLT += pRead; + } + while(Read==pRealyRead); + + } + } + catch(...) + { + hr = E_FAIL; + ASSERT(FALSE); + } + + + if(hr==S_OK) + { + ////////////////////////////////////////////////////////////////////////// + // Play Sound [2/27/2002] + McPlaySound(IDS_NEW_ALERT_COME_KEY); + ////////////////////////////////////////////////////////////////////////// + + CPopupMessage *pNewPopuWindow = new CPopupMessage(this); + pNewPopuWindow->Create(CPopupMessage::IDD,this); + pNewPopuWindow->InitClickMsg(WM_ALERT_POPUP_MESSAGE_CLK,varStubId.lVal,LPARAM(bsUrl.Copy())); + pNewPopuWindow->Show(Description,bstrtXSLT); + + } + } + } + } + + } + break; + } + } + break; + + // Chat Addon. Load All Chat List [8/6/2002] + case NLT_EChatList: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EChatList"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pChats); + if(SUCCEEDED(hr)) + { + LoadChats(pChats); + pChats->Release(); + } + break; + case NLT_EChatStatus: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EChatStatus"); + AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUsers); + { + // Step 1. Find Chat From Handle [8/8/2002] + CString strValue; + + if(m_ChatHandleMap.Lookup(pItem->Handel,strValue)) + { + CComBSTR bsVal; + bsVal.Attach(strValue.AllocSysString()); + + for(int iChatIndex = 0;iChatIndexGetGlobalID(),dwColor)) + { + SetItemToColorStorage(GetUserRole(),GetUserID(),pUser->GetGlobalID(),pUser->GetShowName(),dwColor); + } + else + { + // Generate New Color [8/28/2002] + //dwColor = RGB(0xFF,0,0); + dwColor = RGB((rand()%32)*8,(rand()%32)*8,(rand()%32)*8); + + SetItemToColorStorage(GetUserRole(),GetUserID(),pUser->GetGlobalID(),pUser->GetShowName(),dwColor); + } + } + + // Step 3. After setting Active status, Load Users to Chat User Collection [8/8/2002] + tmpChat.LoadMessages(GetUserRole(),GetUserID(),pItem->String1); + + } + + // Step 4. Find Open ChatDlg for Chat and refresh it[8/8/2002] + CMcWindowAgent winAgent(tmpChat.GetChatWindow()); + + if(winAgent.IsValid()) + { + winAgent.Refresh(); + } + + // Step N. Check Handle Command [9/7/2002] + long lCommand = 0; + if(m_HandleCommandMap.Lookup(pItem->Handel,lCommand)) + { + switch(lCommand) + { + case HCI_OPEN_CHAT_WINDOW: + { + // Create Chat Window + CurrChatTID = tmpChat.GetTID(); + OnChatSendMessage(); + } + break; + }; + + m_HandleCommandMap.RemoveKey(pItem->Handel); + } + + // Step 5. Refresh Chats List [8/9/2002] + BuildChatsList(); + + break; + } + } + + m_ChatHandleMap.RemoveKey(pItem->Handel); + } + if(pUsers) + pUsers->Release(); + + theNet2.LockTranslator(); + theNet2.RemoveFromTranslator(pItem->Handel); + theNet2.UnlockTranslator(); + } + break; + case NLT_EChatInvite: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EChatInvite"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pChat); + if(hr==S_OK) + { + hr = AutoUnMarchaling2(pItem,(LPUNKNOWN*)&pUser); + if(hr==S_OK) + { + hr = AutoUnMarchaling3(pItem,(LPUNKNOWN*)&pUser2); + if(hr==S_OK) + { + // Find Open ChatDlg for Chat and refresh it[8/8/2002] + InviteNewUserInChat(pChat, pUser, pUser2,pItem->String1); + // Free Resourse [8/9/2002] + pUser2->Release(); + } + pUser->Release(); + } + pChat->Release(); + } + break; + case NLT_EChatLeave: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EChatLeave"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + hr = AutoUnMarchaling2(pItem,(LPUNKNOWN*)&pChat); + if(pUser&&pChat) + { + //Add Information Message + LeaveUserFromChat(pChat, pUser); + } + if(pChat) + pChat->Release(); + if(pUser) + pUser->Release(); + break; + case NLT_EChatUserStatus: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EChatUserStatus"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pUser); + hr = AutoUnMarchaling2(pItem,(LPUNKNOWN*)&pChat); + if(pUser&&pChat) + { + UpdateUserChatStatus(pChat,pUser); + } + if(pChat) + pChat->Release(); + if(pUser) + pUser->Release(); + break; + case NLT_EChatMessage: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EChatMessage"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pChat); + hr = AutoUnMarchaling2(pItem,(LPUNKNOWN*)&pMessage); + if(pChat&&pMessage) + { + NewChatMessage(pChat,pMessage); + } + if(pChat) + pChat->Release(); + if(pMessage) + pMessage->Release(); + break; + case NLT_EChatAccept: + //MCTRACE(9,"[CMainDlg::OnNetEvent] NLT_EChatAccept"); + hr = AutoUnMarchaling(pItem,(LPUNKNOWN*)&pChat); + hr = AutoUnMarchaling2(pItem,(LPUNKNOWN*)&pUser); + if(pUser&&pChat) + { + ChatAccept(pChat,pUser,pItem->Long1); + } + if(pChat) + pChat->Release(); + if(pUser) + pUser->Release(); + break; + default: + //MCTRACE(9,"[CMainDlg::OnNetEvent] UnknownEx (EventType = %d) ???",pItem->EventType); + ASSERT(FALSE); + break; + } + delete pItem; + return 0; +} + +//------------------------------------------------------------------------------- +// Name: BuildContactList +// Desc: Строит контакт лист, + сохраняет и востанавливает Floating +//------------------------------------------------------------------------------- +void CMainDlg::BuildContactList() +{ + // Test #1 + //_com_issue_error(E_FAIL); + + // Test #2 + //int *a = 0; + //*a = 12; + + // Test #3 + //throw 12; + + // Test #4 + //throw new CMainDlg(); + + // Test #5 + //throw new CException(); + + //TRACE(_T("\r\n CMainDlg::BuildContactList Start ..."); + long inUserID = m_User.GetGlobalID(); + int m_numIco; + + CMap m_MapPoint; + ////////////////////////////////////////////// + /// Сделаем проверку нету ли Плавующих и востановим их позициию + try + { + CUser* pUser=NULL; + + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos, pUser); i++) + { + if(m_treebox.FloatingEnable(pUser->TID)) + { + CPoint point; + m_treebox.GetFloatPos(pUser->TID,&(point.x),&(point.y)); + m_MapPoint.SetAt(pUser->GetGlobalID(),point); + } + } + + } + + if(POSITION pos = m_ExternalContactList.InitIteration()) + { + for(int i=0; m_ExternalContactList.GetNext(pos, pUser); i++) + { + if(m_treebox.FloatingEnable(pUser->TID)) + { + CPoint point; + m_treebox.GetFloatPos(pUser->TID,&(point.x),&(point.y)); + m_MapPoint.SetAt(pUser->GetGlobalID(),point); + } + } + } + } + catch(...) + { + } + + ////////////////////////////////////////////////////////////////////////// + CMapStringToPtr GroupIsOpen; + // Сохраним позиции открыта группа или нет [2/25/2002] + + // Load Groups State From Reg [11/14/2002] + CString strUserId; + strUserId.Format(_T("%d"), GetUserID()); + + + CString strClosedGroupsId = theApp.GetProfileString(GetString(IDS_INFO) + _T("\\") + GetUserRole()+_T("\\")+strUserId,GetString(IDS_GROUPS_STATE)); + + if(!strClosedGroupsId.IsEmpty()) + { + int iPos = 0, iEndPos; + + while((iEndPos = strClosedGroupsId.Find(_T(";"),iPos))!=-1) + { + CString strGroupName = strClosedGroupsId.Mid(iPos,iEndPos-iPos); + //TRACE(_T("$$$$$ Extract Group String (%s)",strGroupName); + GroupIsOpen.SetAt(strGroupName,(LPVOID)FALSE); + iPos = iEndPos + 1; + } + } + + // Step 2. Считать текущее и модифицировать [3/14/2002] + POSITION Pos = m_GroupTIDMap.GetStartPosition(); + if(Pos) + { + //TRACE(_T("$$$$$ Open Group String (%s)",strClosedGroupsId); + + while(Pos) + { + CString strName; + long lGroupTID; + m_GroupTIDMap.GetNextAssoc(Pos,strName,(void*&)lGroupTID); + GroupIsOpen.SetAt(strName,(void*)m_treebox.RootIsOpen(lGroupTID)); + + // Group Id Addon [11/14/2002] + CString strGroupID = strName + _T(";"); + strClosedGroupsId.Replace(strGroupID, _T("")); + + if(!m_treebox.RootIsOpen(lGroupTID)) + { + strClosedGroupsId += strGroupID; + } + // Group Id [11/14/2002] + } + + //TRACE(_T("$$$$$ Save Group String (%s)",strClosedGroupsId); + + theApp.WriteProfileString(GetString(IDS_INFO) + _T("\\") + GetUserRole()+_T("\\")+strUserId,GetString(IDS_GROUPS_STATE),strClosedGroupsId); + } + + m_GroupTIDMap.RemoveAll(); + + m_treebox.DeleteTree(); + CurrTID = -1; + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + CUser* pUser=NULL; + + switch(CLMode) + { + case 1: + { + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + if(!m_User.IsOnline()&&!pUser->IsSystemUser()) + pUser->m_iStatus = S_OFFLINE; + + if(UserIsVisible(pUser->GetGlobalID())) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + + pUser->m_nIcon = -1; + m_numIco = pUser->GetIcon2(); + + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + + // Oleg ZHuk: Addon for work with web app [9/11/2003] + if(!pUser->IsSystemUser()) + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0]); + else + { + long ShablonId[10] = {0L,1L,0L,0L,0L,0L,0L,0L,0L,0L}; + GroupTID = m_treebox.AddItem(0,GetString(IDS_SYSTEM_SERVICES_GROUP_NAME),ShablonId); + } + + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + // [9/11/2003] + } + + ////////////////////////////////////////////////////////////////////////// + void *pTmp = NULL; + if(GroupIsOpen.Lookup(pUser->m_strType,pTmp)) + { + m_treebox.RootOpen(GroupTID,(BOOL)pTmp); + } + ////////////////////////////////////////////////////////////////////////// + + // Step 3. добавить пользователя [1/28/2002] + + // Oleg ZHuk: Addon for work with web app [9/11/2003] + if(pUser->IsSystemUser()) + pUser->m_iStatus = S_WEBAPP; + // [9/11/2003] + + pUser->TID = m_treebox.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[IndexEquals[pUser->m_iStatus]+10*pUser->m_bHasNewMessages]); + + } + else + pUser->TID = -1; + } + } + } + break; + case 2: + { + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + if(!m_User.IsOnline()&&!pUser->IsSystemUser()) + pUser->m_iStatus = S_OFFLINE; + + if(UserIsVisible(pUser->GetGlobalID())) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + + pUser->m_nIcon = -1; + m_numIco = pUser->GetIcon2(); + + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + if(!m_GroupTIDMap.Lookup(GetString(IDS_OFFLINE),(void*&)GroupTID)) + { + long ShablonId[10] = {0L,2L,0L,0L,0L,0L,0L,0L,0L,0L}; + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,GetString(IDS_OFFLINE),ShablonId); + + m_GroupTIDMap.SetAt(GetString(IDS_OFFLINE),(void*)GroupTID); + } + //m_treebox.RootOpen(GroupTID,FALSE); + + ////////////////////////////////////////////////////////////////////////// + void *pTmp = NULL; + if(GroupIsOpen.Lookup(GetString(IDS_OFFLINE),pTmp)) + { + m_treebox.RootOpen(GroupTID,(BOOL)pTmp); + } + ////////////////////////////////////////////////////////////////////////// + } + else + { + + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + + // Oleg ZHuk: Addon for work with web app [9/11/2003] + if(!pUser->IsSystemUser()) + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0]); + else + { + long ShablonId[10] = {0L,1L,0L,0L,0L,0L,0L,0L,0L,0L}; + GroupTID = m_treebox.AddItem(0,GetString(IDS_SYSTEM_SERVICES_GROUP_NAME),ShablonId); + } + + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + // [9/11/2003] + } + + ////////////////////////////////////////////////////////////////////////// + void *pTmp = NULL; + if(GroupIsOpen.Lookup(pUser->m_strType,pTmp)) + { + m_treebox.RootOpen(GroupTID,(BOOL)pTmp); + } + ////////////////////////////////////////////////////////////////////////// + } + // Step 3. добавить пользователя [1/28/2002] + + // Oleg ZHuk: Addon for work with web app [9/11/2003] + if(pUser->IsSystemUser()) + pUser->m_iStatus = S_WEBAPP; + // [9/11/2003] + + pUser->TID = m_treebox.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[IndexEquals[pUser->m_iStatus]+10*pUser->m_bHasNewMessages]); + + } + else + pUser->TID = -1; + } + } + + if(POSITION pos = m_ExternalContactList.InitIteration()) + { + for(int i=0; m_ExternalContactList.GetNext(pos,pUser); i++) + { + if(!m_User.IsOnline()&&!pUser->IsSystemUser()) + pUser->m_iStatus = S_OFFLINE; + + if(UserIsVisible(pUser->GetGlobalID())) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + + pUser->m_nIcon = -1; + m_numIco = pUser->GetIcon2(); + + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0]); + + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treebox.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[IndexEquals[S_UNKNOWN]+10*pUser->m_bHasNewMessages]); + + } + else + pUser->TID = -1; + } + } + + } + break; + } + + ////////////////////////////////////////////////////////////////////////// + // Восстановимм структуру Дерева [11/15/2002] + + Pos = m_GroupTIDMap.GetStartPosition(); + while(Pos) + { + CString strName; + long lGroupTID; + void *pTmp; + + m_GroupTIDMap.GetNextAssoc(Pos,strName,(void*&)lGroupTID); + + TRACE(_T("$$$$$ Check Open Group(%s)"), strName); + + if(GroupIsOpen.Lookup(strName,pTmp)) + { + TRACE(_T("$$$$$ Open Group By Command (%s) - %d"), strName,pTmp); + m_treebox.RootOpen(lGroupTID,(BOOL)pTmp); + } + } + + ////////////////////////////////////////////// + /// Восстановим Плавующие Диалоги ... + try + { + + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + CPoint point; + if(pUser->TID!=-1&&m_MapPoint.Lookup(pUser->GetGlobalID(),point)) + { + //SendMessage(WM_SHOWWINDOW,0,0); + m_treebox.CreateFloat2(pUser->TID,point.x,point.y); + } + } + } + + } + catch(...) + { + } + m_MapPoint.RemoveAll(); + ////////////////////////////////////////////// + //TRACE(_T("\r\n CMainDlg::BuildContactList End ..."); +} + +void CMainDlg::BuildContactListToUser(long GlobalID) +{ + //TRACE(_T("\r\n CMainDlg::BuildContactListToUSer Start ..."); + long inUserID = m_User.GetGlobalID(); + int m_numIco; + + ////////////////////////////////////////////////////////////////////////// + BOOL bContactListMode = TRUE; + + CUser* pUser = m_ContactList.GetAt(GlobalID); + if(pUser==NULL) + { + bContactListMode = FALSE; + pUser = m_ExternalContactList.GetAt(GlobalID); + } + ////////////////////////////////////////////////////////////////////////// + + CMap m_MapPoint; + ////////////////////////////////////////////// + /// Сделаем проверку нету ли Плавующих и востановим их позициию + try + { + if(pUser!=NULL) + { + if(m_treebox.FloatingEnable(pUser->TID)) + { + CPoint point; + m_treebox.GetFloatPos(pUser->TID,&(point.x),&(point.y)); + m_MapPoint.SetAt(pUser->GetGlobalID(),point); + } + } + } + catch(...) + { + } + + ////////////////////////////////////////////////////////////////////////// + CMapStringToPtr GroupIsOpen; + // Сохраним позиции открыта группа или нет [2/25/2002] + + // Load Groups State From Reg [11/14/2002] + CString strUserId; + strUserId.Format(_T("%d"), GetUserID()); + + CString strClosedGroupsId = theApp.GetProfileString(GetString(IDS_INFO) + _T("\\") + GetUserRole()+_T("\\")+strUserId,GetString(IDS_GROUPS_STATE)); + + if(!strClosedGroupsId.IsEmpty()) + { + int iPos = 0, iEndPos; + + while((iEndPos = strClosedGroupsId.Find(_T(";"),iPos))!=-1) + { + CString strGroupName = strClosedGroupsId.Mid(iPos,iEndPos-iPos); + //TRACE(_T("$$$$$ Extract Group String (%s)",strGroupName); + GroupIsOpen.SetAt(strGroupName,(LPVOID)FALSE); + iPos = iEndPos + 1; + } + } + + // Step 2. Считать текущее и модифицировать [3/14/2002] + POSITION Pos = m_GroupTIDMap.GetStartPosition(); + if(Pos) + { + //TRACE(_T("$$$$$ Open Group String (%s)",strClosedGroupsId); + + while(Pos) + { + CString strName; + long lGroupTID; + m_GroupTIDMap.GetNextAssoc(Pos,strName,(void*&)lGroupTID); + GroupIsOpen.SetAt(strName,(void*)m_treebox.RootIsOpen(lGroupTID)); + + // Group Id Addon [11/14/2002] + CString strGroupID = strName + _T(";"); + strClosedGroupsId.Replace(strGroupID, _T("")); + + if(!m_treebox.RootIsOpen(lGroupTID)) + { + strClosedGroupsId += strGroupID; + } + // Group Id [11/14/2002] + } + + //TRACE(_T("$$$$$ Save Group String (%s)",strClosedGroupsId); + + theApp.WriteProfileString(GetString(IDS_INFO) + _T("\\") + GetUserRole()+_T("\\")+strUserId,GetString(IDS_GROUPS_STATE),strClosedGroupsId); + } + + if(pUser->TID!=-1) + { + long ParantTID = m_treebox.ParentItem(pUser->TID); + + m_treebox.DeleteItem(pUser->TID); + + if(ParantTID!=-1&&!m_treebox.HasItemChild(ParantTID)) + { + CString Key; + long lValue; + + POSITION pos = m_GroupTIDMap.GetStartPosition(); + + while(pos!=NULL) + { + m_GroupTIDMap.GetNextAssoc(pos,Key,(void*&)lValue); + if(lValue==ParantTID) + { + m_GroupTIDMap.RemoveKey(Key); + break; + } + } + + m_treebox.DeleteItem(ParantTID); + } + } + + if(bContactListMode) + { + if(!m_User.IsOnline()&&!pUser->IsSystemUser()) + pUser->m_iStatus = S_OFFLINE; + + if(UserIsVisible(pUser->GetGlobalID())) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + + pUser->m_nIcon = -1; + m_numIco = pUser->GetIcon2(); + + int CLMode = GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2); + + switch(CLMode) + { + case 1: + { + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0]); + + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + } + + ////////////////////////////////////////////////////////////////////////// + void *pTmp = NULL; + if(GroupIsOpen.Lookup(pUser->m_strType,pTmp)) + { + m_treebox.RootOpen(GroupTID,(BOOL)pTmp); + } + ////////////////////////////////////////////////////////////////////////// + } + break; + case 2: + { + if(pUser->m_iStatus==S_OFFLINE||pUser->m_iStatus==S_INVISIBLE) + { + if(!m_GroupTIDMap.Lookup(GetString(IDS_OFFLINE),(void*&)GroupTID)) + { + long ShablonId[10] = {0L,1L,0L,0L,0L,0L,0L,0L,0L,0L}; + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,GetString(IDS_OFFLINE),ShablonId); + + m_GroupTIDMap.SetAt(GetString(IDS_OFFLINE),(void*)GroupTID); + } + //m_treebox.RootOpen(GroupTID,FALSE); + + ////////////////////////////////////////////////////////////////////////// + void *pTmp = NULL; + if(GroupIsOpen.Lookup(GetString(IDS_OFFLINE),pTmp)) + { + m_treebox.RootOpen(GroupTID,(BOOL)pTmp); + } + ////////////////////////////////////////////////////////////////////////// + } + else + { + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0]); + + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + } + + ////////////////////////////////////////////////////////////////////////// + void *pTmp = NULL; + if(GroupIsOpen.Lookup(pUser->m_strType,pTmp)) + { + m_treebox.RootOpen(GroupTID,(BOOL)pTmp); + } + ////////////////////////////////////////////////////////////////////////// + } + } + break; + } + + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treebox.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[IndexEquals[pUser->m_iStatus]+10*pUser->m_bHasNewMessages]); + + } + else + pUser->TID = -1; + } + else + { + if(!m_User.IsOnline()&&!pUser->IsSystemUser()) + pUser->m_iStatus = S_OFFLINE; + + if(UserIsVisible(pUser->GetGlobalID())) + { + // Step 1. Проверить создавали ли мы группу??? + long GroupTID = 0; + + pUser->m_nIcon = -1; + m_numIco = pUser->GetIcon2(); + + if(!m_GroupTIDMap.Lookup(pUser->m_strType,(void*&)GroupTID)) + { + // Step 2. Если нет, то создать группу . + GroupTID = m_treebox.AddItem(0,pUser->m_strType,m_ShablonId[0]); + + m_GroupTIDMap.SetAt(pUser->m_strType,(void*)GroupTID); + } + // Step 3. добавить пользователя [1/28/2002] + pUser->TID = m_treebox.AddItem(GroupTID,pUser->GetShowName(),m_ShablonId[IndexEquals[S_UNKNOWN]+10*pUser->m_bHasNewMessages]); + + } + else + pUser->TID = -1; + } + + + ////////////////////////////////////////////////////////////////////////// + // Восстановимм структуру Дерева [11/15/2002] + + Pos = m_GroupTIDMap.GetStartPosition(); + while(Pos) + { + CString strName; + long lGroupTID; + void *pTmp; + + m_GroupTIDMap.GetNextAssoc(Pos,strName,(void*&)lGroupTID); + + TRACE(_T("$$$$$ Check Open Group(%s)"), strName); + + if(GroupIsOpen.Lookup(strName,pTmp)) + { + TRACE(_T("$$$$$ Open Group By Command (%s) - %d"), strName,pTmp); + m_treebox.RootOpen(lGroupTID,(BOOL)pTmp); + } + } + + ////////////////////////////////////////////// + /// Восстановим Плавующие Диалоги ... + try + { + + if(POSITION pos = m_ContactList.InitIteration()) + { + for(int i=0; m_ContactList.GetNext(pos,pUser); i++) + { + CPoint point; + if(pUser->TID!=-1&&m_MapPoint.Lookup(pUser->GetGlobalID(),point)) + { + //SendMessage(WM_SHOWWINDOW,0,0); + m_treebox.CreateFloat2(pUser->TID,point.x,point.y); + } + } + } + + } + catch(...) + { + } + m_MapPoint.RemoveAll(); + ////////////////////////////////////////////// + //TRACE(_T("\r\n CMainDlg::BuildContactListToUSer End ..."); +} + + +//------------------------------------------------------------------------------- +// Name: LoadUsers +// Desc: Загружает из Коллекции контак лист. +//------------------------------------------------------------------------------- +void CMainDlg::LoadUsers(IUsers *pUsers) +{ + long iArraySize = 0L; + HRESULT hr = pUsers->get_Count(&iArraySize); + + CUserCollection CopyContactList; + + GetCopyContactList(CopyContactList); + + m_ContactList.Clear(); + m_ExternalContactList.Clear(); + + for(long i=1;i<=iArraySize;i++) + { + IUserPtr pUser = pUsers->GetItem(i); + CUser user(pUser), *tmpUser; + + if(tmpUser = CopyContactList.GetAt(user.GetGlobalID())) + { + user.m_bHasNewMessages = tmpUser->m_bHasNewMessages; + user.TID = tmpUser->TID; + + // Fix lost status problem [12/2/2004] + if(user.m_dwStatusTimem_dwStatusTime) + { + user.m_dwStatusTime = tmpUser->m_dwStatusTime; + user.m_iStatus = tmpUser->m_iStatus; + } + // End Fix + + tmpUser = NULL; + CopyContactList.Delete(user); + } + + m_ContactList.SetAt (user); + } + + if(POSITION pos = CopyContactList.InitIteration()) + { + CUser *pUser = NULL; + HWND hWnd = NULL; + while(CopyContactList.GetNext(pos, pUser)) + { + if(pUser->m_bHasNewMessages|| + m_SendMessageDlgMap.Lookup(pUser->GetGlobalID(),hWnd)|| + m_ComeMessageDlgMap.Lookup(pUser->GetGlobalID(),hWnd)|| + m_SplitMessageDlgMap.Lookup(pUser->GetGlobalID(),hWnd)|| + m_DelUserDlgMap.Lookup(pUser->GetGlobalID(),hWnd)|| + m_AddUserDlgMap.Lookup(pUser->GetGlobalID(),hWnd)) + { + m_ExternalContactList.SetAt(*pUser); + } + } + } + + BuildContactList(); +} + +//------------------------------------------------------------------------------- +// Name: ChangeUserStatus +// Desc: Обрабатывает изменение статуса у внешнего пользователя. +//------------------------------------------------------------------------------- +void CMainDlg::ChangeUserStatus(IUser *&pUser) +{ + /////////////////////////////////////////////////////////////////////// + CUser tmpUser(pUser); + //s = tmpUser; + + CUser *puser = m_ContactList.GetAt(tmpUser.GetGlobalID()); + + if(puser) + { + if(puser->m_dwStatusTime>tmpUser.m_dwStatusTime) + return; + + // Fix: lost status problem [12/2/2004] + puser->m_dwStatusTime = tmpUser.m_dwStatusTime; + } + + if(LocalDataBaseEnable()&&GetOptionInt(IDS_OFSMESSENGER,IDS_SHOWFRIENDSSTATUS,TRUE)) + { + try + { + m_LocalHistory->AddStatus(tmpUser.GetGlobalID(),tmpUser.GetStatus(),tmpUser.m_dwStatusTime); + } + catch(_com_error&) + { + } + + HWND hDlgWnd = NULL; + if(m_SplitMessageDlgMap.Lookup(tmpUser.GetGlobalID(),hDlgWnd)&&::IsWindow(hDlgWnd)) + { + /// Да Открыт + CMcWindowAgent Agent(hDlgWnd); + Agent.Refresh(); + } + } + + if(puser&&/*GetOptionInt(IDS_OFSMESSENGER,IDS_CLMODE,2)==2&&*/ + ( (puser->m_iStatus==S_OFFLINE||puser->m_iStatus==S_INVISIBLE)&& + (tmpUser.m_iStatus!=S_OFFLINE||tmpUser.m_iStatus!=S_INVISIBLE) || + (puser->m_iStatus!=S_OFFLINE||puser->m_iStatus!=S_INVISIBLE)&& + (tmpUser.m_iStatus==S_OFFLINE||tmpUser.m_iStatus==S_INVISIBLE)) ) + { + m_ContactList.SetAt(tmpUser); + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(tmpUser.GetGlobalID()); + + // Old Code [3/19/2003] + //BuildContactList(); + } + else + { + puser = m_ExternalContactList.GetAt(tmpUser.GetGlobalID()); + if(puser) + { + tmpUser.m_bHasNewMessages = puser->m_bHasNewMessages; + m_ExternalContactList.Delete(tmpUser); + } + + m_ContactList.SetAt(tmpUser); + puser = m_ContactList.GetAt(tmpUser.GetGlobalID()); + + if(puser) + UpdateID(tmpUser.GetGlobalID(),puser->m_bHasNewMessages); + } +} + +//------------------------------------------------------------------------------- +// Name: UpdateID +// Desc: Меняет визуальный эффект в ContactList'e в зависимости от ситуации +//------------------------------------------------------------------------------- +void CMainDlg::UpdateID(long UserId,BOOL bHasNewMessage ) +{ + CUser *puser = m_ContactList.GetAt(UserId); + if(puser) + { + puser->m_bHasNewMessages = bHasNewMessage; + if(puser->TID==-1&&UserIsVisible(puser->GetGlobalID())|| + puser->TID!=-1&&!UserIsVisible(puser->GetGlobalID())) + { + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(puser->GetGlobalID()); + + // Old Code [3/19/2003] + //BuildContactList(); + } + + if(puser->TID!=-1) + m_treebox.SetItemId(puser->TID,m_ShablonId[IndexEquals[puser->m_iStatus]+10*puser->m_bHasNewMessages]); + } + else + { + puser = m_ExternalContactList.GetAt(UserId); + if(puser) + { + puser->m_bHasNewMessages = bHasNewMessage; + puser->m_bHasNewMessages = bHasNewMessage; + if(puser->TID==-1&&UserIsVisible(puser->GetGlobalID())|| + puser->TID!=-1&&!UserIsVisible(puser->GetGlobalID())) + { + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(puser->GetGlobalID()); + + // Old code [3/19/2003] + //BuildContactList(); + } + if(puser->TID!=-1) + m_treebox.SetItemId(puser->TID,m_ShablonId[IndexEquals[S_UNKNOWN]+10*puser->m_bHasNewMessages]); + } + } +} + +//------------------------------------------------------------------------------- +// Name: СreateTree +// Desc: Создает Дерево в ContactList'e, загружате настройки. +//------------------------------------------------------------------------------- +void CMainDlg::CreateTree() +{ + LoadSkins m_LoadSkin; + + IStreamPtr pStream = NULL; + long Error=0; + m_LoadSkin.Load(bstr_t(IBN_SCHEMA)+bstr_t((LPCTSTR)GetProductLanguage())+bstr_t("/Shell/Main/status.bmp"),&pStream,&Error); + if(pStream) + { + CDib dib(pStream); + CPaintDC dc(this); + HBITMAP hBmp = dib.GetHBITMAP((HDC)dc); + m_treebox.SetImageList((long)hBmp); + if(hBmp) + DeleteObject(hBmp); + } + + short PriorityIndex[10]; + for(int i=0;i<10;i++) + PriorityIndex[i] = -1; + PriorityIndex[0] = 1; + PriorityIndex[1] = 0; + + m_treebox.SetPriority(PriorityIndex); + + for(int i = 0 ;iLogOff(); + } + catch(_com_error&) + { + ASSERT(FALSE); + } + + ///////////////////////////////////////////////////// + // Закрыть Локальную Базу данных .... + ///////////////////////////////////////////////////// + if(LocalDataBaseEnable()) + { + BOOL bInit = CloseLocalDataBase(); + } + ///////////////////////////////////////////////////// +} + +//------------------------------------------------------------------------------- +// Name: ConnectEnable +// Desc: Проверяет наличие соединения с сервером +//------------------------------------------------------------------------------- +BOOL CMainDlg::ConnectEnable(BOOL bShowMessage) +{ + BOOL bRetValue = (dwCurrentStatus!=W_DISCONNECTED)?TRUE:FALSE; + if(bShowMessage&&!bRetValue) + { + SendMessage(WM_SHOWMESSAGEBOX,(WPARAM)IDS_YOUOFFLINE); + } + //return (dwCurrentStatus==W_CONNECTED)?TRUE:FALSE; + return bRetValue; +} + +//------------------------------------------------------------------------------- +// Name: OnMenuTreectrl +// Desc: Обрабатывает Event от Контакт Листа - Меню +//------------------------------------------------------------------------------- +void CMainDlg::OnMenuTreectrl(long TID, BOOL bGroupe) +{ + //TRACE(_T("\r\n CMainDlg::OnMenuTreectrl"); + CurrTID = TID; + if(TID!= -1) + if(!bGroupe) + { + CUser *pCurrUser = FindUserInVisualContactList(CurrTID); + + if(pCurrUser!=NULL&&pCurrUser->IsSystemUser()) + { + CPoint point; + GetCursorPos(&point); + CMenu menu; + menu.LoadMenu(IDR_MESSENGER_MENU); + CMenu* popup = menu.GetSubMenu(8); + + UpdateMenu(this,popup); + + popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); + } + else + { + CPoint point; + GetCursorPos(&point); + CMenu menu; + menu.LoadMenu(IDR_MESSENGER_MENU); + CMenu* popup = menu.GetSubMenu(0); + + UpdateMenu(this,popup); + + // Load Conference List For Curr User [10/15/2002] + CMenu *pConferenceMenu = popup->GetSubMenu(9); + if(pConferenceMenu) + { + CMenu InviteListMenu; + + InviteListMenu.CreatePopupMenu(); + + LoadConferenceListForCurrUser(&InviteListMenu); + + pConferenceMenu->AppendMenu(MF_POPUP|MF_STRING,(UINT)InviteListMenu.Detach(),GetString(IDS_INVITE_TO_MENU_ITEM)); + } + // end [10/15/2002] + + // Load Message Templates + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),GetUserRole(),GetUserID()); + + CString strMessageTemplateXML = GetRegFileText(strSection,GetString(IDS_MESSAGE_TEMPLATES_REG)); + + if(strMessageTemplateXML.IsEmpty()) + strMessageTemplateXML = GetString(IDS_DEFAULT_MES_TEMPLATE_XML); + + + CComPtr pMTDoc = NULL; + pMTDoc.CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER); + + CMenu *pMessageTemplatesMenu = popup->GetSubMenu(4); + + if(pMTDoc&&pMessageTemplatesMenu!=NULL) + { + CMenu MessageTmplateListMenu; + MessageTmplateListMenu.CreatePopupMenu(); + + + CComBSTR bsXML; + bsXML.Attach(strMessageTemplateXML.AllocSysString()); + + VARIANT_BOOL varLoad = VARIANT_FALSE; + + pMTDoc->loadXML(bsXML,&varLoad); + + if(varLoad==VARIANT_TRUE) + { + CComPtr pTemplatesList = NULL; + + pMTDoc->selectNodes(CComBSTR(L"message_templates/mt"),&pTemplatesList); + + if(pTemplatesList!=NULL) + { + USES_CONVERSION; + + long ListLength = 0; + pTemplatesList->get_length(&ListLength); + + for(int Index=0;Index pStubNode = NULL; + pTemplatesList->get_item(Index,&pStubNode); + + GetTextByPath(pStubNode, CComBSTR(L"name"),&bsName); + + pMessageTemplatesMenu->AppendMenu(MF_STRING,21100+Index,W2CT(bsName)); + } + } + + pMessageTemplatesMenu->DeleteMenu(0,MF_BYPOSITION); + + } + } + // end + + popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); + } + } + else + { + m_strGroupName = m_treebox.GetItemText(TID); + + if(m_strGroupName!=GetString(IDS_SYSTEM_SERVICES_GROUP_NAME)) + { + CPoint point; + GetCursorPos(&point); + CMenu menu; + menu.LoadMenu(IDR_MESSENGER_MENU); + CMenu* popup = menu.GetSubMenu(4); + UpdateMenu(this,popup); + + // Load Conference List For Curr User [10/15/2002] + CMenu *pConferenceMenu = popup->GetSubMenu(9); + if(pConferenceMenu) + { + CMenu InviteListMenu; + + InviteListMenu.CreatePopupMenu(); + + for(int iChatItem = 0;iChatItemAppendMenu(MF_POPUP|MF_STRING,(UINT)InviteListMenu.Detach(),GetString(IDS_INVITE_TO_MENU_ITEM)); + } + // end [10/15/2002] + + // Load Message Templates + CString strSection; + strSection.Format(_T("%s\\%s\\%d"),GetString(IDS_INFO),GetUserRole(),GetUserID()); + + CString strMessageTemplateXML = GetRegFileText(strSection,GetString(IDS_MESSAGE_TEMPLATES_REG)); + + if(strMessageTemplateXML.IsEmpty()) + strMessageTemplateXML = GetString(IDS_DEFAULT_MES_TEMPLATE_XML); + + + CComPtr pMTDoc = NULL; + pMTDoc.CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER); + + CMenu *pMessageTemplatesMenu = popup->GetSubMenu(4); + + if(pMTDoc&&pMessageTemplatesMenu!=NULL) + { + CMenu MessageTmplateListMenu; + MessageTmplateListMenu.CreatePopupMenu(); + + + CComBSTR bsXML; + bsXML.Attach(strMessageTemplateXML.AllocSysString()); + + VARIANT_BOOL varLoad = VARIANT_FALSE; + + pMTDoc->loadXML(bsXML,&varLoad); + + if(varLoad==VARIANT_TRUE) + { + CComPtr pTemplatesList = NULL; + + pMTDoc->selectNodes(CComBSTR(L"message_templates/mt"),&pTemplatesList); + + if(pTemplatesList!=NULL) + { + USES_CONVERSION; + + long ListLength = 0; + pTemplatesList->get_length(&ListLength); + + for(int Index=0;Index pStubNode = NULL; + pTemplatesList->get_item(Index,&pStubNode); + + GetTextByPath(pStubNode, CComBSTR(L"name"),&bsName); + + pMessageTemplatesMenu->AppendMenu(MF_STRING,21300+Index,W2CT(bsName)); + } + } + + pMessageTemplatesMenu->DeleteMenu(0,MF_BYPOSITION); + + } + } + // end + + popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); + } + } +} + +//------------------------------------------------------------------------------- +// Name: OnSelectTreectrl +// Desc: Обрабатывает Event от Контак листа - Изменение Выделенного пользователя +//------------------------------------------------------------------------------- +void CMainDlg::OnSelectTreectrl(long TID, BOOL bGroupe) +{ + //TRACE(_T("\r\n CMainDlg::OnSelectTreectrl"); + CurrTID = TID; + if(TID!= -1) + if(bGroupe) + { + CString strUserId; + strUserId.Format(_T("%d"), GetUserID()); + + + // Save ChatGroup State [11/14/2002] + CString strOpenGroupsId = theApp.GetProfileString(GetString(IDS_INFO) + _T("\\") + GetUserRole()+_T("\\")+strUserId,GetString(IDS_GROUPS_STATE)); + + POSITION Pos = m_GroupTIDMap.GetStartPosition(); + while(Pos) + { + CString strName; + long lGroupTID; + m_GroupTIDMap.GetNextAssoc(Pos,strName,(void*&)lGroupTID); + + CString strGroupID = strName + _T(";"); + strOpenGroupsId.Replace(strGroupID, _T("")); + + if(!m_treebox.RootIsOpen(lGroupTID)) + { + strOpenGroupsId += strGroupID; + } + } + + theApp.WriteProfileString(GetString(IDS_INFO) + _T("\\") + GetUserRole()+_T("\\")+strUserId,GetString(IDS_GROUPS_STATE),strOpenGroupsId); + } + +} + +//------------------------------------------------------------------------------- +// Name: OnActionTreectrl +// Desc: Обрабатывает Event от Контакт Листа Действие +//------------------------------------------------------------------------------- +void CMainDlg::OnActionTreectrl(long TID, BOOL bGroupe) +{ + //TRACE(_T("\r\n CMainDlg::OnActionTreectrl"); + CurrTID = TID; + if(TID!= -1) + if(!bGroupe) + { + CUser *pUser=FindUserInVisualContactList(TID); + if(!pUser->IsSystemUser()||pUser->m_bHasNewMessages) + SendMessageToUser(pUser); + } +} + +//------------------------------------------------------------------------------- +// Name: FindUserInVisualContactList +// Desc: Находит пользователя в контакт листе по TID'у. +//------------------------------------------------------------------------------- +CUser* CMainDlg::FindUserInVisualContactList(long TID) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + if(POSITION pos = m_ExternalContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ExternalContactList.GetNext(pos, pUser)) + { + if(pUser->TID == TID ) + return pUser; + } + } + + return NULL; +} + +CUser* CMainDlg::FindUserInVisualContactListByGlobalId(long UserId) +{ + if(POSITION pos = m_ContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ContactList.GetNext(pos,pUser)) + { + if(pUser->GetGlobalID() == UserId) + return pUser; + } + } + + if(POSITION pos = m_ExternalContactList.InitIteration()) + { + CUser *pUser=NULL; + + while(m_ExternalContactList.GetNext(pos,pUser)) + { + if(pUser->GetGlobalID() == UserId) + return pUser; + } + } + + return NULL; +} + + +//------------------------------------------------------------------------------- +// Name: SendMessageToUser +// Desc: В зависимости от ситуации показывает Диалог отправки сообщения пользователю +// или Пришедшее от пользователя сообщение или Показывает Следующее сообщений +//------------------------------------------------------------------------------- +void CMainDlg::SendMessageToUser(CUser *pUser,BOOL bInAnswer, LPCTSTR strBody, BOOL SendAuto) +{ + //TRACE(_T("\r\n CMainDlg::SendMessageToUser"); + if(pUser == NULL||pUser->m_iStatus == S_OFFLINESEPARATOR ||pUser->m_iStatus == S_ONLINESEPARATOR) + return; + + CMessageSplitDlg3 *pSlit3Dlg = NULL; + + HWND hDlgWnd = NULL; + CMessage *pMsg = NULL; + long Key = pUser->GetGlobalID(); + + int DialogMode = 0;//GetOptionInt(IDS_OFSMESSENGER,IDS_DIALOGMODE,DM_McMessengerSundanceEdition); + + switch(1)//GetOptionInt(IDS_OFSMESSENGER,IDS_MESSSAGEMODE,1)) + { + /// SplitMode + case 1: + /// Удалить все не прочитанные Сессаги для Данного пользователя. + BOOL bDelete = FALSE; + try + { + while((pMsg = FindMessageByIDAndDel(Key))!=NULL) + { + ///// Пометить что мессага прочитана ... + MarkMessagesAsRead(bstr_t(pMsg->GetMessageID())); + delete pMsg;pMsg = NULL; + bDelete = TRUE; + } + + } + catch(...) + { + ASSERT(FALSE); + } + + ////////////////////////////////////////////////////////////////////////// + CString strCaption; + strCaption.Format(GetString(IDS_INSTANT_CHAT_TITLE_FORMAT),pUser->GetShowName()); + + HWND hTestWnd = ::FindWindow(NULL,strCaption); + ////////////////////////////////////////////////////////////////////////// + + if(m_SplitMessageDlgMap.Lookup(Key,hDlgWnd)&&::IsWindow(hDlgWnd)) + { + /// Да Открыт + CMcWindowAgent Agent(hDlgWnd); + Agent.Refresh(); + if(strBody) + Agent.Action(WM_SWM_SETBODY,(WPARAM)strBody,(LPARAM)SendAuto); + Agent.ShowWindow(SW_SHOWNORMAL); + Agent.SetForegroundWindow(); + } + else + { + ////////////////////////////////////////////////////////////////////////// + // ... Test String for EUG [5/8/2002] + //if(hTestWnd!=NULL) + //{ + // int *i; i = 0;*i = 1000; + //} + // ... Test String for EUG [5/8/2002] + ////////////////////////////////////////////////////////////////////////// + + /// Нет нету + //switch(DialogMode) + //{ + //case DM_McMessengerSundanceEdition: + // { + if(LocalDataBaseEnable()&&GetOptionInt(IDS_OFSMESSENGER,IDS_CLEARCHATWINDOW,TRUE)) + { + try + { + m_LocalHistory->ResetStatuses(Key); + //m_LocalHistory->ResetMessages(Key); + } + catch (...) + { + } + } + TRACE(_T("\r\n CMainDlg::SendMessageToUser new CMessageSplitDlg3")); + pSlit3Dlg = new CMessageSplitDlg3(this); + pSlit3Dlg->Create(GetDesktopWindow()); + m_SplitMessageDlgMap.SetAt(Key,pSlit3Dlg->GetSafeHwnd()); + + /////////////////////////////////////////////////////////////////////// + pSlit3Dlg->SetRecipient(*pUser); + pSlit3Dlg->SetSender(m_User); + pSlit3Dlg->Refresh(); + if(strBody) + { + //pSlit3Dlg->SetBody(strBody); + pSlit3Dlg->SendMessage(WM_SWM_SETBODY,(WPARAM)strBody,(LPARAM)SendAuto); + } + + pSlit3Dlg->ShowWindow(SW_SHOWNORMAL); + pSlit3Dlg->SetForegroundWindow(); + + //} + //break; + //} + + + } + + if(bDelete) + UpdateID(pUser->GetGlobalID(),FALSE); + + break; + } + + PostMessage(WM_CHANGE_NEWMESSAGE,(WPARAM)m_NewMessageArray.GetSize()); +} + +//------------------------------------------------------------------------------- +// Name: NewMessage +// Desc: Пришло новое сообщение от пользователя. +//------------------------------------------------------------------------------- +void CMainDlg::NewMessage(CMessage *pMsg) +{ + TRACE(_T("\r\n CMainDlg::NewMessage")); + //CMessageComeDlg2 *pComeDlg = NULL; + //CMessageSplitDlg2 *pSlitDlg = NULL; + HWND hDlgWnd = NULL; + /////////////////////////////////////////////////////////////////////// + // Sound(SND_INCOMING_MESSAGE); + + CUser Sender = pMsg->GetSender(); + long Key = Sender.GetGlobalID(); + + + + //BOOL bFlagOpen = FALSE; + + ///switch(1)//GetOptionInt(IDS_OFSMESSENGER,IDS_MESSSAGEMODE,1)) + //{ + //case 1: + // { + ////////////////////////////////////////////////////////////////////////// + CString strCaption; + strCaption.Format(GetString(IDS_INSTANT_CHAT_TITLE_FORMAT),Sender.GetShowName()); + + HWND hTestWnd = ::FindWindow(NULL,strCaption); + ////////////////////////////////////////////////////////////////////////// + + if(m_SplitMessageDlgMap.Lookup(Key,hDlgWnd)&&::IsWindow(hDlgWnd)) + { + //bFlagOpen = TRUE; + /// Да Открыт -> обновить + + CMcWindowAgent Agent(hDlgWnd); + if(::GetForegroundWindow()!=hDlgWnd) + { + m_NewMessageArray.Add(pMsg); + UpdateID(pMsg->GetSender().GetGlobalID(),TRUE); + //::FlashWindow(hDlgWnd,TRUE); + + FLASHWINFO flashInfo = {0}; + flashInfo.cbSize = sizeof(FLASHWINFO); + flashInfo.hwnd = hDlgWnd; + flashInfo.dwFlags = FLASHW_ALL; + flashInfo.uCount = 5; + flashInfo.dwTimeout = 500; + + ::FlashWindowEx(&flashInfo); + } + else + { + MarkMessagesAsRead(_bstr_t((LPCTSTR)pMsg->GetMessageID())); + delete pMsg; pMsg = NULL; + } + + Agent.Refresh(); + } + else + { + + if((GetUserStatus() != S_DND)&& + (GetUserStatus() != S_AWAY) && + (GetUserStatus() != S_NA) && + GetOptionInt(IDS_OFSMESSENGER, IDS_SHOWNEW, 1) ) + { + if(LocalDataBaseEnable()&&GetOptionInt(IDS_OFSMESSENGER,IDS_CLEARCHATWINDOW,TRUE)) + { + try + { + m_LocalHistory->ResetStatuses(Key); + } + catch (...) + { + } + } + + CMessageSplitDlg3 *pSlit3Dlg = NULL; + + CWnd *pFrgWindow = GetForegroundWindow(); + + // Step 1. Sozdaetsa Split okno [2/21/2002] + pSlit3Dlg = new CMessageSplitDlg3(this,GetDesktopWindow()); + TRACE(_T("\r\n CMainDlg::NewMessage new CMessageSplitDlg3")); + + pSlit3Dlg->Create(GetDesktopWindow(),TRUE); + //pSlit3Dlg->EnableWindow(FALSE); + + m_SplitMessageDlgMap.SetAt(Key,pSlit3Dlg->GetSafeHwnd()); + + pSlit3Dlg->SetRecipient(Sender); + pSlit3Dlg->SetSender(m_User); + ///pSlit3Dlg->Refresh(); + + pSlit3Dlg->ShowWindow(SW_SHOWMINNOACTIVE); + //pSlit3Dlg->ShowWindow(SW_MINIMIZE); + //pSlit3Dlg->ShowWindow(SW_SHOWNA); + TRACE(_T("\r\n CMainDlg::NewMessage ShowWindow(SW_SHOWMINNOACTIVE)")); + //if(pFrgWindow) + //{ + // pFrgWindow->SetForegroundWindow(); + // pFrgWindow->SetWindowPos(&wndTop,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); + //} + //pSlit3Dlg->EnableWindow(TRUE); + //::FlashWindow(pSlit3Dlg->GetSafeHwnd(),TRUE); + + + FLASHWINFO flashInfo = {0}; + flashInfo.cbSize = sizeof(FLASHWINFO); + flashInfo.hwnd = pSlit3Dlg->GetSafeHwnd(); + flashInfo.dwFlags = FLASHW_ALL; + flashInfo.uCount = 5; + flashInfo.dwTimeout = 500; + + ::FlashWindowEx(&flashInfo); + } + + m_NewMessageArray.Add(pMsg); + UpdateID(pMsg->GetSender().GetGlobalID(),TRUE); + } + + PostMessage(WM_CHANGE_NEWMESSAGE,(WPARAM)m_NewMessageArray.GetSize()); + + TRACE(_T("\r\n CMainDlg::NewMessage end")); +} + +//------------------------------------------------------------------------------- +// Name: OnKillSendMessageDlg +// Desc: Очищает Память выделенную под Диалог. +//------------------------------------------------------------------------------- +LRESULT CMainDlg::OnKillSendMessageDlg(WPARAM w, LPARAM l) +{ + long lKey = (long)w; + m_SendMessageDlgMap.RemoveKey(lKey); + if(!UserIsVisible(lKey)) + { + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(lKey); + + // Old code [3/19/2003] + //BuildContactList(); + } + return 0; +} + +LRESULT CMainDlg::OnKillDelUserMessageDlg(WPARAM w, LPARAM l) +{ + long lKey = (long)w; + m_DelUserDlgMap.RemoveKey(lKey); + if(!UserIsVisible(lKey)) + { + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(lKey); + + // Old code [3/19/2003] + //BuildContactList(); + } + return 0; +} + +LRESULT CMainDlg::OnKillAddUserMessageDlg(WPARAM w, LPARAM l) +{ + long lKey = (long)w; + m_AddUserDlgMap.RemoveKey(lKey); + if(!UserIsVisible(lKey)) + { + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(lKey); + + // Old code [3/19/2003] + //BuildContactList(); + } + return 0; +} + + +LRESULT CMainDlg::OnKillComeMessageDlg(WPARAM w, LPARAM l) +{ + long lKey = (long)w; + m_ComeMessageDlgMap.RemoveKey(lKey); + if(!UserIsVisible(lKey)) + { + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(lKey); + + // Old code [3/19/2003] + //BuildContactList(); + } + return 0; +} + +LRESULT CMainDlg::OnKillSplitMesageDlg(WPARAM w, LPARAM l) +{ + long lKey = (long)w; + m_SplitMessageDlgMap.RemoveKey(lKey); + if(LocalDataBaseEnable()&&GetOptionInt(IDS_OFSMESSENGER,IDS_CLEARCHATWINDOW,TRUE)) + { + try + { + m_LocalHistory->ResetMessages(lKey); + } + catch (...) + { + } + } + if(!UserIsVisible(lKey)) + { + // Try fix "flittering of the contact list" [3/19/2003] + BuildContactListToUser(lKey); + + // Old code [3/19/2003] + //BuildContactList(); + } + + return 0; +} + +LRESULT CMainDlg::OnKillInFileDlg(WPARAM w, LPARAM l) +{ + return 0; +} + +//------------------------------------------------------------------------------- +// Name: FindUserById +// Desc: Ищет сообщение от пользователя - ID +//------------------------------------------------------------------------------- +CMessage* CMainDlg::FindMessageByID(long ID) +{ + int Size = m_NewMessageArray.GetSize(); + + for(int i = 0;iGetSender().GetGlobalID()==ID) + return m_NewMessageArray[i]; + } + return NULL; +} + +//------------------------------------------------------------------------------- +// Name: FindUserByIdAndDell +// Desc: Ищет сообщение от пользователя - ID и удаляет его из очереди +//------------------------------------------------------------------------------- +CMessage* CMainDlg::FindMessageByIDAndDel(long Id) +{ + int Size = m_NewMessageArray.GetSize(); + + for(int i = 0;iGetSender().GetGlobalID()==Id) + { + CMessage* pMsg = m_NewMessageArray[i]; + m_NewMessageArray.RemoveAt(i); + return pMsg; + } + } + return NULL; +} + +void CMainDlg::OnUpdateTreemenuSendmessage(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(ConnectEnable(FALSE)); +} + +void CMainDlg::OnTreemenuSendmessage() +{ + CUser *pUser = FindUserInVisualContactList(CurrTID); + if(pUser) + SendMessageToUser(pUser); +} + +void CMainDlg::OnUpdateTreemenuSendfile(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(ConnectEnable(FALSE)); +} + +void CMainDlg::OnTreemenuSendfile() +{ + CUser *pUser = FindUserInVisualContactList(CurrTID); + if(pUser) + SendFileToUser(pUser); +} + +//------------------------------------------------------------------------------- +// Name: SendFileToUser +// Desc: Выбор отпровляемого файла. +//------------------------------------------------------------------------------- +void CMainDlg::SendFileToUser(CUser *pUser) +{ + if(pUser == NULL) return; + + CFileDialog Open(TRUE, NULL, _T("*.*"), NULL, GetString(IDS_OPEN_FILE_NAME), this); + + if(Open.DoModal () == IDOK) + { + CString FileName = Open.GetPathName(); + + CString strDescription; + CFileDescriptioDlg DescrDlg(this); + DescrDlg.m_strFileName = Open.GetFileName(); + if(DescrDlg.DoModalEditMode()==IDOK) + { + strDescription = DescrDlg.GetDescription(); + m_FileManager.AddToUpLoad (FileName,pUser->GetShowName(),pUser->GetGlobalID(),strDescription); + } + } +} + +//------------------------------------------------------------------------------- +// Name: GetUserStatus +// Desc: Запрашивает текущий статус пользхователя. +//------------------------------------------------------------------------------- +int CMainDlg::GetUserStatus() +{ + return m_User.m_iStatus; +} + +//------------------------------------------------------------------------------- +// Name: OnChangeStatus +// Desc: Изменяет текущий статус пользователя. +//------------------------------------------------------------------------------- +HRESULT CMainDlg::OnChangeStatus(WPARAM w, LPARAM l) +{ + int NewStatus = (int)w; + + if(NewStatus != m_User.m_iStatus && ConnectEnable(FALSE)) + { + try + { + pSession->ChangeStatus(LONG(NewStatus)); + //m_User.m_iStatus = NewStatus; + } + catch(...) + { + } + } + else if(!ConnectEnable(FALSE)) + Login2(NewStatus); + + return 0; +} + +//------------------------------------------------------------------------------- +// Name: OnDhtmlEvent +// Desc: Обрабатывает Сообщения из Скрипта из Внешних Функций. +//------------------------------------------------------------------------------- +HRESULT CMainDlg::OnDhtmlEvent(WPARAM w, LPARAM l) +{ + DHTM_Event_Type m_Type = (DHTM_Event_Type)w; + + DHTMLE_ADDCONTACT_Container *m_pAddContact = NULL; + DHTMLE_SENDMESSAGE_Container *m_pSendMessage = NULL; + + if(!ConnectEnable()) + { + /// Write Message ... + switch(m_Type) + { + case DHTMLE_ADDCONTACT: + m_pAddContact = (DHTMLE_ADDCONTACT_Container *)l; + delete m_pAddContact; + m_pAddContact = NULL; + break; + case DHTMLE_SENDMESSAGE: + m_pSendMessage = (DHTMLE_SENDMESSAGE_Container*)l; + delete m_pSendMessage; + m_pSendMessage =NULL; + break; + case DHTMLE_SENDFILE: + m_pSendMessage = (DHTMLE_SENDMESSAGE_Container*)l; + delete m_pSendMessage; + m_pSendMessage =NULL; + break; + default: + ASSERT(FALSE); + } + + return 0; + } + + CUser user; + switch(m_Type) + { + case DHTMLE_ADDCONTACT: + m_pAddContact = (DHTMLE_ADDCONTACT_Container *)l; + ASSERT(m_pAddContact!=NULL); + if(m_pAddContact) + { + if(CheckUserInContactList(m_pAddContact->user_id)==NULL) + { + HWND hDlgWnd = NULL; + if(m_AddUserDlgMap.Lookup(m_pAddContact->user_id,hDlgWnd)&&::IsWindow(hDlgWnd)) + { + CMcWindowAgent Agent(hDlgWnd); + Agent.ShowWindow(SW_SHOWNORMAL); + Agent.SetForegroundWindow(); + } + else + { + CAddUserDlg *pAddDlg =new CAddUserDlg(this); + + pAddDlg->Create(CAddUserDlg::IDD,GetDesktopWindow()); + pAddDlg->AddNewContact(m_pAddContact->user_id,m_pAddContact->nick_name, + m_pAddContact->first_name,m_pAddContact->last_name,m_pAddContact->email, + 0L,_T(""), + m_pAddContact->role_id,m_pAddContact->role_name); + pAddDlg->ShowWindow(SW_SHOWNORMAL); + pAddDlg->SetForegroundWindow(); + m_AddUserDlgMap.SetAt(m_pAddContact->user_id,pAddDlg->GetSafeHwnd()); + } + } + else + { + //CMessageDlg m_IgnoryDlg(IDS_CANTADDUSER); + //m_IgnoryDlg.Show("User is already in your Contact List",MB_OK); + MessageBox(GetString(IDS_USER_ALLREADY_IN_CONTACTLIST_NAME),GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONSTOP); + } + } + delete m_pAddContact; + m_pAddContact = NULL; + break; + case DHTMLE_SENDMESSAGE: + m_pSendMessage = (DHTMLE_SENDMESSAGE_Container*)l; + + if(GetUserByGlobalId(m_pSendMessage->longUserID,user)) + { + SendMessageToUser(&user); + } + + delete m_pSendMessage; + m_pSendMessage =NULL; + break; + case DHTMLE_SENDFILE: + m_pSendMessage = (DHTMLE_SENDMESSAGE_Container*)l; + //user.GlobalID = m_pSendMessage->longUserID; + if(GetUserByGlobalId(m_pSendMessage->longUserID,user)) + { + SendFileToUser(&user); + } + else + { + //CString str; + //str.Format("Can't Find User ( %s [%s] ) in OFS Messenger Contact List",m_pSendMessage->strNickName,m_pSendMessage->strRole); + //AfxMessageBox(str); + } + delete m_pSendMessage; + m_pSendMessage =NULL; + break; + default: + ASSERT(FALSE); + } + return 0; +} + +long CMainDlg::GetUserID() +{ + return m_User.GetGlobalID(); +} + +long CMainDlg::GetRoleID() +{ + return m_User.m_RoleID; +} + +CUser& CMainDlg::GetCurrentUser() +{ + return m_User; +} + +void CMainDlg::OnLButtonDblClk(UINT nFlags, CPoint point) +{ + // For Test Float App [4/3/2002] +#ifdef _DEBUG + //Beep(100,100); + //NLT_Container *pItem = new NLT_Container; + //pItem->EventType = NLT_ESysMess; + //pItem->Long1 = 4; + //pItem->String1 = L"Time TrackerTime Tracker TitleAAA bndsbf djhsdkjh dsfhsdkj dshfksjd. Asfsd asdjask.http://messenger.mediachase.net"; + //Sleep(3000); + //OnNetEvent((WPARAM)pItem ,0); + + // Invoke_StartAutoUpdate(_T("#1.0.17.0#")); +#endif +} + + +CMainDlg* CMainDlg::GetMessageParent() +{ + return this; +} + +CString CMainDlg::GetShowName() +{ + return m_User.GetShowName(); +} + +//void CMainDlg::OnTreemenuAddtoignory() +//{ +// CUser *pUser = FindUserInVisualContactList(CurrTID); +// if(pUser) +// { +// CMessageDlg m_IgnoryDlg(IDS_ADDTOIGNORY); +// +// CString strMessage; +// strMessage.Format("Do you really want %s add to Ignory.",pUser->GetShowName()); +// +// if(m_IgnoryDlg.Show(strMessage,MB_YESNO)==IDYES) +// { +// AfxMessageBox("Not Implemented."); +// /* +// theNet2.LockTranslator(); +// try +// { +// long Handle = pSession->AddUser(pUser->GetGlobalID(),bstr_t("Move to Ignory"),2); +// if(Handle) +// { +// theNet2.AddToTranslator(Handle,this->GetSafeHwnd()); +// } +// } +// catch(...) +// { +// } +// theNet2.UnlockTranslator();*/ +// +// } +// } + +//} + +//void CMainDlg::OnUpdateTreemenuAddtoignory(CCmdUI* pCmdUI) +//{ +// pCmdUI->Enable(ConnectEnable(FALSE)); +// +//} + +void CMainDlg::OnTreemenuDeleteuser() +{ + CUser *pUser = FindUserInVisualContactList(CurrTID); + if(pUser) + { + HWND hDlgWnd = NULL; + if(m_DelUserDlgMap.Lookup(pUser->GetGlobalID(),hDlgWnd)&&::IsWindow(hDlgWnd)) + { + CMcWindowAgent Agent(hDlgWnd); + Agent.ShowWindow(SW_SHOWNORMAL); + Agent.SetForegroundWindow(); + } + else + { + CDelUserDlg *pDelDlg = new CDelUserDlg(this); + pDelDlg->Create(CDelUserDlg::IDD,GetDesktopWindow()); + pDelDlg->SetKillUser(*pUser); + pDelDlg->ShowWindow(SW_SHOWNORMAL); + pDelDlg->SetForegroundWindow(); + m_DelUserDlgMap.SetAt(pUser->GetGlobalID(),pDelDlg->GetSafeHwnd()); + } + } +} + +void CMainDlg::OnUpdateTreemenuDeleteuser(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(ConnectEnable(FALSE)); +} + +void CMainDlg::OnTreemenuFloatingon() +{ + BOOL bFlag = m_treebox.FloatingEnable(CurrTID); + if(bFlag) + m_treebox.DeleteFloat(CurrTID); + else + m_treebox.CreateFloat(CurrTID); +} + +void CMainDlg::OnUpdateTreemenuFloatingon(CCmdUI* pCmdUI) +{ + BOOL bFlag = m_treebox.FloatingEnable(CurrTID); + + pCmdUI->Enable(); + + if(bFlag) + pCmdUI->SetText(GetString(IDS_FLOATING_OFF_NAME)); + else + pCmdUI->SetText(GetString(IDS_FLOATING_ON_NAME)); + +} + +void CMainDlg::OnTreemenuMessageshistory() +{ + //// Show Messages History + CUser *pUser = FindUserInVisualContactList(CurrTID); + if(pUser) + ShowHistoryForUser(*pUser); + +} + +void CMainDlg::OnUpdateTreemenuMessageshistory(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(LocalDataBaseEnable()); + +} + +void CMainDlg::OnTreemenuUserdetails() +{ + /// Запросить дополнительную информацию ... + CUser *pUser = FindUserInVisualContactList(CurrTID); + if(pUser) + { + ShowUserDetails(pUser->GetGlobalID()); + } +} + +void CMainDlg::OnUpdateTreemenuUserdetails(CCmdUI* pCmdUI) +{ + pCmdUI->Enable(ConnectEnable(FALSE)); + ///pCmdUI->Enable(FALSE); +} + +void CMainDlg::DeleteFromContact(long GlobalID) +{ + BOOL bContactListMode = TRUE; + long UserTID = -1; + long UserStatus; + CString UserGroup; + + CUser *pUser = m_ContactList.GetAt(GlobalID); + + if(pUser!=NULL) + { + UserTID = pUser->TID; + UserStatus = pUser->m_iStatus; + UserGroup = pUser->m_strType; + + bContactListMode = TRUE; + + m_ContactList.Delete(*pUser); + } + else + { + pUser = m_ExternalContactList.GetAt(GlobalID); + if(pUser!=NULL) + { + UserTID = pUser->TID; + UserStatus = pUser->m_iStatus; + UserGroup = pUser->m_strType; + + bContactListMode = FALSE; + + m_ExternalContactList.Delete(*pUser); + } + } + + RemoveAllMessageById(m_User.GetGlobalID()); + + if(UserTID!=-1) + { + long ParantTID = m_treebox.ParentItem(UserTID); + + m_treebox.DeleteItem(UserTID); + + if(ParantTID!=-1&&!m_treebox.HasItemChild(ParantTID)) + { + CString Key; + long lValue; + + POSITION pos = m_GroupTIDMap.GetStartPosition(); + + while(pos!=NULL) + { + m_GroupTIDMap.GetNextAssoc(pos,Key,(void*&)lValue); + if(lValue==ParantTID) + { + m_GroupTIDMap.RemoveKey(Key); + break; + } + } + + m_treebox.DeleteItem(ParantTID); + } + } +} + +/* +void CMainDlg::OnSendMessageBtn() +{ +//CMessageSplitDlg m_Dlt(this); +//m_Dlt.DoModal(); +CUser *pUser = FindUserInVisualContactList(CurrTID); +if(pUser) +SendMessageToUser(pUser); +} +*/ + +/* +void CMainDlg::OnSendFileBtn() +{ +CUser *pUser = FindUserInVisualContactList(CurrTID); +if(pUser) +SendFileToUser(pUser); + + } +*/ + +/* +void CMainDlg::OnAddPeopleBtn() +{ +if(::IsWindow(GetSafeHwnd())) +PostMessage(WM_SHOW_ADDUSER); +}*/ + + +//------------------------------------------------------------------------------- +// Name: Refresh +// Desc: Обновляет Внешний вид, сделан во избежание бага с появлением кнопок +// Виндов в некоторых ситуациях. +//------------------------------------------------------------------------------- +void CMainDlg::Refresh() +{ + Invalidate(FALSE); +} + +void CMainDlg::OnLButtonDown(UINT nFlags, CPoint point) +{ + USES_CONVERSION; + + int NowSelect = m_AppBar.m_AppCtrl.GetCheckButton(); + CPoint TstPoint = point; + ClientToScreen(&TstPoint); + m_AppBar.ScreenToClient(&TstPoint); + int SelItem = m_AppBar.m_AppCtrl.OnLButtonDown(nFlags, TstPoint); + if(SelItem!=-1) + { + //m_btnAlerts.SetPressed(FALSE); + + // Activate SelItem Action [2/1/2002] + if(m_AppArray.GetSize()>SelItem) + { + McAppItem Item = m_AppArray[SelItem]; + + if(Item.Type==APPT_CHAT_CONTACTLIST) + { + //m_WebFolderView.ShowWindow(SW_HIDE); + m_treebox.ShowWindow(SW_HIDE); + //m_InWindow.ShowWindow(SW_HIDE); + //m_InWindow.Navigate(_T("IBN_SCHEMA://default/Common/blank.html")); + if(m_ChatCollection.GetSize()==0) + { + m_chatbox.ShowWindow(SW_HIDE); + m_InWindow.ShowWindow(SW_SHOW); + m_InWindow.Navigate(CString(IBN_SCHEMA)+GetProductLanguage()+CString(_T("/Shell/Conference/blank.html"))); + } + else + { + m_chatbox.ShowWindow(SW_SHOW); + m_InWindow.ShowWindow(SW_HIDE); + m_InWindow.Navigate(CString(IBN_SCHEMA)+GetProductLanguage()+CString(_T("/Common/blank.html"))); + } + } + else if(Item.Type==APPT_CONTACTLIST) + { + //m_WebFolderView.ShowWindow(SW_HIDE); + m_chatbox.ShowWindow(SW_HIDE); + m_treebox.ShowWindow(SW_SHOW); + m_InWindow.ShowWindow(SW_HIDE); + m_InWindow.Navigate(CString(IBN_SCHEMA)+GetProductLanguage()+CString(_T("/Common/blank.html"))); + } +/* else if(Item.Type==APPT_IBN_ACTIONS) + { + m_chatbox.ShowWindow(SW_HIDE); + m_treebox.ShowWindow(SW_HIDE); + m_InWindow.ShowWindow(SW_SHOW); + m_InWindow.SetFocus(); + m_InWindow.Navigate(Item.Url); + }*/ + else if(Item.Type==APPT_INWINDOW) + { + //m_WebFolderView.ShowWindow(SW_HIDE); + //m_chatbox.ShowWindow(SW_HIDE); + //m_treebox.ShowWindow(SW_HIDE); + //m_InWindow.ShowWindow(SW_SHOW); + //m_InWindow.SetFocus(); + //m_InWindow.Navigate(Item.Url); + + m_AppBar.m_AppCtrl.SetCheckButton(NowSelect); + + if(m_InWindow.NavigateNewWindow(Item.Url)!=S_OK) + ShellExecute(NULL,_T("open"),Item.Url,NULL,NULL,SW_SHOWNORMAL); + + Invalidate(); + + } + else if(Item.Type==APPT_BROWSEWINDOW) + { + m_AppBar.m_AppCtrl.SetCheckButton(NowSelect); + + if(m_InWindow.NavigateNewWindow(Item.Url)!=S_OK) + ShellExecute(NULL,_T("open"),Item.Url,NULL,NULL,SW_SHOWNORMAL); + + Invalidate(); + } + else if(Item.Type==APPT_EXWINDOW) + { + m_AppBar.m_AppCtrl.SetCheckButton(NowSelect); + CWebWindow *pChild = new CWebWindow(); + pChild->CreateAutoKiller(_T("/Browser/Common/skin.xml"), GetMessageParent(), GetDesktopWindow(), CW_USEDEFAULT, 0, Item.Width, Item.Height, NULL, Item.Url, FALSE, FALSE, TRUE); + m_AllClosedWindow.Add(pChild->GetSafeHwnd()); + Invalidate(); + // m_AppBar.m_AppCtrl.SetCheckButton(NowSelect); + // + // if(m_InWindow.NavigateNewWindow(Item.Url)!=S_OK) + // ShellExecute(NULL,_T("open"),Item.Url,NULL,NULL,SW_SHOWNORMAL); + // + // Invalidate(); + } + /*else if(Item.Type==APPT_WEB_FOLDERS) + { + ///m_WebFolderView.ShowWindow(SW_SHOW); + m_chatbox.ShowWindow(SW_HIDE); + m_treebox.ShowWindow(SW_HIDE); + m_InWindow.ShowWindow(SW_HIDE); + m_InWindow.Navigate(_T("IBN_SCHEMA://default/Common/blank.html")); + + CString strConferencesUrl = _T("#host#/Intranet/#domain#/Documents"); + + strConferencesUrl.Replace("#sid#",GetSID()); + strConferencesUrl.Replace("#host#",GetServerPath()); + strConferencesUrl.Replace("#domain#",GetUserDomain()); + + CString strDescription; + strDescription.Format(_T("IBN Documents on %s"),GetUserDomain()); + + LPITEMIDLIST pPIDL = NULL; + + //if(S_OK == McCoCreateWFPIDL(T2CW(strDescription),T2CW(strConferencesUrl),&pPIDL)) + //{ + //m_WebFolderView.Destroy(); + //m_WebFolderView.Navigate2(pPIDL); + + //CComPtr pMalloc = NULL; + //SHGetMalloc(&pMalloc); + //pMalloc->Free(pPIDL); + //} + }*/ + } + return; + } + else + { + CRect UserStNameRect, StatusStName; + m_UserStatic.GetWindowRect(&UserStNameRect); + ScreenToClient(&UserStNameRect); + m_StatusStatic.GetWindowRect(&StatusStName); + ScreenToClient(&StatusStName); + if(UserStNameRect.PtInRect(point)||StatusStName.PtInRect(point)) + { + return; + } + } + COFSNcDlg2::OnLButtonDown(nFlags, point); +} + +void CMainDlg::OnLButtonUp(UINT nFlags, CPoint point) +{ + CPoint TstPoint = point; + ClientToScreen(&TstPoint); + m_AppBar.ScreenToClient(&TstPoint); + + m_AppBar.m_AppCtrl.OnLButtonUp(nFlags, TstPoint); + + CRect UserStNameRect, StatusStName; + m_UserStatic.GetWindowRect(&UserStNameRect); + ScreenToClient(&UserStNameRect); + m_StatusStatic.GetWindowRect(&StatusStName); + ScreenToClient(&StatusStName); + if(UserStNameRect.PtInRect(point)||StatusStName.PtInRect(point)) + { + CPoint WinPoint = point; + ClientToScreen(&WinPoint); + CMenu menu,*pSubMenu; + menu.LoadMenu(IDR_OFS_MENU); + pSubMenu = menu.GetSubMenu(1); + UpdateMenu(this,pSubMenu); + pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, WinPoint.x, WinPoint.y, this); + } + + COFSNcDlg2::OnLButtonUp(nFlags, point); +} + + +HRESULT CMainDlg::OnCheckSignalState(WPARAM w, LPARAM l) +{ + int NewMessageSize = m_NewMessageArray.GetSize(); + if(NewMessageSize) + { + CUser m_UserMessage = m_NewMessageArray[0]->GetSender(); + SendMessageToUser(m_ContactList.GetAt(m_UserMessage.GetGlobalID())); + return 0; + } + return 1; +} + +//------------------------------------------------------------------------------- +// Name: InitLocalDataBase +// Desc: Инициализирует Локальную Базу данных для Хистори +//------------------------------------------------------------------------------- +BOOL CMainDlg::InitLocalDataBase(LPCTSTR path,BOOL bReindex /*= FALSE*/) +{ + m_LocalHistory.CreateInstance(CLSID_ComHistInt); + + WIN32_FIND_DATA FindData = {0}; + HANDLE hFind = FindFirstFile(path,&FindData); + + if(hFind==INVALID_HANDLE_VALUE) + { + try + { + m_LocalHistory->CreateNew(_bstr_t(path)); + } + catch(_com_error&) + { + } + } + else + FindClose(hFind); + + try + { + // Step 1. Try Connect in the normal mode [6/14/2002] + m_LocalHistory->Connect(_bstr_t(path), bstr_t(m_User.GetShowName()), m_User.GetGlobalID() , bstr_t(""),bReindex?VARIANT_TRUE:VARIANT_FALSE); + bEnableLocalHistory = TRUE; + } + catch(_com_error&) + { + try + { + // Step 2. Try Connect in the reindex mode [6/14/2002] + m_LocalHistory->Connect(_bstr_t(path), bstr_t(m_User.GetShowName()), m_User.GetGlobalID() , bstr_t(""),VARIANT_TRUE); + bEnableLocalHistory = TRUE; + } + catch(_com_error&) + { + CString strMessageText; + + try + { + // Step 2. Try create new DB [6/14/2002] + m_LocalHistory->CreateNew(_bstr_t(path)); + m_LocalHistory->Connect(_bstr_t(path), bstr_t(m_User.GetShowName()), m_User.GetGlobalID() , bstr_t(""),VARIANT_FALSE); + bEnableLocalHistory = TRUE; + + strMessageText.LoadString(IDS_LOCDB_FIXED_PROBLEM); + } + catch(_com_error&) + { + // Data base Crash :( Call to suport [6/14/2002] + strMessageText.LoadString(IDS_LOCDB_GLOABL_ERROR); + + m_LocalHistory = NULL; + bEnableLocalHistory = FALSE; + ASSERT(FALSE); + } + + MessageBox(strMessageText,GetString(IDS_ERROR_TITLE),MB_OK|MB_ICONERROR); + } + } + return bEnableLocalHistory; +} + +BOOL CMainDlg::LocalDataBaseEnable() +{ + return bEnableLocalHistory; +} + +//------------------------------------------------------------------------------- +// Name: CloseLocalDataBase +// Desc: Закрывает Локальную Базу Данных для Хистори. +//------------------------------------------------------------------------------- +BOOL CMainDlg::CloseLocalDataBase() +{ + try + { + m_LocalHistory->Disconnect(); + m_LocalHistory = NULL; + bEnableLocalHistory = FALSE; + } + catch(_com_error&) + { + ASSERT(FALSE); + return FALSE; + } + return TRUE; +} + +//------------------------------------------------------------------------------- +// Name: GetMessages +// Desc: запросит Сообщения по фильтру из Базы данных. pPersist указатель на документ +// в Браузере куда будет выведен результат запроса, так же загружается их скина XSLT. +//------------------------------------------------------------------------------- +BOOL CMainDlg::GetMessages(bstr_t &FriendName, long FriendID, long Sorted, long Type, IUnknown *pPersist) +{ + if(!LocalDataBaseEnable()) return FALSE; + HRESULT hr = S_OK; + try + { + LoadSkins m_LoadSkins; + IStreamPtr pStream = NULL; + bstr_t xsltPath = bstr_t(IBN_SCHEMA) +(LPCTSTR)GetCurrentSkin() + bstr_t("/Browser/xslt/mpa_history.xslt"); + long Error = 0L; + m_LoadSkins.Load(xsltPath,&pStream,&Error); + + if(pStream) + { + bstr_t bstrtXSLT; + + ULONG pRealyRead = 0; + BYTE *pRead = NULL; + + STATSTG statStg = {0}; + if(S_OK==pStream->Stat(&statStg,0)) + { + pRead = new BYTE[statStg.cbSize.LowPart+2]; + + ZeroMemory(pRead,statStg.cbSize.LowPart+2); + + pStream->Read((LPVOID)pRead,statStg.cbSize.LowPart,&pRealyRead); + + if((pRead[0]==0xFF&&pRead[1]==0xFE)|| + (pRead[0]==0xFE&&pRead[1]==0xFF)) + { + // Remove Lead FE FF, FF FE + //if((pRead[0]==0xFF&&pRead[1]==0xFE)|| + // (pRead[0]==0xFE&&pRead[1]==0xFF)) + bstrtXSLT = (LPWSTR)(LPBYTE)(pRead+2); + //else + // bstrtXSLT = (LPWSTR)(LPBYTE)pRead; + } + else + { + if(pRead[0]==0xEF&&pRead[1]==0xBB&&pRead[2]==0xBF) + { + int WideSize = MultiByteToWideChar(CP_UTF8,0,(LPCSTR)(pRead+3),-1,0,0); + + LPWSTR wsBuff = new WCHAR[WideSize]; + MultiByteToWideChar(CP_UTF8,0,(LPCSTR)(pRead+3),-1,wsBuff,WideSize); + + bstrtXSLT = wsBuff; + + delete [] wsBuff; + } + else + { + int WideSize = MultiByteToWideChar(0,0,(LPCSTR)(pRead),-1,0,0); + + LPWSTR wsBuff = new WCHAR[WideSize]; + MultiByteToWideChar(0,0,(LPCSTR)(pRead),-1,wsBuff,WideSize); + + bstrtXSLT = wsBuff; + + delete []wsBuff; + } + } + + + delete [] pRead; + } + + hr = m_LocalHistory->GetMessages(FriendName, FriendID, Sorted, Type, pPersist,bstrtXSLT); + } + } + catch(...) + { + ASSERT(FALSE); + } + return TRUE; +} + +//------------------------------------------------------------------------------- +// Name: GetMessagesBySID +// Desc: Аналогочно см. функцию выше, добавлен фильтр на SID. +//------------------------------------------------------------------------------- +BOOL CMainDlg::GetMessagesBySID( bstr_t &FriendName, long FriendID, long Sorted, long Type, IUnknown *pPersist, LPCTSTR XSLTPath) +{ + if(!LocalDataBaseEnable()) + return FALSE; + + HRESULT hr = S_OK; + try + { + LoadSkins m_LoadSkins; + IStreamPtr pStream = NULL; + bstr_t xsltPath = bstr_t(IBN_SCHEMA) +(LPCTSTR)GetCurrentSkin() + bstr_t(XSLTPath); + long Error = 0L; + hr = m_LoadSkins.Load(xsltPath,&pStream,&Error); + if(FAILED(hr)) + { + CString strMsg; + strMsg.Format("Load skin (%s) problem Hr = %ld, Error=%ld", (LPCTSTR)xsltPath,hr,Error); + + MessageBox(strMsg,"Error",MB_OK|MB_ICONINFORMATION); + } + + if(pStream) + { + bstr_t bstrtXSLT; + + ULONG pRealyRead = 0; + BYTE *pRead = NULL; + + STATSTG statStg = {0}; + if(S_OK==pStream->Stat(&statStg,0)) + { + pRead = new BYTE[statStg.cbSize.LowPart+2]; + + ZeroMemory(pRead,statStg.cbSize.LowPart+2); + + pStream->Read((LPVOID)pRead,statStg.cbSize.LowPart,&pRealyRead); + + if((pRead[0]==0xFF&&pRead[1]==0xFE)|| + (pRead[0]==0xFE&&pRead[1]==0xFF)) + { + // Remove Lead FE FF, FF FE + //if((pRead[0]==0xFF&&pRead[1]==0xFE)|| + // (pRead[0]==0xFE&&pRead[1]==0xFF)) + bstrtXSLT = (LPWSTR)(LPBYTE)(pRead+2); + //else + // bstrtXSLT = (LPWSTR)(LPBYTE)pRead; + } + else + { + if(pRead[0]==0xEF&&pRead[1]==0xBB&&pRead[2]==0xBF) + { + int WideSize = MultiByteToWideChar(CP_UTF8,0,(LPCSTR)(pRead+3),-1,0,0); + + LPWSTR wsBuff = new WCHAR[WideSize]; + MultiByteToWideChar(CP_UTF8,0,(LPCSTR)(pRead+3),-1,wsBuff,WideSize); + + bstrtXSLT = wsBuff; + + delete [] wsBuff; + } + else + { + int WideSize = MultiByteToWideChar(0,0,(LPCSTR)(pRead),-1,0,0); + + LPWSTR wsBuff = new WCHAR[WideSize]; + MultiByteToWideChar(0,0,(LPCSTR)(pRead),-1,wsBuff,WideSize); + + bstrtXSLT = wsBuff; + + delete []wsBuff; + } + } + + delete [] pRead; + } + + hr = m_LocalHistory->GetRecentMessages(FriendName, FriendID, Sorted, Type, pPersist,bstrtXSLT); + if(FAILED(hr)) + { + CString strMsg; + strMsg.Format("GetRecentMessages problem Hr = %ld", hr); + + MessageBox(strMsg,"Error",MB_OK|MB_ICONINFORMATION); + } + } + } + catch(_com_error& e) + { + hr = e.Error(); + + if(FAILED(hr)) + { + CString strMsg; + strMsg.Format("GetRecentMessages _com_error problem Hr = %ld", hr); + + MessageBox(strMsg,"Error",MB_OK|MB_ICONINFORMATION); + } + + } + return TRUE; +} + + +//------------------------------------------------------------------------------- +// Name: AddMessagesToDataBase +// Desc: Добавляет исходящие мессаги в базу данных. +//------------------------------------------------------------------------------- +BOOL CMainDlg::AddMessageToDataBase(long ToId, bstr_t &MID, long Time, bstr_t &Body) +{ + if(!LocalDataBaseEnable()) + return FALSE; + + HRESULT hr = S_OK; + try + { + m_LocalHistory->AddMessage(m_User.GetGlobalID(),ToId,(LPCTSTR)GetSID(), MID,Time, TRUE,Body,VARIANT_TRUE); + RefreshHistoryFor(ToId); + } + catch(_com_error&) + { + //_com_error eTmp = e; + try + { + // Try solve DB Error + // Step 1. Close Local DB + CloseLocalDataBase(); + // Step 2. Try Init new DB + if(!LocalDataBaseEnable()) + { + /************************************************************************/ + /* Load DB Path from Local Machine */ + /************************************************************************/ + CString strData = GetAppDataDir() + _T("\\History"); + + CreateDirectory(strData,NULL); + + //strData += _T("\\history.dbf"); + // Set DB like UserLogin + .dbf [9/5/2003] + strData += _T("\\"); + strData += m_User.m_strLogin; + strData += _T(".dbf"); + + + ////////////////////////////////////////////////////////////////////////// + if(InitLocalDataBase(strData,TRUE)) + { + m_LocalHistory->AddMessage(m_User.GetGlobalID(),ToId,(LPCTSTR)GetSID(), MID,Time, TRUE,Body,VARIANT_TRUE); + RefreshHistoryFor(ToId); + return TRUE; + } + } + } + catch (_com_error&) + { + //eTmp = e; + } + + ASSERT(FALSE); + return FALSE; + } + + return TRUE; + +} + +//------------------------------------------------------------------------------- +// Name: MarkMessagesAsRead +// Desc: Пометить сообщение как прочитанное +//------------------------------------------------------------------------------- +BOOL CMainDlg::MarkMessagesAsRead(bstr_t &MID) +{ + if(!LocalDataBaseEnable()) return FALSE; + HRESULT hr = S_OK; + try + { + hr = m_LocalHistory->MarkMessagesAsRead(MID); + } + catch(...) + { + ASSERT(FALSE); + } + return TRUE; + +} + +//------------------------------------------------------------------------------- +// Name: RefreshHistoryFor +// Desc: Обновить Хистори для пользователя Id +//------------------------------------------------------------------------------- +void CMainDlg::RefreshHistoryFor(long Id) +{ + ///m_HistoryDlg.RefreshIfNowThisUser(Id); +} + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +/* +void CMainDlg::OnLogoBtn() +{ +CMenu m_Menu, *pSubMenu = NULL; +m_Menu.LoadMenu(IDR_MESSENGER_MENU); +pSubMenu = m_Menu.GetSubMenu(2); +CPoint point; +GetCursorPos(&point); +UpdateMenu(this, pSubMenu); + + pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); + } +*/ + +/* +void CMainDlg::OnMessageBtn() +{ +OnSendMessageBtn(); +} +*/ + + +//------------------------------------------------------------------------------- +// Name: OnOptionsSynchronizehistory +// Desc: Расчитывает интервл времени для Синхронизации в зависимоти от настроек. +//------------------------------------------------------------------------------- +void CMainDlg::OnOptionsSynchronizehistory() +{ + ////// Показ Редактора выбора Типа Синхронизации ... + CUser *pUser = FindUserInVisualContactList(CurrTID); + if(pUser) + m_HistoryDlg.ShowHistory(*pUser); + else + m_HistoryDlg.ShowHistory(); +} + +//------------------------------------------------------------------------------- +// Name: +// Desc: +//------------------------------------------------------------------------------- +void CMainDlg::OnUpdateOptionsSynchronizehistory(CCmdUI* pCmdUI) +{ +} + +//------------------------------------------------------------------------------- +// Name: LoadNotReadMessage +// Desc: Загрузить не прочитанные Мессаги из Базы Данных. +//------------------------------------------------------------------------------- +BOOL CMainDlg::LoadNotReadMessage() +{ + if(!LocalDataBaseEnable()) return FALSE; + HRESULT hr = S_OK; + try + { + CComBSTR bstrUnreadMessage; + hr = m_LocalHistory->GetUnReadMessages(&bstrUnreadMessage); + if(bstrUnreadMessage.Length()) + { + /// Add to New Messages ... + CComPtr m_doc = NULL; + hr = m_doc.CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER); + if(SUCCEEDED(hr)) + { + VARIANT_BOOL vBool = VARIANT_FALSE; + m_doc->loadXML(bstrUnreadMessage,&vBool); + + if (vBool == VARIANT_TRUE) + { + //// Распаковка XML ... + /* + + + + +