| Index: chrome/browser/google_apis/drive_api_util.cc
|
| diff --git a/chrome/browser/google_apis/drive_api_util.cc b/chrome/browser/google_apis/drive_api_util.cc
|
| index 10597c3c7e5fe870bcee90b711ba50f4555fc93f..815e37d0b5dc44b5467f6c55a79c3bac443302cf 100644
|
| --- a/chrome/browser/google_apis/drive_api_util.cc
|
| +++ b/chrome/browser/google_apis/drive_api_util.cc
|
| @@ -5,7 +5,10 @@
|
| #include "chrome/browser/google_apis/drive_api_util.h"
|
|
|
| #include "base/command_line.h"
|
| +#include "base/string16.h"
|
| #include "base/string_util.h"
|
| +#include "base/stringprintf.h"
|
| +#include "base/utf_string_conversions.h"
|
| #include "chrome/browser/google_apis/drive_switches.h"
|
|
|
| namespace google_apis {
|
| @@ -27,6 +30,72 @@ std::string EscapeQueryStringValue(const std::string& str) {
|
| 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 = UTF8ToUTF16(original_query);
|
| + const base::string16 kDelimiter(
|
| + kWhitespaceUTF16 + base::string16(1, static_cast<char16>('"')));
|
| +
|
| + std::string result;
|
| + for (size_t index = query.find_first_not_of(kWhitespaceUTF16);
|
| + index != base::string16::npos;
|
| + index = query.find_first_not_of(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(UTF16ToUTF8(token)).c_str());
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| } // namespace util
|
| } // namespace drive
|
| } // namespace google_apis
|
|
|