00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef _WIN32
00023 #include <windows.h>
00024 #include <winreg.h>
00025 #include <wininet.h>
00026 #include <w3c.h>
00027 #pragma comment(lib, "wininet.lib")
00028 #endif
00029
00030 #ifdef HAVE_CONFIG_H //
00031 #include <config.h>
00032 #endif
00033
00034 #ifndef _WIN32
00035 #include <termios.h>
00036 #include <unistd.h>
00037 #include <errno.h>
00038 #endif
00039
00040 #ifdef WITH_CURL
00041 #include <curl/curl.h>
00042 #endif
00043
00044 #include <time.h>
00045 #include <cstdlib>
00046 #include <cstring>
00047 #include <fstream>
00048 #include <map>
00049 #include "xmlpull/XmlUtils.h"
00050
00051 const std::string ALPHA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
00052
00053 std::map<std::string,std::string> urlCache_;
00054
00055
00056 int
00057 XmlUtils::parseInt (std::string s, int radix)
00058 {
00059 int len = s.size ();
00060 int value = 0;
00061 if (s.empty ())
00062 return -1;
00063 for (int i = 0; i < len; i++) {
00064 if (radix == 10) {
00065 if (s[i] <= '9' && s[i] >= '0')
00066 value = (i == 0) ? (s[i] - '0') : radix * value + (s[i] - '0');
00067
00068 else
00069 return value;
00070 }
00071 else if (radix == 16) {
00072
00073 if (s[i] <= '9' && s[i] >= 0)
00074 value = (i == 0) ? (s[i] - '0') : radix * value + (s[i] - '0');
00075
00076 else if (s[i] <= 'F' && s[i] >= 'A')
00077 value =
00078 (i ==
00079 0) ? (s[i] - 'A') + 10 : radix * value + (s[i] - 'A') + 10;
00080
00081 else if (s[i] <= 'f' && s[i] >= 'a')
00082 value =(i ==0) ? (s[i] - 'a') + 10 : radix * value + (s[i] - 'a') + 10;
00083 }
00084 }
00085 return value;
00086 }
00087
00088
00089 std::ostream &
00090 XmlUtils::dbsp (std::ostream & str)
00091 {
00092 return str << " ";
00093 }
00094
00095
00096 std::ostream &
00097 XmlUtils::blk (std::ostream & str)
00098 {
00099 return str << std::endl << "*************" << std::endl;
00100 }
00101
00102
00103
00104
00105
00106 bool
00107 WSDLPULL_EXPORT
00108 XmlUtils::fetchUri(std::string uri,
00109 std::string& filename)
00110 {
00111 if(uri.find("http://")!=std::string::npos ||
00112 uri.find("https://")!=std::string::npos ||
00113 uri.find("ftp://") !=std::string::npos)
00114 {
00115
00116 if (urlCache_.find(uri) != urlCache_.end()) {
00117
00118 filename=urlCache_[uri];
00119
00120 std::ifstream tfs;
00121 tfs.open(filename.c_str());
00122 if (tfs.fail()) {
00123 urlCache_.erase(uri);
00124 }else {
00125
00126 return true;
00127 }
00128 }
00129
00130 #ifndef _WIN32
00131 filename=uri.substr(uri.rfind('/')+1);
00132 if (filename.empty()) {
00133
00134 #endif
00135
00136 srand(time(NULL));
00137 filename.clear();
00138 for (int i = 0; i < 8; i++){
00139
00140 filename += ALPHA.at(rand()%52);
00141 }
00142 filename.append(".wp-tmp");
00143 #ifndef _WIN32
00144 }
00145 std::string dir="/tmp/";
00146 filename = dir + filename;
00147 #endif
00148
00149 urlCache_[uri]=filename;
00150 #ifdef WITH_CURL
00151 CURL * curl;
00152 CURLcode res;
00153 curl=curl_easy_init();
00154 FILE * file;
00155 if(curl){
00156 file=fopen(filename.c_str(),"w");
00157
00158 if (file == NULL) {
00159 fprintf(stderr, "Can't open file %s: %s\n", filename.c_str(),
00160 strerror(errno));
00161 exit(-1);
00162 }
00163
00164 curl_easy_setopt(curl, CURLOPT_URL,uri.c_str());
00165 curl_easy_setopt(curl,CURLOPT_FILE,(void*)file);
00166 curl_easy_setopt(curl,CURLOPT_TIMEOUT,60);
00167 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
00168 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
00169
00170 if (XmlUtils::getProxy()){
00171 curl_easy_setopt(curl,CURLOPT_PROXY,XmlUtils::getProxyHost().c_str());
00172 std::string tmp=XmlUtils::getProxyUser()+":"+XmlUtils::getProxyPass();
00173 curl_easy_setopt(curl,CURLOPT_PROXYUSERPWD,tmp.c_str());
00174 }
00175 res = curl_easy_perform(curl);
00176
00177 curl_easy_cleanup(curl);
00178 fclose(file);
00179 if(res)
00180 return false;
00181 else
00182 return true;
00183 }
00184 #elif _WIN32
00185 std::ofstream ofs(filename.c_str());
00186 unsigned long nread;
00187 W3Client w3;
00188
00189 if(w3.Connect(uri.c_str())){
00190 if(w3.Request(w3.GetURI())){
00191 unsigned char buf[1024]="\0";
00192 while((nread=w3.Response(buf, 1023))){
00193 buf[nread]='\0';
00194 ofs << buf;
00195 }
00196 }
00197 w3.Close();
00198 }
00199 ofs.close();
00200 return true;
00201
00202 #else
00203 return false;
00204 #endif
00205 }
00206 else {
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 #if !defined(_WIN32)
00217 unsigned int p;
00218 if ((p=uri.find("file:///"))!=std::string::npos)
00219 {
00220 uri = uri.substr(p+7, uri.length()-p-7);
00221 }
00222 else if ((p=uri.find("file://"))!=std::string::npos)
00223 {
00224 uri = uri.substr(p+6, uri.length()-p-6);
00225 }
00226 else if ((p=uri.find("file:/"))!=std::string::npos)
00227 {
00228 uri = uri.substr(p+5, uri.length()-p-5);
00229 }
00230 #endif
00231
00232 filename=uri;
00233 std::ifstream ifs;
00234 ifs.open(filename.c_str(),std::ios::in);
00235 if(ifs.fail()) {
00236 ifs.close();
00237 return false;
00238 }
00239 else {
00240 ifs.close();
00241 return true;
00242 }
00243 }
00244 return true;
00245 }
00246
00247
00248 std::string
00249 WSDLPULL_EXPORT
00250 XmlUtils::acceptSecretKey(const std::string& field)
00251 {
00252 std::cerr<<field<<": ";
00253 char password [50];
00254 #ifndef _WIN32
00255 tcflag_t oflags;
00256 struct termios term;
00257 tcgetattr(STDIN_FILENO, &term);
00258 oflags = term.c_lflag;
00259 term.c_lflag = oflags & ~(ECHO | ECHOK | ICANON);
00260 term.c_cc[VTIME] = 1;
00261 tcsetattr(STDIN_FILENO, TCSANOW, &term);
00262
00263 scanf("%s", password);
00264
00265 term.c_lflag = oflags;
00266 term.c_cc[VTIME] = 0;
00267 tcsetattr(STDIN_FILENO, TCSANOW, &term);
00268 #else
00269 scanf("%s", password);
00270 #endif
00271 return password;
00272 }
00273
00274 #ifdef _WIN32
00275 void
00276 XmlUtils::winPost(const std::string uri,const std::string username,
00277 const std::string password,const std::string data,
00278 std::string action,char* &results)
00279 {
00280 unsigned long nread;
00281 W3Client w3;
00282 const char* d = data.c_str() ;
00283 if(w3.Connect(uri.c_str())){
00284 w3.InitializePostArguments();
00285 w3.setContentType("Content-Type: text/xml; charset=UTF-8\r\n");
00286 w3.setAcceptTypes("Accept: text/xml\r\n");
00287 w3.AddPostArgument(d,data.length());
00288 std::string tmp="SOAPAction: ";
00289 tmp+='"';
00290 tmp+=action;
00291 tmp+='"';
00292 tmp+="\r\n";
00293 w3.setSoapAction(tmp.c_str());
00294
00295 if(w3.RequestPost(w3.GetURI())){
00296 unsigned long nread = 0,tot=0;
00297 char buf[1024]="\0";
00298
00299 while((nread=w3.Response(reinterpret_cast<unsigned char *>(buf), 1023))){
00300
00301
00302 if (results == 0){
00303 results = (char*)malloc(sizeof(unsigned char) * (nread+1));
00304 }
00305 else{
00306 results = (char*) realloc(results,sizeof(unsigned char) * (nread + tot+1));
00307 }
00308 memcpy (results+tot,buf,nread);
00309 tot+=nread;
00310 results[tot]='\0';
00311 }
00312 }
00313
00314 w3.Close();
00315 }
00316 }
00317 #endif
00318
00319 static bool g_bProxy = false;
00320 static std::string g_sProxyHost;
00321 static std::string g_sProxyUser;
00322 static std::string g_sProxyPass;
00323
00324 bool
00325 WSDLPULL_EXPORT
00326 XmlUtils::getProxy ()
00327 {
00328 return g_bProxy;
00329 }
00330
00331 void
00332 WSDLPULL_EXPORT
00333 XmlUtils::setProxy (const bool bProxy)
00334 {
00335 g_bProxy = bProxy;
00336 }
00337
00338 std::string
00339 WSDLPULL_EXPORT
00340 XmlUtils::getProxyHost ()
00341 {
00342 return g_sProxyHost;
00343 }
00344
00345 void
00346 WSDLPULL_EXPORT
00347 XmlUtils::setProxyHost (const std::string& sProxyHost)
00348 {
00349 g_sProxyHost = sProxyHost;
00350 }
00351
00352 std::string
00353 WSDLPULL_EXPORT
00354 XmlUtils::getProxyUser ()
00355 {
00356 return g_sProxyUser;
00357 }
00358
00359 void
00360 WSDLPULL_EXPORT
00361 XmlUtils::setProxyUser (const std::string& sProxyUser)
00362 {
00363 g_sProxyUser = sProxyUser;
00364 }
00365
00366 std::string
00367 WSDLPULL_EXPORT
00368 XmlUtils::getProxyPass ()
00369 {
00370 return g_sProxyPass;
00371 }
00372
00373 void
00374 WSDLPULL_EXPORT
00375 XmlUtils::setProxyPass (const std::string& sProxyPass)
00376 {
00377 g_sProxyPass = sProxyPass;
00378 }