X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fsubsys%2Fsystem%2Fexplorer%2Futility%2Futility.h;h=51c7cf188a5f3e276d90dbe1918af90b23bfcc6a;hp=9ff860d8180218701ba2d7f24882d5f50a41ed85;hb=8441c8115e89407aeceb49bf269758d7e111a2c2;hpb=7562cce403f2ec5c1dea557b80b2f4ef92379c70 diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index 9ff860d8180..51c7cf188a5 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -18,7 +18,7 @@ // - // Explorer clone, lean version + // Explorer clone // // utility.h // @@ -43,6 +43,7 @@ #ifndef _MSC_VER #include #endif +#include // for VARIANT #include // for alloca() #include @@ -58,6 +59,8 @@ #define _MAX_PATH 260 #endif +#define W_VER_NT 0 // constant for HIWORD(GetVersion())>>14 + #ifdef __cplusplus extern "C" { @@ -69,7 +72,7 @@ extern "C" { #define COUNTOF(x) (sizeof(x)/sizeof(x[0])) -#define BUFFER_LEN 1024 +#define BUFFER_LEN 2048 extern void _log_(LPCTSTR txt); @@ -106,6 +109,16 @@ extern void _log_(LPCTSTR txt); #define A2nU(s, d, l) MultiByteToWideChar(CP_ACP, 0, s, l, d, l) +#ifdef __WINE__ +#ifdef UNICODE +extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext); +#else +extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext); +#endif +#define _tcsnicmp strncasecmp +#define _tcsicoll strcasecmp +#endif + #ifndef FILE_ATTRIBUTE_NOT_CONTENT_INDEXED #define FILE_ATTRIBUTE_ENCRYPTED 0x00000040 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 @@ -135,23 +148,18 @@ extern BOOL time_to_filetime(const time_t* t, FILETIME* ftime); // search for windows of a specific classname extern int find_window_class(LPCTSTR classname); - // launch a program or document file -extern BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow=SW_SHOWNORMAL); -#ifdef UNICODE -extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow=SW_SHOWNORMAL); -#else -#define launch_fileA launch_file -#endif - - // call an DLL export like rundll32 -BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow); - // create a directory with all missing parent directories BOOL RecursiveCreateDirectory(LPCTSTR path_in); // read DWORD value from registry DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def); + // write DWORD value to registry +BOOL RegSetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD value); + + // test for existing directory +BOOL exists_path(LPCTSTR path); + #ifdef __cplusplus } // extern "C" @@ -173,6 +181,7 @@ using namespace std; #include #include #include +#include #include @@ -189,6 +198,21 @@ using namespace _com_util; #endif // _MSC_VER && !_NO_COMUTIL + // launch a program or document file +extern BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow=SW_SHOWNORMAL, LPCTSTR parameters=NULL); +#ifdef UNICODE +extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow=SW_SHOWNORMAL, LPCSTR parameters=NULL); +#else +#define launch_fileA launch_file +#endif + + // call an DLL export like rundll32 +extern BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow); + + // launch control panel applet +extern BOOL launch_cpanel(HWND hwnd, LPCTSTR applet); + + /// initialization of windows common controls struct CommonControlInit { @@ -238,14 +262,16 @@ protected: struct HiddenWindow : public WindowHandle { HiddenWindow(HWND hwnd) - : WindowHandle(hwnd) + : WindowHandle(IsWindowVisible(hwnd)? hwnd: 0) { - SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOREDRAW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); + if (_hwnd) + SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOREDRAW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); } ~HiddenWindow() { - SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); + if (_hwnd) + SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); } }; @@ -291,16 +317,22 @@ protected: struct Thread { Thread() - : _alive(false) + : _alive(false), + _destroy(false) { _hThread = INVALID_HANDLE_VALUE; + _evtFinish = CreateEvent(NULL, TRUE, FALSE, NULL); } virtual ~Thread() { Stop(); + CloseHandle(_evtFinish); CloseHandle(_hThread); + + if (_destroy) + delete this; } void Start() @@ -313,6 +345,8 @@ struct Thread void Stop() { + SetEvent(_evtFinish); + if (_alive) { { Lock lock(_crit_sect); @@ -334,7 +368,9 @@ protected: static DWORD WINAPI ThreadProc(void* para); HANDLE _hThread; + HANDLE _evtFinish; bool _alive; + bool _destroy; }; @@ -395,6 +431,20 @@ inline void ScreenToClient(HWND hwnd, RECT* prect) {::ScreenToClient(hwnd,(LPPOINT)&prect->left); ::ScreenToClient(hwnd,(LPPOINT)&prect->right);} + /// structure containing information about full screen display of the frame window +struct FullScreenParameters +{ + FullScreenParameters() + : _mode(FALSE) + { + } + + BOOL _mode; + RECT _orgPos; + BOOL _wasZoomed; +}; + + // drawing utilities /// PaintCanvas is a encapsulation of device contexts managed by BeginPaint()/EndPaint(). @@ -623,6 +673,76 @@ protected: }; +struct Variant : public VARIANT +{ + Variant() {VariantInit(this);} + Variant(const VARIANT& var); + Variant(const VARIANT* var); + ~Variant(); + + operator long() const; + operator bool() const; + operator VARIANT_BOOL() const; + operator IDispatch*() const; +}; + + +struct BStr +{ + BStr() + { + _p = NULL; + } + + BStr(const BSTR s) + { + _p = SysAllocString(s); + } + + BStr(LPCSTR s) + { + WCHAR b[BUFFER_LEN]; + + if (s) + _p = SysAllocStringLen(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1); + else + _p = NULL; + } + + BStr(LPCWSTR s) + { + _p = SysAllocString(s); + } + + BStr(const VARIANT& var) + : _p(NULL) + { + assign(var); + } + + ~BStr() + { + SysFreeString(_p); + } + + void assign(BSTR s); + void assign(const VARIANT& var); + + operator BSTR() const + { + return _p? _p: (BSTR)L""; + } + + int length() const + { + return _p? wcslen(_p): 0; + } + +protected: + BSTR _p; +}; + + /// string class for TCHAR strings struct String #ifdef UNICODE @@ -638,8 +758,10 @@ struct String #endif String() {} + String(LPCTSTR s) {if (s) super::assign(s);} String(LPCTSTR s, int l) : super(s, l) {} + String(const super& other) : super(other) {} String(const String& other) : super(other) {} @@ -648,16 +770,20 @@ struct String String(LPCSTR s, int l) {assign(s, l);} String(const string& other) {assign(other.c_str());} String& operator=(LPCSTR s) {assign(s); return *this;} - void assign(LPCSTR s) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN));} else erase();} + void assign(LPCSTR s) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1);} else erase();} void assign(LPCSTR s, int l) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, l, b, BUFFER_LEN));} else erase();} + void assign(const BStr& s) {int l = s.length(); super::assign(s, l);} #else String(LPCWSTR s) {assign(s);} String(LPCWSTR s, int l) {assign(s, l);} String(const wstring& other) {assign(other.c_str());} String& operator=(LPCWSTR s) {assign(s); return *this;} - void assign(LPCWSTR s) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, -1, b, BUFFER_LEN, 0, 0));} else erase();} + void assign(LPCWSTR s) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, -1, b, BUFFER_LEN, 0, 0)-1);} else erase();} void assign(LPCWSTR s, int l) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();} + void assign(const BStr& s) {int l = s.length(); if (l) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();} #endif + String(const BStr& s) {assign(s);} + String& operator=(const BStr& s) {assign(s); return *this;} String& operator=(LPCTSTR s) {if (s) super::assign(s); else erase(); return *this;} String& operator=(const super& s) {super::assign(s); return *this;} @@ -666,6 +792,12 @@ struct String operator LPCTSTR() const {return c_str();} +#ifdef UNICODE + operator string() const {char b[BUFFER_LEN]; return string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN, 0, 0)-1);} +#else + operator wstring() const {WCHAR b[BUFFER_LEN]; return wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN)-1);} +#endif + String& printf(LPCTSTR fmt, ...) { va_list l; @@ -709,6 +841,8 @@ struct String } }; +#define _STRING_DEFINED + struct FmtString : public String { @@ -778,6 +912,10 @@ protected: #endif + // determine windows version string +String get_windows_version_str(); + + /// link dynamicly to functions by using GetModuleHandle() and GetProcAddress() template struct DynamicFct { @@ -834,8 +972,6 @@ protected: }; -#ifndef _NO_CONTEXT - struct Context { Context(const char* ctx) @@ -894,14 +1030,10 @@ protected: #define CONTEXT_OBJ __ctx__._obj #define CONTEXT(c) Context __ctx__(c) #define CURRENT_CONTEXT Context::current() -#define OBJ_CONTEXT(c, o) Context __ctx__(c, o); +#define OBJ_CONTEXT(c, o) Context __ctx__(c, o) -#else -#define CONTEXT(c) -#define OBJ_CONTEXT(c, o) ; - -#endif +extern bool SplitFileSysURL(LPCTSTR url, String& dir_out, String& fname_out); #endif // __cplusplus