other-licenses/7zstub/src/7zip/Common/FilePathAutoRename.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 // FilePathAutoRename.cpp
     3 #include "StdAfx.h"
     4 #include "FilePathAutoRename.h"
     6 #include "Common/Defs.h"
     7 #include "Common/IntToString.h"
     9 #include "Windows/FileName.h"
    10 #include "Windows/FileFind.h"
    12 using namespace NWindows;
    14 static bool MakeAutoName(const UString &name, 
    15     const UString &extension, int value, UString &path)
    16 {
    17   wchar_t number[32];
    18   ConvertUInt64ToString(value, number);
    19   path = name;
    20   path += number;
    21   path += extension;
    22   return NFile::NFind::DoesFileExist(path);
    23 }
    25 bool AutoRenamePath(UString &fullProcessedPath)
    26 {
    27   UString path;
    28   int dotPos = fullProcessedPath.ReverseFind(L'.');
    30   int slashPos = fullProcessedPath.ReverseFind(L'/');
    31   #ifdef _WIN32
    32   int slash1Pos = fullProcessedPath.ReverseFind(L'\\');
    33   slashPos = MyMax(slashPos, slash1Pos);
    34   #endif
    36   UString name, extension;
    37   if (dotPos > slashPos &&  dotPos > 0)
    38   {
    39     name = fullProcessedPath.Left(dotPos);
    40     extension = fullProcessedPath.Mid(dotPos);
    41   }
    42   else
    43     name = fullProcessedPath;
    44   name += L'_';
    45   int indexLeft = 1, indexRight = (1 << 30);
    46   while (indexLeft != indexRight)
    47   {
    48     int indexMid = (indexLeft + indexRight) / 2;
    49     if (MakeAutoName(name, extension, indexMid, path))
    50       indexLeft = indexMid + 1;
    51     else
    52       indexRight = indexMid;
    53   }
    54   if (MakeAutoName(name, extension, indexRight, fullProcessedPath))
    55     return false;
    56   return true;
    57 }

mercurial