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   const FString workDir = GetWorkDir(workDirInfo, originalPath, namePart);
67   CreateComplexDir(workDir);
68   _outStreamSpec = new COutFileStream;
69   OutStream = _outStreamSpec;
70   if (!_tempFile.Create(workDir + namePart, &_outStreamSpec->File))
71   {
72     return GetLastError_noZero_HRESULT();
73   }
74   _originalPath = originalPath;
75   return S_OK;
76 }
77 
MoveToOriginal(bool deleteOriginal)78 HRESULT CWorkDirTempFile::MoveToOriginal(bool deleteOriginal)
79 {
80   OutStream.Release();
81   if (!_tempFile.MoveTo(_originalPath, deleteOriginal))
82   {
83     return GetLastError_noZero_HRESULT();
84   }
85   return S_OK;
86 }
87