#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.
*
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() {