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