From d09588b7fafbf81ac1f7fac7bc17f45aecc35c49 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 26 Jun 2015 12:11:34 -0700 Subject: [PATCH] put upper bound on size of serilized action parameters so they'll fit in MTU --- libraries/entities/src/EntityItem.cpp | 28 ++++++++++++++++----------- libraries/entities/src/EntityItem.h | 5 +++-- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index cbbcd8cd8b..ab14e589cf 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -29,6 +29,7 @@ #include "EntityActionFactoryInterface.h" bool EntityItem::_sendPhysicsUpdates = true; +int EntityItem::_maxActionDataSize = 800; EntityItem::EntityItem(const EntityItemID& entityItemID) : _type(EntityTypes::Unknown), @@ -1373,8 +1374,11 @@ bool EntityItem::addAction(EntitySimulation* simulation, EntityActionPointer act assert(action->getOwnerEntity().get() == this); simulation->addAction(action); - serializeActionData(); - return true; + bool success = serializeActionData(); + if (!success) { + removeAction(simulation, actionID); + } + return success; } bool EntityItem::updateAction(EntitySimulation* simulation, const QUuid& actionID, const QVariantMap& arguments) { @@ -1387,7 +1391,7 @@ bool EntityItem::updateAction(EntitySimulation* simulation, const QUuid& actionI _objectActionsLock.unlock(); bool success = action->updateArguments(arguments); if (success) { - serializeActionData(); + success = serializeActionData(); } return success; } @@ -1400,14 +1404,13 @@ bool EntityItem::removeAction(EntitySimulation* simulation, const QUuid& actionI _objectActionsLock.unlock(); action->setOwnerEntity(nullptr); action->removeFromSimulation(simulation); - serializeActionData(); - return true; + return serializeActionData(); } _objectActionsLock.unlock(); return false; } -void EntityItem::clearActions(EntitySimulation* simulation) { +bool EntityItem::clearActions(EntitySimulation* simulation) { _objectActionsLock.lockForWrite(); QHash::iterator i = _objectActions.begin(); while (i != _objectActions.end()) { @@ -1418,7 +1421,7 @@ void EntityItem::clearActions(EntitySimulation* simulation) { action->removeFromSimulation(simulation); } _objectActionsLock.unlock(); - serializeActionData(); + return serializeActionData(); } void EntityItem::setActionData(QByteArray actionData) { @@ -1457,9 +1460,7 @@ void EntityItem::setActionData(QByteArray actionData) { if (entityTree) { EntityItemPointer entity = entityTree->findEntityByEntityItemID(_id); - if (actionFactory->factoryBA(simulation, entity, serializedAction)) { - // XXX something - } + actionFactory->factoryBA(simulation, entity, serializedAction); } } } @@ -1486,7 +1487,7 @@ void EntityItem::setActionData(QByteArray actionData) { } -void EntityItem::serializeActionData() { +bool EntityItem::serializeActionData() { _objectActionsLock.lockForRead(); if (_objectActions.size() == 0) { _objectActionsLock.unlock(); @@ -1508,7 +1509,12 @@ void EntityItem::serializeActionData() { QDataStream ds(&result, QIODevice::WriteOnly); ds << serializedActions; + if (result.size() >= _maxActionDataSize) { + return false; + } + _actionData = result; + return true; } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 99f8bdcc3c..dcf39fe05f 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -378,7 +378,7 @@ public: bool addAction(EntitySimulation* simulation, EntityActionPointer action); bool updateAction(EntitySimulation* simulation, const QUuid& actionID, const QVariantMap& arguments); bool removeAction(EntitySimulation* simulation, const QUuid& actionID); - void clearActions(EntitySimulation* simulation); + bool clearActions(EntitySimulation* simulation); void setActionData(QByteArray actionData); const QByteArray getActionData() const; bool hasActions() { return !_objectActions.empty(); } @@ -455,9 +455,10 @@ protected: void* _physicsInfo = nullptr; // set by EntitySimulation bool _simulated; // set by EntitySimulation - void serializeActionData(); + bool serializeActionData(); QReadWriteLock _objectActionsLock; QHash _objectActions; + static int _maxActionDataSize; QByteArray _actionData; };