catches more internal exceptions (e.g. AmArgArray) and passes them as XMLRPC exceptions

git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@350 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 19 years ago
parent c53df18673
commit e5dfd2811f

@ -31,14 +31,15 @@
#include "log.h"
#include "AmConfigReader.h"
#include "AmUtils.h"
#include "AmArg.h"
#define MOD_NAME "xmlrpc2di"
#define XMLRPC_PORT "8090" // default port
EXPORT_PLUGIN_CLASS_FACTORY(XMLRPC2DI, MOD_NAME)
XMLRPC2DI::XMLRPC2DI(string mod_name)
: AmDynInvokeFactory(mod_name)
XMLRPC2DI::XMLRPC2DI(string mod_name)
: AmDynInvokeFactory(mod_name)
{
}
@ -107,57 +108,68 @@ void XMLRPC2DIServerSetLoglevelMethod::execute(XmlRpcValue& params, XmlRpcValue&
void XMLRPC2DIServerDIMethod::execute(XmlRpcValue& params, XmlRpcValue& result) {
if (params.size() < 2) {
DBG("XMLRPC2DI: ERROR: need at least factory name and function name to call\n");
throw XmlRpcException("need at least factory name and function name to call", 400);
}
try {
if (params.size() < 2) {
DBG("XMLRPC2DI: ERROR: need at least factory name and function name to call\n");
throw XmlRpcException("need at least factory name and function name to call", 400);
}
string fact_name = params[0];
string fct_name = params[1];
DBG("XMLRPC2DI: factory '%s' function '%s'\n",
fact_name.c_str(), fct_name.c_str());
// get args
AmArgArray args;
for (int i=2; i<params.size();i++) {
switch (params[i].getType()) {
case XmlRpcValue::TypeInt: { args.push(AmArg((int)params[i])); } break;
case XmlRpcValue::TypeDouble:{ args.push(AmArg((double)params[i])); } break;
case XmlRpcValue::TypeString:{ args.push(AmArg(((string)params[i]).c_str())); } break;
// TODO: support more types (datetime, struct, ...)
default: throw XmlRpcException("unsupported parameter type", 400);
};
}
string fact_name = params[0];
string fct_name = params[1];
DBG("XMLRPC2DI: factory '%s' function '%s'\n",
fact_name.c_str(), fct_name.c_str());
// get args
AmArgArray args;
for (int i=2; i<params.size();i++) {
switch (params[i].getType()) {
case XmlRpcValue::TypeInt: { args.push(AmArg((int)params[i])); } break;
case XmlRpcValue::TypeDouble:{ args.push(AmArg((double)params[i])); } break;
case XmlRpcValue::TypeString:{ args.push(AmArg(((string)params[i]).c_str())); } break;
// TODO: support more types (datetime, struct, ...)
default: throw XmlRpcException("unsupported parameter type", 400);
};
}
AmDynInvokeFactory* di_f = AmPlugIn::instance()->getFactory4Di(fact_name);
if(!di_f){
throw XmlRpcException("could not get factory", 500);
}
AmDynInvoke* di = di_f->getInstance();
if(!di){
throw XmlRpcException("could not get instance from factory", 500);
}
AmArgArray ret;
di->invoke(fct_name, args, ret);
AmDynInvokeFactory* di_f = AmPlugIn::instance()->getFactory4Di(fact_name);
if(!di_f){
throw XmlRpcException("could not get factory", 500);
}
AmDynInvoke* di = di_f->getInstance();
if(!di){
throw XmlRpcException("could not get instance from factory", 500);
}
AmArgArray ret;
di->invoke(fct_name, args, ret);
if (ret.size()) {
result.setSize(ret.size());
if (ret.size()) {
result.setSize(ret.size());
for (unsigned int i=0;i<ret.size();i++) {
const AmArg& r = ret.get(i);
switch (r.getType()) {
case AmArg::CStr:
result[i]= string(r.asCStr()); break;
case AmArg::Int:
result[i]=r.asInt(); break;
case AmArg::Double:
result[i]=r.asDouble(); break;
default: break;
// TODO: do sth with the data here
for (unsigned int i=0;i<ret.size();i++) {
const AmArg& r = ret.get(i);
switch (r.getType()) {
case AmArg::CStr:
result[i]= string(r.asCStr()); break;
case AmArg::Int:
result[i]=r.asInt(); break;
case AmArg::Double:
result[i]=r.asDouble(); break;
default: break;
// TODO: do sth with the data here
}
}
}
} catch (const XmlRpcException& e) {
throw;
} catch (const AmDynInvoke::NotImplemented& e) {
throw XmlRpcException("Exception: AmDynInvoke::NotImplemented: "
+ e.what, 504);
} catch (const AmArgArray::OutOfBoundsException& e) {
throw XmlRpcException("Exception: AmArgArray out of bounds - paramter number mismatch.", 300);
} catch (const string& e) {
throw XmlRpcException("Exception: "+e, 500);
} catch (...) {
throw XmlRpcException("Exception occured.", 500);
}
}

Loading…
Cancel
Save