source: protocols/msn/msn.h @ d179921d

Last change on this file since d179921d was 59f527b6, checked in by Wilmer van der Gaast <wilmer@…>, at 2008-01-12T17:24:38Z

When a switchboard connection dies (at the TCP level) and there are still
queued messages, they will now be moved back to the main queue and a new
sb will be created to try to send the messages again. I hope this will
solve some/most/all of the "Closing switchboard with unsent messages"
problems, but can't be sure since this problem isn't very easy to reproduce.
At least it should solve the ones caused by keeping spare switchboards
around. Also enabling switchboard debugging output if configured with
--debug=1, at least for now this will be useful.

  • Property mode set to 100644
File size: 5.6 KB
Line 
1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2004 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* MSN module                                                           */
8
9/*
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License with
21  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22  if not, write to the Free Software Foundation, Inc., 59 Temple Place,
23  Suite 330, Boston, MA  02111-1307  USA
24*/
25
26/* Some hackish magicstrings to make special-purpose messages/switchboards.
27 */
28#define TYPING_NOTIFICATION_MESSAGE "\r\r\rBEWARE, ME R TYPINK MESSAGE!!!!\r\r\r"
29#define GROUPCHAT_SWITCHBOARD_MESSAGE "\r\r\rME WANT TALK TO MANY PEOPLE\r\r\r"
30
31#ifdef DEBUG
32#define debug( text... ) imcb_log( ic, text );
33#else
34#define debug( text... )
35#endif
36
37#define QRY_NAME "msmsgs@msnmsgr.com"
38#define QRY_CODE "Q1P7W2E4J9R8U3S5"
39
40#define MSN_SB_NEW         -24062002
41
42#define MSN_MESSAGE_HEADERS "MIME-Version: 1.0\r\n" \
43                            "Content-Type: text/plain; charset=UTF-8\r\n" \
44                            "User-Agent: BitlBee " BITLBEE_VERSION "\r\n" \
45                            "X-MMS-IM-Format: FN=MS%20Shell%20Dlg; EF=; CO=0; CS=0; PF=0\r\n" \
46                            "\r\n"
47
48#define MSN_TYPING_HEADERS "MIME-Version: 1.0\r\n" \
49                           "Content-Type: text/x-msmsgscontrol\r\n" \
50                           "TypingUser: %s\r\n" \
51                           "\r\n\r\n"
52
53#define PROFILE_URL "http://members.msn.com/"
54
55struct msn_data
56{
57        struct im_connection *ic;
58       
59        int fd;
60        struct msn_handler_data *handler;
61       
62        int trId;
63       
64        GSList *msgq;
65        GSList *switchboards;
66        int sb_failures;
67        time_t first_sb_failure;
68       
69        const struct msn_away_state *away_state;
70        int buddycount;
71        int groupcount;
72        char **grouplist;
73};
74
75struct msn_switchboard
76{
77        struct im_connection *ic;
78       
79        int fd;
80        gint inp;
81        struct msn_handler_data *handler;
82       
83        int trId;
84        int ready;
85       
86        int session;
87        char *key;
88       
89        GSList *msgq;
90        char *who;
91        struct groupchat *chat;
92};
93
94struct msn_away_state
95{
96        int number;
97        char code[4];
98        char name[16];
99};
100
101struct msn_status_code
102{
103        int number;
104        char *text;
105        int flags;
106};
107
108struct msn_message
109{
110        char *who;
111        char *text;
112};
113
114struct msn_handler_data
115{
116        int fd;
117        int rxlen;
118        char *rxq;
119       
120        int msglen;
121        char *cmd_text;
122       
123        gpointer data;
124       
125        int (*exec_command) ( gpointer data, char **cmd, int count );
126        int (*exec_message) ( gpointer data, char *msg, int msglen, char **cmd, int count );
127};
128
129/* Bitfield values for msn_status_code.flags */
130#define STATUS_FATAL            1
131#define STATUS_SB_FATAL         2
132#define STATUS_SB_IM_SPARE      4       /* Make one-to-one conversation switchboard available again, invite failed. */
133#define STATUS_SB_CHAT_SPARE    8       /* Same, but also for groupchats (not used yet). */
134
135int msn_chat_id;
136extern const struct msn_away_state msn_away_state_list[];
137extern const struct msn_status_code msn_status_code_list[];
138
139/* Keep a list of all the active connections. We need these lists because
140   "connected" callbacks might be called when the connection they belong too
141   is down already (for example, when an impatient user disabled the
142   connection), the callback should check whether it's still listed here
143   before doing *anything* else. */
144GSList *msn_connections;
145GSList *msn_switchboards;
146
147/* ns.c */
148gboolean msn_ns_connected( gpointer data, gint source, b_input_condition cond );
149
150/* msn_util.c */
151int msn_write( struct im_connection *ic, char *s, int len );
152int msn_logged_in( struct im_connection *ic );
153int msn_buddy_list_add( struct im_connection *ic, char *list, char *who, char *realname );
154int msn_buddy_list_remove( struct im_connection *ic, char *list, char *who );
155void msn_buddy_ask( struct im_connection *ic, char *handle, char *realname );
156char *msn_findheader( char *text, char *header, int len );
157char **msn_linesplit( char *line );
158int msn_handler( struct msn_handler_data *h );
159char *msn_http_encode( const char *input );
160void msn_msgq_purge( struct im_connection *ic, GSList **list );
161
162/* tables.c */
163const struct msn_away_state *msn_away_state_by_number( int number );
164const struct msn_away_state *msn_away_state_by_code( char *code );
165const struct msn_away_state *msn_away_state_by_name( char *name );
166const struct msn_status_code *msn_status_by_number( int number );
167
168/* sb.c */
169int msn_sb_write( struct msn_switchboard *sb, char *s, int len );
170struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session );
171struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle );
172struct msn_switchboard *msn_sb_by_chat( struct groupchat *c );
173struct msn_switchboard *msn_sb_spare( struct im_connection *ic );
174int msn_sb_sendmessage( struct msn_switchboard *sb, char *text );
175struct groupchat *msn_sb_to_chat( struct msn_switchboard *sb );
176void msn_sb_destroy( struct msn_switchboard *sb );
177gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond );
Note: See TracBrowser for help on using the repository browser.