00001 #include <mem.h>
00002 #include "ByteArrayOutputStream.h"
00003
00004 TByteArrayOutputStream::TByteArrayOutputStream()
00005 {
00006 List = new TMyList();
00007 bufferSize = 1024;
00008 totalSize = writeSize = 0;
00009 }
00010
00011 TByteArrayOutputStream::TByteArrayOutputStream(int size)
00012 {
00013 List = new TMyList();
00014 bufferSize = size;
00015 totalSize = writeSize = 0;
00016 }
00017
00018 TByteArrayOutputStream::~TByteArrayOutputStream()
00019 {
00020 Reset();
00021 delete List;
00022 }
00023
00024 void TByteArrayOutputStream::Reset(void)
00025 {
00026 int i;
00027
00028 for (i = List->count - 1; i >= 0; i--)
00029 delete[] (unsigned char *)List->Items(i);
00030 List->Clear();
00031 totalSize = writeSize = 0;
00032 }
00033
00034 int TByteArrayOutputStream::Size(void)
00035 {
00036 return totalSize;
00037 }
00038
00039 int TByteArrayOutputStream::ToByteArray(void *dst)
00040 {
00041 return ToByteArray(dst, 0, totalSize);
00042 }
00043
00044 int TByteArrayOutputStream::ToByteArray(void *dst, int from, int size)
00045 {
00046 unsigned char *p;
00047 int i, n, result;
00048
00049 if (from >= totalSize)
00050 return 0;
00051
00052 p = (unsigned char *)dst;
00053 result = from + size > totalSize? totalSize - from : size;
00054
00055 i = from / bufferSize;
00056 n = bufferSize - from % bufferSize;
00057 if (n >= result)
00058 n = result;
00059 memcpy(p, (unsigned char *)List->Items(i) + from % bufferSize, n);
00060
00061 if (n == result)
00062 return result;
00063 p += n;
00064 size = result - n;
00065
00066 while (size > bufferSize)
00067 {
00068 memcpy(p, List->Items(++i), bufferSize);
00069 p += bufferSize;
00070 size -= bufferSize;
00071 }
00072 memcpy(p, List->Items(i + 1), size);
00073
00074 return result;
00075 }
00076
00077 void TByteArrayOutputStream::Write(int n)
00078 {
00079 static unsigned char *buffer = NULL;
00080
00081 if (writeSize < bufferSize)
00082 {
00083 if (totalSize == 0)
00084 List->Add(buffer = new unsigned char[bufferSize]);
00085 buffer[writeSize++] = n;
00086 }
00087 else
00088 {
00089 List->Add(buffer = new unsigned char[bufferSize]);
00090 buffer[0] = n;
00091 writeSize = 1;
00092 }
00093 ++totalSize;
00094 }
00095
00096 void TByteArrayOutputStream::WriteTo(TOutputStream *Stream)
00097 {
00098 int i;
00099
00100 if (totalSize == 0)
00101 return;
00102
00103 for (i = 0; i < List->count - 1; i++)
00104 Stream->Writes(List->Items(i), bufferSize);
00105 Stream->Writes(List->Items(i), totalSize - bufferSize * (List->count - 1));
00106 }
00107