00001
00008 #ifndef _GSTREAM_H_
00009
00010 #define _GSTREAM_H_
00011
00012 #include "GDom.h"
00013
00015 LgiFunc int GStreamPrint(GStreamI *s, const char *fmt, ...);
00016
00018 class LgiClass GStream : virtual public GStreamI, public GDom
00019 {
00020 public:
00021 virtual ~GStream() {}
00022
00023 int Read(void *Ptr, int Size, int Flags = 0) { return 0; }
00024 int Write(const void *Ptr, int Size, int Flags = 0) { return 0; }
00025
00027 virtual int Print(const char *Format, ...);
00028 };
00029
00031 class LgiClass GStreamEnd
00032 {
00033 public:
00034 virtual ~GStreamEnd() {}
00035
00037 virtual void Reset() {}
00038
00044 virtual int IsEnd
00045 (
00047 void *Data,
00049 int Len
00050 ) = 0;
00051 };
00052
00054 class LgiClass GLinePrefix : public GStreamEnd
00055 {
00056 bool Start;
00057 int Pos;
00058 char *At;
00059 char *Prefix;
00060 bool Eol;
00061
00062 public:
00064 GLinePrefix
00065 (
00067 char *p,
00070 bool eol = true
00071 );
00072
00073 ~GLinePrefix();
00074
00075 void Reset();
00076 int IsEnd(void *s, int Len);
00077 };
00078
00080 class LgiClass GEndOfLine : public GStreamEnd
00081 {
00082 public:
00083 int IsEnd(void *s, int Len);
00084 };
00085
00087 class LgiClass GStreamer
00088 {
00089 int StartTime;
00090 int EndTime;
00091 int Total;
00092 int Size;
00093 char *Buf;
00094
00095 public:
00097 GStreamer
00098 (
00099
00100 int BufSize = 4 << 10
00101 );
00102 virtual ~GStreamer();
00103
00104
00105 int GetRate();
00106 int GetTotal();
00107 int GetElapsedTime();
00108 };
00109
00111 class LgiClass GPullStreamer : public GStreamer
00112 {
00113 public:
00114 virtual int Pull(GStreamI *Source, GStreamEnd *End = 0) = 0;
00115 };
00116
00118 class LgiClass GPushStreamer : public GStreamer
00119 {
00120 public:
00121 virtual int Push(GStreamI *Dest, GStreamEnd *End = 0) = 0;
00122 };
00123
00125 class LgiClass GCopyStreamer
00126 {
00127 public:
00128 virtual int Copy(GStreamI *Source, GStreamI *Dest, GStreamEnd *End = 0);
00129 };
00130
00132 class LgiClass GMemStream : public GStream
00133 {
00134 char *Mem;
00135 int64 Len, Pos, Alloc;
00136 bool Own;
00137 int GrowBlockSize;
00138
00139 void _Init();
00140
00141 public:
00143 GMemStream();
00145 GMemStream
00146 (
00148 GStreamI *Src,
00150 int64 Start,
00152 int64 Len
00153 );
00155 GMemStream
00156 (
00158 void *Mem,
00160 int64 Len,
00162 bool Copy = true
00163 );
00165 GMemStream
00166 (
00167 int GrowBlockSize
00168 );
00169
00170 ~GMemStream();
00171 bool IsOpen() { return Mem != 0; }
00172 int Close();
00173 int64 GetSize() { return Len; }
00174 int64 GetPos() { return Pos; }
00175 int64 SetPos(int64 p) { return Pos = p; }
00176
00178 int Open(const char *Str, int Int);
00180 int64 SetSize(int64 Size);
00181
00182 bool IsOk();
00183 int Read(void *Buffer, int Size, int Flags = 0);
00184 int Write(const void *Buffer, int Size, int Flags = 0);
00185 int Write(GStream *Out, int Size);
00186 GStreamI *Clone();
00187 };
00188
00191 class LgiClass GProxyStream : public GStreamI
00192 {
00193 protected:
00194 GStreamI *s;
00195
00196 public:
00197 GProxyStream(GStreamI *p)
00198 {
00199 s = p;
00200 }
00201
00202 int Open(const char *Str, int Int) { return s->Open(Str, Int); }
00203 bool IsOpen() { return s->IsOpen(); }
00204 int Close() { return s->Close(); }
00205 int64 GetSize() { return s->GetSize(); }
00206 int64 SetSize(int64 Size) { return s->SetSize(Size); }
00207 int64 GetPos() { return s->GetPos(); }
00208 int64 SetPos(int64 Pos) { return s->SetPos(Pos); }
00209 int Read(void *b, int l, int f = 0) { return s->Read(b, l, f); }
00210 int Write(const void *b, int l, int f = 0) { return s->Write(b, l, f); }
00211 bool GetValue(char *n, GVariant &v) { return s->GetValue(n, v); }
00212 bool SetValue(char *n, GVariant &v) { return s->SetValue(n, v); }
00213
00214 GStreamI *Clone() { return new GProxyStream(s); }
00215 };
00216
00220 class LgiClass GTempStream : public GProxyStream
00221 {
00222 GStream Null;
00223 int MaxMemSize;
00224
00225 protected:
00226 class GMemStream *Mem;
00227 class GFile *Tmp;
00228 char *TmpFolder;
00229
00230 public:
00231 GTempStream(char *TmpFolder = 0, int maxMemSize = 1 << 20);
00232 ~GTempStream();
00233
00234 int GetMaxMemSize() { return MaxMemSize; }
00235 int Write(const void *Buffer, int Size, int Flags = 0);
00236 void Empty();
00237 };
00238
00239 #endif