diff --git a/src/connection.cpp b/src/connection.cpp index 4f5d095e5..633be22f7 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -81,44 +81,36 @@ core::list > makeSplitPacket( u16 seqnum) { // Chunk packets, containing the TYPE_SPLIT header - core::list > chunks; + core::list > chunks; - u32 chunk_header_size = 7; - u32 maximum_data_size = chunksize_max - chunk_header_size; - u32 start = 0; - u32 end = 0; - u32 chunk_num = 0; - do{ - end = start + maximum_data_size - 1; - if(end > data.getSize() - 1) - end = data.getSize() - 1; - - u32 payload_size = end - start + 1; - u32 packet_size = chunk_header_size + payload_size; - - SharedBuffer chunk(packet_size); - - writeU8(&chunk[0], TYPE_SPLIT); - writeU16(&chunk[1], seqnum); - // [3] u16 chunk_count is written at next stage - writeU16(&chunk[5], chunk_num); - memcpy(&chunk[chunk_header_size], &data[start], payload_size); - - chunks.push_back(chunk); - - start = end + 1; - chunk_num++; - } - while(end != data.getSize() - 1); - - u16 chunk_count = chunks.getSize(); - - core::list >::Iterator i = chunks.begin(); - for(; i != chunks.end(); i++) - { - // Write chunk_count - writeU16(&((*i)[3]), chunk_count); - } + u32 chunk_header_size = 7; + u32 maximum_data_size = chunksize_max - chunk_header_size; + u32 start = 0; + // u32 end = 0; + // u32 chunk_num = 0; + u32 data_size = data.getSize(); //calc once, not in the cycle + u32 chunks_count = (u32)(data_size / maximum_data_size) +1; + u32 payload_size = maximum_data_size; + + for(int i=0; i chunk(maximum_data_size + chunk_header_size); + + writeU8(&chunk[0], TYPE_SPLIT); + writeU16(&chunk[1], seqnum); + writeU16(&chunk[3], chunks_count); + writeU16(&chunk[5], i); // chunk number + + start = i * maximum_data_size; // 0, 1*dsize, 2*dsize... + + // on the last iteration + if((i+1) == chunks_count) + // calc the tail which size smaller than maximum_data_size + payload_size = data_size - start; + + memcpy(&chunk[chunk_header_size], &data[start], payload_size); + chunks.push_back(chunk); + } return chunks; }