STDMETHODIMP PyGLockBytes::WriteAt( /* [in] */ ULARGE_INTEGER ulOffset, /* [in] */ const void __RPC_FAR * pv, /* [in] */ ULONG cb, /* [out] */ ULONG __RPC_FAR * pcbWritten) { if (pv==NULL) return E_POINTER; if (pcbWritten) *pcbWritten = 0; PY_GATEWAY_METHOD; PyObject *obulOffset = PyWinObject_FromULARGE_INTEGER(ulOffset); PyObject *obbuf = PyString_FromStringAndSize((char *)pv, cb); PyObject *result; HRESULT hr=InvokeViaPolicy("WriteAt", &result, "OO", obulOffset, obbuf); Py_XDECREF(obulOffset); Py_XDECREF(obbuf); if (FAILED(hr)) return hr; // Process the Python results, and convert back to the real params int cbWritten = PyInt_AsLong(result); Py_DECREF(result); if ( cbWritten == -1 ) { PyErr_Clear(); return PyCom_SetCOMErrorFromSimple(E_FAIL, GetIID()); } if ( pcbWritten != NULL ) *pcbWritten = cbWritten; return S_OK; }
STDMETHODIMP PyGEnumDebugStackFrames::Next( /* [in] */ ULONG celt, /* [length_is][size_is][out] */ DebugStackFrameDescriptor __RPC_FAR *rgVar, /* [out] */ ULONG __RPC_FAR *pCeltFetched) { PY_GATEWAY_METHOD; PyObject *result; Py_ssize_t len; HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt); if ( FAILED(hr) ) return hr; if ( !PySequence_Check(result) ) goto error; len = PyObject_Length(result); if ( len == -1 ) goto error; if ( len > (Py_ssize_t)celt) len = celt; if ( pCeltFetched ) *pCeltFetched = PyWin_SAFE_DOWNCAST(len, Py_ssize_t, ULONG); Py_ssize_t i; for ( i = 0; i < len; ++i ) { PyObject *ob = PySequence_GetItem(result, i); if ( ob == NULL ) goto error; if (!PyTuple_Check(ob)) { Py_DECREF(ob); PyErr_SetString(PyExc_TypeError, "PyIEnumDebugStackFrames::Next must return a tuple."); goto error; } PyObject *obEnum, *obUnk; if (!PyArg_ParseTuple(ob, "OiiiO", &obEnum, &rgVar[i].dwMin, &rgVar[i].dwLim, &rgVar[i].fFinal, &obUnk)) { Py_DECREF(ob); goto error; } if ( !PyCom_InterfaceFromPyInstanceOrObject(obEnum, IID_IDebugStackFrame, (void **)&rgVar[i].pdsf, FALSE) || !PyCom_InterfaceFromPyInstanceOrObject(obUnk, IID_IUnknown, (void **)&rgVar[i].punkFinal, TRUE) ) { Py_DECREF(ob); Py_DECREF(result); return PyCom_SetCOMErrorFromPyException(IID_IEnumDebugStackFrames); } Py_DECREF(ob); } Py_DECREF(result); return len < (Py_ssize_t)celt ? S_FALSE : S_OK; error: hr = PyErr_Occurred() ? PyCom_SetCOMErrorFromPyException(IID_IEnumDebugStackFrames) : PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumDebugStackFrames); Py_DECREF(result); return hr; }
// --------------------------------------------------- // // Gateway Implementation STDMETHODIMP PyGEnumSTATPROPSTG::Next( /* [in] */ ULONG celt, /* [length_is][size_is][out] */ STATPROPSTG __RPC_FAR *rgVar, /* [out] */ ULONG __RPC_FAR *pCeltFetched) { PY_GATEWAY_METHOD; PyObject *result; HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt); if ( FAILED(hr) ) return hr; if ( !PySequence_Check(result) ) goto error; int len; len = PyObject_Length(result); if ( len == -1 ) goto error; if ( len > (int)celt) len = celt; if ( pCeltFetched ) *pCeltFetched = len; int i; PyObject *obname; for ( i = 0; i < len; ++i ) { TmpPyObject ob = PySequence_GetItem(result, i); if ( ob == NULL ) goto error; if (!PyArg_ParseTuple(ob, "OkH", &obname, &rgVar[i].propid, &rgVar[i].vt) ||!PyWinObject_AsTaskAllocatedWCHAR(obname, &rgVar[i].lpwstrName, TRUE)) { Py_DECREF(result); for (; i--; ) CoTaskMemFree(rgVar[i].lpwstrName); return PyCom_SetCOMErrorFromPyException(IID_IEnumSTATPROPSTG); } } Py_DECREF(result); return len < (int)celt ? S_FALSE : S_OK; error: PyErr_Clear(); // just in case Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumSTATPROPSTG, "Next() did not return a sequence of objects"); }
STDMETHODIMP PyGEnumVARIANT::Next( /* [in] */ ULONG celt, /* [length_is][size_is][out] */ VARIANT __RPC_FAR *rgVar, /* [out] */ ULONG __RPC_FAR *pCeltFetched) { PY_GATEWAY_METHOD; PyObject *result; HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt); if ( FAILED(hr) ) return hr; if ( !PySequence_Check(result) ) goto error; int len; len = PyObject_Length(result); if ( len == -1 ) goto error; if ( len > (int)celt) len = celt; if ( pCeltFetched ) *pCeltFetched = len; int i; for ( i = 0; i < len; ++i ) { PyObject *ob = PySequence_GetItem(result, i); if ( ob == NULL ) goto error; if ( !PyCom_VariantFromPyObject(ob, &rgVar[i]) ) { Py_DECREF(ob); Py_DECREF(result); return PyCom_SetCOMErrorFromPyException(IID_IEnumVARIANT); } Py_DECREF(ob); } Py_DECREF(result); return len < (int)celt ? S_FALSE : S_OK; error: PyErr_Clear(); // just in case PyCom_LogF("PyGEnumVariant::Next got a bad return value"); Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumVARIANT, "Next() did not return a sequence of objects"); }
STDMETHODIMP PyGEnumConnectionPoints::Next( /* [in] */ ULONG celt, /* [length_is][size_is][out] */ IConnectionPoint **rgVar, /* [out] */ ULONG __RPC_FAR *pCeltFetched) { PY_GATEWAY_METHOD; PyObject *result; HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt); if ( FAILED(hr) ) return hr; if ( !PySequence_Check(result) ) goto error; int len; len = PyObject_Length(result); if ( len == -1 ) goto error; if ( len > (int)celt) len = celt; if ( pCeltFetched ) *pCeltFetched = len; int i; for ( i = 0; i < len; ++i ) { PyObject *ob = PySequence_GetItem(result, i); if ( ob == NULL ) goto error; if ( !PyCom_InterfaceFromPyObject(ob, IID_IConnectionPoint, reinterpret_cast<void **>(&rgVar[i]), FALSE) ) { Py_DECREF(result); return PyCom_SetCOMErrorFromPyException(IID_IEnumConnectionPoints); } } Py_DECREF(result); return len < (int)celt ? S_FALSE : S_OK; error: PyErr_Clear(); // just in case Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumConnectionPoints); }
// Std delegation STDMETHODIMP PyGEnumResources::Next( /* [in] */ ULONG celt, /* [out] */ SHELL_ITEM_RESOURCE *rgVar, /* [out] */ ULONG *pCeltFetched) { PY_GATEWAY_METHOD; PyObject *result; HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt); if ( FAILED(hr) ) return hr; if ( !PySequence_Check(result) ) goto error; int len; len = PyObject_Length(result); if ( len == -1 ) goto error; if ( len > (int)celt) len = celt; if ( pCeltFetched ) *pCeltFetched = len; int i; for ( i = 0; i < len; ++i ) { PyObject *ob = PySequence_GetItem(result, i); if ( ob == NULL ) goto error; if ( !PyWinObject_AsSHELL_ITEM_RESOURCE(ob, &rgVar[i])) { Py_DECREF(result); return PyCom_SetCOMErrorFromPyException(IID_IEnumResources); } } Py_DECREF(result); return len < (int)celt ? S_FALSE : S_OK; error: PyErr_Clear(); // just in case Py_DECREF(result); return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumResources, "Next() did not return a sequence of objects"); }