OSDN Git Service

FLVの視聴・リレーに対応。
[peercast-im/PeerCastIM.git] / core / common / pcp.h
1 // ------------------------------------------------
2 // File : pcp.h
3 // Date: 1-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
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 // ------------------------------------------------
18
19 #ifndef _PCP_H
20 #define _PCP_H
21
22 // ------------------------------------------------
23
24
25 #include "id.h"
26 #include "cstream.h"
27 #include "channel.h"
28
29 // ------------------------------------------------
30
31 class Servent;
32
33
34 // ------------------------------------------------
35
36 static const ID4 PCP_CONNECT            = "pcp\n";
37
38 static const ID4 PCP_OK                         = "ok";
39
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";
51
52 static const ID4 PCP_OLEH                       = "oleh";
53
54 static const ID4 PCP_MODE                       = "mode";
55 static const ID4 PCP_MODE_GNUT06        = "gn06";
56
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";
63
64
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";
70
71 static const ID4 PCP_GET                        = "get";
72 static const ID4 PCP_GET_ID                     = "id";
73 static const ID4 PCP_GET_NAME           = "name";
74
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";
95
96 static const ID4 PCP_QUIT                       = "quit";
97
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";
102
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";
109
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
121
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";
127
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";
131
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";
143
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";        
148
149 static const ID4 PCP_SPKT                               = "spkt";
150
151 static const ID4 PCP_ATOM                               = "atom";       
152
153 static const ID4 PCP_SESSIONID                  = "sid";
154
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;    
159
160
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;
166
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;
178
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;
186
187
188 // ----------------------------------------------
189 class BroadcastState 
190 {
191 public:
192         BroadcastState()
193         :numHops(0)
194         ,forMe(false) 
195         ,streamPos(0)
196         ,group(0)
197         ,servent_id(0)
198         ,ttl(0)
199         {
200                 chanID.clear();
201                 bcID.clear();
202         }
203
204
205         void initPacketSettings()
206         {
207                 forMe = false;
208                 group = 0;
209                 numHops = 0;
210                 bcID.clear();
211                 chanID.clear();
212         }
213
214
215         GnuID chanID,bcID;
216         int numHops;
217         bool forMe;
218         unsigned int streamPos;
219         int group;
220         int servent_id;
221         int ttl;
222 };
223
224 // ----------------------------------------------
225 class PCPStream : public ChannelStream
226 {
227 public:
228         PCPStream(GnuID &rid) 
229         :routeList(1000)
230         {
231                 init(rid);
232         }
233
234         void    init(GnuID &);
235
236         virtual void kill()
237         {
238                 inData.lock.on();
239                 outData.lock.on();
240         }
241
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 *);
248
249         int             readPacket(Stream &,BroadcastState &);
250         void    flushOutput(Stream &in,BroadcastState &);
251         static void     readVersion(Stream &);
252
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 &);
259
260         void    readPktAtoms(Channel *,AtomStream &,int,BroadcastState &);
261         void    readRootAtoms(AtomStream &, int,BroadcastState &);
262
263         int             readBroadcastAtoms(AtomStream &,int,BroadcastState &);
264
265         ChanPacketBuffer inData,outData;
266         unsigned int lastPacketTime;
267         unsigned int nextRootPacket;    
268
269         //int   error;
270         GnuIDList       routeList;
271         GnuID   remoteID;
272 };
273
274 #endif