Frameworks/libpurple.framework/Versions/0.6.2/Headers/peer.h
author Zachary West <zacw@adium.im>
Fri Aug 21 13:25:11 2009 -0700 (2009-08-21)
changeset 2592 e8d15275025e
parent 1739 Frameworks/libpurple.framework/Versions/0.6.0/Headers/peer.h@8b0daad9656c
permissions -rw-r--r--
im.pidgin.adium.1-4 at 267c6165e02e34318a1823960bd04c0639952f73
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_ */