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