X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fcommand_server.cpp;h=55c4cc1d865d6cade06b5d4220158fc325c6901c;hp=4f386ec97b14e9952a17abd9cbf05adb2115139a;hb=01a464637ed95b0aacd58eb74bdd17df4a7851ab;hpb=b604df5f671b5e7abfd37570d76927a6ebd45f98 diff --git a/src/command_server.cpp b/src/command_server.cpp index 4f386ec..55c4cc1 100644 --- a/src/command_server.cpp +++ b/src/command_server.cpp @@ -75,43 +75,69 @@ void command_server::handle_packet(const std::string& packet, server_connection* istringstream ifs(packet); boost::archive::binary_iarchive ia(ifs); command_container ccont; + result_container res; - // TODO: catch - ia >> ccont; - - std::ostream* ostr; - if ((ostr=s.get_logstream(fulldebug))!=NULL) + try { - (*ostr) << "decoded packet data: " << std::endl; - boost::archive::xml_oarchive xo(*ostr); - xo << BOOST_SERIALIZATION_NVP(ccont); + ia >> ccont; } + catch(boost::archive::archive_exception &e) + { + ostringstream msg; + msg << "archive_exception while deserializing on server-side, " + "code " << e.code << " (" << e.what() << ")"; + res.set_exception(new t2n_serialization_error(msg.str())); + } + catch(...) + { throw; } - // TODO: cast to command subclass (template) - command *cmd=ccont.get_command(); + if (!res.has_exception()) + { + std::ostream* ostr; + if ((ostr=s.get_logstream(fulldebug))!=NULL) + { + (*ostr) << "decoded packet data: " << std::endl; + boost::archive::xml_oarchive xo(*ostr); + xo << BOOST_SERIALIZATION_NVP(ccont); + } - result_container res; + // TODO: cast to command subclass (template) + command *cmd=ccont.get_command(); - if (cmd) - { - try + if (cmd) { - res.set_result((*cmd)()); + try + { + res.set_result((*cmd)()); + } + catch (t2n_exception &e) + { res.set_exception(e.clone()); } + catch (...) + { throw; } } - catch (t2n_exception &e) - { res.set_exception(e.clone()); } - catch (...) - { throw; } + else + throw logic_error("uninitialized command called"); } - else - throw logic_error("uninitialized command called"); ostringstream ofs; boost::archive::binary_oarchive oa(ofs); - // TODO: catch - oa << res; + try + { + oa << res; + } + catch(boost::archive::archive_exception &e) + { + ostringstream msg; + msg << "archive_exception while serializing on server-side, " + "code " << e.code << " (" << e.what() << ")"; + res.set_exception(new t2n_serialization_error(msg.str())); + oa << res; + } + catch(...) + { throw; } + std::ostream* ostr; if ((ostr=s.get_logstream(fulldebug))!=NULL) { (*ostr) << "returning result, decoded data: " << std::endl;