source: protocols/msn/msn.h @ bae0617

Last change on this file since bae0617 was bae0617, checked in by Wilmer van der Gaast <wilmer@…>, at 2010-09-03T21:24:58Z

Rearrange things a bit to support multiple NS connections. This is apparently
needed for refreshing auth. tokens.

  • Property mode set to 100644
File size: 7.9 KB
RevLine 
[b7d3cc34]1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
[21029d0]4  * Copyright 2002-2010 Wilmer van der Gaast and others                *
[b7d3cc34]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
[a830512]26#ifndef _MSN_H
27#define _MSN_H
28
[b7d3cc34]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"
[9bf2481]33#define SB_KEEPALIVE_MESSAGE "\r\r\rDONT HANG UP ON ME!\r\r\r"
[b7d3cc34]34
[aa31117]35#ifdef DEBUG_MSN
[59f527b6]36#define debug( text... ) imcb_log( ic, text );
[b7d3cc34]37#else
38#define debug( text... )
39#endif
40
[be7a180]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*/
[e5a8118]45
[bae0617]46#define MSN_NS_HOST "messenger.hotmail.com"
47#define MSN_NS_PORT 1863
48
[be7a180]49/* Some other version.
[e5a8118]50#define MSNP11_PROD_KEY "O4BG@C7BWLYQX?5G"
51#define MSNP11_PROD_ID  "PROD01065C%ZFN6F"
[be7a180]52*/
53
[91d6e91]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"
[21029d0]58
[b7d3cc34]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
[9bf2481]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
[b7d3cc34]76#define PROFILE_URL "http://members.msn.com/"
77
[80175a1]78typedef enum
79{
80        MSN_GOT_PROFILE = 1,
81        MSN_GOT_PROFILE_DN = 2,
82        MSN_DONE_ADL = 4,
83} msn_flags_t;
84
[bae0617]85struct msn_handler_data
86{
87        int fd, inpa;
88        int rxlen;
89        char *rxq;
90       
91        int msglen;
92        char *cmd_text;
93       
94        /* Either ic or sb */
95        gpointer data;
96       
97        int (*exec_command) ( struct msn_handler_data *handler, char **cmd, int count );
98        int (*exec_message) ( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int count );
99};
100
[b7d3cc34]101struct msn_data
102{
[0da65d5]103        struct im_connection *ic;
[b7d3cc34]104       
[bae0617]105        struct msn_handler_data ns[1], auth[1];
[80175a1]106        msn_flags_t flags;
[b7d3cc34]107       
108        int trId;
[80175a1]109        char *tokens[4];
[e5a8118]110        char *lock_key;
[b7d3cc34]111       
[70ac477]112        GSList *msgq, *grpq;
[b7d3cc34]113        GSList *switchboards;
[59f527b6]114        int sb_failures;
115        time_t first_sb_failure;
[bc736cfa]116       
[59f527b6]117        const struct msn_away_state *away_state;
[ff27648]118        GSList *groups;
[5a7af1b]119       
120        /* Mostly used for sending the ADL command; since MSNP13 the client
121           is responsible for downloading the contact list and then sending
122           it to the MSNP server. */
[ca7de3a]123        GTree *domaintree;
[5a7af1b]124        int adl_todo;
[b7d3cc34]125};
126
127struct msn_switchboard
128{
[0da65d5]129        struct im_connection *ic;
[b7d3cc34]130       
[bae0617]131        /* The following two are also in the handler. TODO: Clean up. */
[b7d3cc34]132        int fd;
133        gint inp;
134        struct msn_handler_data *handler;
[9bf2481]135        gint keepalive;
[b7d3cc34]136       
137        int trId;
138        int ready;
139       
140        int session;
141        char *key;
142       
143        GSList *msgq;
144        char *who;
[0da65d5]145        struct groupchat *chat;
[b7d3cc34]146};
147
148struct msn_away_state
149{
150        char code[4];
151        char name[16];
152};
153
154struct msn_status_code
155{
156        int number;
157        char *text;
158        int flags;
159};
160
161struct msn_message
162{
163        char *who;
164        char *text;
165};
166
[70ac477]167struct msn_groupadd
168{
169        char *who;
170        char *group;
171};
172
[7f34ce2]173typedef enum
174{
[ca7de3a]175        MSN_BUDDY_FL = 1,   /* Warning: FL,AL,BL *must* be 1,2,4. */
[7f34ce2]176        MSN_BUDDY_AL = 2,
177        MSN_BUDDY_BL = 4,
178        MSN_BUDDY_RL = 8,
179        MSN_BUDDY_PL = 16,
[5a7af1b]180        MSN_BUDDY_ADL_SYNCED = 256,
[7f34ce2]181} msn_buddy_flags_t;
182
183struct msn_buddy_data
184{
185        char *cid;
186        msn_buddy_flags_t flags;
187};
188
[ff27648]189struct msn_group
190{
191        char *name;
192        char *id;
193};
194
[b7d3cc34]195/* Bitfield values for msn_status_code.flags */
196#define STATUS_FATAL            1
197#define STATUS_SB_FATAL         2
[3b9390b]198#define STATUS_SB_IM_SPARE      4       /* Make one-to-one conversation switchboard available again, invite failed. */
199#define STATUS_SB_CHAT_SPARE    8       /* Same, but also for groupchats (not used yet). */
[b7d3cc34]200
[c6ca3ee]201extern int msn_chat_id;
[0196c47]202extern const struct msn_away_state msn_away_state_list[];
203extern const struct msn_status_code msn_status_code_list[];
[b7d3cc34]204
205/* Keep a list of all the active connections. We need these lists because
206   "connected" callbacks might be called when the connection they belong too
207   is down already (for example, when an impatient user disabled the
208   connection), the callback should check whether it's still listed here
209   before doing *anything* else. */
[c6ca3ee]210extern GSList *msn_connections;
211extern GSList *msn_switchboards;
[b7d3cc34]212
213/* ns.c */
[64768d4]214int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... );
[bae0617]215gboolean msn_ns_connect( struct im_connection *ic, struct msn_handler_data *handler, const char *host, int port );
216void msn_ns_close( struct msn_handler_data *handler );
[660cb00]217void msn_auth_got_passport_token( struct im_connection *ic, const char *token, const char *error );
[ca7de3a]218void msn_auth_got_contact_list( struct im_connection *ic );
[80175a1]219int msn_ns_finish_login( struct im_connection *ic );
[b7d3cc34]220
221/* msn_util.c */
[0da65d5]222int msn_logged_in( struct im_connection *ic );
[193dc74]223int msn_buddy_list_add( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_, const char *group );
224int msn_buddy_list_remove( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group );
[e5854a8]225void msn_buddy_ask( bee_user_t *bu );
[b7d3cc34]226char *msn_findheader( char *text, char *header, int len );
227char **msn_linesplit( char *line );
228int msn_handler( struct msn_handler_data *h );
[46dca11]229void msn_msgq_purge( struct im_connection *ic, GSList **list );
[21029d0]230char *msn_p11_challenge( char *challenge );
[ca7de3a]231gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_ );
[ff27648]232struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name );
233struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id );
[e0e1546]234int msn_ns_set_display_name( struct im_connection *ic, const char *value );
[b7d3cc34]235
236/* tables.c */
[0196c47]237const struct msn_away_state *msn_away_state_by_number( int number );
238const struct msn_away_state *msn_away_state_by_code( char *code );
239const struct msn_away_state *msn_away_state_by_name( char *name );
240const struct msn_status_code *msn_status_by_number( int number );
[b7d3cc34]241
242/* sb.c */
[64768d4]243int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... );
[0da65d5]244struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session );
245struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle );
246struct msn_switchboard *msn_sb_by_chat( struct groupchat *c );
247struct msn_switchboard *msn_sb_spare( struct im_connection *ic );
[b7d3cc34]248int msn_sb_sendmessage( struct msn_switchboard *sb, char *text );
[0da65d5]249struct groupchat *msn_sb_to_chat( struct msn_switchboard *sb );
[b7d3cc34]250void msn_sb_destroy( struct msn_switchboard *sb );
[ba9edaa]251gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond );
[a830512]252int msn_sb_write_msg( struct im_connection *ic, struct msn_message *m );
[bb839e8]253void msn_sb_start_keepalives( struct msn_switchboard *sb, gboolean initial );
254void msn_sb_stop_keepalives( struct msn_switchboard *sb );
[a830512]255
256#endif //_MSN_H
Note: See TracBrowser for help on using the repository browser.