/* * barrier -- mouse and keyboard sharing utility * Copyright (C) 2014-2016 Symless Ltd. * * This package is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * found in the file LICENSE that should have accompanied this file. * * This package 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 "arch/unix/ArchInternetUnix.h" #include "arch/XArch.h" #include "common/Version.h" #include "base/Log.h" #include #include class CurlFacade { public: CurlFacade(); ~CurlFacade(); std::string get(const std::string& url); std::string urlEncode(const std::string& url); private: CURL* m_curl; }; // // ArchInternetUnix // std::string ArchInternetUnix::get(const std::string& url) { CurlFacade curl; return curl.get(url); } std::string ArchInternetUnix::urlEncode(const std::string& url) { CurlFacade curl; return curl.urlEncode(url); } // // CurlFacade // static size_t curlWriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } CurlFacade::CurlFacade() : m_curl(NULL) { CURLcode init = curl_global_init(CURL_GLOBAL_ALL); if (init != CURLE_OK) { throw XArch("CURL global init failed."); } m_curl = curl_easy_init(); if (m_curl == NULL) { throw XArch("CURL easy init failed."); } } CurlFacade::~CurlFacade() { if (m_curl != NULL) { curl_easy_cleanup(m_curl); } curl_global_cleanup(); } std::string CurlFacade::get(const std::string& url) { curl_easy_setopt(m_curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curlWriteCallback); std::stringstream userAgent; userAgent << "Barrier "; userAgent << kVersion; curl_easy_setopt(m_curl, CURLOPT_USERAGENT, userAgent.str().c_str()); std::string result; curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &result); CURLcode code = curl_easy_perform(m_curl); if (code != CURLE_OK) { LOG((CLOG_ERR "curl perform error: %s", curl_easy_strerror(code))); throw XArch("CURL perform failed."); } return result; } std::string CurlFacade::urlEncode(const std::string& url) { char* resultCStr = curl_easy_escape(m_curl, url.c_str(), 0); if (resultCStr == NULL) { throw XArch("CURL escape failed."); } std::string result(resultCStr); curl_free(resultCStr); return result; }