Esempio n. 1
0
 bool FillIntVectorFromPySequence(PyObject* datalist, std::vector<int> &data)
 {
     data.clear();
     
     // First, try list or tuple iteration (for speed).
     if(PyListOrTuple_Check(datalist))
     {
         int sequenceSize = PyListOrTuple_GET_SIZE(datalist);
         data.reserve(sequenceSize);
         
         for(int i=0; i < sequenceSize; i++)
         {
             PyObject* item = PyListOrTuple_GET_ITEM(datalist, i);
             
             int val;
             if (!GetIntFromPyObject(item, &val))
             {
                 data.clear();
                 return false;
             }
             data.push_back(val);
         }
         
         return true;
     }
     // As a fallback, try general iteration.
     else
     {
         PyObject *item;
         PyObject *iter = PyObject_GetIter(datalist);
         if (iter == NULL)
         {
             PyErr_Clear();
             return false;
         }
         while((item = PyIter_Next(iter)) != NULL)
         {
             int val;
             if (!GetIntFromPyObject(item, &val))
             {
                 Py_DECREF(item);
                 Py_DECREF(iter);
                 
                 data.clear();
                 return false;
             }
             data.push_back(val);
             Py_DECREF(item);
         }
         
         Py_DECREF(iter);
         if (PyErr_Occurred())
         {
             PyErr_Clear();
             data.clear();
             return false;
         }
         return true;
     }
 }
Esempio n. 2
0
 bool FillStringVectorFromPySequence(PyObject* datalist, std::vector<std::string> &data)
 {
     data.clear();
     
     if(PyListOrTuple_Check(datalist))
     {
         int sequenceSize = PyListOrTuple_GET_SIZE(datalist);
         data.reserve(sequenceSize);
         
         for(int i=0; i < sequenceSize; i++)
         {
             PyObject* item = PyListOrTuple_GET_ITEM(datalist, i);
             std::string val;
             if (!GetStringFromPyObject(item, &val))
             {
                 data.clear();
                 return false;
             }
             data.push_back( val );
         }
         return true;
     }
     else
     {
         PyObject *item;
         PyObject *iter = PyObject_GetIter(datalist);
         if (iter == NULL)
         {
             PyErr_Clear();
             return false;
         }
         while((item = PyIter_Next(iter)) != NULL)
         {
             std::string val;
             if (!GetStringFromPyObject(item, &val))
             {
                 Py_DECREF(item);
                 Py_DECREF(iter);
                 
                 data.clear();
                 return false;
             }
             data.push_back(val);
             Py_DECREF(item);
         }
         
         Py_DECREF(iter);
         if (PyErr_Occurred())
         {
             PyErr_Clear();
             data.clear();
             return false;
         }
         return true;
     }
 }
Esempio n. 3
0
static PyObject *
do_multi_setopt(CurlMultiObject *self, PyObject *args)
{
    int option, which;
    PyObject *obj;

    if (!PyArg_ParseTuple(args, "iO:setopt", &option, &obj))
        return NULL;
    if (check_multi_state(self, 1 | 2, "setopt") != 0)
        return NULL;

    /* Early checks of option value */
    if (option <= 0)
        goto error;
    if (option >= (int)CURLOPTTYPE_OFF_T + MOPTIONS_SIZE)
        goto error;
    if (option % 10000 >= MOPTIONS_SIZE)
        goto error;

    /* Handle the case of integer arguments */
    if (PyInt_Check(obj)) {
        return do_multi_setopt_int(self, option, obj);
    }

    /* Handle the case of list or tuple objects */
    which = PyListOrTuple_Check(obj);
    if (which) {
        return do_multi_setopt_list(self, option, which, obj);
    }

    if (PyFunction_Check(obj) || PyCFunction_Check(obj) ||
        PyCallable_Check(obj) || PyMethod_Check(obj)) {
        return do_multi_setopt_callable(self, option, obj);
    }

    /* Failed to match any of the function signatures -- return error */
error:
    PyErr_SetString(PyExc_TypeError, "invalid arguments to setopt");
    return NULL;
}
Esempio n. 4
0
 bool FillTransformVectorFromPySequence(PyObject* datalist, std::vector<ConstTransformRcPtr> &data)
 {
     data.clear();
     
     if(PyListOrTuple_Check(datalist))
     {
         int sequenceSize = PyListOrTuple_GET_SIZE(datalist);
         data.reserve(sequenceSize);
         
         for(int i=0; i < sequenceSize; i++)
         {
             PyObject* item = PyListOrTuple_GET_ITEM(datalist, i);
             ConstTransformRcPtr val;
             try
             {
                 val = GetConstTransform(item, true);
             }
             catch(...)
             {
                 data.clear();
                 return false;
             }
             
             data.push_back( val );
         }
         return true;
     }
     else
     {
         PyObject *item;
         PyObject *iter = PyObject_GetIter(datalist);
         if (iter == NULL)
         {
             PyErr_Clear();
             return false;
         }
         while((item = PyIter_Next(iter)) != NULL)
         {
             ConstTransformRcPtr val;
             try
             {
                 val = GetConstTransform(item, true);
             }
             catch(...)
             {
                 Py_DECREF(item);
                 Py_DECREF(iter);
                 
                 data.clear();
                 return false;
             }
             
             data.push_back(val);
             Py_DECREF(item);
         }
         
         Py_DECREF(iter);
         if (PyErr_Occurred())
         {
             PyErr_Clear();
             data.clear();
             return false;
         }
         
         return true;
     }
 }