put upper bound on size of serilized action parameters so they'll fit in MTU

This commit is contained in:
Seth Alves 2015-06-26 12:11:34 -07:00
parent 6a39aecdd4
commit d09588b7fa
2 changed files with 20 additions and 13 deletions

View file

@ -29,6 +29,7 @@
#include "EntityActionFactoryInterface.h" #include "EntityActionFactoryInterface.h"
bool EntityItem::_sendPhysicsUpdates = true; bool EntityItem::_sendPhysicsUpdates = true;
int EntityItem::_maxActionDataSize = 800;
EntityItem::EntityItem(const EntityItemID& entityItemID) : EntityItem::EntityItem(const EntityItemID& entityItemID) :
_type(EntityTypes::Unknown), _type(EntityTypes::Unknown),
@ -1373,8 +1374,11 @@ bool EntityItem::addAction(EntitySimulation* simulation, EntityActionPointer act
assert(action->getOwnerEntity().get() == this); assert(action->getOwnerEntity().get() == this);
simulation->addAction(action); simulation->addAction(action);
serializeActionData(); bool success = serializeActionData();
return true; if (!success) {
removeAction(simulation, actionID);
}
return success;
} }
bool EntityItem::updateAction(EntitySimulation* simulation, const QUuid& actionID, const QVariantMap& arguments) { 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(); _objectActionsLock.unlock();
bool success = action->updateArguments(arguments); bool success = action->updateArguments(arguments);
if (success) { if (success) {
serializeActionData(); success = serializeActionData();
} }
return success; return success;
} }
@ -1400,14 +1404,13 @@ bool EntityItem::removeAction(EntitySimulation* simulation, const QUuid& actionI
_objectActionsLock.unlock(); _objectActionsLock.unlock();
action->setOwnerEntity(nullptr); action->setOwnerEntity(nullptr);
action->removeFromSimulation(simulation); action->removeFromSimulation(simulation);
serializeActionData(); return serializeActionData();
return true;
} }
_objectActionsLock.unlock(); _objectActionsLock.unlock();
return false; return false;
} }
void EntityItem::clearActions(EntitySimulation* simulation) { bool EntityItem::clearActions(EntitySimulation* simulation) {
_objectActionsLock.lockForWrite(); _objectActionsLock.lockForWrite();
QHash<QUuid, EntityActionPointer>::iterator i = _objectActions.begin(); QHash<QUuid, EntityActionPointer>::iterator i = _objectActions.begin();
while (i != _objectActions.end()) { while (i != _objectActions.end()) {
@ -1418,7 +1421,7 @@ void EntityItem::clearActions(EntitySimulation* simulation) {
action->removeFromSimulation(simulation); action->removeFromSimulation(simulation);
} }
_objectActionsLock.unlock(); _objectActionsLock.unlock();
serializeActionData(); return serializeActionData();
} }
void EntityItem::setActionData(QByteArray actionData) { void EntityItem::setActionData(QByteArray actionData) {
@ -1457,9 +1460,7 @@ void EntityItem::setActionData(QByteArray actionData) {
if (entityTree) { if (entityTree) {
EntityItemPointer entity = entityTree->findEntityByEntityItemID(_id); EntityItemPointer entity = entityTree->findEntityByEntityItemID(_id);
if (actionFactory->factoryBA(simulation, entity, serializedAction)) { actionFactory->factoryBA(simulation, entity, serializedAction);
// XXX something
}
} }
} }
} }
@ -1486,7 +1487,7 @@ void EntityItem::setActionData(QByteArray actionData) {
} }
void EntityItem::serializeActionData() { bool EntityItem::serializeActionData() {
_objectActionsLock.lockForRead(); _objectActionsLock.lockForRead();
if (_objectActions.size() == 0) { if (_objectActions.size() == 0) {
_objectActionsLock.unlock(); _objectActionsLock.unlock();
@ -1508,7 +1509,12 @@ void EntityItem::serializeActionData() {
QDataStream ds(&result, QIODevice::WriteOnly); QDataStream ds(&result, QIODevice::WriteOnly);
ds << serializedActions; ds << serializedActions;
if (result.size() >= _maxActionDataSize) {
return false;
}
_actionData = result; _actionData = result;
return true;
} }

View file

@ -378,7 +378,7 @@ public:
bool addAction(EntitySimulation* simulation, EntityActionPointer action); bool addAction(EntitySimulation* simulation, EntityActionPointer action);
bool updateAction(EntitySimulation* simulation, const QUuid& actionID, const QVariantMap& arguments); bool updateAction(EntitySimulation* simulation, const QUuid& actionID, const QVariantMap& arguments);
bool removeAction(EntitySimulation* simulation, const QUuid& actionID); bool removeAction(EntitySimulation* simulation, const QUuid& actionID);
void clearActions(EntitySimulation* simulation); bool clearActions(EntitySimulation* simulation);
void setActionData(QByteArray actionData); void setActionData(QByteArray actionData);
const QByteArray getActionData() const; const QByteArray getActionData() const;
bool hasActions() { return !_objectActions.empty(); } bool hasActions() { return !_objectActions.empty(); }
@ -455,9 +455,10 @@ protected:
void* _physicsInfo = nullptr; // set by EntitySimulation void* _physicsInfo = nullptr; // set by EntitySimulation
bool _simulated; // set by EntitySimulation bool _simulated; // set by EntitySimulation
void serializeActionData(); bool serializeActionData();
QReadWriteLock _objectActionsLock; QReadWriteLock _objectActionsLock;
QHash<QUuid, EntityActionPointer> _objectActions; QHash<QUuid, EntityActionPointer> _objectActions;
static int _maxActionDataSize;
QByteArray _actionData; QByteArray _actionData;
}; };