diff options
Diffstat (limited to 'chrome/browser/google_apis/drive_api_util.cc')
-rw-r--r-- | chrome/browser/google_apis/drive_api_util.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/chrome/browser/google_apis/drive_api_util.cc b/chrome/browser/google_apis/drive_api_util.cc index 10597c3..815e37d 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 |