summaryrefslogtreecommitdiffstats
path: root/remoting/protocol/pepper_session.h
diff options
context:
space:
mode:
Diffstat (limited to 'remoting/protocol/pepper_session.h')
-rw-r--r--remoting/protocol/pepper_session.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/remoting/protocol/pepper_session.h b/remoting/protocol/pepper_session.h
new file mode 100644
index 0000000..99b9f6a
--- /dev/null
+++ b/remoting/protocol/pepper_session.h
@@ -0,0 +1,168 @@
+// Copyright (c) 2011 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.
+
+#ifndef REMOTING_PROTOCOL_PEPPER_SESSION_H_
+#define REMOTING_PROTOCOL_PEPPER_SESSION_H_
+
+#include <map>
+#include <string>
+
+#include "base/memory/ref_counted.h"
+#include "base/timer.h"
+#include "crypto/rsa_private_key.h"
+#include "net/base/completion_callback.h"
+#include "remoting/protocol/jingle_messages.h"
+#include "remoting/protocol/session.h"
+#include "remoting/protocol/session_config.h"
+
+namespace net {
+class CertVerifier;
+class ClientSocketFactory;
+class Socket;
+class StreamSocket;
+class X509Certificate;
+} // namespace net
+
+namespace pp {
+class Instance;
+} // namespace pp
+
+namespace remoting {
+
+class IqRequest;
+
+namespace protocol {
+
+class PepperChannel;
+class PepperSessionManager;
+class SocketWrapper;
+
+// Implements the protocol::Session interface using the Pepper P2P
+// Transport API. Created by PepperSessionManager for incoming and
+// outgoing connections.
+class PepperSession : public Session {
+ public:
+ // TODO(sergeyu): Move this type and error() method to the Session
+ // interface.
+ enum Error {
+ ERROR_NO_ERROR = 0,
+ ERROR_PEER_IS_OFFLINE,
+ ERROR_SESSION_REJECTED,
+ ERROR_INCOMPATIBLE_PROTOCOL,
+ ERROR_CHANNEL_CONNECTION_FAILURE,
+ };
+
+ virtual ~PepperSession();
+
+ Error error();
+
+ // Session interface.
+ virtual void SetStateChangeCallback(StateChangeCallback* callback) OVERRIDE;
+ virtual void CreateStreamChannel(
+ const std::string& name,
+ const StreamChannelCallback& callback) OVERRIDE;
+ virtual void CreateDatagramChannel(
+ const std::string& name,
+ const DatagramChannelCallback& callback) OVERRIDE;
+ virtual net::Socket* control_channel() OVERRIDE;
+ virtual net::Socket* event_channel() OVERRIDE;
+ virtual const std::string& jid() OVERRIDE;
+ virtual const CandidateSessionConfig* candidate_config() OVERRIDE;
+ virtual const SessionConfig& config() OVERRIDE;
+ virtual void set_config(const SessionConfig& config) OVERRIDE;
+ virtual const std::string& initiator_token() OVERRIDE;
+ virtual void set_initiator_token(const std::string& initiator_token) OVERRIDE;
+ virtual const std::string& receiver_token() OVERRIDE;
+ virtual void set_receiver_token(const std::string& receiver_token) OVERRIDE;
+ virtual void set_shared_secret(const std::string& secret) OVERRIDE;
+ virtual const std::string& shared_secret() OVERRIDE;
+ virtual void Close() OVERRIDE;
+
+ private:
+ friend class PepperSessionManager;
+ friend class PepperStreamChannel;
+
+ typedef std::map<std::string, PepperChannel*> ChannelsMap;
+
+ PepperSession(PepperSessionManager* session_manager);
+
+ // Start cs connection by sending session-initiate message.
+ void StartConnection(const std::string& peer_jid,
+ const std::string& peer_public_key,
+ const std::string& client_token,
+ CandidateSessionConfig* config,
+ Session::StateChangeCallback* state_change_callback);
+
+ // Handler for session-initiate response.
+ void OnSessionInitiateResponse(const buzz::XmlElement* response);
+
+ // Called when an error occurs. Sets |error_| and closes the session.
+ void OnError(Error error);
+
+ // Called by PepperSessionManager on incoming |message|. Must fill
+ // in |reply|.
+ void OnIncomingMessage(const JingleMessage& message,
+ JingleMessageReply* reply);
+
+ // Message handlers for incoming messages.
+ void OnAccept(const JingleMessage& message, JingleMessageReply* reply);
+ void OnReject(const JingleMessage& message, JingleMessageReply* reply);
+ void OnTerminate(const JingleMessage& message, JingleMessageReply* reply);
+ void ProcessTransportInfo(const JingleMessage& message);
+
+ // Called from OnAccept() to initialize session config.
+ bool InitializeConfigFromDescription(const ContentDescription* description);
+
+ // Called by PepperChannel.
+ void AddLocalCandidate(const cricket::Candidate& candidate);
+ void OnDeleteChannel(PepperChannel* channel);
+
+ void SendTransportInfo();
+
+ // Helper methods to create event and control channels.
+ // TODO(sergeyu): Remove these methods.
+ void CreateChannels();
+ void OnChannelConnected(scoped_ptr<net::Socket>* socket_container,
+ net::StreamSocket* socket);
+
+ // Close all the channels and terminate the session.
+ void CloseInternal(bool failed);
+
+ // Sets |state_| to |new_state| and calls state change callback.
+ void SetState(State new_state);
+
+ PepperSessionManager* session_manager_;
+ std::string peer_jid_;
+ std::string peer_public_key_;
+ scoped_ptr<CandidateSessionConfig> candidate_config_;
+ scoped_ptr<StateChangeCallback> state_change_callback_;
+
+ std::string session_id_;
+ State state_;
+ Error error_;
+
+ std::string remote_cert_;
+ SessionConfig config_;
+
+ std::string shared_secret_;
+ std::string initiator_token_;
+ std::string receiver_token_;
+
+ scoped_ptr<IqRequest> initiate_request_;
+
+ ChannelsMap channels_;
+
+ scoped_ptr<net::Socket> control_channel_socket_;
+ scoped_ptr<net::Socket> event_channel_socket_;
+
+ base::OneShotTimer<PepperSession> transport_infos_timer_;
+ std::list<cricket::Candidate> pending_candidates_;
+
+ DISALLOW_COPY_AND_ASSIGN(PepperSession);
+};
+
+} // namespace protocol
+} // namespace remoting
+
+#endif // REMOTING_PROTOCOL_PEPPER_SESSION_H_