/* Copyright © 2009 Jim Porter This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "utility.h" //#include "tc2.h" #include std::string b64encode(const std::string &s) { NETLIBBASE64 encode; encode.cbDecoded = (int)s.length(); encode.pbDecoded = (BYTE*)s.c_str(); encode.cchEncoded = Netlib_GetBase64EncodedBufferSize(encode.cbDecoded); encode.pszEncoded = new char[encode.cchEncoded+1]; CallService(MS_NETLIB_BASE64ENCODE,0,(LPARAM)&encode); std::string ret = encode.pszEncoded; delete[] encode.pszEncoded; return ret; } http::response mir_twitter::slurp(const std::string &url,http::method meth, OAuthParameters postParams) { NETLIBHTTPREQUEST req = {sizeof(req)}; NETLIBHTTPREQUEST *resp; req.requestType = (meth == http::get) ? REQUEST_GET:REQUEST_POST; req.szUrl = const_cast(url.c_str()); //std::wstring url_WSTR(url.length(),L' '); //std::copy(url.begin(), url.end(), url_WSTR.begin()); std::wstring url_WSTR = UTF8ToWide(url); std::string pdata_STR; std::wstring pdata_WSTR; std::wstring auth; if (meth == http::get) { if (url_WSTR.size()>0) { WLOG("**SLURP::GET - we have a URL: %s", url_WSTR); } if (consumerKey_.size()>0) { LOG("**SLURP::GET - we have a consumerKey"); } if (consumerSecret_.size()>0) { LOG("**SLURP::GET - we have a consumerSecret"); } if (oauthAccessToken_.size()>0) { LOG("**SLURP::GET - we have a oauthAccessToken"); } if (oauthAccessTokenSecret_.size()>0) { LOG("**SLURP::GET - we have a oauthAccessTokenSecret"); } if (pin_.size()>0) { LOG("**SLURP::GET - we have a pin"); } //WLOG("consumerSEcret is %s", consumerSecret_); //WLOG("oauthAccessTok is %s", oauthAccessToken_); //WLOG("oautAccessTokSEc is %s", oauthAccessTokenSecret_); //WLOG("pin is %s", pin_); auth = OAuthWebRequestSubmit(url_WSTR, L"GET", NULL, consumerKey_, consumerSecret_, oauthAccessToken_, oauthAccessTokenSecret_, pin_); } else if (meth == http::post) { //OAuthParameters postParams; if (url_WSTR.size()>0) { WLOG("**SLURP::POST - we have a URL: %s", url_WSTR); } if (consumerKey_.size()>0) { LOG("**SLURP::POST - we have a consumerKey"); } if (consumerSecret_.size()>0) { LOG("**SLURP::POST - we have a consumerSecret"); } if (oauthAccessToken_.size()>0) { LOG("**SLURP::POST - we have a oauthAccessToken"); } if (oauthAccessTokenSecret_.size()>0) { LOG("**SLURP::POST - we have a oauthAccessTokenSecret"); } if (pin_.size()>0) { LOG("**SLURP::POST - we have a pin"); } //WLOG("consumerKey is %s", consumerKey_); //WLOG("consumerSEcret is %s", consumerSecret_); //WLOG("oauthAccessTok is %s", oauthAccessToken_); //WLOG("oautAccessTokSEc is %s", oauthAccessTokenSecret_); //std::wstring pdata_WSTR(post_data.length(),L' '); //std::copy(post_data.begin(), post_data.end(), pdata_WSTR.begin()); //postParams[L"status"] = UrlEncode(pdata_WSTR); //postParams[L"source"] = L"mirandaim"; pdata_WSTR = BuildQueryString(postParams); WLOG("**SLURP::POST - post data is: %s", pdata_WSTR); auth = OAuthWebRequestSubmit(url_WSTR, L"POST", &postParams, consumerKey_, consumerSecret_, oauthAccessToken_, oauthAccessTokenSecret_); //WLOG("**SLURP::POST auth is %s", auth); } else { LOG("**SLURP - There is something really wrong.. the http method was neither get or post.. WHY??"); } //std::string auth_STR(auth.length(), ' '); //std::copy(auth.begin(), auth.end(), auth_STR.begin()); std::string auth_STR = WideToUTF8(auth); NETLIBHTTPHEADER hdr[3]; hdr[0].szName = "Authorization"; hdr[0].szValue = const_cast(auth_STR.c_str()); req.headers = hdr; req.headersCount = 1; if(meth == http::post) { hdr[1].szName = "Content-Type"; hdr[1].szValue = "application/x-www-form-urlencoded"; hdr[2].szName = "Cache-Control"; hdr[2].szValue = "no-cache"; //char *pdata_STR = new char[pdata_WSTR.length() + 1]; //sprintf(pdata_STR,"%ls",pdata_WSTR.c_str()); pdata_STR = WideToUTF8(pdata_WSTR); req.headersCount = 3; req.dataLength = (int)pdata_STR.size(); req.pData = const_cast(pdata_STR.c_str()); LOG("**SLURP::POST - req.pdata is %s", req.pData); } req.flags = NLHRF_HTTP11 | NLHRF_PERSISTENT | NLHRF_REDIRECT; req.nlc = httpPOST_; http::response resp_data; LOG("**SLURP - just before calling HTTPTRANSACTION"); resp = reinterpret_cast(CallService( MS_NETLIB_HTTPTRANSACTION, reinterpret_cast(handle_), reinterpret_cast(&req) )); LOG("**SLURP - HTTPTRANSACTION complete."); if(resp) { LOG("**SLURP - the server has responded!"); httpPOST_ = resp->nlc; resp_data.code = resp->resultCode; resp_data.data = resp->pData ? resp->pData:""; CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)resp); } else { httpPOST_ = NULL; LOG("SLURP - there was no response!"); } return resp_data; } int mir_twitter::LOG(const char *fmt,...) { va_list va; char text[1024]; if (!handle_) return 0; va_start(va,fmt); mir_vsnprintf(text,sizeof(text),fmt,va); va_end(va); return (int)CallService(MS_NETLIB_LOG,(WPARAM)handle_,(LPARAM)text); } int mir_twitter::WLOG(const char* first, const std::wstring last) { char *str1 = new char[1024*96]; sprintf(str1,"%ls", last.c_str()); return LOG(first, str1); } bool save_url(HANDLE hNetlib,const std::string &url,const std::string &filename) { NETLIBHTTPREQUEST req = {sizeof(req)}; NETLIBHTTPREQUEST *resp; req.requestType = REQUEST_GET; req.flags = NLHRF_HTTP11 | NLHRF_REDIRECT; req.szUrl = const_cast(url.c_str()); resp = reinterpret_cast(CallService( MS_NETLIB_HTTPTRANSACTION, reinterpret_cast(hNetlib), reinterpret_cast(&req) )); if (resp) { if (resp->resultCode == 200) { // Create folder if necessary std::string dir = filename.substr(0,filename.rfind('\\')); if(_access(dir.c_str(),0)) CallService(MS_UTILS_CREATEDIRTREE, 0, (LPARAM)dir.c_str()); // Write to file FILE *f = fopen(filename.c_str(),"wb"); fwrite(resp->pData,1,resp->dataLength,f); fclose(f); } CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)resp); return resp->resultCode == 200; } else return false; } static const struct { char *ext; int fmt; } formats[] = { { ".png", PA_FORMAT_PNG }, { ".jpg", PA_FORMAT_JPEG }, { ".jpeg", PA_FORMAT_JPEG }, { ".ico", PA_FORMAT_ICON }, { ".bmp", PA_FORMAT_BMP }, { ".gif", PA_FORMAT_GIF }, }; int ext_to_format(const std::string &ext) { for(size_t i=0; i