23 #include "MethodInvoc.h"
25 MethodInvoc::MethodInvoc() {
30 MethodInvoc::~MethodInvoc() {
35 void MethodInvoc::init()
37 if(_methinv_instance==NULL)
40 _methinv_instance->running =
false;
43 void* MethodInvoc::service(
void* arg)
47 string methInfo,retValue;
48 _methinv_instance->getServer().Receive(fd,methInfo,1024);
49 methInfo =methInfo.substr(0,methInfo.find_last_of(
">")+1);
53 if(methInfo.find(
"lang=\"c++\"")!=string::npos || methInfo.find(
"lang='c++'")!=string::npos)
55 Document doc = parser.getDocument(methInfo);
56 Element message = doc.getRootElement();
57 if(message.getTagName()!=
"method")
61 if(message.getAttributes().size()<3)
65 else if(message.getAttribute(
"name")==
"")
69 else if(message.getAttribute(
"className")==
"")
73 else if(message.getAttribute(
"lang")==
"")
77 if(message.getChildElements().size()!=1)
81 else if(message.getChildElements().at(0).getTagName()!=
"args")
89 ElementList argts = message.getChildElements().at(0).getChildElements();
90 for (
unsigned var = 0; var < argts.size(); var++)
94 if(arg.getTagName()!=
"argument" || arg.getAttribute(
"type")==
"")
96 if(arg.getText()==
"" && arg.getChildElements().size()==0)
98 if(arg.getAttribute(
"type")==
"int")
101 *vt = CastUtil::lexical_cast<
int>(arg.getText());
104 else if(arg.getAttribute(
"type")==
"float")
106 float *vt =
new float;
107 *vt = CastUtil::lexical_cast<
float>(arg.getText());
110 else if(arg.getAttribute(
"type")==
"double")
112 double *vt =
new double;
113 *vt = CastUtil::lexical_cast<
double>(arg.getText());
116 else if(arg.getAttribute(
"type")==
"string")
118 string *vt =
new string;
119 *vt = CastUtil::lexical_cast<
string>(arg.getText());
122 else if(arg.getAttribute(
"type")!=
"")
124 Element obj = arg.getChildElements().at(0);
125 string objxml = obj.render();
126 string objClassName = obj.getTagName();
127 value = ser.unSerializeUnknown(objxml,arg.getAttribute(
"type"));
129 argus.push_back(arg.getAttribute(
"type"));
130 valus.push_back(value);
132 string className = message.getAttribute(
"className");
133 string returnType = message.getAttribute(
"returnType");
134 string lang = message.getAttribute(
"lang");
135 ClassInfo clas = reflector.getClassInfo(className);
136 string methodName = message.getAttribute(
"name");;
137 if(clas.getClassName()==
"")
141 Method meth = clas.getMethod(methodName,argus);
142 if(meth.getMethodName()==
"")
144 throw new MethodInvokerException(
"method does not exist for the class or the class does not exist in the library path\n",retValue);
150 void *_temp = reflector.newInstanceGVP(ctor);
151 if(returnType==
"void" || returnType==
"")
153 reflector.invokeMethod<
void*>(_temp,meth,valus);
154 retValue = (
"<return:void></return:void>");
158 if(returnType==
"int")
160 int retv = reflector.invokeMethod<
int>(_temp,meth,valus);
161 retValue = (
"<return:int>"+CastUtil::lexical_cast<
string>(retv)+
"</return:int>");
163 else if(returnType==
"float")
165 float retv = reflector.invokeMethod<
float>(_temp,meth,valus);
166 retValue = (
"<return:float>"+CastUtil::lexical_cast<
string>(retv)+
"</return:float>");
168 else if(returnType==
"double")
170 double retv = reflector.invokeMethod<
double>(_temp,meth,valus);
171 retValue = (
"<return:double>"+CastUtil::lexical_cast<
string>(retv)+
"</return:double>");
173 else if(returnType==
"string")
175 string retv = reflector.invokeMethod<
string>(_temp,meth,valus);
176 retValue = (
"<return:string>"+retv+
"</return:string>");
178 else if(returnType!=
"")
180 void* retobj = reflector.invokeMethodUnknownReturn(_temp,meth,valus);
181 string oxml = ser.serializeUnknown(retobj,returnType);
182 retValue = (
"<return:"+returnType+
">"+oxml+
"</return:"+returnType+
">");
190 retValue =
"<return:exception>This is a C++ daemon</return:exception>";
193 _methinv_instance->getServer().Send(fd,retValue);
198 _methinv_instance->getServer().Send(fd,retValue);
203 retValue = (
"<return:exception>XmlParseException occurred</return:exception>");
204 _methinv_instance->getServer().Send(fd,retValue);
211 void MethodInvoc::trigger(
string port)
214 if(_methinv_instance->running)
216 Server serv(port,
false,500,&service,2);
217 _methinv_instance->server = serv;
218 _methinv_instance->running =
true;
222 void MethodInvoc::stop()
224 _methinv_instance->server.stop();