diff options
Diffstat (limited to 'server/service.cpp')
-rw-r--r-- | server/service.cpp | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/server/service.cpp b/server/service.cpp index b00406f..541f935 100644 --- a/server/service.cpp +++ b/server/service.cpp @@ -31,13 +31,13 @@ bool service_info::command::operator==(const std::string &command) return command == this->command; } -void handle_data(session *s, proto::packet &p) +bool handle_data(session *s, proto::packet &p) { using namespace proto; if(!p.is_good()) - { - delete s; - } + return false; + if(!p.is_client_packet()) + return false; switch(p.get_type()) { case TYPE_AUTH: @@ -47,15 +47,37 @@ void handle_data(session *s, proto::packet &p) packet *r = packet::serv_make_status_packet(TYPE_AUTH, STATUS_FAILURE); s->write_w_close(r->raw()); delete r; - return; + return false; } else { packet *r = packet::serv_make_status_packet(TYPE_AUTH, STATUS_SUCCESS); s->write_w_response(r->raw()); delete r; - return; + return true; + } + } + break; + case TYPE_SERVICES: + { //TODO: rewrite + std::list<service_s> svcs; + for(std::list<service_info>::iterator i = installed_services.begin(), end = installed_services.end(); i != end; ++i) + { + service_s s; + s.service = i->name; + for(std::list<service_info::command>::iterator ii = i->predefined.begin(), eend = i->predefined.end(); ii != eend; ++ii) + { + service_s::cmd c; + c.command = ii->command; + c.description = ii->description; + s.cmds.push_back(c); + } + svcs.push_back(s); } + packet *r = packet::serv_make_services_packet(svcs); + s->write_w_response(r->raw()); + delete r; + return true; } break; case TYPE_COMMAND: @@ -86,6 +108,7 @@ void handle_data(session *s, proto::packet &p) packet *p = packet::serv_make_command_reply_packet(str, STATUS_SUCCESS); s->write_w_response(p->raw()); delete p; + return true; } break; case RET_FLOAT_PTR: @@ -98,6 +121,7 @@ void handle_data(session *s, proto::packet &p) s->write_w_response(p->raw()); delete p; delete ret; + return true; } break; case RET_INT_PTR: @@ -110,6 +134,7 @@ void handle_data(session *s, proto::packet &p) s->write_w_response(p->raw()); delete p; delete ret; + return true; } break; case RET_NONE: @@ -119,6 +144,7 @@ void handle_data(session *s, proto::packet &p) packet *p = packet::serv_make_status_packet(TYPE_COMMAND, STATUS_SUCCESS); s->write_w_response(p->raw()); delete p; + return true; } break; case RET_STD_STRING_PTR: @@ -129,6 +155,7 @@ void handle_data(session *s, proto::packet &p) s->write_w_response(p->raw()); delete p; delete str; + return true; } break; case RET_VOID_PTR: @@ -176,6 +203,7 @@ void handle_data(session *s, proto::packet &p) delete [] data; s->write_w_response(p->raw()); delete p; + return true; } break; case RET_FLOAT_PTR: @@ -187,6 +215,7 @@ void handle_data(session *s, proto::packet &p) s->write_w_response(p->raw()); delete p; delete ret; + return true; } break; case RET_INT_PTR: @@ -198,6 +227,7 @@ void handle_data(session *s, proto::packet &p) s->write_w_response(p->raw()); delete p; delete ret; + return true; } break; case RET_NONE: @@ -206,6 +236,7 @@ void handle_data(session *s, proto::packet &p) packet *p = packet::serv_make_status_packet(TYPE_AUTH, STATUS_SUCCESS); s->write_w_response(p->raw()); delete p; + return true; } break; case RET_STD_STRING_PTR: @@ -215,6 +246,7 @@ void handle_data(session *s, proto::packet &p) s->write_w_response(p->raw()); delete p; delete str; + return true; } break; case RET_VOID_PTR: @@ -228,6 +260,7 @@ void handle_data(session *s, proto::packet &p) } break; } + return false; } }; |