| Index: chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
|
| diff --git a/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc b/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
|
| index e3e893a385391be7b3bd0fd449a948677c0a015d..ca2ee50b08b116d136080bbadec9d743eb735efd 100644
|
| --- a/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
|
| +++ b/chrome/browser/extensions/api/gcd_private/gcd_private_api.cc
|
| @@ -100,12 +100,10 @@ class GcdPrivateAPIImpl : public EventRouter::Observer,
|
|
|
| typedef base::Callback<void(int session_id,
|
| api::gcd_private::Status status,
|
| - const std::string& code,
|
| - api::gcd_private::ConfirmationType type)>
|
| - ConfirmationCodeCallback;
|
| + const std::vector<api::gcd_private::PairingType>&
|
| + pairing_types)> EstablishSessionCallback;
|
|
|
| - typedef base::Callback<void(api::gcd_private::Status status)>
|
| - SessionEstablishedCallback;
|
| + typedef base::Callback<void(api::gcd_private::Status status)> SessionCallback;
|
|
|
| typedef base::Callback<void(api::gcd_private::Status status,
|
| const base::DictionaryValue& response)>
|
| @@ -120,16 +118,20 @@ class GcdPrivateAPIImpl : public EventRouter::Observer,
|
|
|
| void EstablishSession(const std::string& ip_address,
|
| int port,
|
| - ConfirmationCodeCallback callback);
|
| + const EstablishSessionCallback& callback);
|
| +
|
| + void StartPairing(int session_id,
|
| + api::gcd_private::PairingType pairing_type,
|
| + const SessionCallback& callback);
|
|
|
| void ConfirmCode(int session_id,
|
| const std::string& code,
|
| - SessionEstablishedCallback callback);
|
| + const SessionCallback& callback);
|
|
|
| void SendMessage(int session_id,
|
| const std::string& api,
|
| const base::DictionaryValue& input,
|
| - MessageResponseCallback callback);
|
| + const MessageResponseCallback& callback);
|
|
|
| void RequestWifiPassword(const std::string& ssid,
|
| const SuccessCallback& callback);
|
| @@ -142,9 +144,6 @@ class GcdPrivateAPIImpl : public EventRouter::Observer,
|
| typedef std::map<std::string /* id_string */,
|
| linked_ptr<api::gcd_private::GCDDevice> > GCDDeviceMap;
|
|
|
| - typedef std::map<int /* session id*/, linked_ptr<GcdPrivateSessionHolder> >
|
| - GCDSessionMap;
|
| -
|
| typedef std::map<std::string /* ssid */, std::string /* password */>
|
| PasswordMap;
|
|
|
| @@ -179,7 +178,7 @@ class GcdPrivateAPIImpl : public EventRouter::Observer,
|
| scoped_ptr<local_discovery::PrivetDeviceLister> privet_device_lister_;
|
| GCDDeviceMap known_devices_;
|
|
|
| - GCDSessionMap sessions_;
|
| + std::map<int, linked_ptr<local_discovery::PrivetV3Session>> sessions_;
|
| int last_session_id_;
|
|
|
| content::BrowserContext* const browser_context_;
|
| @@ -190,71 +189,6 @@ class GcdPrivateAPIImpl : public EventRouter::Observer,
|
| PasswordMap wifi_passwords_;
|
| };
|
|
|
| -class GcdPrivateRequest : public local_discovery::PrivetV3Session::Request {
|
| - public:
|
| - GcdPrivateRequest(const std::string& api,
|
| - const base::DictionaryValue& input,
|
| - const GcdPrivateAPIImpl::MessageResponseCallback& callback,
|
| - GcdPrivateSessionHolder* session_holder);
|
| - ~GcdPrivateRequest() override;
|
| -
|
| - // local_discovery::PrivetV3Session::Request implementation.
|
| - std::string GetName() override;
|
| - const base::DictionaryValue& GetInput() override;
|
| - void OnError() override;
|
| - void OnParsedJson(const base::DictionaryValue& value,
|
| - bool has_error) override;
|
| -
|
| - void RunCallback(gcd_private::Status status,
|
| - const base::DictionaryValue& value);
|
| -
|
| - private:
|
| - std::string api_;
|
| - scoped_ptr<base::DictionaryValue> input_;
|
| - GcdPrivateAPIImpl::MessageResponseCallback callback_;
|
| - GcdPrivateSessionHolder* session_holder_;
|
| -};
|
| -
|
| -class GcdPrivateSessionHolder
|
| - : public local_discovery::PrivetV3Session::Delegate {
|
| - public:
|
| - typedef base::Callback<void(api::gcd_private::Status status,
|
| - const std::string& code,
|
| - api::gcd_private::ConfirmationType type)>
|
| - ConfirmationCodeCallback;
|
| -
|
| - GcdPrivateSessionHolder(const std::string& ip_address,
|
| - int port,
|
| - net::URLRequestContextGetter* request_context);
|
| - ~GcdPrivateSessionHolder() override;
|
| -
|
| - void Start(const ConfirmationCodeCallback& callback);
|
| -
|
| - void ConfirmCode(
|
| - const std::string& code,
|
| - const GcdPrivateAPIImpl::SessionEstablishedCallback& callback);
|
| -
|
| - void SendMessage(const std::string& api,
|
| - const base::DictionaryValue& input,
|
| - GcdPrivateAPIImpl::MessageResponseCallback callback);
|
| -
|
| - void DeleteRequest(GcdPrivateRequest* request);
|
| -
|
| - private:
|
| - // local_discovery::PrivetV3Session::Delegate implementation.
|
| - void OnSetupConfirmationNeeded(
|
| - const std::string& confirmation_code,
|
| - api::gcd_private::ConfirmationType confirmation_type) override;
|
| - void OnSessionStatus(api::gcd_private::Status status) override;
|
| -
|
| - scoped_ptr<local_discovery::PrivetHTTPClient> http_client_;
|
| - scoped_ptr<local_discovery::PrivetV3Session> privet_session_;
|
| - typedef ScopedVector<GcdPrivateRequest> RequestVector;
|
| - RequestVector requests_;
|
| -
|
| - ConfirmationCodeCallback confirm_callback_;
|
| - GcdPrivateAPIImpl::SessionEstablishedCallback session_established_callback_;
|
| -};
|
|
|
| GcdPrivateAPIImpl::GcdPrivateAPIImpl(content::BrowserContext* context)
|
| : num_device_listeners_(0), last_session_id_(0), browser_context_(context) {
|
| @@ -362,26 +296,50 @@ bool GcdPrivateAPIImpl::QueryForDevices() {
|
| return true;
|
| }
|
|
|
| -void GcdPrivateAPIImpl::EstablishSession(const std::string& ip_address,
|
| - int port,
|
| - ConfirmationCodeCallback callback) {
|
| +void GcdPrivateAPIImpl::EstablishSession(
|
| + const std::string& ip_address,
|
| + int port,
|
| + const EstablishSessionCallback& callback) {
|
| + std::string host_string;
|
| + net::IPAddressNumber address_number;
|
| +
|
| + if (net::ParseIPLiteralToNumber(ip_address, &address_number) &&
|
| + address_number.size() == net::kIPv6AddressSize) {
|
| + host_string = base::StringPrintf("[%s]", ip_address.c_str());
|
| + } else {
|
| + host_string = ip_address;
|
| + }
|
| +
|
| + scoped_ptr<local_discovery::PrivetHTTPClient> http_client(
|
| + new local_discovery::PrivetHTTPClientImpl(
|
| + "", net::HostPortPair(host_string, port),
|
| + browser_context_->GetRequestContext()));
|
| +
|
| int session_id = last_session_id_++;
|
| - linked_ptr<GcdPrivateSessionHolder> session_handler(
|
| - new GcdPrivateSessionHolder(
|
| - ip_address, port, browser_context_->GetRequestContext()));
|
| + linked_ptr<local_discovery::PrivetV3Session> session_handler(
|
| + new local_discovery::PrivetV3Session(http_client.Pass()));
|
| sessions_[session_id] = session_handler;
|
| - session_handler->Start(base::Bind(callback, session_id));
|
| + session_handler->Init(base::Bind(callback, session_id));
|
| +}
|
| +
|
| +void GcdPrivateAPIImpl::StartPairing(int session_id,
|
| + api::gcd_private::PairingType pairing_type,
|
| + const SessionCallback& callback) {
|
| + auto found = sessions_.find(session_id);
|
| +
|
| + if (found == sessions_.end())
|
| + return callback.Run(gcd_private::STATUS_UNKNOWNSESSIONERROR);
|
| +
|
| + found->second->StartPairing(pairing_type, callback);
|
| }
|
|
|
| void GcdPrivateAPIImpl::ConfirmCode(int session_id,
|
| const std::string& code,
|
| - SessionEstablishedCallback callback) {
|
| - GCDSessionMap::iterator found = sessions_.find(session_id);
|
| + const SessionCallback& callback) {
|
| + auto found = sessions_.find(session_id);
|
|
|
| - if (found == sessions_.end()) {
|
| - callback.Run(gcd_private::STATUS_UNKNOWNSESSIONERROR);
|
| - return;
|
| - }
|
| + if (found == sessions_.end())
|
| + return callback.Run(gcd_private::STATUS_UNKNOWNSESSIONERROR);
|
|
|
| found->second->ConfirmCode(code, callback);
|
| }
|
| @@ -389,7 +347,7 @@ void GcdPrivateAPIImpl::ConfirmCode(int session_id,
|
| void GcdPrivateAPIImpl::SendMessage(int session_id,
|
| const std::string& api,
|
| const base::DictionaryValue& input,
|
| - MessageResponseCallback callback) {
|
| + const MessageResponseCallback& callback) {
|
| const base::DictionaryValue* input_actual = &input;
|
| scoped_ptr<base::DictionaryValue> input_cloned;
|
|
|
| @@ -423,7 +381,7 @@ void GcdPrivateAPIImpl::SendMessage(int session_id,
|
| }
|
| }
|
|
|
| - GCDSessionMap::iterator found = sessions_.find(session_id);
|
| + auto found = sessions_.find(session_id);
|
|
|
| if (found == sessions_.end()) {
|
| callback.Run(gcd_private::STATUS_UNKNOWNSESSIONERROR,
|
| @@ -487,127 +445,7 @@ scoped_ptr<base::ListValue> GcdPrivateAPIImpl::GetPrefetchedSSIDList() {
|
| return retval.Pass();
|
| }
|
|
|
| -GcdPrivateRequest::GcdPrivateRequest(
|
| - const std::string& api,
|
| - const base::DictionaryValue& input,
|
| - const GcdPrivateAPIImpl::MessageResponseCallback& callback,
|
| - GcdPrivateSessionHolder* session_holder)
|
| - : api_(api),
|
| - input_(input.DeepCopy()),
|
| - callback_(callback),
|
| - session_holder_(session_holder) {
|
| -}
|
| -
|
| -GcdPrivateRequest::~GcdPrivateRequest() {
|
| -}
|
| -
|
| -std::string GcdPrivateRequest::GetName() {
|
| - return api_;
|
| -}
|
| -
|
| -const base::DictionaryValue& GcdPrivateRequest::GetInput() {
|
| - return *input_;
|
| -}
|
| -
|
| -void GcdPrivateRequest::OnError() {
|
| - RunCallback(gcd_private::STATUS_CONNECTIONERROR, base::DictionaryValue());
|
| - session_holder_->DeleteRequest(this);
|
| -}
|
| -
|
| -void GcdPrivateRequest::OnParsedJson(const base::DictionaryValue& value,
|
| - bool has_error) {
|
| - RunCallback(gcd_private::STATUS_SUCCESS, value);
|
| - session_holder_->DeleteRequest(this);
|
| -}
|
| -
|
| -void GcdPrivateRequest::RunCallback(gcd_private::Status status,
|
| - const base::DictionaryValue& value) {
|
| - if (callback_.is_null())
|
| - return;
|
| - callback_.Run(status, value);
|
| - callback_.Reset();
|
| -}
|
| -
|
| -GcdPrivateSessionHolder::GcdPrivateSessionHolder(
|
| - const std::string& ip_address,
|
| - int port,
|
| - net::URLRequestContextGetter* request_context) {
|
| - std::string host_string;
|
| - net::IPAddressNumber address_number;
|
| -
|
| - if (net::ParseIPLiteralToNumber(ip_address, &address_number) &&
|
| - address_number.size() == net::kIPv6AddressSize) {
|
| - host_string = base::StringPrintf("[%s]", ip_address.c_str());
|
| - } else {
|
| - host_string = ip_address;
|
| - }
|
|
|
| - http_client_.reset(new local_discovery::PrivetHTTPClientImpl(
|
| - "", net::HostPortPair(host_string, port), request_context));
|
| -}
|
| -
|
| -GcdPrivateSessionHolder::~GcdPrivateSessionHolder() {
|
| -}
|
| -
|
| -void GcdPrivateSessionHolder::Start(const ConfirmationCodeCallback& callback) {
|
| - confirm_callback_ = callback;
|
| -
|
| - privet_session_.reset(
|
| - new local_discovery::PrivetV3Session(http_client_.Pass(), this));
|
| - privet_session_->Start();
|
| -}
|
| -
|
| -void GcdPrivateSessionHolder::ConfirmCode(
|
| - const std::string& code,
|
| - const GcdPrivateAPIImpl::SessionEstablishedCallback& callback) {
|
| - session_established_callback_ = callback;
|
| - privet_session_->ConfirmCode(code);
|
| -}
|
| -
|
| -void GcdPrivateSessionHolder::SendMessage(
|
| - const std::string& api,
|
| - const base::DictionaryValue& input,
|
| - GcdPrivateAPIImpl::MessageResponseCallback callback) {
|
| - GcdPrivateRequest* request =
|
| - new GcdPrivateRequest(api, input, callback, this);
|
| - requests_.push_back(request);
|
| - privet_session_->StartRequest(request);
|
| -}
|
| -
|
| -void GcdPrivateSessionHolder::DeleteRequest(GcdPrivateRequest* request) {
|
| - // TODO(noamsml): Does this need to be optimized?
|
| - for (RequestVector::iterator i = requests_.begin(); i != requests_.end();
|
| - i++) {
|
| - if (*i == request) {
|
| - requests_.erase(i);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void GcdPrivateSessionHolder::OnSetupConfirmationNeeded(
|
| - const std::string& confirmation_code,
|
| - gcd_private::ConfirmationType confirmation_type) {
|
| - if (confirm_callback_.is_null())
|
| - return;
|
| - confirm_callback_.Run(
|
| - gcd_private::STATUS_SUCCESS, confirmation_code, confirmation_type);
|
| - confirm_callback_.Reset();
|
| -}
|
| -
|
| -void GcdPrivateSessionHolder::OnSessionStatus(gcd_private::Status status) {
|
| - if (!session_established_callback_.is_null()) {
|
| - session_established_callback_.Run(status);
|
| - session_established_callback_.Reset();
|
| - }
|
| - // Fail all requests created before session established.
|
| - RequestVector tmp_requests;
|
| - tmp_requests.swap(requests_);
|
| - for (GcdPrivateRequest* request : tmp_requests) {
|
| - request->RunCallback(gcd_private::STATUS_SESSIONERROR,
|
| - base::DictionaryValue());
|
| - }
|
| -}
|
|
|
| GcdPrivateAPI::GcdPrivateAPI(content::BrowserContext* context)
|
| : impl_(new GcdPrivateAPIImpl(context)) {
|
| @@ -771,29 +609,47 @@ bool GcdPrivateEstablishSessionFunction::RunAsync() {
|
|
|
| GcdPrivateAPIImpl* gcd_api = GcdPrivateAPIImpl::Get(GetProfile());
|
|
|
| - gcd_api->EstablishSession(
|
| - params->ip_address,
|
| - params->port,
|
| - base::Bind(&GcdPrivateEstablishSessionFunction::OnConfirmCodeCallback,
|
| - this));
|
| + GcdPrivateAPIImpl::EstablishSessionCallback callback = base::Bind(
|
| + &GcdPrivateEstablishSessionFunction::OnSessionInitialized, this);
|
| + gcd_api->EstablishSession(params->ip_address, params->port, callback);
|
|
|
| return true;
|
| }
|
|
|
| -void GcdPrivateEstablishSessionFunction::OnConfirmCodeCallback(
|
| +void GcdPrivateEstablishSessionFunction::OnSessionInitialized(
|
| int session_id,
|
| - gcd_private::Status status,
|
| - const std::string& confirm_code,
|
| - gcd_private::ConfirmationType confirmation_type) {
|
| - gcd_private::ConfirmationInfo info;
|
| -
|
| - info.type = confirmation_type;
|
| - if (!confirm_code.empty()) {
|
| - info.code.reset(new std::string(confirm_code));
|
| - }
|
| + api::gcd_private::Status status,
|
| + const std::vector<api::gcd_private::PairingType>& pairing_types) {
|
| + results_ = gcd_private::EstablishSession::Results::Create(session_id, status,
|
| + pairing_types);
|
| + SendResponse(true);
|
| +}
|
| +
|
| +GcdPrivateStartPairingFunction::GcdPrivateStartPairingFunction() {
|
| +}
|
| +
|
| +GcdPrivateStartPairingFunction::~GcdPrivateStartPairingFunction() {
|
| +}
|
| +
|
| +bool GcdPrivateStartPairingFunction::RunAsync() {
|
| + scoped_ptr<gcd_private::StartPairing::Params> params =
|
| + gcd_private::StartPairing::Params::Create(*args_);
|
| +
|
| + if (!params)
|
| + return false;
|
| +
|
| + GcdPrivateAPIImpl* gcd_api = GcdPrivateAPIImpl::Get(GetProfile());
|
|
|
| - results_ =
|
| - gcd_private::EstablishSession::Results::Create(session_id, status, info);
|
| + gcd_api->StartPairing(
|
| + params->session_id, params->pairing_type,
|
| + base::Bind(&GcdPrivateStartPairingFunction::OnPairingStarted, this));
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void GcdPrivateStartPairingFunction::OnPairingStarted(
|
| + api::gcd_private::Status status) {
|
| + results_ = gcd_private::StartPairing::Results::Create(status);
|
| SendResponse(true);
|
| }
|
|
|
| @@ -813,15 +669,13 @@ bool GcdPrivateConfirmCodeFunction::RunAsync() {
|
| GcdPrivateAPIImpl* gcd_api = GcdPrivateAPIImpl::Get(GetProfile());
|
|
|
| gcd_api->ConfirmCode(
|
| - params->session_id,
|
| - params->code,
|
| - base::Bind(&GcdPrivateConfirmCodeFunction::OnSessionEstablishedCallback,
|
| - this));
|
| + params->session_id, params->code,
|
| + base::Bind(&GcdPrivateConfirmCodeFunction::OnCodeConfirmed, this));
|
|
|
| return true;
|
| }
|
|
|
| -void GcdPrivateConfirmCodeFunction::OnSessionEstablishedCallback(
|
| +void GcdPrivateConfirmCodeFunction::OnCodeConfirmed(
|
| api::gcd_private::Status status) {
|
| results_ = gcd_private::ConfirmCode::Results::Create(status);
|
| SendResponse(true);
|
|
|