source: protocols/msn/msn.h @ 76c89dc7

Last change on this file since 76c89dc7 was 76c89dc7, checked in by Wilmer van der Gaast <wilmer@…>, at 2010-12-12T00:25:17Z

Allow changing MSN display names in server-side profiles. (I.e. the changes
are finally always persistent again.)

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