mirror of
https://github.com/lubosz/overte.git
synced 2025-08-05 13:49:11 +02:00
Working on support for streaming Qt enums/flags.
This commit is contained in:
parent
6db385de7a
commit
ac7d23bf54
4 changed files with 76 additions and 5 deletions
|
@ -1203,6 +1203,20 @@ void PropertyReader::readDelta(Bitstream& in, QObject* object, const QObject* re
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PropertyWriter::PropertyWriter(const QMetaProperty& property, const TypeStreamer* streamer) :
|
||||||
|
_property(property),
|
||||||
|
_streamer(streamer) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void PropertyWriter::write(Bitstream& out, const QObject* object) const {
|
||||||
|
_streamer->write(out, _property.read(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PropertyWriter::writeDelta(Bitstream& out, const QObject* object, const QObject* reference) const {
|
||||||
|
_streamer->writeDelta(out, _property.read(object), reference && object->metaObject() == reference->metaObject() ?
|
||||||
|
_property.read(reference) : QVariant());
|
||||||
|
}
|
||||||
|
|
||||||
MetaField::MetaField(const QByteArray& name, const TypeStreamer* streamer) :
|
MetaField::MetaField(const QByteArray& name, const TypeStreamer* streamer) :
|
||||||
_name(name),
|
_name(name),
|
||||||
_streamer(streamer) {
|
_streamer(streamer) {
|
||||||
|
|
|
@ -804,6 +804,21 @@ private:
|
||||||
QMetaProperty _property;
|
QMetaProperty _property;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Contains the information necessary to obtain an object property and write it to the stream.
|
||||||
|
class PropertyWriter {
|
||||||
|
public:
|
||||||
|
|
||||||
|
PropertyWriter(const QMetaProperty& property = QMetaProperty(), const TypeStreamer* streamer = NULL);
|
||||||
|
|
||||||
|
void write(Bitstream& out, const QObject* object) const;
|
||||||
|
void writeDelta(Bitstream& out, const QObject* object, const QObject* reference) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
QMetaProperty _property;
|
||||||
|
const TypeStreamer* _streamer;
|
||||||
|
};
|
||||||
|
|
||||||
/// Describes a metatype field.
|
/// Describes a metatype field.
|
||||||
class MetaField {
|
class MetaField {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -51,6 +51,29 @@ static QByteArray createRandomBytes() {
|
||||||
return createRandomBytes(MIN_BYTES, MAX_BYTES);
|
return createRandomBytes(MIN_BYTES, MAX_BYTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static TestSharedObjectA::TestEnum getRandomTestEnum() {
|
||||||
|
switch (randIntInRange(0, 2)) {
|
||||||
|
case 0: return TestSharedObjectA::FIRST_TEST_ENUM;
|
||||||
|
case 1: return TestSharedObjectA::SECOND_TEST_ENUM;
|
||||||
|
case 2:
|
||||||
|
default: return TestSharedObjectA::THIRD_TEST_ENUM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static TestSharedObjectA::TestFlags getRandomTestFlags() {
|
||||||
|
TestSharedObjectA::TestFlags flags = 0;
|
||||||
|
if (randomBoolean()) {
|
||||||
|
flags |= TestSharedObjectA::FIRST_TEST_FLAG;
|
||||||
|
}
|
||||||
|
if (randomBoolean()) {
|
||||||
|
flags |= TestSharedObjectA::SECOND_TEST_FLAG;
|
||||||
|
}
|
||||||
|
if (randomBoolean()) {
|
||||||
|
flags |= TestSharedObjectA::THIRD_TEST_FLAG;
|
||||||
|
}
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
static TestMessageC createRandomMessageC() {
|
static TestMessageC createRandomMessageC() {
|
||||||
TestMessageC message;
|
TestMessageC message;
|
||||||
message.foo = randomBoolean();
|
message.foo = randomBoolean();
|
||||||
|
@ -64,7 +87,7 @@ static bool testSerialization(Bitstream::MetadataType metadataType) {
|
||||||
QByteArray array;
|
QByteArray array;
|
||||||
QDataStream outStream(&array, QIODevice::WriteOnly);
|
QDataStream outStream(&array, QIODevice::WriteOnly);
|
||||||
Bitstream out(outStream, metadataType);
|
Bitstream out(outStream, metadataType);
|
||||||
SharedObjectPointer testObjectWrittenA = new TestSharedObjectA(randFloat());
|
SharedObjectPointer testObjectWrittenA = new TestSharedObjectA(randFloat(), getRandomTestEnum(), getRandomTestFlags());
|
||||||
out << testObjectWrittenA;
|
out << testObjectWrittenA;
|
||||||
SharedObjectPointer testObjectWrittenB = new TestSharedObjectB(randFloat(), createRandomBytes());
|
SharedObjectPointer testObjectWrittenB = new TestSharedObjectB(randFloat(), createRandomBytes());
|
||||||
out << testObjectWrittenB;
|
out << testObjectWrittenB;
|
||||||
|
@ -175,7 +198,7 @@ bool MetavoxelTests::run() {
|
||||||
|
|
||||||
static SharedObjectPointer createRandomSharedObject() {
|
static SharedObjectPointer createRandomSharedObject() {
|
||||||
switch (randIntInRange(0, 2)) {
|
switch (randIntInRange(0, 2)) {
|
||||||
case 0: return new TestSharedObjectA(randFloat());
|
case 0: return new TestSharedObjectA(randFloat(), getRandomTestEnum(), getRandomTestFlags());
|
||||||
case 1: return new TestSharedObjectB();
|
case 1: return new TestSharedObjectB();
|
||||||
case 2:
|
case 2:
|
||||||
default: return SharedObjectPointer();
|
default: return SharedObjectPointer();
|
||||||
|
@ -393,8 +416,10 @@ void Endpoint::readReliableChannel() {
|
||||||
streamedBytesReceived += bytes.size();
|
streamedBytesReceived += bytes.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
TestSharedObjectA::TestSharedObjectA(float foo) :
|
TestSharedObjectA::TestSharedObjectA(float foo, TestEnum baz, TestFlags bong) :
|
||||||
_foo(foo) {
|
_foo(foo),
|
||||||
|
_baz(baz),
|
||||||
|
_bong(bong) {
|
||||||
sharedObjectsCreated++;
|
sharedObjectsCreated++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,16 +70,31 @@ private:
|
||||||
/// A simple shared object.
|
/// A simple shared object.
|
||||||
class TestSharedObjectA : public SharedObject {
|
class TestSharedObjectA : public SharedObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
Q_ENUMS(TestEnum)
|
||||||
|
Q_FLAGS(TestFlag TestFlags)
|
||||||
Q_PROPERTY(float foo READ getFoo WRITE setFoo NOTIFY fooChanged)
|
Q_PROPERTY(float foo READ getFoo WRITE setFoo NOTIFY fooChanged)
|
||||||
|
Q_PROPERTY(TestEnum baz READ getBaz WRITE setBaz)
|
||||||
|
Q_PROPERTY(TestFlags bong READ getBong WRITE setBong)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Q_INVOKABLE TestSharedObjectA(float foo = 0.0f);
|
enum TestEnum { FIRST_TEST_ENUM, SECOND_TEST_ENUM, THIRD_TEST_ENUM };
|
||||||
|
|
||||||
|
enum TestFlag { NO_TEST_FLAGS = 0x0, FIRST_TEST_FLAG = 0x01, SECOND_TEST_FLAG = 0x02, THIRD_TEST_FLAG = 0x03 };
|
||||||
|
Q_DECLARE_FLAGS(TestFlags, TestFlag)
|
||||||
|
|
||||||
|
Q_INVOKABLE TestSharedObjectA(float foo = 0.0f, TestEnum baz = FIRST_TEST_ENUM, TestFlags bong = 0);
|
||||||
virtual ~TestSharedObjectA();
|
virtual ~TestSharedObjectA();
|
||||||
|
|
||||||
void setFoo(float foo);
|
void setFoo(float foo);
|
||||||
float getFoo() const { return _foo; }
|
float getFoo() const { return _foo; }
|
||||||
|
|
||||||
|
void setBaz(TestEnum baz) { _baz = baz; }
|
||||||
|
TestEnum getBaz() const { return _baz; }
|
||||||
|
|
||||||
|
void setBong(TestFlags bong) { _bong = bong; }
|
||||||
|
TestFlags getBong() const { return _bong; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void fooChanged(float foo);
|
void fooChanged(float foo);
|
||||||
|
@ -87,6 +102,8 @@ signals:
|
||||||
private:
|
private:
|
||||||
|
|
||||||
float _foo;
|
float _foo;
|
||||||
|
TestEnum _baz;
|
||||||
|
TestFlags _bong;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Another simple shared object.
|
/// Another simple shared object.
|
||||||
|
|
Loading…
Reference in a new issue