From f7d2c07c102d940727b0f053864c04ed32a76ff8 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sat, 13 Oct 2012 09:49:24 +0000 Subject: Quotes: folders restructurization git-svn-id: http://svn.miranda-ng.org/main/trunk@1905 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Quotes/src/HTTPSession.cpp | 262 +++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 protocols/Quotes/src/HTTPSession.cpp (limited to 'protocols/Quotes/src/HTTPSession.cpp') diff --git a/protocols/Quotes/src/HTTPSession.cpp b/protocols/Quotes/src/HTTPSession.cpp new file mode 100644 index 0000000000..aa66948ae9 --- /dev/null +++ b/protocols/Quotes/src/HTTPSession.cpp @@ -0,0 +1,262 @@ +#include "StdAfx.h" +#include "HTTPSession.h" +#include "EconomicRateInfo.h" +#include "LightMutex.h" + +class CHTTPSession::CImpl +{ +public: + CImpl() {} + virtual ~CImpl() {} + + virtual bool OpenURL(const tstring& rsURL) = 0; + virtual bool ReadResponce(tstring& rsResponce)const = 0; +}; + +namespace +{ +// class CImplMS : public CHTTPSession::CImpl +// { +// public: +// CImplMS() +// : m_hSession(::InternetOpen(_T("Dioksin"),PRE_CONFIG_INTERNET_ACCESS,NULL,INTERNET_INVALID_PORT_NUMBER,0)), +// m_hRequest(NULL) +// { +// +// } +// +// ~CImplMS() +// { +// if(m_hRequest) +// { +// ::InternetCloseHandle(m_hRequest); +// } +// +// if(m_hSession) +// { +// ::InternetCloseHandle(m_hSession); +// } +// } +// +// virtual bool OpenURL(const tstring& rsURL) +// { +// if(NULL == m_hSession) +// { +// return false; +// } +// +// if(NULL != m_hRequest) +// { +// ::InternetCloseHandle(m_hRequest); +// m_hRequest = NULL; +// } +// +// m_hRequest = ::InternetOpenUrl(m_hSession,rsURL.c_str(),NULL,0,INTERNET_FLAG_RELOAD,0); +// return NULL != m_hRequest; +// } +// +// virtual bool ReadResponce(tstring& rsResponce)const +// { +// if(NULL == m_hRequest) +// { +// return false; +// } +// +// std::string sBuffer; +// bool bResult = true; +// DWORD cbRead = 0; +// char szBuffer[1024]; +// do{ +// if(FALSE == ::InternetReadFile(m_hRequest,szBuffer,1024,&cbRead)) +// { +// bResult = false; +// break; +// } +// if (0 == cbRead) +// { +// break; // Stop. +// } +// else +// { +// sBuffer.insert(sBuffer.size(),szBuffer,cbRead); +// } +// }while(true); +// +// if(true == bResult) +// { +// USES_CONVERSION; +// rsResponce = A2CT(sBuffer.c_str()); +// } +// +// return bResult; +// } +// private: +// HINTERNET m_hSession; +// HINTERNET m_hRequest; +// }; +// + int find_header(const NETLIBHTTPREQUEST* pRequest,const char* hdr) + { + for(int i = 0;i < pRequest->headersCount; ++i) + { + if (0 == _stricmp(pRequest->headers[i].szName,hdr)) + { + return i; + } + } + + return -1; + } + + + class CImplMI : public CHTTPSession::CImpl + { + public: + CImplMI() {} + + static bool Init() + { + assert(NULL == g_hNetLib); + + NETLIBUSER nlu = {0}; + nlu.cbSize = sizeof(nlu); + nlu.flags = NUF_OUTGOING|NUF_HTTPCONNS|NUF_NOHTTPSOPTION|NUF_TCHAR; + nlu.szSettingsModule = QUOTES_PROTOCOL_NAME; + nlu.ptszDescriptiveName = TranslateT("Quotes HTTP connections"); + g_hNetLib = reinterpret_cast(CallService(MS_NETLIB_REGISTERUSER,0,(LPARAM)&nlu)); + return (NULL != g_hNetLib); + } + + static bool IsValid(){return NULL != g_hNetLib;} + + virtual bool OpenURL(const tstring& rsURL) + { +// USES_CONVERSION; + + m_aURL.swap(TBuffer()); + + std::string s = quotes_t2a(rsURL.c_str()); + const char* psz = s.c_str();//T2CA(rsURL.c_str()); + m_aURL.insert(m_aURL.begin(),psz,psz+strlen(psz)+1); + return true; + + } + virtual bool ReadResponce(tstring& rsResponce)const + { + if(true == m_aURL.empty()) + { + return false; + } + + + NETLIBHTTPREQUEST nlhr = {0}; + nlhr.cbSize = sizeof(nlhr); + nlhr.requestType = REQUEST_GET; + nlhr.flags = NLHRF_DUMPASTEXT|NLHRF_HTTP11|NLHRF_REDIRECT; + char* pURL = &*(m_aURL.begin()); + nlhr.szUrl = pURL; + + nlhr.headersCount = 4; + nlhr.headers=(NETLIBHTTPHEADER*)mir_alloc(sizeof(NETLIBHTTPHEADER)*nlhr.headersCount); + nlhr.headers[0].szName = "User-Agent"; + nlhr.headers[0].szValue = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; + nlhr.headers[1].szName = "Connection"; + nlhr.headers[1].szValue = "close"; + nlhr.headers[2].szName = "Cache-Control"; + nlhr.headers[2].szValue = "no-cache"; + nlhr.headers[3].szName = "Pragma"; + nlhr.headers[3].szValue = "no-cache"; + // nlhr.headers[4].szName = "Accept-Encoding"; + // nlhr.headers[4].szValue = "deflate, gzip"; + // nlhr.headers[5].szName = "Cookie"; + // nlhr.headers[5].szValue = cookie; + + bool bResult = false; + NETLIBHTTPREQUEST* pReply = NULL; + + { + CGuard guard(m_mx); + pReply = reinterpret_cast(CallService(MS_NETLIB_HTTPTRANSACTION, + reinterpret_cast(g_hNetLib),reinterpret_cast(&nlhr))); + } + + if(pReply) + { + if ((200 == pReply->resultCode) && (pReply->dataLength > 0)) + { + TBuffer apBuffer; + apBuffer.insert(apBuffer.begin(),pReply->pData,pReply->pData+pReply->dataLength); + apBuffer.push_back('\0'); + + char* pResult = &*(apBuffer.begin()); + int nIndex = find_header(pReply,"Content-Type"); + if ((-1 != nIndex) && (NULL != strstr(_strlwr(pReply->headers[nIndex].szValue),"utf-8"))) + { + TCHAR* p = mir_utf8decodeT(pResult); + rsResponce = p; + mir_free(p); + } + else + { +// USES_CONVERSION; +// LPCTSTR p = A2CT(pResult); + rsResponce = quotes_a2t(pResult);//p; + } + + bResult = true; + } + + CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,reinterpret_cast(pReply)); + } + + mir_free(nlhr.headers); + + return bResult; + } + + private: + static HANDLE g_hNetLib; + typedef std::vector TBuffer; + mutable TBuffer m_aURL; + mutable CLightMutex m_mx; + }; + + HANDLE CImplMI::g_hNetLib = NULL; + +// CHTTPSession::CImpl* create_impl() +// { +// if(true == CImplMI::IsValid()) +// { +// return new CImplMI; +// } +// else +// { +// return new CImplMS; +// } +// } +} + + +CHTTPSession::CHTTPSession() + : m_pImpl(new CImplMI) +{ +} + +CHTTPSession::~CHTTPSession() +{ +} + +bool CHTTPSession::OpenURL(const tstring& rsURL) +{ + return m_pImpl->OpenURL(rsURL); +} + +bool CHTTPSession::ReadResponce(tstring& rsResponce)const +{ + return m_pImpl->ReadResponce(rsResponce); +} + +bool CHTTPSession::Init() +{ + return CImplMI::Init(); +} \ No newline at end of file -- cgit v1.2.3