71 lines
2.0 KiB
C++
71 lines
2.0 KiB
C++
#include "pch.h"
|
|
#include "log.h"
|
|
|
|
LogRemote LogRemote::I;
|
|
|
|
static size_t data_handler(void *contents, size_t size, size_t nmemb, void *userp)
|
|
{
|
|
auto buffer = reinterpret_cast<std::string*>(userp);
|
|
buffer->append((char*)contents, size * nmemb);
|
|
return size * nmemb;
|
|
}
|
|
|
|
void LogRemote::start()
|
|
{
|
|
m_running = true;
|
|
m_thread = std::thread([&] {
|
|
net_init();
|
|
auto session_string = net_request("/start");
|
|
m_session = atoi(session_string.c_str());
|
|
while (m_running)
|
|
{
|
|
auto m = m_mq.Get();
|
|
auto escaped = curl_easy_escape(curl, m.c_str(), (int)m.size());
|
|
auto data = std::make_unique<char[]>(m.size() + 64);
|
|
int sz = snprintf(data.get(), m.size() + 64, "session=%d&m=%s", m_session, escaped);
|
|
curl_free(escaped);
|
|
net_request("/log", std::string(data.get(), sz));
|
|
}
|
|
net_close();
|
|
});
|
|
}
|
|
void LogRemote::net_init()
|
|
{
|
|
if (!(curl = curl_easy_init()))
|
|
return;
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &this->readBuffer);
|
|
//curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_handler);
|
|
}
|
|
std::string LogRemote::net_request(std::string cmd, std::string data /*= ""*/)
|
|
{
|
|
readBuffer.clear();
|
|
curl_easy_setopt(curl, CURLOPT_POST, 1L);
|
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
|
|
auto url = m_url + cmd;
|
|
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
|
res = curl_easy_perform(curl);
|
|
return readBuffer;
|
|
}
|
|
void LogRemote::net_close()
|
|
{
|
|
if (curl)
|
|
curl_easy_cleanup(curl);
|
|
curl = nullptr;
|
|
}
|
|
void LogRemote::log(const char* format, ...)
|
|
{
|
|
static char buffer[4096];
|
|
va_list arglist;
|
|
va_start(arglist, format);
|
|
int n = vsnprintf(buffer, sizeof(buffer), format, arglist);
|
|
va_end(arglist);
|
|
m_mq.Post(std::string(buffer, n));
|
|
}
|
|
LogRemote::~LogRemote()
|
|
{
|
|
m_running = false;
|
|
m_mq.UnlockGetters();
|
|
if (m_thread.joinable())
|
|
m_thread.join();
|
|
} |