public CURLcode SetOpt(CURLoption option, Object parameter)
{
EnsureHandle();
CURLcode retCode = CURLcode.CURLE_OK;
// numeric cases
if ((int)option < CURLOPTTYPE_OBJECTPOINT)
{
int i = 0;
if (option == CURLoption.CURLOPT_DNS_USE_GLOBAL_CACHE ||
option == CURLoption.CURLOPT_SOURCE_PORT)
{
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
}
else if (option == CURLoption.CURLOPT_TIMEVALUE)
{
// unboxing may throw class cast exception
DateTime d = (DateTime)parameter;
DateTime startTime = new DateTime(1970, 1, 1);
TimeSpan currTime = new TimeSpan(DateTime.Now.Ticks -
startTime.Ticks);
i = Convert.ToInt32(currTime.TotalSeconds);
}
else
i = Convert.ToInt32(parameter);
retCode = External.curl_easy_setopt(m_pCURL,
option, (IntPtr)i);
}
// object cases: the majority
else if ((int)option < CURLOPTTYPE_FUNCTIONPOINT)
{
switch(option)
{
// various data items
case CURLoption.CURLOPT_PRIVATE:
m_privateData = parameter; break;
case CURLoption.CURLOPT_WRITEDATA:
m_writeData = parameter; break;
case CURLoption.CURLOPT_READDATA:
m_readData = parameter; break;
case CURLoption.CURLOPT_PROGRESSDATA:
m_progressData = parameter; break;
case CURLoption.CURLOPT_DEBUGDATA:
m_debugData = parameter; break;
case CURLoption.CURLOPT_HEADERDATA:
m_headerData = parameter; break;
case CURLoption.CURLOPT_SSL_CTX_DATA:
m_sslContextData = parameter; break;
case CURLoption.CURLOPT_IOCTLDATA:
m_ioctlData = parameter; break;
// items that can't be set externally or
// obsolete items
case CURLoption.CURLOPT_ERRORBUFFER:
case CURLoption.CURLOPT_STDERR:
case CURLoption.CURLOPT_SOURCE_HOST:
case CURLoption.CURLOPT_SOURCE_PATH:
case CURLoption.CURLOPT_PASV_HOST:
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
// singular case for share
case CURLoption.CURLOPT_SHARE:
{
Share share = parameter as Share;
if (share == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
retCode = External.curl_easy_setopt(m_pCURL,
option, share.GetHandle());
break;
}
// multipart HTTP post
case CURLoption.CURLOPT_HTTPPOST:
{
MultiPartForm mf = parameter as MultiPartForm;
if (mf == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
retCode = External.curl_easy_setopt(m_pCURL,
option, mf.GetHandle());
break;
}
// items curl wants as a curl_slist
case CURLoption.CURLOPT_HTTPHEADER:
case CURLoption.CURLOPT_PREQUOTE:
case CURLoption.CURLOPT_QUOTE:
case CURLoption.CURLOPT_POSTQUOTE:
case CURLoption.CURLOPT_SOURCE_QUOTE:
case CURLoption.CURLOPT_TELNETOPTIONS:
case CURLoption.CURLOPT_HTTP200ALIASES:
{
Slist slist = parameter as Slist;
if (slist == null) {
retCode = External.curl_easy_setopt(m_pCURL,
option, IntPtr.Zero);
}
else {
retCode = External.curl_easy_setopt(m_pCURL,
option, slist.GetHandle());
}
break;
}
// string items
default:
{
string s = parameter as string;
if (s == null) {
retCode = External.curl_easy_setopt(m_pCURL,
option, IntPtr.Zero);
}
else {
IntPtr pCurlStr = External.curl_shim_add_string(
m_pMyStrings, s);
if (pCurlStr != IntPtr.Zero)
retCode = External.curl_easy_setopt(m_pCURL,
option, pCurlStr);
//if (option == CURLoption.CURLOPT_URL)
// _URL = s;
}
break;
}
}
}
// FUNCTIONPOINT args, for delegates
else if ((int)option < CURLOPTTYPE_OFF_T)
{
switch(option)
{
case CURLoption.CURLOPT_WRITEFUNCTION:
{
WriteFunction wf = parameter as WriteFunction;
if (wf == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
m_pfWrite = wf;
break;
}
case CURLoption.CURLOPT_READFUNCTION:
{
ReadFunction rf = parameter as ReadFunction;
if (rf == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
m_pfRead = rf;
break;
}
case CURLoption.CURLOPT_PROGRESSFUNCTION:
{
ProgressFunction pf = parameter as ProgressFunction;
if (pf == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
m_pfProgress = pf;
break;
}
case CURLoption.CURLOPT_DEBUGFUNCTION:
{
DebugFunction pd = parameter as DebugFunction;
if (pd == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
m_pfDebug = pd;
break;
}
case CURLoption.CURLOPT_HEADERFUNCTION:
{
HeaderFunction hf = parameter as HeaderFunction;
if (hf == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
m_pfHeader = hf;
break;
}
case CURLoption.CURLOPT_SSL_CTX_FUNCTION:
{
SSLContextFunction sf = parameter as SSLContextFunction;
if (sf == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
m_pfSSLContext = sf;
break;
}
case CURLoption.CURLOPT_IOCTLFUNCTION:
{
IoctlFunction iof = parameter as IoctlFunction;
if (iof == null)
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
m_pfIoctl = iof;
break;
}
default:
return CURLcode.CURLE_BAD_FUNCTION_ARGUMENT;
}
}
// otherwise, it's one of those 64-bit off_t guys!
else
{
Int64 i = Convert.ToInt64(parameter);
retCode = External.curl_easy_setopt_64(m_pCURL,
option, i);
}
return retCode;
}