add notion of pool and direction to Assignment class

This commit is contained in:
Stephen Birarda 2013-09-04 10:43:16 -07:00
parent f485814a42
commit 29e5eda358
8 changed files with 34 additions and 26 deletions

View file

@ -16,7 +16,7 @@
const int ASSIGNMENT_REQUEST_INTERVAL_USECS = 1 * 1000 * 1000; const int ASSIGNMENT_REQUEST_INTERVAL_USECS = 1 * 1000 * 1000;
int main(int argc, const char* argv[]) { int main(int argc, const char* argv[]) {
// create a NodeList as an unassigned client // create a NodeList as an unassigned client
NodeList* nodeList = NodeList::createInstance(NODE_TYPE_UNASSIGNED); NodeList* nodeList = NodeList::createInstance(NODE_TYPE_UNASSIGNED);
@ -27,17 +27,19 @@ int main(int argc, const char* argv[]) {
unsigned char packetData[MAX_PACKET_SIZE]; unsigned char packetData[MAX_PACKET_SIZE];
ssize_t receivedBytes = 0; ssize_t receivedBytes = 0;
Assignment requestAssignment(Assignment::Request, Assignment::All);
while (true) { while (true) {
if (usecTimestampNow() - usecTimestamp(&lastRequest) >= ASSIGNMENT_REQUEST_INTERVAL_USECS) { if (usecTimestampNow() - usecTimestamp(&lastRequest) >= ASSIGNMENT_REQUEST_INTERVAL_USECS) {
gettimeofday(&lastRequest, NULL); gettimeofday(&lastRequest, NULL);
// send an assignment request to the Nodelist // send an assignment request to the Nodelist
qDebug("Sending assignment request.\n"); qDebug("Sending assignment request.\n");
nodeList->requestAssignment(); nodeList->sendAssignment(requestAssignment);
} }
while (nodeList->getNodeSocket()->receive(packetData, &receivedBytes)) { while (nodeList->getNodeSocket()->receive(packetData, &receivedBytes)) {
if (packetData[0] == PACKET_TYPE_SEND_ASSIGNMENT && packetVersionMatch(packetData)) { if (packetData[0] == PACKET_TYPE_CREATE_ASSIGNMENT && packetVersionMatch(packetData)) {
Assignment::Type assignmentType = (Assignment::Type) *(packetData + numBytesForPacketHeader(packetData)); Assignment::Type assignmentType = (Assignment::Type) *(packetData + numBytesForPacketHeader(packetData));
qDebug() << "Received an assignment of type" << assignmentType << "\n"; qDebug() << "Received an assignment of type" << assignmentType << "\n";

View file

@ -30,7 +30,7 @@ int main(int argc, const char* argv[]) {
UDPSocket serverSocket(ASSIGNMENT_SERVER_PORT); UDPSocket serverSocket(ASSIGNMENT_SERVER_PORT);
unsigned char assignmentPacket[MAX_PACKET_SIZE_BYTES]; unsigned char assignmentPacket[MAX_PACKET_SIZE_BYTES];
int numSendHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_SEND_ASSIGNMENT); int numSendHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_CREATE_ASSIGNMENT);
while (true) { while (true) {
if (serverSocket.receive((sockaddr*) &senderSocket, &senderData, &receivedBytes)) { if (serverSocket.receive((sockaddr*) &senderSocket, &senderData, &receivedBytes)) {
@ -48,16 +48,16 @@ int main(int argc, const char* argv[]) {
// send the assignment // send the assignment
serverSocket.send((sockaddr*) &senderSocket, assignmentPacket, numSendHeaderBytes + sizeof(unsigned char)); serverSocket.send((sockaddr*) &senderSocket, assignmentPacket, numSendHeaderBytes + sizeof(unsigned char));
} }
} else if (senderData[0] == PACKET_TYPE_SEND_ASSIGNMENT && packetVersionMatch(senderData)) { } else if (senderData[0] == PACKET_TYPE_CREATE_ASSIGNMENT && packetVersionMatch(senderData)) {
// assignment server is on a public server // assignment server is on a public server
// assume that the address we now have for the sender is the public address/port // assume that the address we now have for the sender is the public address/port
// and store that with the assignment so it can be given to the requestor later // and store that with the assignment so it can be given to the requestor later
Assignment newAssignment((Assignment::Type) *(senderData + numBytesForPacketHeader(senderData)), senderSocket); // Assignment newAssignment((Assignment::Type) *(senderData + numBytesForPacketHeader(senderData)), senderSocket);
qDebug() << "Received assignment of type " << newAssignment.getType() << "\n"; // qDebug() << "Received assignment of type " << newAssignment.getType() << "\n";
// add this assignment to the queue // add this assignment to the queue
assignmentQueue.push(newAssignment); // assignmentQueue.push(newAssignment);
} }
} }
} }

View file

@ -91,7 +91,7 @@ int main(int argc, const char * argv[])
// we don't have an audio mixer, and we know we need one // we don't have an audio mixer, and we know we need one
// so tell that to the assignment server // so tell that to the assignment server
Assignment mixerAssignment(Assignment::AudioMixer); Assignment mixerAssignment(Assignment::Create, Assignment::AudioMixer);
nodeList->sendAssignment(mixerAssignment); nodeList->sendAssignment(mixerAssignment);
} }

View file

@ -8,12 +8,10 @@
#include "Assignment.h" #include "Assignment.h"
Assignment::Assignment(Assignment::Type type) : _type(type) { Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, const char* pool) :
_direction(direction),
}
Assignment::Assignment(Assignment::Type type, sockaddr_in& senderSocket) :
_type(type), _type(type),
_senderSocket(senderSocket) { _pool(pool)
{
} }

View file

@ -15,17 +15,25 @@ class Assignment {
public: public:
enum Type { enum Type {
AudioMixer AudioMixer,
All
}; };
Assignment(Assignment::Type type); enum Direction {
Assignment(Assignment::Type type, sockaddr_in& senderSocket); Create,
Request
};
Assignment(Assignment::Direction direction, Assignment::Type type, const char* pool = NULL);
Assignment::Direction getDirection() const { return _direction; }
Assignment::Type getType() const { return _type; } Assignment::Type getType() const { return _type; }
const char* getPool() const { return _pool; }
private: private:
Assignment::Direction _direction;
Assignment::Type _type; Assignment::Type _type;
sockaddr_in _senderSocket; const char* _pool;
}; };

View file

@ -371,13 +371,14 @@ const char ASSIGNMENT_SERVER_HOSTNAME[] = "localhost";
const sockaddr_in assignmentServerSocket = socketForHostnameAndHostOrderPort(ASSIGNMENT_SERVER_HOSTNAME, const sockaddr_in assignmentServerSocket = socketForHostnameAndHostOrderPort(ASSIGNMENT_SERVER_HOSTNAME,
ASSIGNMENT_SERVER_PORT); ASSIGNMENT_SERVER_PORT);
void NodeList::requestAssignment() {
_nodeSocket.send((sockaddr*) &assignmentServerSocket, &PACKET_TYPE_REQUEST_ASSIGNMENT, 1);
}
void NodeList::sendAssignment(Assignment& assignment) { void NodeList::sendAssignment(Assignment& assignment) {
unsigned char assignmentPacket[MAX_PACKET_SIZE]; unsigned char assignmentPacket[MAX_PACKET_SIZE];
int numHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_SEND_ASSIGNMENT);
PACKET_TYPE assignmentPacketType = assignment.getDirection() == Assignment::Create
? PACKET_TYPE_CREATE_ASSIGNMENT
: PACKET_TYPE_REQUEST_ASSIGNMENT;
int numHeaderBytes = populateTypeAndVersion(assignmentPacket, assignmentPacketType);
*(assignmentPacket + numHeaderBytes) = assignment.getType(); *(assignmentPacket + numHeaderBytes) = assignment.getType();
_nodeSocket.send((sockaddr*) &assignmentServerSocket, assignmentPacket, numHeaderBytes + sizeof(unsigned char)); _nodeSocket.send((sockaddr*) &assignmentServerSocket, assignmentPacket, numHeaderBytes + sizeof(unsigned char));

View file

@ -96,7 +96,6 @@ public:
void sendDomainServerCheckIn(); void sendDomainServerCheckIn();
int processDomainServerList(unsigned char *packetData, size_t dataBytes); int processDomainServerList(unsigned char *packetData, size_t dataBytes);
void requestAssignment();
void sendAssignment(Assignment& assignment); void sendAssignment(Assignment& assignment);
Node* nodeWithAddress(sockaddr *senderAddress); Node* nodeWithAddress(sockaddr *senderAddress);

View file

@ -36,7 +36,7 @@ const PACKET_TYPE PACKET_TYPE_ENVIRONMENT_DATA = 'e';
const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L'; const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L';
const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C'; const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C';
const PACKET_TYPE PACKET_TYPE_REQUEST_ASSIGNMENT = 'r'; const PACKET_TYPE PACKET_TYPE_REQUEST_ASSIGNMENT = 'r';
const PACKET_TYPE PACKET_TYPE_SEND_ASSIGNMENT = 's'; const PACKET_TYPE PACKET_TYPE_CREATE_ASSIGNMENT = 's';
const PACKET_TYPE PACKET_TYPE_VOXEL_STATS = '#'; const PACKET_TYPE PACKET_TYPE_VOXEL_STATS = '#';
const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION = 'J'; const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION = 'J';
const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION_REQUEST = 'j'; const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION_REQUEST = 'j';