diff --git a/reactos/subsys/system/explorer/globals.h b/reactos/subsys/system/explorer/globals.h index 9ff4a36c2e3..ca1cd14f3ef 100644 --- a/reactos/subsys/system/explorer/globals.h +++ b/reactos/subsys/system/explorer/globals.h @@ -50,7 +50,7 @@ extern struct ExplorerGlobals #define LOG(x) \ { \ if (g_Globals._log) _ftprintf(g_Globals._log, TEXT("%s\n"), (LPCTSTR)(x)); \ - OutputDebugString(x); \ + OutputDebugString(FmtString(TEXT("%s\n"), (LPCTSTR)(x))); \ } diff --git a/reactos/subsys/system/explorer/shell/entries.cpp b/reactos/subsys/system/explorer/shell/entries.cpp index 45d991b8338..42a578a1ab5 100644 --- a/reactos/subsys/system/explorer/shell/entries.cpp +++ b/reactos/subsys/system/explorer/shell/entries.cpp @@ -102,6 +102,8 @@ Entry::~Entry() // read directory tree and expand to the given location Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder) { + CONTEXT("Entry::read_tree()"); + HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT)); Entry* entry = this; @@ -126,6 +128,8 @@ Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder) void Entry::read_directory(SORT_ORDER sortOrder) { + CONTEXT("Entry::read_directory(SORT_ORDER)"); + // call into subclass read_directory(); @@ -282,6 +286,8 @@ void Entry::sort_directory(SORT_ORDER sortOrder) void Entry::smart_scan() { + CONTEXT("Entry::smart_scan()"); + if (!_scanned) { free_subentries(); read_directory(SORT_NAME); // we could use IShellFolder2::GetDefaultColumn to determine sort order diff --git a/reactos/subsys/system/explorer/shell/filechild.cpp b/reactos/subsys/system/explorer/shell/filechild.cpp index 354d98fb8ed..16a15de733c 100644 --- a/reactos/subsys/system/explorer/shell/filechild.cpp +++ b/reactos/subsys/system/explorer/shell/filechild.cpp @@ -439,6 +439,8 @@ void FileChildWindow::activate_entry(Pane* pane, HWND hwnd) void FileChildWindow::scan_entry(Entry* entry, HWND hwnd) { + CONTEXT("FileChildWindow::scan_entry()"); + int idx = ListBox_GetCurSel(_left_hwnd); HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT)); diff --git a/reactos/subsys/system/explorer/shell/shellbrowser.cpp b/reactos/subsys/system/explorer/shell/shellbrowser.cpp index 8597ec84131..8df17dc1a94 100644 --- a/reactos/subsys/system/explorer/shell/shellbrowser.cpp +++ b/reactos/subsys/system/explorer/shell/shellbrowser.cpp @@ -72,6 +72,8 @@ ShellBrowserChild::~ShellBrowserChild() LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) { + CONTEXT("ShellBrowserChild::Init()"); + if (super::Init(pcs)) return 1; @@ -105,6 +107,8 @@ LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs) void ShellBrowserChild::InitializeTree() { + CONTEXT("ShellBrowserChild::InitializeTree()"); + TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); TreeView_SetScrollTime(_left_hwnd, 100); @@ -150,6 +154,8 @@ void ShellBrowserChild::InitializeTree() bool ShellBrowserChild::InitDragDrop() { + CONTEXT("ShellBrowserChild::InitDragDrop()"); + _pDropTarget = new TreeDropTarget(_left_hwnd); if (!_pDropTarget) @@ -180,6 +186,8 @@ bool ShellBrowserChild::InitDragDrop() void ShellBrowserChild::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) { + CONTEXT("ShellBrowserChild::OnTreeItemRClick()"); + TVHITTESTINFO tvhti; GetCursorPos(&tvhti.pt); @@ -196,6 +204,8 @@ void ShellBrowserChild::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh) void ShellBrowserChild::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen) { + CONTEXT("ShellBrowserChild::Tree_DoItemMenu()"); + LPARAM itemData = TreeView_GetItemData(hwndTreeView, hItem); if (itemData) { @@ -273,6 +283,8 @@ void ShellBrowserChild::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPO void ShellBrowserChild::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh) { + CONTEXT("ShellBrowserChild::OnTreeGetDispInfo()"); + LPNMTVDISPINFO lpdi = (LPNMTVDISPINFO)pnmh; ShellEntry* entry = (ShellEntry*)lpdi->item.lParam; @@ -307,6 +319,8 @@ void ShellBrowserChild::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh) void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) { + CONTEXT("ShellBrowserChild::OnTreeItemExpanding()"); + if (pnmtv->action == TVE_COLLAPSE) TreeView_Expand(_left_hwnd, pnmtv->itemNew.hItem, TVE_COLLAPSE|TVE_COLLAPSERESET); else if (pnmtv->action == TVE_EXPAND) { @@ -330,6 +344,8 @@ void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder) { + CONTEXT("ShellBrowserChild::InsertSubitems()"); + WaitCursor wait; int cnt = 0; @@ -381,6 +397,8 @@ int ShellBrowserChild::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShel void ShellBrowserChild::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) { + CONTEXT("ShellBrowserChild::OnTreeItemSelected()"); + ShellEntry* entry = (ShellEntry*)pnmtv->itemNew.lParam; _last_sel = pnmtv->itemNew.hItem; @@ -402,6 +420,8 @@ void ShellBrowserChild::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv) void ShellBrowserChild::UpdateFolderView(IShellFolder* folder) { + CONTEXT("ShellBrowserChild::UpdateFolderView()"); + FOLDERSETTINGS fs; IShellView* pLastShellView = _pShellView; @@ -467,6 +487,8 @@ int ShellBrowserChild::Notify(int id, NMHDR* pnmh) HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pIDList) { + CONTEXT("ShellBrowserChild::OnDefaultCommand()"); + if (pIDList->cidl>=1) { if (_left_hwnd) { // explorer mode if (_last_sel) { @@ -506,6 +528,8 @@ HRESULT ShellBrowserChild::OnDefaultCommand(LPIDA pIDList) bool ShellBrowserChild::expand_folder(ShellDirectory* entry) { + CONTEXT("ShellBrowserChild::expand_folder()"); + //HTREEITEM hitem_sel = TreeView_GetSelection(_left_hwnd); if (!_last_sel) return false; diff --git a/reactos/subsys/system/explorer/shell/shellfs.cpp b/reactos/subsys/system/explorer/shell/shellfs.cpp index 36b7dee7631..5b47dd9872c 100644 --- a/reactos/subsys/system/explorer/shell/shellfs.cpp +++ b/reactos/subsys/system/explorer/shell/shellfs.cpp @@ -37,6 +37,8 @@ bool ShellDirectory::fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA* pw32fdata, BY_HANDLE_FILE_INFORMATION* pbhfi, bool do_access) { + CONTEXT("ShellDirectory::fill_w32fdata_shell()"); + bool bhfi_valid = false; if (do_access && !( (attribs&SFGAO_FILESYSTEM) && SUCCEEDED( @@ -107,6 +109,8 @@ bool ShellDirectory::fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN ShellPath ShellEntry::create_absolute_pidl() const { + CONTEXT("ShellEntry::create_absolute_pidl()"); + if (_up/* && _up->_etype==ET_SHELL*/) { ShellDirectory* dir = static_cast(_up); @@ -130,6 +134,8 @@ void ShellEntry::get_path(PTSTR path) const // get full path of a shell folder void ShellDirectory::get_path(PTSTR path) const { + CONTEXT("ShellDirectory::get_path()"); + path[0] = TEXT('\0'); SFGAOF attribs = 0; @@ -174,6 +180,8 @@ BOOL ShellEntry::launch_entry(HWND hwnd, UINT nCmdShow) static HICON extract_icon(IShellFolder* folder, LPCITEMIDLIST pidl) { + CONTEXT("extract_icon()"); + IExtractIcon* pExtract; if (SUCCEEDED(folder->GetUIObjectOf(0, 1, (LPCITEMIDLIST*)&pidl, IID_IExtractIcon, 0, (LPVOID*)&pExtract))) { @@ -229,6 +237,8 @@ static HICON extract_icon(IShellFolder* folder, LPCITEMIDLIST pidl) void ShellDirectory::read_directory() { + CONTEXT("ShellDirectory::read_directory()"); + int level = _level + 1; Entry* first_entry = NULL; diff --git a/reactos/subsys/system/explorer/utility/shellclasses.cpp b/reactos/subsys/system/explorer/utility/shellclasses.cpp index dd3964ba96b..80ab2db74ec 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.cpp +++ b/reactos/subsys/system/explorer/utility/shellclasses.cpp @@ -62,36 +62,47 @@ LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count) } -Context Context::s_main(TEXT("-NO-CONTEXT-")); +Context Context::s_main("-NO-CONTEXT-"); Context* Context::s_current = &Context::s_main; +String Context::toString() const +{ + FmtString str(TEXT("%hs"), _ctx); + + if (!_obj.empty()) + str.appendf(TEXT("\nObject: %s"), (LPCTSTR)_obj); + + return str; +} + +String Context::getStackTrace() const +{ + // evtl. besser ostringstream verwenden + String str = TEXT("Context Trace:\n"); + + for(const Context*p=this; p!=&s_main; p=p->_last) + str.appendf(TEXT("ctx=%hs obj=%s\n"), p->_ctx, (LPCTSTR)p->_obj); + + return str; +} - // Exception Handler for COM exceptions String COMException::toString() const { TCHAR msg[4*BUFFER_LEN]; LPTSTR p = msg; - p += _stprintf(p, TEXT("%s"), super::ErrorMessage()); - - if (_ctx) - p += _stprintf(p, TEXT("\nContext: %s"), _ctx); - - if (!_obj.empty()) - p += _stprintf(p, TEXT("\nObject: %s"), (LPCTSTR)_obj); + p += _stprintf(p, TEXT("%s\nContext: %s"), super::ErrorMessage(), (LPCTSTR)_ctx.toString()); if (_file) -#ifdef UNICODE p += _stprintf(p, TEXT("\nLocation: %hs(%d)"), _file, _line); -#else - p += _stprintf(p, TEXT("\nLocation: %s, line %d"), _file, _line); -#endif return msg; } + /// Exception Handler for COM exceptions + void HandleException(COMException& e, HWND hwnd) { String msg = e.toString(); diff --git a/reactos/subsys/system/explorer/utility/shellclasses.h b/reactos/subsys/system/explorer/utility/shellclasses.h index bab3e8b874c..4137cedee97 100644 --- a/reactos/subsys/system/explorer/utility/shellclasses.h +++ b/reactos/subsys/system/explorer/utility/shellclasses.h @@ -102,45 +102,44 @@ struct COMException : public COMExceptionBase COMException(HRESULT hr) : super(hr), - _ctx(Context::current()._ctx), - _obj(Context::current()._obj), + _ctx(CURRENT_CONTEXT), _file(NULL), _line(0) { LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); } COMException(HRESULT hr, const char* file, int line) : super(hr), - _ctx(Context::current()._ctx), - _obj(Context::current()._obj), + _ctx(CURRENT_CONTEXT), _file(file), _line(line) { LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); } COMException(HRESULT hr, const String& obj) : super(hr), - _ctx(Context::current()._ctx), - _obj(obj), + _ctx(CURRENT_CONTEXT), _file(NULL), _line(0) { - _ctx = Context::current()._ctx; + _ctx = CURRENT_CONTEXT; LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); } COMException(HRESULT hr, const String& obj, const char* file, int line) : super(hr), - _ctx(Context::current()._ctx), - _obj(obj), + _ctx(CURRENT_CONTEXT), _file(file), _line(line) { LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); } String toString() const; - LPCTSTR _ctx; - String _obj; + Context _ctx; const char* _file; int _line; diff --git a/reactos/subsys/system/explorer/utility/utility.cpp b/reactos/subsys/system/explorer/utility/utility.cpp index 7ac569d7c53..f66a52d8d32 100644 --- a/reactos/subsys/system/explorer/utility/utility.cpp +++ b/reactos/subsys/system/explorer/utility/utility.cpp @@ -93,17 +93,17 @@ void MoveVisible(HWND hwnd) } -void display_error(HWND hwnd, DWORD error) //@@ CONTEXT mit ausgeben +void display_error(HWND hwnd, DWORD error) //@@ CONTEXT mit ausgeben -> display_error(HWND hwnd, const Exception& e) { PTSTR msg; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL)) { - LOG(msg); + LOG(FmtString(TEXT("display_error(%#x): %s"), error, msg)); MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK); } else { - LOG(TEXT("display_error: Unknown Error")); - MessageBox(hwnd, TEXT("Unknown Error"), TEXT("ROS Explorer"), MB_OK); + LOG(FmtString(TEXT("Unknown Error %#x"), error)); + MessageBox(hwnd, FmtString(TEXT("Unknown Error %#x"), error), TEXT("ROS Explorer"), MB_OK); } LocalFree(msg); diff --git a/reactos/subsys/system/explorer/utility/utility.h b/reactos/subsys/system/explorer/utility/utility.h index a1d5d55a2f4..b4a1f0e8200 100644 --- a/reactos/subsys/system/explorer/utility/utility.h +++ b/reactos/subsys/system/explorer/utility/utility.h @@ -85,7 +85,7 @@ using namespace _com_util; #define BUFFER_LEN 1024 -#define LOG(x) OutputDebugString(x) +#define LOG(x) OutputDebugString(FmtString(TEXT("%s\n"), (LPCTSTR)(x))); /// initialization of windows common controls @@ -510,6 +510,60 @@ struct String String& operator=(const super& s) {super::assign(s); return *this;} operator LPCTSTR() const {return c_str();} + + String& printf(LPCTSTR fmt, ...) + { + va_list l; + TCHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::assign(b, _vstprintf(b, fmt, l)); + va_end(l); + + return *this; + } + + String& vprintf(LPCTSTR fmt, va_list l) + { + TCHAR b[BUFFER_LEN]; + + super::assign(b, _vstprintf(b, fmt, l)); + + return *this; + } + + String& appendf(LPCTSTR fmt, ...) + { + va_list l; + TCHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::append(b, _vstprintf(b, fmt, l)); + va_end(l); + + return *this; + } + + String& vappendf(LPCTSTR fmt, va_list l) + { + TCHAR b[BUFFER_LEN]; + + super::append(b, _vstprintf(b, fmt, l)); + + return *this; + } +}; + +struct FmtString : public String +{ + FmtString(LPCTSTR fmt, ...) + { + va_list l; + + va_start(l, fmt); + vprintf(fmt, l); + va_end(l); + } }; @@ -571,14 +625,14 @@ protected: struct Context { - Context(LPCTSTR ctx) + Context(const char* ctx) : _ctx(ctx) { _last = s_current; s_current = this; } - Context(LPCTSTR ctx, LPCSTR obj) + Context(const char* ctx, LPCSTR obj) : _ctx(ctx), _obj(obj) { @@ -586,7 +640,7 @@ struct Context s_current = this; } - Context(LPCTSTR ctx, LPCWSTR obj) + Context(const char* ctx, LPCWSTR obj) : _ctx(ctx), _obj(obj) { @@ -599,7 +653,10 @@ struct Context s_current = _last; } - LPCTSTR _ctx; + String toString() const; + String getStackTrace() const; + + const char* _ctx; String _obj; static Context current() {return *s_current;} @@ -612,8 +669,9 @@ protected: }; #define CONTEXT_OBJ __ctx__._obj -#define CONTEXT(c) Context __ctx__(TEXT(c)) -#define OBJ_CONTEXT(c, o) Context __ctx__(TEXT(c), o); +#define CONTEXT(c) Context __ctx__(c) +#define CURRENT_CONTEXT Context::current() +#define OBJ_CONTEXT(c, o) Context __ctx__(c, o); #endif // __cplusplus