| Index: Source/WebCore/platform/win/FileSystemWin.cpp
|
| diff --git a/Source/WebCore/platform/win/FileSystemWin.cpp b/Source/WebCore/platform/win/FileSystemWin.cpp
|
| deleted file mode 100644
|
| index 197d50937d98a95774c13e72cd137c30741bbd9b..0000000000000000000000000000000000000000
|
| --- a/Source/WebCore/platform/win/FileSystemWin.cpp
|
| +++ /dev/null
|
| @@ -1,402 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
|
| - * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - *
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
|
| - * its contributors may be used to endorse or promote products derived
|
| - * from this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
| - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
| - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
| - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
| - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
| - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
| - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
| - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "FileSystem.h"
|
| -
|
| -#include "FileMetadata.h"
|
| -#include "NotImplemented.h"
|
| -#include "PathWalker.h"
|
| -#include <wtf/CryptographicallyRandomNumber.h>
|
| -#include <wtf/HashMap.h>
|
| -#include <wtf/text/CString.h>
|
| -#include <wtf/text/WTFString.h>
|
| -
|
| -#include <windows.h>
|
| -#include <shlobj.h>
|
| -#include <shlwapi.h>
|
| -
|
| -namespace WebCore {
|
| -
|
| -static const ULONGLONG kSecondsFromFileTimeToTimet = 11644473600;
|
| -
|
| -static bool getFindData(String path, WIN32_FIND_DATAW& findData)
|
| -{
|
| - HANDLE handle = FindFirstFileW(path.charactersWithNullTermination(), &findData);
|
| - if (handle == INVALID_HANDLE_VALUE)
|
| - return false;
|
| - FindClose(handle);
|
| - return true;
|
| -}
|
| -
|
| -static bool getFileSizeFromFindData(const WIN32_FIND_DATAW& findData, long long& size)
|
| -{
|
| - ULARGE_INTEGER fileSize;
|
| - fileSize.HighPart = findData.nFileSizeHigh;
|
| - fileSize.LowPart = findData.nFileSizeLow;
|
| -
|
| - if (fileSize.QuadPart > static_cast<ULONGLONG>(std::numeric_limits<long long>::max()))
|
| - return false;
|
| -
|
| - size = fileSize.QuadPart;
|
| - return true;
|
| -}
|
| -
|
| -static void getFileModificationTimeFromFindData(const WIN32_FIND_DATAW& findData, time_t& time)
|
| -{
|
| - ULARGE_INTEGER fileTime;
|
| - fileTime.HighPart = findData.ftLastWriteTime.dwHighDateTime;
|
| - fileTime.LowPart = findData.ftLastWriteTime.dwLowDateTime;
|
| -
|
| - // Information about converting time_t to FileTime is available at http://msdn.microsoft.com/en-us/library/ms724228%28v=vs.85%29.aspx
|
| - time = fileTime.QuadPart / 10000000 - kSecondsFromFileTimeToTimet;
|
| -}
|
| -
|
| -bool getFileSize(const String& path, long long& size)
|
| -{
|
| - WIN32_FIND_DATAW findData;
|
| - if (!getFindData(path, findData))
|
| - return false;
|
| -
|
| - return getFileSizeFromFindData(findData, size);
|
| -}
|
| -
|
| -bool getFileModificationTime(const String& path, time_t& time)
|
| -{
|
| - WIN32_FIND_DATAW findData;
|
| - if (!getFindData(path, findData))
|
| - return false;
|
| -
|
| - getFileModificationTimeFromFindData(findData, time);
|
| - return true;
|
| -}
|
| -
|
| -bool getFileMetadata(const String& path, FileMetadata& metadata)
|
| -{
|
| - WIN32_FIND_DATAW findData;
|
| - if (!getFindData(path, findData))
|
| - return false;
|
| -
|
| - if (!getFileSizeFromFindData(findData, metadata.length))
|
| - return false;
|
| -
|
| - time_t modificationTime;
|
| - getFileModificationTimeFromFindData(findData, modificationTime);
|
| - metadata.modificationTime = modificationTime;
|
| -
|
| - metadata.type = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FileMetadata::TypeDirectory : FileMetadata::TypeFile;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool fileExists(const String& path)
|
| -{
|
| - WIN32_FIND_DATAW findData;
|
| - return getFindData(path, findData);
|
| -}
|
| -
|
| -bool deleteFile(const String& path)
|
| -{
|
| - String filename = path;
|
| - return !!DeleteFileW(filename.charactersWithNullTermination());
|
| -}
|
| -
|
| -bool deleteEmptyDirectory(const String& path)
|
| -{
|
| - String filename = path;
|
| - return !!RemoveDirectoryW(filename.charactersWithNullTermination());
|
| -}
|
| -
|
| -String pathByAppendingComponent(const String& path, const String& component)
|
| -{
|
| - Vector<UChar> buffer(MAX_PATH);
|
| -
|
| - if (path.length() + 1 > buffer.size())
|
| - return String();
|
| -
|
| - memcpy(buffer.data(), path.characters(), path.length() * sizeof(UChar));
|
| - buffer[path.length()] = '\0';
|
| -
|
| - String componentCopy = component;
|
| - if (!PathAppendW(buffer.data(), componentCopy.charactersWithNullTermination()))
|
| - return String();
|
| -
|
| - buffer.resize(wcslen(buffer.data()));
|
| -
|
| - return String::adopt(buffer);
|
| -}
|
| -
|
| -#if !USE(CF)
|
| -
|
| -CString fileSystemRepresentation(const String& path)
|
| -{
|
| - const UChar* characters = path.characters();
|
| - int size = WideCharToMultiByte(CP_ACP, 0, characters, path.length(), 0, 0, 0, 0) - 1;
|
| -
|
| - char* buffer;
|
| - CString string = CString::newUninitialized(size, buffer);
|
| -
|
| - WideCharToMultiByte(CP_ACP, 0, characters, path.length(), buffer, size, 0, 0);
|
| -
|
| - return string;
|
| -}
|
| -
|
| -#endif // !USE(CF)
|
| -
|
| -bool makeAllDirectories(const String& path)
|
| -{
|
| - String fullPath = path;
|
| - if (SHCreateDirectoryEx(0, fullPath.charactersWithNullTermination(), 0) != ERROR_SUCCESS) {
|
| - DWORD error = GetLastError();
|
| - if (error != ERROR_FILE_EXISTS && error != ERROR_ALREADY_EXISTS) {
|
| - LOG_ERROR("Failed to create path %s", path.ascii().data());
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -String homeDirectoryPath()
|
| -{
|
| - notImplemented();
|
| - return "";
|
| -}
|
| -
|
| -String pathGetFileName(const String& path)
|
| -{
|
| - return String(::PathFindFileName(String(path).charactersWithNullTermination()));
|
| -}
|
| -
|
| -String directoryName(const String& path)
|
| -{
|
| - String name = path.left(path.length() - pathGetFileName(path).length());
|
| - if (name.characterStartingAt(name.length() - 1) == '\\') {
|
| - // Remove any trailing "\".
|
| - name.truncate(name.length() - 1);
|
| - }
|
| - return name;
|
| -}
|
| -
|
| -static String bundleName()
|
| -{
|
| - DEFINE_STATIC_LOCAL(String, name, (ASCIILiteral("WebKit")));
|
| -
|
| -#if USE(CF)
|
| - static bool initialized;
|
| -
|
| - if (!initialized) {
|
| - initialized = true;
|
| -
|
| - if (CFBundleRef bundle = CFBundleGetMainBundle())
|
| - if (CFTypeRef bundleExecutable = CFBundleGetValueForInfoDictionaryKey(bundle, kCFBundleExecutableKey))
|
| - if (CFGetTypeID(bundleExecutable) == CFStringGetTypeID())
|
| - name = reinterpret_cast<CFStringRef>(bundleExecutable);
|
| - }
|
| -#endif
|
| -
|
| - return name;
|
| -}
|
| -
|
| -static String storageDirectory(DWORD pathIdentifier)
|
| -{
|
| - Vector<UChar> buffer(MAX_PATH);
|
| - if (FAILED(SHGetFolderPathW(0, pathIdentifier | CSIDL_FLAG_CREATE, 0, 0, buffer.data())))
|
| - return String();
|
| - buffer.resize(wcslen(buffer.data()));
|
| - String directory = String::adopt(buffer);
|
| -
|
| - DEFINE_STATIC_LOCAL(String, companyNameDirectory, (ASCIILiteral("Apple Computer\\")));
|
| - directory = pathByAppendingComponent(directory, companyNameDirectory + bundleName());
|
| - if (!makeAllDirectories(directory))
|
| - return String();
|
| -
|
| - return directory;
|
| -}
|
| -
|
| -static String cachedStorageDirectory(DWORD pathIdentifier)
|
| -{
|
| - static HashMap<DWORD, String> directories;
|
| -
|
| - HashMap<DWORD, String>::iterator it = directories.find(pathIdentifier);
|
| - if (it != directories.end())
|
| - return it->value;
|
| -
|
| - String directory = storageDirectory(pathIdentifier);
|
| - directories.add(pathIdentifier, directory);
|
| -
|
| - return directory;
|
| -}
|
| -
|
| -String openTemporaryFile(const String&, PlatformFileHandle& handle)
|
| -{
|
| - handle = INVALID_HANDLE_VALUE;
|
| -
|
| - wchar_t tempPath[MAX_PATH];
|
| - int tempPathLength = ::GetTempPathW(WTF_ARRAY_LENGTH(tempPath), tempPath);
|
| - if (tempPathLength <= 0 || tempPathLength > WTF_ARRAY_LENGTH(tempPath))
|
| - return String();
|
| -
|
| - String proposedPath;
|
| - do {
|
| - wchar_t tempFile[] = L"XXXXXXXX.tmp"; // Use 8.3 style name (more characters aren't helpful due to 8.3 short file names)
|
| - const int randomPartLength = 8;
|
| - cryptographicallyRandomValues(tempFile, randomPartLength * sizeof(wchar_t));
|
| -
|
| - // Limit to valid filesystem characters, also excluding others that could be problematic, like punctuation.
|
| - // don't include both upper and lowercase since Windows file systems are typically not case sensitive.
|
| - const char validChars[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
| - for (int i = 0; i < randomPartLength; ++i)
|
| - tempFile[i] = validChars[tempFile[i] % (sizeof(validChars) - 1)];
|
| -
|
| - ASSERT(wcslen(tempFile) == WTF_ARRAY_LENGTH(tempFile) - 1);
|
| -
|
| - proposedPath = pathByAppendingComponent(tempPath, tempFile);
|
| - if (proposedPath.isEmpty())
|
| - break;
|
| -
|
| - // use CREATE_NEW to avoid overwriting an existing file with the same name
|
| - handle = ::CreateFileW(proposedPath.charactersWithNullTermination(), GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
|
| - } while (!isHandleValid(handle) && GetLastError() == ERROR_ALREADY_EXISTS);
|
| -
|
| - if (!isHandleValid(handle))
|
| - return String();
|
| -
|
| - return proposedPath;
|
| -}
|
| -
|
| -PlatformFileHandle openFile(const String& path, FileOpenMode mode)
|
| -{
|
| - DWORD desiredAccess = 0;
|
| - DWORD creationDisposition = 0;
|
| - switch (mode) {
|
| - case OpenForRead:
|
| - desiredAccess = GENERIC_READ;
|
| - creationDisposition = OPEN_EXISTING;
|
| - break;
|
| - case OpenForWrite:
|
| - desiredAccess = GENERIC_WRITE;
|
| - creationDisposition = CREATE_ALWAYS;
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| -
|
| - String destination = path;
|
| - return CreateFile(destination.charactersWithNullTermination(), desiredAccess, 0, 0, creationDisposition, FILE_ATTRIBUTE_NORMAL, 0);
|
| -}
|
| -
|
| -void closeFile(PlatformFileHandle& handle)
|
| -{
|
| - if (isHandleValid(handle)) {
|
| - ::CloseHandle(handle);
|
| - handle = invalidPlatformFileHandle;
|
| - }
|
| -}
|
| -
|
| -int writeToFile(PlatformFileHandle handle, const char* data, int length)
|
| -{
|
| - if (!isHandleValid(handle))
|
| - return -1;
|
| -
|
| - DWORD bytesWritten;
|
| - bool success = WriteFile(handle, data, length, &bytesWritten, 0);
|
| -
|
| - if (!success)
|
| - return -1;
|
| - return static_cast<int>(bytesWritten);
|
| -}
|
| -
|
| -bool unloadModule(PlatformModule module)
|
| -{
|
| - return ::FreeLibrary(module);
|
| -}
|
| -
|
| -String localUserSpecificStorageDirectory()
|
| -{
|
| - return cachedStorageDirectory(CSIDL_LOCAL_APPDATA);
|
| -}
|
| -
|
| -String roamingUserSpecificStorageDirectory()
|
| -{
|
| - return cachedStorageDirectory(CSIDL_APPDATA);
|
| -}
|
| -
|
| -#if USE(CF)
|
| -
|
| -bool safeCreateFile(const String& path, CFDataRef data)
|
| -{
|
| - // Create a temporary file.
|
| - WCHAR tempDirPath[MAX_PATH];
|
| - if (!GetTempPathW(WTF_ARRAY_LENGTH(tempDirPath), tempDirPath))
|
| - return false;
|
| -
|
| - WCHAR tempPath[MAX_PATH];
|
| - if (!GetTempFileNameW(tempDirPath, L"WEBKIT", 0, tempPath))
|
| - return false;
|
| -
|
| - HANDLE tempFileHandle = CreateFileW(tempPath, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
| - if (tempFileHandle == INVALID_HANDLE_VALUE)
|
| - return false;
|
| -
|
| - // Write the data to this temp file.
|
| - DWORD written;
|
| - if (!WriteFile(tempFileHandle, CFDataGetBytePtr(data), static_cast<DWORD>(CFDataGetLength(data)), &written, 0))
|
| - return false;
|
| -
|
| - CloseHandle(tempFileHandle);
|
| -
|
| - // Copy the temp file to the destination file.
|
| - String destination = path;
|
| - if (!MoveFileExW(tempPath, destination.charactersWithNullTermination(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED))
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -#endif // USE(CF)
|
| -
|
| -Vector<String> listDirectory(const String& directory, const String& filter)
|
| -{
|
| - Vector<String> entries;
|
| -
|
| - PathWalker walker(directory, filter);
|
| - if (!walker.isValid())
|
| - return entries;
|
| -
|
| - do {
|
| - if (walker.data().dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
| - continue;
|
| -
|
| - entries.append(directory + "\\" + reinterpret_cast<const UChar*>(walker.data().cFileName));
|
| - } while (walker.step());
|
| -
|
| - return entries;
|
| -}
|
| -
|
| -} // namespace WebCore
|
|
|