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

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------ // File : stream.cpp // Date: 4-apr-2002 // Author: giles // Desc: // Basic stream handling functions.  // // (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. // ------------------------------------------------ #include "stream.h" #include "common.h" #include "sys.h" // -------------------------------------------------- void MemoryStream::convertFromBase64() {        char *out = buf; char *in = buf; int rl=len;     while(rl >= 4)  { out += String::base64WordToChars(out,in); in += 4;         rl -= 4;     }     *out = 0; len = out-buf; } // ------------------------------------- void FileStream::openReadOnly(const char *fn) { file = fopen(fn,"rb");     if (!file)      throw StreamException("Unable to open file"); } // ------------------------------------- void FileStream::openWriteReplace(const char *fn) { file = fopen(fn,"wb"); if (!file)
  2.      throw StreamException("Unable to open file"); } // ------------------------------------- void FileStream::openWriteAppend(const char *fn) {         file = fopen(fn,"ab");         if (!file)          throw StreamException("Unable to open file"); } // ------------------------------------- void FileStream::close() { if (file) { fclose(file); file = NULL; } } // ------------------------------------- void FileStream::rewind() { if (file) fseek(file,0,SEEK_SET); } // ------------------------------------- int FileStream::length() { int len = 0; if (file) { int old = ftell(file); fseek(file,0,SEEK_END); len = ftell(file); fseek(file,old,SEEK_SET); } return len; } // ------------------------------------- bool FileStream::eof() { if (file) return (feof(file)!=0); else return true; } // ------------------------------------- int FileStream::read(void *ptr, int len) { if (!file) return 0; if (feof(file))      throw StreamException("End of file");
  3. int r = (int)fread(ptr,1,len,file);
  4. updateTotals(r, 0);
  5.     return r;
  6. } // ------------------------------------- void FileStream::write(const void *ptr, int len) { if (!file) return;     fwrite(ptr,1,len,file);
  7. updateTotals(0, len);
  8. } // ------------------------------------- void FileStream::flush() { if (!file) return;     fflush(file); }
  9. // -------------------------------------
  10. int FileStream::pos()
  11. {
  12. if (!file)
  13. return 0;
  14.     return ftell(file);
  15. }
  16. // -------------------------------------
  17. void FileStream::seekTo(int pos)
  18. {
  19. if (!file)
  20. return;
  21. fseek(file,pos,SEEK_SET);
  22. }
  23. // -------------------------------------
  24. void Stream::writeTo(Stream &out, int len)
  25. {
  26. char tmp[4096];
  27. while (len)
  28. {
  29. int rlen = sizeof(tmp);
  30. if (rlen > len)
  31. rlen = len;
  32. read(tmp,rlen);
  33. out.write(tmp,rlen);
  34. len-=rlen;
  35. }
  36. }
  37. // -------------------------------------
  38. int Stream::writeUTF8(unsigned int code)
  39. {
  40. if (code < 0x80)
  41. {
  42. writeChar(code);
  43. return 1;
  44. }else 
  45. if (code < 0x0800)
  46. {
  47. writeChar(code>>6 | 0xC0);
  48. writeChar(code & 0x3F | 0x80);
  49. return 2;
  50. }else if (code < 0x10000)
  51. {
  52. writeChar(code>>12 | 0xE0);
  53. writeChar(code>>6 & 0x3F | 0x80);
  54. writeChar(code & 0x3F | 0x80);
  55. return 3;
  56. }else 
  57. {
  58. writeChar(code>>18 | 0xF0);
  59. writeChar(code>>12 & 0x3F | 0x80);
  60. writeChar(code>>6 & 0x3F | 0x80);
  61. writeChar(code & 0x3F | 0x80);
  62. return 4;
  63. }
  64. }
  65. // -------------------------------------
  66. void Stream::skip(int len)
  67. {
  68. char tmp[4096];
  69. while (len)
  70. {
  71. int rlen = sizeof(tmp);
  72. if (rlen > len)
  73. rlen = len;
  74. read(tmp,rlen);
  75. len-=rlen;
  76. }
  77. }
  78. // ------------------------------------- void Stream::updateTotals(unsigned int in, unsigned int out) { totalBytesIn += in; totalBytesOut += out; unsigned int tdiff = sys->getTime()-lastUpdate; if (tdiff >= 5) { bytesInPerSec = (totalBytesIn-lastBytesIn)/tdiff; bytesOutPerSec = (totalBytesOut-lastBytesOut)/tdiff; lastBytesIn = totalBytesIn; lastBytesOut = totalBytesOut; lastUpdate = sys->getTime(); } } // ------------------------------------- int Stream::readLine(char *in, int max) {     int i=0; max -= 2; while(max--)     {                      char c;               read(&c,1); if (c == 'n') break; if (c == 'r') continue;         in[i++] = c;     }     in[i] = 0; return i; } // ------------------------------------- void Stream::write(const char *fmt,va_list ap) { char tmp[4096]; vsprintf(tmp,fmt,ap);     write(tmp,strlen(tmp)); } // ------------------------------------- void Stream::writeStringF(const char *fmt,...) { va_list ap;    va_start(ap, fmt); write(fmt,ap);     va_end(ap); } // -------------------------------------
  79. void Stream::writeString(const char *str)
  80. {
  81. write(str,strlen(str));
  82. }
  83. // ------------------------------------- void Stream::writeLineF(const char *fmt,...) { va_list ap;    va_start(ap, fmt); write(fmt,ap); if (writeCRLF)     write("rn",2); else write("n",1);     va_end(ap); }
  84. // -------------------------------------
  85. void Stream::writeLine(const char *str)
  86. {
  87. writeString(str);
  88. if (writeCRLF)
  89.     write("rn",2);
  90. else
  91. write("n",1);
  92. }
  93. // ------------------------------------- int Stream::readWord(char *in, int max) { int i=0;     while (!eof())     {         char c = readChar();         if ((c == ' ') || (c == 't') || (c == 'r') || (c == 'n'))         {          if (i)              break; // stop reading             else          continue; // skip whitespace         }      if (i >= (max-1))          break;         in[i++] = c;     } in[i]=0;     return i; } // -------------------------------------------------- int Stream::readBase64(char *p, int max) {        char vals[4]; int cnt=0; while (cnt < (max-4)) { read(vals,4); int rl = String::base64WordToChars(p,vals); if (!rl) break; p+=rl; cnt+=rl; } *p = 0; return cnt; }
  94. // -------------------------------------
  95. int Stream::readBits(int cnt)
  96. {
  97. int v = 0;
  98. while (cnt)
  99. {
  100. if (!bitsPos)
  101. bitsBuffer = readChar();
  102. cnt--;
  103. v |= (bitsBuffer&(1<<(7-bitsPos)))?(1<<cnt):0;
  104. bitsPos = (bitsPos+1)&7;
  105. }
  106. return v;
  107. }