summaryrefslogtreecommitdiff
path: root/plugins/CurrencyRates/src/HTTPSession.cpp
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-02-21 15:58:11 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-02-21 15:58:11 +0300
commit7f4db3773e723059ddd50b63b21717cc941ca424 (patch)
treee7c904de02cfd308070b3e5ee779183804e5f505 /plugins/CurrencyRates/src/HTTPSession.cpp
parent98e5dab950ab976bbf244dc21e7bfe2353722d45 (diff)
the less boost and other C++ perversions - the better
Diffstat (limited to 'plugins/CurrencyRates/src/HTTPSession.cpp')
-rw-r--r--plugins/CurrencyRates/src/HTTPSession.cpp178
1 files changed, 60 insertions, 118 deletions
diff --git a/plugins/CurrencyRates/src/HTTPSession.cpp b/plugins/CurrencyRates/src/HTTPSession.cpp
index 2b07d4527e..ad5ddf725c 100644
--- a/plugins/CurrencyRates/src/HTTPSession.cpp
+++ b/plugins/CurrencyRates/src/HTTPSession.cpp
@@ -1,5 +1,7 @@
#include "StdAfx.h"
+HNETLIBUSER CHTTPSession::g_hNetLib = nullptr;
+
#define ERROR_MSG LPGENW("This plugin requires a personal key. Press Yes to obtain it at the site and then enter the result in the Options dialog, otherwise this plugin will fail")
void CALLBACK waitStub()
@@ -8,142 +10,82 @@ void CALLBACK waitStub()
Utils_OpenUrl("https://free.currencyconverterapi.com/free-api-key");
}
-class CHTTPSession::CImpl
-{
-public:
- CImpl() {}
- virtual ~CImpl() {}
-
- virtual bool OpenURL(const tstring &rsURL) = 0;
- virtual bool ReadResponce(tstring &rsResponce) const = 0;
-};
-
-int find_header(const NETLIBHTTPREQUEST* pRequest, const char* hdr)
+static 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(nullptr == g_hNetLib);
-
- ptrA szApiKey(g_plugin.getStringA(DB_KEY_ApiKey));
- if (szApiKey == nullptr)
- Miranda_WaitOnHandle(waitStub);
-
- NETLIBUSER nlu = {};
- nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_NOHTTPSOPTION | NUF_UNICODE;
- nlu.szSettingsModule = CURRENCYRATES_PROTOCOL_NAME;
- nlu.szDescriptiveName.w = TranslateT("CurrencyRates HTTP connections");
- g_hNetLib = Netlib_RegisterUser(&nlu);
- return (nullptr != g_hNetLib);
- }
+bool CHTTPSession::OpenURL(const tstring &rsURL)
+{
+ std::string s = currencyrates_t2a(rsURL.c_str());
+ m_szUrl = s.c_str();
+ return true;
+}
- static bool IsValid() { return nullptr != g_hNetLib; }
+bool CHTTPSession::ReadResponce(tstring& rsResponce)
+{
+ if (m_szUrl.IsEmpty())
+ return false;
- virtual bool OpenURL(const tstring& rsURL)
+ NETLIBHTTPHEADER headers[] =
{
- m_aURL.clear();
-
- std::string s = currencyrates_t2a(rsURL.c_str());
- const char* psz = s.c_str();
- m_aURL.insert(m_aURL.begin(), psz, psz + mir_strlen(psz) + 1);
- return true;
- }
-
- virtual bool ReadResponce(tstring &rsResponce) const
+ { "User-Agent", NETLIB_USER_AGENT },
+ { "Connection", "close" },
+ { "Cache-Control", "no-cache" },
+ { "Pragma", "no-cache" }
+ };
+
+ NETLIBHTTPREQUEST nlhr = {};
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType = REQUEST_GET;
+ nlhr.flags = NLHRF_DUMPASTEXT | NLHRF_HTTP11 | NLHRF_REDIRECT;
+ nlhr.szUrl = m_szUrl.GetBuffer();
+ nlhr.headersCount = _countof(headers);
+ nlhr.headers = headers;
+
+ bool bResult = false;
+ NETLIBHTTPREQUEST *pReply = nullptr;
{
- if (true == m_aURL.empty())
- return false;
-
- NETLIBHTTPHEADER headers[] =
- {
- { "User-Agent", NETLIB_USER_AGENT },
- { "Connection", "close" },
- { "Cache-Control", "no-cache" },
- { "Pragma", "no-cache" }
- };
-
- NETLIBHTTPREQUEST nlhr = {};
- nlhr.cbSize = sizeof(nlhr);
- nlhr.requestType = REQUEST_GET;
- nlhr.flags = NLHRF_DUMPASTEXT | NLHRF_HTTP11 | NLHRF_REDIRECT;
- nlhr.szUrl = &*(m_aURL.begin());
- nlhr.headersCount = _countof(headers);
- nlhr.headers = headers;
-
- bool bResult = false;
- NETLIBHTTPREQUEST *pReply = nullptr;
- {
- mir_cslock lck(m_mx);
- pReply = Netlib_HttpTransaction(g_hNetLib, &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) && (nullptr != strstr(_strlwr(pReply->headers[nIndex].szValue), "utf-8"))) {
- rsResponce = ptrW(mir_utf8decodeW(pResult));
- }
- else {
- rsResponce = currencyrates_a2t(pResult);
- }
-
- bResult = true;
- }
-
- Netlib_FreeHttpRequest(pReply);
- }
- return bResult;
+ mir_cslock lck(m_mx);
+ pReply = Netlib_HttpTransaction(g_hNetLib, &nlhr);
}
-private:
- static HNETLIBUSER g_hNetLib;
- typedef std::vector<char> TBuffer;
- mutable TBuffer m_aURL;
- mutable mir_cs m_mx;
-};
-
-HNETLIBUSER CImplMI::g_hNetLib = nullptr;
+ if (pReply) {
+ if ((200 == pReply->resultCode) && (pReply->dataLength > 0)) {
+ CMStringA buf(pReply->pData, pReply->dataLength);
+ int nIndex = find_header(pReply, "Content-Type");
+ if ((-1 != nIndex) && (nullptr != strstr(_strlwr(pReply->headers[nIndex].szValue), "utf-8")))
+ rsResponce = ptrW(mir_utf8decodeW(buf));
+ else
+ rsResponce = currencyrates_a2t(buf);
-CHTTPSession::CHTTPSession()
- : m_pImpl(new CImplMI)
-{
-}
-
-CHTTPSession::~CHTTPSession()
-{
-}
+ bResult = true;
+ }
-bool CHTTPSession::OpenURL(const tstring& rsURL)
-{
- return m_pImpl->OpenURL(rsURL);
+ Netlib_FreeHttpRequest(pReply);
+ }
+ return bResult;
}
-bool CHTTPSession::ReadResponce(tstring& rsResponce) const
-{
- return m_pImpl->ReadResponce(rsResponce);
-}
+/////////////////////////////////////////////////////////////////////////////////////////
+// module initialization
bool CHTTPSession::Init()
{
- return CImplMI::Init();
-} \ No newline at end of file
+ assert(nullptr == g_hNetLib);
+
+ ptrA szApiKey(g_plugin.getStringA(DB_KEY_ApiKey));
+ if (szApiKey == nullptr)
+ Miranda_WaitOnHandle(waitStub);
+
+ NETLIBUSER nlu = {};
+ nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_NOHTTPSOPTION | NUF_UNICODE;
+ nlu.szSettingsModule = CURRENCYRATES_PROTOCOL_NAME;
+ nlu.szDescriptiveName.w = TranslateT("CurrencyRates HTTP connections");
+ g_hNetLib = Netlib_RegisterUser(&nlu);
+ return (nullptr != g_hNetLib);
+}