diff --git a/src/native/QmlNet/QmlNet/qml/JsNetArray.cpp b/src/native/QmlNet/QmlNet/qml/JsNetArray.cpp index dfc7bfb6..0eaf9782 100644 --- a/src/native/QmlNet/QmlNet/qml/JsNetArray.cpp +++ b/src/native/QmlNet/QmlNet/qml/JsNetArray.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -37,7 +38,21 @@ ReturnedValue NetArray::create(ExecutionEngine *engine, NetValue* netValue) ReturnedValue NetArray::method_length(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc) { Scope scope(b); - return Encode(scope.engine->newNumberObject(1)); + + Scoped netArray(scope, thisObject->as()); + Scoped wrapper(scope, netArray->d()->object); + if (!wrapper) { + THROW_GENERIC_ERROR("No reference to the wrapped QObject exists."); + } + + NetValue* netValue = reinterpret_cast(wrapper->d()->object()); + QSharedPointer arrayFacade = netValue->getNetReference()->getTypeInfo()->getArrayFacade(); + + if(arrayFacade == nullptr) { + THROW_GENERIC_ERROR("The wrapped object can't be treated as an array."); + } + + return Encode(scope.engine->newNumberObject(arrayFacade->getLength(netValue->getNetReference()))); } ReturnedValue NetArray::getIndexed(const Managed *m, uint index, bool *hasProperty) @@ -47,8 +62,6 @@ ReturnedValue NetArray::getIndexed(const Managed *m, uint index, bool *hasProper if(hasProperty) *hasProperty = true; - // Find the "Get" method for this type. - QV4::Scoped wrapper(scope, netArray->d()->object); if (!wrapper) { THROW_GENERIC_ERROR("No reference to the wrapped QObject exists."); diff --git a/src/native/QmlNet/QmlNet/types/NetTypeArrayFacade.cpp b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacade.cpp new file mode 100644 index 00000000..5cdcac6a --- /dev/null +++ b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacade.cpp @@ -0,0 +1,27 @@ +#include +#include +#include + +NetTypeArrayFacade::NetTypeArrayFacade() +{ + +} + +QSharedPointer NetTypeArrayFacade::fromType(QSharedPointer type) +{ + if(type->isArray()) { + QSharedPointer facade = QSharedPointer(new NetTypeArrayFacade_Array(type)); + if(facade->isIncomplete()) { + return nullptr; + } + return facade.dynamicCast(); + } + + return nullptr; +} + + +int NetTypeArrayFacade::getLength(QSharedPointer) +{ + return 0; +} diff --git a/src/native/QmlNet/QmlNet/types/NetTypeArrayFacade.h b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacade.h new file mode 100644 index 00000000..bcae3315 --- /dev/null +++ b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacade.h @@ -0,0 +1,19 @@ +#ifndef NETTYPEARRAYFACADE_H +#define NETTYPEARRAYFACADE_H + +#include +#include + +class NetTypeInfo; +class NetReference; + +class NetTypeArrayFacade +{ +public: + NetTypeArrayFacade(); + virtual ~NetTypeArrayFacade() {} + static QSharedPointer fromType(QSharedPointer type); + virtual int getLength(QSharedPointer reference); +}; + +#endif // NETTYPEARRAYFACADE_H diff --git a/src/native/QmlNet/QmlNet/types/NetTypeArrayFacadeArray.cpp b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacadeArray.cpp new file mode 100644 index 00000000..883c1b39 --- /dev/null +++ b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacadeArray.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include +#include + +NetTypeArrayFacade_Array::NetTypeArrayFacade_Array(QSharedPointer type) : + _isIncomplete(false) +{ + for(int x = 0; x < type->getPropertyCount(); x++) { + QSharedPointer property = type->getProperty(x); + if(property->getPropertyName().compare("Length") == 0) { + _lengthProperty = property; + } + } + + if(_lengthProperty == nullptr) { + _isIncomplete = true; + return; + } +} + +bool NetTypeArrayFacade_Array::isIncomplete() +{ + return _isIncomplete; +} + +int NetTypeArrayFacade_Array::getLength(QSharedPointer reference) +{ + QSharedPointer result = QSharedPointer(new NetVariant()); + readProperty(_lengthProperty, reference, result); + return result->getInt(); +} diff --git a/src/native/QmlNet/QmlNet/types/NetTypeArrayFacadeArray.h b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacadeArray.h new file mode 100644 index 00000000..0364cf12 --- /dev/null +++ b/src/native/QmlNet/QmlNet/types/NetTypeArrayFacadeArray.h @@ -0,0 +1,20 @@ +#ifndef NETTYPEARRAYFACADEARRAY_H +#define NETTYPEARRAYFACADEARRAY_H + +#include + +class NetMethodInfo; +class NetPropertyInfo; + +class NetTypeArrayFacade_Array : public NetTypeArrayFacade +{ +public: + NetTypeArrayFacade_Array(QSharedPointer type); + bool isIncomplete(); + int getLength(QSharedPointer reference); +private: + bool _isIncomplete; + QSharedPointer _lengthProperty; +}; + +#endif // NETTYPEARRAYFACADEARRAY_H diff --git a/src/native/QmlNet/QmlNet/types/NetTypeInfo.cpp b/src/native/QmlNet/QmlNet/types/NetTypeInfo.cpp index 9e5983dc..421f0d4f 100644 --- a/src/native/QmlNet/QmlNet/types/NetTypeInfo.cpp +++ b/src/native/QmlNet/QmlNet/types/NetTypeInfo.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include NetTypeInfo::NetTypeInfo(QString fullTypeName) : @@ -10,6 +11,7 @@ NetTypeInfo::NetTypeInfo(QString fullTypeName) : _fullTypeName(fullTypeName), _variantType(NetVariantTypeEnum_Invalid), _isArray(false), + _arrayFacadeLoaded(false), _lazyLoaded(false), _isLoading(false) { @@ -121,6 +123,17 @@ QSharedPointer NetTypeInfo::getSignal(int index) { return _signals.at(index); } +QSharedPointer NetTypeInfo::getArrayFacade() +{ + if(_arrayFacadeLoaded) { + return _arrayFacade; + } + ensureLoaded(); + _arrayFacade = NetTypeArrayFacade::fromType(sharedFromThis()); + _arrayFacadeLoaded = true; + return _arrayFacade; +} + bool NetTypeInfo::isLoaded() { return _lazyLoaded; } diff --git a/src/native/QmlNet/QmlNet/types/NetTypeInfo.h b/src/native/QmlNet/QmlNet/types/NetTypeInfo.h index a829b6f6..e97faf46 100644 --- a/src/native/QmlNet/QmlNet/types/NetTypeInfo.h +++ b/src/native/QmlNet/QmlNet/types/NetTypeInfo.h @@ -10,6 +10,7 @@ class NetMethodInfo; class NetPropertyInfo; class NetSignalInfo; +class NetTypeArrayFacade; class NetTypeInfo : public QEnableSharedFromThis { public: @@ -45,6 +46,8 @@ public: int getSignalCount(); QSharedPointer getSignal(int index); + QSharedPointer getArrayFacade(); + bool isLoaded(); bool isLoading(); void ensureLoaded(); @@ -61,6 +64,8 @@ private: QList> _methodsStatic; QList> _properties; QList> _signals; + QSharedPointer _arrayFacade; + bool _arrayFacadeLoaded; bool _lazyLoaded; bool _isLoading; }; diff --git a/src/native/QmlNet/QmlNet/types/types.pri b/src/native/QmlNet/QmlNet/types/types.pri index a7f56cf5..c16dfd50 100644 --- a/src/native/QmlNet/QmlNet/types/types.pri +++ b/src/native/QmlNet/QmlNet/types/types.pri @@ -6,7 +6,9 @@ SOURCES += \ $$PWD/NetPropertyInfo.cpp \ $$PWD/NetReference.cpp \ $$PWD/NetSignalInfo.cpp \ - $$PWD/NetDelegate.cpp + $$PWD/NetDelegate.cpp \ + $$PWD/NetTypeArrayFacade.cpp \ + $$PWD/NetTypeArrayFacadeArray.cpp HEADERS += \ $$PWD/NetTypeInfo.h \ @@ -16,4 +18,6 @@ HEADERS += \ $$PWD/NetPropertyInfo.h \ $$PWD/NetReference.h \ $$PWD/NetSignalInfo.h \ - $$PWD/NetDelegate.h + $$PWD/NetDelegate.h \ + $$PWD/NetTypeArrayFacade.h \ + $$PWD/NetTypeArrayFacadeArray.h diff --git a/src/net/Qml.Net/Internal/Helpers.cs b/src/net/Qml.Net/Internal/Helpers.cs index ee7dffc3..ef7b230a 100644 --- a/src/net/Qml.Net/Internal/Helpers.cs +++ b/src/net/Qml.Net/Internal/Helpers.cs @@ -19,6 +19,10 @@ namespace Qml.Net.Internal { return false; } + if (type.Name == "Array") + { + return false; + } return true; }