//*****************************************************************************
// RCF - Remote Call Framework
// Copyright (c) 2005. All rights reserved.
// Developed by Jarl Lindrud.
// Contact: jlindrud@hotmail.com .
//*****************************************************************************
#ifndef INCLUDE_RCF_FILTERSERVICE_HPP
#define INCLUDE_RCF_FILTERSERVICE_HPP
#include <map>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
#include <RCF/AsyncFilter.hpp>
#include <RCF/Service.hpp>
namespace RCF {
class Session;
/// Service enabling RcfServer to supply its transports with filters, e.g. for compression and encryption.
class FilterService : public I_Service, public I_FilterFactoryLookupProvider, boost::noncopyable
{
public:
/// Constructor.
FilterService();
/// Adds a filter factory to the service.
/// \param filterFactoryPtr Filter factory to add.
void addFilterFactory(FilterFactoryPtr filterFactoryPtr);
/// Remotely accessible (via I_RequestTransportFilters), allows clients to request transport and payload filters,
/// for their communication with the server.
/// \param filterIds Vector of integers indicating the desired sequence of filters.
/// \return true if successful, false otherwise. If true, then subsequent communication between server and client will be filtered as requested.
bool requestTransportFilters(const std::vector<int> &filterIds);
/// Returns a filter factory for the given filter id.
/// \param filterId Filter id.
/// \return Filter factory for given filter id (null if filter id is not recognized).
FilterFactoryPtr getFilterFactoryPtr(int filterId);
private:
void setTransportFilters(Session &session, boost::shared_ptr<std::vector<FilterPtr> > filters);
void onServiceAdded(RcfServer &server);
void onServiceRemoved(RcfServer &server);
typedef std::map<int, FilterFactoryPtr> FilterFactoryMap; // TODO: synchronization and documentation
FilterFactoryMap mFilterFactoryMap;
ReadWriteMutex mFilterFactoryMapMutex;
};
typedef boost::shared_ptr<FilterService> FilterServicePtr;
} // namespace RCF
#endif // ! INCLUDE_RCF_FILTERSERVICE_HPP