-static InspIRCd* SI;
-
-enum izip_status { IZIP_OPEN, IZIP_CLOSED };
-
-const unsigned int CHUNK = 128 * 1024;
-
-class CountedBuffer : public classbase
-{
- std::deque<unsigned char> buffer; /* Current buffer contents */
- unsigned int amount_expected; /* Amount of data expected */
- public:
- CountedBuffer()
- {
- amount_expected = 0;
- }
-
- void AddData(unsigned char* data, int data_length)
- {
- SI->Log(DEBUG,"AddData, %d bytes to add", data_length);
- for (int i = 0; i < data_length; i++)
- buffer.push_back(data[i]);
-
- this->NextFrameSize();
- }
-
- void NextFrameSize()
- {
- if ((!amount_expected) && (buffer.size() >= 4))
- {
- /* We have enough to read an int */
- char sz[4];
- for (int i = 0; i < 4; i++)
- {
- sz[i] = buffer.front();
- buffer.pop_front();
- }
- int* size = (int*)sz;
- amount_expected = ntohl(*size);
- }
- }
-
- int GetFrame(unsigned char* frame, int maxsize)
- {
- if (amount_expected)
- {
- SI->Log(DEBUG,"Were expecting a frame of size %d", amount_expected);
- /* We know how much we're expecting...
- * Do we have enough yet?
- */
- if (buffer.size() >= amount_expected)
- {
- int j = 0;
- for (unsigned int i = 0; i < amount_expected; i++, j++)
- {
- frame[i] = buffer.front();
- buffer.pop_front();
- }
-
- amount_expected = 0;
- NextFrameSize();