Showing the changes to libraries/entities/src/SimulationOwner.cpp (1 of 12 files). Show all
Unified · Split
| @@ -0,0 +1,188 @@ | ||
| 1 | +// | |
| 2 | +// SimulationOwner.cpp | |
| 3 | +// libraries/entities/src | |
| 4 | +// | |
| 5 | +// Created by Andrew Meadows on 2015.06.19 | |
| 6 | +// Copyright 2015 High Fidelity, Inc. | |
| 7 | +// | |
| 8 | +// Distributed under the Apache License, Version 2.0. | |
| 9 | +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | |
| 10 | +// | |
| 11 | + | |
| 12 | +#include "SimulationOwner.h" | |
| 13 | + | |
| 14 | +#include <assert.h> | |
| 15 | + | |
| 16 | +#include <NumericalConstants.h> | |
| 17 | + | |
| 18 | +// static | |
| 19 | +const int SimulationOwner::NUM_BYTES_ENCODED = NUM_BYTES_RFC4122_UUID + 1; | |
| 20 | + | |
| 21 | + | |
| 22 | +SimulationOwner::SimulationOwner(const SimulationOwner& other) | |
| 23 | + : _id(other._id), _priority(other._priority), _expiry(other._expiry) { | |
| 24 | +} | |
| 25 | + | |
| 26 | +QByteArray SimulationOwner::toByteArray() const { | |
| 27 | + QByteArray data = _id.toRfc4122(); | |
| 28 | + data.append(_priority); | |
| 29 | + return data; | |
| 30 | +} | |
| 31 | + | |
| 32 | +bool SimulationOwner::fromByteArray(const QByteArray& data) { | |
| 33 | + if (data.size() == NUM_BYTES_ENCODED) { | |
| 34 | + QByteArray idBytes = data.left(NUM_BYTES_RFC4122_UUID); | |
| 35 | + _id = QUuid::fromRfc4122(idBytes); | |
| 36 | + _priority = data[NUM_BYTES_RFC4122_UUID]; | |
| 37 | + return true; | |
| 38 | + } | |
| 39 | + return false; | |
| 40 | +} | |
| 41 | + | |
| 42 | +void SimulationOwner::clear() { | |
| 43 | + _id = QUuid(); | |
| 44 | + _priority = 0; | |
| 45 | + _expiry = 0; | |
| 46 | +} | |
| 47 | + | |
| 48 | +void SimulationOwner::setPriority(quint8 priority) { | |
| 49 | + _priority = priority; | |
| 50 | + if (_priority == MAX_SIMULATOR_PRIORITY) { | |
| 51 | + // we extend the the expiry whenever we set MAX_SIMULATOR_PRIORITY | |
| 52 | + updateExpiry(); | |
| 53 | + } else if (_priority == 0) { | |
| 54 | + // when priority is zero we clear everything | |
| 55 | + _expiry = 0; | |
| 56 | + _id = QUuid(); | |
| 57 | + } | |
| 58 | +} | |
| 59 | + | |
| 60 | +bool SimulationOwner::setID(const QUuid& id) { | |
| 61 | + if (_id != id) { | |
| 62 | + _id = id; | |
| 63 | + updateExpiry(); | |
| 64 | + if (_id.isNull()) { | |
| 65 | + // when id is null we clear everything | |
| 66 | + _priority = 0; | |
| 67 | + _expiry = 0; | |
| 68 | + } | |
| 69 | + return true; | |
| 70 | + } | |
| 71 | + return false; | |
| 72 | +} | |
| 73 | + | |
| 74 | +bool SimulationOwner::set(const QUuid& id, quint8 priority) { | |
| 75 | + setPriority(priority); | |
| 76 | + return setID(id); | |
| 77 | +} | |
| 78 | + | |
| 79 | +bool SimulationOwner::set(const SimulationOwner& owner) { | |
| 80 | + setPriority(owner._priority); | |
| 81 | + return setID(owner._id); | |
| 82 | +} | |
| 83 | + | |
| 84 | +void SimulationOwner::updateExpiry() { | |
| 85 | + const quint64 OWNERSHIP_LOCKOUT_EXPIRY = USECS_PER_SECOND / 5; | |
| 86 | + _expiry = usecTimestampNow() + OWNERSHIP_LOCKOUT_EXPIRY; | |
| 87 | +} | |
| 88 | + | |
| 89 | +// TODO: move this test code out | |
| 90 | +// static debug | |
| 91 | +void SimulationOwner::test() { | |
| 92 | + { // test default constructor | |
| 93 | + SimulationOwner simOwner; | |
| 94 | + if (!simOwner.isNull()) { | |
| 95 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : SimulationOwner should be NULL" << std::endl; | |
| 96 | + } | |
| 97 | + | |
| 98 | + if (simOwner.getPriority() != 0) { | |
| 99 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : unexpeced SimulationOwner priority" << std::endl; | |
| 100 | + } | |
| 101 | + } | |
| 102 | + | |
| 103 | + { // test set constructor | |
| 104 | + QUuid id = QUuid::createUuid(); | |
| 105 | + quint8 priority = 128; | |
| 106 | + SimulationOwner simOwner(id, priority); | |
| 107 | + if (simOwner.isNull()) { | |
| 108 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : SimulationOwner should NOT be NULL" << std::endl; | |
| 109 | + } | |
| 110 | + | |
| 111 | + if (simOwner.getID() != id) { | |
| 112 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : SimulationOwner with unexpected id" << std::endl; | |
| 113 | + } | |
| 114 | + | |
| 115 | + if (simOwner.getPriority() != priority) { | |
| 116 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : unexpeced SimulationOwner priority" << std::endl; | |
| 117 | + } | |
| 118 | + | |
| 119 | + QUuid otherID = QUuid::createUuid(); | |
| 120 | + if (simOwner.getID() == otherID) { | |
| 121 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : SimulationOwner with unexpected id" << std::endl; | |
| 122 | + } | |
| 123 | + } | |
| 124 | + | |
| 125 | + { // test set() | |
| 126 | + QUuid id = QUuid::createUuid(); | |
| 127 | + quint8 priority = 1; | |
| 128 | + SimulationOwner simOwner; | |
| 129 | + simOwner.set(id, priority); | |
| 130 | + if (simOwner.isNull()) { | |
| 131 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : SimulationOwner should NOT be NULL" << std::endl; | |
| 132 | + } | |
| 133 | + | |
| 134 | + if (simOwner.getID() != id) { | |
| 135 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : SimulationOwner with unexpected id" << std::endl; | |
| 136 | + } | |
| 137 | + | |
| 138 | + if (simOwner.getPriority() != priority) { | |
| 139 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : unexpeced SimulationOwner priority" << std::endl; | |
| 140 | + } | |
| 141 | + } | |
| 142 | + | |
| 143 | + { // test encode/decode | |
| 144 | + SimulationOwner ownerA(QUuid::createUuid(), 1); | |
| 145 | + SimulationOwner ownerB(QUuid::createUuid(), 2); | |
| 146 | + | |
| 147 | + QByteArray data = ownerA.toByteArray(); | |
| 148 | + ownerB.fromByteArray(data); | |
| 149 | + | |
| 150 | + if (ownerA.getID() != ownerB.getID()) { | |
| 151 | + std::cout << __FILE__ << ":" << __LINE__ << " ERROR : ownerA._id should be equal to ownerB._id" << std::endl; | |
| 152 | + } | |
| 153 | + } | |
| 154 | +} | |
| 155 | + | |
| 156 | +bool SimulationOwner::operator==(const SimulationOwner& other) { | |
| 157 | + return (_id == other._id && _priority == other._priority); | |
| 158 | +} | |
| 159 | + | |
| 160 | +bool SimulationOwner::operator!=(const SimulationOwner& other) { | |
| 161 | + return (_id != other._id && _priority != other._priority); | |
| 162 | +} | |
| 163 | + | |
| 164 | +SimulationOwner& SimulationOwner::operator=(const SimulationOwner& other) { | |
| 165 | + _priority = other._priority; | |
| 166 | + if (_priority == 0) { | |
| 167 | + _id = QUuid(); | |
| 168 | + _expiry = 0; | |
| 169 | + } else { | |
| 170 | + if (_id != other._id) { | |
| 171 | + updateExpiry(); | |
| 172 | + } | |
| 173 | + _id = other._id; | |
| 174 | + } | |
| 175 | + return *this; | |
| 176 | +} | |
| 177 | + | |
| 178 | +// friend of SimulationOwner | |
| 179 | +std::ostream& operator<<(std::ostream& s, const SimulationOwner& simOwner) { | |
| 180 | + s << "{ id : " << simOwner._id.toString().toStdString() << ", priority : " << (int)simOwner._priority << " }"; | |
| 181 | + return s; | |
| 182 | +} | |
| 183 | + | |
| 184 | +QDebug& operator<<(QDebug& d, const SimulationOwner& simOwner) { | |
| 185 | + d << "{ id : " << simOwner << ", priority : " << (int)simOwner._priority << " }"; | |
| 186 | + return d; | |
| 187 | +} | |
| 188 | + | |