| Index: chrome/browser/drive/drive_api_util.cc
|
| diff --git a/chrome/browser/drive/drive_api_util.cc b/chrome/browser/drive/drive_api_util.cc
|
| deleted file mode 100644
|
| index bd9ba99358fbfae6cb9ce13c8062b4fcb0e042c3..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/drive/drive_api_util.cc
|
| +++ /dev/null
|
| @@ -1,249 +0,0 @@
|
| -// Copyright (c) 2012 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 "chrome/browser/drive/drive_api_util.h"
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/files/file.h"
|
| -#include "base/logging.h"
|
| -#include "base/md5.h"
|
| -#include "base/strings/string16.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/synchronization/cancellation_flag.h"
|
| -#include "base/values.h"
|
| -#include "google_apis/drive/drive_api_parser.h"
|
| -#include "net/base/escape.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "storage/browser/fileapi/file_stream_reader.h"
|
| -#include "third_party/re2/re2/re2.h"
|
| -#include "url/gurl.h"
|
| -
|
| -namespace drive {
|
| -namespace util {
|
| -namespace {
|
| -
|
| -struct HostedDocumentKind {
|
| - const char* mime_type;
|
| - const char* extension;
|
| -};
|
| -
|
| -const HostedDocumentKind kHostedDocumentKinds[] = {
|
| - {kGoogleDocumentMimeType, ".gdoc"},
|
| - {kGoogleSpreadsheetMimeType, ".gsheet"},
|
| - {kGooglePresentationMimeType, ".gslides"},
|
| - {kGoogleDrawingMimeType, ".gdraw"},
|
| - {kGoogleTableMimeType, ".gtable"},
|
| - {kGoogleFormMimeType, ".gform"},
|
| - {kGoogleMapMimeType, ".gmaps"},
|
| -};
|
| -
|
| -const char kUnknownHostedDocumentExtension[] = ".glink";
|
| -
|
| -const int kMd5DigestBufferSize = 512 * 1024; // 512 kB.
|
| -
|
| -} // namespace
|
| -
|
| -std::string EscapeQueryStringValue(const std::string& str) {
|
| - std::string result;
|
| - result.reserve(str.size());
|
| - for (size_t i = 0; i < str.size(); ++i) {
|
| - if (str[i] == '\\' || str[i] == '\'') {
|
| - result.push_back('\\');
|
| - }
|
| - result.push_back(str[i]);
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -std::string TranslateQuery(const std::string& original_query) {
|
| - // In order to handle non-ascii white spaces correctly, convert to UTF16.
|
| - base::string16 query = base::UTF8ToUTF16(original_query);
|
| - const base::string16 kDelimiter(
|
| - base::kWhitespaceUTF16 + base::ASCIIToUTF16("\""));
|
| -
|
| - std::string result;
|
| - for (size_t index = query.find_first_not_of(base::kWhitespaceUTF16);
|
| - index != base::string16::npos;
|
| - index = query.find_first_not_of(base::kWhitespaceUTF16, index)) {
|
| - bool is_exclusion = (query[index] == '-');
|
| - if (is_exclusion)
|
| - ++index;
|
| - if (index == query.length()) {
|
| - // Here, the token is '-' and it should be ignored.
|
| - continue;
|
| - }
|
| -
|
| - size_t begin_token = index;
|
| - base::string16 token;
|
| - if (query[begin_token] == '"') {
|
| - // Quoted query.
|
| - ++begin_token;
|
| - size_t end_token = query.find('"', begin_token);
|
| - if (end_token == base::string16::npos) {
|
| - // This is kind of syntax error, since quoted string isn't finished.
|
| - // However, the query is built by user manually, so here we treat
|
| - // whole remaining string as a token as a fallback, by appending
|
| - // a missing double-quote character.
|
| - end_token = query.length();
|
| - query.push_back('"');
|
| - }
|
| -
|
| - token = query.substr(begin_token, end_token - begin_token);
|
| - index = end_token + 1; // Consume last '"', too.
|
| - } else {
|
| - size_t end_token = query.find_first_of(kDelimiter, begin_token);
|
| - if (end_token == base::string16::npos) {
|
| - end_token = query.length();
|
| - }
|
| -
|
| - token = query.substr(begin_token, end_token - begin_token);
|
| - index = end_token;
|
| - }
|
| -
|
| - if (token.empty()) {
|
| - // Just ignore an empty token.
|
| - continue;
|
| - }
|
| -
|
| - if (!result.empty()) {
|
| - // If there are two or more tokens, need to connect with "and".
|
| - result.append(" and ");
|
| - }
|
| -
|
| - // The meaning of "fullText" should include title, description and content.
|
| - base::StringAppendF(
|
| - &result,
|
| - "%sfullText contains \'%s\'",
|
| - is_exclusion ? "not " : "",
|
| - EscapeQueryStringValue(base::UTF16ToUTF8(token)).c_str());
|
| - }
|
| -
|
| - return result;
|
| -}
|
| -
|
| -std::string CanonicalizeResourceId(const std::string& resource_id) {
|
| - // If resource ID is in the old WAPI format starting with a prefix like
|
| - // "document:", strip it and return the remaining part.
|
| - std::string stripped_resource_id;
|
| - if (RE2::FullMatch(resource_id, "^[a-z-]+(?::|%3A)([\\w-]+)$",
|
| - &stripped_resource_id))
|
| - return stripped_resource_id;
|
| - return resource_id;
|
| -}
|
| -
|
| -std::string GetMd5Digest(const base::FilePath& file_path,
|
| - const base::CancellationFlag* cancellation_flag) {
|
| - base::File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
|
| - if (!file.IsValid())
|
| - return std::string();
|
| -
|
| - base::MD5Context context;
|
| - base::MD5Init(&context);
|
| -
|
| - int64 offset = 0;
|
| - scoped_ptr<char[]> buffer(new char[kMd5DigestBufferSize]);
|
| - while (true) {
|
| - if (cancellation_flag && cancellation_flag->IsSet()) { // Cancelled.
|
| - return std::string();
|
| - }
|
| - int result = file.Read(offset, buffer.get(), kMd5DigestBufferSize);
|
| - if (result < 0) {
|
| - // Found an error.
|
| - return std::string();
|
| - }
|
| -
|
| - if (result == 0) {
|
| - // End of file.
|
| - break;
|
| - }
|
| -
|
| - offset += result;
|
| - base::MD5Update(&context, base::StringPiece(buffer.get(), result));
|
| - }
|
| -
|
| - base::MD5Digest digest;
|
| - base::MD5Final(&digest, &context);
|
| - return base::MD5DigestToBase16(digest);
|
| -}
|
| -
|
| -FileStreamMd5Digester::FileStreamMd5Digester()
|
| - : buffer_(new net::IOBuffer(kMd5DigestBufferSize)) {
|
| -}
|
| -
|
| -FileStreamMd5Digester::~FileStreamMd5Digester() {
|
| -}
|
| -
|
| -void FileStreamMd5Digester::GetMd5Digest(
|
| - scoped_ptr<storage::FileStreamReader> stream_reader,
|
| - const ResultCallback& callback) {
|
| - reader_ = stream_reader.Pass();
|
| - base::MD5Init(&md5_context_);
|
| -
|
| - // Start the read/hash.
|
| - ReadNextChunk(callback);
|
| -}
|
| -
|
| -void FileStreamMd5Digester::ReadNextChunk(const ResultCallback& callback) {
|
| - const int result =
|
| - reader_->Read(buffer_.get(), kMd5DigestBufferSize,
|
| - base::Bind(&FileStreamMd5Digester::OnChunkRead,
|
| - base::Unretained(this), callback));
|
| - if (result != net::ERR_IO_PENDING)
|
| - OnChunkRead(callback, result);
|
| -}
|
| -
|
| -void FileStreamMd5Digester::OnChunkRead(const ResultCallback& callback,
|
| - int bytes_read) {
|
| - if (bytes_read < 0) {
|
| - // Error - just return empty string.
|
| - callback.Run("");
|
| - return;
|
| - } else if (bytes_read == 0) {
|
| - // EOF.
|
| - base::MD5Digest digest;
|
| - base::MD5Final(&digest, &md5_context_);
|
| - std::string result = base::MD5DigestToBase16(digest);
|
| - callback.Run(result);
|
| - return;
|
| - }
|
| -
|
| - // Read data and digest it.
|
| - base::MD5Update(&md5_context_,
|
| - base::StringPiece(buffer_->data(), bytes_read));
|
| -
|
| - // Kick off the next read.
|
| - ReadNextChunk(callback);
|
| -}
|
| -
|
| -std::string GetHostedDocumentExtension(const std::string& mime_type) {
|
| - for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) {
|
| - if (mime_type == kHostedDocumentKinds[i].mime_type)
|
| - return kHostedDocumentKinds[i].extension;
|
| - }
|
| - return kUnknownHostedDocumentExtension;
|
| -}
|
| -
|
| -bool IsKnownHostedDocumentMimeType(const std::string& mime_type) {
|
| - for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) {
|
| - if (mime_type == kHostedDocumentKinds[i].mime_type)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool HasHostedDocumentExtension(const base::FilePath& path) {
|
| - const std::string extension = base::FilePath(path.Extension()).AsUTF8Unsafe();
|
| - for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) {
|
| - if (extension == kHostedDocumentKinds[i].extension)
|
| - return true;
|
| - }
|
| - return extension == kUnknownHostedDocumentExtension;
|
| -}
|
| -
|
| -} // namespace util
|
| -} // namespace drive
|
|
|