pion  5.0.6
include/pion/http/plugin_server.hpp
00001 // ---------------------------------------------------------------------
00002 // pion:  a Boost C++ framework for building lightweight HTTP interfaces
00003 // ---------------------------------------------------------------------
00004 // Copyright (C) 2007-2014 Splunk Inc.  (https://github.com/splunk/pion)
00005 //
00006 // Distributed under the Boost Software License, Version 1.0.
00007 // See http://www.boost.org/LICENSE_1_0.txt
00008 //
00009 
00010 #ifndef __PION_PLUGIN_SERVER_HEADER__
00011 #define __PION_PLUGIN_SERVER_HEADER__
00012 
00013 #include <string>
00014 #include <boost/asio.hpp>
00015 #include <boost/bind.hpp>
00016 #include <boost/shared_ptr.hpp>
00017 #include <pion/config.hpp>
00018 #include <pion/plugin.hpp>
00019 #include <pion/plugin_manager.hpp>
00020 #include <pion/http/server.hpp>
00021 #include <pion/http/plugin_service.hpp>
00022 
00023 
00024 namespace pion {    // begin namespace pion
00025 namespace http {    // begin namespace http
00026 
00027 
00031 class PION_API plugin_server :
00032     public http::server
00033 {
00034 
00035 public:
00036 
00038     virtual ~plugin_server() { clear(); }
00039     
00045     explicit plugin_server(const unsigned int tcp_port = 0)
00046         : http::server(tcp_port)
00047     { 
00048         set_logger(PION_GET_LOGGER("pion.http.plugin_server"));
00049     }
00050     
00056     explicit plugin_server(const boost::asio::ip::tcp::endpoint& endpoint)
00057         : http::server(endpoint)
00058     { 
00059         set_logger(PION_GET_LOGGER("pion.http.plugin_server"));
00060     }
00061 
00068     explicit plugin_server(scheduler& sched, const unsigned int tcp_port = 0)
00069         : http::server(sched, tcp_port)
00070     { 
00071         set_logger(PION_GET_LOGGER("pion.http.plugin_server"));
00072     }
00073     
00080     plugin_server(scheduler& sched, const boost::asio::ip::tcp::endpoint& endpoint)
00081         : http::server(sched, endpoint)
00082     { 
00083         set_logger(PION_GET_LOGGER("pion.http.plugin_server"));
00084     }
00085 
00092     void add_service(const std::string& resource, http::plugin_service *service_ptr);
00093     
00101     void load_service(const std::string& resource, const std::string& service_name);
00102     
00110     void set_service_option(const std::string& resource,
00111                           const std::string& name, const std::string& value);
00112     
00125     void load_service_config(const std::string& config_name);
00126 
00128     virtual void clear(void) {
00129         if (is_listening()) stop();
00130         m_services.clear();
00131         http::server::clear();
00132     }
00133 
00134     
00135 protected:
00136     
00138     virtual void before_starting(void) {
00139         // call the start() method for each web service associated with this server
00140         m_services.run(boost::bind(&http::plugin_service::start, _1));
00141     }
00142     
00144     virtual void after_stopping(void) {
00145         // call the stop() method for each web service associated with this server
00146         m_services.run(boost::bind(&http::plugin_service::stop, _1));
00147     }
00148 
00149     
00150 private:
00151     
00153     typedef plugin_manager<http::plugin_service>   service_manager_t;
00154     
00155     
00157     service_manager_t       m_services;
00158 };
00159 
00160 
00162 typedef boost::shared_ptr<plugin_server>        plugin_server_ptr;
00163 
00164 
00165 }   // end namespace http
00166 }   // end namespace pion
00167 
00168 #endif