X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fcommand_client.cpp;h=5d7169232acb3e07775a46d684e3466ee276b439;hp=8ccbf1046d3e97c7cfbf0d0b983dc0c57ac8b2fa;hb=696c95c2808d6f88df2b348f9e77fc66c9068976;hpb=fb3345ada7ea94225b78994fd50e3de693a2a3d5 diff --git a/src/command_client.cpp b/src/command_client.cpp index 8ccbf10..5d71692 100644 --- a/src/command_client.cpp +++ b/src/command_client.cpp @@ -39,8 +39,15 @@ using namespace std; namespace libt2n { +/** + * Constructor + * @param _c connection for this command. Ownership of the pointer is outside. + * @param _command_timeout_usec timeout until the command has to be completed + * @param _hello_timeout_usec timeout until hello has to be received + */ command_client::command_client(client_connection* _c, long long _command_timeout_usec, long long _hello_timeout_usec) : c(_c) + , constructorException(NULL) { command_timeout_usec=_command_timeout_usec; hello_timeout_usec=_hello_timeout_usec; @@ -49,12 +56,39 @@ command_client::command_client(client_connection* _c, long long _command_timeout c->add_callback(new_connection,bind(&command_client::read_hello, boost::ref(*this))); // don't expect hello from an always closed connection (like dummy_client_connection) - if (!c->is_closed()) - read_hello(); + if (!is_connection_closed()) + { + try + { + read_hello(); + } + catch (t2n_communication_error &e) + { + c->close(); + + // store a copy of the exception that you can find out details about the error later + constructorException = e.clone(); + } + catch (...) + { + throw; + } + } } -/** @brief replace the connection currently in use with a new one +/** + * Destructor + */ +command_client::~command_client() +{ + if (constructorException) + { + delete constructorException; + constructorException = NULL; + } +} +/** @brief replace the connection currently in use with a new one @param _c pointer to the new connection @note the old connection must still be valid when this method is called, @@ -82,6 +116,12 @@ void command_client::replace_connection(client_connection* _c) read_hello(); } +/** @brief return a complete packet + @param usec_timeout maximum microseconds to wait until the packet is complete + @retval packet data as std::string + + @note throws a t2n_transfer_error if the timeout is exceeded +*/ std::string command_client::read_packet(const long long &usec_timeout) { string resultpacket; @@ -96,6 +136,10 @@ std::string command_client::read_packet(const long long &usec_timeout) return resultpacket; } +/** @brief read and check the hello message at the beginning of a connection + + @note throws exceptions if something went wrong +*/ void command_client::read_hello() { string resultpacket; @@ -116,7 +160,14 @@ void command_client::read_hello() throw t2n_version_mismatch("illegal hello received (incomplete): "+resultpacket); } -bool command_client::check_hello(const string& hellostr) +/** @brief check if a hello message is valid + @param hellostr std::string with the message to check + @retval true if the hello is good and complete + + @note you can check incomplete hellos. you will get a false return value + but no exception. throws exceptions as soon as something is wrong. +*/ +bool command_client::check_hello(const std::string& hellostr) { istringstream hello(hellostr); @@ -191,12 +242,22 @@ bool command_client::check_hello(const string& hellostr) return true; } +/** @brief send a command to the server and store the result + @param cmd pointer to a command-object + @param[out] res result container to store the result in + + @note you can check incomplete hellos. you will get a false return value + but no exception. throws exceptions as soon as something is wrong. +*/ void command_client::send_command(command* cmd, result_container &res) { ostringstream ofs; command_container cc(cmd); boost::archive::binary_oarchive oa(ofs); + if (is_connection_closed()) + throw t2n_transfer_error("connection to server is closed"); + try { oa << cc; @@ -216,7 +277,7 @@ void command_client::send_command(command* cmd, result_container &res) (*ostr) << "sending command, decoded data: " << std::endl; boost::archive::xml_oarchive xo(*ostr); xo << BOOST_SERIALIZATION_NVP(cc); - } + } c->write(ofs.str());