source: protocols/msn/msn.h @ 36f6ab3

Last change on this file since 36f6ab3 was 509cf60, checked in by Wilmer van der Gaast <wilmer@…>, at 2012-10-20T00:02:45Z

Some more removals. Using ifdefs instead of read deletions in Yahoo! dir to
not make merges too complicated (although upstream really seems dead at this
point :-/).

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