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 namespace WsdlPull{
00031
00032 struct Parameter
00033 {
00034 Parameter(Schema::Type ,std::string,int m,int x,const SchemaParser* s,
00035 const std::vector<std::string>& parents);
00036 Schema::Type type_;
00037 std::string tag_;
00038 unsigned int min_;
00039 unsigned int max_;
00040 int n_;
00041 std::vector<std::string> data_;
00042
00043 const SchemaParser* sParser_;
00044 std::vector<std::string> parents_;
00045
00046 };
00047
00048 class WSDLPULL_EXPORT WsdlInvoker
00049 {
00050 public:
00051
00052
00053
00054
00055
00056
00057
00058
00059 WsdlInvoker(const std::string &url, const std::string &schemaPath="");
00060 WsdlInvoker(std::istream &input, const std::string &schemaPath = "");
00061 WsdlInvoker();
00062 ~WsdlInvoker();
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 bool setWSDLUri(const std::string &url, const std::string & schemaPath="");
00073
00074
00075
00076
00077
00078 int getOperations(std::vector<std::string> & operations);
00079 std::string getOpDocumentation(const std::string & n);
00080 std::string getDocumentation();
00081
00082
00083
00084
00085
00086 bool setOperation(const std::string & operation,
00087 WsdlPull::MessageType mType = WsdlPull::Input);
00088
00089
00090
00091 std::string getServiceEndPoint(const std::string & opname) ;
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 bool setValue(const std::string & param,void* val);
00109 bool setValue(const std::string & param,void** values,unsigned int occur);
00110 bool setValue(const std::string & param,std::string val);
00111 bool setValue(const std::string & param,std::vector<std::string> values);
00112 bool setValue(const std::vector<std::string> & parents,void* val);
00113
00114
00115
00116
00117
00118 bool invoke(long timeout = 0,bool processResponse = true);
00119
00120
00121
00122
00123
00124
00125
00126
00127 void* getValue(const std::string & param,Schema::Type & t);
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 template <typename T>
00148 T getValue(const std::string & xpath);
00149
00150
00151 template <typename T>
00152 std::vector<T> getValues(const std::string & xpath);
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 int getNextInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum);
00173 int getNextInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum,
00174 std::vector<std::string>& parents);
00175
00176
00177
00178
00179
00180 int getNextHeaderInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum);
00181 int getNextHeaderInput(std::string & param ,Schema::Type & type,int & minimum,int & maximum,
00182 std::vector<std::string>& parents);
00183
00184
00185
00186 int nInputHeaders()const;
00187
00188
00189
00190
00191
00192
00193
00194
00195 bool setInputValue(const int param,void* val);
00196 bool setInputValue(const int id,void** values,unsigned int occur);
00197
00198
00199
00200
00201
00202
00203
00204
00205 bool setInputValue(const int param,std::string val);
00206 bool setInputValue(const int param,std::vector<std::string> values);
00207
00208
00209
00210
00211
00212
00213 bool getNextOutput(std::string & name,TypeContainer * & tc);
00214
00215
00216
00217
00218
00219 TypeContainer* getOutput(const std::string & name);
00220
00221
00222
00223
00224
00225
00226 bool getNextHeaderOutput(std::string & name,TypeContainer*& tc);
00227
00228
00229
00230 void setLocation(const std::string & url);
00231
00232 void setCredentials(const std::string & user, const std::string & pass);
00233
00234 void setAuth(const std::string & user, const std::string & pass);
00235
00236 std::string getSoapMessage();
00237 std::string getXMLResponse();
00238 void setProxy(const std::string & host,int port=80);
00239
00240 void setVerbose(bool f);
00241
00242
00243
00244 void printTypeNames(bool f);
00245
00246 std::string errors();
00247
00248 bool status()const;
00249
00250
00251 std::string getFaultCode() const;
00252 std::string getFaultSubCode() const;
00253 std::string getFaultString() const;
00254 std::string getFaultActor() const;
00255
00256
00257 private:
00258
00259
00260 bool init(WsdlParser* parser);
00261
00262 void serialize();
00263 void serializeType(Schema::Type typeId,
00264 const std::string &tag,
00265 const SchemaParser * sParser,
00266 int minimum,
00267 int maximum,
00268 std::vector<std::string> parents,
00269 const std::string nsp="",
00270 bool isRoot = false);
00271
00272 void serializeParam(int n,const std::string & tag,
00273 const SchemaParser * sParser,
00274 const std::string nsp="",
00275 bool isRoot = false);
00276 void serializeContentModel(ContentModel *cm,
00277 const SchemaParser *sParser,
00278 std::vector<std::string> parents);
00279
00280
00281
00282
00283 void post(long timeout=0, std::string username="", std::string passwd="");
00284 void processResults();
00285 void processFault(XmlPullParser* xpp);
00286 void processHeader(XmlPullParser *xpp);
00287 void processBody(const Message* m,XmlPullParser* xpp);
00288 void parseWsdl(const std::string & url, const std::string & schemaPath = "");
00289 void serializeHeader();
00290 bool isSoapArray (const ComplexType * ct,const SchemaParser * sParser);
00291
00292 void reset();
00293 void getOperationDetails(const Operation* op);
00294 std::string getPrefix(const std::string& nsp);
00295 std::string getAsStringFromXPath(const std::string & xpath, std::vector<std::string>* arr = 0);
00296 WsdlParser * wParser_;
00297 std::string strResults_;
00298 WsdlParser * ourParser_;
00299 XmlSerializer * xmlStream_;
00300 Soap* soap_;
00301 bool soapheaders_;
00302 int hPartId_;
00303 std::string hnsp_;
00304 std::ostringstream * soapstr_;
00305 std::ostringstream logger_;
00306 bool status_;
00307 bool serializeMode_;
00308 bool verbose_;
00309 bool dontPost_;
00310 int oHeaders_;
00311 std::map<std::string,const Operation*> opMap_;
00312 const Operation* op_;
00313 Soap::Encoding use_;
00314 std::string encodingStyle_;
00315 Soap::Style style_;
00316 std::string nsp_;
00317 std::string location_;
00318 std::string username_,password_,host_;
00319 int port_;
00320 std::string action_;
00321 std::vector<Parameter> elems_;
00322 size_t n_;
00323 int iHeaders_;
00324 std::vector<std::pair<std::string,TypeContainer*> > outputs_;
00325 std::vector<const XSDType* > avoidrecurse_;
00326 WsdlPull::MessageType messageType_;
00327
00328 std::vector<std::string> prefixes_;
00329 bool bAuth;
00330 std::string sAuthUser;
00331 std::string sAuthPass;
00332
00333 std::string sFaultCode;
00334 std::string sFaultSubCode;
00335 std::string sFaultString;
00336 std::string sFaultActor;
00337 void* ctx;
00338 };
00339
00340 inline
00341 Parameter::Parameter(Schema::Type t,std::string n,int m,int x,const SchemaParser* s,
00342 const std::vector<std::string>& parents)
00343 :type_(t),
00344 tag_(n),
00345 min_(m),
00346 max_(x),
00347 n_(0),
00348 sParser_(s),
00349 parents_(parents)
00350
00351 {
00352 }
00353
00354 inline
00355 std::string
00356 WsdlInvoker::errors()
00357 {
00358 return logger_.str();
00359 }
00360
00361 inline
00362 bool
00363 WsdlInvoker::setWSDLUri(const std::string &url,const std::string & schemaPath)
00364 {
00365 parseWsdl(url,schemaPath);
00366 return status_;
00367 }
00368
00369 inline
00370 bool
00371 WsdlInvoker::status()const
00372 {
00373 return status_;
00374 }
00375
00376 inline
00377 void
00378 WsdlInvoker::setLocation(const std::string & url)
00379 {
00380 location_ = url;
00381 }
00382
00383 inline
00384 void
00385 WsdlInvoker::setVerbose(bool f)
00386 {
00387 verbose_ = f;
00388 }
00389
00390 inline
00391 int
00392 WsdlInvoker::nInputHeaders()const
00393 {
00394 return iHeaders_;
00395 }
00396
00397 inline
00398 std::string
00399 WsdlInvoker::getFaultCode() const
00400 {
00401 return sFaultCode;
00402 }
00403
00404 inline
00405 std::string
00406 WsdlInvoker::getFaultSubCode() const
00407 {
00408 return sFaultSubCode;
00409 }
00410
00411 inline
00412 std::string
00413 WsdlInvoker::getFaultString() const
00414 {
00415 return sFaultString;
00416 }
00417
00418 inline
00419 std::string
00420 WsdlInvoker::getFaultActor() const
00421 {
00422 return sFaultActor;
00423 }
00424
00425
00426 template<typename T>
00427 inline T
00428 WsdlInvoker::getValue(const std::string & xpath)
00429 {
00430
00431 T val;
00432 std::string v = getAsStringFromXPath(xpath);
00433 std::istringstream iss(v);
00434 iss>>val;
00435 return val;
00436 }
00437
00438 template<>
00439 inline std::string
00440 WsdlInvoker::getValue<std::string>(const std::string & xpath)
00441 {
00442
00443 return getAsStringFromXPath(xpath);
00444
00445 }
00446
00447 template <typename T>
00448 inline std::vector<T>
00449 WsdlInvoker::getValues(const std::string & xpath)
00450 {
00451 std::vector<std::string> arr ;
00452 std::vector<T> arrT;
00453 getAsStringFromXPath(xpath,&arr);
00454 T val;
00455 for (size_t s = 0 ;s<arr.size();s++){
00456
00457
00458 std::istringstream iss(arr[s]);
00459 iss>>val;
00460 arrT.push_back(val);
00461 }
00462 return arrT;
00463 }
00464
00465
00466 template<>
00467 inline
00468 std::vector<std::string>
00469 WsdlInvoker::getValues<std::string>(const std::string & xpath)
00470 {
00471 std::vector<std::string> arr ;
00472 getAsStringFromXPath(xpath,&arr);
00473 return arr;
00474 }
00475
00476
00477 }
00478 #endif