-enum izip_status { IZIP_OPEN, IZIP_CLOSED };
-
-const unsigned int CHUNK = 16384;
-
-class CountedBuffer : public classbase
-{
- int bufptr; /* Current tail location */
- unsigned char* buffer; /* Current buffer contents */
- int bufsz; /* Current buffer size */
- int amount_expected; /* Amount of data expected */
- int amount_read; /* Amount of data read so far */
- public:
- CountedBuffer()
- {
- bufsz = 1024;
- buffer = new unsigned char[bufsz + 1];
- bufptr = 0;
- amount_read = 0;
- }
-
- ~CountedBuffer()
- {
- delete[] buffer;
- }
-
- void AddData(unsigned char* data, int data_length)
- {
- if ((data_length + bufptr) > bufsz)
- {
- /* Buffer is too small, enlarge it and copy contents */
- int old_bufsz = bufsz;
- unsigned char* temp = buffer;
-
- bufsz += data_length;
- buffer = new unsigned char[bufsz + 1];
-
- memcpy(buffer, temp, old_bufsz);
-
- delete[] temp;
- }
-
- memcpy(buffer + bufptr, data, data_length);
- bufptr += data_length;
- amount_read += data_length;
-
- if ((!amount_expected) && (amount_read >= 4))
- {
- /* We have enough to read an int */
- int* size = (int*)buffer;
- amount_expected = ntohl(*size);
- }
- }
-
- int GetFrame(unsigned char* frame, int maxsize)
- {
- if (amount_expected)
- {
- /* We know how much we're expecting...
- * Do we have enough yet?
- */
- if ((amount_read - 4) >= amount_expected)
- {
- int amt_ex = amount_expected;
- /* Yes, we have enough now */
- memcpy(frame, buffer + 4, amount_expected > maxsize ? maxsize : amount_expected);
- RemoveFirstFrame();
- return (amt_ex > maxsize) ? maxsize : amt_ex;
- }
- }
- /* Not enough for a frame yet, COME AGAIN! */
- return 0;
- }
-
- void RemoveFirstFrame()
- {
- unsigned char* temp = buffer;
-
- bufsz -= (amount_expected + 4);
- buffer = new unsigned char[bufsz + 1];
-
- memcpy(buffer, temp + amount_expected, bufsz);
-
- amount_read -= (amount_expected + 4);
-
- if (amount_read >= 4)
- {
- /* We have enough to read an int */
- int* size = (int*)buffer;
- amount_expected = ntohl(*size);
- }
- else
- amount_expected = 0;
-
- bufptr = 0;
-
- delete[] temp;
- }
-};
-
-/** Represents an ZIP user's extra data