1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. Use of this 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// source code is governed by a BSD-style license that can be found in the 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "webkit/glue/webfileutilities_impl.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/file_stream.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webkit_glue.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebString; 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace webkit_glue { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebFileUtilitiesImpl::WebFileUtilitiesImpl() 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : sandbox_enabled_(true) { 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebFileUtilitiesImpl::~WebFileUtilitiesImpl() { 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid WebFileUtilitiesImpl::revealFolderInOS(const WebString& path) { 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NOTREACHED(); 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::fileExists(const WebString& path) { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath::StringType file_path = WebStringToFilePathString(path); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_util::PathExists(FilePath(file_path)); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::deleteFile(const WebString& path) { 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::deleteEmptyDirectory(const WebString& path) { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::getFileSize(const WebString& path, 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick long long& result) { 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (sandbox_enabled_) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_util::GetFileSize(WebStringToFilePath(path), 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<int64*>(&result)); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::getFileModificationTime(const WebString& path, 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick double& result) { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (sandbox_enabled_) { 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::PlatformFileInfo info; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!file_util::GetFileInfo(WebStringToFilePath(path), &info)) 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result = info.last_modified.ToDoubleT(); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebString WebFileUtilitiesImpl::directoryName(const WebString& path) { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_path(WebStringToFilePathString(path)); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FilePathToWebString(file_path.DirName()); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebString WebFileUtilitiesImpl::pathByAppendingComponent( 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WebString& webkit_path, 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WebString& webkit_component) { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath path(WebStringToFilePathString(webkit_path)); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath component(WebStringToFilePathString(webkit_component)); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath combined_path = path.Append(component); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FilePathStringToWebString(combined_path.value()); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::makeAllDirectories(const WebString& path) { 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!sandbox_enabled_); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath::StringType file_path = WebStringToFilePathString(path); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_util::CreateDirectory(FilePath(file_path)); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebString WebFileUtilitiesImpl::getAbsolutePath(const WebString& path) { 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_path(WebStringToFilePathString(path)); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::AbsolutePath(&file_path); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FilePathStringToWebString(file_path.value()); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::isDirectory(const WebString& path) { 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_path(WebStringToFilePathString(path)); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_util::DirectoryExists(file_path); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebKit::WebURL WebFileUtilitiesImpl::filePathToURL(const WebString& path) { 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return net::FilePathToFileURL(WebStringToFilePath(path)); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::PlatformFile WebFileUtilitiesImpl::openFile(const WebString& path, 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int mode) { 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (sandbox_enabled_) { 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return base::kInvalidPlatformFileValue; 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return base::CreatePlatformFile( 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebStringToFilePath(path), 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (mode == 0) ? (base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ) 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : (base::PLATFORM_FILE_CREATE_ALWAYS | 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::PLATFORM_FILE_WRITE), 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, NULL); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WebFileUtilitiesImpl::closeFile(base::PlatformFile& handle) { 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (handle == base::kInvalidPlatformFileValue) 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (base::ClosePlatformFile(handle)) 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle = base::kInvalidPlatformFileValue; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricklong long WebFileUtilitiesImpl::seekFile(base::PlatformFile handle, 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick long long offset, 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int origin) { 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (handle == base::kInvalidPlatformFileValue) 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return -1; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::FileStream file_stream(handle, 0); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_stream.Seek(static_cast<net::Whence>(origin), offset); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool WebFileUtilitiesImpl::truncateFile(base::PlatformFile handle, 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick long long offset) { 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (handle == base::kInvalidPlatformFileValue || offset < 0) 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::FileStream file_stream(handle, base::PLATFORM_FILE_WRITE); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_stream.Truncate(offset) >= 0; 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint WebFileUtilitiesImpl::readFromFile(base::PlatformFile handle, 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick char* data, 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int length) { 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (handle == base::kInvalidPlatformFileValue || !data || length <= 0) 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return -1; 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string buffer; 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch buffer.resize(length); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::FileStream file_stream(handle, base::PLATFORM_FILE_READ); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_stream.Read(data, length, NULL); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint WebFileUtilitiesImpl::writeToFile(base::PlatformFile handle, 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char* data, 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int length) { 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (handle == base::kInvalidPlatformFileValue || !data || length <= 0) 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return -1; 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::FileStream file_stream(handle, base::PLATFORM_FILE_WRITE); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return file_stream.Write(data, length, NULL); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace webkit_glue 163