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