aboutsummaryrefslogtreecommitdiff
path: root/src/filesystem/DllLibCurl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/filesystem/DllLibCurl.h')
-rw-r--r--src/filesystem/DllLibCurl.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/filesystem/DllLibCurl.h b/src/filesystem/DllLibCurl.h
new file mode 100644
index 0000000000..304459f655
--- /dev/null
+++ b/src/filesystem/DllLibCurl.h
@@ -0,0 +1,148 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2013 Team XBMC
+ * http://xbmc.org
+ *
+ * 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, 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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "DynamicDll.h"
+#include "threads/CriticalSection.h"
+
+/* put types of curl in namespace to avoid namespace pollution */
+namespace XCURL
+{
+ #define CURL CURL_HANDLE
+ #include <curl/curl.h>
+ #undef CURL
+
+ class DllLibCurlInterface
+ {
+ public:
+ virtual ~DllLibCurlInterface() {}
+ virtual CURLcode global_init(long flags)=0;
+ virtual void global_cleanup(void)=0;
+ virtual CURL_HANDLE * easy_init(void)=0;
+ //virtual CURLcode easy_setopt(CURL_HANDLE *handle, CURLoption option, ...)=0;
+ virtual CURLcode easy_perform(CURL_HANDLE * handle )=0;
+ virtual CURLcode easy_pause(CURL_HANDLE * handle, int bitmask )=0;
+ virtual void easy_reset(CURL_HANDLE * handle)=0;
+ //virtual CURLcode easy_getinfo(CURL_HANDLE *curl, CURLINFO info, ... )=0;
+ virtual void easy_cleanup(CURL_HANDLE * handle )=0;
+ virtual CURL_HANDLE *easy_duphandle(CURL_HANDLE *handle )=0;
+ virtual CURLM * multi_init(void)=0;
+ virtual CURLMcode multi_add_handle(CURLM *multi_handle, CURL_HANDLE *easy_handle)=0;
+ virtual CURLMcode multi_perform(CURLM *multi_handle, int *running_handles)=0;
+ virtual CURLMcode multi_remove_handle(CURLM *multi_handle, CURL_HANDLE *easy_handle)=0;
+ virtual CURLMcode multi_fdset(CURLM *multi_handle, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd)=0;
+ virtual CURLMcode multi_timeout(CURLM *multi_handle, long *timeout)=0;
+ virtual CURLMsg* multi_info_read(CURLM *multi_handle, int *msgs_in_queue)=0;
+ virtual void multi_cleanup(CURL_HANDLE * handle )=0;
+ virtual struct curl_slist* slist_append(struct curl_slist *, const char *)=0;
+ virtual void slist_free_all(struct curl_slist *)=0;
+ };
+
+ class DllLibCurl : public DllDynamic, DllLibCurlInterface
+ {
+ DECLARE_DLL_WRAPPER(DllLibCurl, DLL_PATH_LIBCURL)
+ DEFINE_METHOD1(CURLcode, global_init, (long p1))
+ DEFINE_METHOD0(void, global_cleanup)
+ DEFINE_METHOD0(CURL_HANDLE *, easy_init)
+ DEFINE_METHOD_FP(CURLcode, easy_setopt, (CURL_HANDLE *p1, CURLoption p2, ...))
+ DEFINE_METHOD1(CURLcode, easy_perform, (CURL_HANDLE * p1 ))
+ DEFINE_METHOD2(CURLcode, easy_pause, (CURL_HANDLE * p1, int p2 ))
+ DEFINE_METHOD1(void, easy_reset, (CURL_HANDLE * p1 ))
+ DEFINE_METHOD_FP(CURLcode, easy_getinfo, (CURL_HANDLE *p1, CURLINFO p2, ... ))
+ DEFINE_METHOD1(void, easy_cleanup, (CURL_HANDLE * p1))
+ DEFINE_METHOD1(CURL_HANDLE *, easy_duphandle, (CURL_HANDLE * p1))
+ DEFINE_METHOD0(CURLM *, multi_init)
+ DEFINE_METHOD2(CURLMcode, multi_add_handle, (CURLM *p1, CURL_HANDLE *p2))
+ DEFINE_METHOD2(CURLMcode, multi_perform, (CURLM *p1, int *p2))
+ DEFINE_METHOD2(CURLMcode, multi_remove_handle, (CURLM *p1, CURL_HANDLE *p2))
+ DEFINE_METHOD5(CURLMcode, multi_fdset, (CURLM *p1, fd_set *p2, fd_set *p3, fd_set *p4, int *p5))
+ DEFINE_METHOD2(CURLMcode, multi_timeout, (CURLM *p1, long *p2))
+ DEFINE_METHOD2(CURLMsg*, multi_info_read, (CURLM *p1, int *p2))
+ DEFINE_METHOD1(void, multi_cleanup, (CURLM *p1))
+ DEFINE_METHOD2(struct curl_slist*, slist_append, (struct curl_slist * p1, const char * p2))
+ DEFINE_METHOD1(void, slist_free_all, (struct curl_slist * p1))
+ DEFINE_METHOD1(const char *, easy_strerror, (CURLcode p1))
+#if defined(HAS_CURL_STATIC)
+ DEFINE_METHOD1(void, crypto_set_id_callback, (unsigned long (*p1)(void)))
+ DEFINE_METHOD1(void, crypto_set_locking_callback, (void (*p1)(int, int, const char *, int)))
+#endif
+ BEGIN_METHOD_RESOLVE()
+ RESOLVE_METHOD_RENAME(curl_global_init, global_init)
+ RESOLVE_METHOD_RENAME(curl_global_cleanup, global_cleanup)
+ RESOLVE_METHOD_RENAME(curl_easy_init, easy_init)
+ RESOLVE_METHOD_RENAME(curl_easy_strerror, easy_strerror)
+ RESOLVE_METHOD_RENAME_FP(curl_easy_setopt, easy_setopt)
+ RESOLVE_METHOD_RENAME(curl_easy_perform, easy_perform)
+ RESOLVE_METHOD_RENAME(curl_easy_pause, easy_pause)
+ RESOLVE_METHOD_RENAME(curl_easy_reset, easy_reset)
+ RESOLVE_METHOD_RENAME_FP(curl_easy_getinfo, easy_getinfo)
+ RESOLVE_METHOD_RENAME(curl_easy_cleanup, easy_cleanup)
+ RESOLVE_METHOD_RENAME(curl_easy_duphandle, easy_duphandle)
+ RESOLVE_METHOD_RENAME(curl_multi_init, multi_init)
+ RESOLVE_METHOD_RENAME(curl_multi_add_handle, multi_add_handle)
+ RESOLVE_METHOD_RENAME(curl_multi_perform, multi_perform)
+ RESOLVE_METHOD_RENAME(curl_multi_remove_handle, multi_remove_handle)
+ RESOLVE_METHOD_RENAME(curl_multi_fdset, multi_fdset)
+ RESOLVE_METHOD_RENAME(curl_multi_timeout, multi_timeout)
+ RESOLVE_METHOD_RENAME(curl_multi_info_read, multi_info_read)
+ RESOLVE_METHOD_RENAME(curl_multi_cleanup, multi_cleanup)
+ RESOLVE_METHOD_RENAME(curl_slist_append, slist_append)
+ RESOLVE_METHOD_RENAME(curl_slist_free_all, slist_free_all)
+#if defined(HAS_CURL_STATIC)
+ RESOLVE_METHOD_RENAME(CRYPTO_set_id_callback, crypto_set_id_callback)
+ RESOLVE_METHOD_RENAME(CRYPTO_set_locking_callback, crypto_set_locking_callback)
+#endif
+ END_METHOD_RESOLVE()
+
+ };
+
+ class DllLibCurlGlobal : public DllLibCurl
+ {
+ public:
+ /* extend interface with buffered functions */
+ void easy_aquire(const char *protocol, const char *hostname, CURL_HANDLE** easy_handle, CURLM** multi_handle);
+ void easy_release(CURL_HANDLE** easy_handle, CURLM** multi_handle);
+ void easy_duplicate(CURL_HANDLE* easy, CURLM* multi, CURL_HANDLE** easy_out, CURLM** multi_out);
+ CURL_HANDLE* easy_duphandle(CURL_HANDLE* easy_handle);
+ void CheckIdle();
+
+ /* overloaded load and unload with reference counter */
+ virtual bool Load();
+ virtual void Unload();
+
+ /* structure holding a session info */
+ typedef struct SSession
+ {
+ unsigned int m_idletimestamp; // timestamp of when this object when idle
+ std::string m_protocol;
+ std::string m_hostname;
+ bool m_busy;
+ CURL_HANDLE* m_easy;
+ CURLM* m_multi;
+ } SSession;
+
+ typedef std::vector<SSession> VEC_CURLSESSIONS;
+
+ VEC_CURLSESSIONS m_sessions;
+ CCriticalSection m_critSection;
+ };
+}
+
+extern XCURL::DllLibCurlGlobal g_curlInterface;