1370b324cSopenharmony_ci// WorkDir.cpp 2370b324cSopenharmony_ci 3370b324cSopenharmony_ci#include "StdAfx.h" 4370b324cSopenharmony_ci 5370b324cSopenharmony_ci#include "../../../Windows/FileName.h" 6370b324cSopenharmony_ci#include "../../../Windows/FileSystem.h" 7370b324cSopenharmony_ci 8370b324cSopenharmony_ci#include "WorkDir.h" 9370b324cSopenharmony_ci 10370b324cSopenharmony_ciusing namespace NWindows; 11370b324cSopenharmony_ciusing namespace NFile; 12370b324cSopenharmony_ciusing namespace NDir; 13370b324cSopenharmony_ci 14370b324cSopenharmony_ciFString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const FString &path, FString &fileName) 15370b324cSopenharmony_ci{ 16370b324cSopenharmony_ci NWorkDir::NMode::EEnum mode = workDirInfo.Mode; 17370b324cSopenharmony_ci 18370b324cSopenharmony_ci #if defined(_WIN32) && !defined(UNDER_CE) 19370b324cSopenharmony_ci if (workDirInfo.ForRemovableOnly) 20370b324cSopenharmony_ci { 21370b324cSopenharmony_ci mode = NWorkDir::NMode::kCurrent; 22370b324cSopenharmony_ci const FString prefix = path.Left(3); 23370b324cSopenharmony_ci if (NName::IsDrivePath(prefix)) 24370b324cSopenharmony_ci { 25370b324cSopenharmony_ci const UINT driveType = NSystem::MyGetDriveType(prefix); 26370b324cSopenharmony_ci if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE) 27370b324cSopenharmony_ci mode = workDirInfo.Mode; 28370b324cSopenharmony_ci } 29370b324cSopenharmony_ci /* 30370b324cSopenharmony_ci CParsedPath parsedPath; 31370b324cSopenharmony_ci parsedPath.ParsePath(archiveName); 32370b324cSopenharmony_ci UINT driveType = GetDriveType(parsedPath.Prefix); 33370b324cSopenharmony_ci if ((driveType != DRIVE_CDROM) && (driveType != DRIVE_REMOVABLE)) 34370b324cSopenharmony_ci mode = NZipSettings::NWorkDir::NMode::kCurrent; 35370b324cSopenharmony_ci */ 36370b324cSopenharmony_ci } 37370b324cSopenharmony_ci #endif 38370b324cSopenharmony_ci 39370b324cSopenharmony_ci const int pos = path.ReverseFind_PathSepar() + 1; 40370b324cSopenharmony_ci fileName = path.Ptr((unsigned)pos); 41370b324cSopenharmony_ci 42370b324cSopenharmony_ci FString tempDir; 43370b324cSopenharmony_ci switch ((int)mode) 44370b324cSopenharmony_ci { 45370b324cSopenharmony_ci case NWorkDir::NMode::kCurrent: 46370b324cSopenharmony_ci tempDir = path.Left((unsigned)pos); 47370b324cSopenharmony_ci break; 48370b324cSopenharmony_ci case NWorkDir::NMode::kSpecified: 49370b324cSopenharmony_ci tempDir = workDirInfo.Path; 50370b324cSopenharmony_ci break; 51370b324cSopenharmony_ci // case NWorkDir::NMode::kSystem: 52370b324cSopenharmony_ci default: 53370b324cSopenharmony_ci if (!MyGetTempPath(tempDir)) 54370b324cSopenharmony_ci throw 141717; 55370b324cSopenharmony_ci break; 56370b324cSopenharmony_ci } 57370b324cSopenharmony_ci NName::NormalizeDirPathPrefix(tempDir); 58370b324cSopenharmony_ci return tempDir; 59370b324cSopenharmony_ci} 60370b324cSopenharmony_ci 61370b324cSopenharmony_ciHRESULT CWorkDirTempFile::CreateTempFile(const FString &originalPath) 62370b324cSopenharmony_ci{ 63370b324cSopenharmony_ci NWorkDir::CInfo workDirInfo; 64370b324cSopenharmony_ci workDirInfo.Load(); 65370b324cSopenharmony_ci FString namePart; 66370b324cSopenharmony_ci const FString workDir = GetWorkDir(workDirInfo, originalPath, namePart); 67370b324cSopenharmony_ci CreateComplexDir(workDir); 68370b324cSopenharmony_ci _outStreamSpec = new COutFileStream; 69370b324cSopenharmony_ci OutStream = _outStreamSpec; 70370b324cSopenharmony_ci if (!_tempFile.Create(workDir + namePart, &_outStreamSpec->File)) 71370b324cSopenharmony_ci { 72370b324cSopenharmony_ci return GetLastError_noZero_HRESULT(); 73370b324cSopenharmony_ci } 74370b324cSopenharmony_ci _originalPath = originalPath; 75370b324cSopenharmony_ci return S_OK; 76370b324cSopenharmony_ci} 77370b324cSopenharmony_ci 78370b324cSopenharmony_ciHRESULT CWorkDirTempFile::MoveToOriginal(bool deleteOriginal) 79370b324cSopenharmony_ci{ 80370b324cSopenharmony_ci OutStream.Release(); 81370b324cSopenharmony_ci if (!_tempFile.MoveTo(_originalPath, deleteOriginal)) 82370b324cSopenharmony_ci { 83370b324cSopenharmony_ci return GetLastError_noZero_HRESULT(); 84370b324cSopenharmony_ci } 85370b324cSopenharmony_ci return S_OK; 86370b324cSopenharmony_ci} 87