From 5a96f51602240a9b7e5e66b339ec26f9988cba20 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 19 Aug 2013 10:30:22 -0700 Subject: [PATCH] first cut at JurisdictionSender and related changes --- libraries/voxels/src/JurisdictionSender.cpp | 56 +++++++++++++++++++++ libraries/voxels/src/JurisdictionSender.h | 31 ++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 libraries/voxels/src/JurisdictionSender.cpp create mode 100644 libraries/voxels/src/JurisdictionSender.h diff --git a/libraries/voxels/src/JurisdictionSender.cpp b/libraries/voxels/src/JurisdictionSender.cpp new file mode 100644 index 0000000000..f1afdf444c --- /dev/null +++ b/libraries/voxels/src/JurisdictionSender.cpp @@ -0,0 +1,56 @@ +// +// JurisdictionSender.cpp +// shared +// +// Created by Brad Hefta-Gaub on 8/12/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// +// Threaded or non-threaded jurisdiction Sender for the Application +// + +#include + +#include +#include +#include +#include "JurisdictionSender.h" + + +JurisdictionSender::JurisdictionSender(JurisdictionMap* map, PacketSenderNotify* notify) : + PacketSender(notify, JurisdictionSender::DEFAULT_PACKETS_PER_SECOND), + _jurisdictionMap(map) +{ +} + +bool JurisdictionSender::process() { +//printf("JurisdictionSender::process() _packetsPerSecond=%d\n", _packetsPerSecond); + // add our packet to our own queue, then let the PacketSender class do the rest of the work. + if (_jurisdictionMap) { +//printf("JurisdictionSender::process() _jurisdictionMap=%p\n",_jurisdictionMap); + unsigned char buffer[MAX_PACKET_SIZE]; + unsigned char* bufferOut = &buffer[0]; + ssize_t sizeOut = _jurisdictionMap->packIntoMessage(bufferOut, MAX_PACKET_SIZE); + int nodeCount = 0; + + NodeList* nodeList = NodeList::getInstance(); + for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { + +//printf("JurisdictionSender::process() node loop node=%d type=%c\n",node->getNodeID(), node->getType()); + + // only send to the NodeTypes that are interested in our jurisdiction details + const int numNodeTypes = 1; + const NODE_TYPE nodeTypes[numNodeTypes] = { NODE_TYPE_ANIMATION_SERVER }; + if (node->getActiveSocket() != NULL && memchr(nodeTypes, node->getType(), numNodeTypes)) { + sockaddr* nodeAddress = node->getActiveSocket(); + queuePacket(*nodeAddress, bufferOut, sizeOut); + nodeCount++; + } + } + + // set our packets per second to be the number of nodes + setPacketsPerSecond(nodeCount); + printf("loaded %d packets to send\n", nodeCount); + } + + return PacketSender::process(); +} diff --git a/libraries/voxels/src/JurisdictionSender.h b/libraries/voxels/src/JurisdictionSender.h new file mode 100644 index 0000000000..10d763cfdd --- /dev/null +++ b/libraries/voxels/src/JurisdictionSender.h @@ -0,0 +1,31 @@ +// +// JurisdictionSender.h +// shared +// +// Created by Brad Hefta-Gaub on 8/12/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// +// Voxel Packet Sender +// + +#ifndef __shared__JurisdictionSender__ +#define __shared__JurisdictionSender__ + +#include +#include "JurisdictionMap.h" + +/// Threaded processor for queueing and sending of outbound edit voxel packets. +class JurisdictionSender : public PacketSender { +public: + static const int DEFAULT_PACKETS_PER_SECOND = 1; + + JurisdictionSender(JurisdictionMap* map, PacketSenderNotify* notify = NULL); + + void setJurisdiction(JurisdictionMap* map) { _jurisdictionMap = map; } + + virtual bool process(); + +private: + JurisdictionMap* _jurisdictionMap; +}; +#endif // __shared__JurisdictionSender__