summaryrefslogtreecommitdiff
path: root/server/service.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'server/service.cpp')
-rw-r--r--server/service.cpp45
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;
}
};