// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "webkit/fileapi/file_system_util.h" #include "build/build_config.h" #include "base/file_path.h" #include "base/sys_string_conversions.h" #include "googleurl/src/gurl.h" #include "net/base/escape.h" #include "webkit/fileapi/file_system_types.h" namespace fileapi { static const char kPersistentDir[] = "/persistent/"; static const char kTemporaryDir[] = "/temporary/"; bool CrackFileSystemURL(const GURL& url, GURL* origin_url, FileSystemType* type, FilePath* file_path) { *origin_url = GURL(); *type = kFileSystemTypeUnknown; *file_path = FilePath(); if (url.scheme() != "filesystem") return false; GURL bare_url(url.path()); *origin_url = bare_url.GetOrigin(); // The input URL was malformed, bail out early. if (origin_url->is_empty() || bare_url.path().empty()) return false; std::string path = UnescapeURLComponent(bare_url.path(), UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); if (path.compare(0, strlen(kPersistentDir), kPersistentDir) == 0) { *type = kFileSystemTypePersistent; path = path.substr(strlen(kPersistentDir)); } else if (path.compare(0, strlen(kTemporaryDir), kTemporaryDir) == 0) { *type = kFileSystemTypeTemporary; path = path.substr(strlen(kTemporaryDir)); } else { return false; } // Ensure the path is relative. while (!path.empty() && path[0] == '/') path.erase(0, 1); #if defined(OS_WIN) const FilePath::StringType& sys_path = base::SysUTF8ToWide(path); #elif defined(OS_POSIX) const FilePath::StringType& sys_path = path; #endif *file_path = FilePath(sys_path); return true; } } // namespace fileapi