1 // ------------------------------------------------
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.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
17 // ------------------------------------------------
22 // ----------------------------------
30 // ----------------------------------
63 void init(ChanPacketv &p);
64 void init(TYPE t, const void *, unsigned int , unsigned int );
66 void writeRaw(Stream &);
67 void writePeercast(Stream &);
68 void readPeercast(Stream &);
75 char data[MAX_DATALEN];
80 // ----------------------------------
109 type = ChanPacket::T_UNKNOWN;
118 void init(ChanPacket &p)
120 if (data && (datasize < p.len || datasize > p.len + BSIZE * 4)) {
130 priority = p.priority;
132 datasize = (len & ~(BSIZE - 1)) + BSIZE;
133 data = new char[datasize];
135 memcpy(data, p.data, len);
137 void init(ChanPacketv &p)
144 void writeRaw(Stream &);
145 void writePeercast(Stream &);
146 void readPeercast(Stream &);
150 ChanPacket::TYPE type;
153 unsigned int datasize;
158 // ----------------------------------
159 class ChanPacketBuffer
170 lastPos = firstPos = safePos = 0;
171 readPos = writePos = 0;
174 for (int i = 0; i < MAX_PACKETS; i++) packets[i].reset();
180 int copyFrom(ChanPacketBuffer &,unsigned in);
182 bool writePacket(ChanPacket &,bool = false);
183 void readPacket(ChanPacket &);
184 void readPacketPri(ChanPacket &);
188 int numPending() {return writePos-readPos;}
190 unsigned int getLatestPos();
191 unsigned int getOldestPos();
192 unsigned int findOldestPos(unsigned int);
193 bool findPacket(unsigned int,ChanPacket &);
194 unsigned int getStreamPos(unsigned int);
195 unsigned int getStreamPosEnd(unsigned int);
196 unsigned int getLastSync();
198 //ChanPacket packets[MAX_PACKETS];
199 ChanPacketv packets[MAX_PACKETS];
200 volatile unsigned int lastPos,firstPos,safePos;
201 volatile unsigned int readPos,writePos;
203 unsigned int lastWriteTime;
206 unsigned int lastSkipTime;
209 // ----------------------------------
222 virtual ~ChannelStream() {}
224 void updateStatus(Channel *);
225 bool getStatus(Channel *,ChanPacket &);
227 virtual void kill() {}
228 virtual bool sendPacket(ChanPacket &,GnuID &) {return false;}
229 virtual void flush(Stream &) {}
230 virtual unsigned int flushUb(Stream &, unsigned int) { return 0; }
231 virtual void readHeader(Stream &,Channel *)=0;
232 virtual int readPacket(Stream &,Channel *)=0;
233 virtual void readEnd(Stream &,Channel *)=0;
235 void readRaw(Stream &,Channel *);
241 unsigned int lastUpdate;
242 unsigned int lastCheckTime;