/src/3rdparty/webkit/Source/WebCore/platform/posix/FileSystemPOSIX.cpp
https://bitbucket.org/ultra_iter/qt-vtl · C++ · 258 lines · 184 code · 43 blank · 31 comment · 52 complexity · 06b168b2a60d3a4c302a665a37a6fdb7 MD5 · raw file
- /*
- * Copyright (C) 2007, 2008 Apple Inc. 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 "PlatformString.h"
- #include <dirent.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <fnmatch.h>
- #include <libgen.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <wtf/text/CString.h>
- namespace WebCore {
- bool fileExists(const String& path)
- {
- if (path.isNull())
- return false;
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- struct stat fileInfo;
- // stat(...) returns 0 on successful stat'ing of the file, and non-zero in any case where the file doesn't exist or cannot be accessed
- return !stat(fsRep.data(), &fileInfo);
- }
- bool deleteFile(const String& path)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- // unlink(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
- return !unlink(fsRep.data());
- }
- PlatformFileHandle openFile(const String& path, FileOpenMode mode)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (fsRep.isNull())
- return invalidPlatformFileHandle;
- int platformFlag = 0;
- if (mode == OpenForRead)
- platformFlag |= O_RDONLY;
- else if (mode == OpenForWrite)
- platformFlag |= (O_WRONLY | O_CREAT | O_TRUNC);
- return open(fsRep.data(), platformFlag, 0666);
- }
- void closeFile(PlatformFileHandle& handle)
- {
- if (isHandleValid(handle)) {
- close(handle);
- handle = invalidPlatformFileHandle;
- }
- }
- long long seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin)
- {
- int whence = SEEK_SET;
- switch (origin) {
- case SeekFromBeginning:
- whence = SEEK_SET;
- break;
- case SeekFromCurrent:
- whence = SEEK_CUR;
- break;
- case SeekFromEnd:
- whence = SEEK_END;
- break;
- default:
- ASSERT_NOT_REACHED();
- }
- return static_cast<long long>(lseek(handle, offset, whence));
- }
- bool truncateFile(PlatformFileHandle handle, long long offset)
- {
- // ftruncate returns 0 to indicate the success.
- return !ftruncate(handle, offset);
- }
- int writeToFile(PlatformFileHandle handle, const char* data, int length)
- {
- do {
- int bytesWritten = write(handle, data, static_cast<size_t>(length));
- if (bytesWritten >= 0)
- return bytesWritten;
- } while (errno == EINTR);
- return -1;
- }
- int readFromFile(PlatformFileHandle handle, char* data, int length)
- {
- do {
- int bytesRead = read(handle, data, static_cast<size_t>(length));
- if (bytesRead >= 0)
- return bytesRead;
- } while (errno == EINTR);
- return -1;
- }
- bool deleteEmptyDirectory(const String& path)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- // rmdir(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
- return !rmdir(fsRep.data());
- }
- bool getFileSize(const String& path, long long& result)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- struct stat fileInfo;
- if (stat(fsRep.data(), &fileInfo))
- return false;
- result = fileInfo.st_size;
- return true;
- }
- bool getFileModificationTime(const String& path, time_t& result)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- struct stat fileInfo;
- if (stat(fsRep.data(), &fileInfo))
- return false;
- result = fileInfo.st_mtime;
- return true;
- }
- String pathByAppendingComponent(const String& path, const String& component)
- {
- if (path.endsWith("/"))
- return path + component;
- else
- return path + "/" + component;
- }
- bool makeAllDirectories(const String& path)
- {
- CString fullPath = fileSystemRepresentation(path);
- if (!access(fullPath.data(), F_OK))
- return true;
- char* p = fullPath.mutableData() + 1;
- int length = fullPath.length();
- if(p[length - 1] == '/')
- p[length - 1] = '\0';
- for (; *p; ++p)
- if (*p == '/') {
- *p = '\0';
- if (access(fullPath.data(), F_OK))
- if (mkdir(fullPath.data(), S_IRWXU))
- return false;
- *p = '/';
- }
- if (access(fullPath.data(), F_OK))
- if (mkdir(fullPath.data(), S_IRWXU))
- return false;
- return true;
- }
- String pathGetFileName(const String& path)
- {
- return path.substring(path.reverseFind('/') + 1);
- }
- String directoryName(const String& path)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return String();
- return dirname(fsRep.mutableData());
- }
- #if !PLATFORM(EFL)
- Vector<String> listDirectory(const String& path, const String& filter)
- {
- Vector<String> entries;
- CString cpath = path.utf8();
- CString cfilter = filter.utf8();
- DIR* dir = opendir(cpath.data());
- if (dir) {
- struct dirent* dp;
- while ((dp = readdir(dir))) {
- const char* name = dp->d_name;
- if (!strcmp(name, ".") || !strcmp(name, ".."))
- continue;
- if (fnmatch(cfilter.data(), name, 0))
- continue;
- char filePath[1024];
- if (static_cast<int>(sizeof(filePath) - 1) < snprintf(filePath, sizeof(filePath), "%s/%s", cpath.data(), name))
- continue; // buffer overflow
- entries.append(filePath);
- }
- closedir(dir);
- }
- return entries;
- }
- #endif
- } // namespace WebCore