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 #include <memory>
00028
00029 #include <scalestack/kernel/module.h>
00030 #include <scalestack/kernel/option.h>
00031 #include <scalestack/network/local/stream/connection.h>
00032 #include <scalestack/network/local/stream/connection_service.h>
00033
00034 using namespace std;
00035
00036 namespace scalestack
00037 {
00038 namespace network
00039 {
00040 namespace local
00041 {
00042 namespace stream
00043 {
00044
00045
00046
00047
00048
00049 void connection_service::options(kernel::module& module, const char* addresses)
00050 {
00051 module.add_option("addresses", _("List of local sockets to connect to."),
00052 "SOCKET[,SOCKET]...", addresses);
00053 }
00054
00055 connection_service::connection_service(kernel::module& module,
00056 std::auto_ptr<stream_service> stream_service):
00057 stream_service_provider(module, stream_service)
00058 {
00059 }
00060
00061 connection_service::~connection_service()
00062 {
00063 _handler_service.stop();
00064 }
00065
00066 void connection_service::add_accepted(int file_descriptor,
00067 struct sockaddr&,
00068 socklen_t)
00069 {
00070 _module.log_notice("Accepted local stream connection");
00071
00072 auto_ptr<connection> new_connection(
00073 new connection(_handler_service, *_stream_service, file_descriptor));
00074 new_connection->start();
00075 new_connection.release();
00076 }
00077
00078 void connection_service::add_connections(void)
00079 {
00080 add_connections(_module.get_option("addresses").get_value());
00081 }
00082
00083 void connection_service::add_connections(const std::string& addresses)
00084 {
00085 string::size_type current = 0;
00086
00087 do
00088 {
00089 string::size_type next = addresses.find_first_of(",", current);
00090 string address = addresses.substr(current, next - current);
00091
00092 auto_ptr<connection> new_connection(
00093 new connection(_handler_service, *_stream_service, address));
00094 new_connection->start();
00095 new_connection.release();
00096
00097 current = addresses.find_first_not_of(",", next);
00098 }
00099 while (current != string::npos);
00100 }
00101
00102 }
00103 }
00104 }
00105 }