xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/WorkDir.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1 // WorkDir.cpp
2 
3 #include "StdAfx.h"
4 
5 #include "../../../Windows/FileName.h"
6 #include "../../../Windows/FileSystem.h"
7 
8 #include "WorkDir.h"
9 
10 using namespace NWindows;
11 using namespace NFile;
12 using namespace NDir;
13 
GetWorkDir(const NWorkDir::CInfo & workDirInfo,const FString & path,FString & fileName)14 FString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const FString &path, FString &fileName)
15 {
16   NWorkDir::NMode::EEnum mode = workDirInfo.Mode;
17 
18   #if defined(_WIN32) && !defined(UNDER_CE)
19   if (workDirInfo.ForRemovableOnly)
20   {
21     mode = NWorkDir::NMode::kCurrent;
22     const FString prefix = path.Left(3);
23     if (NName::IsDrivePath(prefix))
24     {
25       const UINT driveType = NSystem::MyGetDriveType(prefix);
26       if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE)
27         mode = workDirInfo.Mode;
28     }
29     /*
30     CParsedPath parsedPath;
31     parsedPath.ParsePath(archiveName);
32     UINT driveType = GetDriveType(parsedPath.Prefix);
33     if ((driveType != DRIVE_CDROM) && (driveType != DRIVE_REMOVABLE))
34       mode = NZipSettings::NWorkDir::NMode::kCurrent;
35     */
36   }
37   #endif
38 
39   const int pos = path.ReverseFind_PathSepar() + 1;
40   fileName = path.Ptr((unsigned)pos);
41 
42   FString tempDir;
43   switch ((int)mode)
44   {
45     case NWorkDir::NMode::kCurrent:
46       tempDir = path.Left((unsigned)pos);
47       break;
48     case NWorkDir::NMode::kSpecified:
49       tempDir = workDirInfo.Path;
50       break;
51     // case NWorkDir::NMode::kSystem:
52     default:
53       if (!MyGetTempPath(tempDir))
54         throw 141717;
55       break;
56   }
57   NName::NormalizeDirPathPrefix(tempDir);
58   return tempDir;
59 }
60 
CreateTempFile(const FString & originalPath)61 HRESULT CWorkDirTempFile::CreateTempFile(const FString &originalPath)
62 {
63   NWorkDir::CInfo workDirInfo;
64   workDirInfo.Load();
65   FString namePart;
66   FString path = GetWorkDir(workDirInfo, originalPath, namePart);
67   CreateComplexDir(path);
68   path += namePart;
69   _outStreamSpec = new COutFileStream;
70   OutStream = _outStreamSpec;
71   if (!_tempFile.Create(path, &_outStreamSpec->File))
72     return GetLastError_noZero_HRESULT();
73   _originalPath = originalPath;
74   return S_OK;
75 }
76 
MoveToOriginal(bool deleteOriginal,NWindows::NFile::NDir::ICopyFileProgress * progress)77 HRESULT CWorkDirTempFile::MoveToOriginal(bool deleteOriginal,
78     NWindows::NFile::NDir::ICopyFileProgress *progress)
79 {
80   OutStream.Release();
81   if (!_tempFile.MoveTo(_originalPath, deleteOriginal, progress))
82     return GetLastError_noZero_HRESULT();
83   return S_OK;
84 }
85