Author: dquintana
Date: Thu Jun 19 23:24:09 2014
New Revision: 63622

URL: http://svn.reactos.org/svn/reactos?rev=63622&view=rev
Log:
[FILEBROWSER]
* Copy basic path parsing from explorer-new, so filebrowser.exe can load with a 
different folder active.

Modified:
    branches/shell-experiments/base/shell/filebrowser/filebrowser.c

Modified: branches/shell-experiments/base/shell/filebrowser/filebrowser.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/filebrowser/filebrowser.c?rev=63622&r1=63621&r2=63622&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/filebrowser/filebrowser.c     
[iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/filebrowser/filebrowser.c     
[iso-8859-1] Thu Jun 19 23:24:09 2014
@@ -28,18 +28,110 @@
 
 int _tmain(int argc, _TCHAR* argv[])
 {
+    WCHAR root[MAX_PATH];
+    HRESULT hr;
+    LPSHELLFOLDER pDesktopFolder = NULL;
+    LPITEMIDLIST pidlRoot = NULL;
+    typedef HRESULT(WINAPI *SH_OPEN_NEW_FRAME)(LPITEMIDLIST pidl, IUnknown 
*paramC, long param10, long param14);
+    SH_OPEN_NEW_FRAME SHOpenNewFrame;
+
     HMODULE hBrowseui = LoadLibraryW(L"browseui.dll");
-    if (hBrowseui)
+
+    if (!hBrowseui)
+        return 1;
+
+
+    if (argc < 2)
     {
-        SH_OPEN_NEW_FRAME SHOpenNewFrame = 
(SH_OPEN_NEW_FRAME)GetProcAddress(hBrowseui, (LPCSTR)103);
+        SH_OPEN_NEW_FRAME SHOpenNewFrame = (SH_OPEN_NEW_FRAME) 
GetProcAddress(hBrowseui, (LPCSTR) 103);
         LPITEMIDLIST pidlDrives;
         SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidlDrives);
-        SHOpenNewFrame((LPITEMIDLIST)pidlDrives, NULL, 0, 0);
+        SHOpenNewFrame((LPITEMIDLIST) pidlDrives, NULL, 0, 0);
+    }
+    else
+    {
+        /* A shell is already loaded. Parse the command line arguments
+        and unless we need to do something specific simply display
+        the desktop in a separate explorer window */
+        /* FIXME */
+
+        /* Commandline switches:
+        *
+        * /n               Open a new window, even if an existing one still 
exists.
+        * /e               Start with the explorer sidebar shown.
+        * /root,<object>   Open a window for the given object path.
+        * /select,<object> Open a window with the given object selected.
+        */
+
+        /* FIXME: Do it right */
+        WCHAR* tmp = wcsstr(argv[1], L"/root,");
+        if (tmp)
+        {
+            WCHAR* tmp2;
+
+            tmp += 6; // skip to beginning of path
+            tmp2 = wcschr(tmp, L',');
+
+            if (tmp2)
+            {
+                wcsncpy(root, tmp, tmp2 - tmp);
+            }
+            else
+            {
+                wcscpy(root, tmp);
+            }
+        }
+        else
+        {
+            wcscpy(root, argv[1]);
+        }
+
+        if (root[0] == L'"')
+        {
+            int len = wcslen(root) - 2;
+            wcsncpy(root, root + 1, len);
+            root[len] = 0;
+        }
+
+        if (wcslen(root) > 0)
+        {
+            LPITEMIDLIST  pidl;
+            ULONG         chEaten;
+            ULONG         dwAttributes;
+
+            if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))
+            {
+                hr = pDesktopFolder->lpVtbl->ParseDisplayName(pDesktopFolder,
+                    NULL,
+                    NULL,
+                    root,
+                    &chEaten,
+                    &pidl,
+                    &dwAttributes);
+                if (SUCCEEDED(hr))
+                {
+                    pidlRoot = pidl;
+                }
+            }
+        }
+
+        if (!pidlRoot)
+        {
+            hr = SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidlRoot);
+            if (FAILED(hr))
+                return 0;
+        }
+        
+        SHOpenNewFrame = (SH_OPEN_NEW_FRAME) GetProcAddress(hBrowseui, 
(LPCSTR) 103);
+
+        hr = SHOpenNewFrame(pidlRoot, (IUnknown*) pDesktopFolder, 0, 0);
+        if (FAILED(hr))
+            return 0;
     }
 
-    /* FIXME: we should wait a bit here and see if a window was created. If 
not we should exit this process */
+    /* FIXME: we should wait a bit here and see if a window was created. If 
not we should exit this process. */
+    Sleep(1000);
+
     ExitThread(0);
-
-    return 0;
 }
 


Reply via email to