[FILEBROWSER]
authorDavid Quintana <gigaherz@gmail.com>
Thu, 19 Jun 2014 23:24:09 +0000 (23:24 +0000)
committerDavid Quintana <gigaherz@gmail.com>
Thu, 19 Jun 2014 23:24:09 +0000 (23:24 +0000)
* Copy basic path parsing from explorer-new, so filebrowser.exe can load with a different folder active.

svn path=/branches/shell-experiments/; revision=63622

base/shell/filebrowser/filebrowser.c

index 8bbfe47..d7e22d9 100644 (file)
@@ -28,18 +28,110 @@ typedef HRESULT (WINAPI *SH_OPEN_NEW_FRAME)(LPITEMIDLIST pidl, IUnknown *paramC,
 
 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 */
 
-    /* FIXME: we should wait a bit here and see if a window was created. If not we should exit this process */
-    ExitThread(0);
+        /* 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]);
+        }
 
-    return 0;
+        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. */
+    Sleep(1000);
+
+    ExitThread(0);
 }