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 |