https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a3a12271e1092cfaf68e7fb94553501480a857d7

commit a3a12271e1092cfaf68e7fb94553501480a857d7
Author:     Mark Jansen <[email protected]>
AuthorDate: Sun Sep 6 23:14:11 2020 +0200
Commit:     Mark Jansen <[email protected]>
CommitDate: Sun Oct 11 17:01:05 2020 +0200

    [RAPPS] Add directory extraction capabilities for the .cab file
---
 base/applications/rapps/cabinet.cpp | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/base/applications/rapps/cabinet.cpp 
b/base/applications/rapps/cabinet.cpp
index e10d64f84c5..8b4d8a19be5 100644
--- a/base/applications/rapps/cabinet.cpp
+++ b/base/applications/rapps/cabinet.cpp
@@ -5,6 +5,7 @@
  * COPYRIGHT:   Copyright 2018 Alexander Shaposhnikov     
([email protected])            
  */
 #include "rapps.h"
+#include <debug.h>
 
 #include <fdi.h>
 #include <fcntl.h>
@@ -178,18 +179,42 @@ FNFDINOTIFY(fnNotify)
     {
     case fdintCOPY_FILE:
     {
-        ATL::CStringW szNewFileName, szExtractDir, szCabFileName;
-        ATL::CStringA szFilePathUTF8;
+        CStringW szExtractDir, szCabFileName;
 
         // Append the destination directory to the file name.
         MultiByteToWide((LPCSTR) pfdin->pv, szExtractDir, CP_UTF8);
         MultiByteToWide(pfdin->psz1, szCabFileName, CP_ACP);
 
-        szNewFileName = szExtractDir + L"\\" + szCabFileName;
+        if (szCabFileName.Find('\\') >= 0)
+        {
+            CStringW szNewDirName = szExtractDir;
+            int nTokenPos = 0;
+            // We do not want to interpret the filename as directory,
+            // so bail out before the last token!
+            while (szCabFileName.Find('\\', nTokenPos) >= 0)
+            {
+                CStringW token = szCabFileName.Tokenize(L"\\", nTokenPos);
+                if (token.IsEmpty())
+                    break;
+
+                szNewDirName += L"\\" + token;
+                if (!CreateDirectoryW(szNewDirName, NULL))
+                {
+                    DWORD dwErr = GetLastError();
+                    if (dwErr != ERROR_ALREADY_EXISTS)
+                    {
+                        DPRINT1("ERROR: Unable to create directory %S (err 
%lu)\n", szNewDirName.GetString(), dwErr);
+                    }
+                }
+            }
+        }
+
+        CStringW szNewFileName = szExtractDir + L"\\" + szCabFileName;
 
+        CStringA szFilePathUTF8;
         WideToMultiByte(szNewFileName, szFilePathUTF8, CP_UTF8);
 
-        // Copy file
+        // Open the file
         iResult = fnFileOpen((LPSTR) szFilePathUTF8.GetString(), 
                              _O_WRONLY | _O_CREAT,
                              0);

Reply via email to