00001
00008 #ifndef _GSTREAM_H_
00009
00010 #define _GSTREAM_H_
00011
00012 #include "GDom.h"
00013
00015 LgiFunc int GStreamPrint(GStreamI *s, char *fmt, ...);
00016
00026 class LgiClass GStream : virtual public GStreamI, public GDom
00027 {
00028 public:
00029 virtual ~GStream() {}
00030
00033 virtual int Open
00034 (
00036 char *Str = 0,
00038 int Int = 0
00039 )
00040 {
00041 return 0;
00042 }
00043
00045 virtual bool IsOpen()
00046 {
00047 return false;
00048 }
00049
00052 virtual int Close()
00053 {
00054 return 0;
00055 }
00056
00059 virtual int64 GetSize() { return -1; }
00060
00063 virtual int64 SetSize(int64 Size) { return -1; }
00064
00067 virtual int64 GetPos() { return -1; }
00068
00071 virtual int64 SetPos(int64 Pos) { return -1; }
00072
00075 virtual int Read(void *Buffer, int Size, int Flags = 0) { return 0; }
00076
00079 virtual int Write(void *Buffer, int Size, int Flags = 0) { return 0; }
00080
00084 virtual GStreamI *Clone() { return 0; }
00085
00087 virtual int Print(char *Format, ...);
00088 };
00089
00091 class LgiClass GStreamEnd
00092 {
00093 public:
00094 virtual ~GStreamEnd() {}
00095
00097 virtual void Reset() {}
00098
00104 virtual int IsEnd
00105 (
00107 void *Data,
00109 int Len
00110 ) = 0;
00111 };
00112
00114 class LgiClass GLinePrefix : public GStreamEnd
00115 {
00116 bool Start;
00117 int Pos;
00118 char *At;
00119 char *Prefix;
00120 bool Eol;
00121
00122 public:
00124 GLinePrefix
00125 (
00127 char *p,
00130 bool eol = true
00131 );
00132
00133 ~GLinePrefix();
00134
00135 void Reset();
00136 int IsEnd(void *s, int Len);
00137 };
00138
00140 class LgiClass GEndOfLine : public GStreamEnd
00141 {
00142 public:
00143 int IsEnd(void *s, int Len);
00144 };
00145
00147 class LgiClass GStreamer
00148 {
00149 int StartTime;
00150 int EndTime;
00151 int Total;
00152 int Size;
00153 char *Buf;
00154
00155 public:
00157 GStreamer
00158 (
00159
00160 int BufSize = 4 << 10
00161 );
00162 virtual ~GStreamer();
00163
00164
00165 int GetRate();
00166 int GetTotal();
00167 int GetElapsedTime();
00168 };
00169
00171 class LgiClass GPullStreamer : public GStreamer
00172 {
00173 public:
00174 virtual int Pull(GStreamI *Source, GStreamEnd *End = 0) = 0;
00175 };
00176
00178 class LgiClass GPushStreamer : public GStreamer
00179 {
00180 public:
00181 virtual int Push(GStreamI *Dest, GStreamEnd *End = 0) = 0;
00182 };
00183
00185 class LgiClass GCopyStreamer
00186 {
00187 public:
00188 virtual int Copy(GStreamI *Source, GStreamI *Dest, GStreamEnd *End = 0);
00189 };
00190
00192 class LgiClass GMemStream : public GStream
00193 {
00194 char *Mem;
00195 int64 Len, Pos, Alloc;
00196 bool Own;
00197 int GrowBlockSize;
00198
00199 void _Init();
00200
00201 public:
00203 GMemStream();
00205 GMemStream
00206 (
00208 GStreamI *Src,
00210 int64 Start,
00212 int64 Len
00213 );
00215 GMemStream
00216 (
00218 void *Mem,
00220 int64 Len,
00222 bool Copy = true
00223 );
00225 GMemStream
00226 (
00227 int GrowBlockSize
00228 );
00229
00230 ~GMemStream();
00231 bool IsOpen() { return Mem != 0; }
00232 int Close();
00233 int64 GetSize() { return Len; }
00234 int64 GetPos() { return Pos; }
00235 int64 SetPos(int64 p) { return Pos = p; }
00236
00238 int Open(char *Str, int Int);
00240 int64 SetSize(int64 Size);
00241
00242 bool IsOk();
00243 int Read(void *Buffer, int Size, int Flags = 0);
00244 int Write(void *Buffer, int Size, int Flags = 0);
00245 int Write(GStream *Out, int Size);
00246 GStreamI *Clone();
00247 };
00248
00251 class LgiClass GProxyStream : public GStreamI
00252 {
00253 protected:
00254 GStreamI *s;
00255
00256 public:
00257 GProxyStream(GStreamI *p)
00258 {
00259 s = p;
00260 }
00261
00262 int Open(char *Str, int Int) { return s->Open(Str, Int); }
00263 bool IsOpen() { return s->IsOpen(); }
00264 int Close() { return s->Close(); }
00265 int64 GetSize() { return s->GetSize(); }
00266 int64 SetSize(int64 Size) { return s->SetSize(Size); }
00267 int64 GetPos() { return s->GetPos(); }
00268 int64 SetPos(int64 Pos) { return s->SetPos(Pos); }
00269 int Read(void *b, int l, int f = 0) { return s->Read(b, l, f); }
00270 int Write(void *b, int l, int f = 0) { return s->Write(b, l, f); }
00271 bool GetValue(char *n, GVariant &v) { return s->GetValue(n, v); }
00272 bool SetValue(char *n, GVariant &v) { return s->SetValue(n, v); }
00273
00274 GStreamI *Clone() { return new GProxyStream(s); }
00275 };
00276
00280 class LgiClass GTempStream : public GProxyStream
00281 {
00282 GStream Null;
00283 int MaxMemSize;
00284
00285 protected:
00286 class GMemStream *Mem;
00287 class GFile *Tmp;
00288 char *TmpFolder;
00289
00290 public:
00291 GTempStream(char *TmpFolder = 0, int maxMemSize = 1 << 20);
00292 ~GTempStream();
00293
00294 int GetMaxMemSize() { return MaxMemSize; }
00295 int Write(void *Buffer, int Size, int Flags = 0);
00296 void Empty();
00297 };
00298
00299 #endif