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 // ------------------------------------------------
29 // ------------------------------------------------
34 // ------------------------------------------------
36 static const ID4 PCP_CONNECT = "pcp\n";
38 static const ID4 PCP_OK = "ok";
40 static const ID4 PCP_HELO = "helo";
41 static const ID4 PCP_HELO_AGENT = "agnt";
42 static const ID4 PCP_HELO_OSTYPE = "ostp";
43 static const ID4 PCP_HELO_SESSIONID = "sid";
44 static const ID4 PCP_HELO_PORT = "port";
45 static const ID4 PCP_HELO_PING = "ping";
46 static const ID4 PCP_HELO_PONG = "pong";
47 static const ID4 PCP_HELO_REMOTEIP = "rip";
48 static const ID4 PCP_HELO_VERSION = "ver";
49 static const ID4 PCP_HELO_BCID = "bcid";
50 static const ID4 PCP_HELO_DISABLE = "dis";
52 static const ID4 PCP_OLEH = "oleh";
54 static const ID4 PCP_MODE = "mode";
55 static const ID4 PCP_MODE_GNUT06 = "gn06";
57 static const ID4 PCP_ROOT = "root";
58 static const ID4 PCP_ROOT_UPDINT = "uint";
59 static const ID4 PCP_ROOT_CHECKVER = "chkv";
60 static const ID4 PCP_ROOT_URL = "url";
61 static const ID4 PCP_ROOT_UPDATE = "upd";
62 static const ID4 PCP_ROOT_NEXT = "next";
65 static const ID4 PCP_OS_LINUX = "lnux";
66 static const ID4 PCP_OS_WINDOWS = "w32";
67 static const ID4 PCP_OS_OSX = "osx";
68 static const ID4 PCP_OS_WINAMP = "wamp";
69 static const ID4 PCP_OS_ZAURUS = "zaur";
71 static const ID4 PCP_GET = "get";
72 static const ID4 PCP_GET_ID = "id";
73 static const ID4 PCP_GET_NAME = "name";
75 static const ID4 PCP_HOST = "host";
76 static const ID4 PCP_HOST_ID = "id";
77 static const ID4 PCP_HOST_IP = "ip";
78 static const ID4 PCP_HOST_PORT = "port";
79 static const ID4 PCP_HOST_NUML = "numl";
80 static const ID4 PCP_HOST_NUMR = "numr";
81 static const ID4 PCP_HOST_UPTIME = "uptm";
82 static const ID4 PCP_HOST_TRACKER = "trkr";
83 static const ID4 PCP_HOST_CHANID = "cid";
84 static const ID4 PCP_HOST_VERSION = "ver";
85 static const ID4 PCP_HOST_VERSION_VP = "vevp";
86 static const ID4 PCP_HOST_VERSION_EX_PREFIX = "vexp";
87 static const ID4 PCP_HOST_VERSION_EX_NUMBER = "vexn";
88 static const ID4 PCP_HOST_CLAP_PP = "clap"; //JP-MOD
89 static const ID4 PCP_HOST_FLAGS1 = "flg1";
90 static const ID4 PCP_HOST_OLDPOS = "oldp";
91 static const ID4 PCP_HOST_NEWPOS = "newp";
92 static const ID4 PCP_HOST_UPHOST_IP = "upip";
93 static const ID4 PCP_HOST_UPHOST_PORT = "uppt";
94 static const ID4 PCP_HOST_UPHOST_HOPS = "uphp";
96 static const ID4 PCP_QUIT = "quit";
98 static const ID4 PCP_CHAN = "chan";
99 static const ID4 PCP_CHAN_ID = "id";
100 static const ID4 PCP_CHAN_BCID = "bcid";
101 static const ID4 PCP_CHAN_KEY = "key";
103 static const ID4 PCP_CHAN_PKT = "pkt";
104 static const ID4 PCP_CHAN_PKT_TYPE = "type";
105 static const ID4 PCP_CHAN_PKT_POS = "pos";
106 static const ID4 PCP_CHAN_PKT_HEAD = "head";
107 static const ID4 PCP_CHAN_PKT_DATA = "data";
108 static const ID4 PCP_CHAN_PKT_META = "meta";
110 static const ID4 PCP_CHAN_INFO = "info";
111 static const ID4 PCP_CHAN_INFO_TYPE = "type";
112 static const ID4 PCP_CHAN_INFO_STREAMTYPE = "styp";
113 static const ID4 PCP_CHAN_INFO_STREAMEXT = "sext";
114 static const ID4 PCP_CHAN_INFO_BITRATE = "bitr";
115 static const ID4 PCP_CHAN_INFO_GENRE = "gnre";
116 static const ID4 PCP_CHAN_INFO_NAME = "name";
117 static const ID4 PCP_CHAN_INFO_URL = "url";
118 static const ID4 PCP_CHAN_INFO_DESC = "desc";
119 static const ID4 PCP_CHAN_INFO_COMMENT = "cmnt";
120 static const ID4 PCP_CHAN_INFO_PPFLAGS = "pflg"; //JP-MOD
122 static const ID4 PCP_CHAN_TRACK = "trck";
123 static const ID4 PCP_CHAN_TRACK_TITLE = "titl";
124 static const ID4 PCP_CHAN_TRACK_CREATOR = "crea";
125 static const ID4 PCP_CHAN_TRACK_URL = "url";
126 static const ID4 PCP_CHAN_TRACK_ALBUM = "albm";
128 static const ID4 PCP_MESG = "mesg";
129 static const ID4 PCP_MESG_ASCII = "asci"; // ascii/sjis to be depreciated.. utf8/unicode is the only supported format from now.
130 static const ID4 PCP_MESG_SJIS = "sjis";
132 static const ID4 PCP_BCST = "bcst";
133 static const ID4 PCP_BCST_TTL = "ttl";
134 static const ID4 PCP_BCST_HOPS = "hops";
135 static const ID4 PCP_BCST_FROM = "from";
136 static const ID4 PCP_BCST_DEST = "dest";
137 static const ID4 PCP_BCST_GROUP = "grp";
138 static const ID4 PCP_BCST_CHANID = "cid";
139 static const ID4 PCP_BCST_VERSION = "vers";
140 static const ID4 PCP_BCST_VERSION_VP = "vrvp";
141 static const ID4 PCP_BCST_VERSION_EX_PREFIX = "vexp";
142 static const ID4 PCP_BCST_VERSION_EX_NUMBER = "vexn";
144 static const ID4 PCP_PUSH = "push";
145 static const ID4 PCP_PUSH_IP = "ip";
146 static const ID4 PCP_PUSH_PORT = "port";
147 static const ID4 PCP_PUSH_CHANID = "cid";
149 static const ID4 PCP_SPKT = "spkt";
151 static const ID4 PCP_ATOM = "atom";
153 static const ID4 PCP_SESSIONID = "sid";
155 static const int PCP_BCST_GROUP_ALL = (char)0xff;
156 static const int PCP_BCST_GROUP_ROOT = 1;
157 static const int PCP_BCST_GROUP_TRACKERS = 2;
158 static const int PCP_BCST_GROUP_RELAYS = 4;
161 static const int PCP_ERROR_QUIT = 1000;
162 static const int PCP_ERROR_BCST = 2000;
163 static const int PCP_ERROR_READ = 3000;
164 static const int PCP_ERROR_WRITE = 4000;
165 static const int PCP_ERROR_GENERAL = 5000;
167 static const int PCP_ERROR_SKIP = 1;
168 static const int PCP_ERROR_ALREADYCONNECTED = 2;
169 static const int PCP_ERROR_UNAVAILABLE = 3;
170 static const int PCP_ERROR_LOOPBACK = 4;
171 static const int PCP_ERROR_NOTIDENTIFIED = 5;
172 static const int PCP_ERROR_BADRESPONSE = 6;
173 static const int PCP_ERROR_BADAGENT = 7;
174 static const int PCP_ERROR_OFFAIR = 8;
175 static const int PCP_ERROR_SHUTDOWN = 9;
176 static const int PCP_ERROR_NOROOT = 10;
177 static const int PCP_ERROR_BANNED = 11;
179 static const int PCP_HOST_FLAGS1_TRACKER = 0x01;
180 static const int PCP_HOST_FLAGS1_RELAY = 0x02;
181 static const int PCP_HOST_FLAGS1_DIRECT = 0x04;
182 static const int PCP_HOST_FLAGS1_PUSH = 0x08;
183 static const int PCP_HOST_FLAGS1_RECV = 0x10;
184 static const int PCP_HOST_FLAGS1_CIN = 0x20;
185 static const int PCP_HOST_FLAGS1_PRIVATE = 0x40;
188 // ----------------------------------------------
205 void initPacketSettings()
218 unsigned int streamPos;
224 // ----------------------------------------------
225 class PCPStream : public ChannelStream
228 PCPStream(GnuID &rid)
242 virtual bool sendPacket(ChanPacket &,GnuID &);
243 virtual void flush(Stream &);
244 virtual unsigned int flushUb(Stream &, unsigned int);
245 virtual void readHeader(Stream &,Channel *);
246 virtual int readPacket(Stream &,Channel *);
247 virtual void readEnd(Stream &,Channel *);
249 int readPacket(Stream &,BroadcastState &);
250 void flushOutput(Stream &in,BroadcastState &);
251 static void readVersion(Stream &);
253 int procAtom(AtomStream &,ID4,int,int,BroadcastState &);
254 int readAtom(AtomStream &,BroadcastState &);
255 void readChanAtoms(AtomStream &,int,BroadcastState &);
256 // void readHostAtoms(AtomStream &, int, BroadcastState &);
257 void readHostAtoms(AtomStream &, int, BroadcastState &, ChanHit &, bool flg=true);
258 void readPushAtoms(AtomStream &, int,BroadcastState &);
260 void readPktAtoms(Channel *,AtomStream &,int,BroadcastState &);
261 void readRootAtoms(AtomStream &, int,BroadcastState &);
263 int readBroadcastAtoms(AtomStream &,int,BroadcastState &);
265 ChanPacketBuffer inData,outData;
266 unsigned int lastPacketTime;
267 unsigned int nextRootPacket;