// 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.
#ifndef REMOTING_PROTOCOL_SESSION_H_
#define REMOTING_PROTOCOL_SESSION_H_
#include <string>
#include "remoting/protocol/errors.h"
#include "remoting/protocol/session_config.h"
namespace net {
class IPEndPoint;
} // namespace net
namespace remoting {
namespace protocol {
class ChannelFactory;
struct TransportRoute;
// Generic interface for Chromotocol connection used by both client and host.
// Provides access to the connection channels, but doesn't depend on the
// protocol used for each channel.
class Session {
public:
enum State {
// Created, but not connecting yet.
INITIALIZING,
// Sent session-initiate, but haven't received session-accept.
CONNECTING,
// Received session-initiate, but haven't sent session-accept.
ACCEPTING,
// Session has been accepted and is pending authentication.
CONNECTED,
// Session has been connected and authenticated.
AUTHENTICATED,
// Session has been closed.
CLOSED,
// Connection has failed.
FAILED,
};
class EventHandler {
public:
EventHandler() {}
virtual ~EventHandler() {}
// Called after session state has changed. It is safe to destroy
// the session from within the handler if |state| is CLOSED or
// FAILED.
virtual void OnSessionStateChange(State state) = 0;
// Called whenever route for the channel specified with
// |channel_name| changes. Session must not be destroyed by the
// handler of this event.
virtual void OnSessionRouteChange(const std::string& channel_name,
const TransportRoute& route) = 0;
// Called when ready state on one of the channels changes. See
// comments in transport.h for explanation on what this state
// means and how it can used.
virtual void OnSessionChannelReady(const std::string& channel_name,
bool ready) {}
};
Session() {}
virtual ~Session() {}
// Set event handler for this session. |event_handler| must outlive
// this object.
virtual void SetEventHandler(EventHandler* event_handler) = 0;
// Returns error code for a failed session.
virtual ErrorCode error() = 0;
// JID of the other side.
virtual const std::string& jid() = 0;
// Configuration of the protocol that was sent or received in the
// session-initiate jingle message. Returned pointer is valid until
// connection is closed.
virtual const CandidateSessionConfig* candidate_config() = 0;
// Protocol configuration. Can be called only after session has been accepted.
// Returned pointer is valid until connection is closed.
virtual const SessionConfig& config() = 0;
// Set protocol configuration for an incoming session. Must be
// called on the host before the connection is accepted, from
// ChromotocolServer::IncomingConnectionCallback.
virtual void set_config(const SessionConfig& config) = 0;
// GetTransportChannelFactory() returns a factory that creates a new transport
// channel for each logical channel. GetMultiplexedChannelFactory() channels
// share a single underlying transport channel
virtual ChannelFactory* GetTransportChannelFactory() = 0;
virtual ChannelFactory* GetMultiplexedChannelFactory() = 0;
// Closes connection. Callbacks are guaranteed not to be called
// after this method returns. Must be called before the object is
// destroyed, unless the state is set to FAILED or CLOSED.
virtual void Close() = 0;
private:
DISALLOW_COPY_AND_ASSIGN(Session);
};
} // namespace protocol
} // namespace remoting
#endif // REMOTING_PROTOCOL_SESSION_H_