source: protocols/msn/msn.h @ 9b1d2d6

Last change on this file since 9b1d2d6 was 80175a1, checked in by Wilmer van der Gaast <wilmer@…>, at 2010-08-18T19:21:44Z

Fetch the user's profile to see if there's a display name set there. If
there is, the one in the address book should be ignored. No support for
changing the profile yet though.

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