From 6983e999e085c56e7118d76daf9b4f794574df10 Mon Sep 17 00:00:00 2001 From: Sarang Bharadwaj Date: Mon, 6 Aug 2012 21:04:04 +0530 Subject: [PATCH] Made code compatible with spectrum1 user DB; Latest version of twitcurl --- backends/twitter/TwitterPlugin.cpp | 4 +- backends/twitter/libtwitcurl/.svn/all-wcprops | 131 + backends/twitter/libtwitcurl/.svn/entries | 748 ++++++ .../.svn/prop-base/twitcurl.opt.svn-base | 5 + .../.svn/text-base/CMakeLists.txt.svn-base | 16 + .../.svn/text-base/COPYING.svn-base | 19 + .../.svn/text-base/HMAC_SHA1.cpp.svn-base | 64 + .../.svn/text-base/HMAC_SHA1.h.svn-base | 53 + .../.svn/text-base/Makefile.svn-base | 57 + .../.svn/text-base/SHA1.cpp.svn-base | 274 +++ .../.svn/text-base/SHA1.h.svn-base | 148 ++ .../.svn/text-base/base64.cpp.svn-base | 123 + .../.svn/text-base/base64.h.svn-base | 4 + .../.svn/text-base/oauthlib.cpp.svn-base | 647 +++++ .../.svn/text-base/oauthlib.h.svn-base | 127 + .../.svn/text-base/twitcurl.cpp.svn-base | 2042 ++++++++++++++++ .../.svn/text-base/twitcurl.dsp.svn-base | 140 ++ .../.svn/text-base/twitcurl.dsw.svn-base | 29 + .../.svn/text-base/twitcurl.h.svn-base | 278 +++ .../.svn/text-base/twitcurl.opt.svn-base | Bin 0 -> 50688 bytes .../.svn/text-base/twitcurl.plg.svn-base | 37 + .../.svn/text-base/twitcurl.sln.svn-base | 20 + .../.svn/text-base/twitcurl.vcproj.svn-base | 343 +++ .../.svn/text-base/urlencode.cpp.svn-base | 40 + .../.svn/text-base/urlencode.h.svn-base | 10 + .../twitter/libtwitcurl/curl/.svn/all-wcprops | 89 + .../libtwitcurl/curl/.svn/dir-prop-base | 5 + .../twitter/libtwitcurl/curl/.svn/entries | 504 ++++ .../curl/.svn/text-base/COPYING.svn-base | 21 + .../curl/.svn/text-base/Makefile.am.svn-base | 53 + .../curl/.svn/text-base/Makefile.in.svn-base | 560 +++++ .../curl/.svn/text-base/curl.h.svn-base | 2174 +++++++++++++++++ .../.svn/text-base/curlbuild.h.cmake.svn-base | 180 ++ .../.svn/text-base/curlbuild.h.in.svn-base | 190 ++ .../curl/.svn/text-base/curlbuild.h.svn-base | 583 +++++ .../curl/.svn/text-base/curlrules.h.svn-base | 261 ++ .../curl/.svn/text-base/curlver.h.svn-base | 69 + .../curl/.svn/text-base/easy.h.svn-base | 102 + .../curl/.svn/text-base/mprintf.h.svn-base | 81 + .../curl/.svn/text-base/multi.h.svn-base | 345 +++ .../.svn/text-base/stdcheaders.h.svn-base | 33 + .../.svn/text-base/typecheck-gcc.h.svn-base | 590 +++++ .../twitter/libtwitcurl/lib/.svn/all-wcprops | 11 + backends/twitter/libtwitcurl/lib/.svn/entries | 62 + .../lib/.svn/prop-base/libcurl.lib.svn-base | 5 + .../lib/.svn/text-base/libcurl.lib.svn-base | Bin 0 -> 790868 bytes backends/twitter/libtwitcurl/oauthlib.cpp | 159 +- backends/twitter/libtwitcurl/oauthlib.h | 25 +- backends/twitter/libtwitcurl/twitcurl.cpp | 351 ++- backends/twitter/libtwitcurl/twitcurl.h | 106 +- 50 files changed, 11664 insertions(+), 254 deletions(-) create mode 100644 backends/twitter/libtwitcurl/.svn/all-wcprops create mode 100644 backends/twitter/libtwitcurl/.svn/entries create mode 100644 backends/twitter/libtwitcurl/.svn/prop-base/twitcurl.opt.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/CMakeLists.txt.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/COPYING.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/HMAC_SHA1.cpp.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/HMAC_SHA1.h.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/Makefile.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/SHA1.cpp.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/SHA1.h.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/base64.cpp.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/base64.h.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/oauthlib.cpp.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/oauthlib.h.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.cpp.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsp.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsw.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.h.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.opt.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.plg.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.sln.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/twitcurl.vcproj.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/urlencode.cpp.svn-base create mode 100644 backends/twitter/libtwitcurl/.svn/text-base/urlencode.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/all-wcprops create mode 100644 backends/twitter/libtwitcurl/curl/.svn/dir-prop-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/entries create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/COPYING.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.am.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.in.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/curl.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.cmake.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.in.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/curlrules.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/curlver.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/easy.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/mprintf.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/multi.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/stdcheaders.h.svn-base create mode 100644 backends/twitter/libtwitcurl/curl/.svn/text-base/typecheck-gcc.h.svn-base create mode 100644 backends/twitter/libtwitcurl/lib/.svn/all-wcprops create mode 100644 backends/twitter/libtwitcurl/lib/.svn/entries create mode 100644 backends/twitter/libtwitcurl/lib/.svn/prop-base/libcurl.lib.svn-base create mode 100644 backends/twitter/libtwitcurl/lib/.svn/text-base/libcurl.lib.svn-base diff --git a/backends/twitter/TwitterPlugin.cpp b/backends/twitter/TwitterPlugin.cpp index 03bd8eaa..be4eec24 100644 --- a/backends/twitter/TwitterPlugin.cpp +++ b/backends/twitter/TwitterPlugin.cpp @@ -63,8 +63,8 @@ TwitterPlugin::TwitterPlugin(Config *config, Swift::SimpleEventLoop *loop, Stora consumerKey = CONFIG_STRING(config, "twitter.consumer_key"); consumerSecret = CONFIG_STRING(config, "twitter.consumer_secret"); - OAUTH_KEY = "oauth_key"; - OAUTH_SECRET = "oauth_secret"; + OAUTH_KEY = "twitter_oauth_token"; + OAUTH_SECRET = "twitter_oauth_secret"; MODE = "mode"; m_factories = new Swift::BoostNetworkFactories(loop); diff --git a/backends/twitter/libtwitcurl/.svn/all-wcprops b/backends/twitter/libtwitcurl/.svn/all-wcprops new file mode 100644 index 00000000..feb09796 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/all-wcprops @@ -0,0 +1,131 @@ +K 25 +svn:wc:ra_dav:version-url +V 34 +/svn/!svn/ver/89/trunk/libtwitcurl +END +twitcurl.vcproj +K 25 +svn:wc:ra_dav:version-url +V 50 +/svn/!svn/ver/55/trunk/libtwitcurl/twitcurl.vcproj +END +SHA1.h +K 25 +svn:wc:ra_dav:version-url +V 41 +/svn/!svn/ver/47/trunk/libtwitcurl/SHA1.h +END +oauthlib.cpp +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/89/trunk/libtwitcurl/oauthlib.cpp +END +oauthlib.h +K 25 +svn:wc:ra_dav:version-url +V 45 +/svn/!svn/ver/89/trunk/libtwitcurl/oauthlib.h +END +twitcurl.plg +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/47/trunk/libtwitcurl/twitcurl.plg +END +twitcurl.cpp +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/87/trunk/libtwitcurl/twitcurl.cpp +END +urlencode.cpp +K 25 +svn:wc:ra_dav:version-url +V 48 +/svn/!svn/ver/47/trunk/libtwitcurl/urlencode.cpp +END +twitcurl.dsp +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/47/trunk/libtwitcurl/twitcurl.dsp +END +twitcurl.h +K 25 +svn:wc:ra_dav:version-url +V 45 +/svn/!svn/ver/87/trunk/libtwitcurl/twitcurl.h +END +HMAC_SHA1.cpp +K 25 +svn:wc:ra_dav:version-url +V 48 +/svn/!svn/ver/79/trunk/libtwitcurl/HMAC_SHA1.cpp +END +base64.cpp +K 25 +svn:wc:ra_dav:version-url +V 45 +/svn/!svn/ver/47/trunk/libtwitcurl/base64.cpp +END +urlencode.h +K 25 +svn:wc:ra_dav:version-url +V 46 +/svn/!svn/ver/47/trunk/libtwitcurl/urlencode.h +END +COPYING +K 25 +svn:wc:ra_dav:version-url +V 42 +/svn/!svn/ver/65/trunk/libtwitcurl/COPYING +END +twitcurl.sln +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/47/trunk/libtwitcurl/twitcurl.sln +END +twitcurl.dsw +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/47/trunk/libtwitcurl/twitcurl.dsw +END +base64.h +K 25 +svn:wc:ra_dav:version-url +V 43 +/svn/!svn/ver/47/trunk/libtwitcurl/base64.h +END +HMAC_SHA1.h +K 25 +svn:wc:ra_dav:version-url +V 46 +/svn/!svn/ver/79/trunk/libtwitcurl/HMAC_SHA1.h +END +SHA1.cpp +K 25 +svn:wc:ra_dav:version-url +V 43 +/svn/!svn/ver/47/trunk/libtwitcurl/SHA1.cpp +END +CMakeLists.txt +K 25 +svn:wc:ra_dav:version-url +V 49 +/svn/!svn/ver/47/trunk/libtwitcurl/CMakeLists.txt +END +Makefile +K 25 +svn:wc:ra_dav:version-url +V 43 +/svn/!svn/ver/81/trunk/libtwitcurl/Makefile +END +twitcurl.opt +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/47/trunk/libtwitcurl/twitcurl.opt +END diff --git a/backends/twitter/libtwitcurl/.svn/entries b/backends/twitter/libtwitcurl/.svn/entries new file mode 100644 index 00000000..1c9848dc --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/entries @@ -0,0 +1,748 @@ +10 + +dir +89 +http://twitcurl.googlecode.com/svn/trunk/libtwitcurl +http://twitcurl.googlecode.com/svn + + + +2012-07-21T07:38:48.554435Z +89 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + +4714a580-958b-11de-ad41-3fcdc5e0e42d + +twitcurl.vcproj +file + + + + +2012-08-04T17:27:29.286968Z +4bd65d0283824fc74c2f6051b8e07776 +2011-09-12T19:28:25.614324Z +55 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +7434 + +SHA1.h +file + + + + +2012-08-04T17:27:29.286968Z +3e6264ad43d1070aae2a29349c56c9cc +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +3793 + +oauthlib.cpp +file + + + + +2012-08-04T17:27:29.286968Z +0952e80b192c5a453732c6a4a4ba937c +2012-07-21T07:38:48.554435Z +89 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +18582 + +oauthlib.h +file + + + + +2012-08-04T17:27:29.286968Z +2a41db8667c9f1d735041672a4a8f0ce +2012-07-21T07:38:48.554435Z +89 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +5387 + +twitcurl.plg +file + + + + +2012-08-04T17:27:29.286968Z +27b1201e052363c6a0c58d907066d74a +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +1136 + +twitcurl.cpp +file + + + + +2012-08-04T17:27:29.286968Z +a8959426e8a890965049fb620413c117 +2012-06-03T15:11:03.334716Z +87 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +60750 + +urlencode.cpp +file + + + + +2012-08-04T17:27:29.286968Z +6fee0a296ccbe0235a1b32468f8336d5 +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +908 + +twitcurl.dsp +file + + + + +2012-08-04T17:27:29.290968Z +3d5dc2fdeea286408f9c0e8a9eb6e011 +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +3571 + +twitcurl.h +file + + + + +2012-08-04T17:27:29.290968Z +42f24b664799b8b1a394dfa3f0e51813 +2012-06-03T15:11:03.334716Z +87 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +11774 + +HMAC_SHA1.cpp +file + + + + +2012-08-04T17:27:29.290968Z +7f04808b83824ab2a318470601f84dd2 +2012-04-28T15:24:29.877388Z +79 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +1601 + +base64.cpp +file + + + + +2012-08-04T17:27:29.290968Z +91aaa43b9e4890495a6f736625199f4f +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +3857 + +curl +dir + +urlencode.h +file + + + + +2012-08-04T17:27:29.290968Z +2ad501c16a14e6ed0616d139de66595d +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +204 + +lib +dir + +twitcurl.sln +file + + + + +2012-08-04T17:27:29.290968Z +49dc7abe44deb368fd788b3fbc5f1fa5 +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +890 + +COPYING +file + + + + +2012-08-04T17:27:29.290968Z +c75e20d7cf9fdeffe56535e17f12b35d +2011-10-20T12:45:00.933609Z +65 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +1087 + +twitcurl.dsw +file + + + + +2012-08-04T17:27:29.290968Z +b0211575457694f45a6353f864e1f8c2 +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +539 + +base64.h +file + + + + +2012-08-04T17:27:29.290968Z +0460713f8efdfb3a5d1a97c860d289e8 +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +138 + +HMAC_SHA1.h +file + + + + +2012-08-04T17:27:29.290968Z +e1f7964c76fe86ee35ee3bdea6ace44a +2012-04-28T15:24:29.877388Z +79 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +1070 + +SHA1.cpp +file + + + + +2012-08-04T17:27:29.294968Z +25c20a8b1351cc20b19850cc96c92ec0 +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +7580 + +CMakeLists.txt +file + + + + +2012-08-04T17:27:29.294968Z +4173b9d6da7d014a782d92b266ae9055 +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +656 + +Makefile +file + + + + +2012-08-04T17:27:29.294968Z +c8f5bce48a007345fb8bf89778311fc9 +2012-06-03T08:51:10.455158Z +81 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +1798 + +twitcurl.opt +file + + + + +2012-08-04T17:27:29.294968Z +a164218ef0fadc31afcbb5d3a2a3f1dd +2011-09-12T17:56:21.927956Z +47 +swatkat.thinkdigit@gmail.com +has-props + + + + + + + + + + + + + + + + + + + + +50688 + diff --git a/backends/twitter/libtwitcurl/.svn/prop-base/twitcurl.opt.svn-base b/backends/twitter/libtwitcurl/.svn/prop-base/twitcurl.opt.svn-base new file mode 100644 index 00000000..5e9587e6 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/prop-base/twitcurl.opt.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/backends/twitter/libtwitcurl/.svn/text-base/CMakeLists.txt.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/CMakeLists.txt.svn-base new file mode 100644 index 00000000..2005f84e --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/CMakeLists.txt.svn-base @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 2.5) +project(libtwit) +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules/") +set(twitSrcs base64.cpp HMAC_SHA1.cpp oauthlib.cpp SHA1.cpp urlencode.cpp twitcurl.cpp) +FIND_PACKAGE(PkgConfig) +#pkg_check_modules (PKGS) +include_directories (${PKGS_INCLUDE_DIRS}) +add_library(twit STATIC ${twitSrcs}) +SET_TARGET_PROPERTIES(twit PROPERTIES CLEAN_DIRECT_OUTPUT "wcode") +target_link_libraries(twit) +SET(CMAKE_INSTALL_LIBDIR libtwit CACHE PATH "Output directory for libraries") + +install(TARGETS twit DESTINATION lib) +INSTALL(FILES twitcurl.h DESTINATION include/libtwit) +INSTALL(FILES oauthlib.h DESTINATION include/libtwit) + \ No newline at end of file diff --git a/backends/twitter/libtwitcurl/.svn/text-base/COPYING.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/COPYING.svn-base new file mode 100644 index 00000000..e44f45f1 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/COPYING.svn-base @@ -0,0 +1,19 @@ +Copyright (C) 2011 by swatkat (swatkat.thinkdigitATgmailDOTcom) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/backends/twitter/libtwitcurl/.svn/text-base/HMAC_SHA1.cpp.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/HMAC_SHA1.cpp.svn-base new file mode 100644 index 00000000..5382782e --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/HMAC_SHA1.cpp.svn-base @@ -0,0 +1,64 @@ +//****************************************************************************** +//* HMAC_SHA1.cpp : Implementation of HMAC SHA1 algorithm +//* Comfort to RFC 2104 +//* +//****************************************************************************** +#include "HMAC_SHA1.h" +#include +#include + + +void CHMAC_SHA1::HMAC_SHA1(BYTE *text, int text_len, BYTE *key, int key_len, BYTE *digest) +{ + memset(SHA1_Key, 0, SHA1_BLOCK_SIZE); + + /* repeated 64 times for values in ipad and opad */ + memset(m_ipad, 0x36, sizeof(m_ipad)); + memset(m_opad, 0x5c, sizeof(m_opad)); + + /* STEP 1 */ + if (key_len > SHA1_BLOCK_SIZE) + { + CSHA1::Reset(); + CSHA1::Update((UINT_8 *)key, key_len); + CSHA1::Final(); + + CSHA1::GetHash((UINT_8 *)SHA1_Key); + } + else + memcpy(SHA1_Key, key, key_len); + + /* STEP 2 */ + for (size_t i=0; i +*/ + + +#ifndef __HMAC_SHA1_H__ +#define __HMAC_SHA1_H__ + +#include "SHA1.h" + +typedef unsigned char BYTE ; + +class CHMAC_SHA1 : public CSHA1 +{ + private: + BYTE m_ipad[64]; + BYTE m_opad[64]; + + char * szReport ; + char * SHA1_Key ; + char * AppendBuf1 ; + char * AppendBuf2 ; + + + public: + + enum { + SHA1_DIGEST_LENGTH = 20, + SHA1_BLOCK_SIZE = 64, + HMAC_BUF_LEN = 4096 + } ; + + CHMAC_SHA1() + :szReport(new char[HMAC_BUF_LEN]), + SHA1_Key(new char[HMAC_BUF_LEN]), + AppendBuf1(new char[HMAC_BUF_LEN]), + AppendBuf2(new char[HMAC_BUF_LEN]) + {} + + ~CHMAC_SHA1() + { + delete[] szReport ; + delete[] AppendBuf1 ; + delete[] AppendBuf2 ; + delete[] SHA1_Key ; + } + + void HMAC_SHA1(BYTE *text, int text_len, BYTE *key, int key_len, BYTE *digest); +}; + + +#endif /* __HMAC_SHA1_H__ */ diff --git a/backends/twitter/libtwitcurl/.svn/text-base/Makefile.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/Makefile.svn-base new file mode 100644 index 00000000..14c09ec3 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/Makefile.svn-base @@ -0,0 +1,57 @@ +# Hey Emacs, this is a -*- makefile -*- +# The twitcurl library.. a Makefile for OpenWRT +# Makefile-fu by John Boiles +# 28 September 2009 + +LIBNAME = twitcurl +SRC = $(LIBNAME).cpp +STAGING_DIR = +INCLUDE_DIR = $(STAGING_DIR)/usr/include +LINCLUDE_DIR = $(STAGING_DIR)/usr/local/include +LIBRARY_DIR = $(STAGING_DIR)/usr/lib +LLIBRARY_DIR = $(STAGING_DIR)/usr/local/lib +LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib +CC = g++ +REMOVE = rm -f +COPY = cp +REMOTEIP = 192.168.1.30 + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +# CSTANDARD = -std=gnu99 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + +CFLAGS =$(CDEFS) $(CINCS) $(CSTANDARD) + +all: target + +target: $(SRC) $(LIBNAME).h + $(CC) -Wall -fPIC -c -I$(INCLUDE_DIR) $(SRC) oauthlib.cpp urlencode.cpp base64.cpp HMAC_SHA1.cpp SHA1.cpp + $(CC) -shared -Wl,-soname,lib$(LIBNAME).so.1 $(LDFLAGS) -o lib$(LIBNAME).so.1.0 *.o -L$(LIBRARY_DIR) -lcurl + +#clean project. +clean: + $(REMOVE) $(LIBNAME)*.so.1.0 + $(REMOVE) $(LIBNAME).o + $(REMOVE) $(LIBRARY_DIR)/lib$(LIBNAME).so* + +# Install library to local openwrt library directory +install: all + $(COPY) lib$(LIBNAME).so.1.0 $(LIBRARY_DIR) + $(COPY) lib$(LIBNAME).so.1.0 $(LLIBRARY_DIR) + $(COPY) $(LIBNAME).h $(INCLUDE_DIR)/ + $(COPY) $(LIBNAME).h $(LINCLUDE_DIR)/ + $(COPY) oauthlib.h $(INCLUDE_DIR)/ + $(COPY) oauthlib.h $(LINCLUDE_DIR)/ + ln -sf $(LIBRARY_DIR)/lib$(LIBNAME).so.1.0 $(LIBRARY_DIR)/lib$(LIBNAME).so + ln -sf $(LIBRARY_DIR)/lib$(LIBNAME).so.1.0 $(LIBRARY_DIR)/lib$(LIBNAME).so.1 + ln -sf $(LLIBRARY_DIR)/lib$(LIBNAME).so.1.0 $(LLIBRARY_DIR)/lib$(LIBNAME).so + ln -sf $(LLIBRARY_DIR)/lib$(LIBNAME).so.1.0 $(LLIBRARY_DIR)/lib$(LIBNAME).so.1 diff --git a/backends/twitter/libtwitcurl/.svn/text-base/SHA1.cpp.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/SHA1.cpp.svn-base new file mode 100644 index 00000000..c3846ee5 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/SHA1.cpp.svn-base @@ -0,0 +1,274 @@ +/* + 100% free public domain implementation of the SHA-1 algorithm + by Dominik Reichl + Web: http://www.dominik-reichl.de/ + + Version 1.6 - 2005-02-07 (thanks to Howard Kapustein for patches) + - You can set the endianness in your files, no need to modify the + header file of the CSHA1 class any more + - Aligned data support + - Made support/compilation of the utility functions (ReportHash + and HashFile) optional (useful, if bytes count, for example in + embedded environments) + + Version 1.5 - 2005-01-01 + - 64-bit compiler compatibility added + - Made variable wiping optional (define SHA1_WIPE_VARIABLES) + - Removed unnecessary variable initializations + - ROL32 improvement for the Microsoft compiler (using _rotl) + + ======== Test Vectors (from FIPS PUB 180-1) ======== + + SHA1("abc") = + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D + + SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 + + SHA1(A million repetitions of "a") = + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +#include "SHA1.h" + +#ifdef SHA1_UTILITY_FUNCTIONS +#define SHA1_MAX_FILE_BUFFER 8000 +#endif + +// Rotate x bits to the left +#ifndef ROL32 +#ifdef _MSC_VER +#define ROL32(_val32, _nBits) _rotl(_val32, _nBits) +#else +#define ROL32(_val32, _nBits) (((_val32)<<(_nBits))|((_val32)>>(32-(_nBits)))) +#endif +#endif + +#ifdef SHA1_LITTLE_ENDIAN +#define SHABLK0(i) (m_block->l[i] = \ + (ROL32(m_block->l[i],24) & 0xFF00FF00) | (ROL32(m_block->l[i],8) & 0x00FF00FF)) +#else +#define SHABLK0(i) (m_block->l[i]) +#endif + +#define SHABLK(i) (m_block->l[i&15] = ROL32(m_block->l[(i+13)&15] ^ m_block->l[(i+8)&15] \ + ^ m_block->l[(i+2)&15] ^ m_block->l[i&15],1)) + +// SHA-1 rounds +#define _R0(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK0(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); } +#define _R1(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); } +#define _R2(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0x6ED9EBA1+ROL32(v,5); w=ROL32(w,30); } +#define _R3(v,w,x,y,z,i) { z+=(((w|x)&y)|(w&x))+SHABLK(i)+0x8F1BBCDC+ROL32(v,5); w=ROL32(w,30); } +#define _R4(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0xCA62C1D6+ROL32(v,5); w=ROL32(w,30); } + +CSHA1::CSHA1() +{ + m_block = (SHA1_WORKSPACE_BLOCK *)m_workspace; + + Reset(); +} + +CSHA1::~CSHA1() +{ + Reset(); +} + +void CSHA1::Reset() +{ + // SHA1 initialization constants + m_state[0] = 0x67452301; + m_state[1] = 0xEFCDAB89; + m_state[2] = 0x98BADCFE; + m_state[3] = 0x10325476; + m_state[4] = 0xC3D2E1F0; + + m_count[0] = 0; + m_count[1] = 0; +} + +void CSHA1::Transform(UINT_32 *state, UINT_8 *buffer) +{ + // Copy state[] to working vars + UINT_32 a = state[0], b = state[1], c = state[2], d = state[3], e = state[4]; + + memcpy(m_block, buffer, 64); + + // 4 rounds of 20 operations each. Loop unrolled. + _R0(a,b,c,d,e, 0); _R0(e,a,b,c,d, 1); _R0(d,e,a,b,c, 2); _R0(c,d,e,a,b, 3); + _R0(b,c,d,e,a, 4); _R0(a,b,c,d,e, 5); _R0(e,a,b,c,d, 6); _R0(d,e,a,b,c, 7); + _R0(c,d,e,a,b, 8); _R0(b,c,d,e,a, 9); _R0(a,b,c,d,e,10); _R0(e,a,b,c,d,11); + _R0(d,e,a,b,c,12); _R0(c,d,e,a,b,13); _R0(b,c,d,e,a,14); _R0(a,b,c,d,e,15); + _R1(e,a,b,c,d,16); _R1(d,e,a,b,c,17); _R1(c,d,e,a,b,18); _R1(b,c,d,e,a,19); + _R2(a,b,c,d,e,20); _R2(e,a,b,c,d,21); _R2(d,e,a,b,c,22); _R2(c,d,e,a,b,23); + _R2(b,c,d,e,a,24); _R2(a,b,c,d,e,25); _R2(e,a,b,c,d,26); _R2(d,e,a,b,c,27); + _R2(c,d,e,a,b,28); _R2(b,c,d,e,a,29); _R2(a,b,c,d,e,30); _R2(e,a,b,c,d,31); + _R2(d,e,a,b,c,32); _R2(c,d,e,a,b,33); _R2(b,c,d,e,a,34); _R2(a,b,c,d,e,35); + _R2(e,a,b,c,d,36); _R2(d,e,a,b,c,37); _R2(c,d,e,a,b,38); _R2(b,c,d,e,a,39); + _R3(a,b,c,d,e,40); _R3(e,a,b,c,d,41); _R3(d,e,a,b,c,42); _R3(c,d,e,a,b,43); + _R3(b,c,d,e,a,44); _R3(a,b,c,d,e,45); _R3(e,a,b,c,d,46); _R3(d,e,a,b,c,47); + _R3(c,d,e,a,b,48); _R3(b,c,d,e,a,49); _R3(a,b,c,d,e,50); _R3(e,a,b,c,d,51); + _R3(d,e,a,b,c,52); _R3(c,d,e,a,b,53); _R3(b,c,d,e,a,54); _R3(a,b,c,d,e,55); + _R3(e,a,b,c,d,56); _R3(d,e,a,b,c,57); _R3(c,d,e,a,b,58); _R3(b,c,d,e,a,59); + _R4(a,b,c,d,e,60); _R4(e,a,b,c,d,61); _R4(d,e,a,b,c,62); _R4(c,d,e,a,b,63); + _R4(b,c,d,e,a,64); _R4(a,b,c,d,e,65); _R4(e,a,b,c,d,66); _R4(d,e,a,b,c,67); + _R4(c,d,e,a,b,68); _R4(b,c,d,e,a,69); _R4(a,b,c,d,e,70); _R4(e,a,b,c,d,71); + _R4(d,e,a,b,c,72); _R4(c,d,e,a,b,73); _R4(b,c,d,e,a,74); _R4(a,b,c,d,e,75); + _R4(e,a,b,c,d,76); _R4(d,e,a,b,c,77); _R4(c,d,e,a,b,78); _R4(b,c,d,e,a,79); + + // Add the working vars back into state + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + + // Wipe variables +#ifdef SHA1_WIPE_VARIABLES + a = b = c = d = e = 0; +#endif +} + +// Use this function to hash in binary data and strings +void CSHA1::Update(UINT_8 *data, UINT_32 len) +{ + UINT_32 i, j; + + j = (m_count[0] >> 3) & 63; + + if((m_count[0] += len << 3) < (len << 3)) m_count[1]++; + + m_count[1] += (len >> 29); + + if((j + len) > 63) + { + i = 64 - j; + memcpy(&m_buffer[j], data, i); + Transform(m_state, m_buffer); + + for(; i + 63 < len; i += 64) Transform(m_state, &data[i]); + + j = 0; + } + else i = 0; + + memcpy(&m_buffer[j], &data[i], len - i); +} + +#ifdef SHA1_UTILITY_FUNCTIONS +// Hash in file contents +bool CSHA1::HashFile(char *szFileName) +{ + unsigned long ulFileSize, ulRest, ulBlocks; + unsigned long i; + UINT_8 uData[SHA1_MAX_FILE_BUFFER]; + FILE *fIn; + + if(szFileName == NULL) return false; + + fIn = fopen(szFileName, "rb"); + if(fIn == NULL) return false; + + fseek(fIn, 0, SEEK_END); + ulFileSize = (unsigned long)ftell(fIn); + fseek(fIn, 0, SEEK_SET); + + if(ulFileSize != 0) + { + ulBlocks = ulFileSize / SHA1_MAX_FILE_BUFFER; + ulRest = ulFileSize % SHA1_MAX_FILE_BUFFER; + } + else + { + ulBlocks = 0; + ulRest = 0; + } + + for(i = 0; i < ulBlocks; i++) + { + fread(uData, 1, SHA1_MAX_FILE_BUFFER, fIn); + Update((UINT_8 *)uData, SHA1_MAX_FILE_BUFFER); + } + + if(ulRest != 0) + { + fread(uData, 1, ulRest, fIn); + Update((UINT_8 *)uData, ulRest); + } + + fclose(fIn); fIn = NULL; + return true; +} +#endif + +void CSHA1::Final() +{ + UINT_32 i; + UINT_8 finalcount[8]; + + for(i = 0; i < 8; i++) + finalcount[i] = (UINT_8)((m_count[((i >= 4) ? 0 : 1)] + >> ((3 - (i & 3)) * 8) ) & 255); // Endian independent + + Update((UINT_8 *)"\200", 1); + + while ((m_count[0] & 504) != 448) + Update((UINT_8 *)"\0", 1); + + Update(finalcount, 8); // Cause a SHA1Transform() + + for(i = 0; i < 20; i++) + { + m_digest[i] = (UINT_8)((m_state[i >> 2] >> ((3 - (i & 3)) * 8) ) & 255); + } + + // Wipe variables for security reasons +#ifdef SHA1_WIPE_VARIABLES + i = 0; + memset(m_buffer, 0, 64); + memset(m_state, 0, 20); + memset(m_count, 0, 8); + memset(finalcount, 0, 8); + Transform(m_state, m_buffer); +#endif +} + +#ifdef SHA1_UTILITY_FUNCTIONS +// Get the final hash as a pre-formatted string +void CSHA1::ReportHash(char *szReport, unsigned char uReportType) +{ + unsigned char i; + char szTemp[16]; + + if(szReport == NULL) return; + + if(uReportType == REPORT_HEX) + { + sprintf(szTemp, "%02X", m_digest[0]); + strcat(szReport, szTemp); + + for(i = 1; i < 20; i++) + { + sprintf(szTemp, " %02X", m_digest[i]); + strcat(szReport, szTemp); + } + } + else if(uReportType == REPORT_DIGIT) + { + sprintf(szTemp, "%u", m_digest[0]); + strcat(szReport, szTemp); + + for(i = 1; i < 20; i++) + { + sprintf(szTemp, " %u", m_digest[i]); + strcat(szReport, szTemp); + } + } + else strcpy(szReport, "Error: Unknown report type!"); +} +#endif + +// Get the raw message digest +void CSHA1::GetHash(UINT_8 *puDest) +{ + memcpy(puDest, m_digest, 20); +} diff --git a/backends/twitter/libtwitcurl/.svn/text-base/SHA1.h.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/SHA1.h.svn-base new file mode 100644 index 00000000..e7ea00f3 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/SHA1.h.svn-base @@ -0,0 +1,148 @@ +/* + 100% free public domain implementation of the SHA-1 algorithm + by Dominik Reichl + Web: http://www.dominik-reichl.de/ + + Version 1.6 - 2005-02-07 (thanks to Howard Kapustein for patches) + - You can set the endianness in your files, no need to modify the + header file of the CSHA1 class any more + - Aligned data support + - Made support/compilation of the utility functions (ReportHash + and HashFile) optional (useful, if bytes count, for example in + embedded environments) + + Version 1.5 - 2005-01-01 + - 64-bit compiler compatibility added + - Made variable wiping optional (define SHA1_WIPE_VARIABLES) + - Removed unnecessary variable initializations + - ROL32 improvement for the Microsoft compiler (using _rotl) + + ======== Test Vectors (from FIPS PUB 180-1) ======== + + SHA1("abc") = + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D + + SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 + + SHA1(A million repetitions of "a") = + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +#ifndef ___SHA1_HDR___ +#define ___SHA1_HDR___ + +#if !defined(SHA1_UTILITY_FUNCTIONS) && !defined(SHA1_NO_UTILITY_FUNCTIONS) +#define SHA1_UTILITY_FUNCTIONS +#endif + +#include // Needed for memset and memcpy + +#ifdef SHA1_UTILITY_FUNCTIONS +#include // Needed for file access and sprintf +#include // Needed for strcat and strcpy +#endif + +#ifdef _MSC_VER +#include +#endif + +// You can define the endian mode in your files, without modifying the SHA1 +// source files. Just #define SHA1_LITTLE_ENDIAN or #define SHA1_BIG_ENDIAN +// in your files, before including the SHA1.h header file. If you don't +// define anything, the class defaults to little endian. + +#if !defined(SHA1_LITTLE_ENDIAN) && !defined(SHA1_BIG_ENDIAN) +#define SHA1_LITTLE_ENDIAN +#endif + +// Same here. If you want variable wiping, #define SHA1_WIPE_VARIABLES, if +// not, #define SHA1_NO_WIPE_VARIABLES. If you don't define anything, it +// defaults to wiping. + +#if !defined(SHA1_WIPE_VARIABLES) && !defined(SHA1_NO_WIPE_VARIABLES) +#define SHA1_WIPE_VARIABLES +#endif + +///////////////////////////////////////////////////////////////////////////// +// Define 8- and 32-bit variables + +#ifndef UINT_32 + +#ifdef _MSC_VER + +#define UINT_8 unsigned __int8 +#define UINT_32 unsigned __int32 + +#else + +#define UINT_8 unsigned char + +#if (ULONG_MAX == 0xFFFFFFFF) +#define UINT_32 unsigned long +#else +#define UINT_32 unsigned int +#endif + +#endif +#endif + +///////////////////////////////////////////////////////////////////////////// +// Declare SHA1 workspace + +typedef union +{ + UINT_8 c[64]; + UINT_32 l[16]; +} SHA1_WORKSPACE_BLOCK; + +class CSHA1 +{ +public: +#ifdef SHA1_UTILITY_FUNCTIONS + // Two different formats for ReportHash(...) + enum + { + REPORT_HEX = 0, + REPORT_DIGIT = 1 + }; +#endif + + // Constructor and Destructor + CSHA1(); + ~CSHA1(); + + UINT_32 m_state[5]; + UINT_32 m_count[2]; + UINT_32 __reserved1[1]; + UINT_8 m_buffer[64]; + UINT_8 m_digest[20]; + UINT_32 __reserved2[3]; + + void Reset(); + + // Update the hash value + void Update(UINT_8 *data, UINT_32 len); +#ifdef SHA1_UTILITY_FUNCTIONS + bool HashFile(char *szFileName); +#endif + + // Finalize hash and report + void Final(); + + // Report functions: as pre-formatted and raw data +#ifdef SHA1_UTILITY_FUNCTIONS + void ReportHash(char *szReport, unsigned char uReportType = REPORT_HEX); +#endif + void GetHash(UINT_8 *puDest); + +private: + // Private SHA-1 transformation + void Transform(UINT_32 *state, UINT_8 *buffer); + + // Member variables + UINT_8 m_workspace[64]; + SHA1_WORKSPACE_BLOCK *m_block; // SHA1 pointer to the byte array above +}; + +#endif diff --git a/backends/twitter/libtwitcurl/.svn/text-base/base64.cpp.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/base64.cpp.svn-base new file mode 100644 index 00000000..08951794 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/base64.cpp.svn-base @@ -0,0 +1,123 @@ +/* + base64.cpp and base64.h + + Copyright (C) 2004-2008 René Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + René Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +#include "base64.h" +#include + +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + +static inline bool is_base64(unsigned char c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(i = 0; (i <4) ; i++) + ret += base64_chars[char_array_4[i]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += base64_chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + + } + + return ret; + +} + +std::string base64_decode(std::string const& encoded_string) { + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; +} \ No newline at end of file diff --git a/backends/twitter/libtwitcurl/.svn/text-base/base64.h.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/base64.h.svn-base new file mode 100644 index 00000000..639e696c --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/base64.h.svn-base @@ -0,0 +1,4 @@ +#include + +std::string base64_encode(unsigned char const* , unsigned int len); +std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/backends/twitter/libtwitcurl/.svn/text-base/oauthlib.cpp.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/oauthlib.cpp.svn-base new file mode 100644 index 00000000..b2da9343 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/oauthlib.cpp.svn-base @@ -0,0 +1,647 @@ +#include "oauthlib.h" +#include "HMAC_SHA1.h" +#include "base64.h" +#include "urlencode.h" + +/*++ +* @method: oAuth::oAuth +* +* @description: constructor +* +* @input: none +* +* @output: none +* +*--*/ +oAuth::oAuth() +{ +} + +/*++ +* @method: oAuth::~oAuth +* +* @description: destructor +* +* @input: none +* +* @output: none +* +*--*/ +oAuth::~oAuth() +{ +} + +/*++ +* @method: oAuth::getConsumerKey +* +* @description: this method gives consumer key that is being used currently +* +* @input: none +* +* @output: consumer key +* +*--*/ +void oAuth::getConsumerKey( std::string& consumerKey ) +{ + consumerKey = m_consumerKey; +} + +/*++ +* @method: oAuth::setConsumerKey +* +* @description: this method saves consumer key that should be used +* +* @input: consumer key +* +* @output: none +* +*--*/ +void oAuth::setConsumerKey( const std::string& consumerKey ) +{ + m_consumerKey.assign( consumerKey ); +} + +/*++ +* @method: oAuth::getConsumerSecret +* +* @description: this method gives consumer secret that is being used currently +* +* @input: none +* +* @output: consumer secret +* +*--*/ +void oAuth::getConsumerSecret( std::string& consumerSecret ) +{ + consumerSecret = m_consumerSecret; +} + +/*++ +* @method: oAuth::setConsumerSecret +* +* @description: this method saves consumer secret that should be used +* +* @input: consumer secret +* +* @output: none +* +*--*/ +void oAuth::setConsumerSecret( const std::string& consumerSecret ) +{ + m_consumerSecret = consumerSecret; +} + +/*++ +* @method: oAuth::getOAuthTokenKey +* +* @description: this method gives OAuth token (also called access token) that is being used currently +* +* @input: none +* +* @output: OAuth token +* +*--*/ +void oAuth::getOAuthTokenKey( std::string& oAuthTokenKey ) +{ + oAuthTokenKey = m_oAuthTokenKey; +} + +/*++ +* @method: oAuth::setOAuthTokenKey +* +* @description: this method saves OAuth token that should be used +* +* @input: OAuth token +* +* @output: none +* +*--*/ +void oAuth::setOAuthTokenKey( const std::string& oAuthTokenKey ) +{ + m_oAuthTokenKey = oAuthTokenKey; +} + +/*++ +* @method: oAuth::getOAuthTokenSecret +* +* @description: this method gives OAuth token secret that is being used currently +* +* @input: none +* +* @output: OAuth token secret +* +*--*/ +void oAuth::getOAuthTokenSecret( std::string& oAuthTokenSecret ) +{ + oAuthTokenSecret = m_oAuthTokenSecret; +} + +/*++ +* @method: oAuth::setOAuthTokenSecret +* +* @description: this method saves OAuth token that should be used +* +* @input: OAuth token secret +* +* @output: none +* +*--*/ +void oAuth::setOAuthTokenSecret( const std::string& oAuthTokenSecret ) +{ + m_oAuthTokenSecret = oAuthTokenSecret; +} + +/*++ +* @method: oAuth::getOAuthScreenName +* +* @description: this method gives authorized user's screenname +* +* @input: none +* +* @output: screen name +* +*--*/ +void oAuth::getOAuthScreenName( std::string& oAuthScreenName ) +{ + oAuthScreenName = m_oAuthScreenName; +} + +/*++ +* @method: oAuth::setOAuthScreenName +* +* @description: this method sets authorized user's screenname +* +* @input: screen name +* +* @output: none +* +*--*/ +void oAuth::setOAuthScreenName( const std::string& oAuthScreenName ) +{ + m_oAuthScreenName = oAuthScreenName; +} + +/*++ +* @method: oAuth::getOAuthPin +* +* @description: this method gives OAuth verifier PIN +* +* @input: none +* +* @output: OAuth verifier PIN +* +*--*/ +void oAuth::getOAuthPin( std::string& oAuthPin ) +{ + oAuthPin = m_oAuthPin; +} + +/*++ +* @method: oAuth::setOAuthPin +* +* @description: this method sets OAuth verifier PIN +* +* @input: OAuth verifier PIN +* +* @output: none +* +*--*/ +void oAuth::setOAuthPin( const std::string& oAuthPin ) +{ + m_oAuthPin = oAuthPin; +} + +/*++ +* @method: oAuth::generateNonceTimeStamp +* +* @description: this method generates nonce and timestamp for OAuth header +* +* @input: none +* +* @output: none +* +* @remarks: internal method +* +*--*/ +void oAuth::generateNonceTimeStamp() +{ + char szTime[oAuthLibDefaults::OAUTHLIB_BUFFSIZE]; + char szRand[oAuthLibDefaults::OAUTHLIB_BUFFSIZE]; + memset( szTime, 0, oAuthLibDefaults::OAUTHLIB_BUFFSIZE ); + memset( szRand, 0, oAuthLibDefaults::OAUTHLIB_BUFFSIZE ); + srand( time( NULL ) ); + sprintf( szRand, "%x", rand()%1000 ); + sprintf( szTime, "%ld", time( NULL ) ); + + m_nonce.assign( szTime ); + m_nonce.append( szRand ); + m_timeStamp.assign( szTime ); +} + +/*++ +* @method: oAuth::buildOAuthRawDataKeyValPairs +* +* @description: this method prepares key-value pairs from the data part of the URL +* or from the URL post fields data, as required by OAuth header +* and signature generation. +* +* @input: rawData - Raw data either from the URL itself or from post fields. +* Should already be url encoded. +* urlencodeData - If true, string will be urlencoded before converting +* to key value pairs. +* +* @output: rawDataKeyValuePairs - Map in which key-value pairs are populated +* +* @remarks: internal method +* +*--*/ +void oAuth::buildOAuthRawDataKeyValPairs( const std::string& rawData, + bool urlencodeData, + oAuthKeyValuePairs& rawDataKeyValuePairs ) +{ + /* Raw data if it's present. Data should already be urlencoded once */ + if( rawData.length() ) + { + size_t nSep = std::string::npos; + size_t nPos = std::string::npos; + std::string dataKeyVal; + std::string dataKey; + std::string dataVal; + + /* This raw data part can contain many key value pairs: key1=value1&key2=value2&key3=value3 */ + std::string dataPart = rawData; + while( std::string::npos != ( nSep = dataPart.find_first_of("&") ) ) + { + /* Extract first key=value pair */ + dataKeyVal = dataPart.substr( 0, nSep ); + + /* Split them */ + nPos = dataKeyVal.find_first_of( "=" ); + if( std::string::npos != nPos ) + { + dataKey = dataKeyVal.substr( 0, nPos ); + dataVal = dataKeyVal.substr( nPos + 1 ); + + /* Put this key=value pair in map */ + rawDataKeyValuePairs[dataKey] = urlencodeData ? urlencode( dataVal ) : dataVal; + } + dataPart = dataPart.substr( nSep + 1 ); + } + + /* For the last key=value */ + dataKeyVal = dataPart.substr( 0, nSep ); + + /* Split them */ + nPos = dataKeyVal.find_first_of( "=" ); + if( std::string::npos != nPos ) + { + dataKey = dataKeyVal.substr( 0, nPos ); + dataVal = dataKeyVal.substr( nPos + 1 ); + + /* Put this key=value pair in map */ + rawDataKeyValuePairs[dataKey] = urlencodeData ? urlencode( dataVal ) : dataVal; + } + } +} + +/*++ +* @method: oAuth::buildOAuthTokenKeyValuePairs +* +* @description: this method prepares key-value pairs required for OAuth header +* and signature generation. +* +* @input: includeOAuthVerifierPin - flag to indicate whether oauth_verifer key-value +* pair needs to be included. oauth_verifer is only +* used during exchanging request token with access token. +* oauthSignature - base64 and url encoded OAuth signature. +* generateTimestamp - If true, then generate new timestamp for nonce. +* +* @output: keyValueMap - map in which key-value pairs are populated +* +* @remarks: internal method +* +*--*/ +bool oAuth::buildOAuthTokenKeyValuePairs( const bool includeOAuthVerifierPin, + const std::string& oauthSignature, + oAuthKeyValuePairs& keyValueMap, + const bool generateTimestamp ) +{ + /* Generate nonce and timestamp if required */ + if( generateTimestamp ) + { + generateNonceTimeStamp(); + } + + /* Consumer key and its value */ + keyValueMap[oAuthLibDefaults::OAUTHLIB_CONSUMERKEY_KEY] = m_consumerKey; + + /* Nonce key and its value */ + keyValueMap[oAuthLibDefaults::OAUTHLIB_NONCE_KEY] = m_nonce; + + /* Signature if supplied */ + if( oauthSignature.length() ) + { + keyValueMap[oAuthLibDefaults::OAUTHLIB_SIGNATURE_KEY] = oauthSignature; + } + + /* Signature method, only HMAC-SHA1 as of now */ + keyValueMap[oAuthLibDefaults::OAUTHLIB_SIGNATUREMETHOD_KEY] = std::string( "HMAC-SHA1" ); + + /* Timestamp */ + keyValueMap[oAuthLibDefaults::OAUTHLIB_TIMESTAMP_KEY] = m_timeStamp; + + /* Token */ + if( m_oAuthTokenKey.length() ) + { + keyValueMap[oAuthLibDefaults::OAUTHLIB_TOKEN_KEY] = m_oAuthTokenKey; + } + + /* Verifier */ + if( includeOAuthVerifierPin && m_oAuthPin.length() ) + { + keyValueMap[oAuthLibDefaults::OAUTHLIB_VERIFIER_KEY] = m_oAuthPin; + } + + /* Version */ + keyValueMap[oAuthLibDefaults::OAUTHLIB_VERSION_KEY] = std::string( "1.0" ); + + return ( keyValueMap.size() ) ? true : false; +} + +/*++ +* @method: oAuth::getSignature +* +* @description: this method calculates HMAC-SHA1 signature of OAuth header +* +* @input: eType - HTTP request type +* rawUrl - raw url of the HTTP request +* rawKeyValuePairs - key-value pairs containing OAuth headers and HTTP data +* +* @output: oAuthSignature - base64 and url encoded signature +* +* @remarks: internal method +* +*--*/ +bool oAuth::getSignature( const eOAuthHttpRequestType eType, + const std::string& rawUrl, + const oAuthKeyValuePairs& rawKeyValuePairs, + std::string& oAuthSignature ) +{ + std::string rawParams; + std::string paramsSeperator; + std::string sigBase; + + /* Initially empty signature */ + oAuthSignature.assign( "" ); + + /* Build a string using key-value pairs */ + paramsSeperator = "&"; + getStringFromOAuthKeyValuePairs( rawKeyValuePairs, rawParams, paramsSeperator ); + + /* Start constructing base signature string. Refer http://dev.twitter.com/auth#intro */ + switch( eType ) + { + case eOAuthHttpGet: + { + sigBase.assign( "GET&" ); + } + break; + + case eOAuthHttpPost: + { + sigBase.assign( "POST&" ); + } + break; + + case eOAuthHttpDelete: + { + sigBase.assign( "DELETE&" ); + } + break; + + default: + { + return false; + } + break; + } + sigBase.append( urlencode( rawUrl ) ); + sigBase.append( "&" ); + sigBase.append( urlencode( rawParams ) ); + + /* Now, hash the signature base string using HMAC_SHA1 class */ + CHMAC_SHA1 objHMACSHA1; + std::string secretSigningKey; + unsigned char strDigest[oAuthLibDefaults::OAUTHLIB_BUFFSIZE_LARGE]; + + memset( strDigest, 0, oAuthLibDefaults::OAUTHLIB_BUFFSIZE_LARGE ); + + /* Signing key is composed of consumer_secret&token_secret */ + secretSigningKey.assign( m_consumerSecret ); + secretSigningKey.append( "&" ); + if( m_oAuthTokenSecret.length() ) + { + secretSigningKey.append( m_oAuthTokenSecret ); + } + + objHMACSHA1.HMAC_SHA1( (unsigned char*)sigBase.c_str(), + sigBase.length(), + (unsigned char*)secretSigningKey.c_str(), + secretSigningKey.length(), + strDigest ); + + /* Do a base64 encode of signature */ + std::string base64Str = base64_encode( strDigest, 20 /* SHA 1 digest is 160 bits */ ); + + /* Do an url encode */ + oAuthSignature = urlencode( base64Str ); + + return ( oAuthSignature.length() ) ? true : false; +} + +/*++ +* @method: oAuth::getOAuthHeader +* +* @description: this method builds OAuth header that should be used in HTTP requests to twitter +* +* @input: eType - HTTP request type +* rawUrl - raw url of the HTTP request +* rawData - HTTP data (post fields) +* includeOAuthVerifierPin - flag to indicate whether or not oauth_verifier needs to included +* in OAuth header +* +* @output: oAuthHttpHeader - OAuth header +* +*--*/ +bool oAuth::getOAuthHeader( const eOAuthHttpRequestType eType, + const std::string& rawUrl, + const std::string& rawData, + std::string& oAuthHttpHeader, + const bool includeOAuthVerifierPin ) +{ + oAuthKeyValuePairs rawKeyValuePairs; + std::string rawParams; + std::string oauthSignature; + std::string paramsSeperator; + std::string pureUrl( rawUrl ); + + /* Clear header string initially */ + oAuthHttpHeader.assign( "" ); + rawKeyValuePairs.clear(); + + /* If URL itself contains ?key=value, then extract and put them in map */ + size_t nPos = rawUrl.find_first_of( "?" ); + if( std::string::npos != nPos ) + { + /* Get only URL */ + pureUrl = rawUrl.substr( 0, nPos ); + + /* Get only key=value data part */ + std::string dataPart = rawUrl.substr( nPos + 1 ); + + /* Split the data in URL as key=value pairs */ + buildOAuthRawDataKeyValPairs( dataPart, true, rawKeyValuePairs ); + } + + /* Split the raw data if it's present, as key=value pairs. Data should already be urlencoded once */ + buildOAuthRawDataKeyValPairs( rawData, false, rawKeyValuePairs ); + + /* Build key-value pairs needed for OAuth request token, without signature */ + buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin, std::string( "" ), rawKeyValuePairs, true ); + + /* Get url encoded base64 signature using request type, url and parameters */ + getSignature( eType, pureUrl, rawKeyValuePairs, oauthSignature ); + + /* Clear map so that the parameters themselves are not sent along with the OAuth values */ + rawKeyValuePairs.clear(); + + /* Now, again build key-value pairs with signature this time */ + buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin, oauthSignature, rawKeyValuePairs, false ); + + /* Get OAuth header in string format */ + paramsSeperator = ","; + getStringFromOAuthKeyValuePairs( rawKeyValuePairs, rawParams, paramsSeperator ); + + /* Build authorization header */ + oAuthHttpHeader.assign( oAuthLibDefaults::OAUTHLIB_AUTHHEADER_STRING ); + oAuthHttpHeader.append( rawParams ); + + return ( oAuthHttpHeader.length() ) ? true : false; +} + +/*++ +* @method: oAuth::getStringFromOAuthKeyValuePairs +* +* @description: this method builds a sorted string from key-value pairs +* +* @input: rawParamMap - key-value pairs map +* paramsSeperator - sepearator, either & or , +* +* @output: rawParams - sorted string of OAuth parameters +* +* @remarks: internal method +* +*--*/ +bool oAuth::getStringFromOAuthKeyValuePairs( const oAuthKeyValuePairs& rawParamMap, + std::string& rawParams, + const std::string& paramsSeperator ) +{ + rawParams.assign( "" ); + if( rawParamMap.size() ) + { + oAuthKeyValueList keyValueList; + std::string dummyStr; + + /* Push key-value pairs to a list of strings */ + keyValueList.clear(); + oAuthKeyValuePairs::const_iterator itMap = rawParamMap.begin(); + for( ; itMap != rawParamMap.end(); itMap++ ) + { + dummyStr.assign( itMap->first ); + dummyStr.append( "=" ); + if( paramsSeperator == "," ) + { + dummyStr.append( "\"" ); + } + dummyStr.append( itMap->second ); + if( paramsSeperator == "," ) + { + dummyStr.append( "\"" ); + } + keyValueList.push_back( dummyStr ); + } + + /* Sort key-value pairs based on key name */ + keyValueList.sort(); + + /* Now, form a string */ + dummyStr.assign( "" ); + oAuthKeyValueList::iterator itKeyValue = keyValueList.begin(); + for( ; itKeyValue != keyValueList.end(); itKeyValue++ ) + { + if( dummyStr.length() ) + { + dummyStr.append( paramsSeperator ); + } + dummyStr.append( itKeyValue->c_str() ); + } + rawParams.assign( dummyStr ); + } + return ( rawParams.length() ) ? true : false; +} + +/*++ +* @method: oAuth::extractOAuthTokenKeySecret +* +* @description: this method extracts oauth token key and secret from +* twitter's HTTP response +* +* @input: requestTokenResponse - response from twitter +* +* @output: none +* +*--*/ +bool oAuth::extractOAuthTokenKeySecret( const std::string& requestTokenResponse ) +{ + if( requestTokenResponse.length() ) + { + size_t nPos = std::string::npos; + std::string strDummy; + + /* Get oauth_token key */ + nPos = requestTokenResponse.find( oAuthLibDefaults::OAUTHLIB_TOKEN_KEY ); + if( std::string::npos != nPos ) + { + nPos = nPos + oAuthLibDefaults::OAUTHLIB_TOKEN_KEY.length() + strlen( "=" ); + strDummy = requestTokenResponse.substr( nPos ); + nPos = strDummy.find( "&" ); + if( std::string::npos != nPos ) + { + m_oAuthTokenKey = strDummy.substr( 0, nPos ); + } + } + + /* Get oauth_token_secret */ + nPos = requestTokenResponse.find( oAuthLibDefaults::OAUTHLIB_TOKENSECRET_KEY ); + if( std::string::npos != nPos ) + { + nPos = nPos + oAuthLibDefaults::OAUTHLIB_TOKENSECRET_KEY.length() + strlen( "=" ); + strDummy = requestTokenResponse.substr( nPos ); + nPos = strDummy.find( "&" ); + if( std::string::npos != nPos ) + { + m_oAuthTokenSecret = strDummy.substr( 0, nPos ); + } + } + + /* Get screen_name */ + nPos = requestTokenResponse.find( oAuthLibDefaults::OAUTHLIB_SCREENNAME_KEY ); + if( std::string::npos != nPos ) + { + nPos = nPos + oAuthLibDefaults::OAUTHLIB_SCREENNAME_KEY.length() + strlen( "=" ); + strDummy = requestTokenResponse.substr( nPos ); + m_oAuthScreenName = strDummy; + } + } + return true; +} diff --git a/backends/twitter/libtwitcurl/.svn/text-base/oauthlib.h.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/oauthlib.h.svn-base new file mode 100644 index 00000000..79695bbc --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/oauthlib.h.svn-base @@ -0,0 +1,127 @@ +#ifndef __OAUTHLIB_H__ +#define __OAUTHLIB_H__ + +#include "time.h" +#include +#include +#include +#include +#include +#include +#include + +namespace oAuthLibDefaults +{ + /* Constants */ + const int OAUTHLIB_BUFFSIZE = 1024; + const int OAUTHLIB_BUFFSIZE_LARGE = 1024; + const std::string OAUTHLIB_CONSUMERKEY_KEY = "oauth_consumer_key"; + const std::string OAUTHLIB_CALLBACK_KEY = "oauth_callback"; + const std::string OAUTHLIB_VERSION_KEY = "oauth_version"; + const std::string OAUTHLIB_SIGNATUREMETHOD_KEY = "oauth_signature_method"; + const std::string OAUTHLIB_SIGNATURE_KEY = "oauth_signature"; + const std::string OAUTHLIB_TIMESTAMP_KEY = "oauth_timestamp"; + const std::string OAUTHLIB_NONCE_KEY = "oauth_nonce"; + const std::string OAUTHLIB_TOKEN_KEY = "oauth_token"; + const std::string OAUTHLIB_TOKENSECRET_KEY = "oauth_token_secret"; + const std::string OAUTHLIB_VERIFIER_KEY = "oauth_verifier"; + const std::string OAUTHLIB_SCREENNAME_KEY = "screen_name"; + const std::string OAUTHLIB_AUTHENTICITY_TOKEN_KEY = "authenticity_token"; + const std::string OAUTHLIB_SESSIONUSERNAME_KEY = "session[username_or_email]"; + const std::string OAUTHLIB_SESSIONPASSWORD_KEY = "session[password]"; + const std::string OAUTHLIB_AUTHENTICITY_TOKEN_TWITTER_RESP_KEY = "authenticity_token\" type=\"hidden\" value=\""; + const std::string OAUTHLIB_TOKEN_TWITTER_RESP_KEY = "oauth_token\" type=\"hidden\" value=\""; + const std::string OAUTHLIB_PIN_TWITTER_RESP_KEY = "code-desc\">"; + const std::string OAUTHLIB_TOKEN_END_TAG_TWITTER_RESP = "\" />"; + const std::string OAUTHLIB_PIN_END_TAG_TWITTER_RESP = ""; + + const std::string OAUTHLIB_AUTHHEADER_STRING = "Authorization: OAuth "; +}; + +namespace oAuthTwitterApiUrls +{ + /* Twitter OAuth API URLs */ + const std::string OAUTHLIB_TWITTER_REQUEST_TOKEN_URL = "twitter.com/oauth/request_token"; + const std::string OAUTHLIB_TWITTER_AUTHORIZE_URL = "twitter.com/oauth/authorize?oauth_token="; + const std::string OAUTHLIB_TWITTER_ACCESS_TOKEN_URL = "twitter.com/oauth/access_token"; +}; + +typedef enum _eOAuthHttpRequestType +{ + eOAuthHttpInvalid = 0, + eOAuthHttpGet, + eOAuthHttpPost, + eOAuthHttpDelete +} eOAuthHttpRequestType; + +typedef std::list oAuthKeyValueList; +typedef std::map oAuthKeyValuePairs; + +class oAuth +{ +public: + oAuth(); + ~oAuth(); + + /* OAuth public methods used by twitCurl */ + void getConsumerKey( std::string& consumerKey /* out */ ); + void setConsumerKey( const std::string& consumerKey /* in */ ); + + void getConsumerSecret( std::string& consumerSecret /* out */ ); + void setConsumerSecret( const std::string& consumerSecret /* in */ ); + + void getOAuthTokenKey( std::string& oAuthTokenKey /* out */ ); + void setOAuthTokenKey( const std::string& oAuthTokenKey /* in */ ); + + void getOAuthTokenSecret( std::string& oAuthTokenSecret /* out */ ); + void setOAuthTokenSecret( const std::string& oAuthTokenSecret /* in */ ); + + void getOAuthScreenName( std::string& oAuthScreenName /* out */ ); + void setOAuthScreenName( const std::string& oAuthScreenName /* in */ ); + + void getOAuthPin( std::string& oAuthPin /* out */ ); + void setOAuthPin( const std::string& oAuthPin /* in */ ); + + bool getOAuthHeader( const eOAuthHttpRequestType eType, /* in */ + const std::string& rawUrl, /* in */ + const std::string& rawData, /* in */ + std::string& oAuthHttpHeader, /* out */ + const bool includeOAuthVerifierPin = false /* in */ ); + + bool extractOAuthTokenKeySecret( const std::string& requestTokenResponse /* in */ ); + +private: + + /* OAuth data */ + std::string m_consumerKey; + std::string m_consumerSecret; + std::string m_oAuthTokenKey; + std::string m_oAuthTokenSecret; + std::string m_oAuthPin; + std::string m_nonce; + std::string m_timeStamp; + std::string m_oAuthScreenName; + + /* OAuth twitter related utility methods */ + void buildOAuthRawDataKeyValPairs( const std::string& rawData, /* in */ + bool urlencodeData, /* in */ + oAuthKeyValuePairs& rawDataKeyValuePairs /* out */ ); + + bool buildOAuthTokenKeyValuePairs( const bool includeOAuthVerifierPin, /* in */ + const std::string& oauthSignature, /* in */ + oAuthKeyValuePairs& keyValueMap /* out */, + const bool generateTimestamp /* in */ ); + + bool getStringFromOAuthKeyValuePairs( const oAuthKeyValuePairs& rawParamMap, /* in */ + std::string& rawParams, /* out */ + const std::string& paramsSeperator /* in */ ); + + bool getSignature( const eOAuthHttpRequestType eType, /* in */ + const std::string& rawUrl, /* in */ + const oAuthKeyValuePairs& rawKeyValuePairs, /* in */ + std::string& oAuthSignature /* out */ ); + + void generateNonceTimeStamp(); +}; + +#endif // __OAUTHLIB_H__ \ No newline at end of file diff --git a/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.cpp.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.cpp.svn-base new file mode 100644 index 00000000..5d9670c3 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.cpp.svn-base @@ -0,0 +1,2042 @@ +#include +#include "twitcurl.h" +#include "urlencode.h" + +/*++ +* @method: twitCurl::twitCurl +* +* @description: constructor +* +* @input: none +* +* @output: none +* +*--*/ +twitCurl::twitCurl(): +m_curlHandle( NULL ), +m_curlProxyParamsSet( false ), +m_curlLoginParamsSet( false ), +m_curlCallbackParamsSet( false ), +m_eApiFormatType( twitCurlTypes::eTwitCurlApiFormatXml ), +m_eProtocolType( twitCurlTypes::eTwitCurlProtocolHttp ) +{ + /* Clear callback buffers */ + clearCurlCallbackBuffers(); + + /* Initialize cURL */ + m_curlHandle = curl_easy_init(); + if( NULL == m_curlHandle ) + { + std::string dummyStr; + getLastCurlError( dummyStr ); + } +} + +/*++ +* @method: twitCurl::~twitCurl +* +* @description: destructor +* +* @input: none +* +* @output: none +* +*--*/ +twitCurl::~twitCurl() +{ + /* Cleanup cURL */ + if( m_curlHandle ) + { + curl_easy_cleanup( m_curlHandle ); + m_curlHandle = NULL; + } +} + +/*++ +* @method: twitCurl::setTwitterApiType +* +* @description: method to set API type +* +* @input: none +* +* @output: none +* +*--*/ +void twitCurl::setTwitterApiType( twitCurlTypes::eTwitCurlApiFormatType eType ) +{ + m_eApiFormatType = ( eType < twitCurlTypes::eTwitCurlApiFormatMax ) ? + eType : twitCurlTypes::eTwitCurlApiFormatXml; +} + +/*++ +* @method: twitCurl::setTwitterProcotolType +* +* @description: method to set protocol +* +* @input: none +* +* @output: none +* +*--*/ +void twitCurl::setTwitterProcotolType( twitCurlTypes::eTwitCurlProtocolType eType ) +{ + m_eProtocolType = ( eType < twitCurlTypes::eTwitCurlProtocolMax ) ? + eType : twitCurlTypes::eTwitCurlProtocolHttp; +} + +/*++ +* @method: twitCurl::isCurlInit +* +* @description: method to check if cURL is initialized properly +* +* @input: none +* +* @output: true if cURL is intialized, otherwise false +* +*--*/ +bool twitCurl::isCurlInit() +{ + return ( NULL != m_curlHandle ) ? true : false; +} + +/*++ +* @method: twitCurl::getTwitterUsername +* +* @description: method to get stored Twitter username +* +* @input: none +* +* @output: twitter username +* +*--*/ +std::string& twitCurl::getTwitterUsername() +{ + return m_twitterUsername; +} + +/*++ +* @method: twitCurl::getTwitterPassword +* +* @description: method to get stored Twitter password +* +* @input: none +* +* @output: twitter password +* +*--*/ +std::string& twitCurl::getTwitterPassword() +{ + return m_twitterPassword; +} + +/*++ +* @method: twitCurl::setTwitterUsername +* +* @description: method to set username +* +* @input: userName +* +* @output: none +* +*--*/ +void twitCurl::setTwitterUsername( std::string& userName ) +{ + if( userName.length() ) + { + m_twitterUsername = userName; + m_curlLoginParamsSet = false; + } +} + +/*++ +* @method: twitCurl::setTwitterPassword +* +* @description: method to set password +* +* @input: passWord +* +* @output: none +* +*--*/ +void twitCurl::setTwitterPassword( std::string& passWord ) +{ + if( passWord.length() ) + { + m_twitterPassword = passWord; + m_curlLoginParamsSet = false; + } +} + +/*++ +* @method: twitCurl::getProxyServerIp +* +* @description: method to get proxy server IP address +* +* @input: none +* +* @output: proxy server IP address +* +*--*/ +std::string& twitCurl::getProxyServerIp() +{ + return m_proxyServerIp; +} + +/*++ +* @method: twitCurl::getProxyServerPort +* +* @description: method to get proxy server port +* +* @input: none +* +* @output: proxy server port +* +*--*/ +std::string& twitCurl::getProxyServerPort() +{ + return m_proxyServerPort; +} + +/*++ +* @method: twitCurl::getProxyUserName +* +* @description: method to get proxy user name +* +* @input: none +* +* @output: proxy server user name +* +*--*/ +std::string& twitCurl::getProxyUserName() +{ + return m_proxyUserName; +} + +/*++ +* @method: twitCurl::getProxyPassword +* +* @description: method to get proxy server password +* +* @input: none +* +* @output: proxy server password +* +*--*/ +std::string& twitCurl::getProxyPassword() +{ + return m_proxyPassword; +} + +/*++ +* @method: twitCurl::setProxyServerIp +* +* @description: method to set proxy server IP address +* +* @input: proxyServerIp +* +* @output: none +* +*--*/ +void twitCurl::setProxyServerIp( std::string& proxyServerIp ) +{ + if( proxyServerIp.length() ) + { + m_proxyServerIp = proxyServerIp; + /* + * Reset the flag so that next cURL http request + * would set proxy details again into cURL. + */ + m_curlProxyParamsSet = false; + } +} + +/*++ +* @method: twitCurl::setProxyServerPort +* +* @description: method to set proxy server port +* +* @input: proxyServerPort +* +* @output: none +* +*--*/ +void twitCurl::setProxyServerPort( std::string& proxyServerPort ) +{ + if( proxyServerPort.length() ) + { + m_proxyServerPort = proxyServerPort; + /* + * Reset the flag so that next cURL http request + * would set proxy details again into cURL. + */ + m_curlProxyParamsSet = false; + } +} + +/*++ +* @method: twitCurl::setProxyUserName +* +* @description: method to set proxy server username +* +* @input: proxyUserName +* +* @output: none +* +*--*/ +void twitCurl::setProxyUserName( std::string& proxyUserName ) +{ + if( proxyUserName.length() ) + { + m_proxyUserName = proxyUserName; + /* + * Reset the flag so that next cURL http request + * would set proxy details again into cURL. + */ + m_curlProxyParamsSet = false; + } +} + +/*++ +* @method: twitCurl::setProxyPassword +* +* @description: method to set proxy server password +* +* @input: proxyPassword +* +* @output: none +* +*--*/ +void twitCurl::setProxyPassword( std::string& proxyPassword ) +{ + if( proxyPassword.length() ) + { + m_proxyPassword = proxyPassword; + /* + * Reset the flag so that next cURL http request + * would set proxy details again into cURL. + */ + m_curlProxyParamsSet = false; + } +} + +/*++ +* @method: twitCurl::search +* +* @description: method to return tweets that match a specified query. +* +* @input: searchQuery - search query in string format +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +* @note: Only ATOM and JSON format supported. +* +*--*/ +bool twitCurl::search( std::string& searchQuery ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SEARCH_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[twitCurlTypes::eTwitCurlApiFormatJson] + + twitCurlDefaults::TWITCURL_URL_SEP_QUES + twitCurlDefaults::TWITCURL_SEARCHQUERYSTRING + + searchQuery; + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::statusUpdate +* +* @description: method to update new status message in twitter profile +* +* @input: newStatus +* +* @output: true if POST is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::statusUpdate( std::string& newStatus ) +{ + bool retVal = false; + if( newStatus.length() ) + { + /* Prepare new status message */ + std::string newStatusMsg = twitCurlDefaults::TWITCURL_STATUSSTRING + urlencode( newStatus ); + + /* Perform POST */ + retVal = performPost( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_STATUSUPDATE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + newStatusMsg ); + } + return retVal; +} + +/*++ +* @method: twitCurl::statusShowById +* +* @description: method to get a status message by its id +* +* @input: statusId - a number in std::string format +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::statusShowById( std::string& statusId ) +{ + bool retVal = false; + if( statusId.length() ) + { + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_STATUSSHOW_URL + statusId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Perform GET */ + retVal = performGet( buildUrl ); + } + return retVal; +} + +/*++ +* @method: twitCurl::statusDestroyById +* +* @description: method to delete a status message by its id +* +* @input: statusId - a number in std::string format +* +* @output: true if DELETE is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::statusDestroyById( std::string& statusId ) +{ + bool retVal = false; + if( statusId.length() ) + { + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_STATUDESTROY_URL + statusId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Perform DELETE */ + retVal = performDelete( buildUrl ); + } + return retVal; +} + +/*++ +* @method: twitCurl::timelinePublicGet +* +* @description: method to get public timeline +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::timelinePublicGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_PUBLIC_TIMELINE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::featuredUsersGet +* +* @description: method to get featured users +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::featuredUsersGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FEATURED_USERS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::timelineFriendsGet +* +* @description: method to get friends timeline +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::timelineFriendsGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FRIENDS_TIMELINE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::mentionsGet +* +* @description: method to get mentions +* +* @input: sinceId - String specifying since id parameter +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::mentionsGet( std::string sinceId ) +{ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_MENTIONS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + if( sinceId.length() ) + { + buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_QUES + twitCurlDefaults::TWITCURL_SINCEID + sinceId; + } + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::timelineUserGet +* +* @description: method to get mentions +* +* @input: trimUser - Trim user name if true +* tweetCount - Number of tweets to get. Max 200. +* userInfo - screen name or user id in string format, +* isUserId - true if userInfo contains an id +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::timelineUserGet( bool trimUser, bool includeRetweets, unsigned int tweetCount, std::string userInfo, bool isUserId ) +{ + /* Prepare URL */ + std::string buildUrl; + + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_USERTIMELINE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + if( !userInfo.length() ) + { + buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_QUES; + } + + if( tweetCount ) + { + if( tweetCount > twitCurlDefaults::MAX_TIMELINE_TWEET_COUNT ) + { + tweetCount = twitCurlDefaults::MAX_TIMELINE_TWEET_COUNT; + } + std::stringstream tmpStrm; + tmpStrm << twitCurlDefaults::TWITCURL_URL_SEP_AMP + twitCurlDefaults::TWITCURL_COUNT << tweetCount; + buildUrl += tmpStrm.str(); + tmpStrm.str().clear(); + } + + if( includeRetweets ) + { + buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_AMP + twitCurlDefaults::TWITCURL_INCRETWEETS; + } + + if( trimUser ) + { + buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_AMP + twitCurlDefaults::TWITCURL_TRIMUSER; + } + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::userGet +* +* @description: method to get a user's profile +* +* @input: userInfo - screen name or user id in string format, +* isUserId - true if userInfo contains an id +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::userGet( std::string& userInfo, bool isUserId ) +{ + bool retVal = false; + if( userInfo.length() ) + { + /* Set URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SHOWUSERS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Perform GET */ + retVal = performGet( buildUrl ); + } + return retVal; +} + +/*++ +* @method: twitCurl::friendsGet +* +* @description: method to get a user's friends +* +* @input: userInfo - screen name or user id in string format, +* isUserId - true if userInfo contains an id +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::friendsGet( std::string userInfo, bool isUserId ) +{ + /* Set URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SHOWFRIENDS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::followersGet +* +* @description: method to get a user's followers +* +* @input: userInfo - screen name or user id in string format, +* isUserId - true if userInfo contains an id +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::followersGet( std::string userInfo, bool isUserId ) +{ + /* Prepare URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SHOWFOLLOWERS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::directMessageGet +* +* @description: method to get direct messages +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::directMessageGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_DIRECTMESSAGES_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::directMessageSend +* +* @description: method to send direct message to a user +* +* @input: userInfo - screen name or user id of a user to whom message needs to be sent, +* dMsg - message +* isUserId - true if userInfo contains target user's id +* +* @output: true if POST is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::directMessageSend( std::string& userInfo, std::string& dMsg, bool isUserId ) +{ + bool retVal = false; + if( userInfo.length() && dMsg.length() ) + { + /* Prepare new direct message */ + std::string newDm = twitCurlDefaults::TWITCURL_TEXTSTRING + urlencode( dMsg ); + + /* Prepare URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_DIRECTMESSAGENEW_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Perform POST */ + retVal = performPost( buildUrl, newDm ); + } + return retVal; +} + +/*++ +* @method: twitCurl::directMessageGetSent +* +* @description: method to get sent direct messages +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::directMessageGetSent() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_DIRECTMESSAGESSENT_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::directMessageDestroyById +* +* @description: method to delete direct messages by its id +* +* @input: dMsgId - id of direct message in string format +* +* @output: true if DELETE is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::directMessageDestroyById( std::string& dMsgId ) +{ + bool retVal = false; + if( dMsgId.length() ) + { + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_DIRECTMESSAGEDESTROY_URL + dMsgId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Perform DELETE */ + retVal = performDelete( buildUrl ); + } + return retVal; +} + +/*++ +* @method: twitCurl::friendshipCreate +* +* @description: method to add a twitter user as friend (follow a user) +* +* @input: userInfo - user id or screen name of a user +* isUserId - true if userInfo contains a user id instead of screen name +* +* @output: true if POST is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::friendshipCreate( std::string& userInfo, bool isUserId ) +{ + bool retVal = false; + if( userInfo.length() ) + { + /* Prepare URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FRIENDSHIPSCREATE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Send some dummy data in POST */ + std::string dummyData = twitCurlDefaults::TWITCURL_TEXTSTRING + + urlencode( std::string( "dummy" ) ); + + /* Perform POST */ + retVal = performPost( buildUrl, dummyData ); + } + return retVal; +} + +/*++ +* @method: twitCurl::friendshipDestroy +* +* @description: method to delete a twitter user from friend list (unfollow a user) +* +* @input: userInfo - user id or screen name of a user +* isUserId - true if userInfo contains a user id instead of screen name +* +* @output: true if DELETE is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::friendshipDestroy( std::string& userInfo, bool isUserId ) +{ + bool retVal = false; + if( userInfo.length() ) + { + /* Prepare URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FRIENDSHIPSDESTROY_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Perform DELETE */ + retVal = performDelete( buildUrl ); + } + return retVal; +} + +/*++ +* @method: twitCurl::friendshipShow +* +* @description: method to show all friends +* +* @input: userInfo - user id or screen name of a user of whom friends need to be shown +* isUserId - true if userInfo contains a user id instead of screen name +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::friendshipShow( std::string& userInfo, bool isUserId ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FRIENDSHIPSSHOW_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + if( userInfo.length() ) + { + /* Append username to the URL */ + buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_QUES; + if( isUserId ) + { + buildUrl += twitCurlDefaults::TWITCURL_TARGETUSERID; + } + else + { + buildUrl += twitCurlDefaults::TWITCURL_TARGETSCREENNAME; + } + buildUrl += userInfo; + } + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::friendsIdsGet +* +* @description: method to show IDs of all friends of a twitter user +* +* @input: userInfo - user id or screen name of a user +* isUserId - true if userInfo contains a user id instead of screen name +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::friendsIdsGet( std::string& userInfo, bool isUserId ) +{ + /* Prepare URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FRIENDSIDS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::followersIdsGet +* +* @description: method to show IDs of all followers of a twitter user +* +* @input: userInfo - user id or screen name of a user +* isUserId - true if userInfo contains a user id instead of screen name +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::followersIdsGet( std::string& userInfo, bool isUserId ) +{ + /* Prepare URL */ + std::string buildUrl; + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FOLLOWERSIDS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], + userInfo, isUserId ); + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::accountRateLimitGet +* +* @description: method to get API rate limit of current user +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::accountRateLimitGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_ACCOUNTRATELIMIT_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::accountVerifyCredGet +* +* @description: method to get information on user identified by given credentials +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::accountVerifyCredGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_ACCOUNTVERIFYCRED_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::favoriteGet +* +* @description: method to get favorite users' statuses +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::favoriteGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FAVORITESGET_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::favoriteCreate +* +* @description: method to favorite a status message +* +* @input: statusId - id in string format of the status to be favorited +* +* @output: true if POST is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::favoriteCreate( std::string& statusId ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FAVORITECREATE_URL + statusId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Send some dummy data in POST */ + std::string dummyData = twitCurlDefaults::TWITCURL_TEXTSTRING + + urlencode( std::string( "dummy" ) ); + + /* Perform POST */ + return performPost( buildUrl, dummyData ); +} + +/*++ +* @method: twitCurl::favoriteDestroy +* +* @description: method to delete a favorited the status +* +* @input: statusId - id in string format of the favorite status to be deleted +* +* @output: true if DELETE is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::favoriteDestroy( std::string& statusId ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FAVORITEDESTROY_URL + statusId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Perform DELETE */ + return performDelete( buildUrl ); +} + +/*++ +* @method: twitCurl::blockCreate +* +* @description: method to block a user +* +* @input: userInfo - user id or screen name +* +* @output: true if POST is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::blockCreate( std::string& userInfo ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_BLOCKSCREATE_URL + userInfo + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Send some dummy data in POST */ + std::string dummyData = twitCurlDefaults::TWITCURL_TEXTSTRING + + urlencode( std::string( "dummy" ) ); + + /* Perform POST */ + return performPost( buildUrl, dummyData ); +} + +/*++ +* @method: twitCurl::blockDestroy +* +* @description: method to unblock a user +* +* @input: userInfo - user id or screen name +* +* @output: true if DELETE is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::blockDestroy( std::string& userInfo ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_BLOCKSDESTROY_URL + userInfo + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Perform DELETE */ + return performDelete( buildUrl ); +} + +/*++ +* @method: twitCurl::savedSearchGet +* +* @description: gets authenticated user's saved search queries. +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::savedSearchGet( ) +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SAVEDSEARCHGET_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::savedSearchShow +* +* @description: method to retrieve the data for a saved search owned by the authenticating user +* specified by the given id. +* +* @input: searchId - id in string format of the search to be displayed +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::savedSearchShow( std::string& searchId ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SAVEDSEARCHSHOW_URL + searchId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Perform GET */ + return performGet( buildUrl ); +} + +/*++ +* @method: twitCurl::savedSearchCreate +* +* @description: creates a saved search for the authenticated user +* +* @input: query - the query of the search the user would like to save +* +* @output: true if POST is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::savedSearchCreate( std::string& query ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SAVEDSEARCHCREATE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Send some dummy data in POST */ + std::string queryStr = twitCurlDefaults::TWITCURL_QUERYSTRING + urlencode( query ); + + /* Perform POST */ + return performPost( buildUrl, queryStr ); +} + + +/*++ +* @method: twitCurl::savedSearchDestroy +* +* @description: method to destroy a saved search for the authenticated user. The search specified +* by id must be owned by the authenticating user. +* +* @input: searchId - search id of item to be deleted +* +* @output: true if DELETE is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::savedSearchDestroy( std::string& searchId ) +{ + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SAVEDSEARCHDESTROY_URL + searchId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Perform DELETE */ + return performDelete( buildUrl ); +} + + +/*++ +* @method: twitCurl::trendsGet() +* +* @description: gets trends. +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::trendsGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_TRENDS_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + + +/*++ +* @method: twitCurl::trendsDailyGet() +* +* @description: gets daily trends. +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::trendsDailyGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_TRENDSDAILY_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::trendsWeeklyGet() +* +* @description: gets weekly trends. +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::trendsWeeklyGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_TRENDSWEEKLY_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::trendsCurrentGet() +* +* @description: gets current trends. +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::trendsCurrentGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_TRENDSCURRENT_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::trendsAvailableGet() +* +* @description: gets available trends. +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::trendsAvailableGet() +{ + /* Perform GET */ + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_TRENDSAVAILABLE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); +} + +/*++ +* @method: twitCurl::getLastWebResponse +* +* @description: method to get http response for the most recent request sent. +* twitcurl users need to call this method and parse the XML +* data returned by twitter to see what has happened. +* +* @input: outWebResp - string in which twitter's response is supplied back to caller +* +* @output: none +* +*--*/ +void twitCurl::getLastWebResponse( std::string& outWebResp ) +{ + outWebResp = ""; + if( m_callbackData.length() ) + { + outWebResp = m_callbackData; + } +} + +/*++ +* @method: twitCurl::getLastCurlError +* +* @description: method to get cURL error response for most recent http request. +* twitcurl users can call this method if any of the APIs return +* false. +* +* @input: none +* +* @output: none +* +*--*/ +void twitCurl::getLastCurlError( std::string& outErrResp ) +{ + m_errorBuffer[twitCurlDefaults::TWITCURL_DEFAULT_BUFFSIZE-1] = twitCurlDefaults::TWITCURL_EOS; + outErrResp.assign( m_errorBuffer ); +} + +/*++ +* @method: twitCurl::curlCallback +* +* @description: static method to get http response back from cURL. +* this is an internal method, users of twitcurl need not +* use this. +* +* @input: as per cURL convention. +* +* @output: size of data stored in our buffer +* +* @remarks: internal method +* +*--*/ +int twitCurl::curlCallback( char* data, size_t size, size_t nmemb, twitCurl* pTwitCurlObj ) +{ + int writtenSize = 0; + if( ( NULL != pTwitCurlObj ) && ( NULL != data ) ) + { + /* Save http response in twitcurl object's buffer */ + writtenSize = pTwitCurlObj->saveLastWebResponse( data, ( size*nmemb ) ); + } + return writtenSize; +} + +/*++ +* @method: twitCurl::saveLastWebResponse +* +* @description: method to save http responses. this is an internal method +* and twitcurl users need not use this. +* +* @input: data - character buffer from cURL, +* size - size of character buffer +* +* @output: size of data stored in our buffer +* +* @remarks: internal method +* +*--*/ +int twitCurl::saveLastWebResponse( char*& data, size_t size ) +{ + int bytesWritten = 0; + if( data && size ) + { + /* Append data in our internal buffer */ + m_callbackData.append( data, size ); + bytesWritten = (int)size; + } + return bytesWritten; +} + +/*++ +* @method: twitCurl::clearCurlCallbackBuffers +* +* @description: method to clear callback buffers used by cURL. this is an +* internal method and twitcurl users need not use this. +* +* @input: none +* +* @output: none +* +* @remarks: internal method +* +*--*/ +void twitCurl::clearCurlCallbackBuffers() +{ + m_callbackData = ""; + memset( m_errorBuffer, 0, twitCurlDefaults::TWITCURL_DEFAULT_BUFFSIZE ); +} + +/*++ +* @method: twitCurl::prepareCurlProxy +* +* @description: method to set proxy details into cURL. this is an internal method. +* twitcurl users should not use this method, instead use setProxyXxx +* methods to set proxy server information. +* +* @input: none +* +* @output: none +* +* @remarks: internal method +* +*--*/ +void twitCurl::prepareCurlProxy() +{ + if( !m_curlProxyParamsSet ) + { + /* Reset existing proxy details in cURL */ + curl_easy_setopt( m_curlHandle, CURLOPT_PROXY, NULL ); + curl_easy_setopt( m_curlHandle, CURLOPT_PROXYUSERPWD, NULL ); + curl_easy_setopt( m_curlHandle, CURLOPT_PROXYAUTH, (long)CURLAUTH_ANY ); + + /* Set proxy details in cURL */ + std::string proxyIpPort(""); + if( getProxyServerIp().size() ) + { + utilMakeCurlParams( proxyIpPort, getProxyServerIp(), getProxyServerPort() ); + } + curl_easy_setopt( m_curlHandle, CURLOPT_PROXY, proxyIpPort.c_str() ); + + /* Prepare username and password for proxy server */ + if( m_proxyUserName.length() && m_proxyPassword.length() ) + { + std::string proxyUserPass; + utilMakeCurlParams( proxyUserPass, getProxyUserName(), getProxyPassword() ); + curl_easy_setopt( m_curlHandle, CURLOPT_PROXYUSERPWD, proxyUserPass.c_str() ); + } + + /* Set the flag to true indicating that proxy info is set in cURL */ + m_curlProxyParamsSet = true; + } +} + +/*++ +* @method: twitCurl::prepareCurlCallback +* +* @description: method to set callback details into cURL. this is an internal method. +* twitcurl users should not use this method. +* +* @input: none +* +* @output: none +* +* @remarks: internal method +* +*--*/ +void twitCurl::prepareCurlCallback() +{ + if( !m_curlCallbackParamsSet ) + { + /* Set buffer to get error */ + curl_easy_setopt( m_curlHandle, CURLOPT_ERRORBUFFER, m_errorBuffer ); + + /* Set callback function to get response */ + curl_easy_setopt( m_curlHandle, CURLOPT_WRITEFUNCTION, curlCallback ); + curl_easy_setopt( m_curlHandle, CURLOPT_WRITEDATA, this ); + + /* Set the flag to true indicating that callback info is set in cURL */ + m_curlCallbackParamsSet = true; + } +} + +/*++ +* @method: twitCurl::prepareCurlUserPass +* +* @description: method to set twitter credentials into cURL. this is an internal method. +* twitcurl users should not use this method, instead use setTwitterXxx +* methods to set twitter username and password. +* +* @input: none +* +* @output: none +* +* @remarks: internal method +* +*--*/ +void twitCurl::prepareCurlUserPass() +{ + if( !m_curlLoginParamsSet ) + { + /* Reset existing username and password stored in cURL */ + curl_easy_setopt( m_curlHandle, CURLOPT_USERPWD, "" ); + + if( getTwitterUsername().size() ) + { + /* Prepare username:password */ + std::string userNamePassword; + utilMakeCurlParams( userNamePassword, getTwitterUsername(), getTwitterPassword() ); + + /* Set username and password */ + curl_easy_setopt( m_curlHandle, CURLOPT_USERPWD, userNamePassword.c_str() ); + } + + /* Set the flag to true indicating that twitter credentials are set in cURL */ + m_curlLoginParamsSet = true; + } +} + +/*++ +* @method: twitCurl::prepareStandardParams +* +* @description: method to set standard params into cURL. this is an internal method. +* twitcurl users should not use this method. +* +* @input: none +* +* @output: none +* +* @remarks: internal method +* +*--*/ +void twitCurl::prepareStandardParams() +{ + /* Restore any custom request we may have */ + curl_easy_setopt( m_curlHandle, CURLOPT_CUSTOMREQUEST, NULL ); + + /* Clear callback and error buffers */ + clearCurlCallbackBuffers(); + + /* Prepare proxy */ + prepareCurlProxy(); + + /* Prepare cURL callback data and error buffer */ + prepareCurlCallback(); + + /* Prepare username and password for twitter */ + prepareCurlUserPass(); +} + +/*++ +* @method: twitCurl::performGet +* +* @description: method to send http GET request. this is an internal method. +* twitcurl users should not use this method. +* +* @input: getUrl - url +* +* @output: none +* +* @remarks: internal method +* +*--*/ +bool twitCurl::performGet( const std::string& getUrl ) +{ + /* Return if cURL is not initialized */ + if( !isCurlInit() ) + { + return false; + } + + std::string dataStrDummy; + std::string oAuthHttpHeader; + struct curl_slist* pOAuthHeaderList = NULL; + + /* Prepare standard params */ + prepareStandardParams(); + + /* Set OAuth header */ + m_oAuth.getOAuthHeader( eOAuthHttpGet, getUrl, dataStrDummy, oAuthHttpHeader ); + if( oAuthHttpHeader.length() ) + { + pOAuthHeaderList = curl_slist_append( pOAuthHeaderList, oAuthHttpHeader.c_str() ); + if( pOAuthHeaderList ) + { + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPHEADER, pOAuthHeaderList ); + } + } + + /* Set http request and url */ + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPGET, 1 ); + curl_easy_setopt( m_curlHandle, CURLOPT_URL, getUrl.c_str() ); + + /* Send http request */ + if( CURLE_OK == curl_easy_perform( m_curlHandle ) ) + { + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return true; + } + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return false; +} + +/*++ +* @method: twitCurl::performGet +* +* @description: method to send http GET request. this is an internal method. +* twitcurl users should not use this method. +* +* @input: const std::string& getUrl, const std::string& oAuthHttpHeader +* +* @output: none +* +* @remarks: internal method +* +*--*/ +bool twitCurl::performGet( const std::string& getUrl, const std::string& oAuthHttpHeader ) +{ + /* Return if cURL is not initialized */ + if( !isCurlInit() ) + { + return false; + } + + struct curl_slist* pOAuthHeaderList = NULL; + + /* Prepare standard params */ + prepareStandardParams(); + + /* Set http request and url */ + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPGET, 1 ); + curl_easy_setopt( m_curlHandle, CURLOPT_URL, getUrl.c_str() ); + + /* Set header */ + if( oAuthHttpHeader.length() ) + { + pOAuthHeaderList = curl_slist_append( pOAuthHeaderList, oAuthHttpHeader.c_str() ); + if( pOAuthHeaderList ) + { + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPHEADER, pOAuthHeaderList ); + } + } + + /* Send http request */ + if( CURLE_OK == curl_easy_perform( m_curlHandle ) ) + { + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return true; + } + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return false; +} + +/*++ +* @method: twitCurl::performDelete +* +* @description: method to send http DELETE request. this is an internal method. +* twitcurl users should not use this method. +* +* @input: deleteUrl - url +* +* @output: none +* +* @remarks: internal method +* +*--*/ +bool twitCurl::performDelete( const std::string& deleteUrl ) +{ + /* Return if cURL is not initialized */ + if( !isCurlInit() ) + { + return false; + } + + std::string dataStrDummy; + std::string oAuthHttpHeader; + struct curl_slist* pOAuthHeaderList = NULL; + + /* Prepare standard params */ + prepareStandardParams(); + + /* Set OAuth header */ + m_oAuth.getOAuthHeader( eOAuthHttpDelete, deleteUrl, dataStrDummy, oAuthHttpHeader ); + if( oAuthHttpHeader.length() ) + { + pOAuthHeaderList = curl_slist_append( pOAuthHeaderList, oAuthHttpHeader.c_str() ); + if( pOAuthHeaderList ) + { + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPHEADER, pOAuthHeaderList ); + } + } + + /* Set http request and url */ + curl_easy_setopt( m_curlHandle, CURLOPT_CUSTOMREQUEST, "DELETE" ); + curl_easy_setopt( m_curlHandle, CURLOPT_URL, deleteUrl.c_str() ); + curl_easy_setopt( m_curlHandle, CURLOPT_COPYPOSTFIELDS, dataStrDummy.c_str() ); + + /* Send http request */ + if( CURLE_OK == curl_easy_perform( m_curlHandle ) ) + { + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return true; + } + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return false; +} + +/*++ +* @method: twitCurl::performPost +* +* @description: method to send http POST request. this is an internal method. +* twitcurl users should not use this method. +* +* @input: postUrl - url, +* dataStr - url encoded data to be posted +* +* @output: none +* +* @remarks: internal method +* data value in dataStr must already be url encoded. +* ex: dataStr = "key=urlencode(value)" +* +*--*/ +bool twitCurl::performPost( const std::string& postUrl, std::string dataStr ) +{ + /* Return if cURL is not initialized */ + if( !isCurlInit() ) + { + return false; + } + + std::string oAuthHttpHeader; + struct curl_slist* pOAuthHeaderList = NULL; + + /* Prepare standard params */ + prepareStandardParams(); + + /* Set OAuth header */ + m_oAuth.getOAuthHeader( eOAuthHttpPost, postUrl, dataStr, oAuthHttpHeader ); + if( oAuthHttpHeader.length() ) + { + pOAuthHeaderList = curl_slist_append( pOAuthHeaderList, oAuthHttpHeader.c_str() ); + if( pOAuthHeaderList ) + { + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPHEADER, pOAuthHeaderList ); + } + } + + /* Set http request, url and data */ + curl_easy_setopt( m_curlHandle, CURLOPT_POST, 1 ); + curl_easy_setopt( m_curlHandle, CURLOPT_URL, postUrl.c_str() ); + if( dataStr.length() ) + { + curl_easy_setopt( m_curlHandle, CURLOPT_COPYPOSTFIELDS, dataStr.c_str() ); + } + + /* Send http request */ + if( CURLE_OK == curl_easy_perform( m_curlHandle ) ) + { + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return true; + } + if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return false; +} + +/*++ +* @method: utilMakeCurlParams +* +* @description: utility function to build parameter strings in the format +* required by cURL ("param1:param2"). twitcurl users should +* not use this function. +* +* @input: inParam1 - first parameter, +* inParam2 - second parameter +* +* @output: outStr - built parameter +* +* @remarks: internal method +* +*--*/ +void utilMakeCurlParams( std::string& outStr, std::string& inParam1, std::string& inParam2 ) +{ + outStr = inParam1; + outStr += twitCurlDefaults::TWITCURL_COLON + inParam2; +} + +/*++ +* @method: utilMakeUrlForUser +* +* @description: utility function to build url compatible to twitter. twitcurl +* users should not use this function. +* +* @input: baseUrl - base twitter url, +* userInfo - user name, +* isUserId - indicates if userInfo contains a user id or scree name +* +* @output: outUrl - built url +* +* @remarks: internal method +* +*--*/ +void utilMakeUrlForUser( std::string& outUrl, const std::string& baseUrl, std::string& userInfo, bool isUserId ) +{ + /* Copy base URL */ + outUrl = baseUrl; + + if( userInfo.length() ) + { + /* Append username to the URL */ + outUrl += twitCurlDefaults::TWITCURL_URL_SEP_QUES; + if( isUserId ) + { + outUrl += twitCurlDefaults::TWITCURL_USERID; + } + else + { + outUrl += twitCurlDefaults::TWITCURL_SCREENNAME; + } + outUrl += userInfo; + } +} + +/*++ +* @method: twitCurl::getOAuth +* +* @description: method to get a reference to oAuth object. +* +* @input: none +* +* @output: reference to oAuth object +* +*--*/ +oAuth& twitCurl::getOAuth() +{ + return m_oAuth; +} + +/*++ +* @method: twitCurl::oAuthRequestToken +* +* @description: method to get a request token key and secret. this token +* will be used to get authorize user and get PIN from twitter +* +* @input: authorizeUrl is an output parameter. this method will set the url +* in this string. user should visit this link and get PIN from that page. +* +* @output: true if everything went sucessfully, otherwise false +* +*--*/ +bool twitCurl::oAuthRequestToken( std::string& authorizeUrl /* out */ ) +{ + /* Return if cURL is not initialized */ + if( !isCurlInit() ) + { + return false; + } + + /* Get OAuth header for request token */ + bool retVal = false; + std::string oAuthHeader; + authorizeUrl = ""; + if( m_oAuth.getOAuthHeader( eOAuthHttpGet, + twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + oAuthTwitterApiUrls::OAUTHLIB_TWITTER_REQUEST_TOKEN_URL, + std::string( "" ), + oAuthHeader ) ) + { + if( performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + oAuthTwitterApiUrls::OAUTHLIB_TWITTER_REQUEST_TOKEN_URL, oAuthHeader ) ) + { + /* Tell OAuth object to save access token and secret from web response */ + std::string twitterResp; + getLastWebResponse( twitterResp ); + m_oAuth.extractOAuthTokenKeySecret( twitterResp ); + + /* Get access token and secret from OAuth object */ + std::string oAuthTokenKey; + m_oAuth.getOAuthTokenKey( oAuthTokenKey ); + + /* Build authorize url so that user can visit in browser and get PIN */ + authorizeUrl.assign(twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + oAuthTwitterApiUrls::OAUTHLIB_TWITTER_AUTHORIZE_URL ); + authorizeUrl.append( oAuthTokenKey.c_str() ); + + retVal = true; + } + } + return retVal; +} + +/*++ +* @method: twitCurl::oAuthAccessToken +* +* @description: method to exchange request token with access token +* +* @input: none +* +* @output: true if everything went sucessfully, otherwise false +* +*--*/ +bool twitCurl::oAuthAccessToken() +{ + /* Return if cURL is not initialized */ + if( !isCurlInit() ) + { + return false; + } + /* Get OAuth header for access token */ + bool retVal = false; + std::string oAuthHeader; + if( m_oAuth.getOAuthHeader( eOAuthHttpGet, + twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + oAuthTwitterApiUrls::OAUTHLIB_TWITTER_ACCESS_TOKEN_URL, + std::string( "" ), + oAuthHeader, true ) ) + { + if( performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + oAuthTwitterApiUrls::OAUTHLIB_TWITTER_ACCESS_TOKEN_URL, oAuthHeader ) ) + { + /* Tell OAuth object to save access token and secret from web response */ + std::string twitterResp; + getLastWebResponse( twitterResp ); + m_oAuth.extractOAuthTokenKeySecret( twitterResp ); + + retVal = true; + } + } + return retVal; +} + +/*++ +* ADDED BY ANTIROOT +* +* @method: twitCurl::oAuthHandlePIN +* +* @description: method to handle user's PIN code from the authentiation URLs +* +* @input: none +* +* @output: true if everything went sucessfully, otherwise false +* +*--*/ +bool twitCurl::oAuthHandlePIN( const std::string& authorizeUrl /* in */ ) +{ + /* Return if cURL is not initialized */ + if( !isCurlInit() ) + { + return false; + } + + std::string dataStr; + std::string oAuthHttpHeader; + std::string authenticityTokenVal; + std::string oauthTokenVal; + std::string pinCodeVal; + unsigned long httpStatusCode = 0; + size_t nPosStart, nPosEnd; + struct curl_slist* pOAuthHeaderList = NULL; + + /* Prepare standard params */ + prepareStandardParams(); + + /* Set OAuth header */ + m_oAuth.getOAuthHeader( eOAuthHttpGet, authorizeUrl, dataStr, oAuthHttpHeader ); + if( oAuthHttpHeader.length() ) + { + pOAuthHeaderList = curl_slist_append( pOAuthHeaderList, oAuthHttpHeader.c_str() ); + if( pOAuthHeaderList ) + { + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPHEADER, pOAuthHeaderList ); + } + } + + /* Set http request and url */ + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPGET, 1 ); + curl_easy_setopt( m_curlHandle, CURLOPT_URL, authorizeUrl.c_str() ); + + /* Send http request */ + if( CURLE_OK == curl_easy_perform( m_curlHandle ) ) + { + if( pOAuthHeaderList ) + { + curl_easy_getinfo( m_curlHandle, CURLINFO_HTTP_CODE, &httpStatusCode ); + curl_slist_free_all( pOAuthHeaderList ); + + // Now, let's find the authenticity token and oauth token + nPosStart = m_callbackData.find( oAuthLibDefaults::OAUTHLIB_AUTHENTICITY_TOKEN_TWITTER_RESP_KEY ); + if( std::string::npos == nPosStart ) + { + return false; + } + nPosStart += oAuthLibDefaults::OAUTHLIB_AUTHENTICITY_TOKEN_TWITTER_RESP_KEY.length(); + nPosEnd = m_callbackData.substr( nPosStart ).find( oAuthLibDefaults::OAUTHLIB_TOKEN_END_TAG_TWITTER_RESP ); + if( std::string::npos == nPosEnd ) + { + return false; + } + authenticityTokenVal = m_callbackData.substr( nPosStart, nPosEnd ); + + nPosStart = m_callbackData.find( oAuthLibDefaults::OAUTHLIB_TOKEN_TWITTER_RESP_KEY ); + if( std::string::npos == nPosStart ) + { + return false; + } + nPosStart += oAuthLibDefaults::OAUTHLIB_TOKEN_TWITTER_RESP_KEY.length(); + nPosEnd = m_callbackData.substr( nPosStart ).find( oAuthLibDefaults::OAUTHLIB_TOKEN_END_TAG_TWITTER_RESP ); + if( std::string::npos == nPosEnd ) + { + return false; + } + oauthTokenVal = m_callbackData.substr( nPosStart, nPosEnd ); + } + } + else if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + return false; + } + + // Second phase for the authorization + pOAuthHeaderList = NULL; + oAuthHttpHeader.clear(); + + /* Prepare standard params */ + prepareStandardParams(); + + /* + Now, we need to make a data string for POST operation + which includes oauth token, authenticity token, username, password. + */ + dataStr = oAuthLibDefaults::OAUTHLIB_TOKEN_KEY + "=" + oauthTokenVal + "&" + \ + oAuthLibDefaults::OAUTHLIB_AUTHENTICITY_TOKEN_KEY + "=" + authenticityTokenVal + "&" + \ + oAuthLibDefaults::OAUTHLIB_SESSIONUSERNAME_KEY + "=" + getTwitterUsername() + "&" + \ + oAuthLibDefaults::OAUTHLIB_SESSIONPASSWORD_KEY + "=" + getTwitterPassword(); + + /* Set OAuth header */ + m_oAuth.getOAuthHeader( eOAuthHttpPost, authorizeUrl, dataStr, oAuthHttpHeader ); + if( oAuthHttpHeader.length() ) + { + pOAuthHeaderList = curl_slist_append( pOAuthHeaderList, oAuthHttpHeader.c_str() ); + if( pOAuthHeaderList ) + { + curl_easy_setopt( m_curlHandle, CURLOPT_HTTPHEADER, pOAuthHeaderList ); + } + } + + /* Set http request and url */ + curl_easy_setopt( m_curlHandle, CURLOPT_POST, 1 ); + curl_easy_setopt( m_curlHandle, CURLOPT_URL, authorizeUrl.c_str() ); + curl_easy_setopt( m_curlHandle, CURLOPT_COPYPOSTFIELDS, dataStr.c_str() ); + + /* Send http request */ + if( CURLE_OK == curl_easy_perform( m_curlHandle ) ) + { + if( pOAuthHeaderList ) + { + curl_easy_getinfo( m_curlHandle, CURLINFO_HTTP_CODE, &httpStatusCode ); + curl_slist_free_all( pOAuthHeaderList ); + + // Now, let's find the PIN CODE + nPosStart = m_callbackData.find( oAuthLibDefaults::OAUTHLIB_PIN_TWITTER_RESP_KEY ); + if( std::string::npos == nPosStart ) + { + return false; + } + nPosStart += oAuthLibDefaults::OAUTHLIB_PIN_TWITTER_RESP_KEY.length(); + nPosEnd = m_callbackData.substr( nPosStart ).find( oAuthLibDefaults::OAUTHLIB_PIN_END_TAG_TWITTER_RESP ); + if( std::string::npos == nPosEnd ) + { + return false; + } + pinCodeVal = m_callbackData.substr( nPosStart, nPosEnd ); + getOAuth().setOAuthPin( pinCodeVal ); + return true; + } + } + else if( pOAuthHeaderList ) + { + curl_slist_free_all( pOAuthHeaderList ); + } + return false; +} diff --git a/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsp.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsp.svn-base new file mode 100644 index 00000000..14230b25 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsp.svn-base @@ -0,0 +1,140 @@ +# Microsoft Developer Studio Project File - Name="twitcurl" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=twitcurl - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "twitcurl.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "twitcurl.mak" CFG="twitcurl - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "twitcurl - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "twitcurl - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "twitcurl - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /I "./curl" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "twitcurl - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "./curl" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "twitcurl - Win32 Release" +# Name "twitcurl - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\base64.cpp +# End Source File +# Begin Source File + +SOURCE=.\HMAC_SHA1.cpp +# End Source File +# Begin Source File + +SOURCE=.\oauthlib.cpp +# End Source File +# Begin Source File + +SOURCE=.\SHA1.cpp +# End Source File +# Begin Source File + +SOURCE=.\twitcurl.cpp +# End Source File +# Begin Source File + +SOURCE=.\urlencode.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\base64.h +# End Source File +# Begin Source File + +SOURCE=.\HMAC_SHA1.h +# End Source File +# Begin Source File + +SOURCE=.\oauthlib.h +# End Source File +# Begin Source File + +SOURCE=.\SHA1.h +# End Source File +# Begin Source File + +SOURCE=.\twitcurl.h +# End Source File +# Begin Source File + +SOURCE=.\urlencode.h +# End Source File +# End Group +# End Target +# End Project diff --git a/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsw.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsw.svn-base new file mode 100644 index 00000000..10790bd3 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.dsw.svn-base @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "twitcurl"=.\twitcurl.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.h.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.h.svn-base new file mode 100644 index 00000000..492c27fd --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.h.svn-base @@ -0,0 +1,278 @@ +#ifndef _TWITCURL_H_ +#define _TWITCURL_H_ + +#include +#include +#include +#include "oauthlib.h" +#include "curl/curl.h" + +namespace twitCurlTypes +{ + typedef enum _eTwitCurlApiFormatType + { + eTwitCurlApiFormatXml = 0, + eTwitCurlApiFormatJson, + eTwitCurlApiFormatMax + } eTwitCurlApiFormatType; + + typedef enum _eTwitCurlProtocolType + { + eTwitCurlProtocolHttp = 0, + eTwitCurlProtocolHttps, + eTwitCurlProtocolMax + } eTwitCurlProtocolType; +}; + +/* Default values used in twitcurl */ +namespace twitCurlDefaults +{ + /* Constants */ + const int TWITCURL_DEFAULT_BUFFSIZE = 1024; + const std::string TWITCURL_COLON = ":"; + const char TWITCURL_EOS = '\0'; + const unsigned int MAX_TIMELINE_TWEET_COUNT = 200; + + /* Miscellaneous data used to build twitter URLs*/ + const std::string TWITCURL_STATUSSTRING = "status="; + const std::string TWITCURL_TEXTSTRING = "text="; + const std::string TWITCURL_QUERYSTRING = "query="; + const std::string TWITCURL_SEARCHQUERYSTRING = "q="; + const std::string TWITCURL_SCREENNAME = "screen_name="; + const std::string TWITCURL_USERID = "user_id="; + const std::string TWITCURL_EXTENSIONFORMATS[2] = { ".xml", + ".json" + }; + const std::string TWITCURL_PROTOCOLS[2] = { "http://", + "https://" + }; + const std::string TWITCURL_TARGETSCREENNAME = "target_screen_name="; + const std::string TWITCURL_TARGETUSERID = "target_id="; + const std::string TWITCURL_SINCEID = "since_id="; + const std::string TWITCURL_TRIMUSER = "trim_user=true"; + const std::string TWITCURL_INCRETWEETS = "include_rts=true"; + const std::string TWITCURL_COUNT = "count="; + + /* URL separators */ + const std::string TWITCURL_URL_SEP_AMP = "&"; + const std::string TWITCURL_URL_SEP_QUES = "?"; +}; + +/* Default twitter URLs */ +namespace twitterDefaults +{ + + /* Search URLs */ + const std::string TWITCURL_SEARCH_URL = "search.twitter.com/search"; + + /* Status URLs */ + const std::string TWITCURL_STATUSUPDATE_URL = "api.twitter.com/1/statuses/update"; + const std::string TWITCURL_STATUSSHOW_URL = "api.twitter.com/1/statuses/show/"; + const std::string TWITCURL_STATUDESTROY_URL = "api.twitter.com/1/statuses/destroy/"; + + /* Timeline URLs */ + const std::string TWITCURL_HOME_TIMELINE_URL = "api.twitter.com/1/statuses/home_timeline"; + const std::string TWITCURL_PUBLIC_TIMELINE_URL = "api.twitter.com/1/statuses/public_timeline"; + const std::string TWITCURL_FEATURED_USERS_URL = "api.twitter.com/1/statuses/featured"; + const std::string TWITCURL_FRIENDS_TIMELINE_URL = "api.twitter.com/1/statuses/friends_timeline"; + const std::string TWITCURL_MENTIONS_URL = "api.twitter.com/1/statuses/mentions"; + const std::string TWITCURL_USERTIMELINE_URL = "api.twitter.com/1/statuses/user_timeline"; + + /* Users URLs */ + const std::string TWITCURL_SHOWUSERS_URL = "api.twitter.com/1/users/show"; + const std::string TWITCURL_SHOWFRIENDS_URL = "api.twitter.com/1/statuses/friends"; + const std::string TWITCURL_SHOWFOLLOWERS_URL = "api.twitter.com/1/statuses/followers"; + + /* Direct messages URLs */ + const std::string TWITCURL_DIRECTMESSAGES_URL = "api.twitter.com/1/direct_messages"; + const std::string TWITCURL_DIRECTMESSAGENEW_URL = "api.twitter.com/1/direct_messages/new"; + const std::string TWITCURL_DIRECTMESSAGESSENT_URL = "api.twitter.com/1/direct_messages/sent"; + const std::string TWITCURL_DIRECTMESSAGEDESTROY_URL = "api.twitter.com/1/direct_messages/destroy/"; + + /* Friendships URLs */ + const std::string TWITCURL_FRIENDSHIPSCREATE_URL = "api.twitter.com/1/friendships/create"; + const std::string TWITCURL_FRIENDSHIPSDESTROY_URL = "api.twitter.com/1/friendships/destroy"; + const std::string TWITCURL_FRIENDSHIPSSHOW_URL = "api.twitter.com/1/friendships/show"; + + /* Social graphs URLs */ + const std::string TWITCURL_FRIENDSIDS_URL = "api.twitter.com/1/friends/ids"; + const std::string TWITCURL_FOLLOWERSIDS_URL = "api.twitter.com/1/followers/ids"; + + /* Account URLs */ + const std::string TWITCURL_ACCOUNTRATELIMIT_URL = "api.twitter.com/1/account/rate_limit_status"; + const std::string TWITCURL_ACCOUNTVERIFYCRED_URL = "api.twitter.com/1/account/verify_credentials"; + + /* Favorites URLs */ + const std::string TWITCURL_FAVORITESGET_URL = "api.twitter.com/1/favorites"; + const std::string TWITCURL_FAVORITECREATE_URL = "api.twitter.com/1/favorites/create/"; + const std::string TWITCURL_FAVORITEDESTROY_URL = "api.twitter.com/1/favorites/destroy/"; + + /* Block URLs */ + const std::string TWITCURL_BLOCKSCREATE_URL = "api.twitter.com/1/blocks/create/"; + const std::string TWITCURL_BLOCKSDESTROY_URL = "api.twitter.com/1/blocks/destroy/"; + + /* Saved Search URLs */ + const std::string TWITCURL_SAVEDSEARCHGET_URL = "api.twitter.com/1/saved_searches"; + const std::string TWITCURL_SAVEDSEARCHSHOW_URL = "api.twitter.com/1/saved_searches/show/"; + const std::string TWITCURL_SAVEDSEARCHCREATE_URL = "api.twitter.com/1/saved_searches/create"; + const std::string TWITCURL_SAVEDSEARCHDESTROY_URL = "api.twitter.com/1/saved_searches/destroy/"; + + /* Trends URLs */ + const std::string TWITCURL_TRENDS_URL = "api.twitter.com/1/trends"; + const std::string TWITCURL_TRENDSDAILY_URL = "api.twitter.com/1/trends/daily"; + const std::string TWITCURL_TRENDSCURRENT_URL = "api.twitter.com/1/trends/current"; + const std::string TWITCURL_TRENDSWEEKLY_URL = "api.twitter.com/1/trends/weekly"; + const std::string TWITCURL_TRENDSAVAILABLE_URL = "api.twitter.com/1/trends/available"; + +}; + +/* twitCurl class */ +class twitCurl +{ +public: + twitCurl(); + ~twitCurl(); + + /* Twitter OAuth authorization methods */ + oAuth& getOAuth(); + bool oAuthRequestToken( std::string& authorizeUrl /* out */ ); + bool oAuthAccessToken(); + bool oAuthHandlePIN( const std::string& authorizeUrl /* in */ ); + + /* Twitter login APIs, set once and forget */ + std::string& getTwitterUsername(); + std::string& getTwitterPassword(); + void setTwitterUsername( std::string& userName /* in */ ); + void setTwitterPassword( std::string& passWord /* in */ ); + + /* Twitter API type */ + void setTwitterApiType( twitCurlTypes::eTwitCurlApiFormatType eType ); + void setTwitterProcotolType( twitCurlTypes::eTwitCurlProtocolType eType ); + + /* Twitter search APIs */ + bool search( std::string& searchQuery /* in */ ); + + /* Twitter status APIs */ + bool statusUpdate( std::string& newStatus /* in */ ); + bool statusShowById( std::string& statusId /* in */ ); + bool statusDestroyById( std::string& statusId /* in */ ); + + /* Twitter timeline APIs */ + bool timelinePublicGet(); + bool timelineFriendsGet(); + bool timelineUserGet( bool trimUser /* in */, bool includeRetweets /* in */, unsigned int tweetCount /* in */, std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); + bool featuredUsersGet(); + bool mentionsGet( std::string sinceId = "" /* in */ ); + + /* Twitter user APIs */ + bool userGet( std::string& userInfo /* in */, bool isUserId = false /* in */ ); + bool friendsGet( std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); + bool followersGet( std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); + + /* Twitter direct message APIs */ + bool directMessageGet(); + bool directMessageSend( std::string& userInfo /* in */, std::string& dMsg /* in */, bool isUserId = false /* in */ ); + bool directMessageGetSent(); + bool directMessageDestroyById( std::string& dMsgId /* in */ ); + + /* Twitter friendships APIs */ + bool friendshipCreate( std::string& userInfo /* in */, bool isUserId = false /* in */ ); + bool friendshipDestroy( std::string& userInfo /* in */, bool isUserId = false /* in */ ); + bool friendshipShow( std::string& userInfo /* in */, bool isUserId = false /* in */ ); + + /* Twitter social graphs APIs */ + bool friendsIdsGet( std::string& userInfo /* in */, bool isUserId = false /* in */ ); + bool followersIdsGet( std::string& userInfo /* in */, bool isUserId = false /* in */ ); + + /* Twitter account APIs */ + bool accountRateLimitGet(); + bool accountVerifyCredGet(); + /* Twitter favorites APIs */ + bool favoriteGet(); + bool favoriteCreate( std::string& statusId /* in */ ); + bool favoriteDestroy( std::string& statusId /* in */ ); + + /* Twitter block APIs */ + bool blockCreate( std::string& userInfo /* in */ ); + bool blockDestroy( std::string& userInfo /* in */ ); + + /* Twitter search APIs */ + bool savedSearchGet(); + bool savedSearchCreate( std::string& query /* in */ ); + bool savedSearchShow( std::string& searchId /* in */ ); + bool savedSearchDestroy( std::string& searchId /* in */ ); + + /* Twitter trends APIs (JSON) */ + bool trendsGet(); + bool trendsDailyGet(); + bool trendsWeeklyGet(); + bool trendsCurrentGet(); + bool trendsAvailableGet(); + + /* cURL APIs */ + bool isCurlInit(); + void getLastWebResponse( std::string& outWebResp /* out */ ); + void getLastCurlError( std::string& outErrResp /* out */); + + /* Internal cURL related methods */ + int saveLastWebResponse( char*& data, size_t size ); + + /* cURL proxy APIs */ + std::string& getProxyServerIp(); + std::string& getProxyServerPort(); + std::string& getProxyUserName(); + std::string& getProxyPassword(); + void setProxyServerIp( std::string& proxyServerIp /* in */ ); + void setProxyServerPort( std::string& proxyServerPort /* in */ ); + void setProxyUserName( std::string& proxyUserName /* in */ ); + void setProxyPassword( std::string& proxyPassword /* in */ ); + +private: + /* cURL data */ + CURL* m_curlHandle; + char m_errorBuffer[twitCurlDefaults::TWITCURL_DEFAULT_BUFFSIZE]; + std::string m_callbackData; + + /* cURL flags */ + bool m_curlProxyParamsSet; + bool m_curlLoginParamsSet; + bool m_curlCallbackParamsSet; + + /* cURL proxy data */ + std::string m_proxyServerIp; + std::string m_proxyServerPort; + std::string m_proxyUserName; + std::string m_proxyPassword; + + /* Twitter data */ + std::string m_twitterUsername; + std::string m_twitterPassword; + + /* Twitter API type */ + twitCurlTypes::eTwitCurlApiFormatType m_eApiFormatType; + twitCurlTypes::eTwitCurlProtocolType m_eProtocolType; + + /* OAuth data */ + oAuth m_oAuth; + + /* Private methods */ + void clearCurlCallbackBuffers(); + void prepareCurlProxy(); + void prepareCurlCallback(); + void prepareCurlUserPass(); + void prepareStandardParams(); + bool performGet( const std::string& getUrl ); + bool performGet( const std::string& getUrl, const std::string& oAuthHttpHeader ); + bool performDelete( const std::string& deleteUrl ); + bool performPost( const std::string& postUrl, std::string dataStr = "" ); + + /* Internal cURL related methods */ + static int curlCallback( char* data, size_t size, size_t nmemb, twitCurl* pTwitCurlObj ); +}; + + +/* Private functions */ +void utilMakeCurlParams( std::string& outStr, std::string& inParam1, std::string& inParam2 ); +void utilMakeUrlForUser( std::string& outUrl, const std::string& baseUrl, std::string& userInfo, bool isUserId ); + +#endif // _TWITCURL_H_ diff --git a/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.opt.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.opt.svn-base new file mode 100644 index 0000000000000000000000000000000000000000..5f2f29a1e075778a6e9f3c87d2ce7f798fc519de GIT binary patch literal 50688 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 bK!=Q9UQBgLTA~5bfM`H8AR72kXyE? + +
+

Build Log

+

+--------------------Configuration: twitcurl - Win32 Release-------------------- +

+

Command Lines

+Creating temporary file "C:\DOCUME~1\Mahesh\LOCALS~1\Temp\RSP239.tmp" with contents +[ +/nologo /ML /W3 /GX /O2 /I "./curl" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/twitcurl.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c +"C:\Projects\twitcurl\base64.cpp" +"C:\Projects\twitcurl\HMAC_SHA1.cpp" +"C:\Projects\twitcurl\oauthlib.cpp" +"C:\Projects\twitcurl\SHA1.cpp" +"C:\Projects\twitcurl\twitcurl.cpp" +"C:\Projects\twitcurl\urlencode.cpp" +] +Creating command line "cl.exe @C:\DOCUME~1\Mahesh\LOCALS~1\Temp\RSP239.tmp" +Creating command line "link.exe -lib /nologo /out:"Release\twitcurl.lib" .\Release\base64.obj .\Release\HMAC_SHA1.obj .\Release\oauthlib.obj .\Release\SHA1.obj .\Release\twitcurl.obj .\Release\urlencode.obj " +

Output Window

+Compiling... +base64.cpp +HMAC_SHA1.cpp +oauthlib.cpp +SHA1.cpp +twitcurl.cpp +urlencode.cpp +Creating library... + + + +

Results

+twitcurl.lib - 0 error(s), 0 warning(s) +
+ + diff --git a/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.sln.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.sln.svn-base new file mode 100644 index 00000000..b416f7d2 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.sln.svn-base @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "twitcurl", "twitcurl.vcproj", "{00175D8C-EA44-48AE-AC59-B3B7BE04E65C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {00175D8C-EA44-48AE-AC59-B3B7BE04E65C}.Debug|Win32.ActiveCfg = Release|Win32 + {00175D8C-EA44-48AE-AC59-B3B7BE04E65C}.Debug|Win32.Build.0 = Release|Win32 + {00175D8C-EA44-48AE-AC59-B3B7BE04E65C}.Release|Win32.ActiveCfg = Release|Win32 + {00175D8C-EA44-48AE-AC59-B3B7BE04E65C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.vcproj.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.vcproj.svn-base new file mode 100644 index 00000000..ecd787fd --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/twitcurl.vcproj.svn-base @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backends/twitter/libtwitcurl/.svn/text-base/urlencode.cpp.svn-base b/backends/twitter/libtwitcurl/.svn/text-base/urlencode.cpp.svn-base new file mode 100644 index 00000000..8a906b25 --- /dev/null +++ b/backends/twitter/libtwitcurl/.svn/text-base/urlencode.cpp.svn-base @@ -0,0 +1,40 @@ +#include "urlencode.h" + +std::string char2hex( char dec ) +{ + char dig1 = (dec&0xF0)>>4; + char dig2 = (dec&0x0F); + if ( 0<= dig1 && dig1<= 9) dig1+=48; //0,48 in ascii + if (10<= dig1 && dig1<=15) dig1+=65-10; //A,65 in ascii + if ( 0<= dig2 && dig2<= 9) dig2+=48; + if (10<= dig2 && dig2<=15) dig2+=65-10; + + std::string r; + r.append( &dig1, 1); + r.append( &dig2, 1); + return r; +} + +std::string urlencode( const std::string &c ) +{ + + std::string escaped; + int max = c.length(); + for(int i=0; i +#include + +std::string char2hex( char dec ); +std::string urlencode( const std::string &c ); + +#endif // __URLENCODE_H__ \ No newline at end of file diff --git a/backends/twitter/libtwitcurl/curl/.svn/all-wcprops b/backends/twitter/libtwitcurl/curl/.svn/all-wcprops new file mode 100644 index 00000000..940b2dcb --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/all-wcprops @@ -0,0 +1,89 @@ +K 25 +svn:wc:ra_dav:version-url +V 39 +/svn/!svn/ver/69/trunk/libtwitcurl/curl +END +stdcheaders.h +K 25 +svn:wc:ra_dav:version-url +V 53 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/stdcheaders.h +END +typecheck-gcc.h +K 25 +svn:wc:ra_dav:version-url +V 55 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/typecheck-gcc.h +END +multi.h +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/multi.h +END +curlbuild.h.in +K 25 +svn:wc:ra_dav:version-url +V 54 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/curlbuild.h.in +END +Makefile.in +K 25 +svn:wc:ra_dav:version-url +V 51 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/Makefile.in +END +mprintf.h +K 25 +svn:wc:ra_dav:version-url +V 49 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/mprintf.h +END +curlrules.h +K 25 +svn:wc:ra_dav:version-url +V 51 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/curlrules.h +END +easy.h +K 25 +svn:wc:ra_dav:version-url +V 46 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/easy.h +END +curlver.h +K 25 +svn:wc:ra_dav:version-url +V 49 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/curlver.h +END +COPYING +K 25 +svn:wc:ra_dav:version-url +V 47 +/svn/!svn/ver/69/trunk/libtwitcurl/curl/COPYING +END +Makefile.am +K 25 +svn:wc:ra_dav:version-url +V 51 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/Makefile.am +END +curlbuild.h.cmake +K 25 +svn:wc:ra_dav:version-url +V 57 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/curlbuild.h.cmake +END +curl.h +K 25 +svn:wc:ra_dav:version-url +V 46 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/curl.h +END +curlbuild.h +K 25 +svn:wc:ra_dav:version-url +V 51 +/svn/!svn/ver/47/trunk/libtwitcurl/curl/curlbuild.h +END diff --git a/backends/twitter/libtwitcurl/curl/.svn/dir-prop-base b/backends/twitter/libtwitcurl/curl/.svn/dir-prop-base new file mode 100644 index 00000000..f1b96ea7 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/dir-prop-base @@ -0,0 +1,5 @@ +K 14 +bugtraq:number +V 4 +true +END diff --git a/backends/twitter/libtwitcurl/curl/.svn/entries b/backends/twitter/libtwitcurl/curl/.svn/entries new file mode 100644 index 00000000..cd763446 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/entries @@ -0,0 +1,504 @@ +10 + +dir +89 +http://twitcurl.googlecode.com/svn/trunk/libtwitcurl/curl +http://twitcurl.googlecode.com/svn + + + +2011-10-21T12:56:45.537942Z +69 +swatkat.thinkdigit@gmail.com +has-props + + + + + + + + + + + + + +4714a580-958b-11de-ad41-3fcdc5e0e42d + +stdcheaders.h +file + + + + +2012-08-04T17:27:11.764011Z +18c029ed6fdad0ce85ac094ca2841515 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +1330 + +typecheck-gcc.h +file + + + + +2012-08-04T17:27:11.764011Z +4fcad0343efc2422c8680b961908bce2 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +36048 + +multi.h +file + + + + +2012-08-04T17:27:11.764011Z +63dd390e82a97e3115abc2795d9e77ab +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +12981 + +curlbuild.h.in +file + + + + +2012-08-04T17:27:11.764011Z +b92790509c83424cee5a386817cf6740 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +6909 + +Makefile.in +file + + + + +2012-08-04T17:27:11.766968Z +43e4606a3ac0c69c38cce656ae34a197 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +17736 + +mprintf.h +file + + + + +2012-08-04T17:27:11.766968Z +aa358cbaa44e19f43cc05ea772d037af +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +2790 + +curlrules.h +file + + + + +2012-08-04T17:27:11.766968Z +9e7f8b768255827f9bac344297a1d51f +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +8901 + +easy.h +file + + + + +2012-08-04T17:27:11.766968Z +0bacb9036436a91bf66c007a56a2f9b9 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +3472 + +curlver.h +file + + + + +2012-08-04T17:27:11.766968Z +bc4938b1f18a46bb7acfebd817612564 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +2741 + +COPYING +file + + + + +2012-08-04T17:27:11.766968Z +cd35f63043503be099c905fbd7909616 +2011-10-21T12:56:45.537942Z +69 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +1044 + +Makefile.am +file + + + + +2012-08-04T17:27:11.766968Z +c59eb2a9343fbe8a2ec7a112338a70e0 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +2181 + +curlbuild.h.cmake +file + + + + +2012-08-04T17:27:11.766968Z +727affc900a378ad3770941e16e262e4 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +6913 + +curl.h +file + + + + +2012-08-04T17:27:11.766968Z +4d7a46c03f405ac7c5b08f0e8d2f4d0e +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +81186 + +curlbuild.h +file + + + + +2012-08-04T17:27:11.770968Z +b30a8dd73f03df1349ee3098463fe166 +2011-09-12T16:36:56.779736Z +44 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + + + + + + + + +22192 + diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/COPYING.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/COPYING.svn-base new file mode 100644 index 00000000..1bd3e929 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/COPYING.svn-base @@ -0,0 +1,21 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2011, Daniel Stenberg, . + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright +notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization of the copyright holder. diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.am.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.am.svn-base new file mode 100644 index 00000000..86e8b783 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.am.svn-base @@ -0,0 +1,53 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h curlbuild.h curlrules.h + +pkgincludedir= $(includedir)/curl + +# curlbuild.h does not exist in the git tree. When the original libcurl +# source code distribution archive file is created, curlbuild.h.dist is +# renamed to curlbuild.h and included in the tarball so that it can be +# used directly on non-configure systems. +# +# The distributed curlbuild.h will be overwritten on configure systems +# when the configure script runs, with one that is suitable and specific +# to the library being configured and built. +# +# curlbuild.h.in is the distributed template file from which the configure +# script creates curlbuild.h at library configuration time, overwiting the +# one included in the distribution archive. +# +# curlbuild.h.dist is not included in the source code distribution archive. + +EXTRA_DIST = curlbuild.h.in + +DISTCLEANFILES = curlbuild.h + +checksrc: + @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST) + +if CURLDEBUG +# for debug builds, we scan the sources on all regular make invokes +all-local: checksrc +endif diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.in.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.in.svn-base new file mode 100644 index 00000000..62cf5fe8 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/Makefile.in.svn-base @@ -0,0 +1,560 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = include/curl +DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/curlbuild.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ + $(top_srcdir)/m4/curl-confopts.m4 \ + $(top_srcdir)/m4/curl-functions.m4 \ + $(top_srcdir)/m4/curl-openssl.m4 \ + $(top_srcdir)/m4/curl-override.m4 \ + $(top_srcdir)/m4/curl-reentrant.m4 \ + $(top_srcdir)/m4/curl-system.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/xc-translit.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/lib/curl_config.h \ + $(top_builddir)/src/curl_config.h curlbuild.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkgincludedir)" +pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(pkginclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +pkgincludedir = $(includedir)/curl +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_LIBHOSTNAME_FALSE = @BUILD_LIBHOSTNAME_FALSE@ +BUILD_LIBHOSTNAME_TRUE = @BUILD_LIBHOSTNAME_TRUE@ +BUILD_UNITTESTS_FALSE = @BUILD_UNITTESTS_FALSE@ +BUILD_UNITTESTS_TRUE = @BUILD_UNITTESTS_TRUE@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CROSSCOMPILING_FALSE = @CROSSCOMPILING_FALSE@ +CROSSCOMPILING_TRUE = @CROSSCOMPILING_TRUE@ +CURLDEBUG_FALSE = @CURLDEBUG_FALSE@ +CURLDEBUG_TRUE = @CURLDEBUG_TRUE@ +CURLVERSION = @CURLVERSION@ +CURL_CA_BUNDLE = @CURL_CA_BUNDLE@ +CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@ +CURL_DISABLE_DICT = @CURL_DISABLE_DICT@ +CURL_DISABLE_FILE = @CURL_DISABLE_FILE@ +CURL_DISABLE_FTP = @CURL_DISABLE_FTP@ +CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@ +CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@ +CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@ +CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@ +CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ +CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ +CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ +CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ +CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ +CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ +CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ +CURL_LIBS = @CURL_LIBS@ +CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_SHARED = @ENABLE_SHARED@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_GNUTLS_SRP = @HAVE_GNUTLS_SRP@ +HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ +HAVE_LIBZ = @HAVE_LIBZ@ +HAVE_LIBZ_FALSE = @HAVE_LIBZ_FALSE@ +HAVE_LIBZ_TRUE = @HAVE_LIBZ_TRUE@ +HAVE_PK11_CREATEGENERICOBJECT = @HAVE_PK11_CREATEGENERICOBJECT@ +HAVE_SSLEAY_SRP = @HAVE_SSLEAY_SRP@ +IDN_ENABLED = @IDN_ENABLED@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IPV6_ENABLED = @IPV6_ENABLED@ +KRB4_ENABLED = @KRB4_ENABLED@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MANOPT = @MANOPT@ +MIMPURE_FALSE = @MIMPURE_FALSE@ +MIMPURE_TRUE = @MIMPURE_TRUE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@ +NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@ +NROFF = @NROFF@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH = @PATH@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKGADD_NAME = @PKGADD_NAME@ +PKGADD_PKG = @PKGADD_PKG@ +PKGADD_VENDOR = @PKGADD_VENDOR@ +PKGCONFIG = @PKGCONFIG@ +RANDOM_FILE = @RANDOM_FILE@ +RANLIB = @RANLIB@ +REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SONAME_BUMP_FALSE = @SONAME_BUMP_FALSE@ +SONAME_BUMP_TRUE = @SONAME_BUMP_TRUE@ +SSL_ENABLED = @SSL_ENABLED@ +STATICLIB_FALSE = @STATICLIB_FALSE@ +STATICLIB_TRUE = @STATICLIB_TRUE@ +STRIP = @STRIP@ +SUPPORT_FEATURES = @SUPPORT_FEATURES@ +SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@ +TEST_SERVER_LIBS = @TEST_SERVER_LIBS@ +USE_ARES = @USE_ARES@ +USE_AXTLS = @USE_AXTLS@ +USE_CYASSL = @USE_CYASSL@ +USE_EMBEDDED_ARES_FALSE = @USE_EMBEDDED_ARES_FALSE@ +USE_EMBEDDED_ARES_TRUE = @USE_EMBEDDED_ARES_TRUE@ +USE_GNUTLS = @USE_GNUTLS@ +USE_LIBRTMP = @USE_LIBRTMP@ +USE_LIBSSH2 = @USE_LIBSSH2@ +USE_MANUAL_FALSE = @USE_MANUAL_FALSE@ +USE_MANUAL_TRUE = @USE_MANUAL_TRUE@ +USE_NSS = @USE_NSS@ +USE_OPENLDAP = @USE_OPENLDAP@ +USE_POLARSSL = @USE_POLARSSL@ +USE_SSLEAY = @USE_SSLEAY@ +USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ +VERSION = @VERSION@ +VERSIONNUM = @VERSIONNUM@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +libext = @libext@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ + +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h curlbuild.h curlrules.h + + +# curlbuild.h does not exist in the git tree. When the original libcurl +# source code distribution archive file is created, curlbuild.h.dist is +# renamed to curlbuild.h and included in the tarball so that it can be +# used directly on non-configure systems. +# +# The distributed curlbuild.h will be overwritten on configure systems +# when the configure script runs, with one that is suitable and specific +# to the library being configured and built. +# +# curlbuild.h.in is the distributed template file from which the configure +# script creates curlbuild.h at library configuration time, overwiting the +# one included in the distribution archive. +# +# curlbuild.h.dist is not included in the source code distribution archive. +EXTRA_DIST = curlbuild.h.in +DISTCLEANFILES = curlbuild.h +all: curlbuild.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/curl/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/curl/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +curlbuild.h: stamp-h3 + @if test ! -f $@; then \ + rm -f stamp-h3; \ + $(MAKE) stamp-h3; \ + else :; fi + +stamp-h3: $(srcdir)/curlbuild.h.in $(top_builddir)/config.status + @rm -f stamp-h3 + cd $(top_builddir) && $(SHELL) ./config.status include/curl/curlbuild.h +$(srcdir)/curlbuild.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h3 + touch $@ + +distclean-hdr: + -rm -f curlbuild.h stamp-h3 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)" + @list='$(pkginclude_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \ + $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) curlbuild.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) curlbuild.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) curlbuild.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) curlbuild.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +@CURLDEBUG_FALSE@all-local: +all-am: Makefile $(HEADERS) curlbuild.h all-local +installdirs: + for dir in "$(DESTDIR)$(pkgincludedir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-pkgincludeHEADERS + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS + +.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ + clean-generic clean-libtool ctags distclean distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man \ + install-pkgincludeHEADERS install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-info-am uninstall-pkgincludeHEADERS + + +checksrc: + @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST) + +# for debug builds, we scan the sources on all regular make invokes +@CURLDEBUG_TRUE@all-local: checksrc +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/curl.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/curl.h.svn-base new file mode 100644 index 00000000..a9d42fad --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/curl.h.svn-base @@ -0,0 +1,2174 @@ +#ifndef __CURL_CURL_H +#define __CURL_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * http://curl.haxx.se/libcurl/ + * + * curl-library mailing list subscription and unsubscription web interface: + * http://cool.haxx.se/mailman/listinfo/curl-library/ + */ + +#include "curlver.h" /* libcurl version defines */ +#include "curlbuild.h" /* libcurl build definitions */ +#include "curlrules.h" /* libcurl rules enforcement */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && \ + !defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32 +#endif + +#include +#include + +#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) +/* Needed for __FreeBSD_version symbol definition */ +#include +#endif + +/* The include stuff here below is mainly for time_t! */ +#include +#include + +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) && \ + !defined(__CYGWIN__) || defined(__MINGW32__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include +#include +#endif +#else + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on system that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) +#include +#endif + +#ifndef _WIN32_WCE +#include +#endif +#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include +#endif +#include +#endif + +#ifdef __BEOS__ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void CURL; + +/* + * Decorate exportable functions for Win32 and Symbian OS DLL linking. + * This avoids using a .def file for building libcurl.dll. + */ +#if (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)) && \ + !defined(CURL_STATICLIB) +#if defined(BUILDING_LIBCURL) +#define CURL_EXTERN __declspec(dllexport) +#else +#define CURL_EXTERN __declspec(dllimport) +#endif +#else + +#ifdef CURL_HIDDEN_SYMBOLS +/* + * This definition is used to make external definitions visible in the + * shared library when symbols are hidden by default. It makes no + * difference when compiling applications whether this is set or not, + * only when compiling the library. + */ +#define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +#define CURL_EXTERN +#endif +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#ifdef WIN32 +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist* contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ +#define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */ +#define HTTPPOST_READFILE (1<<1) /* specified content is a file name */ +#define HTTPPOST_PTRNAME (1<<2) /* name is only stored pointer + do not free in formfree */ +#define HTTPPOST_PTRCONTENTS (1<<3) /* contents is only stored pointer + do not free in formfree */ +#define HTTPPOST_BUFFER (1<<4) /* upload file from buffer */ +#define HTTPPOST_PTRBUFFER (1<<5) /* upload file from pointer contents */ +#define HTTPPOST_CALLBACK (1<<6) /* upload file contents by using the + regular read callback to get the data + and pass the given pointer as custom + pointer */ + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ +}; + +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. The practical minimum is about + 400 bytes since libcurl uses a buffer of this size as a scratch area + (unrelated to network send operations). */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + + + +/* enumeration of file types */ +typedef enum { + CURLFILETYPE_FILE = 0, + CURLFILETYPE_DIRECTORY, + CURLFILETYPE_SYMLINK, + CURLFILETYPE_DEVICE_BLOCK, + CURLFILETYPE_DEVICE_CHAR, + CURLFILETYPE_NAMEDPIPE, + CURLFILETYPE_SOCKET, + CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ + + CURLFILETYPE_UNKNOWN /* should never occur */ +} curlfiletype; + +#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) +#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) +#define CURLFINFOFLAG_KNOWN_TIME (1<<2) +#define CURLFINFOFLAG_KNOWN_PERM (1<<3) +#define CURLFINFOFLAG_KNOWN_UID (1<<4) +#define CURLFINFOFLAG_KNOWN_GID (1<<5) +#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) +#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) + +/* Content of this structure depends on information which is known and is + achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man + page for callbacks returning this structure -- some fields are mandatory, + some others are optional. The FLAG field has special meaning. */ +struct curl_fileinfo { + char *filename; + curlfiletype filetype; + time_t time; + unsigned int perm; + int uid; + int gid; + curl_off_t size; + long int hardlinks; + + struct { + /* If some of these fields is not NULL, it is a pointer to b_data. */ + char *time; + char *perm; + char *user; + char *group; + char *target; /* pointer to the target filename of a symlink */ + } strings; + + unsigned int flags; + + /* used internally */ + char * b_data; + size_t b_size; + size_t b_used; +}; + +/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ +#define CURL_CHUNK_BGN_FUNC_OK 0 +#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ +#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ + +/* if splitting of data transfer is enabled, this callback is called before + download of an individual chunk started. Note that parameter "remains" works + only for FTP wildcard downloading (for now), otherwise is not used */ +typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, + void *ptr, + int remains); + +/* return codes for CURLOPT_CHUNK_END_FUNCTION */ +#define CURL_CHUNK_END_FUNC_OK 0 +#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ + +/* If splitting of data transfer is enabled this callback is called after + download of an individual chunk finished. + Note! After this callback was set then it have to be called FOR ALL chunks. + Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. + This is the reason why we don't need "transfer_info" parameter in this + callback and we are not interested in "remains" parameter too. */ +typedef long (*curl_chunk_end_callback)(void *ptr); + +/* return codes for FNMATCHFUNCTION */ +#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ +#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ +#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ + +/* callback type for wildcard downloading pattern matching. If the + string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, + const char *string); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +/* The return code from the sockopt_callback can signal information back + to libcurl: */ +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +typedef int +(*curl_closesocket_callback)(void *clientp, curl_socket_t item); + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for + 7.17.0, reused in April 2011 for 7.21.5] */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_FTP_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_OBSOLETE10, /* 10 - NOT USED */ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_OBSOLETE12, /* 12 - NOT USED */ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_OBSOLETE16, /* 16 - NOT USED */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS , /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ + CURLE_TELNET_OPTION_SYNTAX , /* 49 - Malformed telnet option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ + CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ + CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ + CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ + CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ + + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* compatibility with older names */ +#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING + +/* The following were added in 7.21.5, April 2011 */ +#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +#endif /*!CURL_NO_OLDIES*/ + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an + OpenSSL SSL_CTX */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +#define CURLAUTH_NONE 0 /* nothing */ +#define CURLAUTH_BASIC (1<<0) /* Basic (default) */ +#define CURLAUTH_DIGEST (1<<1) /* Digest */ +#define CURLAUTH_GSSNEGOTIATE (1<<2) /* GSS-Negotiate */ +#define CURLAUTH_NTLM (1<<3) /* NTLM */ +#define CURLAUTH_DIGEST_IE (1<<4) /* Digest with IE flavour */ +#define CURLAUTH_ONLY (1<<31) /* used together with a single other + type to force no auth or just that + single type */ +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) /* all fine types set */ +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURL_ERROR_SIZE 256 + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum type { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS + } keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_IMAP (1<<12) +#define CURLPROTO_IMAPS (1<<13) +#define CURLPROTO_POP3 (1<<14) +#define CURLPROTO_POP3S (1<<15) +#define CURLPROTO_SMTP (1<<16) +#define CURLPROTO_SMTPS (1<<17) +#define CURLPROTO_RTSP (1<<18) +#define CURLPROTO_RTMP (1<<19) +#define CURLPROTO_RTMPT (1<<20) +#define CURLPROTO_RTMPE (1<<21) +#define CURLPROTO_RTMPTE (1<<22) +#define CURLPROTO_RTMPS (1<<23) +#define CURLPROTO_RTMPTS (1<<24) +#define CURLPROTO_GOPHER (1<<25) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 + +/* name is uppercase CURLOPT_, + type is one of the defined CURLOPTTYPE_ + number is unique identifier */ +#ifdef CINIT +#undef CINIT +#endif + +#ifdef CURL_ISOCPP +#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLOPT_/**/name = type + number +#endif + +/* + * This macro-mania below setups the CURLOPT_[what] enum, to be used with + * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] + * word. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CINIT(FILE, OBJECTPOINT, 1), + + /* The full URL to get/put */ + CINIT(URL, OBJECTPOINT, 2), + + /* Port number to connect to, if other than default. */ + CINIT(PORT, LONG, 3), + + /* Name of proxy to use. */ + CINIT(PROXY, OBJECTPOINT, 4), + + /* "name:password" to use when fetching. */ + CINIT(USERPWD, OBJECTPOINT, 5), + + /* "name:password" to use with proxy. */ + CINIT(PROXYUSERPWD, OBJECTPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CINIT(RANGE, OBJECTPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CINIT(INFILE, OBJECTPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. If this is not used, error messages go to stderr instead: */ + CINIT(ERRORBUFFER, OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CINIT(TIMEOUT, LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CINIT(INFILESIZE, LONG, 14), + + /* POST static input fields. */ + CINIT(POSTFIELDS, OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CINIT(REFERER, OBJECTPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CINIT(FTPPORT, OBJECTPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CINIT(USERAGENT, OBJECTPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CINIT(LOW_SPEED_LIMIT, LONG, 19), + + /* Set the "low speed time" */ + CINIT(LOW_SPEED_TIME, LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CINIT(RESUME_FROM, LONG, 21), + + /* Set cookie in request: */ + CINIT(COOKIE, OBJECTPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind */ + CINIT(HTTPHEADER, OBJECTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CINIT(HTTPPOST, OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CINIT(SSLCERT, OBJECTPOINT, 25), + + /* password for the SSL or SSH private key */ + CINIT(KEYPASSWD, OBJECTPOINT, 26), + + /* send TYPE parameter? */ + CINIT(CRLF, LONG, 27), + + /* send linked-list of QUOTE commands */ + CINIT(QUOTE, OBJECTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CINIT(WRITEHEADER, OBJECTPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CINIT(COOKIEFILE, OBJECTPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CINIT(SSLVERSION, LONG, 32), + + /* What kind of HTTP time condition to use, see defines */ + CINIT(TIMECONDITION, LONG, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CINIT(TIMEVALUE, LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CINIT(CUSTOMREQUEST, OBJECTPOINT, 36), + + /* HTTP request, for odd commands like DELETE, TRACE and others */ + CINIT(STDERR, OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CINIT(POSTQUOTE, OBJECTPOINT, 39), + + /* Pass a pointer to string of the output using full variable-replacement + as described elsewhere. */ + CINIT(WRITEINFO, OBJECTPOINT, 40), + + CINIT(VERBOSE, LONG, 41), /* talk a lot */ + CINIT(HEADER, LONG, 42), /* throw the header out too */ + CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ + CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ + CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 300 */ + CINIT(UPLOAD, LONG, 46), /* this is an upload */ + CINIT(POST, LONG, 47), /* HTTP POST method */ + CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */ + + CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CINIT(NETRC, LONG, 51), + + CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ + + CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ + CINIT(PUT, LONG, 54), /* HTTP PUT */ + + /* 55 = OBSOLETE */ + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + + /* Data passed to the progress callback */ + CINIT(PROGRESSDATA, OBJECTPOINT, 57), + + /* We want the referrer field set automatically when following locations */ + CINIT(AUTOREFERER, LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CINIT(PROXYPORT, LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CINIT(POSTFIELDSIZE, LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CINIT(HTTPPROXYTUNNEL, LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CINIT(INTERFACE, OBJECTPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CINIT(KRBLEVEL, OBJECTPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CINIT(SSL_VERIFYPEER, LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAINFO, OBJECTPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CINIT(MAXREDIRS, LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CINIT(FILETIME, LONG, 69), + + /* This points to a linked list of telnet options */ + CINIT(TELNETOPTIONS, OBJECTPOINT, 70), + + /* Max amount of cached alive connections */ + CINIT(MAXCONNECTS, LONG, 71), + + /* 72 - DEPRECATED */ + CINIT(CLOSEPOLICY, LONG, 72), + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CINIT(FRESH_CONNECT, LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CINIT(FORBID_REUSE, LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CINIT(RANDOM_FILE, OBJECTPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CINIT(EGDSOCKET, OBJECTPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects + are OK within this time, then fine... This only aborts the connect + phase. [Only works on unix-style/SIGALRM operating systems] */ + CINIT(CONNECTTIMEOUT, LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CINIT(HTTPGET, LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CINIT(SSL_VERIFYHOST, LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CINIT(COOKIEJAR, OBJECTPOINT, 82), + + /* Specify which SSL ciphers to use */ + CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CINIT(HTTP_VERSION, LONG, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CINIT(FTP_USE_EPSV, LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CINIT(SSLCERTTYPE, OBJECTPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CINIT(SSLKEY, OBJECTPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CINIT(SSLKEYTYPE, OBJECTPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CINIT(SSLENGINE, OBJECTPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CINIT(SSLENGINE_DEFAULT, LONG, 90), + + /* Non-zero value means to use the global dns cache */ + CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* To become OBSOLETE soon */ + + /* DNS cache timeout */ + CINIT(DNS_CACHE_TIMEOUT, LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CINIT(PREQUOTE, OBJECTPOINT, 93), + + /* set the debug function */ + CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CINIT(DEBUGDATA, OBJECTPOINT, 95), + + /* mark this as start of a cookie session */ + CINIT(COOKIESESSION, LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAPATH, OBJECTPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CINIT(BUFFERSIZE, LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CINIT(NOSIGNAL, LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CINIT(SHARE, OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5. */ + CINIT(PROXYTYPE, LONG, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. Before 7.21.6, this was known as + CURLOPT_ENCODING */ + CINIT(ACCEPT_ENCODING, OBJECTPOINT, 102), + + /* Set pointer to private data */ + CINIT(PRIVATE, OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CINIT(HTTP200ALIASES, OBJECTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CINIT(UNRESTRICTED_AUTH, LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( + it also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CINIT(FTP_USE_EPRT, LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(HTTPAUTH, LONG, 107), + + /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx + in second argument. The function must be matching the + curl_ssl_ctx_callback proto. */ + CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(PROXYAUTH, LONG, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), +#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to resolve names to those IP versions only. This only has + affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CINIT(IPRESOLVE, LONG, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CINIT(MAXFILESIZE, LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CINIT(INFILESIZE_LARGE, OFF_T, 115), + + /* Sets the continuation offset. There is also a LONG version of this; + * look above for RESUME_FROM. + */ + CINIT(RESUME_FROM_LARGE, OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CINIT(MAXFILESIZE_LARGE, OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CINIT(NETRC_FILE, OBJECTPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLFTPSSL_TRY - try using SSL, proceed anyway otherwise + CURLFTPSSL_CONTROL - SSL for the control connection or fail + CURLFTPSSL_ALL - SSL for all communication or fail + */ + CINIT(USE_SSL, LONG, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CINIT(TCP_NODELAY, LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CINIT(FTPSSLAUTH, LONG, 129), + + CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), + CINIT(IOCTLDATA, OBJECTPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* zero terminated string for pass on to the FTP server when asked for + "account" info */ + CINIT(FTP_ACCOUNT, OBJECTPOINT, 134), + + /* feed cookies into cookie engine */ + CINIT(COOKIELIST, OBJECTPOINT, 135), + + /* ignore Content-Length */ + CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CINIT(FTP_SKIP_PASV_IP, LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CINIT(FTP_FILEMETHOD, LONG, 138), + + /* Local port number to bind the socket to */ + CINIT(LOCALPORT, LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CINIT(LOCALPORTRANGE, LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CINIT(CONNECT_ONLY, LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), + CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CINIT(FTP_ALTERNATIVE_TO_USER, OBJECTPOINT, 147), + + /* callback function for setting socket options */ + CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), + CINIT(SOCKOPTDATA, OBJECTPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CINIT(SSL_SESSIONID_CACHE, LONG, 150), + + /* allowed SSH authentication methods */ + CINIT(SSH_AUTH_TYPES, LONG, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CINIT(SSH_PUBLIC_KEYFILE, OBJECTPOINT, 152), + CINIT(SSH_PRIVATE_KEYFILE, OBJECTPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CINIT(FTP_SSL_CCC, LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CINIT(TIMEOUT_MS, LONG, 155), + CINIT(CONNECTTIMEOUT_MS, LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CINIT(HTTP_TRANSFER_DECODING, LONG, 157), + CINIT(HTTP_CONTENT_DECODING, LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CINIT(NEW_FILE_PERMS, LONG, 159), + CINIT(NEW_DIRECTORY_PERMS, LONG, 160), + + /* Set the behaviour of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CINIT(POSTREDIR, LONG, 161), + + /* used by scp/sftp to verify the host's public key */ + CINIT(SSH_HOST_PUBLIC_KEY_MD5, OBJECTPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), + CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), + + /* POST volatile input fields. */ + CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), + + /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ + CINIT(PROXY_TRANSFER_MODE, LONG, 166), + + /* Callback function for seeking in the input stream */ + CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), + CINIT(SEEKDATA, OBJECTPOINT, 168), + + /* CRL file */ + CINIT(CRLFILE, OBJECTPOINT, 169), + + /* Issuer certificate */ + CINIT(ISSUERCERT, OBJECTPOINT, 170), + + /* (IPv6) Address scope */ + CINIT(ADDRESS_SCOPE, LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. (Unfortunately) only + working with OpenSSL-powered builds. */ + CINIT(CERTINFO, LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CINIT(USERNAME, OBJECTPOINT, 173), + CINIT(PASSWORD, OBJECTPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CINIT(PROXYUSERNAME, OBJECTPOINT, 175), + CINIT(PROXYPASSWORD, OBJECTPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CINIT(NOPROXY, OBJECTPOINT, 177), + + /* block size for TFTP transfers */ + CINIT(TFTP_BLKSIZE, LONG, 178), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_SERVICE, OBJECTPOINT, 179), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CINIT(PROTOCOLS, LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. Defaults + to all protocols except FILE and SCP. */ + CINIT(REDIR_PROTOCOLS, LONG, 182), + + /* set the SSH knownhost file name to use */ + CINIT(SSH_KNOWNHOSTS, OBJECTPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CINIT(SSH_KEYDATA, OBJECTPOINT, 185), + + /* set the SMTP mail originator */ + CINIT(MAIL_FROM, OBJECTPOINT, 186), + + /* set the SMTP mail receiver(s) */ + CINIT(MAIL_RCPT, OBJECTPOINT, 187), + + /* FTP: send PRET before PASV */ + CINIT(FTP_USE_PRET, LONG, 188), + + /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ + CINIT(RTSP_REQUEST, LONG, 189), + + /* The RTSP session identifier */ + CINIT(RTSP_SESSION_ID, OBJECTPOINT, 190), + + /* The RTSP stream URI */ + CINIT(RTSP_STREAM_URI, OBJECTPOINT, 191), + + /* The Transport: header to use in RTSP requests */ + CINIT(RTSP_TRANSPORT, OBJECTPOINT, 192), + + /* Manually initialize the client RTSP CSeq for this handle */ + CINIT(RTSP_CLIENT_CSEQ, LONG, 193), + + /* Manually initialize the server RTSP CSeq for this handle */ + CINIT(RTSP_SERVER_CSEQ, LONG, 194), + + /* The stream to pass to INTERLEAVEFUNCTION. */ + CINIT(INTERLEAVEDATA, OBJECTPOINT, 195), + + /* Let the application define a custom write method for RTP data */ + CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196), + + /* Turn on wildcard matching */ + CINIT(WILDCARDMATCH, LONG, 197), + + /* Directory matching callback called before downloading of an + individual file (chunk) started */ + CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198), + + /* Directory matching callback called after the file (chunk) + was downloaded, or skipped */ + CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199), + + /* Change match (fnmatch-like) callback for wildcard matching */ + CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200), + + /* Let the application define custom chunk data pointer */ + CINIT(CHUNK_DATA, OBJECTPOINT, 201), + + /* FNMATCH_FUNCTION user pointer */ + CINIT(FNMATCH_DATA, OBJECTPOINT, 202), + + /* send linked-list of name:port:address sets */ + CINIT(RESOLVE, OBJECTPOINT, 203), + + /* Set a username for authenticated TLS */ + CINIT(TLSAUTH_USERNAME, OBJECTPOINT, 204), + + /* Set a password for authenticated TLS */ + CINIT(TLSAUTH_PASSWORD, OBJECTPOINT, 205), + + /* Set authentication type for authenticated TLS */ + CINIT(TLSAUTH_TYPE, OBJECTPOINT, 206), + + /* Set to 1 to enable the "TE:" header in HTTP requests to ask for + compressed transfer-encoded responses. Set to 0 to disable the use of TE: + in outgoing requests. The current default is 0, but it might change in a + future libcurl release. + + libcurl will ask for the compressed methods it knows of, and if that + isn't any, it will not ask for transfer-encoding at all even if this + option is set to 1. + + */ + CINIT(TRANSFER_ENCODING, LONG, 207), + + /* Callback function for closing socket (instead of close(2)). The callback + should have type curl_closesocket_callback */ + CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208), + CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* resolve to ipv4 addresses */ +#define CURL_IPRESOLVE_V6 2 /* resolve to ipv6 addresses */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_WRITEDATA CURLOPT_FILE +#define CURLOPT_READDATA CURLOPT_INFILE +#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER +#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + +/* + * Public API enums for RTSP requests + */ +enum { + CURL_RTSPREQ_NONE, /* first in list */ + CURL_RTSPREQ_OPTIONS, + CURL_RTSPREQ_DESCRIBE, + CURL_RTSPREQ_ANNOUNCE, + CURL_RTSPREQ_SETUP, + CURL_RTSPREQ_PLAY, + CURL_RTSPREQ_PAUSE, + CURL_RTSPREQ_TEARDOWN, + CURL_RTSPREQ_GET_PARAMETER, + CURL_RTSPREQ_SET_PARAMETER, + CURL_RTSPREQ_RECORD, + CURL_RTSPREQ_RECEIVE, + CURL_RTSPREQ_LAST /* last in list */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +enum CURL_TLSAUTH { + CURL_TLSAUTH_NONE, + CURL_TLSAUTH_SRP, + CURL_TLSAUTH_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301 and CURL_REDIR_POST_302 can be bitwise ORed so that + CURL_REDIR_POST_301 | CURL_REDIR_POST_302 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_ALL (CURL_REDIR_POST_301|CURL_REDIR_POST_302) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + libcurl, see lib/README.curlx for details */ +CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2); +CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n); + +/* name is uppercase CURLFORM_ */ +#ifdef CFINIT +#undef CFINIT +#endif + +#ifdef CURL_ISOCPP +#define CFINIT(name) CURLFORM_ ## name +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define CFINIT(name) CURLFORM_/**/name +#endif + +typedef enum { + CFINIT(NOTHING), /********* the first one is unused ************/ + + /* */ + CFINIT(COPYNAME), + CFINIT(PTRNAME), + CFINIT(NAMELENGTH), + CFINIT(COPYCONTENTS), + CFINIT(PTRCONTENTS), + CFINIT(CONTENTSLENGTH), + CFINIT(FILECONTENT), + CFINIT(ARRAY), + CFINIT(OBSOLETE), + CFINIT(FILE), + + CFINIT(BUFFER), + CFINIT(BUFFERPTR), + CFINIT(BUFFERLENGTH), + + CFINIT(CONTENTTYPE), + CFINIT(CONTENTHEADER), + CFINIT(FILENAME), + CFINIT(END), + CFINIT(OBSOLETE2), + + CFINIT(STREAM), + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +#undef CFINIT /* done */ + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, + size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines with be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL builds. Asked + for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_SLIST + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, + CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, + CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, + CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, + CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, + CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, + CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + /* Fill in new entries below here! */ + + CURLINFO_LASTONE = 42 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + +typedef void CURLSH; + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* out of memory */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_FOURTH + +typedef struct { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + +} curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* kerberos auth is supported */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth support */ +#define CURL_VERSION_DEBUG (1<<6) /* built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* asynchronous dns resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth */ +#define CURL_VERSION_LARGEFILE (1<<9) /* supports files bigger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* International Domain Names support */ +#define CURL_VERSION_SSPI (1<<11) /* SSPI is supported */ +#define CURL_VERSION_CONV (1<<12) /* character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* debug memory tracking supported */ +#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ + +/* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* __CURL_CURL_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.cmake.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.cmake.svn-base new file mode 100644 index 00000000..3aa772fc --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.cmake.svn-base @@ -0,0 +1,180 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_TYPES_H ${CURL_PULL_SYS_TYPES_H} +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#cmakedefine CURL_PULL_STDINT_H ${CURL_PULL_STDINT_H} +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#cmakedefine CURL_PULL_INTTYPES_H ${CURL_PULL_INTTYPES_H} +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#cmakedefine CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} + +/* Integral data type used for curl_socklen_t. */ +#cmakedefine CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} + +/* on windows socklen_t is in here */ +#ifdef _WIN32 +# include +# include +#endif + +#ifdef HAVE_SYS_SOCKET_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#cmakedefine CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} + +/* Signed integral data type used for curl_off_t. */ +#cmakedefine CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T} + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#cmakedefine CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#cmakedefine CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#cmakedefine CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" + +/* The size of `curl_off_t', as computed by sizeof. */ +#cmakedefine CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} + +/* curl_off_t constant suffix. */ +#cmakedefine CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} + +/* unsigned curl_off_t constant suffix. */ +#cmakedefine CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} + +#endif /* __CURL_CURLBUILD_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.in.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.in.svn-base new file mode 100644 index 00000000..fe348f40 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.in.svn-base @@ -0,0 +1,190 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +#undef CURL_PULL_WS2TCPIP_H +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#undef CURL_PULL_SYS_TYPES_H +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#undef CURL_PULL_STDINT_H +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#undef CURL_PULL_INTTYPES_H +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#undef CURL_PULL_SYS_SOCKET_H +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#undef CURL_SIZEOF_LONG + +/* Integral data type used for curl_socklen_t. */ +#undef CURL_TYPEOF_CURL_SOCKLEN_T + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_SOCKLEN_T + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#undef CURL_TYPEOF_CURL_OFF_T + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_T + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_TU + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#undef CURL_FORMAT_OFF_T + +/* The size of `curl_off_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_OFF_T + +/* curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_T + +/* unsigned curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_TU + +#endif /* __CURL_CURLBUILD_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.svn-base new file mode 100644 index 00000000..d0b32acb --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlbuild.h.svn-base @@ -0,0 +1,583 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * See file include/curl/curlbuild.h.in, run configure, and forget + * that this file exists it is only used for non-configure systems. + * But you can keep reading if you want ;-) + * + */ + +/* ================================================================ */ +/* NOTES FOR NON-CONFIGURE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * Try to keep one section per platform, compiler and architecture, + * otherwise, if an existing section is reused for a different one and + * later on the original is adjusted, probably the piggybacking one can + * be adversely changed. + * + * In order to differentiate between platforms/compilers/architectures + * use only compiler built in predefined preprocessor symbols. + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a + * 64-bit wide signed integral data type. The width of this data type + * must remain constant and independent of any possible large file + * support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a + * 32-bit wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This + * rule shall only be violated if off_t is the only 64-bit data type + * available and the size of off_t is independent of large file support + * settings. Keep your build on the safe side avoiding an off_t gating. + * If you have a 64-bit off_t then take for sure that another 64-bit + * data type exists, dig deeper and you will find it. + * + * NOTE 3: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.dist or + * at file include/curl/curlbuild.h, this is due to the following reason: + * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h + * when the libcurl source code distribution archive file is created. + * + * File include/curl/curlbuild.h.dist is not included in the distribution + * archive. File include/curl/curlbuild.h is not present in the git tree. + * + * The distributed include/curl/curlbuild.h file is only intended to be used + * on systems which can not run the also distributed configure script. + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + * If you check out from git on a non-configure platform, you must run the + * appropriate buildconf* script to set up curlbuild.h and other local files. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ +/* ================================================================ */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SALFORDC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__TURBOC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__LCC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MWERKS__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(_WIN32_WCE) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MINGW32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) +# if defined(__i386__) || defined(__ppc__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__x86_64__) || defined(__ppc64__) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +# error "Unknown non-configure build target!" + Error Compilation_aborted_Unknown_non_configure_build_target +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +#endif /* __CURL_CURLBUILD_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/curlrules.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlrules.h.svn-base new file mode 100644 index 00000000..cbc12fdd --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlrules.h.svn-base @@ -0,0 +1,261 @@ +#ifndef __CURL_CURLRULES_H +#define __CURL_CURLRULES_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* COMPILE TIME SANITY CHECKS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * All checks done in this file are intentionally placed in a public + * header file which is pulled by curl/curl.h when an application is + * being built using an already built libcurl library. Additionally + * this file is also included and used when building the library. + * + * If compilation fails on this file it is certainly sure that the + * problem is elsewhere. It could be a problem in the curlbuild.h + * header file, or simply that you are using different compilation + * settings than those used to build the library. + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * Do not deactivate any check, these are done to make sure that the + * library is properly built and used. + * + * You can find further help on the libcurl development mailing list: + * http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * NOTE 2 + * ------ + * + * Some of the following compile time checks are based on the fact + * that the dimension of a constant array can not be a negative one. + * In this way if the compile time verification fails, the compilation + * will fail issuing an error. The error description wording is compiler + * dependent but it will be quite similar to one of the following: + * + * "negative subscript or subscript is too large" + * "array must have at least one element" + * "-1 is an illegal array size" + * "size of array is negative" + * + * If you are building an application which tries to use an already + * built libcurl library and you are getting this kind of errors on + * this file, it is a clear indication that there is a mismatch between + * how the library was built and how you are trying to use it for your + * application. Your already compiled or binary library provider is the + * only one who can give you the details you need to properly use it. + */ + +/* + * Verify that some macros are actually defined. + */ + +#ifndef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing +#endif + +#ifndef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing +#endif + +/* + * Macros private to this header file. + */ + +#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 + +#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 + +/* + * Verify that the size previously defined and expected for long + * is the same as the one reported by sizeof() at compile time. + */ + +typedef char + __curl_rule_01__ + [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; + +/* + * Verify that the size previously defined and expected for + * curl_off_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_02__ + [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; + +/* + * Verify at compile time that the size of curl_off_t as reported + * by sizeof() is greater or equal than the one reported for long + * for the current compilation. + */ + +typedef char + __curl_rule_03__ + [CurlchkszGE(curl_off_t, long)]; + +/* + * Verify that the size previously defined and expected for + * curl_socklen_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_04__ + [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; + +/* + * Verify at compile time that the size of curl_socklen_t as reported + * by sizeof() is greater or equal than the one reported for int for + * the current compilation. + */ + +typedef char + __curl_rule_05__ + [CurlchkszGE(curl_socklen_t, int)]; + +/* ================================================================ */ +/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ +/* ================================================================ */ + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) +# define __CURL_OFF_T_C_HLPR2(x) x +# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) +#else +# ifdef CURL_ISOCPP +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix +# else +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix +# endif +# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) +#endif + +/* + * Get rid of macros private to this header file. + */ + +#undef CurlchkszEQ +#undef CurlchkszGE + +/* + * Get rid of macros not intended to exist beyond this point. + */ + +#undef CURL_PULL_WS2TCPIP_H +#undef CURL_PULL_SYS_TYPES_H +#undef CURL_PULL_SYS_SOCKET_H +#undef CURL_PULL_STDINT_H +#undef CURL_PULL_INTTYPES_H + +#undef CURL_TYPEOF_CURL_SOCKLEN_T +#undef CURL_TYPEOF_CURL_OFF_T + +#ifdef CURL_NO_OLDIES +#undef CURL_FORMAT_OFF_T /* not required since 7.19.0 - obsoleted in 7.20.0 */ +#endif + +#endif /* __CURL_CURLRULES_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/curlver.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlver.h.svn-base new file mode 100644 index 00000000..bb90c8c0 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/curlver.h.svn-base @@ -0,0 +1,69 @@ +#ifndef __CURL_CURLVER_H +#define __CURL_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2011 Daniel Stenberg, ." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.21.7" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 21 +#define LIBCURL_VERSION_PATCH 7 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparions by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. +*/ +#define LIBCURL_VERSION_NUM 0x071507 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in git, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date should follow this template: + * + * "Mon Feb 12 11:35:33 UTC 2007" + */ +#define LIBCURL_TIMESTAMP "Thu Jun 23 08:25:34 UTC 2011" + +#endif /* __CURL_CURLVER_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/easy.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/easy.h.svn-base new file mode 100644 index 00000000..c1e3e760 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/easy.h.svn-base @@ -0,0 +1,102 @@ +#ifndef __CURL_EASY_H +#define __CURL_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistent connections cannot + * be transferred. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL* curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/mprintf.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/mprintf.h.svn-base new file mode 100644 index 00000000..de7dd2f3 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/mprintf.h.svn-base @@ -0,0 +1,81 @@ +#ifndef __CURL_MPRINTF_H +#define __CURL_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include +#include /* needed for FILE */ + +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef _MPRINTF_REPLACE +# undef printf +# undef fprintf +# undef sprintf +# undef vsprintf +# undef snprintf +# undef vprintf +# undef vfprintf +# undef vsnprintf +# undef aprintf +# undef vaprintf +# define printf curl_mprintf +# define fprintf curl_mfprintf +#ifdef CURLDEBUG +/* When built with CURLDEBUG we define away the sprintf() functions since we + don't want internal code to be using them */ +# define sprintf sprintf_was_used +# define vsprintf vsprintf_was_used +#else +# define sprintf curl_msprintf +# define vsprintf curl_mvsprintf +#endif +# define snprintf curl_msnprintf +# define vprintf curl_mvprintf +# define vfprintf curl_mvfprintf +# define vsnprintf curl_mvsnprintf +# define aprintf curl_maprintf +# define vaprintf curl_mvaprintf +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __CURL_MPRINTF_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/multi.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/multi.h.svn-base new file mode 100644 index 00000000..f9656666 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/multi.h.svn-base @@ -0,0 +1,345 @@ +#ifndef __CURL_MULTI_H +#define __CURL_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2007, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void CURLM; + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on invidual transfers even when this + * returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic informations. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a zero-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +#undef CINIT /* re-using the same name as in curl.h */ + +#ifdef CURL_ISOCPP +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLMOPT_/**/name = type + number +#endif + +typedef enum { + /* This is the socket callback function pointer */ + CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CINIT(SOCKETDATA, OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CINIT(PIPELINING, LONG, 3), + + /* This is the timer callback function pointer */ + CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CINIT(TIMERDATA, OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CINIT(MAXCONNECTS, LONG, 6), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/stdcheaders.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/stdcheaders.h.svn-base new file mode 100644 index 00000000..ad82ef63 --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/stdcheaders.h.svn-base @@ -0,0 +1,33 @@ +#ifndef __STDC_HEADERS_H +#define __STDC_HEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include + +size_t fread (void *, size_t, size_t, FILE *); +size_t fwrite (const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif /* __STDC_HEADERS_H */ diff --git a/backends/twitter/libtwitcurl/curl/.svn/text-base/typecheck-gcc.h.svn-base b/backends/twitter/libtwitcurl/curl/.svn/text-base/typecheck-gcc.h.svn-base new file mode 100644 index 00000000..f043a18e --- /dev/null +++ b/backends/twitter/libtwitcurl/curl/.svn/text-base/typecheck-gcc.h.svn-base @@ -0,0 +1,590 @@ +#ifndef __CURL_TYPECHECK_GCC_H +#define __CURL_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(_curl_is_sometype_option(_curl_opt)) + * if(!_curl_is_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define _curl_is_sometype_option, _curl_is_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ +__extension__ ({ \ + __typeof__ (option) _curl_opt = option; \ + if(__builtin_constant_p(_curl_opt)) { \ + if(_curl_is_long_option(_curl_opt)) \ + if(!_curl_is_long(value)) \ + _curl_easy_setopt_err_long(); \ + if(_curl_is_off_t_option(_curl_opt)) \ + if(!_curl_is_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if(_curl_is_string_option(_curl_opt)) \ + if(!_curl_is_string(value)) \ + _curl_easy_setopt_err_string(); \ + if(_curl_is_write_cb_option(_curl_opt)) \ + if(!_curl_is_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if((_curl_opt) == CURLOPT_READFUNCTION) \ + if(!_curl_is_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ + if(!_curl_is_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ + if(!_curl_is_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ + if(!_curl_is_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ + if(!_curl_is_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ + if(!_curl_is_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ + if(!_curl_is_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if(_curl_is_conv_cb_option(_curl_opt)) \ + if(!_curl_is_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ + if(!_curl_is_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if(_curl_is_cb_data_option(_curl_opt)) \ + if(!_curl_is_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if((_curl_opt) == CURLOPT_ERRORBUFFER) \ + if(!_curl_is_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if((_curl_opt) == CURLOPT_STDERR) \ + if(!_curl_is_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if(_curl_is_postfields_option(_curl_opt)) \ + if(!_curl_is_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if((_curl_opt) == CURLOPT_HTTPPOST) \ + if(!_curl_is_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if(_curl_is_slist_option(_curl_opt)) \ + if(!_curl_is_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if((_curl_opt) == CURLOPT_SHARE) \ + if(!_curl_is_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ +}) + +/* wraps curl_easy_getinfo() with typechecking */ +/* FIXME: don't allow const pointers */ +#define curl_easy_getinfo(handle, info, arg) \ +__extension__ ({ \ + __typeof__ (info) _curl_info = info; \ + if(__builtin_constant_p(_curl_info)) { \ + if(_curl_is_string_info(_curl_info)) \ + if(!_curl_is_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if(_curl_is_long_info(_curl_info)) \ + if(!_curl_is_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if(_curl_is_double_info(_curl_info)) \ + if(!_curl_is_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if(_curl_is_slist_info(_curl_info)) \ + if(!_curl_is_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ +}) + +/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), + * for now just make sure that the functions are called with three + * arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define _CURL_WARNING(id, message) \ + static void __attribute__((warning(message))) __attribute__((unused)) \ + __attribute__((noinline)) id(void) { __asm__(""); } + +_CURL_WARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a " + "string (char* or char[]) argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a " + "curl_opensocket_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a " + "private data pointer as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a " + "char buffer of CURL_ERROR_SIZE as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a FILE* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a void* or char* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a struct curl_httppost* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a struct curl_slist* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +_CURL_WARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to char * for this info") +_CURL_WARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +_CURL_WARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to struct curl_slist * for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define _curl_is_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define _curl_is_off_t_option(option) \ + ((option) > CURLOPTTYPE_OFF_T) + +/* evaluates to true if option takes a char* argument */ +#define _curl_is_string_option(option) \ + ((option) == CURLOPT_URL || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_ACCEPT_ENCODING || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define _curl_is_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define _curl_is_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define _curl_is_cb_data_option(option) \ + ((option) == CURLOPT_WRITEDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_WRITEHEADER || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_PRIVATE || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define _curl_is_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define _curl_is_slist_option(option) \ + ((option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + (option) == CURLOPT_MAIL_RCPT || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define _curl_is_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) + +/* evaluates to true if info expects a pointer to long argument */ +#define _curl_is_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define _curl_is_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define _curl_is_slist_info(info) \ + (CURLINFO_SLIST < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true iff expr is a pointer */ +#define _curl_is_any_ptr(expr) \ + (sizeof(expr) == sizeof(void*)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define _curl_is_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define _curl_is_ptr(expr, type) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define _curl_is_arr(expr, type) \ + (_curl_is_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define _curl_is_string(expr) \ + (_curl_is_arr((expr), char) || \ + _curl_is_arr((expr), signed char) || \ + _curl_is_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define _curl_is_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define _curl_is_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define _curl_is_error_buffer(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define _curl_is_cb_data(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_ptr((expr), FILE)) +#else /* be less strict */ +#define _curl_is_cb_data(expr) \ + _curl_is_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define _curl_is_FILE(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *)) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define _curl_is_postfields(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_arr((expr), char)) + +/* FIXME: the whole callback checking is messy... + * The idea is to tolerate char vs. void and const vs. not const + * pointers in arguments at least + */ +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define _curl_callback_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func), type*)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define _curl_is_read_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \ + _curl_callback_compatible((expr), _curl_read_callback1) || \ + _curl_callback_compatible((expr), _curl_read_callback2) || \ + _curl_callback_compatible((expr), _curl_read_callback3) || \ + _curl_callback_compatible((expr), _curl_read_callback4) || \ + _curl_callback_compatible((expr), _curl_read_callback5) || \ + _curl_callback_compatible((expr), _curl_read_callback6)) +typedef size_t (_curl_read_callback1)(char *, size_t, size_t, void*); +typedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void*); +typedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE*); +typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void*); +typedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void*); +typedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE*); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define _curl_is_write_cb(expr) \ + (_curl_is_read_cb(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \ + _curl_callback_compatible((expr), _curl_write_callback1) || \ + _curl_callback_compatible((expr), _curl_write_callback2) || \ + _curl_callback_compatible((expr), _curl_write_callback3) || \ + _curl_callback_compatible((expr), _curl_write_callback4) || \ + _curl_callback_compatible((expr), _curl_write_callback5) || \ + _curl_callback_compatible((expr), _curl_write_callback6)) +typedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void*); +typedef size_t (_curl_write_callback2)(const char *, size_t, size_t, + const void*); +typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE*); +typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void*); +typedef size_t (_curl_write_callback5)(const void *, size_t, size_t, + const void*); +typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE*); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define _curl_is_ioctl_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void*); +typedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void*); +typedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void*); +typedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void*); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define _curl_is_sockopt_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback2)) +typedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or + "similar" */ +#define _curl_is_opensocket_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\ + _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define _curl_is_progress_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \ + _curl_callback_compatible((expr), _curl_progress_callback1) || \ + _curl_callback_compatible((expr), _curl_progress_callback2)) +typedef int (_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define _curl_is_debug_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \ + _curl_callback_compatible((expr), _curl_debug_callback1) || \ + _curl_callback_compatible((expr), _curl_debug_callback2) || \ + _curl_callback_compatible((expr), _curl_debug_callback3) || \ + _curl_callback_compatible((expr), _curl_debug_callback4)) +typedef int (_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define _curl_is_ssl_ctx_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); +typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, + const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define _curl_is_conv_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \ + _curl_callback_compatible((expr), _curl_conv_callback1) || \ + _curl_callback_compatible((expr), _curl_conv_callback2) || \ + _curl_callback_compatible((expr), _curl_conv_callback3) || \ + _curl_callback_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define _curl_is_seek_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \ + _curl_callback_compatible((expr), _curl_seek_callback1) || \ + _curl_callback_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* __CURL_TYPECHECK_GCC_H */ diff --git a/backends/twitter/libtwitcurl/lib/.svn/all-wcprops b/backends/twitter/libtwitcurl/lib/.svn/all-wcprops new file mode 100644 index 00000000..460cafcd --- /dev/null +++ b/backends/twitter/libtwitcurl/lib/.svn/all-wcprops @@ -0,0 +1,11 @@ +K 25 +svn:wc:ra_dav:version-url +V 38 +/svn/!svn/ver/55/trunk/libtwitcurl/lib +END +libcurl.lib +K 25 +svn:wc:ra_dav:version-url +V 50 +/svn/!svn/ver/55/trunk/libtwitcurl/lib/libcurl.lib +END diff --git a/backends/twitter/libtwitcurl/lib/.svn/entries b/backends/twitter/libtwitcurl/lib/.svn/entries new file mode 100644 index 00000000..7b00f309 --- /dev/null +++ b/backends/twitter/libtwitcurl/lib/.svn/entries @@ -0,0 +1,62 @@ +10 + +dir +89 +http://twitcurl.googlecode.com/svn/trunk/libtwitcurl/lib +http://twitcurl.googlecode.com/svn + + + +2011-09-12T19:28:25.614324Z +55 +swatkat.thinkdigit@gmail.com + + + + + + + + + + + + + + +4714a580-958b-11de-ad41-3fcdc5e0e42d + +libcurl.lib +file + + + + +2012-08-04T17:27:28.470970Z +bf5f17f57618ef87a64883b9028014c8 +2011-09-12T19:28:25.614324Z +55 +swatkat.thinkdigit@gmail.com +has-props + + + + + + + + + + + + + + + + + + + + +790868 + diff --git a/backends/twitter/libtwitcurl/lib/.svn/prop-base/libcurl.lib.svn-base b/backends/twitter/libtwitcurl/lib/.svn/prop-base/libcurl.lib.svn-base new file mode 100644 index 00000000..5e9587e6 --- /dev/null +++ b/backends/twitter/libtwitcurl/lib/.svn/prop-base/libcurl.lib.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/backends/twitter/libtwitcurl/lib/.svn/text-base/libcurl.lib.svn-base b/backends/twitter/libtwitcurl/lib/.svn/text-base/libcurl.lib.svn-base new file mode 100644 index 0000000000000000000000000000000000000000..2db6b971bf03216a6d72051554f74b2775d7bd77 GIT binary patch literal 790868 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 B4y44f9*<9cJvo(=io| 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�!M$>f{JsplM@RAdU)>{jcWmzZFX)js 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 Eec6n23M

it{S+ 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%0D%Mo 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 z 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 MJx;x9h{Nyy0ciZ0E&u=k literal 0 HcmV?d00001 diff --git a/backends/twitter/libtwitcurl/oauthlib.cpp b/backends/twitter/libtwitcurl/oauthlib.cpp index 2a10eea9..d3403d42 100644 --- a/backends/twitter/libtwitcurl/oauthlib.cpp +++ b/backends/twitter/libtwitcurl/oauthlib.cpp @@ -31,6 +31,31 @@ oAuth::~oAuth() { } +/*++ +* @method: oAuth::clone +* +* @description: creates a clone of oAuth object +* +* @input: none +* +* @output: cloned oAuth object +* +*--*/ +oAuth oAuth::clone() +{ + oAuth cloneObj; + cloneObj.m_consumerKey = m_consumerKey; + cloneObj.m_consumerSecret = m_consumerSecret; + cloneObj.m_oAuthTokenKey = m_oAuthTokenKey; + cloneObj.m_oAuthTokenSecret = m_oAuthTokenSecret; + cloneObj.m_oAuthPin = m_oAuthPin; + cloneObj.m_nonce = m_nonce; + cloneObj.m_timeStamp = m_timeStamp; + cloneObj.m_oAuthScreenName = m_oAuthScreenName; + return cloneObj; +} + + /*++ * @method: oAuth::getConsumerKey * @@ -238,6 +263,72 @@ void oAuth::generateNonceTimeStamp() m_timeStamp.assign( szTime ); } +/*++ +* @method: oAuth::buildOAuthRawDataKeyValPairs +* +* @description: this method prepares key-value pairs from the data part of the URL +* or from the URL post fields data, as required by OAuth header +* and signature generation. +* +* @input: rawData - Raw data either from the URL itself or from post fields. +* Should already be url encoded. +* urlencodeData - If true, string will be urlencoded before converting +* to key value pairs. +* +* @output: rawDataKeyValuePairs - Map in which key-value pairs are populated +* +* @remarks: internal method +* +*--*/ +void oAuth::buildOAuthRawDataKeyValPairs( const std::string& rawData, + bool urlencodeData, + oAuthKeyValuePairs& rawDataKeyValuePairs ) +{ + /* Raw data if it's present. Data should already be urlencoded once */ + if( rawData.length() ) + { + size_t nSep = std::string::npos; + size_t nPos = std::string::npos; + std::string dataKeyVal; + std::string dataKey; + std::string dataVal; + + /* This raw data part can contain many key value pairs: key1=value1&key2=value2&key3=value3 */ + std::string dataPart = rawData; + while( std::string::npos != ( nSep = dataPart.find_first_of("&") ) ) + { + /* Extract first key=value pair */ + dataKeyVal = dataPart.substr( 0, nSep ); + + /* Split them */ + nPos = dataKeyVal.find_first_of( "=" ); + if( std::string::npos != nPos ) + { + dataKey = dataKeyVal.substr( 0, nPos ); + dataVal = dataKeyVal.substr( nPos + 1 ); + + /* Put this key=value pair in map */ + rawDataKeyValuePairs[dataKey] = urlencodeData ? urlencode( dataVal ) : dataVal; + } + dataPart = dataPart.substr( nSep + 1 ); + } + + /* For the last key=value */ + dataKeyVal = dataPart.substr( 0, nSep ); + + /* Split them */ + nPos = dataKeyVal.find_first_of( "=" ); + if( std::string::npos != nPos ) + { + dataKey = dataKeyVal.substr( 0, nPos ); + dataVal = dataKeyVal.substr( nPos + 1 ); + + /* Put this key=value pair in map */ + rawDataKeyValuePairs[dataKey] = urlencodeData ? urlencode( dataVal ) : dataVal; + } + } +} + /*++ * @method: oAuth::buildOAuthTokenKeyValuePairs * @@ -247,7 +338,6 @@ void oAuth::generateNonceTimeStamp() * @input: includeOAuthVerifierPin - flag to indicate whether oauth_verifer key-value * pair needs to be included. oauth_verifer is only * used during exchanging request token with access token. -* rawData - url encoded data. this is used during signature generation. * oauthSignature - base64 and url encoded OAuth signature. * generateTimestamp - If true, then generate new timestamp for nonce. * @@ -257,7 +347,6 @@ void oAuth::generateNonceTimeStamp() * *--*/ bool oAuth::buildOAuthTokenKeyValuePairs( const bool includeOAuthVerifierPin, - const std::string& rawData, const std::string& oauthSignature, oAuthKeyValuePairs& keyValueMap, const bool generateTimestamp ) @@ -301,21 +390,6 @@ bool oAuth::buildOAuthTokenKeyValuePairs( const bool includeOAuthVerifierPin, /* Version */ keyValueMap[oAuthLibDefaults::OAUTHLIB_VERSION_KEY] = std::string( "1.0" ); - /* Data if it's present */ - if( rawData.length() ) - { - /* Data should already be urlencoded once */ - std::string dummyStrKey; - std::string dummyStrValue; - size_t nPos = rawData.find_first_of( "=" ); - if( std::string::npos != nPos ) - { - dummyStrKey = rawData.substr( 0, nPos ); - dummyStrValue = rawData.substr( nPos + 1 ); - keyValueMap[dummyStrKey] = dummyStrValue; - } - } - return ( keyValueMap.size() ) ? true : false; } @@ -417,7 +491,7 @@ bool oAuth::getSignature( const eOAuthHttpRequestType eType, * * @input: eType - HTTP request type * rawUrl - raw url of the HTTP request -* rawData - HTTP data +* rawData - HTTP data (post fields) * includeOAuthVerifierPin - flag to indicate whether or not oauth_verifier needs to included * in OAuth header * @@ -450,53 +524,24 @@ bool oAuth::getOAuthHeader( const eOAuthHttpRequestType eType, /* Get only key=value data part */ std::string dataPart = rawUrl.substr( nPos + 1 ); - /* This dataPart can contain many key value pairs: key1=value1&key2=value2&key3=value3 */ - size_t nSep = std::string::npos; - size_t nPos2 = std::string::npos; - std::string dataKeyVal; - std::string dataKey; - std::string dataVal; - while( std::string::npos != ( nSep = dataPart.find_first_of("&") ) ) - { - /* Extract first key=value pair */ - dataKeyVal = dataPart.substr( 0, nSep ); - - /* Split them */ - nPos2 = dataKeyVal.find_first_of( "=" ); - if( std::string::npos != nPos2 ) - { - dataKey = dataKeyVal.substr( 0, nPos2 ); - dataVal = dataKeyVal.substr( nPos2 + 1 ); - - /* Put this key=value pair in map */ - rawKeyValuePairs[dataKey] = urlencode( dataVal ); - } - dataPart = dataPart.substr( nSep + 1 ); - } - - /* For the last key=value */ - dataKeyVal = dataPart.substr( 0, nSep ); - - /* Split them */ - nPos2 = dataKeyVal.find_first_of( "=" ); - if( std::string::npos != nPos2 ) - { - dataKey = dataKeyVal.substr( 0, nPos2 ); - dataVal = dataKeyVal.substr( nPos2 + 1 ); - - /* Put this key=value pair in map */ - rawKeyValuePairs[dataKey] = urlencode( dataVal ); - } + /* Split the data in URL as key=value pairs */ + buildOAuthRawDataKeyValPairs( dataPart, true, rawKeyValuePairs ); } + /* Split the raw data if it's present, as key=value pairs. Data should already be urlencoded once */ + buildOAuthRawDataKeyValPairs( rawData, false, rawKeyValuePairs ); + /* Build key-value pairs needed for OAuth request token, without signature */ - buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin, rawData, std::string( "" ), rawKeyValuePairs, true ); + buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin, std::string( "" ), rawKeyValuePairs, true ); /* Get url encoded base64 signature using request type, url and parameters */ getSignature( eType, pureUrl, rawKeyValuePairs, oauthSignature ); + /* Clear map so that the parameters themselves are not sent along with the OAuth values */ + rawKeyValuePairs.clear(); + /* Now, again build key-value pairs with signature this time */ - buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin, std::string( "" ), oauthSignature, rawKeyValuePairs, false ); + buildOAuthTokenKeyValuePairs( includeOAuthVerifierPin, oauthSignature, rawKeyValuePairs, false ); /* Get OAuth header in string format */ paramsSeperator = ","; diff --git a/backends/twitter/libtwitcurl/oauthlib.h b/backends/twitter/libtwitcurl/oauthlib.h index 880a7b88..5f702e01 100644 --- a/backends/twitter/libtwitcurl/oauthlib.h +++ b/backends/twitter/libtwitcurl/oauthlib.h @@ -41,9 +41,9 @@ namespace oAuthLibDefaults namespace oAuthTwitterApiUrls { /* Twitter OAuth API URLs */ - const std::string OAUTHLIB_TWITTER_REQUEST_TOKEN_URL = "http://twitter.com/oauth/request_token"; - const std::string OAUTHLIB_TWITTER_AUTHORIZE_URL = "http://twitter.com/oauth/authorize?oauth_token="; - const std::string OAUTHLIB_TWITTER_ACCESS_TOKEN_URL = "http://twitter.com/oauth/access_token"; + const std::string OAUTHLIB_TWITTER_REQUEST_TOKEN_URL = "twitter.com/oauth/request_token"; + const std::string OAUTHLIB_TWITTER_AUTHORIZE_URL = "twitter.com/oauth/authorize?oauth_token="; + const std::string OAUTHLIB_TWITTER_ACCESS_TOKEN_URL = "twitter.com/oauth/access_token"; }; typedef enum _eOAuthHttpRequestType @@ -90,19 +90,7 @@ public: bool extractOAuthTokenKeySecret( const std::string& requestTokenResponse /* in */ ); - oAuth clone() - { - oAuth cloneObj; - cloneObj.m_consumerKey = m_consumerKey; - cloneObj.m_consumerSecret = m_consumerSecret; - cloneObj.m_oAuthTokenKey = m_oAuthTokenKey; - cloneObj.m_oAuthTokenSecret = m_oAuthTokenSecret; - cloneObj.m_oAuthPin = m_oAuthPin; - cloneObj.m_nonce = m_nonce; - cloneObj.m_timeStamp = m_timeStamp; - cloneObj.m_oAuthScreenName = m_oAuthScreenName; - return cloneObj; - } + oAuth clone(); private: @@ -117,8 +105,11 @@ private: std::string m_oAuthScreenName; /* OAuth twitter related utility methods */ + void buildOAuthRawDataKeyValPairs( const std::string& rawData, /* in */ + bool urlencodeData, /* in */ + oAuthKeyValuePairs& rawDataKeyValuePairs /* out */ ); + bool buildOAuthTokenKeyValuePairs( const bool includeOAuthVerifierPin, /* in */ - const std::string& rawData, /* in */ const std::string& oauthSignature, /* in */ oAuthKeyValuePairs& keyValueMap /* out */, const bool generateTimestamp /* in */ ); diff --git a/backends/twitter/libtwitcurl/twitcurl.cpp b/backends/twitter/libtwitcurl/twitcurl.cpp index 2ffebcac..cc24e138 100644 --- a/backends/twitter/libtwitcurl/twitcurl.cpp +++ b/backends/twitter/libtwitcurl/twitcurl.cpp @@ -17,7 +17,8 @@ m_curlHandle( NULL ), m_curlProxyParamsSet( false ), m_curlLoginParamsSet( false ), m_curlCallbackParamsSet( false ), -m_eApiFormatType( twitCurlTypes::eTwitCurlApiFormatXml ) +m_eApiFormatType( twitCurlTypes::eTwitCurlApiFormatXml ), +m_eProtocolType( twitCurlTypes::eTwitCurlProtocolHttp ) { /* Clear callback buffers */ clearCurlCallbackBuffers(); @@ -51,14 +52,19 @@ twitCurl::~twitCurl() } } +/*++ +* @method: twitCurl::clone +* +* @description: creates a clone of twitcurl object +* +* @input: none +* +* @output: cloned object +* +*--*/ twitCurl* twitCurl::clone() { twitCurl *cloneObj = new twitCurl(); - - /* cURL flags */ - //cloneObj->m_curlProxyParamsSet = false; - //cloneObj->m_curlLoginParamsSet = m_curlLoginParamsSet; - //cloneObj->m_curlCallbackParamsSet = m_curlCallbackParamsSet; /* cURL proxy data */ cloneObj->setProxyServerIp(m_proxyServerIp); @@ -66,7 +72,6 @@ twitCurl* twitCurl::clone() cloneObj->setProxyUserName(m_proxyUserName); cloneObj->setProxyPassword(m_proxyPassword); - /* Twitter data */ cloneObj->setTwitterUsername(m_twitterUsername); cloneObj->setTwitterPassword(m_twitterPassword); @@ -96,6 +101,22 @@ void twitCurl::setTwitterApiType( twitCurlTypes::eTwitCurlApiFormatType eType ) eType : twitCurlTypes::eTwitCurlApiFormatXml; } +/*++ +* @method: twitCurl::setTwitterProcotolType +* +* @description: method to set protocol +* +* @input: none +* +* @output: none +* +*--*/ +void twitCurl::setTwitterProcotolType( twitCurlTypes::eTwitCurlProtocolType eType ) +{ + m_eProtocolType = ( eType < twitCurlTypes::eTwitCurlProtocolMax ) ? + eType : twitCurlTypes::eTwitCurlProtocolHttp; +} + /*++ * @method: twitCurl::isCurlInit * @@ -347,7 +368,8 @@ void twitCurl::setProxyPassword( std::string& proxyPassword ) bool twitCurl::search( std::string& searchQuery ) { /* Prepare URL */ - std::string buildUrl = twitterDefaults::TWITCURL_SEARCH_URL + + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_SEARCH_URL + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[twitCurlTypes::eTwitCurlApiFormatJson] + twitCurlDefaults::TWITCURL_URL_SEP_QUES + twitCurlDefaults::TWITCURL_SEARCHQUERYSTRING + searchQuery; @@ -376,7 +398,8 @@ bool twitCurl::statusUpdate( std::string& newStatus ) std::string newStatusMsg = twitCurlDefaults::TWITCURL_STATUSSTRING + urlencode( newStatus ); /* Perform POST */ - retVal = performPost( twitterDefaults::TWITCURL_STATUSUPDATE_URL + + retVal = performPost( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_STATUSUPDATE_URL + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], newStatusMsg ); } @@ -400,7 +423,8 @@ bool twitCurl::statusShowById( std::string& statusId ) if( statusId.length() ) { /* Prepare URL */ - std::string buildUrl = twitterDefaults::TWITCURL_STATUSSHOW_URL + statusId + + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_STATUSSHOW_URL + statusId + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; /* Perform GET */ @@ -426,7 +450,8 @@ bool twitCurl::statusDestroyById( std::string& statusId ) if( statusId.length() ) { /* Prepare URL */ - std::string buildUrl = twitterDefaults::TWITCURL_STATUDESTROY_URL + statusId + + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_STATUDESTROY_URL + statusId + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; /* Perform DELETE */ @@ -438,7 +463,7 @@ bool twitCurl::statusDestroyById( std::string& statusId ) /*++ * @method: twitCurl::retweetById * -* @description: method to retweet a status message by its id +* @description: method to RETWEET a status message by its id * * @input: statusId - a number in std::string format * @@ -448,21 +473,46 @@ bool twitCurl::statusDestroyById( std::string& statusId ) *--*/ bool twitCurl::retweetById( std::string& statusId ) { - bool retVal = false; - if( statusId.length() ) + bool retVal = false; + if( statusId.length() ) + { + /* Prepare URL */ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_RETWEET_URL + statusId + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + + /* Send some dummy data in POST */ + std::string dummyData = twitCurlDefaults::TWITCURL_TEXTSTRING + + urlencode( std::string( "dummy" ) ); + + /* Perform Retweet */ + retVal = performPost( buildUrl, dummyData ); + } + return retVal; +} + +/*++ +* @method: twitCurl::timelineHomeGet +* +* @description: method to get home timeline +* +* @input: none +* +* @output: true if GET is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::timelineHomeGet( std::string sinceId ) +{ + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_HOME_TIMELINE_URL + + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; + if( sinceId.length() ) { - /* Prepare URL */ - std::string buildUrl = twitterDefaults::TWITCURL_RETWEET_URL + statusId + - twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; - - /* Send some dummy data in POST */ - std::string dummyData = twitCurlDefaults::TWITCURL_TEXTSTRING + - urlencode( std::string( "dummy" ) ); - - /* Perform Retweet */ - retVal = performPost( buildUrl, dummyData ); + buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_QUES + twitCurlDefaults::TWITCURL_SINCEID + sinceId; } - return retVal; + /* Perform GET */ + return performGet( buildUrl ); } /*++ @@ -479,33 +529,11 @@ bool twitCurl::retweetById( std::string& statusId ) bool twitCurl::timelinePublicGet() { /* Perform GET */ - return performGet( twitterDefaults::TWITCURL_PUBLIC_TIMELINE_URL + + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_PUBLIC_TIMELINE_URL + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); } -/*++ -* @method: twitCurl::timelineHomeGet -* -* @description: method to get home timeline -* -* @input: none -* -* @output: true if GET is success, otherwise false. This does not check http -* response by twitter. Use getLastWebResponse() for that. -* -*--*/ -bool twitCurl::timelineHomeGet(std::string sinceId) -{ - std::string buildUrl = twitterDefaults::TWITCURL_HOME_TIMELINE_URL + - twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; - if( sinceId.length() ) - { - buildUrl += twitCurlDefaults::TWITCURL_URL_SEP_QUES + twitCurlDefaults::TWITCURL_SINCEID + sinceId; - } - /* Perform GET */ - return performGet( buildUrl ); -} - /*++ * @method: twitCurl::featuredUsersGet * @@ -520,7 +548,8 @@ bool twitCurl::timelineHomeGet(std::string sinceId) bool twitCurl::featuredUsersGet() { /* Perform GET */ - return performGet( twitterDefaults::TWITCURL_FEATURED_USERS_URL + + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FEATURED_USERS_URL + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); } @@ -538,7 +567,8 @@ bool twitCurl::featuredUsersGet() bool twitCurl::timelineFriendsGet() { /* Perform GET */ - return performGet( twitterDefaults::TWITCURL_FRIENDS_TIMELINE_URL + + return performGet( twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_FRIENDS_TIMELINE_URL + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType] ); } @@ -555,7 +585,8 @@ bool twitCurl::timelineFriendsGet() *--*/ bool twitCurl::mentionsGet( std::string sinceId ) { - std::string buildUrl = twitterDefaults::TWITCURL_MENTIONS_URL + + std::string buildUrl = twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_MENTIONS_URL + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType]; if( sinceId.length() ) { @@ -584,7 +615,8 @@ bool twitCurl::timelineUserGet( bool trimUser, bool includeRetweets, unsigned in /* Prepare URL */ std::string buildUrl; - utilMakeUrlForUser( buildUrl, twitterDefaults::TWITCURL_USERTIMELINE_URL + + utilMakeUrlForUser( buildUrl, twitCurlDefaults::TWITCURL_PROTOCOLS[m_eProtocolType] + + twitterDefaults::TWITCURL_USERTIMELINE_URL + twitCurlDefaults::TWITCURL_EXTENSIONFORMATS[m_eApiFormatType], userInfo, isUserId ); @@ -619,6 +651,42 @@ bool twitCurl::timelineUserGet( bool trimUser, bool includeRetweets, unsigned in return performGet( buildUrl ); } +/*++ +* @method: twitCurl::userLookup +* +* @description: method to get a number of user's profiles +* +* @input: userInfo - vector of screen names or user ids +* isUserId - true if userInfo contains an id +* +* @output: true if POST is success, otherwise false. This does not check http +* response by twitter. Use getLastWebResponse() for that. +* +*--*/ +bool twitCurl::userLookup( std::vector &userInfo, bool isUserId ) +{ + bool retVal = false; + + if( userInfo.size() ) + { + std::string userIds = ""; + std::string sep = ""; + for(int i=0 ; i &userInfo, bool isUserId ) -{ - bool retVal = false; - if( userInfo.size() ) - { - std::string userIds = ""; - std::string sep = ""; - for(int i=0 ; i -#include -#include #include #include +#include #include "oauthlib.h" #include "curl/curl.h" @@ -17,6 +16,13 @@ namespace twitCurlTypes eTwitCurlApiFormatJson, eTwitCurlApiFormatMax } eTwitCurlApiFormatType; + + typedef enum _eTwitCurlProtocolType + { + eTwitCurlProtocolHttp = 0, + eTwitCurlProtocolHttps, + eTwitCurlProtocolMax + } eTwitCurlProtocolType; }; /* Default values used in twitcurl */ @@ -38,11 +44,14 @@ namespace twitCurlDefaults const std::string TWITCURL_EXTENSIONFORMATS[2] = { ".xml", ".json" }; + const std::string TWITCURL_PROTOCOLS[2] = { "http://", + "https://" + }; const std::string TWITCURL_TARGETSCREENNAME = "target_screen_name="; const std::string TWITCURL_TARGETUSERID = "target_id="; const std::string TWITCURL_SINCEID = "since_id="; - const std::string TWITCURL_TRIMUSER = "trim_user=1"; - const std::string TWITCURL_INCRETWEETS = "include_rts=1"; + const std::string TWITCURL_TRIMUSER = "trim_user=true"; + const std::string TWITCURL_INCRETWEETS = "include_rts=true"; const std::string TWITCURL_COUNT = "count="; /* URL separators */ @@ -55,67 +64,68 @@ namespace twitterDefaults { /* Search URLs */ - const std::string TWITCURL_SEARCH_URL = "http://search.twitter.com/search"; + const std::string TWITCURL_SEARCH_URL = "search.twitter.com/search"; /* Status URLs */ - const std::string TWITCURL_STATUSUPDATE_URL = "http://api.twitter.com/1/statuses/update"; - const std::string TWITCURL_STATUSSHOW_URL = "http://api.twitter.com/1/statuses/show/"; - const std::string TWITCURL_STATUDESTROY_URL = "http://api.twitter.com/1/statuses/destroy/"; - const std::string TWITCURL_RETWEET_URL = "http://api.twitter.com/1/statuses/retweet/"; + const std::string TWITCURL_STATUSUPDATE_URL = "api.twitter.com/1/statuses/update"; + const std::string TWITCURL_STATUSSHOW_URL = "api.twitter.com/1/statuses/show/"; + const std::string TWITCURL_STATUDESTROY_URL = "api.twitter.com/1/statuses/destroy/"; + const std::string TWITCURL_RETWEET_URL = "api.twitter.com/1/statuses/retweet/"; /* Timeline URLs */ - const std::string TWITCURL_HOME_TIMELINE_URL = "http://api.twitter.com/1/statuses/home_timeline"; - const std::string TWITCURL_PUBLIC_TIMELINE_URL = "http://api.twitter.com/1/statuses/public_timeline"; - const std::string TWITCURL_FEATURED_USERS_URL = "http://api.twitter.com/1/statuses/featured"; - const std::string TWITCURL_FRIENDS_TIMELINE_URL = "http://api.twitter.com/1/statuses/friends_timeline"; - const std::string TWITCURL_MENTIONS_URL = "http://api.twitter.com/1/statuses/mentions"; - const std::string TWITCURL_USERTIMELINE_URL = "http://api.twitter.com/1/statuses/user_timeline"; + const std::string TWITCURL_HOME_TIMELINE_URL = "api.twitter.com/1/statuses/home_timeline"; + const std::string TWITCURL_PUBLIC_TIMELINE_URL = "api.twitter.com/1/statuses/public_timeline"; + const std::string TWITCURL_FEATURED_USERS_URL = "api.twitter.com/1/statuses/featured"; + const std::string TWITCURL_FRIENDS_TIMELINE_URL = "api.twitter.com/1/statuses/friends_timeline"; + const std::string TWITCURL_MENTIONS_URL = "api.twitter.com/1/statuses/mentions"; + const std::string TWITCURL_USERTIMELINE_URL = "api.twitter.com/1/statuses/user_timeline"; /* Users URLs */ - const std::string TWITCURL_LOOKUPUSERS_URL = "http://api.twitter.com/1/users/lookup"; - const std::string TWITCURL_SHOWUSERS_URL = "http://api.twitter.com/1/users/show"; - const std::string TWITCURL_SHOWFRIENDS_URL = "http://api.twitter.com/1/statuses/friends"; - const std::string TWITCURL_SHOWFOLLOWERS_URL = "http://api.twitter.com/1/statuses/followers"; + const std::string TWITCURL_LOOKUPUSERS_URL = "api.twitter.com/1/users/lookup"; + const std::string TWITCURL_SHOWUSERS_URL = "api.twitter.com/1/users/show"; + const std::string TWITCURL_SHOWFRIENDS_URL = "api.twitter.com/1/statuses/friends"; + const std::string TWITCURL_SHOWFOLLOWERS_URL = "api.twitter.com/1/statuses/followers"; /* Direct messages URLs */ - const std::string TWITCURL_DIRECTMESSAGES_URL = "http://api.twitter.com/1/direct_messages"; - const std::string TWITCURL_DIRECTMESSAGENEW_URL = "http://api.twitter.com/1/direct_messages/new"; - const std::string TWITCURL_DIRECTMESSAGESSENT_URL = "http://api.twitter.com/1/direct_messages/sent"; - const std::string TWITCURL_DIRECTMESSAGEDESTROY_URL = "http://api.twitter.com/1/direct_messages/destroy/"; + const std::string TWITCURL_DIRECTMESSAGES_URL = "api.twitter.com/1/direct_messages"; + const std::string TWITCURL_DIRECTMESSAGENEW_URL = "api.twitter.com/1/direct_messages/new"; + const std::string TWITCURL_DIRECTMESSAGESSENT_URL = "api.twitter.com/1/direct_messages/sent"; + const std::string TWITCURL_DIRECTMESSAGEDESTROY_URL = "api.twitter.com/1/direct_messages/destroy/"; /* Friendships URLs */ - const std::string TWITCURL_FRIENDSHIPSCREATE_URL = "http://api.twitter.com/1/friendships/create"; - const std::string TWITCURL_FRIENDSHIPSDESTROY_URL = "http://api.twitter.com/1/friendships/destroy"; - const std::string TWITCURL_FRIENDSHIPSSHOW_URL = "http://api.twitter.com/1/friendships/show"; + const std::string TWITCURL_FRIENDSHIPSCREATE_URL = "api.twitter.com/1/friendships/create"; + const std::string TWITCURL_FRIENDSHIPSDESTROY_URL = "api.twitter.com/1/friendships/destroy"; + const std::string TWITCURL_FRIENDSHIPSSHOW_URL = "api.twitter.com/1/friendships/show"; /* Social graphs URLs */ - const std::string TWITCURL_FRIENDSIDS_URL = "http://api.twitter.com/1/friends/ids"; - const std::string TWITCURL_FOLLOWERSIDS_URL = "http://api.twitter.com/1/followers/ids"; + const std::string TWITCURL_FRIENDSIDS_URL = "api.twitter.com/1/friends/ids"; + const std::string TWITCURL_FOLLOWERSIDS_URL = "api.twitter.com/1/followers/ids"; /* Account URLs */ - const std::string TWITCURL_ACCOUNTRATELIMIT_URL = "http://api.twitter.com/1/account/rate_limit_status"; + const std::string TWITCURL_ACCOUNTRATELIMIT_URL = "api.twitter.com/1/account/rate_limit_status"; + const std::string TWITCURL_ACCOUNTVERIFYCRED_URL = "api.twitter.com/1/account/verify_credentials"; /* Favorites URLs */ - const std::string TWITCURL_FAVORITESGET_URL = "http://api.twitter.com/1/favorites"; - const std::string TWITCURL_FAVORITECREATE_URL = "http://api.twitter.com/1/favorites/create/"; - const std::string TWITCURL_FAVORITEDESTROY_URL = "http://api.twitter.com/1/favorites/destroy/"; + const std::string TWITCURL_FAVORITESGET_URL = "api.twitter.com/1/favorites"; + const std::string TWITCURL_FAVORITECREATE_URL = "api.twitter.com/1/favorites/create/"; + const std::string TWITCURL_FAVORITEDESTROY_URL = "api.twitter.com/1/favorites/destroy/"; /* Block URLs */ - const std::string TWITCURL_BLOCKSCREATE_URL = "http://api.twitter.com/1/blocks/create/"; - const std::string TWITCURL_BLOCKSDESTROY_URL = "http://api.twitter.com/1/blocks/destroy/"; + const std::string TWITCURL_BLOCKSCREATE_URL = "api.twitter.com/1/blocks/create/"; + const std::string TWITCURL_BLOCKSDESTROY_URL = "api.twitter.com/1/blocks/destroy/"; /* Saved Search URLs */ - const std::string TWITCURL_SAVEDSEARCHGET_URL = "http://api.twitter.com/1/saved_searches"; - const std::string TWITCURL_SAVEDSEARCHSHOW_URL = "http://api.twitter.com/1/saved_searches/show/"; - const std::string TWITCURL_SAVEDSEARCHCREATE_URL = "http://api.twitter.com/1/saved_searches/create"; - const std::string TWITCURL_SAVEDSEARCHDESTROY_URL = "http://api.twitter.com/1/saved_searches/destroy/"; + const std::string TWITCURL_SAVEDSEARCHGET_URL = "api.twitter.com/1/saved_searches"; + const std::string TWITCURL_SAVEDSEARCHSHOW_URL = "api.twitter.com/1/saved_searches/show/"; + const std::string TWITCURL_SAVEDSEARCHCREATE_URL = "api.twitter.com/1/saved_searches/create"; + const std::string TWITCURL_SAVEDSEARCHDESTROY_URL = "api.twitter.com/1/saved_searches/destroy/"; /* Trends URLs */ - const std::string TWITCURL_TRENDS_URL = "http://api.twitter.com/1/trends"; - const std::string TWITCURL_TRENDSDAILY_URL = "http://api.twitter.com/1/trends/daily"; - const std::string TWITCURL_TRENDSCURRENT_URL = "http://api.twitter.com/1/trends/current"; - const std::string TWITCURL_TRENDSWEEKLY_URL = "http://api.twitter.com/1/trends/weekly"; - const std::string TWITCURL_TRENDSAVAILABLE_URL = "http://api.twitter.com/1/trends/available"; + const std::string TWITCURL_TRENDS_URL = "api.twitter.com/1/trends"; + const std::string TWITCURL_TRENDSDAILY_URL = "api.twitter.com/1/trends/daily"; + const std::string TWITCURL_TRENDSCURRENT_URL = "api.twitter.com/1/trends/current"; + const std::string TWITCURL_TRENDSWEEKLY_URL = "api.twitter.com/1/trends/weekly"; + const std::string TWITCURL_TRENDSAVAILABLE_URL = "api.twitter.com/1/trends/available"; }; @@ -140,6 +150,7 @@ public: /* Twitter API type */ void setTwitterApiType( twitCurlTypes::eTwitCurlApiFormatType eType ); + void setTwitterProcotolType( twitCurlTypes::eTwitCurlProtocolType eType ); /* Twitter search APIs */ bool search( std::string& searchQuery /* in */ ); @@ -148,10 +159,10 @@ public: bool statusUpdate( std::string& newStatus /* in */ ); bool statusShowById( std::string& statusId /* in */ ); bool statusDestroyById( std::string& statusId /* in */ ); - bool retweetById( std::string& statusId /* in */); + bool retweetById( std::string& statusId /* in */ ); /* Twitter timeline APIs */ - bool timelineHomeGet(std::string sinceId = "" /* in */); + bool timelineHomeGet( std::string sinceId = "" /* in */ ); bool timelinePublicGet(); bool timelineFriendsGet(); bool timelineUserGet( bool trimUser /* in */, bool includeRetweets /* in */, unsigned int tweetCount /* in */, std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); @@ -159,7 +170,7 @@ public: bool mentionsGet( std::string sinceId = "" /* in */ ); /* Twitter user APIs */ - bool userLookup( std::vector &userInfo /* in */, bool isUserId = false /* in */); + bool userLookup( std::vector &userInfo /* in */, bool isUserId = false /* in */ ); bool userGet( std::string& userInfo /* in */, bool isUserId = false /* in */ ); bool friendsGet( std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); bool followersGet( std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); @@ -181,7 +192,7 @@ public: /* Twitter account APIs */ bool accountRateLimitGet(); - + bool accountVerifyCredGet(); /* Twitter favorites APIs */ bool favoriteGet(); bool favoriteCreate( std::string& statusId /* in */ ); @@ -247,6 +258,7 @@ private: /* Twitter API type */ twitCurlTypes::eTwitCurlApiFormatType m_eApiFormatType; + twitCurlTypes::eTwitCurlProtocolType m_eProtocolType; /* OAuth data */ oAuth m_oAuth;