1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/Frameworks/libpurple.framework/Versions/0.6.2/Headers/peer.h Fri Aug 21 13:25:11 2009 -0700
1.3 @@ -0,0 +1,281 @@
1.4 +/*
1.5 + * Purple's oscar protocol plugin
1.6 + * This file is the legal property of its developers.
1.7 + * Please see the AUTHORS file distributed alongside this file.
1.8 + *
1.9 + * This library is free software; you can redistribute it and/or
1.10 + * modify it under the terms of the GNU Lesser General Public
1.11 + * License as published by the Free Software Foundation; either
1.12 + * version 2 of the License, or (at your option) any later version.
1.13 + *
1.14 + * This library is distributed in the hope that it will be useful,
1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.17 + * Lesser General Public License for more details.
1.18 + *
1.19 + * You should have received a copy of the GNU Lesser General Public
1.20 + * License along with this library; if not, write to the Free Software
1.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
1.22 +*/
1.23 +
1.24 +/*
1.25 + * OFT and ODC Services
1.26 + */
1.27 +
1.28 +#ifndef _PEER_H_
1.29 +#define _PEER_H_
1.30 +
1.31 +#include "ft.h"
1.32 +#include "network.h"
1.33 +#include "proxy.h"
1.34 +
1.35 +typedef struct _ChecksumData ChecksumData;
1.36 +typedef struct _OdcFrame OdcFrame;
1.37 +typedef struct _OftFrame OftFrame;
1.38 +typedef struct _ProxyFrame ProxyFrame;
1.39 +typedef struct _PeerConnection PeerConnection;
1.40 +
1.41 +#define PEER_CONNECTION_FLAG_INITIATED_BY_ME 0x0001
1.42 +#define PEER_CONNECTION_FLAG_APPROVED 0x0002
1.43 +#define PEER_CONNECTION_FLAG_TRIED_DIRECT 0x0004
1.44 +#define PEER_CONNECTION_FLAG_TRIED_INCOMING 0x0008
1.45 +#define PEER_CONNECTION_FLAG_TRIED_PROXY 0x0010
1.46 +#define PEER_CONNECTION_FLAG_IS_INCOMING 0x0020
1.47 +
1.48 +#define PEER_TYPE_PROMPT 0x0101 /* "I am going to send you this file, is that ok?" */
1.49 +#define PEER_TYPE_RESUMEACCEPT 0x0106 /* We are accepting the resume */
1.50 +#define PEER_TYPE_ACK 0x0202 /* "Yes, it is ok for you to send me that file" */
1.51 +#define PEER_TYPE_DONE 0x0204 /* "I received that file with no problems, thanks a bunch" */
1.52 +#define PEER_TYPE_RESUME 0x0205 /* Resume transferring, sent by whoever receives */
1.53 +#define PEER_TYPE_RESUMEACK 0x0207 /* Our resume accept was ACKed */
1.54 +
1.55 +#define PEER_TYPE_GETFILE_REQUESTLISTING 0x1108 /* "I have a listing.txt file, do you want it?" */
1.56 +#define PEER_TYPE_GETFILE_RECEIVELISTING 0x1209 /* "Yes, please send me your listing.txt file" */
1.57 +#define PEER_TYPE_GETFILE_RECEIVEDLISTING 0x120a /* received corrupt listing.txt file? I'm just guessing about this one... */
1.58 +#define PEER_TYPE_GETFILE_ACKLISTING 0x120b /* "I received the listing.txt file successfully" */
1.59 +#define PEER_TYPE_GETFILE_REQUESTFILE 0x120c /* "Please send me this file" */
1.60 +
1.61 +/*
1.62 + * For peer proxying
1.63 + */
1.64 +#define PEER_PROXY_SERVER "ars.oscar.aol.com"
1.65 +#define PEER_PROXY_PORT 5190 /* The port we should always connect to */
1.66 +#define PEER_PROXY_PACKET_VERSION 0x044a
1.67 +
1.68 +/* Thanks to Keith Lea and the Joust project for documenting these */
1.69 +#define PEER_PROXY_TYPE_ERROR 0x0001
1.70 +#define PEER_PROXY_TYPE_CREATE 0x0002
1.71 +#define PEER_PROXY_TYPE_CREATED 0x0003
1.72 +#define PEER_PROXY_TYPE_JOIN 0x0004
1.73 +#define PEER_PROXY_TYPE_READY 0x0005
1.74 +
1.75 +struct _OdcFrame
1.76 +{
1.77 + /* guchar magic[4]; */ /* 0 */
1.78 + /* guint16 length; */ /* 4 */
1.79 + guint16 type; /* 6 */
1.80 + guint16 subtype; /* 8 */
1.81 + /* Unknown */ /* 10 */
1.82 + guchar cookie[8]; /* 12 */
1.83 + /* Unknown */
1.84 + /* guint32 payloadlength; */ /* 28 */
1.85 + guint16 encoding; /* 32 */
1.86 + /* Unknown */
1.87 + guint16 flags; /* 38 */
1.88 + /* Unknown */
1.89 + guchar bn[32]; /* 44 */
1.90 + /* Unknown */
1.91 + ByteStream payload; /* 76 */
1.92 +};
1.93 +
1.94 +struct _OftFrame
1.95 +{
1.96 + /* guchar magic[4]; */ /* 0 */
1.97 + /* guint16 length; */ /* 4 */
1.98 + guint16 type; /* 6 */
1.99 + guchar cookie[8]; /* 8 */
1.100 + guint16 encrypt; /* 16 */
1.101 + guint16 compress; /* 18 */
1.102 + guint16 totfiles; /* 20 */
1.103 + guint16 filesleft; /* 22 */
1.104 + guint16 totparts; /* 24 */
1.105 + guint16 partsleft; /* 26 */
1.106 + guint32 totsize; /* 28 */
1.107 + guint32 size; /* 32 */
1.108 + guint32 modtime; /* 36 */
1.109 + guint32 checksum; /* 40 */
1.110 + guint32 rfrcsum; /* 44 */
1.111 + guint32 rfsize; /* 48 */
1.112 + guint32 cretime; /* 52 */
1.113 + guint32 rfcsum; /* 56 */
1.114 + guint32 nrecvd; /* 60 */
1.115 + guint32 recvcsum; /* 64 */
1.116 + guchar idstring[32]; /* 68 */
1.117 + guint8 flags; /* 100 */
1.118 + guint8 lnameoffset; /* 101 */
1.119 + guint8 lsizeoffset; /* 102 */
1.120 + guchar dummy[69]; /* 103 */
1.121 + guchar macfileinfo[16]; /* 172 */
1.122 + guint16 nencode; /* 188 */
1.123 + guint16 nlanguage; /* 190 */
1.124 + guchar *name; /* 192 */
1.125 + size_t name_length;
1.126 + /* Payload? */ /* 256 */
1.127 +};
1.128 +
1.129 +struct _ProxyFrame
1.130 +{
1.131 + /* guint16 length; */ /* 0 */
1.132 + guint16 version; /* 2 */
1.133 + guint16 type; /* 4 */
1.134 + guint32 unknown; /* 6 */
1.135 + guint16 flags; /* 10 */
1.136 + ByteStream payload; /* 12 */
1.137 +};
1.138 +
1.139 +struct _PeerConnection
1.140 +{
1.141 + OscarData *od;
1.142 + OscarCapability type;
1.143 + char *bn;
1.144 + guchar magic[4];
1.145 + guchar cookie[8];
1.146 + guint16 lastrequestnumber;
1.147 +
1.148 + gboolean ready;
1.149 + int flags; /**< Bitmask of PEER_CONNECTION_FLAG_ */
1.150 + time_t lastactivity; /**< Time of last transmit. */
1.151 + guint destroy_timeout;
1.152 + OscarDisconnectReason disconnect_reason;
1.153 + char *error_message;
1.154 +
1.155 + /**
1.156 + * A pointer to either an OdcFrame or an OftFrame.
1.157 + */
1.158 + gpointer frame;
1.159 +
1.160 + /**
1.161 + * This is only used when the peer connection is being established.
1.162 + */
1.163 + PurpleProxyConnectData *client_connect_data;
1.164 + PurpleProxyConnectData *verified_connect_data;
1.165 +
1.166 + /**
1.167 + * This is only used when the peer connection is being established.
1.168 + */
1.169 + PurpleNetworkListenData *listen_data;
1.170 +
1.171 +
1.172 + /**
1.173 + * This is only used when the peer connection is being established.
1.174 + */
1.175 + guint connect_timeout_timer;
1.176 +
1.177 + /**
1.178 + * This is only used while the remote user is attempting to
1.179 + * connect to us.
1.180 + */
1.181 + int listenerfd;
1.182 +
1.183 + int fd;
1.184 + guint8 header[6];
1.185 + gssize header_received;
1.186 + guint8 proxy_header[12];
1.187 + gssize proxy_header_received;
1.188 + ByteStream buffer_incoming;
1.189 + PurpleCircBuffer *buffer_outgoing;
1.190 + guint watcher_incoming;
1.191 + guint watcher_outgoing;
1.192 +
1.193 + /**
1.194 + * IP address of the proxy server, if applicable.
1.195 + */
1.196 + gchar *proxyip;
1.197 +
1.198 + /**
1.199 + * IP address of the remote user from THEIR point of view.
1.200 + */
1.201 + gchar *clientip;
1.202 +
1.203 + /**
1.204 + * IP address of the remote user from the oscar server's
1.205 + * point of view.
1.206 + */
1.207 + gchar *verifiedip;
1.208 +
1.209 + guint16 port;
1.210 + gboolean use_proxy;
1.211 +
1.212 + /**
1.213 + * Checksumming
1.214 + */
1.215 + ChecksumData *checksum_data;
1.216 +
1.217 + /* TODOFT */
1.218 + PurpleXfer *xfer;
1.219 + OftFrame xferdata;
1.220 + guint sending_data_timer;
1.221 +};
1.222 +
1.223 +/*
1.224 + * For all peer connections
1.225 + */
1.226 +
1.227 +/**
1.228 + * Create a new PeerConnection structure and initialize it with some
1.229 + * sane defaults.
1.230 + *
1.231 + * @param type The type of the peer connection. One of
1.232 + * OSCAR_CAPABILITY_DIRECTIM or OSCAR_CAPABILITY_SENDFILE.
1.233 + */
1.234 +PeerConnection *peer_connection_new(OscarData *od, OscarCapability type, const char *bn);
1.235 +
1.236 +void peer_connection_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
1.237 +void peer_connection_schedule_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message);
1.238 +PeerConnection *peer_connection_find_by_type(OscarData *od, const char *bn, OscarCapability type);
1.239 +PeerConnection *peer_connection_find_by_cookie(OscarData *od, const char *bn, const guchar *cookie);
1.240 +
1.241 +void peer_connection_listen_cb(gpointer data, gint source, PurpleInputCondition cond);
1.242 +void peer_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond);
1.243 +void peer_connection_send(PeerConnection *conn, ByteStream *bs);
1.244 +
1.245 +void peer_connection_trynext(PeerConnection *conn);
1.246 +void peer_connection_finalize_connection(PeerConnection *conn);
1.247 +void peer_connection_propose(OscarData *od, OscarCapability type, const char *bn);
1.248 +void peer_connection_got_proposition(OscarData *od, const gchar *bn, const gchar *message, IcbmArgsCh2 *args);
1.249 +
1.250 +/*
1.251 + * For ODC
1.252 + */
1.253 +void peer_odc_close(PeerConnection *conn);
1.254 +void peer_odc_recv_frame(PeerConnection *conn, ByteStream *bs);
1.255 +void peer_odc_send_cookie(PeerConnection *conn);
1.256 +void peer_odc_send_typing(PeerConnection *conn, PurpleTypingState typing);
1.257 +void peer_odc_send_im(PeerConnection *conn, const char *msg, int len, int encoding, gboolean autoreply);
1.258 +
1.259 +/*
1.260 + * For OFT
1.261 + */
1.262 +void peer_oft_close(PeerConnection *conn);
1.263 +void peer_oft_recv_frame(PeerConnection *conn, ByteStream *bs);
1.264 +void peer_oft_send_prompt(PeerConnection *conn);
1.265 +void peer_oft_checksum_destroy(ChecksumData *checksum_data);
1.266 +
1.267 +/* Xfer callbacks for receiving a file */
1.268 +void peer_oft_recvcb_init(PurpleXfer *xfer);
1.269 +void peer_oft_recvcb_end(PurpleXfer *xfer);
1.270 +void peer_oft_recvcb_ack_recv(PurpleXfer *xfer, const guchar *buffer, size_t size);
1.271 +
1.272 +/* Xfer callbacks for sending a file */
1.273 +void peer_oft_sendcb_init(PurpleXfer *xfer);
1.274 +void peer_oft_sendcb_ack(PurpleXfer *xfer, const guchar *buffer, size_t size);
1.275 +
1.276 +/* Xfer callbacks for both sending and receiving */
1.277 +void peer_oft_cb_generic_cancel(PurpleXfer *xfer);
1.278 +
1.279 +/*
1.280 + * For peer proxying
1.281 + */
1.282 +void peer_proxy_connection_established_cb(gpointer data, gint source, const gchar *error_message);
1.283 +
1.284 +#endif /* _PEER_H_ */