1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Na/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
* Copyright 2006 Marijn Kruisselbrink and others *
\********************************************************************/
/* Generic file transfer header */
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License with
the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
if not, write to the Free Software Foundation, Inc., 51 Franklin St.,
Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _FT_H
#define _FT_H
/*
* One buffer is needed for each transfer. The receiver stores a message
* in it and gives it to the sender. The sender will stall the receiver
* till the buffer has been sent out.
*/
#define FT_BUFFER_SIZE 2048
typedef enum {
FT_STATUS_LISTENING = 1,
FT_STATUS_TRANSFERRING = 2,
FT_STATUS_FINISHED = 4,
FT_STATUS_CANCELED = 8,
FT_STATUS_CONNECTING = 16
} file_status_t;
/*
* This structure holds all irc specific information regarding an incoming (from the point of view of
* the irc client) file transfer. New instances of this struct should only be created by calling the
* imcb_file_send_start() method, which will initialize most of the fields. The data field and the various
* methods are zero-initialized. Instances will automatically be deleted once the transfer is completed,
* canceled, or the connection to the irc client has been lost (note that also if only the irc connection
* and not the file transfer connection is lost, the file transfer will still be canceled and freed).
*
* The following (poor ascii-art) diagram illustrates what methods are called for which status-changes:
*
* /-----------\ /----------\
* -------> | LISTENING | -----------------> | CANCELED |
* \-----------/ [canceled,]free \----------/
* |
* | accept
* V
* /------ /-------------\ /--------------------------\
* out_of_data | | TRANSFERRING | -----------------> | TRANSFERRING | CANCELED |
* \-----> \-------------/ [canceled,]free \--------------------------/
* |
* | finished,free
* V
* /-------------------------\
* | TRANSFERRING | FINISHED |
* \-------------------------/
*/
typedef struct file_transfer {
/* Are we sending something? */
int sending;
/*
* The current status of this file transfer.
*/
file_status_t status;
/*
* file size
*/
size_t file_size;
/*
* Number of bytes that have been successfully transferred.
*/
size_t bytes_transferred;
/*
* Time started. Used to calculate kb/s.
*/
time_t started;
/*
* file name
*/
char *file_name;
/*
* A unique local ID for this file transfer.
*/
unsigned int local_id;
/*
* IM-protocol specific data associated with this file transfer.
*/
gpointer data;
struct im_connection *ic;
/*
* Private data.
*/
gpointer priv;
/*
* If set, called after successful connection setup.
*/
void (*accept)(struct file_transfer *file);
/*
* If set, called when the transfer is canceled or finished.
* Subsequently, this structure will be freed.
*
*/
void (*free)(struct file_transfer *file);
/*
* If set, called when the transfer is finished and successful.
*/
void (*finished)(struct file_transfer *file);
/*
* If set, called when the transfer is canceled.
* ( canceled either by the transfer implementation or by
* a call to imcb_file_canceled )
*/
void (*canceled)(struct file_transfer *file, char *reason);
/*
* called by the sending side to indicate that it is writable.
* The callee should check if data is available and call the
* function(as seen below) if that is the case.
*/
gboolean (*write_request)(struct file_transfer *file);
/*
* When sending files, protocols register this function to receive data.
* This should only be called once after write_request is called. The caller
* should not read more data until write_request is called again. This technique
* avoids buffering.
*/
gboolean (*write)(struct file_transfer *file, char *buffer, unsigned int len);
/* The send buffer associated with this transfer.
* Since receivers always wait for a write_request call one is enough.
*/
char buffer[FT_BUFFER_SIZE];
} file_transfer_t;
/*
* This starts a file transfer from bitlbee to the user.
*/
file_transfer_t *imcb_file_send_start(struct im_connection *ic, char *user_nick, char *file_name, size_t file_size);
/*
* This should be called by a protocol when the transfer is canceled. Note that
* the canceled() and free() callbacks given in file will be called by this function.
*/
void imcb_file_canceled(struct im_connection *ic, file_transfer_t *file, char *reason);
gboolean imcb_file_recv_start(struct im_connection *ic, file_transfer_t *ft);
void imcb_file_finished(struct im_connection *ic, file_transfer_t *file);
#endif
|