Browse Source

Workaround for missing symbol REPLACEFILE_IGNORE_ACL_ERRORS on mingw

tags/2021-05-28
jules 7 years ago
parent
commit
3149bc5a69
1 changed files with 45 additions and 40 deletions
  1. +45
    -40
      modules/juce_core/native/juce_win32_Files.cpp

+ 45
- 40
modules/juce_core/native/juce_win32_Files.cpp View File

@@ -129,7 +129,7 @@ namespace WindowsFileHelpers
File getSpecialFolderPath (int type) File getSpecialFolderPath (int type)
{ {
WCHAR path [MAX_PATH + 256];
WCHAR path[MAX_PATH + 256];
if (SHGetSpecialFolderPath (0, path, type, FALSE)) if (SHGetSpecialFolderPath (0, path, type, FALSE))
return File (String (path)); return File (String (path));
@@ -139,7 +139,7 @@ namespace WindowsFileHelpers
File getModuleFileName (HINSTANCE moduleHandle) File getModuleFileName (HINSTANCE moduleHandle)
{ {
WCHAR dest [MAX_PATH + 256];
WCHAR dest[MAX_PATH + 256];
dest[0] = 0; dest[0] = 0;
GetModuleFileName (moduleHandle, dest, (DWORD) numElementsInArray (dest)); GetModuleFileName (moduleHandle, dest, (DWORD) numElementsInArray (dest));
return File (String (dest)); return File (String (dest));
@@ -147,7 +147,7 @@ namespace WindowsFileHelpers
Result getResultForLastError() Result getResultForLastError()
{ {
TCHAR messageBuffer [256] = { 0 };
TCHAR messageBuffer[256] = { 0 };
FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
@@ -181,7 +181,7 @@ bool File::existsAsFile() const
bool File::isDirectory() const bool File::isDirectory() const
{ {
const DWORD attr = WindowsFileHelpers::getAtts (fullPath);
auto attr = WindowsFileHelpers::getAtts (fullPath);
return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 && attr != INVALID_FILE_ATTRIBUTES; return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 && attr != INVALID_FILE_ATTRIBUTES;
} }
@@ -250,22 +250,22 @@ bool File::moveToTrash() const
bool File::copyInternal (const File& dest) const bool File::copyInternal (const File& dest) const
{ {
return CopyFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer(), false) != 0;
return CopyFile (fullPath.toWideCharPointer(),
dest.getFullPathName().toWideCharPointer(), false) != 0;
} }
bool File::moveInternal (const File& dest) const bool File::moveInternal (const File& dest) const
{ {
return MoveFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer()) != 0;
return MoveFile (fullPath.toWideCharPointer(),
dest.getFullPathName().toWideCharPointer()) != 0;
} }
bool File::replaceInternal (const File& dest) const bool File::replaceInternal (const File& dest) const
{ {
void* lpExclude = 0;
void* lpReserved = 0;
return ReplaceFile (dest.getFullPathName().toWideCharPointer(), fullPath.toWideCharPointer(),
0, REPLACEFILE_IGNORE_MERGE_ERRORS | REPLACEFILE_IGNORE_ACL_ERRORS,
lpExclude, lpReserved) != 0;
return ReplaceFile (dest.getFullPathName().toWideCharPointer(),
fullPath.toWideCharPointer(),
0, REPLACEFILE_IGNORE_MERGE_ERRORS | 4 /*REPLACEFILE_IGNORE_ACL_ERRORS*/,
nullptr, nullptr) != 0;
} }
Result File::createDirectoryInternal (const String& fileName) const Result File::createDirectoryInternal (const String& fileName) const
@@ -279,14 +279,16 @@ int64 juce_fileSetPosition (void* handle, int64 pos)
{ {
LARGE_INTEGER li; LARGE_INTEGER li;
li.QuadPart = pos; li.QuadPart = pos;
li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart, &li.HighPart, FILE_BEGIN); // (returns -1 if it fails)
li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart,
&li.HighPart, FILE_BEGIN); // (returns -1 if it fails)
return li.QuadPart; return li.QuadPart;
} }
void FileInputStream::openHandle() void FileInputStream::openHandle()
{ {
HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);
auto h = CreateFile (file.getFullPathName().toWideCharPointer(),
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);
if (h != INVALID_HANDLE_VALUE) if (h != INVALID_HANDLE_VALUE)
fileHandle = (void*) h; fileHandle = (void*) h;
@@ -304,6 +306,7 @@ size_t FileInputStream::readInternal (void* buffer, size_t numBytes)
if (fileHandle != 0) if (fileHandle != 0)
{ {
DWORD actualNum = 0; DWORD actualNum = 0;
if (! ReadFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0)) if (! ReadFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0))
status = WindowsFileHelpers::getResultForLastError(); status = WindowsFileHelpers::getResultForLastError();
@@ -316,8 +319,9 @@ size_t FileInputStream::readInternal (void* buffer, size_t numBytes)
//============================================================================== //==============================================================================
void FileOutputStream::openHandle() void FileOutputStream::openHandle()
{ {
HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
auto h = CreateFile (file.getFullPathName().toWideCharPointer(),
GENERIC_WRITE, FILE_SHARE_READ, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (h != INVALID_HANDLE_VALUE) if (h != INVALID_HANDLE_VALUE)
{ {
@@ -343,16 +347,13 @@ void FileOutputStream::closeHandle()
ssize_t FileOutputStream::writeInternal (const void* bufferToWrite, size_t numBytes) ssize_t FileOutputStream::writeInternal (const void* bufferToWrite, size_t numBytes)
{ {
DWORD actualNum = 0;
if (fileHandle != nullptr) if (fileHandle != nullptr)
{
DWORD actualNum = 0;
if (! WriteFile ((HANDLE) fileHandle, bufferToWrite, (DWORD) numBytes, &actualNum, 0)) if (! WriteFile ((HANDLE) fileHandle, bufferToWrite, (DWORD) numBytes, &actualNum, 0))
status = WindowsFileHelpers::getResultForLastError(); status = WindowsFileHelpers::getResultForLastError();
return (ssize_t) actualNum;
}
return 0;
return (ssize_t) actualNum;
} }
void FileOutputStream::flushInternal() void FileOutputStream::flushInternal()
@@ -396,15 +397,17 @@ void MemoryMappedFile::openInternal (const File& file, AccessMode mode, bool exc
access = FILE_MAP_ALL_ACCESS; access = FILE_MAP_ALL_ACCESS;
} }
HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode,
exclusive ? 0 : (FILE_SHARE_READ | (mode == readWrite ? FILE_SHARE_WRITE : 0)), 0,
createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);
auto h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode,
exclusive ? 0 : (FILE_SHARE_READ | (mode == readWrite ? FILE_SHARE_WRITE : 0)), 0,
createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);
if (h != INVALID_HANDLE_VALUE) if (h != INVALID_HANDLE_VALUE)
{ {
fileHandle = (void*) h; fileHandle = (void*) h;
HANDLE mappingHandle = CreateFileMapping (h, 0, protect, (DWORD) (range.getEnd() >> 32), (DWORD) range.getEnd(), 0);
auto mappingHandle = CreateFileMapping (h, 0, protect,
(DWORD) (range.getEnd() >> 32),
(DWORD) range.getEnd(), 0);
if (mappingHandle != 0) if (mappingHandle != 0)
{ {
@@ -461,8 +464,9 @@ bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64
using namespace WindowsFileHelpers; using namespace WindowsFileHelpers;
bool ok = false; bool ok = false;
HANDLE h = CreateFile (fullPath.toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
auto h = CreateFile (fullPath.toWideCharPointer(),
GENERIC_WRITE, FILE_SHARE_READ, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (h != INVALID_HANDLE_VALUE) if (h != INVALID_HANDLE_VALUE)
{ {
@@ -482,7 +486,7 @@ bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64
//============================================================================== //==============================================================================
void File::findFileSystemRoots (Array<File>& destArray) void File::findFileSystemRoots (Array<File>& destArray)
{ {
TCHAR buffer [2048] = { 0 };
TCHAR buffer[2048] = { 0 };
GetLogicalDriveStrings (2048, buffer); GetLogicalDriveStrings (2048, buffer);
const TCHAR* n = buffer; const TCHAR* n = buffer;
@@ -499,13 +503,14 @@ void File::findFileSystemRoots (Array<File>& destArray)
roots.sort (true); roots.sort (true);
for (int i = 0; i < roots.size(); ++i) for (int i = 0; i < roots.size(); ++i)
destArray.add (roots [i]);
destArray.add (roots[i]);
} }
//============================================================================== //==============================================================================
String File::getVolumeLabel() const String File::getVolumeLabel() const
{ {
TCHAR dest[64]; TCHAR dest[64];
if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest, if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest,
(DWORD) numElementsInArray (dest), 0, 0, 0, 0, 0)) (DWORD) numElementsInArray (dest), 0, 0, 0, 0, 0))
dest[0] = 0; dest[0] = 0;
@@ -539,9 +544,9 @@ uint64 File::getFileIdentifier() const
{ {
uint64 result = 0; uint64 result = 0;
HANDLE h = CreateFile (getFullPathName().toWideCharPointer(),
GENERIC_READ, FILE_SHARE_READ, nullptr,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
auto h = CreateFile (getFullPathName().toWideCharPointer(),
GENERIC_READ, FILE_SHARE_READ, nullptr,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
if (h != INVALID_HANDLE_VALUE) if (h != INVALID_HANDLE_VALUE)
{ {
@@ -568,7 +573,7 @@ bool File::isOnHardDisk() const
if (fullPath.isEmpty()) if (fullPath.isEmpty())
return false; return false;
const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());
auto n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());
if (fullPath.toLowerCase()[0] <= 'b' && fullPath[1] == ':') if (fullPath.toLowerCase()[0] <= 'b' && fullPath[1] == ':')
return n != DRIVE_REMOVABLE; return n != DRIVE_REMOVABLE;
@@ -583,7 +588,7 @@ bool File::isOnRemovableDrive() const
if (fullPath.isEmpty()) if (fullPath.isEmpty())
return false; return false;
const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());
auto n = WindowsFileHelpers::getWindowsDriveType (getFullPathName());
return n == DRIVE_CDROM return n == DRIVE_CDROM
|| n == DRIVE_REMOTE || n == DRIVE_REMOTE
@@ -612,7 +617,7 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
case tempDirectory: case tempDirectory:
{ {
WCHAR dest [2048];
WCHAR dest[2048];
dest[0] = 0; dest[0] = 0;
GetTempPath ((DWORD) numElementsInArray (dest), dest); GetTempPath ((DWORD) numElementsInArray (dest), dest);
return File (String (dest)); return File (String (dest));
@@ -620,7 +625,7 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
case windowsSystemDirectory: case windowsSystemDirectory:
{ {
WCHAR dest [2048];
WCHAR dest[2048];
dest[0] = 0; dest[0] = 0;
GetSystemDirectoryW (dest, (UINT) numElementsInArray (dest)); GetSystemDirectoryW (dest, (UINT) numElementsInArray (dest));
return File (String (dest)); return File (String (dest));
@@ -645,7 +650,7 @@ File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
//============================================================================== //==============================================================================
File File::getCurrentWorkingDirectory() File File::getCurrentWorkingDirectory()
{ {
WCHAR dest [MAX_PATH + 256];
WCHAR dest[MAX_PATH + 256];
dest[0] = 0; dest[0] = 0;
GetCurrentDirectory ((DWORD) numElementsInArray (dest), dest); GetCurrentDirectory ((DWORD) numElementsInArray (dest), dest);
return File (String (dest)); return File (String (dest));
@@ -710,7 +715,7 @@ static String readWindowsLnkFile (File lnkFile, bool wantsAbsolutePath)
&& (! wantsAbsolutePath || SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI)))) && (! wantsAbsolutePath || SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI))))
{ {
WIN32_FIND_DATA winFindData; WIN32_FIND_DATA winFindData;
WCHAR resolvedPath [MAX_PATH];
WCHAR resolvedPath[MAX_PATH];
DWORD flags = SLGP_UNCPRIORITY; DWORD flags = SLGP_UNCPRIORITY;


Loading…
Cancel
Save