//*****************************************************************************
// RCF - Remote Call Framework
// Copyright (c) 2005. All rights reserved.
// Developed by Jarl Lindrud.
// Contact: jlindrud@hotmail.com .
//*****************************************************************************
#ifndef INCLUDE_RCF_ENDPOINTBROKERSERVICE_HPP
#define INCLUDE_RCF_ENDPOINTBROKERSERVICE_HPP
#include <map>
#include <string>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <RCF/Service.hpp>
#include <RCF/ServerInterfaces.hpp>
#include <RCF/ClientTransport.hpp>
#include <RCF/ServerTransport.hpp>
#include <RCF/Session.hpp>
#include <RCF/Tools.hpp>
namespace RCF {
// error codes for bindEndpoint()
enum {
RCF_ERROR_OK,
RCF_ERROR_ENDPOINT_ABSENT,
RCF_ERROR_ENDPOINT_PASSWORD,
RCF_ERROR_ENDPOINT_DOWN,
RCF_ERROR_ENDPOINT_RETRY
};
class EndpointBroker
{
public:
EndpointBroker(
ServerTransportPtr serverTransportPtr,
const std::string &endpointName,
const std::string &endpointClientPassword,
const std::string &endpointServerPassword);
int bindToEndpoint();
private:
friend class EndpointBrokerService;
typedef RcfClient<I_EndpointServer> Client;
typedef boost::shared_ptr<Client> ClientPtr;
std::string mEndpointName;
std::string mEndpointServerPassword;
std::string mEndpointClientPassword;
std::vector<SessionPtr> mConnections;
ClientPtr mMasterConnection;
ServerTransportPtr mServerTransportPtr;
};
class EndpointBrokerService :
public I_Service,
boost::noncopyable
{
public:
EndpointBrokerService();
void onServiceAdded(RcfServer &server);
void onServiceRemoved(RcfServer &server);
// remotely invoked
bool openEndpoint(const std::string &endpointName, const std::string &endpointClientPassword, std::string &endpointServerPassword);
bool closeEndpoint(const std::string &endpointName, const std::string &endpointServerPassword);
bool establishEndpointConnection(const std::string &endpointName, const std::string &endpointServerPassword);
int bindToEndpoint(const std::string &endpointName, const std::string &endpointClientPassword);
private:
ServerTransportPtr mServerTransportPtr;
ReadWriteMutex mEndpointBrokersMutex;
std::map<std::string, boost::shared_ptr<EndpointBroker> > mEndpointBrokers;
};
typedef boost::shared_ptr<EndpointBrokerService> EndpointBrokerServicePtr;
} // namespace RCF
#endif // ! INCLUDE_RCF_ENDPOINTBROKERSERVICE_HPP