- add compressed network messages for nmtLaunch and nmtBroadCastSetup (not backward compatible)
This commit is contained in:
parent
888254400e
commit
eb15f8d701
|
@ -18,6 +18,7 @@
|
||||||
#include "platform_util.h"
|
#include "platform_util.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "network_protocol.h"
|
#include "network_protocol.h"
|
||||||
|
#include "compression_utils.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
@ -682,7 +683,8 @@ void NetworkMessageReady::fromEndian() {
|
||||||
// =====================================================
|
// =====================================================
|
||||||
|
|
||||||
NetworkMessageLaunch::NetworkMessageLaunch() {
|
NetworkMessageLaunch::NetworkMessageLaunch() {
|
||||||
messageType=-1;
|
messageType = -1;
|
||||||
|
compressedLength = 0;
|
||||||
for(unsigned int i = 0; i < (unsigned int)maxFactionCRCCount; ++i) {
|
for(unsigned int i = 0; i < (unsigned int)maxFactionCRCCount; ++i) {
|
||||||
data.factionNameList[i] = "";
|
data.factionNameList[i] = "";
|
||||||
data.factionCRCList[i] = 0;
|
data.factionCRCList[i] = 0;
|
||||||
|
@ -695,6 +697,7 @@ NetworkMessageLaunch::NetworkMessageLaunch() {
|
||||||
|
|
||||||
NetworkMessageLaunch::NetworkMessageLaunch(const GameSettings *gameSettings,int8 messageType) {
|
NetworkMessageLaunch::NetworkMessageLaunch(const GameSettings *gameSettings,int8 messageType) {
|
||||||
this->messageType = messageType;
|
this->messageType = messageType;
|
||||||
|
compressedLength = 0;
|
||||||
|
|
||||||
data.mapCRC = gameSettings->getMapCRC();
|
data.mapCRC = gameSettings->getMapCRC();
|
||||||
data.tilesetCRC = gameSettings->getTilesetCRC();
|
data.tilesetCRC = gameSettings->getTilesetCRC();
|
||||||
|
@ -1342,7 +1345,46 @@ bool NetworkMessageLaunch::receive(Socket* socket) {
|
||||||
//printf("Receive NetworkMessageLaunch\n");
|
//printf("Receive NetworkMessageLaunch\n");
|
||||||
bool result = false;
|
bool result = false;
|
||||||
if(useOldProtocol == true) {
|
if(useOldProtocol == true) {
|
||||||
result = NetworkMessage::receive(socket, &data, sizeof(data), true);
|
//printf("UnCompressed launch packet before read compressed size\n");
|
||||||
|
result = NetworkMessage::receive(socket, &compressedLength, sizeof(compressedLength), true);
|
||||||
|
//printf("UnCompressed launch packet after read compressed size: %d\n",compressedLength);
|
||||||
|
|
||||||
|
if(result == true && compressedLength > 0) {
|
||||||
|
//printf("UnCompressed launch packet before: %u after: %d\n",compressedLength,(int)getDataSize());
|
||||||
|
|
||||||
|
unsigned char *compressedMessage = new unsigned char[compressedLength+1];
|
||||||
|
memset(compressedMessage,0,compressedLength+1);
|
||||||
|
|
||||||
|
result = NetworkMessage::receive(socket, compressedMessage, compressedLength, true);
|
||||||
|
//printf("UnCompressed launch packet READ returned: %d\n",result);
|
||||||
|
|
||||||
|
if(result == true) {
|
||||||
|
//printf("UnCompressed launch packet before decompress\n");
|
||||||
|
|
||||||
|
// printf("\n");
|
||||||
|
// const unsigned char *buf = static_cast<const unsigned char *>(compressedMessage);
|
||||||
|
// for(unsigned int index = 0; index < (unsigned int)compressedLength; ++index) {
|
||||||
|
// printf("%u[%X][%d] ",index,buf[index],buf[index]);
|
||||||
|
// if(index % 10 == 0) {
|
||||||
|
// printf("\n");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// printf("\n");
|
||||||
|
|
||||||
|
unsigned long buffer_size = compressedLength;
|
||||||
|
std::pair<unsigned char *,unsigned long> decompressedBuffer =
|
||||||
|
Shared::CompressionUtil::extractMemoryToMemory(compressedMessage, buffer_size, maxNetworkMessageSize);
|
||||||
|
unsigned char *decompressed_buffer = decompressedBuffer.first;
|
||||||
|
memcpy(&data,decompressed_buffer,decompressedBuffer.second);
|
||||||
|
delete [] decompressed_buffer;
|
||||||
|
|
||||||
|
//printf("SUCCESS UnCompressed launch packet before: %u after: %lu\n",compressedLength,decompressedBuffer.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(result == true) {
|
||||||
|
//printf("Normal launch packet detected (uncompressed)\n");
|
||||||
|
result = NetworkMessage::receive(socket, &data, sizeof(data), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unsigned char *buf = new unsigned char[getPackedSize()+1];
|
unsigned char *buf = new unsigned char[getPackedSize()+1];
|
||||||
|
@ -1380,6 +1422,20 @@ bool NetworkMessageLaunch::receive(Socket* socket) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned char * NetworkMessageLaunch::getData() {
|
||||||
|
unsigned char *buffer = new unsigned char[getDataSize()];
|
||||||
|
memcpy(buffer,&data,getDataSize());
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<unsigned char *,unsigned long> NetworkMessageLaunch::getCompressedMessage() {
|
||||||
|
unsigned char *buffer = this->getData();
|
||||||
|
std::pair<unsigned char *,unsigned long> result =
|
||||||
|
Shared::CompressionUtil::compressMemoryToMemory(buffer,getDataSize());
|
||||||
|
delete [] buffer;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void NetworkMessageLaunch::send(Socket* socket) {
|
void NetworkMessageLaunch::send(Socket* socket) {
|
||||||
//printf("Sending NetworkMessageLaunch\n");
|
//printf("Sending NetworkMessageLaunch\n");
|
||||||
|
|
||||||
|
@ -1396,8 +1452,28 @@ void NetworkMessageLaunch::send(Socket* socket) {
|
||||||
toEndian();
|
toEndian();
|
||||||
|
|
||||||
if(useOldProtocol == true) {
|
if(useOldProtocol == true) {
|
||||||
//NetworkMessage::send(socket, &messageType, sizeof(messageType));
|
////NetworkMessage::send(socket, &messageType, sizeof(messageType));
|
||||||
NetworkMessage::send(socket, &data, sizeof(data), messageType);
|
//NetworkMessage::send(socket, &data, sizeof(data), messageType);
|
||||||
|
|
||||||
|
std::pair<unsigned char *,unsigned long> compressionResult = getCompressedMessage();
|
||||||
|
compressedLength = compressionResult.second;
|
||||||
|
//printf("Compressed launch packet before: %d after: %lu\n",(int)getDataSize(),compressionResult.second);
|
||||||
|
|
||||||
|
// printf("\n");
|
||||||
|
// const unsigned char *buf = static_cast<const unsigned char *>(compressionResult.first);
|
||||||
|
// for(unsigned int index = 0; index < (unsigned int)compressionResult.second; ++index) {
|
||||||
|
// printf("%u[%X][%d] ",index,buf[index],buf[index]);
|
||||||
|
// if(index % 10 == 0) {
|
||||||
|
// printf("\n");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// printf("\n");
|
||||||
|
|
||||||
|
NetworkMessage::send(socket, &messageType, sizeof(messageType));
|
||||||
|
NetworkMessage::send(socket, &compressedLength, sizeof(compressedLength));
|
||||||
|
NetworkMessage::send(socket, compressionResult.first, compressionResult.second);
|
||||||
|
delete [] compressionResult.first;
|
||||||
|
//printf("Compressed launch packet SENT\n");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unsigned char *buf = packMessage();
|
unsigned char *buf = packMessage();
|
||||||
|
|
|
@ -49,6 +49,7 @@ enum NetworkMessageType {
|
||||||
nmtMarkCell,
|
nmtMarkCell,
|
||||||
nmtUnMarkCell,
|
nmtUnMarkCell,
|
||||||
nmtHighlightCell,
|
nmtHighlightCell,
|
||||||
|
// nmtCompressedPacket,
|
||||||
|
|
||||||
nmtCount
|
nmtCount
|
||||||
};
|
};
|
||||||
|
@ -62,6 +63,7 @@ enum NetworkGameStateType {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int maxLanguageStringSize= 60;
|
static const int maxLanguageStringSize= 60;
|
||||||
|
static const int maxNetworkMessageSize= 20000;
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
// class NetworkMessage
|
// class NetworkMessage
|
||||||
|
@ -113,6 +115,7 @@ public:
|
||||||
|
|
||||||
virtual void send(Socket* socket) = 0;
|
virtual void send(Socket* socket) = 0;
|
||||||
virtual size_t getDataSize() const = 0;
|
virtual size_t getDataSize() const = 0;
|
||||||
|
virtual unsigned char * getData() { return NULL; }
|
||||||
|
|
||||||
virtual NetworkMessageType getNetworkMessageType() const = 0;
|
virtual NetworkMessageType getNetworkMessageType() const = 0;
|
||||||
|
|
||||||
|
@ -313,7 +316,8 @@ private:
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int8 messageType;
|
int8 messageType;
|
||||||
struct Data{
|
uint32 compressedLength;
|
||||||
|
struct Data {
|
||||||
NetworkString<maxStringSize> description;
|
NetworkString<maxStringSize> description;
|
||||||
NetworkString<maxSmallStringSize> map;
|
NetworkString<maxSmallStringSize> map;
|
||||||
NetworkString<maxSmallStringSize> tileset;
|
NetworkString<maxSmallStringSize> tileset;
|
||||||
|
@ -364,7 +368,7 @@ private:
|
||||||
};
|
};
|
||||||
void toEndian();
|
void toEndian();
|
||||||
void fromEndian();
|
void fromEndian();
|
||||||
|
std::pair<unsigned char *,unsigned long> getCompressedMessage();
|
||||||
private:
|
private:
|
||||||
Data data;
|
Data data;
|
||||||
|
|
||||||
|
@ -379,6 +383,7 @@ public:
|
||||||
NetworkMessageLaunch(const GameSettings *gameSettings,int8 messageType);
|
NetworkMessageLaunch(const GameSettings *gameSettings,int8 messageType);
|
||||||
|
|
||||||
virtual size_t getDataSize() const { return sizeof(Data); }
|
virtual size_t getDataSize() const { return sizeof(Data); }
|
||||||
|
virtual unsigned char * getData();
|
||||||
|
|
||||||
virtual NetworkMessageType getNetworkMessageType() const {
|
virtual NetworkMessageType getNetworkMessageType() const {
|
||||||
return nmtLaunch;
|
return nmtLaunch;
|
||||||
|
@ -1203,7 +1208,6 @@ public:
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
|
||||||
}}//end namespace
|
}}//end namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,6 +20,8 @@ namespace Shared{ namespace CompressionUtil{
|
||||||
|
|
||||||
bool compressFileToZIPFile(string inFile, string outFile, int compressionLevel=5);
|
bool compressFileToZIPFile(string inFile, string outFile, int compressionLevel=5);
|
||||||
bool extractFileFromZIPFile(string inFile, string outFile);
|
bool extractFileFromZIPFile(string inFile, string outFile);
|
||||||
|
std::pair<unsigned char *,unsigned long> compressMemoryToMemory(unsigned char *input, unsigned long input_len, int compressionLevel=5);
|
||||||
|
std::pair<unsigned char *,unsigned long> extractMemoryToMemory(unsigned char *input, unsigned long input_len, unsigned long max_output_len);
|
||||||
|
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|
|
@ -324,4 +324,39 @@ bool extractFileFromZIPFile(string inFile, string outFile) {
|
||||||
return(result == EXIT_SUCCESS ? true : false);
|
return(result == EXIT_SUCCESS ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<unsigned char *,unsigned long> compressMemoryToMemory(unsigned char *input, unsigned long input_len, int compressionLevel) {
|
||||||
|
// Like compress() but with more control, level may range from 0 (storing) to 9 (max. compression)
|
||||||
|
unsigned long compressed_buffer_len = input_len + 100;
|
||||||
|
unsigned char *compressed_buffer = new unsigned char[compressed_buffer_len+1];
|
||||||
|
memset(compressed_buffer,0,compressed_buffer_len+1);
|
||||||
|
|
||||||
|
unsigned char *decompressed_buffer = new unsigned char[input_len+1];
|
||||||
|
memcpy(decompressed_buffer,input,input_len);
|
||||||
|
|
||||||
|
//printf("compress2 start size: %lu\n",input_len);
|
||||||
|
int result = compress2(compressed_buffer, &compressed_buffer_len, decompressed_buffer, input_len, compressionLevel);
|
||||||
|
//printf("compress2 returned: %d start size: %lu end size: %lu\n",result,input_len,compressed_buffer_len);
|
||||||
|
delete [] decompressed_buffer;
|
||||||
|
|
||||||
|
return make_pair(compressed_buffer,compressed_buffer_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<unsigned char *,unsigned long> extractMemoryToMemory(unsigned char *input, unsigned long input_len, unsigned long max_output_len) {
|
||||||
|
// Like compress() but with more control, level may range from 0 (storing) to 9 (max. compression)
|
||||||
|
unsigned long decompressed_buffer_len = max_output_len;
|
||||||
|
unsigned char *decompressed_buffer = new unsigned char[decompressed_buffer_len+1];
|
||||||
|
memset(decompressed_buffer,0,decompressed_buffer_len+1);
|
||||||
|
//printf("#1uncompress start size: %lu\n",input_len);
|
||||||
|
|
||||||
|
unsigned char *compressed_buffer = new unsigned char[input_len+1];
|
||||||
|
memcpy(compressed_buffer,input,input_len);
|
||||||
|
|
||||||
|
//printf("#2uncompress start size: %lu\n",input_len);
|
||||||
|
int result = uncompress(decompressed_buffer, &decompressed_buffer_len, compressed_buffer, input_len);
|
||||||
|
//printf("uncompress returned: %d start size: %lu end size: %lu\n",result,input_len,decompressed_buffer_len);
|
||||||
|
delete [] compressed_buffer;
|
||||||
|
|
||||||
|
return make_pair(decompressed_buffer,decompressed_buffer_len);
|
||||||
|
}
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
Loading…
Reference in New Issue