X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fcommand_client.cpp;h=77daf0dd47afd1e9e5c3339285de603e1bcd2da9;hp=41c74de07f6060c8fd31d7b1221a930d121cc52c;hb=45a2ebc9695c4d7be6548b7e0f800d117ae56a0b;hpb=04d86ba4ad4f14ab08f38804e772ec46a8ac92b0 diff --git a/src/command_client.cpp b/src/command_client.cpp index 41c74de..77daf0d 100644 --- a/src/command_client.cpp +++ b/src/command_client.cpp @@ -39,23 +39,35 @@ using namespace std; namespace libt2n { -command_client::command_client(client_connection& _c) +command_client::command_client(client_connection& _c, long long _command_timeout_usec, long long _hello_timeout_usec) : c(_c) { + command_timeout_usec=_command_timeout_usec; + hello_timeout_usec=_hello_timeout_usec; + // for reconnects c.add_callback(new_connection,bind(&command_client::read_hello, boost::ref(*this))); read_hello(); } -void command_client::read_hello() +std::string command_client::read_packet(const long long &usec_timeout) { - // TODO: fix timeout string resultpacket; - while(!c.get_packet(resultpacket) && !c.is_closed()) - c.fill_buffer(); + bool got_packet=false; + long long my_timeout=usec_timeout; + while(!(got_packet=c.get_packet(resultpacket)) && my_timeout > 0 && !c.is_closed()) + c.fill_buffer(my_timeout,&my_timeout); - istringstream hello(resultpacket); + if (!got_packet) + throw t2n_transfer_error("timeout exceeded"); + + return resultpacket; +} + +void command_client::read_hello() +{ + istringstream hello(read_packet(hello_timeout_usec)); char chk[5]; hello.read(chk,4); @@ -87,8 +99,18 @@ void command_client::send_command(command* cmd, result_container &res) command_container cc(cmd); boost::archive::binary_oarchive oa(ofs); - // TODO: exceptions - oa << cc; + try + { + oa << cc; + } + catch(boost::archive::archive_exception &e) + { + ostringstream msg; + msg << "archive_exception while serializing on client-side, code " << e.code << " (" << e.what() << ")"; + throw t2n_serialization_error(msg.str()); + } + catch(...) + { throw; } std::ostream* ostr; if ((ostr=c.get_logstream(fulldebug))!=NULL) @@ -100,16 +122,21 @@ void command_client::send_command(command* cmd, result_container &res) c.write(ofs.str()); - // TODO: fix timeout - string resultpacket; - while(!c.get_packet(resultpacket)) - c.fill_buffer(); - - istringstream ifs(resultpacket); + istringstream ifs(read_packet(command_timeout_usec)); boost::archive::binary_iarchive ia(ifs); - // TODO: exceptions - ia >> res; + try + { + ia >> res; + } + catch(boost::archive::archive_exception &e) + { + ostringstream msg; + msg << "archive_exception while deserializing on client-side, code " << e.code << " (" << e.what() << ")"; + throw t2n_serialization_error(msg.str()); + } + catch(...) + { throw; } if ((ostr=c.get_logstream(fulldebug))!=NULL) {