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

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------
  2. // File : cstream.h
  3. // Date: 12-mar-2004
  4. // Author: giles
  5. //
  6. // (c) 2002-4 peercast.org
  7. // ------------------------------------------------
  8. // This program is free software; you can redistribute it and/or modify
  9. // it under the terms of the GNU General Public License as published by
  10. // the Free Software Foundation; either version 2 of the License, or
  11. // (at your option) any later version.
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. // ------------------------------------------------
  17. #ifndef _CSTREAM_H
  18. #define _CSTREAM_H
  19. // ----------------------------------
  20. class Channel;
  21. class ChanPacket;
  22. class Stream;
  23. // ----------------------------------
  24. class ChanPacket
  25. {
  26. public:
  27. enum 
  28. {
  29. MAX_DATALEN = 16384
  30. };
  31. enum TYPE
  32. {
  33. T_UNKNOWN = 0,
  34. T_HEAD = 1,
  35. T_DATA = 2,
  36. T_META = 4,
  37. T_PCP = 16,
  38. T_ALL = 0xff
  39. };
  40. ChanPacket() 
  41. {
  42. init();
  43. }
  44. void init()
  45. {
  46. type = T_UNKNOWN;
  47. len = 0;
  48. pos = 0;
  49. sync = 0;
  50. }
  51. void init(TYPE t, const void *, unsigned int , unsigned int );
  52. void writeRaw(Stream &);
  53. void writePeercast(Stream &);
  54. void readPeercast(Stream &);
  55. unsigned int sync;
  56. unsigned int pos;
  57. TYPE type;
  58. unsigned int len;
  59. char data[MAX_DATALEN];
  60. };
  61. // ----------------------------------
  62. class ChanPacketBuffer 
  63. {
  64. public:
  65. enum {
  66. MAX_PACKETS = 64,
  67. NUM_SAFEPACKETS = 56
  68. };
  69. void init()
  70. {
  71. lock.on();
  72. lastPos = firstPos = safePos = 0;
  73. readPos = writePos = 0;
  74. accept = 0;
  75. lastWriteTime = 0;
  76. lock.off();
  77. }
  78. int copyFrom(ChanPacketBuffer &,unsigned in);
  79. bool writePacket(ChanPacket &,bool = false);
  80. void readPacket(ChanPacket &);
  81. bool willSkip();
  82. int numPending() {return writePos-readPos;}
  83. unsigned int getLatestPos();
  84. unsigned int getOldestPos();
  85. unsigned int findOldestPos(unsigned int);
  86. bool findPacket(unsigned int,ChanPacket &);
  87. unsigned int getStreamPos(unsigned int);
  88. unsigned int getStreamPosEnd(unsigned int);
  89. unsigned int getLastSync();
  90. ChanPacket packets[MAX_PACKETS];
  91. volatile unsigned int lastPos,firstPos,safePos;
  92. volatile unsigned int readPos,writePos;
  93. unsigned int accept;
  94. unsigned int lastWriteTime;
  95. WLock lock;
  96. };
  97. // ----------------------------------
  98. class ChannelStream
  99. {
  100. public:
  101. ChannelStream()
  102. :numListeners(0)
  103. ,numRelays(0) 
  104. ,isPlaying(false)
  105. ,fwState(0)
  106. ,lastUpdate(0) 
  107. {}
  108. void updateStatus(Channel *);
  109. bool getStatus(Channel *,ChanPacket &);
  110. virtual void kill() {}
  111. virtual bool sendPacket(ChanPacket &,GnuID &) {return false;}
  112. virtual void flush(Stream &) {}
  113. virtual void readHeader(Stream &,Channel *)=0;
  114. virtual int  readPacket(Stream &,Channel *)=0;
  115. virtual void readEnd(Stream &,Channel *)=0;
  116. void readRaw(Stream &,Channel *);
  117. int numRelays;
  118. int numListeners;
  119. bool isPlaying;
  120. int fwState;
  121. unsigned int lastUpdate;
  122. };
  123. #endif