00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include "config.h"
00025
00026 #include <exception>
00027
00028 #include <scalestack/kernel/core.h>
00029 #include <scalestack/kernel/module.h>
00030 #include <scalestack/network/ip/tcp/connection_service.h>
00031 #include <scalestack/network/ip/tcp/listener_service.h>
00032 #include <scalestack/proxy/client_service.h>
00033 #include <scalestack/proxy/server_service.h>
00034
00035 using namespace std;
00036 using namespace scalestack;
00037
00038 static void options(kernel::module& module)
00039 {
00040 network::ip::tcp::listener_service::options(module, "12345");
00041 module.add_option("server_address", _("The server host:port to proxy to."),
00042 "HOST:PORT", "localhost:7");
00043 module.add_option("server_timeout",
00044 _("How long to wait for the server to connect."),
00045 "SECONDS", "15");
00046 }
00047
00048 static void start(kernel::module& module)
00049 {
00050 auto_ptr<proxy::server_service> server_service(
00051 new proxy::server_service(module));
00052 auto_ptr<network::stream_service> client_service(
00053 new proxy::client_service(module, *server_service));
00054 auto_ptr<network::ip::tcp::connection_service> tcp_server_service(
00055 new network::ip::tcp::connection_service(module,
00056 static_cast<auto_ptr<network::stream_service> >(server_service), "12345"));
00057 auto_ptr<network::stream_service_provider> tcp_client_service(
00058 new network::ip::tcp::connection_service(module, client_service, "12345"));
00059 auto_ptr<network::ip::tcp::listener_service> listener_service(
00060 new network::ip::tcp::listener_service(module, tcp_client_service, ""));
00061
00062 listener_service->add_listeners();
00063 module.get_core().add_service("proxy::listener", listener_service.get());
00064 listener_service.release();
00065
00066 try
00067 {
00068 module.get_core().add_service("proxy::server", tcp_server_service.get());
00069 tcp_server_service.release();
00070 }
00071 catch (exception&)
00072 {
00073 delete module.get_core().remove_service("proxy::listener");
00074 throw;
00075 }
00076 }
00077
00078 static void stop(kernel::module& module)
00079 {
00080 delete module.get_core().remove_service("proxy::listener");
00081 delete module.get_core().remove_service("proxy::server");
00082 }
00083
00084 SCALESTACK_KERNEL_MODULE(options, start, stop, NULL, NULL);