| 1580 | } |
| 1581 | |
| 1582 | BOOL PyCom_MakeOlePythonCall(PyObject *handler, DISPPARAMS FAR* params, VARIANT FAR* pVarResult, |
| 1583 | EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr, PyObject *addnlArgs) |
| 1584 | { |
| 1585 | PythonOleArgHelper *pHelpers = NULL; |
| 1586 | PythonOleArgHelper *pNamedHelpers = NULL; |
| 1587 | PyObject *argList = NULL; |
| 1588 | PyObject *namedArgList = NULL; |
| 1589 | if (params) { |
| 1590 | if (!MakePythonArgumentTuples(&argList, &pHelpers, &namedArgList, &pNamedHelpers, params )) { |
| 1591 | PyErr_Clear(); |
| 1592 | return FALSE; |
| 1593 | } |
| 1594 | } |
| 1595 | if (addnlArgs) { |
| 1596 | PyObject *varArgs = argList; |
| 1597 | argList = Py_BuildValue("OO", varArgs, addnlArgs); |
| 1598 | Py_DECREF(varArgs); |
| 1599 | } |
| 1600 | PyObject *result = PyEval_CallObject(handler, argList); |
| 1601 | Py_XDECREF(argList); |
| 1602 | Py_XDECREF(namedArgList); |
| 1603 | // handlers reference cleaned up by virtual manager. |
| 1604 | BOOL bOK = (result!=NULL); |
| 1605 | if (result) { |
| 1606 | // If result is a tuple, then the Python code |
| 1607 | // wishes to set some "byval" arguments. |
| 1608 | // make the return type |
| 1609 | PyObject *simpleRet; |
| 1610 | if (PyTuple_Check(result) && PyTuple_Size(result)) { |
| 1611 | simpleRet = PyTuple_GetItem(result, 0); |
| 1612 | int retNumber = 1; |
| 1613 | int retTotal = PyTuple_Size(result); |
| 1614 | |
| 1615 | // Params are reverse order - loop from the back. |
| 1616 | for (unsigned int param=params->cArgs;param!=0 && retNumber < retTotal;param--) { |
| 1617 | if (pHelpers[param-1].m_bIsOut) { |
| 1618 | PyObject *val = PyTuple_GetItem(result, retNumber); |
| 1619 | pHelpers[param-1].MakeObjToVariant(val, params->rgvarg+param-1, NULL); |
| 1620 | retNumber++; |
| 1621 | } |
| 1622 | } |
| 1623 | } else { |
| 1624 | simpleRet = result; |
| 1625 | } |
| 1626 | PyCom_VariantFromPyObject(simpleRet, pVarResult); |
| 1627 | Py_DECREF(result); |
| 1628 | } |
| 1629 | delete [] pHelpers; |
| 1630 | delete [] pNamedHelpers; |
| 1631 | return bOK; |
| 1632 | } |
| 1633 |
nothing calls this directly
no test coverage detected