Пример #1
0
/*static*/
PyObject * PythonScript::callMethod(PyObject * o, PyObject * pyArgs, PyObject * kw)
{
    Q_UNUSED(kw)
    QObject * obj;
    QString methodName;
    QVariantList args;
    QVariant result;
    int i;

    // Get the QObject* we operate on
    obj = (QObject*)GET_ENCAPSULATED_C_POINTER((PyObject*)(((pyQObjectMethodObject*)o)->_TWcontext));

    if (!asQString((PyObject*)(((pyQObjectMethodObject*)o)->_methodName), methodName)) {
        PyErr_SetString(PyExc_TypeError, qPrintable(tr("call: invalid method name")));
        return NULL;
    }

    for (i = 0; i < PyTuple_Size(pyArgs); ++i) {
        args.append(PythonScript::PythonToVariant(PyTuple_GetItem(pyArgs, i)));
    }
    if (methodName.length() > 1 && methodName.endsWith(QChar('_')))
        methodName.chop(1);
    switch (doCallMethod(obj, methodName, args, result)) {
    case Method_OK:
        return PythonScript::VariantToPython(result);
    case Method_DoesNotExist:
        PyErr_Format(PyExc_TypeError, qPrintable(tr("call: the method %s doesn't exist")), qPrintable(methodName));
        return NULL;
    case Method_WrongArgs:
        PyErr_Format(PyExc_TypeError, qPrintable(tr("call: couldn't call %s with the given arguments")), qPrintable(methodName));
        return NULL;
    case Method_Failed:
        PyErr_Format(PyExc_TypeError, qPrintable(tr("call: internal error while executing %s")), qPrintable(methodName));
        return NULL;
    default:
        break;
    }

    // we should never reach this point
    return NULL;
}
void ObjectService::performObjectService(TasCommandModel& model, TasResponse& response)
{
    TasLogger::logger()->debug(QString("TasCommander::performObjectService entry"));
    QListIterator<TasTarget*> i(model.targetList());
    QString errorString;
    while (i.hasNext()){
        TasTarget* commandTarget = i.next();
        QString targetId = commandTarget->id();
        QString targetType = commandTarget->type();
        QObject* target = 0;

        if(targetType == TYPE_GRAPHICS_VIEW){
            QGraphicsItem* item = findGraphicsItem(targetId);
            //target = TestabilityUtils::castToGraphicsWidget(item);
            target = item->toGraphicsObject();
        }
        else if(targetType == TYPE_STANDARD_VIEW){
            target = findWidget(targetId);

            //If Type is Standard View check QObjects in cache too.
            if(!target) {
              target = findObject(targetId);
            }
        }
        else if(targetType == TYPE_QSCENEGRAPH){
            target = findQuickItem(targetId);
        }
        else if(targetType == TYPE_APPLICATION_VIEW ){
            target = qApp;
        }
        // TODO: add support
        //else if(targetType == TYPE_ACTION_VIEW = "Action";
        //else if(targetType == TYPE_LAYOUT = "Layout";
        //else if(targetType == TYPE_LAYOUT_ITEM = "LayoutItem";
        //else if(targetType == TYPE_WEB = "Web";
        //else if(targetType == TYPE_QWEB = "QWeb";
        else {
            errorString.append(targetType + " target type not supported. ");
        }

        TasLogger::logger()->debug(
                    QString("TasCommander::performObjectService %1 %2 found: %3")
                    .arg(targetType).arg(targetId).arg(target!=NULL));

        if (target) {
            QListIterator<TasCommand*> j(commandTarget->commandList());
            while (j.hasNext()){
                TasCommand* command = j.next();
                if(command->name() == "SetAttribute"){
                    doSetAttribute(command, target, errorString);
                }
                else if (command->name() == "CallMethod"){
                    response.setData(doCallMethod(command, target, errorString));
                }
                else {
                    TasLogger::logger()->debug(
                                QString("TasCommander::performObjectService %1 %2: unsupported %3")
                                .arg(targetType).arg(targetId).arg(command->name()));
                }
            }
        }
    }

    if(!errorString.isEmpty()){
        response.setErrorMessage(errorString);
        TasLogger::logger()->debug(
                    QString("TasCommander::performObjectService errors: %1")
                    .arg(errorString));
    }
    else {
        TasLogger::logger()->debug(
                    QString("TasCommander::performObjectService, no errors."));
    }
}