stream.h
上传用户:chn_coc
上传日期:2007-12-20
资源大小:563k
文件大小:6k
源码类别:

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------ // File : stream.h // Date: 4-apr-2002 // Author: giles // Desc:  // // (c) 2002 peercast.org // ------------------------------------------------ // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the // GNU General Public License for more details. // ------------------------------------------------ #ifndef _STREAM_H #define _STREAM_H // ------------------------------------- #include <stdio.h> #include <stdarg.h> #include <string.h> #include "common.h" #include "sys.h" #include "id.h" // ------------------------------------- class Stream { public: Stream()
  2. :writeCRLF(true)
  3. ,totalBytesIn(0)
  4. ,totalBytesOut(0)
  5. ,lastBytesIn(0)
  6. ,lastBytesOut(0)
  7. ,bytesInPerSec(0)
  8. ,bytesOutPerSec(0)
  9. ,lastUpdate(0)
  10. ,bitsBuffer(0)
  11. ,bitsPos(0) { }
  12. virtual int readUpto(void *,int) {return 0;} virtual int read(void *,int)=0; virtual void write(const void *,int) = 0;     virtual bool eof()     {      throw StreamException("Stream can`t eof"); return false;     } virtual void rewind() {      throw StreamException("Stream can`t rewind"); }
  13. virtual void seekTo(int)
  14. {
  15.      throw StreamException("Stream can`t seek");
  16. }
  17. void writeTo(Stream &out, int len); virtual void skip(int i); virtual void close() { } virtual void setReadTimeout(unsigned int )  { } virtual void setWriteTimeout(unsigned int ) { } virtual void setPollRead(bool) { }
  18. virtual int getPosition() {return 0;}
  19. // binary     char readChar()     {      char v;         read(&v,1);         return v;     }     short readShort()     {      short v;         read(&v,2); CHECK_ENDIAN2(v);         return v;     }     long readLong()     {      long v;         read(&v,4); CHECK_ENDIAN4(v);         return v;     } int readInt() { return readLong(); } ID4 readID4() { ID4 id; read(id.getData(),4); return id; }
  20. int readInt24()
  21. {
  22. int v=0;
  23.         read(&v,3);
  24. CHECK_ENDIAN3(v);
  25. } long readTag() { long v = readLong(); return SWAP4(v); } int readString(char *s, int max) { int cnt=0; while (max) { char c = readChar(); *s++ = c; cnt++; max--; if (!c) break; } return cnt; } virtual bool readReady() {return true;} virtual int numPending() {return 0;} void writeID4(ID4 id) { write(id.getData(),4); } void writeChar(char v) { write(&v,1); } void writeShort(short v) { CHECK_ENDIAN2(v); write(&v,2); } void writeLong(long v) { CHECK_ENDIAN4(v); write(&v,4); } void writeInt(int v) {writeLong(v);} void writeTag(long v) { //CHECK_ENDIAN4(v); writeLong(SWAP4(v)); } void writeTag(char id[4]) { write(id,4); } int writeUTF8(unsigned int); // text     int readLine(char *in, int max);     int readWord(char *, int); int readBase64(char *, int); void write(const char *,va_list); void writeLine(const char *); void writeLineF(const char *,...);
  26. void writeString(const char *); void writeStringF(const char *,...);
  27. bool writeCRLF; int readBits(int);
  28. void updateTotals(unsigned int,unsigned int);
  29. unsigned char bitsBuffer;
  30. unsigned int bitsPos;
  31. unsigned int totalBytesIn,totalBytesOut; unsigned int lastBytesIn,lastBytesOut; unsigned int bytesInPerSec,bytesOutPerSec; unsigned int lastUpdate; }; // ------------------------------------- class FileStream : public Stream { public: FileStream() {file=NULL;}     void openReadOnly(const char *);     void openWriteReplace(const char *);     void openWriteAppend(const char *); bool isOpen(){return file!=NULL;} int length(); int pos();
  32. virtual void seekTo(int);
  33. virtual int getPosition() {return pos();} virtual void flush();     virtual int read(void *,int);     virtual void write(const void *,int);     virtual bool eof();     virtual void rewind();     virtual void close(); FILE *file; }; // ------------------------------------- class MemoryStream : public Stream { public: MemoryStream() :buf(NULL)
  34. ,len(0)
  35. ,pos(0) { } MemoryStream(void *p, int l) :buf((char *)p) ,len(l) ,pos(0) { } MemoryStream(int l) :buf(new char[l]) ,len(l) ,pos(0) { } void readFromFile(FileStream &file) { len = file.length(); buf = new char[len]; pos = 0; file.read(buf,len); } void free() { if (buf) { delete buf; buf = NULL; } } virtual int read(void *p,int l)     { if (pos+l <= len) { memcpy(p,&buf[pos],l); pos += l; return l; }else { memset(p,0,l); return 0; }     } virtual void write(const void *p,int l)     {
  36. if ((pos+l) > len)
  37. throw StreamException("Stream - premature end of write()");
  38. memcpy(&buf[pos],p,l); pos += l;     }     virtual bool eof()     {         return pos >= len;     } virtual void rewind() { pos = 0; }
  39. virtual void seekTo(int p)
  40. {
  41. pos = p;
  42. }
  43. virtual int getPosition()
  44. {
  45. return pos;
  46. } void convertFromBase64(); char *buf; int len,pos; }; // -------------------------------------------------- class IndirectStream : public Stream { public: void init(Stream *s) { stream = s; } virtual int read(void *p,int l)     { return stream->read(p,l);     } virtual void write(const void *p,int l)     { stream->write(p,l);     }     virtual bool eof()     {         return stream->eof();     }     virtual void close()     {         stream->close();     } Stream *stream; }; #endif