summaryrefslogtreecommitdiffstats
path: root/chrome/browser/google_apis/drive_api_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/google_apis/drive_api_util.cc')
-rw-r--r--chrome/browser/google_apis/drive_api_util.cc69
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