summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2013-02-13 21:16:55 +0200
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2013-02-13 21:16:55 +0200
commiteda5eaf4a1be590b9e4905f322b3e0923f65d312 (patch)
tree36aa8f2f08e6fd140f9391b73ee791e1e506339e
parent728653fbb36727acfb5a4cd480b7fa5d45adfa89 (diff)
modified: restarter.workspace
modified: server/service.cpp modified: server/service.h modified: server/session.cpp modified: server/session.h
-rw-r--r--restarter.workspace4
-rw-r--r--server/service.cpp199
-rw-r--r--server/service.h3
-rw-r--r--server/session.cpp196
-rw-r--r--server/session.h4
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);