1 // ------------------------------------------------
6 // (c) 2002 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 // ------------------------------------------------
32 // --------------------------------------------------
39 int sampling_frequency;
50 // ----------------------------------
63 void convertTo(String::TYPE t)
72 bool update(TrackInfo &);
74 ::String contact,title,artist,album,genre;
79 // ----------------------------------
123 void init(const char *);
124 void init(const char *, GnuID &, TYPE, int);
125 void init(XML::Node *);
126 void initNameID(const char *);
128 void updateFromXML(XML::Node *);
130 void readTrackXML(XML::Node *);
131 void readServentXML(XML::Node *);
132 bool update(ChanInfo &);
133 XML::Node *createQueryXML();
134 XML::Node *createChannelXML();
135 XML::Node *createRelayChannelXML();
136 XML::Node *createTrackXML();
137 bool match(XML::Node *);
138 bool match(ChanInfo &);
139 bool matchNameID(ChanInfo &);
141 void writeInfoAtoms(AtomStream &atom);
142 void writeTrackAtoms(AtomStream &atom);
144 void readInfoAtoms(AtomStream &,int);
145 void readTrackAtoms(AtomStream &,int);
147 unsigned int getUptime();
148 unsigned int getAge();
149 bool isActive() {return id.isSet();}
150 bool isPrivate() {return bcID.getFlags() & 1;}
151 static const char *getTypeStr(TYPE);
152 static const char *getProtocolStr(PROTOCOL);
153 static const char *getTypeExt(TYPE);
154 static TYPE getTypeFromStr(const char *str);
155 static PROTOCOL getProtocolFromStr(const char *str);
161 PROTOCOL srcProtocol;
162 unsigned int lastPlayStart,lastPlayEnd;
163 unsigned int numSkips;
164 unsigned int createdTime;
169 ::String desc,genre,url,comment;
171 unsigned int ppFlags; //JP-MOD
175 // ----------------------------------
180 void initLocal(int numl,int numr,int nums,int uptm,bool,bool,unsigned int,Channel*,unsigned int,unsigned int);
181 void initLocal_pp(bool isStealth, int numClaps); //JP-MOD
182 XML::Node *createXML();
184 void writeAtoms(AtomStream &,GnuID &);
185 bool writeVariable(Stream &, const String &);
187 void pickNearestIP(Host &);
191 unsigned int numListeners,numRelays,numHops;
192 int clap_pp; //JP-MOD
193 unsigned int time,upTime,lastContact;
195 GnuID sessionID,chanID;
196 unsigned int version;
197 unsigned int version_vp;
199 bool firewalled:1,stable:1,tracker:1,recv:1,yp:1,dead:1,direct:1,relay:1,cin:1;
200 bool relayfull:1,chfull:1,ratefull:1;
207 unsigned int oldestPos,newestPos;
209 unsigned int uphostHops;
211 char version_ex_prefix[2];
212 unsigned int version_ex_number;
214 unsigned int lastSendSeq;
216 // ----------------------------------
223 int contactTrackers(bool,int,int,int);
225 ChanHit *addHit(ChanHit &);
226 void delHit(ChanHit &);
227 void deadHit(ChanHit &);
228 void clearHits(bool);
231 int numClaps(); //JP-MOD
237 unsigned int newestHit();
239 int pickHits(ChanHitSearch &);
240 int pickSourceHits(ChanHitSearch &);
242 bool isUsed() {return used;}
243 int clearDeadHits(unsigned int,bool);
244 XML::Node *createXML(bool addHits = true);
246 ChanHit *deleteHit(ChanHit *);
248 int getTotalListeners();
249 int getTotalRelays();
250 int getTotalFirewalled();
255 unsigned int lastHitTime;
260 // ----------------------------------
269 ChanHitSearch() { init(); }
272 ChanHit best[MAX_RESULTS];
274 unsigned int waitDelay;
277 bool useBusyRelays,useBusyControls;
282 int getRelayHost(Host host1, Host host2, GnuID exID, ChanHitList *chl);
285 // ----------------------------------
301 void fromMem(void *,int);
302 void addMem(void *,int);
304 unsigned int len,cnt,startPos;
305 char data[MAX_DATALEN];
310 // ------------------------------------------
311 class RawStream : public ChannelStream
314 virtual void readHeader(Stream &,Channel *);
315 virtual int readPacket(Stream &,Channel *);
316 virtual void readEnd(Stream &,Channel *);
320 // ------------------------------------------
321 class PeercastStream : public ChannelStream
324 virtual void readHeader(Stream &,Channel *);
325 virtual int readPacket(Stream &,Channel *);
326 virtual void readEnd(Stream &,Channel *);
329 // ------------------------------------------
333 virtual ~ChannelSource() {}
334 virtual void stream(Channel *) = 0;
336 virtual int getSourceRate() {return 0;}
339 // ------------------------------------------
340 class PeercastSource : public ChannelSource
345 virtual void stream(Channel *);
350 // ----------------------------------
392 void endThread(bool flg);
394 void startMP3File(char *);
396 void startICY(ClientSocket *,SRC_TYPE);
397 void startURL(const char *);
400 ChannelStream *createSource();
402 void resetPlayTime();
406 return (status == S_NOTFOUND);
411 return (status == S_RECEIVING) || (status == S_BROADCASTING);
416 return (status == S_RECEIVING);
419 bool isBroadcasting()
421 return (status == S_BROADCASTING);
429 void sleepUntil(double);
433 return type != T_NONE;
438 int handshakeFetch();
440 bool isIdle() {return isActive() && (status==S_IDLE);}
442 static THREAD_PROC stream(ThreadInfo *);
444 static THREAD_PROC waitFinish(ThreadInfo *);
446 void setStatus(STATUS s);
447 const char *getSrcTypeStr() {return srcTypes[srcType];}
448 const char *getStatusStr() {return statusMsgs[status];}
449 const char *getName() {return info.name.cstr();}
450 GnuID getID() {return info.id;}
451 int getBitrate() {return info.bitrate; }
452 void getIDStr(char *s) {info.id.toStr(s);}
453 void getStreamPath(char *);
455 void broadcastTrackerUpdate(GnuID &,bool = false);
456 bool sendPacketUp(ChanPacket &,GnuID &,GnuID &,GnuID &);
458 bool writeVariable(Stream &, const String &,int);
460 bool acceptGIV(ClientSocket *);
462 void updateInfo(ChanInfo &);
464 int readStream(Stream &,ChannelStream *);
466 void checkReadDelay(unsigned int);
468 void processMp3Metadata(char *);
474 XML::Node *createRelayXML(bool);
476 void newPacket(ChanPacket &);
478 int localListeners();
481 int totalClaps(); //JP-MOD
482 int totalListeners();
489 ChanPacketBuffer rawData;
491 ChannelStream *sourceStream;
492 unsigned int streamIndex;
503 bool bump,stayConnected;
504 bool stealth; //JP-MOD
506 unsigned int streamPos;
507 unsigned int skipCount; //JP-EX
509 int overrideMaxRelaysPerChannel; //JP-MOD
513 ChannelSource *sourceData;
519 ThreadInfo *finthread;
521 unsigned int lastIdleTime;
523 static char *statusMsgs[],*srcTypes[];
526 ClientSocket *pushSock;
528 unsigned int lastTrackerUpdate;
529 unsigned int lastMetaUpdate;
531 double startTime,syncTime;
541 unsigned int lastSkipTime;
542 unsigned int lastStopTime;
544 int maxRelays; //
\83`
\83\83\83\93\83l
\83\8b\8cÅ
\97L
\82Ì
\83\8a\83\8c\81[
\8dÅ
\91å
\90\94(
\83R
\83\93\83X
\83g
\83\89\83N
\83^
\82Å
\8f\89\8aú
\89»)
547 // ----------------------------------
552 MAX_IDLE_CHANNELS = 8, // max. number of channels that can be left idle
553 MAX_METAINT = 8192 // must be at least smaller than ChanPacket data len (ie. about half)
560 Channel *deleteChannel(Channel *);
562 Channel *createChannel(ChanInfo &,const char *);
563 Channel *findChannelByName(const char *);
564 Channel *findChannelByIndex(int);
565 Channel *findChannelByMount(const char *);
566 Channel *findChannelByID(GnuID &);
567 Channel *findChannelByNameID(ChanInfo &);
568 Channel *findPushChannel(int);
569 Channel *findChannelByChannelID(int id);
571 void broadcastTrackerSettings();
572 void setUpdateInterval(unsigned int v);
573 void broadcastRelays(Servent *,int,int);
575 int broadcastPacketUp(ChanPacket &,GnuID &,GnuID &,GnuID &);
576 void broadcastTrackerUpdate(GnuID &,bool = false);
578 bool writeVariable(Stream &, const String &,int);
580 int findChannels(ChanInfo &,Channel **,int);
581 int findChannelsByStatus(Channel **,int,Channel::STATUS);
583 int numIdleChannels();
586 void closeOldestIdle();
590 void addHit(Host &,GnuID &,bool);
591 ChanHit *addHit(ChanHit &);
592 void delHit(ChanHit &);
593 void deadHit(ChanHit &);
594 void setFirewalled(Host &);
596 ChanHitList *findHitList(ChanInfo &);
597 ChanHitList *findHitListByID(GnuID &);
598 ChanHitList *addHitList(ChanInfo &);
600 void clearHitLists();
601 void clearDeadHits(bool);
604 void setBroadcastMsg(::String &);
606 Channel *createRelay(ChanInfo &,bool);
607 Channel *findAndRelay(ChanInfo &);
608 void startSearch(ChanInfo &);
610 void playChannel(ChanInfo &);
611 void findAndPlayChannel(ChanInfo &,bool);
613 bool isBroadcasting(GnuID &);
614 bool isBroadcasting();
616 int pickHits(ChanHitSearch &);
618 bool findParentHit(ChanHit &p);
621 ChanHitList *hitlist;
628 ::String broadcastMsg;
629 unsigned int broadcastMsgInterval;
630 unsigned int lastHit,lastQuery;
631 unsigned int maxUptime;
633 unsigned int deadHitAge;
635 int maxRelaysPerChannel;
637 int minBroadcastTTL,maxBroadcastTTL;
638 int pushTimeout,pushTries,maxPushHops;
639 unsigned int autoQuery;
640 unsigned int prefetchTime;
641 unsigned int lastYPConnect;
642 unsigned int lastYPConnect2;
643 unsigned int icyIndex;
645 unsigned int hostUpdateInterval;
646 unsigned int bufferTime;
648 GnuID currFindAndPlayChannel;
653 // ----------------------------------
667 PlayList(TYPE t, int max)
672 urls = new ::String[max];
673 titles = new ::String[max];
674 contacturls = new ::String[max]; //JP-MOD
681 delete [] contacturls; //JP-MOD
684 void addURL(const char *url, const char *tit, const char *contacturl/*JP-MOD*/)
686 if (numURLs < maxURLs)
688 urls[numURLs].set(url);
689 titles[numURLs].set(tit);
690 contacturls[numURLs].set(contacturl); //JP-MOD
694 void addChannels(const char *,Channel **,int);
695 void addChannel(const char *,ChanInfo &);
697 void writeSCPLS(Stream &);
698 void writePLS(Stream &);
699 void writeASX(Stream &);
700 void writeRAM(Stream &);
702 void readSCPLS(Stream &);
703 void readPLS(Stream &);
704 void readASX(Stream &);
712 case T_SCPLS: readSCPLS(s); break;
713 case T_PLS: readPLS(s); break;
714 case T_ASX: readASX(s); break;
716 }catch(StreamException &) {} // keep pls regardless of errors (eof isn`t handled properly in sockets)
719 void write(Stream &s)
723 case T_SCPLS: writeSCPLS(s); break;
724 case T_PLS: writePLS(s); break;
725 case T_ASX: writeASX(s); break;
726 case T_RAM: writeRAM(s); break;
732 ::String *urls,*titles;
733 ::String *contacturls; //JP-MOD
736 // ----------------------------------
738 extern ChanMgr *chanMgr;
741 bool isIndexTxt(ChanInfo *info);
742 bool isIndexTxt(Channel *ch);
743 int numMaxRelaysIndexTxt(Channel *ch);
744 int canStreamIndexTxt(Channel *ch);