Index: cloud_print/service/win/service_state.cc |
diff --git a/cloud_print/service/win/service_state.cc b/cloud_print/service/win/service_state.cc |
deleted file mode 100644 |
index 864100001e3b75670e8cdccabd5e902b925e9a1a..0000000000000000000000000000000000000000 |
--- a/cloud_print/service/win/service_state.cc |
+++ /dev/null |
@@ -1,211 +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 "cloud_print/service/win/service_state.h" |
- |
-#include "base/json/json_reader.h" |
-#include "base/json/json_writer.h" |
-#include "base/logging.h" |
-#include "base/message_loop.h" |
-#include "base/string_util.h" |
-#include "base/utf_string_conversions.h" |
-#include "net/base/escape.h" |
-#include "net/base/io_buffer.h" |
-#include "net/url_request/url_request.h" |
-#include "net/url_request/url_request_context.h" |
-#include "net/url_request/url_request_context_builder.h" |
- |
-namespace { |
- |
-const char kCloudPrintJsonName[] = "cloud_print"; |
-const char kEnabledOptionName[] = "enabled"; |
- |
-const char kEmailOptionName[] = "email"; |
-const char kPasswordOptionName[] = "password"; |
-const char kProxyIdOptionName[] = "proxy_id"; |
-const char kRobotEmailOptionName[] = "robot_email"; |
-const char kRobotTokenOptionName[] = "robot_refresh_token"; |
-const char kAuthTokenOptionName[] = "auth_token"; |
-const char kXmppAuthTokenOptionName[] = "xmpp_auth_token"; |
- |
-const char kClientLoginUrl[] = "https://www.google.com/accounts/ClientLogin"; |
- |
-const int64 kRequestTimeoutMs = 10 * 1000; |
- |
-class ServiceStateURLRequestDelegate : public net::URLRequest::Delegate { |
- public: |
- virtual void OnResponseStarted(net::URLRequest* request) { |
- if (request->GetResponseCode() == 200) { |
- Read(request); |
- if (request->status().is_io_pending()) |
- return; |
- } |
- request->Cancel(); |
- }; |
- |
- virtual void OnReadCompleted(net::URLRequest* request, int bytes_read) { |
- Read(request); |
- if (!request->status().is_io_pending()) |
- MessageLoop::current()->Quit(); |
- }; |
- |
- const std::string& data() const { |
- return data_; |
- } |
- |
- private: |
- void Read(net::URLRequest* request) { |
- // Read as many bytes as are available synchronously. |
- const int kBufSize = 100000; |
- scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize)); |
- int num_bytes = 0; |
- while (request->Read(buf, kBufSize, &num_bytes)) { |
- data_.append(buf->data(), buf->data() + num_bytes); |
- } |
- } |
- std::string data_; |
-}; |
- |
- |
-void SetNotEmptyJsonString(base::DictionaryValue* dictionary, |
- const std::string& name, |
- const std::string& value) { |
- if (!value.empty()) |
- dictionary->SetString(name, value); |
-} |
- |
-} // namespace |
- |
-ServiceState::ServiceState() { |
- Reset(); |
-} |
- |
-ServiceState::~ServiceState() { |
-} |
- |
-void ServiceState::Reset() { |
- email_.clear(); |
- proxy_id_.clear(); |
- robot_email_.clear(); |
- robot_token_.clear(); |
- auth_token_.clear(); |
- xmpp_auth_token_.clear(); |
-} |
- |
-bool ServiceState::FromString(const std::string& json) { |
- Reset(); |
- scoped_ptr<base::Value> data(base::JSONReader::Read(json)); |
- if (!data.get()) |
- return false; |
- |
- const base::DictionaryValue* services = NULL; |
- if (!data->GetAsDictionary(&services)) |
- return false; |
- |
- base::DictionaryValue* cloud_print = NULL; |
- if (!services->GetDictionary(kCloudPrintJsonName, &cloud_print)) |
- return false; |
- |
- bool valid_file = true; |
- // Don't exit on fail. Collect all data for re-use by user later. |
- if (!cloud_print->GetBoolean(kEnabledOptionName, &valid_file)) |
- valid_file = false; |
- |
- cloud_print->GetString(kEmailOptionName, &email_); |
- cloud_print->GetString(kProxyIdOptionName, &proxy_id_); |
- cloud_print->GetString(kRobotEmailOptionName, &robot_email_); |
- cloud_print->GetString(kRobotTokenOptionName, &robot_token_); |
- cloud_print->GetString(kAuthTokenOptionName, &auth_token_); |
- cloud_print->GetString(kXmppAuthTokenOptionName, &xmpp_auth_token_); |
- |
- return valid_file && IsValid(); |
-} |
- |
-bool ServiceState::IsValid() const { |
- if (email_.empty() || proxy_id_.empty()) |
- return false; |
- bool valid_robot = !robot_email_.empty() && !robot_token_.empty(); |
- bool valid_auth = !auth_token_.empty() && !xmpp_auth_token_.empty(); |
- return valid_robot || valid_auth; |
-} |
- |
-std::string ServiceState::ToString() { |
- scoped_ptr<base::DictionaryValue> services(new DictionaryValue()); |
- |
- scoped_ptr<base::DictionaryValue> cloud_print(new DictionaryValue()); |
- cloud_print->SetBoolean(kEnabledOptionName, true); |
- |
- SetNotEmptyJsonString(cloud_print.get(), kEmailOptionName, email_); |
- SetNotEmptyJsonString(cloud_print.get(), kProxyIdOptionName, proxy_id_); |
- SetNotEmptyJsonString(cloud_print.get(), kRobotEmailOptionName, robot_email_); |
- SetNotEmptyJsonString(cloud_print.get(), kRobotTokenOptionName, robot_token_); |
- SetNotEmptyJsonString(cloud_print.get(), kAuthTokenOptionName, auth_token_); |
- SetNotEmptyJsonString(cloud_print.get(), kXmppAuthTokenOptionName, |
- xmpp_auth_token_); |
- |
- services->Set(kCloudPrintJsonName, cloud_print.release()); |
- |
- std::string json; |
- base::JSONWriter::WriteWithOptions(services.get(), |
- base::JSONWriter::OPTIONS_PRETTY_PRINT, |
- &json); |
- return json; |
-} |
- |
-std::string ServiceState::LoginToGoogle(const std::string& service, |
- const std::string& email, |
- const std::string& password) { |
- MessageLoop loop(MessageLoop::TYPE_IO); |
- |
- net::URLRequestContextBuilder builder; |
- scoped_ptr<net::URLRequestContext> context(builder.Build()); |
- |
- ServiceStateURLRequestDelegate fetcher_delegate; |
- GURL url(kClientLoginUrl); |
- |
- std::string post_body; |
- post_body += "accountType=GOOGLE"; |
- post_body += "&Email=" + net::EscapeUrlEncodedData(email, true); |
- post_body += "&Passwd=" + net::EscapeUrlEncodedData(password, true); |
- post_body += "&source=" + net::EscapeUrlEncodedData("CP-Service", true); |
- post_body += "&service=" + net::EscapeUrlEncodedData(service, true); |
- |
- net::URLRequest request(url, &fetcher_delegate); |
- |
- request.AppendBytesToUpload(post_body.c_str(), post_body.size()); |
- request.SetExtraRequestHeaderByName( |
- "Content-Type", "application/x-www-form-urlencoded", true); |
- request.set_context(context.get()); |
- request.set_method("POST"); |
- request.Start(); |
- |
- MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, MessageLoop::QuitClosure(), kRequestTimeoutMs); |
- |
- MessageLoop::current()->Run(); |
- |
- const char kAuthStart[] = "Auth="; |
- std::vector<std::string> lines; |
- Tokenize(fetcher_delegate.data(), "\r\n", &lines); |
- for (size_t i = 0; i < lines.size(); ++i) { |
- std::vector<std::string> tokens; |
- if (StartsWithASCII(lines[i], kAuthStart, false)) |
- return lines[i].substr(arraysize(kAuthStart) - 1); |
- } |
- |
- return std::string(); |
-} |
- |
-bool ServiceState::Configure(const std::string& email, |
- const std::string& password, |
- const std::string& proxy_id) { |
- robot_token_.clear(); |
- robot_email_.clear(); |
- email_ = email; |
- proxy_id_ = proxy_id; |
- auth_token_ = LoginToGoogle("cloudprint", email_, password); |
- xmpp_auth_token_ = LoginToGoogle("chromiumsync", email_, password); |
- return IsValid(); |
-} |
- |