void getMeta(const QObject* object, QTextStream& output) {
    const auto metaObject = object->metaObject();
    // properties
    const auto propertyCount = metaObject->propertyCount();
    for (int i = 0; i < propertyCount; i++) {
        const auto property = metaObject->property(i);

        if (QString(property.typeName()).endsWith("*")) {
            const auto propertyObject = object->property(property.name());
            getMeta(qvariant_cast<QObject*>(propertyObject), output);
            output << "Object" << " "
            << property.typeName() << " "
            << qPrintable(QString(metaObject->className()) + "::" + property.name())
            << endl;
        } else {
            output << "Property" << " "
            << property.typeName() << " "
            << qPrintable(QString(metaObject->className()) + "::" + property.name())
            << endl;
        }
    }

    // methods
    const auto methodCount = metaObject->methodCount();
    for (int i = 0; i < methodCount; i++) {
        const auto method = metaObject->method(i);
        switch (method.methodType()) {
            case QMetaMethod::Slot: {
                if (method.access() == QMetaMethod::Public) {
                    output << "Slot" << " "
                    << method.typeName() << " "
                    << qPrintable(QString(metaObject->className()) + "::" + method.methodSignature().constData())
                    << endl;
                }
                break;
            }
            case QMetaMethod::Signal: {
                output << "Signal" << " "
                << method.typeName() << " "
                << qPrintable(QString(metaObject->className()) + "::" + method.methodSignature().constData())
                << endl;
                break;
            }
            default: {

            }
        }
    }
}
Esempio n. 2
0
    /*!
        Returns the name of the given method.

        Example usage:
        \code
        QByteArray method = QxtMetaObject::methodName(" int foo ( int bar, double baz )");
        // method is now "foo"
        \endcode
     */
    QByteArray methodName(const char* method)
    {
        QByteArray name = methodSignature(method);
        const int idx = name.indexOf("(");
        if (idx != -1)
            name.truncate(idx);
        return name;
    }
WsRequestParameters::operator const QList<QPair<QString, QString> >() const
{
    typedef QPair<QString,QString> Pair;

    QList<Pair> list;
    QMapIterator<QString, QString> i( m_map );
    while (i.hasNext()) {
        i.next();
        list += Pair( i.key(), i.value() );
    }

    return ( list << Pair( "api_sig", methodSignature() ) );
}
LuaValue* LuaUnityExportMethodDescriptor::invokeInstanceMethod(LuaSession *session, LuaArgumentList arguments)
{
    if (_instanceMethodHandler != NULL)
    {
        //编码参数列表
        LuaObjectEncoder *encoder = new LuaObjectEncoder(session -> getContext());
        encoder -> writeInt32((int)(arguments.size() - 1));
        
        LuaArgumentList::iterator it = arguments.begin();
        LuaObjectDescriptor *instance = (*it) -> toObject();
        ++it;
        
        for (; it != arguments.end(); ++it)
        {
            LuaValue *value = *it;
            encoder -> writeObject(value);
        }
        
        //paramsBuffer的内容由C#端进行释放
        std::string methodName = StringUtils::format("%s_%s", name().c_str(), methodSignature().c_str());
        const void *paramsBuffer = encoder -> cloneBuffer();
        void *returnBuffer = _instanceMethodHandler(session -> getContext() -> objectId(),
                                                    typeDescriptor -> objectId(),
                                                    (long long) instance -> getObject(),
                                                    methodName.c_str(),
                                                    paramsBuffer,
                                                    encoder -> getBufferLength());
        
        encoder -> release();
        
        LuaValue *retValue = NULL;
        if (returnBuffer != NULL)
        {
            LuaObjectDecoder *decoder = new LuaObjectDecoder(session -> getContext(), returnBuffer);
            retValue = dynamic_cast<LuaValue *>(decoder -> readObject());
            decoder -> release();
            
            //释放C#中申请的内存
            free(returnBuffer);
        }
        else
        {
            retValue = LuaValue::NilValue();
        }
        
        return retValue;
    }
    
    return NULL;
}
Esempio n. 5
0
void EventManager::registerObject(QObject *object, Priority priority, const QString &methodPrefix, const QString &filterPrefix) {
  for(int i = object->metaObject()->methodOffset(); i < object->metaObject()->methodCount(); i++) {
    QString methodSignature(object->metaObject()->method(i).signature());

    int eventType = findEventType(methodSignature, methodPrefix);
    if(eventType > 0) {
      Handler handler(object, i, priority);
      registeredHandlers()[eventType].append(handler);
      //qDebug() << "Registered event handler for" << methodSignature << "in" << object;
    }
    eventType = findEventType(methodSignature, filterPrefix);
    if(eventType > 0) {
      Handler handler(object, i, priority);
      registeredFilters()[eventType].append(handler);
      //qDebug() << "Registered event filterer for" << methodSignature << "in" << object;
    }
  }
}
Esempio n. 6
0
const QHash<QString, int> &BasicHandler::handlerHash() {
  if(!initDone) {
    for(int i = metaObject()->methodOffset(); i < metaObject()->methodCount(); i++) {
      QString methodSignature(metaObject()->method(i).signature());
      if(methodSignature.startsWith("defaultHandler")) {
	defaultHandler = i;
	continue;
      }
      
      if(!methodSignature.startsWith("handle"))
	continue;
      
      methodSignature = methodSignature.section('(',0,0);  // chop the attribute list
      methodSignature = methodSignature.mid(6); // strip "handle"
      _handlerHash[methodSignature] = i;
    }
    initDone = true;
  }
  return _handlerHash;
}