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
|