1// WorkDir.cpp
2
3#include "StdAfx.h"
4
5#include "Common/StringConvert.h"
6#include "Common/Wildcard.h"
7
8#include "Windows/FileDir.h"
9#include "Windows/FileName.h"
10
11#include "WorkDir.h"
12
13using namespace NWindows;
14using namespace NFile;
15
16UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path)
17{
18  NWorkDir::NMode::EEnum mode = workDirInfo.Mode;
19  #ifndef UNDER_CE
20  if (workDirInfo.ForRemovableOnly)
21  {
22    mode = NWorkDir::NMode::kCurrent;
23    UString prefix = path.Left(3);
24    if (prefix[1] == L':' && prefix[2] == L'\\')
25    {
26      UINT driveType = GetDriveType(GetSystemString(prefix, ::AreFileApisANSI() ? CP_ACP : CP_OEMCP));
27      if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE)
28        mode = workDirInfo.Mode;
29    }
30    /*
31    CParsedPath parsedPath;
32    parsedPath.ParsePath(archiveName);
33    UINT driveType = GetDriveType(parsedPath.Prefix);
34    if ((driveType != DRIVE_CDROM) && (driveType != DRIVE_REMOVABLE))
35      mode = NZipSettings::NWorkDir::NMode::kCurrent;
36    */
37  }
38  #endif
39  switch(mode)
40  {
41    case NWorkDir::NMode::kCurrent:
42    {
43      return ExtractDirPrefixFromPath(path);
44    }
45    case NWorkDir::NMode::kSpecified:
46    {
47      UString tempDir = workDirInfo.Path;
48      NName::NormalizeDirPathPrefix(tempDir);
49      return tempDir;
50    }
51    default:
52    {
53      UString tempDir;
54      if (!NDirectory::MyGetTempPath(tempDir))
55        throw 141717;
56      return tempDir;
57    }
58  }
59}
60