[pywin32-checkins] pywin32/com/win32com/src/extensions PyIEnumGUID.cpp, 1.5, 1.6
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: Mark H. <mha...@us...> - 2008-01-22 12:11:56
|
Update of /cvsroot/pywin32/pywin32/com/win32com/src/extensions In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3897/extensions Modified Files: PyIEnumGUID.cpp Log Message: Add gateway support for IEnumGUID Index: PyIEnumGUID.cpp =================================================================== RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/extensions/PyIEnumGUID.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** PyIEnumGUID.cpp 2 Nov 2003 09:57:44 -0000 1.5 --- PyIEnumGUID.cpp 22 Jan 2008 12:11:59 -0000 1.6 *************** *** 146,148 **** --- 146,230 ---- GET_PYCOM_CTOR(PyIEnumGUID)); + // --------------------------------------------------- + // + // Gateway Implementation + + + STDMETHODIMP PyGEnumGUID::Next(ULONG celt, GUID __RPC_FAR *rgVar,ULONG __RPC_FAR *pCeltFetched) + { + PY_GATEWAY_METHOD; + PyObject *result, *result_tuple, *result_item; + ULONG item_index; + HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt); + if ( FAILED(hr) ) + return hr; + + // Caller is expected to allocate array of GUIDs + ZeroMemory(rgVar, celt*sizeof(LPOLESTR)); + result_tuple=PySequence_Tuple(result); + if (result_tuple==NULL) + return PyCom_SetCOMErrorFromPyException(IID_IEnumGUID); + hr=S_OK; + *pCeltFetched = PyWin_SAFE_DOWNCAST(PyTuple_GET_SIZE(result_tuple), Py_ssize_t, ULONG); + if (*pCeltFetched > celt){ + PyErr_Format(PyExc_ValueError, "Received %d items , but only %d items requested", *pCeltFetched, celt); + hr=PyCom_SetCOMErrorFromPyException(IID_IEnumGUID); + } + else + for (item_index = 0; item_index < *pCeltFetched; item_index++){ + result_item = PyTuple_GET_ITEM(result_tuple, item_index); + if (!PyWinObject_AsIID(result_item, &rgVar[item_index])){ + hr=PyCom_SetCOMErrorFromPyException(IID_IEnumGUID); + break; + } + } + + Py_DECREF(result_tuple); + return hr; + } + + STDMETHODIMP PyGEnumGUID::Skip(ULONG celt) + { + PY_GATEWAY_METHOD; + return InvokeViaPolicy("Skip", NULL, "i", celt); + } + + STDMETHODIMP PyGEnumGUID::Reset(void) + { + PY_GATEWAY_METHOD; + return InvokeViaPolicy("Reset"); + } + + STDMETHODIMP PyGEnumGUID::Clone(IEnumGUID __RPC_FAR *__RPC_FAR *ppEnum) + { + PY_GATEWAY_METHOD; + PyObject * result; + HRESULT hr = InvokeViaPolicy("Clone", &result); + if ( FAILED(hr) ) + return hr; + + if ( !PyIBase::is_object(result, &PyIUnknown::type) ) + { + // the wrong kind of object was returned to us + Py_DECREF(result); + return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumGUID); + } + + IUnknown *punk = ((PyIUnknown *)result)->m_obj; + if ( !punk ) + { + Py_DECREF(result); + return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumGUID); + } + + Py_BEGIN_ALLOW_THREADS + hr = punk->QueryInterface(IID_IEnumGUID, (LPVOID *)ppEnum); + Py_END_ALLOW_THREADS + + // done with the result; this DECREF is also for <punk> + Py_DECREF(result); + + return PyCom_SetCOMErrorFromSimple(hr, IID_IEnumGUID); + } + #endif // NO_PYCOM_IENUMGUID |