summaryrefslogtreecommitdiff
path: root/server/service.cpp
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 /server/service.cpp
parent728653fbb36727acfb5a4cd480b7fa5d45adfa89 (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.cpp199
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;
+ }
+}
+
};