overte/libraries/shared/src/PacketHeaders.cpp
2014-01-28 11:18:37 -08:00

110 lines
3.1 KiB
C++

//
// PacketHeaders.cpp
// hifi
//
// Created by Stephen Birarda on 6/28/13.
// Copyright (c) 2013 HighFidelity, Inc. All rights reserved.
//
#include <stdio.h>
#include <QtCore/QDebug>
#include "PacketHeaders.h"
PACKET_VERSION versionForPacketType(PACKET_TYPE type) {
switch (type) {
case PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO:
case PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO:
return 2;
case PACKET_TYPE_HEAD_DATA:
return 17;
case PACKET_TYPE_OCTREE_STATS:
return 2;
case PACKET_TYPE_DOMAIN:
case PACKET_TYPE_DOMAIN_LIST_REQUEST:
case PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY:
return 2;
case PACKET_TYPE_VOXEL_QUERY:
return 2;
case PACKET_TYPE_VOXEL_SET:
case PACKET_TYPE_VOXEL_SET_DESTRUCTIVE:
case PACKET_TYPE_VOXEL_ERASE:
return 1;
case PACKET_TYPE_VOXEL_DATA:
return 1;
case PACKET_TYPE_JURISDICTION:
return 1;
case PACKET_TYPE_PARTICLE_ADD_OR_EDIT:
return 5;
case PACKET_TYPE_PARTICLE_DATA:
return 9;
case PACKET_TYPE_PING_REPLY:
return 1;
case PACKET_TYPE_DATA_SERVER_GET:
case PACKET_TYPE_DATA_SERVER_PUT:
case PACKET_TYPE_DATA_SERVER_SEND:
case PACKET_TYPE_DATA_SERVER_CONFIRM:
return 1;
default:
return 0;
}
}
bool packetVersionMatch(unsigned char* packetHeader, const HifiSockAddr& senderSockAddr) {
// currently this just checks if the version in the packet matches our return from versionForPacketType
// may need to be expanded in the future for types and versions that take > than 1 byte
if (packetHeader[1] == versionForPacketType(packetHeader[0]) || packetHeader[0] == PACKET_TYPE_STUN_RESPONSE) {
return true;
} else {
qDebug() << "Packet mismatch on" << packetHeader[0] << "- Sender"
<< senderSockAddr << "sent" << qPrintable(QString::number(packetHeader[1])) << "but"
<< qPrintable(QString::number(versionForPacketType(packetHeader[0]))) << "expected.";
return false;
}
}
int populateTypeAndVersion(unsigned char* destinationHeader, PACKET_TYPE type) {
destinationHeader[0] = type;
destinationHeader[1] = versionForPacketType(type);
// return the number of bytes written for pointer pushing
return 2;
}
int numBytesForPacketType(const unsigned char* packetType) {
if (packetType[0] == 255) {
return 1 + numBytesForPacketType(packetType + 1);
} else {
return 1;
}
}
int numBytesForPacketVersion(const unsigned char* packetVersion) {
if (packetVersion[0] == 255) {
return 1 + numBytesForPacketVersion(packetVersion + 1);
} else {
return 1;
}
}
int numBytesForPacketHeader(const unsigned char* packetHeader) {
// int numBytesType = numBytesForPacketType(packetHeader);
// return numBytesType + numBytesForPacketVersion(packetHeader + numBytesType);
// currently this need not be dynamic - there are 2 bytes for each packet header
return 2;
}