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 | |
| parent | 728653fbb36727acfb5a4cd480b7fa5d45adfa89 (diff) | |
	modified:   restarter.workspace
	modified:   server/service.cpp
	modified:   server/service.h
	modified:   server/session.cpp
	modified:   server/session.h
| -rw-r--r-- | restarter.workspace | 4 | ||||
| -rw-r--r-- | server/service.cpp | 199 | ||||
| -rw-r--r-- | server/service.h | 3 | ||||
| -rw-r--r-- | server/session.cpp | 196 | ||||
| -rw-r--r-- | server/session.h | 4 | 
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);  | 
