Files
rippled/modules/ripple_asio/sockets/ripple_MultiSocket.h
2013-08-24 20:06:17 -07:00

98 lines
2.8 KiB
C++

//------------------------------------------------------------------------------
/*
Copyright (c) 2011-2013, OpenCoin, Inc.
*/
//==============================================================================
#ifndef RIPPLE_MULTISOCKET_H_INCLUDED
#define RIPPLE_MULTISOCKET_H_INCLUDED
/** A Socket that can handshake with multiple protocols.
*/
class MultiSocket : public Socket
{
public:
// immutable flags
struct Flag
{
enum Bit
{
peer = 0, // no handshaking. remaining flags ignored.
client_role = 1, // operate in client role
server_role = 2, // operate in server role
proxy = 4, // client: will send PROXY handshake
// server: PROXY handshake required
ssl = 8, // client: will use ssl
// server: will allow, but not require ssl
ssl_required = 16 // client: ignored
// server: will require ssl (ignores ssl flag)
};
Flag (int flags) noexcept
: m_flags (flags)
{
}
bool operator== (Flag const& other) const noexcept
{
return m_flags == other.m_flags;
}
inline bool set (int mask) const noexcept
{
return (m_flags & mask) == mask;
}
inline bool any_set (int mask) const noexcept
{
return (m_flags & mask) != 0;
}
Flag with (int mask) const noexcept
{
return Flag (m_flags | mask);
}
Flag without (int mask) const noexcept
{
return Flag (m_flags & ~mask);
}
private:
int m_flags;
};
enum Flags
{
none = 0,
client_ssl = 1,
server_ssl = 2,
server_ssl_required = 4,
server_proxy = 8
};
virtual SSL* native_handle () = 0;
/*
// This would be the underlying StreamSocket template parameter
typedef boost::asio::ip::tcp::socket NativeSocketType;
typedef boost::asio::ssl::stream <NativeSocketType&> SslStreamType;
virtual boost::asio::ip::tcp::socket& getNativeSocket () = 0;
virtual SslStreamType& getSslStream () = 0;
*/
static MultiSocket* New (boost::asio::io_service& io_service, int flags = 0);
static MultiSocket* New (boost::asio::ip::tcp::socket& socket, int flags = 0);
static MultiSocket* New (boost::asio::ssl::stream <boost::asio::ip::tcp::socket&>& stream, int flags = 0);
// Ripple uses a SSL/TLS context with specific parameters and this returns
// a reference to the corresponding boost::asio::ssl::context object.
//
static SslContextBase::BoostContextType& getRippleTlsBoostContext ();
};
#endif