00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _WSDLINVOKERH
00023 #define _WSDLINVOKERH
00024
00025 #include "xmlpull/XmlSerializer.h"
00026 #include "wsdlparser/WsdlParser.h"
00027 #include "wsdlparser/Soap.h"
00028 #include "xmlpull/wsdlpull_export.h"
00029
00030 #include "xmlpull/XmlDoc.h"
00031
00032 namespace WsdlPull{
00033
00034 struct Parameter
00035 {
00036 Parameter(Schema::Type ,std::string,int m,int x,const SchemaParser* s,
00037 const std::vector<std::string>& parents);
00038 Schema::Type type_;
00039 std::string tag_;
00040 unsigned int min_;
00041 unsigned int max_;
00042 int n_;
00043 std::vector<std::string> data_;
00044
00045 const SchemaParser* sParser_;
00046 std::vector<std::string> parents_;
00047
00048 };
00049
00050 class WSDLPULL_EXPORT WsdlInvoker
00051 {
00052 public:
00061 WsdlInvoker(const std::string &url, const std::string &schemaPath="");
00062 WsdlInvoker(std::istream &input, const std::string &schemaPath = "");
00063 WsdlInvoker();
00064 ~WsdlInvoker();
00066
00074 bool setWSDLUri(const std::string &url, const std::string & schemaPath="");
00080 int getOperations(std::vector<std::string> & operations);
00081 std::string getOpDocumentation(const std::string & n);
00082 std::string getDocumentation();
00088 bool setOperation(const std::string & operation,
00089 WsdlPull::MessageType mType = WsdlPull::Input);
00093 std::string getServiceEndPoint(const std::string & opname) ;
00095
00096
00099
00110 bool setValue(const std::string & param,void* val);
00111 bool setValue(const std::string & param,void** values,unsigned int occur);
00112 bool setValue(const std::string & param,std::string val);
00113 bool setValue(const std::string & param,std::vector<std::string> values);
00114 bool setValue(const std::vector<std::string> & parents,void* val);
00120 bool invoke(long timeout = 0,bool processResponse = true);
00129 void* getValue(const std::string & param,Schema::Type & t);
00130
00131
00152 template <typename T>
00153 T getValue(const std::string & xpath, size_t p_index = 1);
00154
00155
00156 template <typename T>
00157 std::vector<T> getValues(const std::string & xpath);
00159
00162
00177 int getNextInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum);
00178 int getNextInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum,
00179 std::vector<std::string>& parents);
00185 int getNextHeaderInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum);
00186 int getNextHeaderInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum,
00187 std::vector<std::string>& parents);
00191 int nInputHeaders()const;
00192
00200 bool setInputValue(const int param,void* val);
00201 bool setInputValue(const int id,void** values,unsigned int occur);
00202
00210 bool setInputValue(const int param,std::string val);
00211 bool setInputValue(const int param,std::vector<std::string> values);
00212
00218 bool getNextOutput(std::string & name,TypeContainer * & tc);
00219
00224 TypeContainer* getOutput(const std::string & name);
00225
00231 bool getNextHeaderOutput(std::string & name,TypeContainer*& tc);
00232
00234
00235 void setLocation(const std::string & url);
00236
00237 void setCredentials(const std::string & user, const std::string & pass);
00238
00239 void setAuth(const std::string & user, const std::string & pass);
00240
00241 std::string getSoapMessage();
00242 std::string getXMLResponse();
00243 void setProxy(const std::string & host,int port=80);
00244
00245 void setVerbose(bool f);
00246
00247
00248
00249 void printTypeNames(bool f);
00250
00251 std::string errors();
00252
00253 bool status()const;
00254
00255
00256 std::string getFaultCode() const;
00257 std::string getFaultSubCode() const;
00258 std::string getFaultString() const;
00259 std::string getFaultActor() const;
00260
00261
00262 void setProcessEnvAndBody( bool p_processEnvAndBody);
00263 bool getProcessEnvAndBody( void) const;
00264
00265 void setLazyRelativeMatch( bool p_lazyRelativeMatch);
00266 bool getLazyRelativeMatch( void) const;
00267
00268 void setBuildXmlTree( bool p_buildXmlTree);
00269 bool getBuildXmlTree( void) const;
00270 void buildXmlTree( XmlPullParser &p_xmlPullParser, XmlNode_t &p_xmlNode,
00271 bool p_notScannedEventAvail = false);
00272
00273 private:
00274
00275
00276 bool init(WsdlParser* parser);
00277
00278 void serialize();
00279 void serializeType(Schema::Type typeId,
00280 const std::string &tag,
00281 const SchemaParser * sParser,
00282 int minimum,
00283 int maximum,
00284 std::vector<std::string> parents,
00285 const std::string nsp="",
00286 bool isRoot = false);
00287
00288 void serializeParam(int n,const std::string & tag,
00289 const SchemaParser * sParser,
00290 const std::string nsp="",
00291 bool isRoot = false);
00292 void serializeContentModel(ContentModel *cm,
00293 const SchemaParser *sParser,
00294 std::vector<std::string> parents);
00299 void post(long timeout=0, std::string username="", std::string passwd="");
00300 void processResults();
00301 void processFault(XmlPullParser* xpp);
00302 void processHeader(XmlPullParser *xpp);
00303 void processBody(const Message* m,XmlPullParser* xpp);
00304 void parseWsdl(const std::string & url, const std::string & schemaPath = "");
00305 void serializeHeader();
00306 bool isSoapArray (const ComplexType * ct,const SchemaParser * sParser);
00307
00308 void reset();
00309 void getOperationDetails(const Operation* op);
00310 std::string getPrefix(const std::string& nsp);
00311 std::string getAsStringFromXPath(const std::string & xpath, size_t p_index, std::vector<std::string>* arr = 0);
00312 WsdlParser * wParser_;
00313 std::string strResults_;
00314 WsdlParser * ourParser_;
00315 XmlSerializer * xmlStream_;
00316 Soap* soap_;
00317 bool soapheaders_;
00318 int hPartId_;
00319 std::string hnsp_;
00320 std::ostringstream * soapstr_;
00321 std::ostringstream logger_;
00322 bool status_;
00323 bool serializeMode_;
00324 bool verbose_;
00325 bool dontPost_;
00326 int oHeaders_;
00327 std::map<std::string,const Operation*> opMap_;
00328 const Operation* op_;
00329 Soap::Encoding use_;
00330 std::string encodingStyle_;
00331 Soap::Style style_;
00332 std::string nsp_;
00333 std::string location_;
00334 std::string username_,password_,host_;
00335 int port_;
00336 std::string action_;
00337 std::vector<Parameter> elems_;
00338 size_t n_;
00339 int iHeaders_;
00340 std::vector<std::pair<std::string,TypeContainer*> > outputs_;
00341 std::vector<const XSDType* > avoidrecurse_;
00342 WsdlPull::MessageType messageType_;
00343
00344 std::vector<std::string> prefixes_;
00345 bool bAuth;
00346 std::string sAuthUser;
00347 std::string sAuthPass;
00348
00349 std::string sFaultCode;
00350 std::string sFaultSubCode;
00351 std::string sFaultString;
00352 std::string sFaultActor;
00353 void* ctx;
00354
00355 bool m_buildXmlTree;
00356 bool m_xmlTreeProduced;
00357 XmlDoc_t m_xmlDoc;
00358 };
00359
00360 inline
00361 Parameter::Parameter(Schema::Type t,std::string n,int m,int x,const SchemaParser* s,
00362 const std::vector<std::string>& parents)
00363 :type_(t),
00364 tag_(n),
00365 min_(m),
00366 max_(x),
00367 n_(0),
00368 sParser_(s),
00369 parents_(parents)
00370
00371 {
00372 }
00373
00374 inline
00375 std::string
00376 WsdlInvoker::errors()
00377 {
00378 return logger_.str();
00379 }
00380
00381 inline
00382 bool
00383 WsdlInvoker::setWSDLUri(const std::string &url,const std::string & schemaPath)
00384 {
00385 parseWsdl(url,schemaPath);
00386 return status_;
00387 }
00388
00389 inline
00390 bool
00391 WsdlInvoker::status()const
00392 {
00393 return status_;
00394 }
00395
00396 inline
00397 void
00398 WsdlInvoker::setLocation(const std::string & url)
00399 {
00400 location_ = url;
00401 }
00402
00403 inline
00404 void
00405 WsdlInvoker::setVerbose(bool f)
00406 {
00407 verbose_ = f;
00408 }
00409
00410 inline
00411 int
00412 WsdlInvoker::nInputHeaders()const
00413 {
00414 return iHeaders_;
00415 }
00416
00417 inline
00418 std::string
00419 WsdlInvoker::getFaultCode() const
00420 {
00421 return sFaultCode;
00422 }
00423
00424 inline
00425 std::string
00426 WsdlInvoker::getFaultSubCode() const
00427 {
00428 return sFaultSubCode;
00429 }
00430
00431 inline
00432 std::string
00433 WsdlInvoker::getFaultString() const
00434 {
00435 return sFaultString;
00436 }
00437
00438 inline
00439 std::string
00440 WsdlInvoker::getFaultActor() const
00441 {
00442 return sFaultActor;
00443 }
00444
00445
00446 template<typename T>
00447 inline T
00448 WsdlInvoker::getValue(const std::string & xpath, size_t p_index)
00449 {
00450
00451 T val;
00452 std::string v = getAsStringFromXPath(xpath, p_index);
00453 std::istringstream iss(v);
00454 iss>>val;
00455 return val;
00456 }
00457
00458 template<>
00459 inline std::string
00460 WsdlInvoker::getValue<std::string>(const std::string & xpath, size_t p_index)
00461 {
00462
00463 return getAsStringFromXPath(xpath, p_index);
00464
00465 }
00466
00467 template <typename T>
00468 inline std::vector<T>
00469 WsdlInvoker::getValues(const std::string & xpath)
00470 {
00471 std::vector<std::string> arr ;
00472 std::vector<T> arrT;
00473 getAsStringFromXPath(xpath, 0, &arr);
00474 T val;
00475 for (size_t s = 0 ;s<arr.size();s++){
00476
00477
00478 std::istringstream iss(arr[s]);
00479 iss>>val;
00480 arrT.push_back(val);
00481 }
00482 return arrT;
00483 }
00484
00485
00486 template<>
00487 inline
00488 std::vector<std::string>
00489 WsdlInvoker::getValues<std::string>(const std::string & xpath)
00490 {
00491 std::vector<std::string> arr ;
00492 getAsStringFromXPath(xpath, 0, &arr);
00493 return arr;
00494 }
00495
00496
00497 }
00498 #endif