Working on server sessions.

This commit is contained in:
Andrzej Kapolka 2013-12-28 18:27:37 -08:00
parent b986d91217
commit 97e7340ba6
5 changed files with 112 additions and 3 deletions

View file

@ -9,8 +9,10 @@
#include <QTimer>
#include <Logging.h>
#include <PacketHeaders.h>
#include "MetavoxelServer.h"
#include "Session.h"
MetavoxelServer::MetavoxelServer(const unsigned char* dataBuffer, int numBytes) :
ThreadedAssignment(dataBuffer, numBytes) {
@ -37,5 +39,34 @@ void MetavoxelServer::run() {
}
void MetavoxelServer::processDatagram(const QByteArray& dataByteArray, const HifiSockAddr& senderSockAddr) {
NodeList::getInstance()->processNodeData(senderSockAddr, (unsigned char*)dataByteArray.data(), dataByteArray.size());
switch (dataByteArray.at(0)) {
case PACKET_TYPE_METAVOXEL_DATA:
processData(dataByteArray, senderSockAddr);
break;
default:
NodeList::getInstance()->processNodeData(senderSockAddr, (unsigned char*)dataByteArray.data(), dataByteArray.size());
break;
}
}
void MetavoxelServer::processData(const QByteArray& data, const HifiSockAddr& sender) {
// get the header size
int headerSize = numBytesForPacketHeader((unsigned char*)data.constData());
// read the session id
const int UUID_BYTES = 16;
if (data.size() < headerSize + UUID_BYTES) {
qWarning() << "Metavoxel data too short [size=" << data.size() << ", sender=" << sender << "]\n";
return;
}
QUuid sessionId = QUuid::fromRfc4122(QByteArray::fromRawData(data.constData() + headerSize, UUID_BYTES));
// forward to session, creating if necessary
Session*& session = _sessions[sessionId];
if (!session) {
session = new Session(this);
}
session->receivedData(QByteArray::fromRawData(data.constData() + headerSize + UUID_BYTES,
data.size() - headerSize - UUID_BYTES), sender);
}

View file

@ -2,17 +2,22 @@
// MetavoxelServer.h
// hifi
//
// Created by Andrzej Kapolka on 12/28/2013.
// Created by Andrzej Kapolka on 12/18/13.
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
//
#ifndef __hifi__MetavoxelServer__
#define __hifi__MetavoxelServer__
#include <QHash>
#include <QUuid>
#include <ThreadedAssignment.h>
#include <MetavoxelData.h>
class Session;
/// Maintains a shared metavoxel system, accepting change requests and broadcasting updates.
class MetavoxelServer : public ThreadedAssignment {
Q_OBJECT
@ -27,7 +32,11 @@ public:
private:
void processData(const QByteArray& data, const HifiSockAddr& sender);
MetavoxelData _data;
QHash<QUuid, Session*> _sessions;
};
#endif /* defined(__hifi__MetavoxelServer__) */

View file

@ -0,0 +1,29 @@
//
// Session.cpp
// hifi
//
// Created by Andrzej Kapolka on 12/28/13.
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
//
#include "MetavoxelServer.h"
#include "Session.h"
Session::Session(MetavoxelServer* server) :
QObject(server),
_server(server) {
connect(&_sequencer, SIGNAL(readyToWrite(const QByteArray&)), SLOT(sendData(const QByteArray&)));
connect(&_sequencer, SIGNAL(readyToRead(Bitstream&)), SLOT(readPacket(Bitstream&)));
}
void Session::receivedData(const QByteArray& data, const HifiSockAddr& sender) {
// process through sequencer
_sequencer.receivedDatagram(data);
}
void Session::sendData(const QByteArray& data) {
}
void Session::readPacket(Bitstream& in) {
}

View file

@ -0,0 +1,39 @@
//
// Session.h
// hifi
//
// Created by Andrzej Kapolka on 12/28/13.
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
//
#ifndef __hifi__Session__
#define __hifi__Session__
#include <DatagramSequencer.h>
class HifiSockAddr;
class MetavoxelServer;
/// Contains the state of a single client session.
class Session : public QObject {
Q_OBJECT
public:
Session(MetavoxelServer* server);
void receivedData(const QByteArray& data, const HifiSockAddr& sender);
private slots:
void sendData(const QByteArray& data);
void readPacket(Bitstream& in);
private:
MetavoxelServer* _server;
DatagramSequencer _sequencer;
};
#endif /* defined(__hifi__Session__) */

View file

@ -703,7 +703,8 @@ Node* NodeList::addOrUpdateNode(const QUuid& uuid, char nodeType,
node->lock();
if (node->getType() == NODE_TYPE_AUDIO_MIXER ||
node->getType() == NODE_TYPE_VOXEL_SERVER) {
node->getType() == NODE_TYPE_VOXEL_SERVER ||
node->getType() == NODE_TYPE_METAVOXEL_SERVER) {
// until the Audio class also uses our nodeList, we need to update
// the lastRecvTimeUsecs for the audio mixer so it doesn't get killed and re-added continously
node->setLastHeardMicrostamp(usecTimestampNow());