aboutsummaryrefslogtreecommitdiff
path: root/src/serialization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialization.cpp')
-rw-r--r--src/serialization.cpp180
1 files changed, 99 insertions, 81 deletions
diff --git a/src/serialization.cpp b/src/serialization.cpp
index 64d5cefcc..310604f54 100644
--- a/src/serialization.cpp
+++ b/src/serialization.cpp
@@ -26,29 +26,29 @@ with this program; if not, write to the Free Software Foundation, Inc.,
/* report a zlib or i/o error */
void zerr(int ret)
{
- dstream << "zerr: ";
- switch (ret) {
- case Z_ERRNO:
- if (ferror(stdin))
- dstream << "error reading stdin" << std::endl;
- if (ferror(stdout))
- dstream << "error writing stdout" << std::endl;
- break;
- case Z_STREAM_ERROR:
- dstream << "invalid compression level" << std::endl;
- break;
- case Z_DATA_ERROR:
- dstream << "invalid or incomplete deflate data" << std::endl;
- break;
- case Z_MEM_ERROR:
- dstream << "out of memory" << std::endl;
- break;
- case Z_VERSION_ERROR:
- dstream << "zlib version mismatch!" << std::endl;
+ dstream<<"zerr: ";
+ switch (ret) {
+ case Z_ERRNO:
+ if (ferror(stdin))
+ dstream<<"error reading stdin"<<std::endl;
+ if (ferror(stdout))
+ dstream<<"error writing stdout"<<std::endl;
+ break;
+ case Z_STREAM_ERROR:
+ dstream<<"invalid compression level"<<std::endl;
+ break;
+ case Z_DATA_ERROR:
+ dstream<<"invalid or incomplete deflate data"<<std::endl;
+ break;
+ case Z_MEM_ERROR:
+ dstream<<"out of memory"<<std::endl;
+ break;
+ case Z_VERSION_ERROR:
+ dstream<<"zlib version mismatch!"<<std::endl;
break;
default:
- dstream << "return value = " << ret << std::endl;
- }
+ dstream<<"return value = "<<ret<<std::endl;
+ }
}
void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level)
@@ -64,28 +64,30 @@ void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level)
z.opaque = Z_NULL;
ret = deflateInit(&z, level);
- if (ret != Z_OK)
+ if(ret != Z_OK)
throw SerializationError("compressZlib: deflateInit failed");
// Point zlib to our input buffer
- z.next_in = (Bytef *)&data[0];
+ z.next_in = (Bytef*)&data[0];
z.avail_in = data_size;
// And get all output
- for (;;) {
- z.next_out = (Bytef *)output_buffer;
+ for(;;)
+ {
+ z.next_out = (Bytef*)output_buffer;
z.avail_out = bufsize;
status = deflate(&z, Z_FINISH);
- if (status == Z_NEED_DICT || status == Z_DATA_ERROR ||
- status == Z_MEM_ERROR) {
+ if(status == Z_NEED_DICT || status == Z_DATA_ERROR
+ || status == Z_MEM_ERROR)
+ {
zerr(status);
throw SerializationError("compressZlib: deflate failed");
}
int count = bufsize - z.avail_out;
- if (count)
+ if(count)
os.write(output_buffer, count);
// This determines zlib has given all output
- if (status == Z_STREAM_END)
+ if(status == Z_STREAM_END)
break;
}
@@ -94,7 +96,7 @@ void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level)
void compressZlib(const std::string &data, std::ostream &os, int level)
{
- compressZlib((u8 *)data.c_str(), data.size(), os, level);
+ compressZlib((u8*)data.c_str(), data.size(), os, level);
}
void decompressZlib(std::istream &is, std::ostream &os, size_t limit)
@@ -114,16 +116,17 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit)
z.opaque = Z_NULL;
ret = inflateInit(&z);
- if (ret != Z_OK)
+ if(ret != Z_OK)
throw SerializationError("dcompressZlib: inflateInit failed");
z.avail_in = 0;
- // dstream<<"initial fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
+ //dstream<<"initial fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
- for (;;) {
+ for(;;)
+ {
int output_size = bufsize;
- z.next_out = (Bytef *)output_buffer;
+ z.next_out = (Bytef*)output_buffer;
z.avail_out = output_size;
if (limit) {
@@ -137,50 +140,53 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit)
}
}
- if (z.avail_in == 0) {
- z.next_in = (Bytef *)input_buffer;
+ if(z.avail_in == 0)
+ {
+ z.next_in = (Bytef*)input_buffer;
is.read(input_buffer, bufsize);
input_buffer_len = is.gcount();
z.avail_in = input_buffer_len;
- // dstream<<"read fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
+ //dstream<<"read fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
}
- if (z.avail_in == 0) {
- // dstream<<"z.avail_in == 0"<<std::endl;
+ if(z.avail_in == 0)
+ {
+ //dstream<<"z.avail_in == 0"<<std::endl;
break;
}
- // dstream<<"1 z.avail_in="<<z.avail_in<<std::endl;
+ //dstream<<"1 z.avail_in="<<z.avail_in<<std::endl;
status = inflate(&z, Z_NO_FLUSH);
- // dstream<<"2 z.avail_in="<<z.avail_in<<std::endl;
+ //dstream<<"2 z.avail_in="<<z.avail_in<<std::endl;
bytes_read += is.gcount() - z.avail_in;
- // dstream<<"bytes_read="<<bytes_read<<std::endl;
+ //dstream<<"bytes_read="<<bytes_read<<std::endl;
- if (status == Z_NEED_DICT || status == Z_DATA_ERROR ||
- status == Z_MEM_ERROR) {
+ if(status == Z_NEED_DICT || status == Z_DATA_ERROR
+ || status == Z_MEM_ERROR)
+ {
zerr(status);
throw SerializationError("decompressZlib: inflate failed");
}
int count = output_size - z.avail_out;
- // dstream<<"count="<<count<<std::endl;
- if (count)
+ //dstream<<"count="<<count<<std::endl;
+ if(count)
os.write(output_buffer, count);
bytes_written += count;
- if (status == Z_STREAM_END) {
- // dstream<<"Z_STREAM_END"<<std::endl;
+ if(status == Z_STREAM_END)
+ {
+ //dstream<<"Z_STREAM_END"<<std::endl;
- // dstream<<"z.avail_in="<<z.avail_in<<std::endl;
- // dstream<<"fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
+ //dstream<<"z.avail_in="<<z.avail_in<<std::endl;
+ //dstream<<"fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
// Unget all the data that inflate didn't take
is.clear(); // Just in case EOF is set
- for (u32 i = 0; i < z.avail_in; i++) {
+ for(u32 i=0; i < z.avail_in; i++)
+ {
is.unget();
- if (is.fail() || is.bad()) {
- dstream << "unget #" << i << " failed"
- << std::endl;
- dstream << "fail=" << is.fail()
- << " bad=" << is.bad() << std::endl;
- throw SerializationError(
- "decompressZlib: unget failed");
+ if(is.fail() || is.bad())
+ {
+ dstream<<"unget #"<<i<<" failed"<<std::endl;
+ dstream<<"fail="<<is.fail()<<" bad="<<is.bad()<<std::endl;
+ throw SerializationError("decompressZlib: unget failed");
}
}
@@ -193,42 +199,51 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit)
void compress(const SharedBuffer<u8> &data, std::ostream &os, u8 version)
{
- if (version >= 11) {
- compressZlib(*data, data.getSize(), os);
+ if(version >= 11)
+ {
+ compressZlib(*data ,data.getSize(), os);
return;
}
- if (data.getSize() == 0)
+ if(data.getSize() == 0)
return;
// Write length (u32)
u8 tmp[4];
writeU32(tmp, data.getSize());
- os.write((char *)tmp, 4);
+ os.write((char*)tmp, 4);
// We will be writing 8-bit pairs of more_count and byte
u8 more_count = 0;
u8 current_byte = data[0];
- for (u32 i = 1; i < data.getSize(); i++) {
- if (data[i] != current_byte || more_count == 255) {
+ for(u32 i=1; i<data.getSize(); i++)
+ {
+ if(
+ data[i] != current_byte
+ || more_count == 255
+ )
+ {
// write count and byte
- os.write((char *)&more_count, 1);
- os.write((char *)&current_byte, 1);
+ os.write((char*)&more_count, 1);
+ os.write((char*)&current_byte, 1);
more_count = 0;
current_byte = data[i];
- } else {
+ }
+ else
+ {
more_count++;
}
}
// write count and byte
- os.write((char *)&more_count, 1);
- os.write((char *)&current_byte, 1);
+ os.write((char*)&more_count, 1);
+ os.write((char*)&current_byte, 1);
}
void decompress(std::istream &is, std::ostream &os, u8 version)
{
- if (version >= 11) {
+ if(version >= 11)
+ {
decompressZlib(is, os);
return;
}
@@ -236,28 +251,31 @@ void decompress(std::istream &is, std::ostream &os, u8 version)
// Read length (u32)
u8 tmp[4];
- is.read((char *)tmp, 4);
+ is.read((char*)tmp, 4);
u32 len = readU32(tmp);
// We will be reading 8-bit pairs of more_count and byte
u32 count = 0;
- for (;;) {
- u8 more_count = 0;
- u8 byte = 0;
+ for(;;)
+ {
+ u8 more_count=0;
+ u8 byte=0;
- is.read((char *)&more_count, 1);
+ is.read((char*)&more_count, 1);
- is.read((char *)&byte, 1);
+ is.read((char*)&byte, 1);
- if (is.eof())
+ if(is.eof())
throw SerializationError("decompress: stream ended halfway");
- for (s32 i = 0; i < (u16)more_count + 1; i++)
- os.write((char *)&byte, 1);
+ for(s32 i=0; i<(u16)more_count+1; i++)
+ os.write((char*)&byte, 1);
- count += (u16)more_count + 1;
+ count += (u16)more_count+1;
- if (count == len)
+ if(count == len)
break;
}
}
+
+