Highly revolting code to pass curl options through API as void*
authorcantor <cantor@de75baf8-a10c-0410-a50a-987c0e22f00f>
Thu, 2 Aug 2007 16:47:29 +0000 (16:47 +0000)
committercantor <cantor@de75baf8-a10c-0410-a50a-987c0e22f00f>
Thu, 2 Aug 2007 16:47:29 +0000 (16:47 +0000)
git-svn-id: https://svn.middleware.georgetown.edu/cpp-xmltooling/trunk@365 de75baf8-a10c-0410-a50a-987c0e22f00f

xmltooling/soap/SOAPTransport.h
xmltooling/soap/impl/CURLSOAPTransport.cpp

index cb8d9b6..3f0644b 100644 (file)
@@ -131,6 +131,21 @@ namespace xmltooling {
 #endif
 
         /**
+         * Sets an implementation-specific transport provider option.
+         * 
+         * <p>Requires knowledge of the underlying SOAPTransport implementation.
+         * Without the proper knowledge and inputs, crashes may result.
+         * 
+         * @param provider  name of the SOAPTransport class the caller believes is in use
+         * @param option    implementation-specific data containing the option to set
+         * @param value     implementation- and option-specific data to use
+         * @return  true iff the transport supports the option and value supplied
+         */
+        virtual bool setProviderOption(const char* provider, void* option, void* value) {
+            return false;
+        }
+        
+        /**
          * Sends a stream of data over the transport. The function may return without
          * having received any data, depending on the nature of the transport.
          * 
index 48e1a9e..423a3ba 100644 (file)
@@ -146,6 +146,20 @@ namespace xmltooling {
             return true;
         }
 
+        bool setProviderOption(const char* provider, void* option, void* value) {
+            if (!provider || strcmp(provider, "CURL"))
+                return false;
+            // For libcurl, the option is an enum and the value type depends on the option.
+            CURLoption opt = static_cast<CURLoption>(reinterpret_cast<long>(option));
+            if (opt < CURLOPTTYPE_OBJECTPOINT)
+                return (curl_easy_setopt(m_handle, opt, reinterpret_cast<long>(value))==CURLE_OK);
+            else if (opt < CURLOPTTYPE_OFF_T)
+                return (curl_easy_setopt(m_handle, opt, value)==CURLE_OK);
+            else if (sizeof(void*) == sizeof(curl_off_t))
+                return (curl_easy_setopt(m_handle, opt, reinterpret_cast<curl_off_t>(value))==CURLE_OK);
+            return false;
+        }
+        
         void send(istream& in);
         
         istream& receive() {