00001 #include <string.h>
00002 #include "OutputStream.h"
00003
00004 TOutputStream::TOutputStream()
00005 {
00006 }
00007
00008 TOutputStream::~TOutputStream()
00009 {
00010 Close();
00011 }
00012
00013 void TOutputStream::Close(void)
00014 {
00015 Flush();
00016 }
00017
00018 void TOutputStream::Flush(void)
00019 {
00020 }
00021
00022 void TOutputStream::Writes(void *src, int size)
00023 {
00024 unsigned char *p;
00025 int i;
00026
00027 p = (unsigned char *)src;
00028 for (i = 0; i < size; i++)
00029 Write(p[i]);
00030 }
00031
00032 TFileOutputStream::TFileOutputStream()
00033 {
00034 cacheSize = 1024;
00035 cache = new unsigned char[cacheSize];
00036 cacheDataSize = 0;
00037 fout = NULL;
00038 }
00039
00040 TFileOutputStream::TFileOutputStream(int cs)
00041 {
00042 cacheSize = cs <= 0? 1024 : cs;
00043 cache = new unsigned char[cacheSize];
00044 cacheDataSize = 0;
00045 fout = NULL;
00046 }
00047
00048 TFileOutputStream::~TFileOutputStream()
00049 {
00050 Close();
00051 delete[] cache;
00052 }
00053
00054 bool TFileOutputStream::Open(char *fname)
00055 {
00056 Close();
00057
00058 fout = fopen(fname, "wb");
00059 return fout != NULL;
00060 }
00061
00062 void TFileOutputStream::Close(void)
00063 {
00064 if (fout != NULL)
00065 {
00066 FlushCache();
00067 fclose(fout);
00068 fout = NULL;
00069 }
00070 }
00071
00072 void TFileOutputStream::Flush(void)
00073 {
00074 if (fout != NULL)
00075 {
00076 FlushCache();
00077 fflush(fout);
00078 }
00079 }
00080
00081 int TFileOutputStream::Size(void)
00082 {
00083 return fout == NULL? 0 : ftell(fout) + cacheDataSize;
00084 }
00085
00086 void TFileOutputStream::Write(int n)
00087 {
00088 if (fout != NULL)
00089 {
00090 cache[cacheDataSize++] = n;
00091 if (cacheDataSize >= cacheSize)
00092 FlushCache();
00093 }
00094 }
00095
00096 void TFileOutputStream::FlushCache(void)
00097 {
00098 fwrite(cache, sizeof(char), cacheDataSize, fout);
00099 cacheDataSize = 0;
00100 }
00101
00102 TFilterOutputStream::TFilterOutputStream(TOutputStream *Stream)
00103 {
00104 Out = Stream;
00105 }
00106
00107 TFilterOutputStream::~TFilterOutputStream()
00108 {
00109 Close();
00110 }
00111
00112 void TFilterOutputStream::Close(void)
00113 {
00114 Out->Close();
00115 }
00116
00117 void TFilterOutputStream::Flush(void)
00118 {
00119 Out->Flush();
00120 }
00121
00122 int TFilterOutputStream::Size(void)
00123 {
00124 return Out->Size();
00125 }
00126
00127 void TFilterOutputStream::Write(int n)
00128 {
00129 Out->Write(n);
00130 }
00131
00132 TDataOutputStream::TDataOutputStream(TOutputStream *Stream) : TFilterOutputStream(Stream)
00133 {
00134 }
00135
00136 TDataOutputStream::~TDataOutputStream()
00137 {
00138 }
00139
00140 void TDataOutputStream::WriteChar(char c)
00141 {
00142 Writes(&c, sizeof(char));
00143 }
00144
00145 void TDataOutputStream::WriteDouble(double d)
00146 {
00147 Writes(&d, sizeof(double));
00148 }
00149
00150 void TDataOutputStream::WriteFloat(float f)
00151 {
00152 Writes(&f, sizeof(float));
00153 }
00154
00155 void TDataOutputStream::WriteInt(int n)
00156 {
00157 Writes(&n, sizeof(int));
00158 }
00159
00160 void TDataOutputStream::WriteString(char *str)
00161 {
00162 Writes(str, strlen(str));
00163 }
00164
00165 TCipherOutputStream::TCipherOutputStream(TOutputStream *Stream) : TFilterOutputStream(Stream)
00166 {
00167 key = NULL;
00168 SetKey(NULL);
00169 }
00170
00171 TCipherOutputStream::~TCipherOutputStream()
00172 {
00173 delete[] key;
00174 }
00181 void TCipherOutputStream::SetKey(char *k)
00182 {
00183 delete[] key;
00184
00185 if (k == NULL)
00186 {
00187 key = NULL;
00188 keySize = 0;
00189 return;
00190 }
00191 keySize = strlen(k);
00192 key = new char[keySize + 1];
00193 strcpy(key, k);
00194 index = 0;
00195 }
00200 void TCipherOutputStream::Write(int n)
00201 {
00202 if (keySize != 0)
00203 {
00204 n ^= key[index];
00205 index = (index + 1) % keySize;
00206 }
00207 TFilterOutputStream::Write(n);
00208 }
00209