OSDN Git Service

770205bacad2701b7229940a9a75b944da9ea651
[peercast-im/PeerCastIM.git] / PeerCast.root / PeerCast / 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_FLAGS1        = "flg1";
89 static const ID4 PCP_HOST_OLDPOS        = "oldp";
90 static const ID4 PCP_HOST_NEWPOS        = "newp";
91 static const ID4 PCP_HOST_UPHOST_IP     = "upip";
92 static const ID4 PCP_HOST_UPHOST_PORT   = "uppt";
93 static const ID4 PCP_HOST_UPHOST_HOPS   = "uphp";
94
95 static const ID4 PCP_QUIT                       = "quit";
96
97 static const ID4 PCP_CHAN                       = "chan";
98 static const ID4 PCP_CHAN_ID            = "id";
99 static const ID4 PCP_CHAN_BCID          = "bcid";
100 static const ID4 PCP_CHAN_KEY           = "key";
101
102 static const ID4 PCP_CHAN_PKT           = "pkt";
103 static const ID4 PCP_CHAN_PKT_TYPE      = "type";
104 static const ID4 PCP_CHAN_PKT_POS       = "pos";
105 static const ID4 PCP_CHAN_PKT_HEAD      = "head";
106 static const ID4 PCP_CHAN_PKT_DATA      = "data";
107 static const ID4 PCP_CHAN_PKT_META      = "meta";
108
109 static const ID4 PCP_CHAN_INFO                  = "info";
110 static const ID4 PCP_CHAN_INFO_TYPE             = "type";
111 static const ID4 PCP_CHAN_INFO_BITRATE  = "bitr";
112 static const ID4 PCP_CHAN_INFO_GENRE    = "gnre";
113 static const ID4 PCP_CHAN_INFO_NAME             = "name";
114 static const ID4 PCP_CHAN_INFO_URL              = "url";
115 static const ID4 PCP_CHAN_INFO_DESC             = "desc";
116 static const ID4 PCP_CHAN_INFO_COMMENT  = "cmnt";
117
118 static const ID4 PCP_CHAN_TRACK                 = "trck";
119 static const ID4 PCP_CHAN_TRACK_TITLE   = "titl";
120 static const ID4 PCP_CHAN_TRACK_CREATOR = "crea";
121 static const ID4 PCP_CHAN_TRACK_URL             = "url";
122 static const ID4 PCP_CHAN_TRACK_ALBUM   = "albm";
123
124 static const ID4 PCP_MESG                               = "mesg";
125 static const ID4 PCP_MESG_ASCII                 = "asci";               // ascii/sjis to be depreciated.. utf8/unicode is the only supported format from now.
126 static const ID4 PCP_MESG_SJIS                  = "sjis";
127
128 static const ID4 PCP_BCST                               = "bcst";       
129 static const ID4 PCP_BCST_TTL                   = "ttl";        
130 static const ID4 PCP_BCST_HOPS                  = "hops";       
131 static const ID4 PCP_BCST_FROM                  = "from";       
132 static const ID4 PCP_BCST_DEST                  = "dest";       
133 static const ID4 PCP_BCST_GROUP                 = "grp";        
134 static const ID4 PCP_BCST_CHANID                = "cid";        
135 static const ID4 PCP_BCST_VERSION               = "vers";
136 static const ID4 PCP_BCST_VERSION_VP    = "vrvp";
137 static const ID4 PCP_BCST_VERSION_EX_PREFIX = "vexp";
138 static const ID4 PCP_BCST_VERSION_EX_NUMBER = "vexn";
139
140 static const ID4 PCP_PUSH                               = "push";       
141 static const ID4 PCP_PUSH_IP                    = "ip"; 
142 static const ID4 PCP_PUSH_PORT                  = "port";       
143 static const ID4 PCP_PUSH_CHANID                = "cid";        
144
145 static const ID4 PCP_SPKT                               = "spkt";
146
147 static const ID4 PCP_ATOM                               = "atom";       
148
149 static const ID4 PCP_SESSIONID                  = "sid";
150
151 static const int PCP_BCST_GROUP_ALL                     = (char)0xff;   
152 static const int PCP_BCST_GROUP_ROOT            = 1;    
153 static const int PCP_BCST_GROUP_TRACKERS        = 2;    
154 static const int PCP_BCST_GROUP_RELAYS          = 4;    
155
156
157 static const int PCP_ERROR_QUIT                 = 1000;
158 static const int PCP_ERROR_BCST                 = 2000;
159 static const int PCP_ERROR_READ                 = 3000;
160 static const int PCP_ERROR_WRITE                = 4000;
161 static const int PCP_ERROR_GENERAL              = 5000;
162
163 static const int PCP_ERROR_SKIP                         = 1;
164 static const int PCP_ERROR_ALREADYCONNECTED     = 2;
165 static const int PCP_ERROR_UNAVAILABLE          = 3;
166 static const int PCP_ERROR_LOOPBACK                     = 4;
167 static const int PCP_ERROR_NOTIDENTIFIED        = 5;
168 static const int PCP_ERROR_BADRESPONSE          = 6;
169 static const int PCP_ERROR_BADAGENT                     = 7;
170 static const int PCP_ERROR_OFFAIR                       = 8;
171 static const int PCP_ERROR_SHUTDOWN                     = 9;
172 static const int PCP_ERROR_NOROOT                       = 10;
173 static const int PCP_ERROR_BANNED                       = 11;
174
175 static const int PCP_HOST_FLAGS1_TRACKER        = 0x01;
176 static const int PCP_HOST_FLAGS1_RELAY          = 0x02;
177 static const int PCP_HOST_FLAGS1_DIRECT         = 0x04;
178 static const int PCP_HOST_FLAGS1_PUSH           = 0x08;
179 static const int PCP_HOST_FLAGS1_RECV           = 0x10;
180 static const int PCP_HOST_FLAGS1_CIN            = 0x20;
181 static const int PCP_HOST_FLAGS1_PRIVATE        = 0x40;
182
183
184 // ----------------------------------------------
185 class BroadcastState 
186 {
187 public:
188         BroadcastState()
189         :numHops(0)
190         ,forMe(false) 
191         ,streamPos(0)
192         ,group(0)
193         ,servent_id(0)
194         {
195                 chanID.clear();
196                 bcID.clear();
197         }
198
199
200         void initPacketSettings()
201         {
202                 forMe = false;
203                 group = 0;
204                 numHops = 0;
205                 bcID.clear();
206                 chanID.clear();
207         }
208
209
210         GnuID chanID,bcID;
211         int numHops;
212         bool forMe;
213         unsigned int streamPos;
214         int group;
215         int servent_id;
216 };
217
218 // ----------------------------------------------
219 class PCPStream : public ChannelStream
220 {
221 public:
222         PCPStream(GnuID &rid) 
223         :routeList(1000)
224         {
225                 init(rid);
226         }
227
228         void    init(GnuID &);
229
230         virtual void kill()
231         {
232                 inData.lock.on();
233                 outData.lock.on();
234         }
235
236         virtual bool sendPacket(ChanPacket &,GnuID &);
237         virtual void flush(Stream &);
238         virtual unsigned int flushUb(Stream &, unsigned int);
239         virtual void readHeader(Stream &,Channel *);
240         virtual int readPacket(Stream &,Channel *);
241         virtual void readEnd(Stream &,Channel *);
242
243         int             readPacket(Stream &,BroadcastState &);
244         void    flushOutput(Stream &in,BroadcastState &);
245         static void     readVersion(Stream &);
246
247         int             procAtom(AtomStream &,ID4,int,int,BroadcastState &);
248         int             readAtom(AtomStream &,BroadcastState &);
249         void    readChanAtoms(AtomStream &,int,BroadcastState &);
250 //      void    readHostAtoms(AtomStream &, int, BroadcastState &);
251         void    readHostAtoms(AtomStream &, int, BroadcastState &, ChanHit &, bool flg=true);
252         void    readPushAtoms(AtomStream &, int,BroadcastState &);
253
254         void    readPktAtoms(Channel *,AtomStream &,int,BroadcastState &);
255         void    readRootAtoms(AtomStream &, int,BroadcastState &);
256
257         int             readBroadcastAtoms(AtomStream &,int,BroadcastState &);
258
259         ChanPacketBuffer inData,outData;
260         unsigned int lastPacketTime;
261         unsigned int nextRootPacket;    
262
263         //int   error;
264         GnuIDList       routeList;
265         GnuID   remoteID;
266
267 };
268
269 #endif