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; }
PYCOM_EXPORT HRESULT PyCom_SetAndLogCOMErrorFromPyExceptionEx(PyObject *provider, const char *methodName, REFIID riid /* = IID_NULL */) { if (!PyErr_Occurred()) // No error occurred return S_OK; PyCom_LoggerNonServerException(provider, "Unexpected exception in gateway method '%s'", methodName); return PyCom_SetCOMErrorFromPyException(riid); }
STDMETHODIMP PyGConnectionPoint::GetConnectionInterface(IID *pIID) { PY_GATEWAY_METHOD; if (pIID==NULL) return E_POINTER; PyObject *result; HRESULT hr = InvokeViaPolicy("GetConnectionInterface", &result, NULL); if (FAILED(hr)) return hr; if (!PyWinObject_AsIID(result, pIID)) hr = PyCom_SetCOMErrorFromPyException(IID_IConnectionPoint); Py_XDECREF(result); return hr; }
STDMETHODIMP PyGConnectionPoint::Advise(IUnknown *pUnk, DWORD *pdwCookie) { PY_GATEWAY_METHOD; if (pUnk==NULL || pdwCookie==NULL) return E_POINTER; PyObject *obUnknown = PyCom_PyObjectFromIUnknown(pUnk, IID_IUnknown, TRUE); // Take a reference to this object. if (obUnknown==NULL) return PyCom_SetCOMErrorFromPyException(GetIID()); PyObject *result = NULL; *pdwCookie = 0; HRESULT hr = InvokeViaPolicy("Advise", &result, "O", obUnknown); Py_DECREF(obUnknown); if (FAILED(hr)) return hr; *pdwCookie = PyInt_AsLong(result); if (PyErr_Occurred()) { hr = PyCom_SetCOMErrorFromPyException(GetIID()); *pdwCookie = 0; } Py_XDECREF(result); return hr; }
STDMETHODIMP PyGConnectionPoint::GetConnectionPointContainer( IConnectionPointContainer **ppCPC) { PY_GATEWAY_METHOD; if (ppCPC==NULL) return E_POINTER; PyObject *result; HRESULT hr = InvokeViaPolicy("GetConnectionPointContainer", &result, NULL); if (FAILED(hr)) return hr; if (!PyCom_InterfaceFromPyObject(result, IID_IConnectionPointContainer, (void **)ppCPC)) hr = PyCom_SetCOMErrorFromPyException(GetIID()); Py_XDECREF(result); return hr; }
STDMETHODIMP PyGPropertyBag::Read( /* [in] */ LPCOLESTR pszPropName, /* [out][in] */ VARIANT __RPC_FAR *pVar, /* [in] */ IErrorLog __RPC_FAR *pErrorLog) { if ( pszPropName == NULL || pVar == NULL ) return E_POINTER; PY_GATEWAY_METHOD; PyObject *obLog; if ( pErrorLog ) { obLog = PyCom_PyObjectFromIUnknown(pErrorLog, IID_IErrorLog, TRUE); if ( !obLog ) return PyCom_SetCOMErrorFromPyException(GetIID()); } else { Py_INCREF(Py_None); obLog = Py_None; } PyObject *obName = PyWinObject_FromWCHAR(pszPropName); PyObject *result; HRESULT hr = InvokeViaPolicy("Read", &result, "OiO", obName, (int)V_VT(pVar), obLog); Py_DECREF(obLog); Py_XDECREF(obName); if (FAILED(hr)) return hr; if (!PyCom_VariantFromPyObject(result, pVar)) hr = PyCom_SetCOMErrorFromPyException(GetIID()); Py_DECREF(result); return hr; }
STDMETHODIMP PyGActiveScriptError::GetSourcePosition(DWORD *pdwSourceContext, ULONG *pulLineNumber, LONG *plCharacterPosition) { if (pdwSourceContext==NULL || pulLineNumber==NULL || plCharacterPosition==NULL) return E_POINTER; PY_GATEWAY_METHOD; PyObject *result; HRESULT hr = InvokeViaPolicy("GetSourcePosition", &result, NULL); if (FAILED(hr)) return hr; if (!PyArg_ParseTuple(result, "iii", pdwSourceContext, pulLineNumber, plCharacterPosition)) hr = PyCom_SetCOMErrorFromPyException(GetIID()); 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 PyGPersistPropertyBag::Load( /* [in] */ IPropertyBag __RPC_FAR *pPropBag, /* [in] */ IErrorLog __RPC_FAR *pErrorLog) { HRESULT hr; if ( pPropBag == NULL ) return E_POINTER; PY_GATEWAY_METHOD; PyObject *obLog; if ( pErrorLog != NULL ) { obLog = PyCom_PyObjectFromIUnknown(pErrorLog, IID_IErrorLog, TRUE); if ( !obLog ) return PyCom_SetCOMErrorFromPyException(GetIID()); } else { Py_INCREF(Py_None); obLog = Py_None; } PyObject *obBag = PyCom_PyObjectFromIUnknown(pPropBag, IID_IPropertyBag, TRUE); if ( !obBag ) { hr = PyCom_SetCOMErrorFromPyException(GetIID()); Py_DECREF(obLog); return hr; } hr = InvokeViaPolicy("Load", NULL, "OO", obBag, obLog); Py_DECREF(obBag); Py_DECREF(obLog); return hr; }
STDMETHODIMP PyGActiveScriptError::GetSourceLineText(BSTR *pbstrSourceLine) { if (pbstrSourceLine==NULL) return E_POINTER; PY_GATEWAY_METHOD; PyObject *result; HRESULT hr = InvokeViaPolicy("GetSourceLineText", &result, NULL); if (FAILED(hr)) return hr; if (!PyWinObject_AsBstr(result, pbstrSourceLine, TRUE)) hr = PyCom_SetCOMErrorFromPyException(GetIID()); Py_DECREF(result); return hr; }
STDMETHODIMP PyGConnectionPointContainer::FindConnectionPoint(REFIID riid, IConnectionPoint **ppCP) { PY_GATEWAY_METHOD; if (ppCP==NULL) return E_POINTER; *ppCP = NULL; PyObject *obIID = PyWinObject_FromIID(riid); PyObject *result; HRESULT hr = InvokeViaPolicy("FindConnectionPoint", &result, "O", obIID); Py_XDECREF(obIID); if (FAILED(hr)) return hr; if (result != Py_None && !PyCom_InterfaceFromPyObject(result, IID_IConnectionPoint, (void **)ppCP)) hr = PyCom_SetCOMErrorFromPyException(GetIID()); Py_XDECREF(result); return (hr==S_OK && *ppCP==NULL) ? CONNECT_E_NOCONNECTION : hr; }
STDMETHODIMP PyGShellBrowser::InsertMenusSB( /* [in] */ HMENU hmenuShared, /* [out][in] */ LPOLEMENUGROUPWIDTHS lpMenuWidths) { static const char *method_name = "InsertMenusSB"; PY_GATEWAY_METHOD; PyObject *oblpMenuWidths = PyObject_FromOLEMENUGROUPWIDTHS(lpMenuWidths); if (oblpMenuWidths==NULL) return MAKE_PYCOM_GATEWAY_FAILURE_CODE(method_name); PyObject *result; HRESULT hr=InvokeViaPolicy(method_name, &result, "NO", PyWinLong_FromHANDLE(hmenuShared), oblpMenuWidths); Py_DECREF(oblpMenuWidths); if (FAILED(hr)) return hr; PyObject_AsOLEMENUGROUPWIDTHS(result, lpMenuWidths); Py_DECREF(result); return PyCom_SetCOMErrorFromPyException(GetIID()); }
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"); }
STDMETHODIMP PyGPersistPropertyBag::Save( /* [in] */ IPropertyBag __RPC_FAR *pPropBag, /* [in] */ BOOL fClearDirty, /* [in] */ BOOL fSaveAllProperties) { if ( pPropBag == NULL ) return E_POINTER; PY_GATEWAY_METHOD; PyObject *obBag = PyCom_PyObjectFromIUnknown(pPropBag, IID_IPropertyBag, TRUE); if ( !obBag ) return PyCom_SetCOMErrorFromPyException(GetIID()); HRESULT hr = InvokeViaPolicy("Save", NULL, "Oii", obBag, (int)fClearDirty, (int)fSaveAllProperties); Py_DECREF(obBag); return hr; }
STDMETHODIMP PyGPropertyBag::Write( /* [in] */ LPCOLESTR pszPropName, /* [in] */ VARIANT __RPC_FAR *pVar) { if ( pszPropName == NULL || pVar == NULL ) return E_POINTER; PY_GATEWAY_METHOD; PyObject *value = PyCom_PyObjectFromVariant(pVar); if ( !value ) return PyCom_SetCOMErrorFromPyException(GetIID()); PyObject *obName = PyWinObject_FromWCHAR(pszPropName); HRESULT hr = InvokeViaPolicy("Write", NULL, "OO", obName, value); Py_DECREF(value); Py_XDECREF(obName); return hr; }