18 #include "visiontransfer/datablockprotocol.h" 19 #include "visiontransfer/exceptions.h" 25 #include <arpa/inet.h> 31 : protType(protType), maxUdpPacketSize(maxUdpPacketSize),
32 transferDone(true), rawData(nullptr), rawValidBytes(0),
33 transferOffset(0), transferSize(0), transferSeqNum(0), overwrittenTransferData(0),
34 restoreTransferData(false), receiveDataSize(0), receiveSeqNum(0),
35 unprocessedMsgLength(0), receiveOffset(0), receptionDone(true) {
37 if(protType == PROTOCOL_TCP) {
38 maxPayloadSize = MAX_TCP_BYTES_TRANSFER;
41 maxPayloadSize = maxUdpPacketSize -
sizeof(
unsigned short);
42 minPayloadSize = maxPayloadSize;
49 restoreTransferData =
false;
54 restoreTransferData =
false;
61 restoreTransferData =
false;
62 rawValidBytes = min(transferSize, validBytes);
66 if(validBytes >= transferSize) {
67 rawValidBytes = transferSize;
68 }
else if(validBytes < static_cast<int>(
sizeof(
unsigned short))) {
73 rawValidBytes = validBytes -
sizeof(
unsigned short);
84 length = min(maxPayloadSize, rawValidBytes - transferOffset);
85 if(length == 0 || (length < minPayloadSize && rawValidBytes != transferSize)) {
90 unsigned char* buffer = &rawData[transferOffset];
91 transferOffset += length;
93 if(restoreTransferData) {
96 *
reinterpret_cast<unsigned short*
>(&buffer[0]) = overwrittenTransferData;
99 if(protType == PROTOCOL_UDP) {
101 unsigned short* seqNumPtr =
reinterpret_cast<unsigned short*
>(&buffer[length]);
102 overwrittenTransferData = *seqNumPtr;
103 *seqNumPtr = htons(transferSeqNum);
104 length +=
sizeof(
unsigned short);
105 restoreTransferData =
true;
114 return transferOffset >= transferSize;
118 if(size != receiveDataSize) {
119 receiveDataSize = size;
128 receiveBuffer.resize(bufferSize);
133 if(protType == PROTOCOL_TCP) {
134 return MAX_TCP_BYTES_TRANSFER;
136 return MAX_UDP_RECEPTION;
141 if(static_cast<int>(receiveBuffer.size() - receiveOffset) < maxLength) {
147 receptionDone =
false;
152 return &receiveBuffer[receiveOffset];
156 if(receiveOffset + length > static_cast<int>(receiveBuffer.size())) {
163 }
else if(protType == PROTOCOL_UDP) {
167 length -=
sizeof(
unsigned short);
170 unsigned short seqNum = ntohs(
171 *reinterpret_cast<unsigned short*>(&receiveBuffer[receiveOffset + length]));
173 if(seqNum != static_cast<unsigned short>(receiveSeqNum)) {
184 if(unprocessedMsgLength != 0) {
185 if(length + unprocessedMsgLength > MAX_OUTSTANDING_BYTES) {
189 ::memmove(&receiveBuffer[unprocessedMsgLength], &receiveBuffer[0], length);
190 ::memcpy(&receiveBuffer[0], &unprocessedMsgPart[0], unprocessedMsgLength);
191 length += unprocessedMsgLength;
192 unprocessedMsgLength = 0;
197 if(receiveOffset + length > receiveDataSize) {
198 int newLength =
static_cast<int>(receiveDataSize - receiveOffset);
200 if(unprocessedMsgLength != 0 || length - newLength > MAX_OUTSTANDING_BYTES) {
204 unprocessedMsgLength = length - newLength;
205 ::memcpy(unprocessedMsgPart, &receiveBuffer[receiveOffset + newLength], unprocessedMsgLength);
212 receiveOffset += length;
214 if(receiveOffset > static_cast<int>(receiveBuffer.size())) {
222 receptionDone =
true;
231 length = receiveOffset;
232 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.
DataBlockProtocol(ProtocolType protType, int maxUdpPacketSize)
Creates a new instance.
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.
int getMaxReceptionSize() const
Returns the maximum paload size that can be recedived.
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.