diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2013-02-13 21:16:55 +0200 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2013-02-13 21:16:55 +0200 |
commit | eda5eaf4a1be590b9e4905f322b3e0923f65d312 (patch) | |
tree | 36aa8f2f08e6fd140f9391b73ee791e1e506339e | |
parent | 728653fbb36727acfb5a4cd480b7fa5d45adfa89 (diff) |
modified: restarter.workspace
modified: server/service.cpp
modified: server/service.h
modified: server/session.cpp
modified: server/session.h
-rw-r--r-- | restarter.workspace | 4 | ||||
-rw-r--r-- | server/service.cpp | 199 | ||||
-rw-r--r-- | server/service.h | 3 | ||||
-rw-r--r-- | server/session.cpp | 196 | ||||
-rw-r--r-- | server/session.h | 4 |
5 files changed, 206 insertions, 200 deletions
diff --git a/restarter.workspace b/restarter.workspace index 371c615..f6eaa5d 100644 --- a/restarter.workspace +++ b/restarter.workspace @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <CodeLite_Workspace Name="restarter" Database="./restarter.tags"> - <Project Name="restarter_server" Path="server/restarter_server.project" Active="No"/> + <Project Name="restarter_server" Path="server/restarter_server.project" Active="Yes"/> <Project Name="lib" Path="proto_lib/lib.project" Active="No"/> <Project Name="unix_exec_service" Path="services/unix_exec_service/unix_exec_service.project" Active="No"/> <Environment> @@ -11,7 +11,7 @@ ]]> </Environment> - <Project Name="proto_test" Path="proto_test/proto_test.project" Active="Yes"/> + <Project Name="proto_test" Path="proto_test/proto_test.project" Active="No"/> <BuildMatrix> <WorkspaceConfiguration Name="Debug" Selected="yes"> <Project Name="restarter_server" ConfigName="Debug"/> diff --git a/server/service.cpp b/server/service.cpp index 004def3..b00406f 100644 --- a/server/service.cpp +++ b/server/service.cpp @@ -31,4 +31,203 @@ bool service_info::command::operator==(const std::string &command) return command == this->command; } +void handle_data(session *s, proto::packet &p) +{ + using namespace proto; + if(!p.is_good()) + { + delete s; + } + switch(p.get_type()) + { + case TYPE_AUTH: + { + if(!packet::serv_validate_client_proto(p)) + { + packet *r = packet::serv_make_status_packet(TYPE_AUTH, STATUS_FAILURE); + s->write_w_close(r->raw()); + delete r; + return; + } + else + { + packet *r = packet::serv_make_status_packet(TYPE_AUTH, STATUS_SUCCESS); + s->write_w_response(r->raw()); + delete r; + return; + } + } + break; + case TYPE_COMMAND: + { + svc_cmd c = packet::serv_extract_command(p); + if(c.service.empty()) + break; + std::list<service_info>::iterator i = std::find(installed_services.begin(), installed_services.end(), c.service); + if(!c.command.empty()) + { + if(i != installed_services.end()) + { + std::list<service_info::command>::iterator ii = std::find(i->predefined.begin(), i->predefined.end(), c.command); + if(ii != i->predefined.end()) + { + switch(i->acc) + { + case ACC_CHAR_PTR: + { + switch(i->ret) + { + case RET_CHAR_PTR: + { + char *arg = strdup(c.command.c_str()); + char *data = (char*)i->exec((void*)arg); + std::string str(data); + delete [] data; + packet *p = packet::serv_make_command_reply_packet(str, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + } + break; + case RET_FLOAT_PTR: + { + char *arg = strdup(c.command.c_str()); + float *ret = (float*)i->exec((void*)arg); + //todo pack float to unsigned char vector + std::vector<unsigned char> v; + packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + delete ret; + } + break; + case RET_INT_PTR: + { + char *arg = strdup(c.command.c_str()); + int *ret = (int*)i->exec((void*)arg); + //todo pack float to unsigned char vector + std::vector<unsigned char> v; + packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + delete ret; + } + break; + case RET_NONE: + { + char *arg = strdup(c.command.c_str()); + i->exec((void*)arg); + packet *p = packet::serv_make_status_packet(TYPE_COMMAND, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + } + break; + case RET_STD_STRING_PTR: + { + char *arg = strdup(c.command.c_str()); + std::string *str = (std::string*)i->exec((void*)arg); + packet *p = packet::serv_make_command_reply_packet(*str, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + delete str; + } + break; + case RET_VOID_PTR: + { + //TODO + } + break; + }; + } + break; + case ACC_FLOAT_PTR: + { + } + break; + case ACC_INT_PTR: + { + } + break; + case ACC_STD_STRING_PTR: + { + } + break; + case ACC_VOID_PTR: + { + } + break; + default: + break; + } + } + } + } + else + { + if(i->acc == ACC_NONE) + { + switch(i->ret) + { + case RET_CHAR_PTR: + { + char *data = (char*)i->exec((void*)NULL); + std::string str(data); + delete [] data; + packet *p = packet::serv_make_command_reply_packet(str, STATUS_SUCCESS); + delete [] data; + s->write_w_response(p->raw()); + delete p; + } + break; + case RET_FLOAT_PTR: + { + float *ret = (float*)i->exec((void*)NULL); + //todo pack float to unsigned char vector + std::vector<unsigned char> v; + packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + delete ret; + } + break; + case RET_INT_PTR: + { + int *ret = (int*)i->exec((void*)NULL); + //todo pack float to unsigned char vector + std::vector<unsigned char> v; + packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + delete ret; + } + break; + case RET_NONE: + { + i->exec((void*)NULL); + packet *p = packet::serv_make_status_packet(TYPE_AUTH, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + } + break; + case RET_STD_STRING_PTR: + { + std::string *str = (std::string*)i->exec((void*)NULL); + packet *p = packet::serv_make_command_reply_packet(*str, STATUS_SUCCESS); + s->write_w_response(p->raw()); + delete p; + delete str; + } + break; + case RET_VOID_PTR: + { + //TODO + } + break; + }; + } + } + } + break; + } +} + }; diff --git a/server/service.h b/server/service.h index d27f8f3..2ba9ee6 100644 --- a/server/service.h +++ b/server/service.h @@ -21,7 +21,8 @@ namespace service { -extern std::list<service_info> installed_services; + extern std::list<service_info> installed_services; + void handle_data(session *s, proto::packet &p); }; #endif diff --git a/server/session.cpp b/server/session.cpp index 6bbf107..bb6ffd4 100644 --- a/server/session.cpp +++ b/server/session.cpp @@ -43,201 +43,7 @@ void session::handle_read(const boost::system::error_code& error, size_t bytes_t delete [] recv_data; packet p(v); v.clear(); - if(!p.is_good()) - { - delete this; - } - switch(p.get_type()) - { - case TYPE_AUTH_REQUEST: - { - if(!packet::serv_validate_client_proto(p)) - { - packet *r = packet::make_status_packet(TYPE_AUTH_REPLY, STATUS_FAILURE); - write_w_close(r->raw()); - delete r; - return; - } - else - { - packet *r = packet::make_status_packet(TYPE_AUTH_REPLY, STATUS_SUCCESS); - write_w_response(r->raw()); - delete r; - return; - } - } - break; - case TYPE_COMMAND_REQUEST: - { - svc_cmd c = packet::serv_extract_command(p); - if(c.service.empty()) - break; - std::list<service_info>::iterator i = std::find(installed_services.begin(), installed_services.end(), c.service); - if(!c.command.empty()) - { - if(i != installed_services.end()) - { - std::list<service_info::command>::iterator ii = std::find(i->predefined.begin(), i->predefined.end(), c.command); - if(ii != i->predefined.end()) - { - switch(i->acc) - { - case ACC_CHAR_PTR: - { - switch(i->ret) - { - case RET_CHAR_PTR: - { - char *arg = strdup(c.command.c_str()); - char *data = (char*)i->exec((void*)arg); - std::string s(data); - delete [] data; - packet *p = packet::serv_make_command_reply_packet(s, STATUS_SUCCESS); - delete [] data; - write_w_response(p->raw()); - delete p; - } - break; - case RET_FLOAT_PTR: - { - char *arg = strdup(c.command.c_str()); - float *ret = (float*)i->exec((void*)arg); - //todo pack float to unsigned char vector - std::vector<unsigned char> v; - packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - delete ret; - } - break; - case RET_INT_PTR: - { - char *arg = strdup(c.command.c_str()); - int *ret = (int*)i->exec((void*)arg); - //todo pack float to unsigned char vector - std::vector<unsigned char> v; - packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - delete ret; - } - break; - case RET_NONE: - { - char *arg = strdup(c.command.c_str()); - i->exec((void*)arg); - packet *p = packet::make_status_packet(TYPE_AUTH_REPLY, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - } - break; - case RET_STD_STRING_PTR: - { - char *arg = strdup(c.command.c_str()); - std::string *str = (std::string*)i->exec((void*)arg); - packet *p = packet::serv_make_command_reply_packet(*str, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - delete str; - } - break; - case RET_VOID_PTR: - { - //TODO - } - break; - }; - } - break; - case ACC_FLOAT_PTR: - { - } - break; - case ACC_INT_PTR: - { - } - break; - case ACC_STD_STRING_PTR: - { - } - break; - case ACC_VOID_PTR: - { - } - break; - default: - break; - } - } - } - } - else - { - if(i->acc == ACC_NONE) - { - switch(i->ret) - { - case RET_CHAR_PTR: - { - char *data = (char*)i->exec((void*)NULL); - std::string s(data); - delete [] data; - packet *p = packet::serv_make_command_reply_packet(s, STATUS_SUCCESS); - delete [] data; - write_w_response(p->raw()); - delete p; - } - break; - case RET_FLOAT_PTR: - { - float *ret = (float*)i->exec((void*)NULL); - //todo pack float to unsigned char vector - std::vector<unsigned char> v; - packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - delete ret; - } - break; - case RET_INT_PTR: - { - int *ret = (int*)i->exec((void*)NULL); - //todo pack float to unsigned char vector - std::vector<unsigned char> v; - packet *p = packet::serv_make_command_reply_packet(v, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - delete ret; - } - break; - case RET_NONE: - { - i->exec((void*)NULL); - packet *p = packet::make_status_packet(TYPE_AUTH_REPLY, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - } - break; - case RET_STD_STRING_PTR: - { - std::string *str = (std::string*)i->exec((void*)NULL); - packet *p = packet::serv_make_command_reply_packet(*str, STATUS_SUCCESS); - write_w_response(p->raw()); - delete p; - delete str; - } - break; - case RET_VOID_PTR: - { - //TODO - } - break; - }; - } - } - } - break; - } + handle_data(this, p); } } diff --git a/server/session.h b/server/session.h index 6e3bb1b..56c9628 100644 --- a/server/session.h +++ b/server/session.h @@ -35,11 +35,11 @@ public: { socket_.async_handshake(boost::asio::ssl::stream_base::server, boost::bind(&session::handle_handshake, this, boost::asio::placeholders::error)); } - -private: void write_w_close(const std::vector<unsigned char>& data); void write_w_response(const std::vector<unsigned char>& data); void write_wo_response(const std::vector<unsigned char>& data); + +private: void handle_read(const boost::system::error_code& error, size_t bytes_transferred); void handle_write(const boost::system::error_code& error, size_t bytes_transferred); void handle_write_close(const boost::system::error_code& error, size_t bytes_transferred); |