|
Evan@653
|
1 |
/* |
|
Evan@653
|
2 |
* Purple's oscar protocol plugin |
|
Evan@653
|
3 |
* This file is the legal property of its developers. |
|
Evan@653
|
4 |
* Please see the AUTHORS file distributed alongside this file. |
|
Evan@653
|
5 |
* |
|
Evan@653
|
6 |
* This library is free software; you can redistribute it and/or |
|
Evan@653
|
7 |
* modify it under the terms of the GNU Lesser General Public |
|
Evan@653
|
8 |
* License as published by the Free Software Foundation; either |
|
Evan@653
|
9 |
* version 2 of the License, or (at your option) any later version. |
|
Evan@653
|
10 |
* |
|
Evan@653
|
11 |
* This library is distributed in the hope that it will be useful, |
|
Evan@653
|
12 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
Evan@653
|
13 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
Evan@653
|
14 |
* Lesser General Public License for more details. |
|
Evan@653
|
15 |
* |
|
Evan@653
|
16 |
* You should have received a copy of the GNU Lesser General Public |
|
Evan@653
|
17 |
* License along with this library; if not, write to the Free Software |
|
Evan@653
|
18 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
|
Evan@653
|
19 |
*/ |
|
Evan@653
|
20 |
|
|
Evan@653
|
21 |
/* |
|
Evan@653
|
22 |
* OFT and ODC Services |
|
Evan@653
|
23 |
*/ |
|
Evan@653
|
24 |
|
|
Evan@653
|
25 |
#ifndef _PEER_H_ |
|
Evan@653
|
26 |
#define _PEER_H_ |
|
Evan@653
|
27 |
|
|
Evan@653
|
28 |
#include "ft.h" |
|
Evan@653
|
29 |
#include "network.h" |
|
Evan@653
|
30 |
#include "proxy.h" |
|
Evan@653
|
31 |
|
|
Evan@653
|
32 |
typedef struct _ChecksumData ChecksumData; |
|
Evan@653
|
33 |
typedef struct _OdcFrame OdcFrame; |
|
Evan@653
|
34 |
typedef struct _OftFrame OftFrame; |
|
Evan@653
|
35 |
typedef struct _ProxyFrame ProxyFrame; |
|
Evan@653
|
36 |
typedef struct _PeerConnection PeerConnection; |
|
Evan@653
|
37 |
|
|
Evan@653
|
38 |
#define PEER_CONNECTION_FLAG_INITIATED_BY_ME 0x0001 |
|
Evan@653
|
39 |
#define PEER_CONNECTION_FLAG_APPROVED 0x0002 |
|
Evan@653
|
40 |
#define PEER_CONNECTION_FLAG_TRIED_DIRECT 0x0004 |
|
Evan@653
|
41 |
#define PEER_CONNECTION_FLAG_TRIED_INCOMING 0x0008 |
|
Evan@653
|
42 |
#define PEER_CONNECTION_FLAG_TRIED_PROXY 0x0010 |
|
Evan@653
|
43 |
#define PEER_CONNECTION_FLAG_IS_INCOMING 0x0020 |
|
Evan@653
|
44 |
|
|
Evan@653
|
45 |
#define PEER_TYPE_PROMPT 0x0101 /* "I am going to send you this file, is that ok?" */ |
|
Evan@653
|
46 |
#define PEER_TYPE_RESUMEACCEPT 0x0106 /* We are accepting the resume */ |
|
Evan@653
|
47 |
#define PEER_TYPE_ACK 0x0202 /* "Yes, it is ok for you to send me that file" */ |
|
Evan@653
|
48 |
#define PEER_TYPE_DONE 0x0204 /* "I received that file with no problems, thanks a bunch" */ |
|
Evan@653
|
49 |
#define PEER_TYPE_RESUME 0x0205 /* Resume transferring, sent by whoever receives */ |
|
Evan@653
|
50 |
#define PEER_TYPE_RESUMEACK 0x0207 /* Our resume accept was ACKed */ |
|
Evan@653
|
51 |
|
|
Evan@653
|
52 |
#define PEER_TYPE_GETFILE_REQUESTLISTING 0x1108 /* "I have a listing.txt file, do you want it?" */ |
|
Evan@653
|
53 |
#define PEER_TYPE_GETFILE_RECEIVELISTING 0x1209 /* "Yes, please send me your listing.txt file" */ |
|
Evan@653
|
54 |
#define PEER_TYPE_GETFILE_RECEIVEDLISTING 0x120a /* received corrupt listing.txt file? I'm just guessing about this one... */ |
|
Evan@653
|
55 |
#define PEER_TYPE_GETFILE_ACKLISTING 0x120b /* "I received the listing.txt file successfully" */ |
|
Evan@653
|
56 |
#define PEER_TYPE_GETFILE_REQUESTFILE 0x120c /* "Please send me this file" */ |
|
Evan@653
|
57 |
|
|
Evan@653
|
58 |
/* |
|
Evan@653
|
59 |
* For peer proxying |
|
Evan@653
|
60 |
*/ |
|
Evan@653
|
61 |
#define PEER_PROXY_SERVER "ars.oscar.aol.com" |
|
Evan@653
|
62 |
#define PEER_PROXY_PORT 5190 /* The port we should always connect to */ |
|
Evan@653
|
63 |
#define PEER_PROXY_PACKET_VERSION 0x044a |
|
Evan@653
|
64 |
|
|
Evan@653
|
65 |
/* Thanks to Keith Lea and the Joust project for documenting these */ |
|
Evan@653
|
66 |
#define PEER_PROXY_TYPE_ERROR 0x0001 |
|
Evan@653
|
67 |
#define PEER_PROXY_TYPE_CREATE 0x0002 |
|
Evan@653
|
68 |
#define PEER_PROXY_TYPE_CREATED 0x0003 |
|
Evan@653
|
69 |
#define PEER_PROXY_TYPE_JOIN 0x0004 |
|
Evan@653
|
70 |
#define PEER_PROXY_TYPE_READY 0x0005 |
|
Evan@653
|
71 |
|
|
Evan@653
|
72 |
struct _OdcFrame |
|
Evan@653
|
73 |
{ |
|
Evan@653
|
74 |
/* guchar magic[4]; */ /* 0 */ |
|
Evan@653
|
75 |
/* guint16 length; */ /* 4 */ |
|
Evan@653
|
76 |
guint16 type; /* 6 */ |
|
Evan@653
|
77 |
guint16 subtype; /* 8 */ |
|
Evan@653
|
78 |
/* Unknown */ /* 10 */ |
|
Evan@653
|
79 |
guchar cookie[8]; /* 12 */ |
|
Evan@653
|
80 |
/* Unknown */ |
|
Evan@653
|
81 |
/* guint32 payloadlength; */ /* 28 */ |
|
Evan@653
|
82 |
guint16 encoding; /* 32 */ |
|
Evan@653
|
83 |
/* Unknown */ |
|
Evan@653
|
84 |
guint16 flags; /* 38 */ |
|
Evan@653
|
85 |
/* Unknown */ |
|
Evan@1427
|
86 |
guchar bn[32]; /* 44 */ |
|
Evan@653
|
87 |
/* Unknown */ |
|
Evan@653
|
88 |
ByteStream payload; /* 76 */ |
|
Evan@653
|
89 |
}; |
|
Evan@653
|
90 |
|
|
Evan@653
|
91 |
struct _OftFrame |
|
Evan@653
|
92 |
{ |
|
Evan@653
|
93 |
/* guchar magic[4]; */ /* 0 */ |
|
Evan@653
|
94 |
/* guint16 length; */ /* 4 */ |
|
Evan@653
|
95 |
guint16 type; /* 6 */ |
|
Evan@653
|
96 |
guchar cookie[8]; /* 8 */ |
|
Evan@653
|
97 |
guint16 encrypt; /* 16 */ |
|
Evan@653
|
98 |
guint16 compress; /* 18 */ |
|
Evan@653
|
99 |
guint16 totfiles; /* 20 */ |
|
Evan@653
|
100 |
guint16 filesleft; /* 22 */ |
|
Evan@653
|
101 |
guint16 totparts; /* 24 */ |
|
Evan@653
|
102 |
guint16 partsleft; /* 26 */ |
|
Evan@653
|
103 |
guint32 totsize; /* 28 */ |
|
Evan@653
|
104 |
guint32 size; /* 32 */ |
|
Evan@653
|
105 |
guint32 modtime; /* 36 */ |
|
Evan@653
|
106 |
guint32 checksum; /* 40 */ |
|
Evan@653
|
107 |
guint32 rfrcsum; /* 44 */ |
|
Evan@653
|
108 |
guint32 rfsize; /* 48 */ |
|
Evan@653
|
109 |
guint32 cretime; /* 52 */ |
|
Evan@653
|
110 |
guint32 rfcsum; /* 56 */ |
|
Evan@653
|
111 |
guint32 nrecvd; /* 60 */ |
|
Evan@653
|
112 |
guint32 recvcsum; /* 64 */ |
|
Evan@653
|
113 |
guchar idstring[32]; /* 68 */ |
|
Evan@653
|
114 |
guint8 flags; /* 100 */ |
|
Evan@653
|
115 |
guint8 lnameoffset; /* 101 */ |
|
Evan@653
|
116 |
guint8 lsizeoffset; /* 102 */ |
|
Evan@653
|
117 |
guchar dummy[69]; /* 103 */ |
|
Evan@653
|
118 |
guchar macfileinfo[16]; /* 172 */ |
|
Evan@653
|
119 |
guint16 nencode; /* 188 */ |
|
Evan@653
|
120 |
guint16 nlanguage; /* 190 */ |
|
Evan@653
|
121 |
guchar *name; /* 192 */ |
|
Evan@653
|
122 |
size_t name_length; |
|
Evan@653
|
123 |
/* Payload? */ /* 256 */ |
|
Evan@653
|
124 |
}; |
|
Evan@653
|
125 |
|
|
Evan@653
|
126 |
struct _ProxyFrame |
|
Evan@653
|
127 |
{ |
|
Evan@653
|
128 |
/* guint16 length; */ /* 0 */ |
|
Evan@653
|
129 |
guint16 version; /* 2 */ |
|
Evan@653
|
130 |
guint16 type; /* 4 */ |
|
Evan@653
|
131 |
guint32 unknown; /* 6 */ |
|
Evan@653
|
132 |
guint16 flags; /* 10 */ |
|
Evan@653
|
133 |
ByteStream payload; /* 12 */ |
|
Evan@653
|
134 |
}; |
|
Evan@653
|
135 |
|
|
Evan@653
|
136 |
struct _PeerConnection |
|
Evan@653
|
137 |
{ |
|
Evan@653
|
138 |
OscarData *od; |
|
Evan@653
|
139 |
OscarCapability type; |
|
Evan@1427
|
140 |
char *bn; |
|
Evan@653
|
141 |
guchar magic[4]; |
|
Evan@653
|
142 |
guchar cookie[8]; |
|
Evan@653
|
143 |
guint16 lastrequestnumber; |
|
Evan@653
|
144 |
|
|
Evan@653
|
145 |
gboolean ready; |
|
Evan@653
|
146 |
int flags; /**< Bitmask of PEER_CONNECTION_FLAG_ */ |
|
Evan@653
|
147 |
time_t lastactivity; /**< Time of last transmit. */ |
|
Evan@653
|
148 |
guint destroy_timeout; |
|
Evan@653
|
149 |
OscarDisconnectReason disconnect_reason; |
|
Evan@653
|
150 |
char *error_message; |
|
Evan@653
|
151 |
|
|
Evan@653
|
152 |
/** |
|
Evan@653
|
153 |
* A pointer to either an OdcFrame or an OftFrame. |
|
Evan@653
|
154 |
*/ |
|
Evan@653
|
155 |
gpointer frame; |
|
Evan@653
|
156 |
|
|
Evan@653
|
157 |
/** |
|
Evan@653
|
158 |
* This is only used when the peer connection is being established. |
|
Evan@653
|
159 |
*/ |
|
Evan@653
|
160 |
PurpleProxyConnectData *client_connect_data; |
|
Evan@653
|
161 |
PurpleProxyConnectData *verified_connect_data; |
|
Evan@653
|
162 |
|
|
Evan@653
|
163 |
/** |
|
Evan@653
|
164 |
* This is only used when the peer connection is being established. |
|
Evan@653
|
165 |
*/ |
|
Evan@653
|
166 |
PurpleNetworkListenData *listen_data; |
|
Evan@653
|
167 |
|
|
Evan@653
|
168 |
|
|
Evan@653
|
169 |
/** |
|
Evan@653
|
170 |
* This is only used when the peer connection is being established. |
|
Evan@653
|
171 |
*/ |
|
Evan@653
|
172 |
guint connect_timeout_timer; |
|
Evan@653
|
173 |
|
|
Evan@653
|
174 |
/** |
|
Evan@653
|
175 |
* This is only used while the remote user is attempting to |
|
Evan@653
|
176 |
* connect to us. |
|
Evan@653
|
177 |
*/ |
|
Evan@653
|
178 |
int listenerfd; |
|
Evan@653
|
179 |
|
|
Evan@653
|
180 |
int fd; |
|
Evan@653
|
181 |
guint8 header[6]; |
|
Evan@653
|
182 |
gssize header_received; |
|
Evan@653
|
183 |
guint8 proxy_header[12]; |
|
Evan@653
|
184 |
gssize proxy_header_received; |
|
Evan@653
|
185 |
ByteStream buffer_incoming; |
|
Evan@653
|
186 |
PurpleCircBuffer *buffer_outgoing; |
|
Evan@653
|
187 |
guint watcher_incoming; |
|
Evan@653
|
188 |
guint watcher_outgoing; |
|
Evan@653
|
189 |
|
|
Evan@653
|
190 |
/** |
|
Evan@653
|
191 |
* IP address of the proxy server, if applicable. |
|
Evan@653
|
192 |
*/ |
|
Evan@653
|
193 |
gchar *proxyip; |
|
Evan@653
|
194 |
|
|
Evan@653
|
195 |
/** |
|
Evan@653
|
196 |
* IP address of the remote user from THEIR point of view. |
|
Evan@653
|
197 |
*/ |
|
Evan@653
|
198 |
gchar *clientip; |
|
Evan@653
|
199 |
|
|
Evan@653
|
200 |
/** |
|
Evan@653
|
201 |
* IP address of the remote user from the oscar server's |
|
Evan@653
|
202 |
* point of view. |
|
Evan@653
|
203 |
*/ |
|
Evan@653
|
204 |
gchar *verifiedip; |
|
Evan@653
|
205 |
|
|
Evan@653
|
206 |
guint16 port; |
|
Evan@653
|
207 |
gboolean use_proxy; |
|
Evan@653
|
208 |
|
|
Evan@653
|
209 |
/** |
|
Evan@653
|
210 |
* Checksumming |
|
Evan@653
|
211 |
*/ |
|
Evan@653
|
212 |
ChecksumData *checksum_data; |
|
Evan@653
|
213 |
|
|
Evan@653
|
214 |
/* TODOFT */ |
|
Evan@653
|
215 |
PurpleXfer *xfer; |
|
Evan@653
|
216 |
OftFrame xferdata; |
|
Evan@653
|
217 |
guint sending_data_timer; |
|
Evan@653
|
218 |
}; |
|
Evan@653
|
219 |
|
|
Evan@653
|
220 |
/* |
|
Evan@653
|
221 |
* For all peer connections |
|
Evan@653
|
222 |
*/ |
|
Evan@653
|
223 |
|
|
Evan@653
|
224 |
/** |
|
Evan@653
|
225 |
* Create a new PeerConnection structure and initialize it with some |
|
Evan@653
|
226 |
* sane defaults. |
|
Evan@653
|
227 |
* |
|
Evan@653
|
228 |
* @param type The type of the peer connection. One of |
|
Evan@653
|
229 |
* OSCAR_CAPABILITY_DIRECTIM or OSCAR_CAPABILITY_SENDFILE. |
|
Evan@653
|
230 |
*/ |
|
Evan@1427
|
231 |
PeerConnection *peer_connection_new(OscarData *od, OscarCapability type, const char *bn); |
|
Evan@653
|
232 |
|
|
Evan@653
|
233 |
void peer_connection_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message); |
|
Evan@653
|
234 |
void peer_connection_schedule_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message); |
|
Evan@1427
|
235 |
PeerConnection *peer_connection_find_by_type(OscarData *od, const char *bn, OscarCapability type); |
|
Evan@1427
|
236 |
PeerConnection *peer_connection_find_by_cookie(OscarData *od, const char *bn, const guchar *cookie); |
|
Evan@653
|
237 |
|
|
Evan@653
|
238 |
void peer_connection_listen_cb(gpointer data, gint source, PurpleInputCondition cond); |
|
Evan@653
|
239 |
void peer_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond); |
|
Evan@653
|
240 |
void peer_connection_send(PeerConnection *conn, ByteStream *bs); |
|
Evan@653
|
241 |
|
|
Evan@653
|
242 |
void peer_connection_trynext(PeerConnection *conn); |
|
Evan@653
|
243 |
void peer_connection_finalize_connection(PeerConnection *conn); |
|
Evan@1427
|
244 |
void peer_connection_propose(OscarData *od, OscarCapability type, const char *bn); |
|
Evan@1427
|
245 |
void peer_connection_got_proposition(OscarData *od, const gchar *bn, const gchar *message, IcbmArgsCh2 *args); |
|
Evan@653
|
246 |
|
|
Evan@653
|
247 |
/* |
|
Evan@653
|
248 |
* For ODC |
|
Evan@653
|
249 |
*/ |
|
Evan@653
|
250 |
void peer_odc_close(PeerConnection *conn); |
|
Evan@653
|
251 |
void peer_odc_recv_frame(PeerConnection *conn, ByteStream *bs); |
|
Evan@653
|
252 |
void peer_odc_send_cookie(PeerConnection *conn); |
|
Evan@653
|
253 |
void peer_odc_send_typing(PeerConnection *conn, PurpleTypingState typing); |
|
Evan@653
|
254 |
void peer_odc_send_im(PeerConnection *conn, const char *msg, int len, int encoding, gboolean autoreply); |
|
Evan@653
|
255 |
|
|
Evan@653
|
256 |
/* |
|
Evan@653
|
257 |
* For OFT |
|
Evan@653
|
258 |
*/ |
|
Evan@653
|
259 |
void peer_oft_close(PeerConnection *conn); |
|
Evan@653
|
260 |
void peer_oft_recv_frame(PeerConnection *conn, ByteStream *bs); |
|
Evan@653
|
261 |
void peer_oft_send_prompt(PeerConnection *conn); |
|
Evan@653
|
262 |
void peer_oft_checksum_destroy(ChecksumData *checksum_data); |
|
Evan@653
|
263 |
|
|
Evan@653
|
264 |
/* Xfer callbacks for receiving a file */ |
|
Evan@653
|
265 |
void peer_oft_recvcb_init(PurpleXfer *xfer); |
|
Evan@653
|
266 |
void peer_oft_recvcb_end(PurpleXfer *xfer); |
|
Evan@653
|
267 |
void peer_oft_recvcb_ack_recv(PurpleXfer *xfer, const guchar *buffer, size_t size); |
|
Evan@653
|
268 |
|
|
Evan@653
|
269 |
/* Xfer callbacks for sending a file */ |
|
Evan@653
|
270 |
void peer_oft_sendcb_init(PurpleXfer *xfer); |
|
Evan@653
|
271 |
void peer_oft_sendcb_ack(PurpleXfer *xfer, const guchar *buffer, size_t size); |
|
Evan@653
|
272 |
|
|
Evan@653
|
273 |
/* Xfer callbacks for both sending and receiving */ |
|
Evan@653
|
274 |
void peer_oft_cb_generic_cancel(PurpleXfer *xfer); |
|
Evan@653
|
275 |
|
|
Evan@653
|
276 |
/* |
|
Evan@653
|
277 |
* For peer proxying |
|
Evan@653
|
278 |
*/ |
|
Evan@653
|
279 |
void peer_proxy_connection_established_cb(gpointer data, gint source, const gchar *error_message); |
|
Evan@653
|
280 |
|
|
Evan@653
|
281 |
#endif /* _PEER_H_ */ |