| // Copyright 2012 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "polo/pairing/clientpairingsession.h" |
| |
| #include <glog/logging.h> |
| #include <string> |
| |
| #include "polo/encoding/hexadecimalencoder.h" |
| #include "polo/pairing/polochallengeresponse.h" |
| |
| namespace polo { |
| namespace pairing { |
| |
| ClientPairingSession::ClientPairingSession(wire::PoloWireAdapter *wire, |
| PairingContext *context, |
| PoloChallengeResponse* challenge, |
| const std::string &service_name, |
| const std::string &client_name) |
| : PairingSession(wire, context, challenge), |
| service_name_(service_name), |
| client_name_(client_name) { |
| } |
| |
| ClientPairingSession::~ClientPairingSession() { |
| } |
| |
| void ClientPairingSession::DoInitializationPhase() { |
| if (!client_name_.empty()) { |
| message::PairingRequestMessage message(service_name_, client_name_); |
| wire()->SendPairingRequestMessage(message); |
| } else { |
| message::PairingRequestMessage message(service_name_); |
| wire()->SendPairingRequestMessage(message); |
| } |
| |
| LOG(INFO) << "Waiting for PairingRequestAck..."; |
| wire()->GetNextMessage(); |
| } |
| |
| void ClientPairingSession::DoConfigurationPhase() { |
| const message::ConfigurationMessage* config = configuration(); |
| if (!config) { |
| LOG(ERROR) << "No configuration"; |
| listener()->OnError(kErrorBadConfiguration); |
| return; |
| } |
| |
| wire()->SendConfigurationMessage(*config); |
| wire()->GetNextMessage(); |
| |
| LOG(INFO) << "Waiting for ConfigurationAck..."; |
| } |
| |
| void ClientPairingSession::OnPairingRequestAckMessage( |
| const message::PairingRequestAckMessage& message) { |
| LOG(INFO) << "Handle PairingRequestAckMessage " << message.ToString(); |
| |
| if (message.has_server_name()) { |
| set_peer_name(message.server_name()); |
| } |
| |
| wire()->SendOptionsMessage(local_options()); |
| wire()->GetNextMessage(); |
| } |
| |
| void ClientPairingSession::OnOptionsMessage( |
| const message::OptionsMessage& message) { |
| LOG(INFO) << "HandleOptionsMessage " << message.ToString(); |
| |
| message::ConfigurationMessage* configuration = |
| message::ConfigurationMessage::GetBestConfiguration(local_options(), |
| message); |
| |
| if (!configuration) { |
| LOG(ERROR) << "No compatible configuration: " |
| << local_options().ToString() << ", " << message.ToString(); |
| wire()->SendErrorMessage(kErrorBadConfiguration); |
| listener()->OnError(kErrorBadConfiguration); |
| return; |
| } |
| |
| bool valid_configuration = SetConfiguration(*configuration); |
| delete configuration; |
| |
| if (valid_configuration) { |
| DoConfigurationPhase(); |
| } else { |
| wire()->SendErrorMessage(kErrorBadConfiguration); |
| listener()->OnError(kErrorBadConfiguration); |
| } |
| } |
| |
| void ClientPairingSession::OnConfigurationAckMessage( |
| const message::ConfigurationAckMessage& message) { |
| LOG(INFO) << "HandleConfigurationAckMessage " << message.ToString(); |
| |
| DoPairingPhase(); |
| } |
| |
| void ClientPairingSession::OnConfigurationMessage( |
| const message::ConfigurationMessage& message) { |
| LOG(ERROR) << "Received unexpected ConfigurationMessage"; |
| wire()->SendErrorMessage(kErrorProtocol); |
| listener()->OnError(kErrorProtocol); |
| } |
| |
| void ClientPairingSession::OnPairingRequestMessage( |
| const message::PairingRequestMessage& message) { |
| LOG(ERROR) << "Received unexpected PairingRequestMessage"; |
| wire()->SendErrorMessage(kErrorProtocol); |
| listener()->OnError(kErrorProtocol); |
| } |
| |
| } // namespace pairing |
| } // namespace polo |