source: protocols/msn/msn.h @ 57b4525

Last change on this file since 57b4525 was 9c84617, checked in by Wilmer van der Gaast <wilmer@…>, at 2010-12-13T00:42:58Z

Silently adding /CTCP NUDGE support for MSN contacts.

  • Property mode set to 100644
File size: 8.2 KB
Line 
1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2010 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#ifndef _MSN_H
27#define _MSN_H
28
29/* Some hackish magicstrings to make special-purpose messages/switchboards.
30 */
31#define TYPING_NOTIFICATION_MESSAGE "\r\r\rBEWARE, ME R TYPINK MESSAGE!!!!\r\r\r"
32#define NUDGE_MESSAGE "\r\r\rSHAKE THAT THING\r\r\r"
33#define GROUPCHAT_SWITCHBOARD_MESSAGE "\r\r\rME WANT TALK TO MANY PEOPLE\r\r\r"
34#define SB_KEEPALIVE_MESSAGE "\r\r\rDONT HANG UP ON ME!\r\r\r"
35
36#ifdef DEBUG_MSN
37#define debug( text... ) imcb_log( ic, text );
38#else
39#define debug( text... )
40#endif
41
42/* This should be MSN Messenger 7.0.0813
43#define MSNP11_PROD_KEY "CFHUR$52U_{VIX5T"
44#define MSNP11_PROD_ID  "PROD0101{0RM?UBW"
45*/
46
47#define MSN_NS_HOST "messenger.hotmail.com"
48#define MSN_NS_PORT 1863
49
50/* Some other version.
51#define MSNP11_PROD_KEY "O4BG@C7BWLYQX?5G"
52#define MSNP11_PROD_ID  "PROD01065C%ZFN6F"
53*/
54
55#define MSNP11_PROD_KEY "ILTXC!4IXB5FB*PX"
56#define MSNP11_PROD_ID  "PROD0119GSJUC$18"
57#define MSNP_VER        "MSNP15"
58#define MSNP_BUILD      "8.5.1288"
59
60#define MSN_SB_NEW         -24062002
61
62#define MSN_MESSAGE_HEADERS "MIME-Version: 1.0\r\n" \
63                            "Content-Type: text/plain; charset=UTF-8\r\n" \
64                            "User-Agent: BitlBee " BITLBEE_VERSION "\r\n" \
65                            "X-MMS-IM-Format: FN=MS%20Shell%20Dlg; EF=; CO=0; CS=0; PF=0\r\n" \
66                            "\r\n"
67
68#define MSN_TYPING_HEADERS "MIME-Version: 1.0\r\n" \
69                           "Content-Type: text/x-msmsgscontrol\r\n" \
70                           "TypingUser: %s\r\n" \
71                           "\r\n\r\n"
72
73#define MSN_NUDGE_HEADERS "MIME-Version: 1.0\r\n" \
74                          "Content-Type: text/x-msnmsgr-datacast\r\n" \
75                          "\r\n" \
76                          "ID: 1\r\n" \
77                          "\r\n"
78
79#define MSN_SB_KEEPALIVE_HEADERS "MIME-Version: 1.0\r\n" \
80                                 "Content-Type: text/x-ping\r\n" \
81                                 "\r\n\r\n"
82
83#define PROFILE_URL "http://members.msn.com/"
84
85typedef enum
86{
87        MSN_GOT_PROFILE = 1,
88        MSN_GOT_PROFILE_DN = 2,
89        MSN_DONE_ADL = 4,
90        MSN_REAUTHING = 8,
91        MSN_EMAIL_UNVERIFIED = 16,
92} msn_flags_t;
93
94struct msn_handler_data
95{
96        int fd, inpa;
97        int rxlen;
98        char *rxq;
99       
100        int msglen;
101        char *cmd_text;
102       
103        /* Either ic or sb */
104        gpointer data;
105       
106        int (*exec_command) ( struct msn_handler_data *handler, char **cmd, int count );
107        int (*exec_message) ( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int count );
108};
109
110struct msn_data
111{
112        struct im_connection *ic;
113       
114        struct msn_handler_data ns[1];
115        msn_flags_t flags;
116       
117        int trId;
118        char *tokens[4];
119        char *lock_key, *pp_policy;
120       
121        GSList *msgq, *grpq, *soapq;
122        GSList *switchboards;
123        int sb_failures;
124        time_t first_sb_failure;
125       
126        const struct msn_away_state *away_state;
127        GSList *groups;
128        char *profile_rid;
129       
130        /* Mostly used for sending the ADL command; since MSNP13 the client
131           is responsible for downloading the contact list and then sending
132           it to the MSNP server. */
133        GTree *domaintree;
134        int adl_todo;
135};
136
137struct msn_switchboard
138{
139        struct im_connection *ic;
140       
141        /* The following two are also in the handler. TODO: Clean up. */
142        int fd;
143        gint inp;
144        struct msn_handler_data *handler;
145        gint keepalive;
146       
147        int trId;
148        int ready;
149       
150        int session;
151        char *key;
152       
153        GSList *msgq;
154        char *who;
155        struct groupchat *chat;
156};
157
158struct msn_away_state
159{
160        char code[4];
161        char name[16];
162};
163
164struct msn_status_code
165{
166        int number;
167        char *text;
168        int flags;
169};
170
171struct msn_message
172{
173        char *who;
174        char *text;
175};
176
177struct msn_groupadd
178{
179        char *who;
180        char *group;
181};
182
183typedef enum
184{
185        MSN_BUDDY_FL = 1,   /* Warning: FL,AL,BL *must* be 1,2,4. */
186        MSN_BUDDY_AL = 2,
187        MSN_BUDDY_BL = 4,
188        MSN_BUDDY_RL = 8,
189        MSN_BUDDY_PL = 16,
190        MSN_BUDDY_ADL_SYNCED = 256,
191} msn_buddy_flags_t;
192
193struct msn_buddy_data
194{
195        char *cid;
196        msn_buddy_flags_t flags;
197};
198
199struct msn_group
200{
201        char *name;
202        char *id;
203};
204
205/* Bitfield values for msn_status_code.flags */
206#define STATUS_FATAL            1
207#define STATUS_SB_FATAL         2
208#define STATUS_SB_IM_SPARE      4       /* Make one-to-one conversation switchboard available again, invite failed. */
209#define STATUS_SB_CHAT_SPARE    8       /* Same, but also for groupchats (not used yet). */
210
211extern int msn_chat_id;
212extern const struct msn_away_state msn_away_state_list[];
213extern const struct msn_status_code msn_status_code_list[];
214
215/* Keep a list of all the active connections. We need these lists because
216   "connected" callbacks might be called when the connection they belong too
217   is down already (for example, when an impatient user disabled the
218   connection), the callback should check whether it's still listed here
219   before doing *anything* else. */
220extern GSList *msn_connections;
221extern GSList *msn_switchboards;
222
223/* ns.c */
224int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... );
225gboolean msn_ns_connect( struct im_connection *ic, struct msn_handler_data *handler, const char *host, int port );
226void msn_ns_close( struct msn_handler_data *handler );
227void msn_auth_got_passport_token( struct im_connection *ic, const char *token, const char *error );
228void msn_auth_got_contact_list( struct im_connection *ic );
229int msn_ns_finish_login( struct im_connection *ic );
230
231/* msn_util.c */
232int msn_logged_in( struct im_connection *ic );
233int msn_buddy_list_add( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_, const char *group );
234int msn_buddy_list_remove( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group );
235void msn_buddy_ask( bee_user_t *bu );
236char *msn_findheader( char *text, char *header, int len );
237char **msn_linesplit( char *line );
238int msn_handler( struct msn_handler_data *h );
239void msn_msgq_purge( struct im_connection *ic, GSList **list );
240char *msn_p11_challenge( char *challenge );
241gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_ );
242struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name );
243struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id );
244int msn_ns_set_display_name( struct im_connection *ic, const char *value );
245
246/* tables.c */
247const struct msn_away_state *msn_away_state_by_number( int number );
248const struct msn_away_state *msn_away_state_by_code( char *code );
249const struct msn_away_state *msn_away_state_by_name( char *name );
250const struct msn_status_code *msn_status_by_number( int number );
251
252/* sb.c */
253int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... );
254struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session );
255struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle );
256struct msn_switchboard *msn_sb_by_chat( struct groupchat *c );
257struct msn_switchboard *msn_sb_spare( struct im_connection *ic );
258int msn_sb_sendmessage( struct msn_switchboard *sb, char *text );
259struct groupchat *msn_sb_to_chat( struct msn_switchboard *sb );
260void msn_sb_destroy( struct msn_switchboard *sb );
261gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond );
262int msn_sb_write_msg( struct im_connection *ic, struct msn_message *m );
263void msn_sb_start_keepalives( struct msn_switchboard *sb, gboolean initial );
264void msn_sb_stop_keepalives( struct msn_switchboard *sb );
265
266#endif //_MSN_H
Note: See TracBrowser for help on using the repository browser.