View difference between Paste ID: 13hTjwHw and bMykTXuC
SHOW: | | - or go back to the newest paste.
1
// ==========================================
2
// My deflate code is:
3
// ==========================================
4
int ret;
5
z_stream strm = {};
6
7
// 22 byte input: 34 byte output expected.
8
//
9
// -MAX_WBITS = 24 byte output
10
// MAX_WBITS = 30 byte output
11
// MAX_WBITS + 16 = 42 byte output
12
13
ret = deflateInit(&strm, 9); // 9 is maximum compression level
14
if (ret)
15
{
16
	std::stringstream error;
17
	error << "Error " << ret << " occurred with initiating compression.";
18-
	return CreateError("Could not select channel master: Channel is closed."); CreateError(error.str().c_str());
18+
19
}
20
21
unsigned char * output_buffer = (unsigned char *)malloc(SendMsgSize + 256);
22
if (!output_buffer)
23
{
24
	deflateEnd(&strm);
25
	std::stringstream error;
26
	error << "Error with compressing send binary, could not allocate enough memory. Desired " << SendMsgSize + 256 << " bytes.";
27
	return CreateError(error.str().c_str());
28
}
29
30
strm.next_in = (unsigned char *)SendMsg;
31
strm.avail_in = SendMsgSize;
32
33
// Allocate memory for compression
34
strm.avail_out = _msize(output_buffer);
35
strm.next_out = output_buffer;
36
37
ret = deflate(&strm, Z_FINISH);
38
if (ret != Z_STREAM_END)
39
{
40
	std::stringstream error;
41
	error << "Error with compressing send binary, deflate() returned " << ret << ". Zlib error: " << (strm.msg ? strm.msg : "");
42
	free(output_buffer);
43
	deflateEnd(&strm);
44
	return CreateError(error.str().c_str());
45
}
46
47
deflateEnd(&strm);
48
49
void * output_bufferResize = realloc(output_buffer, strm.total_out);
50
if (!output_bufferResize)
51
{
52
	free(output_buffer); // realloc will not free on error
53
	CreateError("Error with compressing send binary, reallocating memory to remove excess space after compression failed.");
54
	return;
55
}
56
free(SendMsg);
57
58
SendMsg = (char *)output_bufferResize;
59
SendMsgSize = strm.total_out;
60
61
62
// ==========================================
63
// When inflating back, I use:
64
// ==========================================
65
z_stream strm = { };
66
int ret = inflateInit(&strm);
67
if (ret)
68
{
69
	std::stringstream error;
70
	error << "Error " << ret << " occurred with initiating decompression.";
71
	return CreateError(error.str().c_str());
72
}
73
74
unsigned char * output_buffer = NULL, *output_buffer_pointer = NULL;
75
strm.next_in = (unsigned char *)receivedMsg.content.data();
76
strm.avail_in = receivedMsg.content.size();
77
// run inflate() on input until output buffer not full, finish
78
// compression if all of source has been read in
79
do {
80
	// Expand memory for decompression
81
	output_buffer_pointer = (unsigned char *)realloc(output_buffer, (output_buffer ? _msize(output_buffer) : 0) + 1024);
82
	if (!output_buffer_pointer)
83
	{
84
		std::stringstream error;
85
		error << "Error with decompression, could not allocate enough memory. Desired "
86
			<< (output_buffer ? _msize(output_buffer) : 0) + 1024 << " bytes.";
87
		free(output_buffer);
88
89
		inflateEnd(&strm);
90
		return CreateError(error.str().c_str());
91
	}
92
93
	output_buffer = output_buffer_pointer;
94
	output_buffer_pointer += _msize(output_buffer) - 1024;
95
	strm.avail_out = 1024;
96
	strm.next_out = output_buffer_pointer;
97
	ret = inflate(&strm, Z_FINISH);
98
	if (ret < Z_OK)
99
	{
100
		std::stringstream error;
101
		error << "Error with decompression, inflate() returned error " << ret
102
			<< ". Zlib error: " << (strm.msg ? strm.msg : "");
103
		free(output_buffer);
104
		inflateEnd(&strm);
105
		return CreateError(error.str().c_str());
106
	}
107
108
} while (strm.avail_in != 0);
109
110
if (ret < 0)
111
{
112
	std::stringstream error;
113
	error << "Error with decompression: " << ret << ". Zlib error: " << (strm.msg ? strm.msg : "");
114
	inflateEnd(&strm);
115
	return CreateError(error.str().c_str());
116
}
117
inflateEnd(&strm);
118
119
// Update data with new message content
120
receivedMsg.content.assign((char *)output_buffer, _msize(output_buffer));