18 #include "visiontransfer/datablockprotocol.h" 19 #include "visiontransfer/exceptions.h" 25 #include <arpa/inet.h> 30 DataBlockProtocol::DataBlockProtocol(ProtocolType protType): protType(protType),
31 transferDone(true), rawData(nullptr), rawValidBytes(0),
32 transferOffset(0), transferSize(0), transferSeqNum(0), overwrittenTransferData(0),
33 restoreTransferData(false), receiveDataSize(0), receiveSeqNum(0),
34 unprocessedMsgLength(0), receiveOffset(0), receptionDone(true) {
36 if(protType == PROTOCOL_TCP) {
37 maxPayloadSize = MAX_TCP_BYTES_TRANSFER;
40 maxPayloadSize = MAX_UDP_BYTES_TRANSFER -
sizeof(
unsigned short);
41 minPayloadSize = MIN_UDP_BYTES_TRANSFER;
48 restoreTransferData =
false;
53 restoreTransferData =
false;
60 restoreTransferData =
false;
61 rawValidBytes = min(transferSize, validBytes);
65 if(validBytes >= transferSize) {
66 rawValidBytes = transferSize;
67 }
else if(validBytes < static_cast<int>(
sizeof(
unsigned short))) {
72 rawValidBytes = validBytes -
sizeof(
unsigned short);
83 length = min(maxPayloadSize, rawValidBytes - transferOffset);
84 if(length == 0 || (length < minPayloadSize && rawValidBytes != transferSize)) {
89 unsigned char* buffer = &rawData[transferOffset];
90 transferOffset += length;
92 if(restoreTransferData) {
95 *
reinterpret_cast<unsigned short*
>(&buffer[0]) = overwrittenTransferData;
98 if(protType == PROTOCOL_UDP) {
100 unsigned short* seqNumPtr =
reinterpret_cast<unsigned short*
>(&buffer[length]);
101 overwrittenTransferData = *seqNumPtr;
102 *seqNumPtr = htons(transferSeqNum);
103 length +=
sizeof(
unsigned short);
104 restoreTransferData =
true;
113 return transferOffset >= transferSize;
117 if(size != receiveDataSize) {
118 receiveDataSize = size;
124 if(protType == PROTOCOL_TCP) {
125 bufferSize = size + MAX_TCP_BYTES_TRANSFER +
sizeof(
unsigned short);
127 bufferSize = size + MAX_UDP_BYTES_TRANSFER +
sizeof(
unsigned short);
131 receiveBuffer.resize(bufferSize);
136 if(static_cast<int>(receiveBuffer.size() - receiveOffset) < maxLength) {
142 receptionDone =
false;
147 return &receiveBuffer[receiveOffset];
151 if(receiveOffset + length > static_cast<int>(receiveBuffer.size())) {
158 }
else if(protType == PROTOCOL_UDP) {
162 length -=
sizeof(
unsigned short);
165 unsigned short seqNum = ntohs(
166 *reinterpret_cast<unsigned short*>(&receiveBuffer[receiveOffset + length]));
168 if(seqNum != static_cast<unsigned short>(receiveSeqNum)) {
179 if(unprocessedMsgLength != 0) {
180 if(length + unprocessedMsgLength > MAX_OUTSTANDING_BYTES) {
184 ::memmove(&receiveBuffer[unprocessedMsgLength], &receiveBuffer[0], length);
185 ::memcpy(&receiveBuffer[0], &unprocessedMsgPart[0], unprocessedMsgLength);
186 length += unprocessedMsgLength;
187 unprocessedMsgLength = 0;
192 if(receiveOffset + length > receiveDataSize) {
193 int newLength =
static_cast<int>(receiveDataSize - receiveOffset);
195 if(unprocessedMsgLength != 0 || length - newLength > MAX_OUTSTANDING_BYTES) {
199 unprocessedMsgLength = length - newLength;
200 ::memcpy(unprocessedMsgPart, &receiveBuffer[receiveOffset + newLength], unprocessedMsgLength);
207 receiveOffset += length;
209 if(receiveOffset > static_cast<int>(receiveBuffer.size())) {
217 receptionDone =
true;
226 length = receiveOffset;
227 return &receiveBuffer[0];
Exception class that is used for all protocol exceptions.
void setReceiveDataSize(int size)
Sets the total size of the data that shall be received.
const unsigned char * getTransferMessage(int &length)
Gets the next network message for the current transfer.
unsigned char * getReceivedData(int &length)
Returns the data that has been received for the current data block.
void resetTransfer()
Stops the current transfer.
unsigned char * getNextReceiveBuffer(int maxLength)
Gets a buffer for receiving the next network message.
void resetReception()
Resets the message reception.
bool transferComplete()
Returns true if the current transfer has been completed.
bool processReceivedMessage(int length)
Handles a received network message.
void setTransferData(unsigned char *data, int size, int validBytes=0x7FFFFFFF)
Sets a new chunk of data that should be transferred.
void startTransfer()
Starts the transfer of a new data block.
void finishReception()
Finishes reception of the current data block.
void setTransferValidBytes(int validBytes)
Updates the number of valid bytes in a partial transmission.