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 /server/service.cpp | |
parent | 728653fbb36727acfb5a4cd480b7fa5d45adfa89 (diff) |
modified: restarter.workspace
modified: server/service.cpp
modified: server/service.h
modified: server/session.cpp
modified: server/session.h
Diffstat (limited to 'server/service.cpp')
-rw-r--r-- | server/service.cpp | 199 |
1 files changed, 199 insertions, 0 deletions
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; + } +} + }; |