source: protocols/msn/msn.h @ 99fe030

Last change on this file since 99fe030 was 99fe030, checked in by dequis <dx@…>, at 2015-05-13T08:05:01Z

msn: Implement sending typing notifications

Also remove some old unused debug stuff

  • Property mode set to 100644
File size: 7.3 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., 51 Franklin St.,
23  Fifth Floor, Boston, MA  02110-1301  USA
24*/
25
26#ifndef _MSN_H
27#define _MSN_H
28
29/* This should be MSN Messenger 7.0.0813
30#define MSNP11_PROD_KEY "CFHUR$52U_{VIX5T"
31#define MSNP11_PROD_ID  "PROD0101{0RM?UBW"
32*/
33
34#define MSN_NS_HOST "messenger.hotmail.com"
35#define MSN_NS_PORT "1863"
36
37/* Some other version.
38#define MSNP11_PROD_KEY "O4BG@C7BWLYQX?5G"
39#define MSNP11_PROD_ID  "PROD01065C%ZFN6F"
40*/
41
42/* <= BitlBee 3.0.5
43#define MSNP11_PROD_KEY "ILTXC!4IXB5FB*PX"
44#define MSNP11_PROD_ID  "PROD0119GSJUC$18"
45*/
46
47#define MSNP11_PROD_KEY "C1BX{V4W}Q3*10SM"
48#define MSNP11_PROD_ID  "PROD0120PW!CCV9@"
49#define MSNP_VER        "MSNP21"
50#define MSNP_BUILD      "14.0.8117.416"
51
52#define MSN_SB_NEW         -24062002
53
54#define MSN_CAP1        0xC000
55#define MSN_CAP2        0x0000
56
57#define MSN_BASE_HEADERS \
58        "Routing: 1.0\r\n" \
59        "To: 1:%s\r\n" \
60        "From: 1:%s;epid={%s}\r\n" \
61        "\r\n" \
62        "Reliability: 1.0\r\n" \
63        "\r\n"
64
65#define MSN_MESSAGE_HEADERS MSN_BASE_HEADERS \
66        "Messaging: 2.0\r\n" \
67        "Message-Type: %s\r\n" \
68        "Content-Length: %zd\r\n" \
69        "Content-Type: text/plain; charset=UTF-8\r\n" \
70        "X-MMS-IM-Format: FN=Segoe%%20UI; EF=; CO=0; CS=0; PF=0\r\n" \
71        "\r\n" \
72        "%s"
73
74#define MSN_PUT_HEADERS MSN_BASE_HEADERS \
75        "Publication: 1.0\r\n" \
76        "Uri: %s\r\n" \
77        "Content-Type: %s\r\n" \
78        "Content-Length: %zd\r\n" \
79        "\r\n" \
80        "%s"
81
82#define MSN_PUT_USER_BODY \
83        "<user>" \
84        "<s n=\"PE\"><UserTileLocation></UserTileLocation><FriendlyName>%s</FriendlyName><PSM>%s</PSM><DDP></DDP>" \
85        "<Scene></Scene><ASN></ASN><ColorScheme>-3</ColorScheme><BDG></BDG><RUM>%s</RUM><RUL></RUL><RLT>0</RLT>" \
86        "<RID></RID><SUL></SUL><MachineGuid>%s</MachineGuid></s>" \
87        "<s n=\"IM\"><Status>%s</Status><CurrentMedia></CurrentMedia></s>" \
88        "<sep n=\"PD\"><ClientType>1</ClientType><EpName>%s</EpName><Idle>%s</Idle><State>%s</State></sep>" \
89        "<sep n=\"PE\"><VER>BitlBee:" BITLBEE_VERSION "</VER><TYP>1</TYP><Capabilities>%d:%d</Capabilities></sep>" \
90        "<sep n=\"IM\"><Capabilities>%d:%d</Capabilities></sep>" \
91        "</user>"
92
93#define PROFILE_URL "http://members.msn.com/"
94
95typedef enum {
96        MSN_GOT_PROFILE = 1,
97        MSN_GOT_PROFILE_DN = 2,
98        MSN_DONE_ADL = 4,
99        MSN_REAUTHING = 8,
100        MSN_EMAIL_UNVERIFIED = 16,
101} msn_flags_t;
102
103struct msn_gw {
104        char *last_host;
105        int port;
106        gboolean ssl;
107
108        char *session_id;
109
110        GByteArray *in;
111        GByteArray *out;
112
113        int poll_timeout;
114
115        b_event_handler callback;
116
117        struct im_connection *ic;
118        struct msn_data *md;
119
120        gboolean open;
121        gboolean waiting;
122        gboolean polling;
123};
124
125struct msn_data {
126        int fd, inpa;
127        int rxlen;
128        char *rxq;
129
130        int msglen;
131        char *cmd_text;
132
133        struct im_connection *ic;
134
135        msn_flags_t flags;
136
137        int trId;
138        char *tokens[4];
139        char *lock_key, *pp_policy;
140        char *uuid;
141
142        GSList *msgq, *grpq, *soapq;
143
144        const struct msn_away_state *away_state;
145        GSList *groups;
146        char *profile_rid;
147
148        /* Mostly used for sending the ADL command; since MSNP13 the client
149           is responsible for downloading the contact list and then sending
150           it to the MSNP server. */
151        GTree *domaintree;
152        int adl_todo;
153
154        gboolean is_http;
155        struct msn_gw *gw;
156};
157
158struct msn_away_state {
159        char code[4];
160        char name[16];
161};
162
163struct msn_status_code {
164        int number;
165        char *text;
166        int flags;
167};
168
169struct msn_message {
170        char *who;
171        char *text;
172};
173
174struct msn_groupadd {
175        char *who;
176        char *group;
177};
178
179typedef enum {
180        MSN_BUDDY_FL = 1,   /* Warning: FL,AL,BL *must* be 1,2,4. */
181        MSN_BUDDY_AL = 2,
182        MSN_BUDDY_BL = 4,
183        MSN_BUDDY_RL = 8,
184        MSN_BUDDY_PL = 16,
185        MSN_BUDDY_ADL_SYNCED = 256,
186        MSN_BUDDY_FED = 512,
187} msn_buddy_flags_t;
188
189struct msn_buddy_data {
190        char *cid;
191        msn_buddy_flags_t flags;
192};
193
194struct msn_group {
195        char *name;
196        char *id;
197};
198
199/* Bitfield values for msn_status_code.flags */
200#define STATUS_FATAL            1
201#define STATUS_SB_FATAL         2
202
203extern int msn_chat_id;
204extern const struct msn_away_state msn_away_state_list[];
205extern const struct msn_status_code msn_status_code_list[];
206
207/* Keep a list of all the active connections. We need these lists because
208   "connected" callbacks might be called when the connection they belong too
209   is down already (for example, when an impatient user disabled the
210   connection), the callback should check whether it's still listed here
211   before doing *anything* else. */
212extern GSList *msn_connections;
213
214/* ns.c */
215int msn_ns_write(struct im_connection *ic, int fd, const char *fmt, ...) G_GNUC_PRINTF(3, 4);
216gboolean msn_ns_connect(struct im_connection *ic, const char *host, int port);
217void msn_ns_close(struct msn_data *handler);
218void msn_auth_got_passport_token(struct im_connection *ic, const char *token, const char *error);
219void msn_auth_got_contact_list(struct im_connection *ic);
220int msn_ns_finish_login(struct im_connection *ic);
221int msn_ns_send_typing(struct im_connection *ic, struct bee_user *bu);
222int msn_ns_send_message(struct im_connection *ic, struct bee_user *bu, const char *text);
223int msn_ns_command(struct msn_data *md, char **cmd, int num_parts);
224int msn_ns_message(struct msn_data *md, char *msg, int msglen, char **cmd, int num_parts);
225
226/* msn_util.c */
227int msn_buddy_list_add(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_,
228                       const char *group);
229int msn_buddy_list_remove(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group);
230void msn_buddy_ask(bee_user_t *bu);
231void msn_queue_feed(struct msn_data *h, char *bytes, int st);
232int msn_handler(struct msn_data *h);
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);
238const char *msn_normalize_handle(const char *handle);
239
240/* tables.c */
241const struct msn_away_state *msn_away_state_by_number(int number);
242const struct msn_away_state *msn_away_state_by_code(char *code);
243const struct msn_away_state *msn_away_state_by_name(char *name);
244const struct msn_status_code *msn_status_by_number(int number);
245
246/* gw.c */
247struct msn_gw *msn_gw_new(struct im_connection *ic);
248void msn_gw_free(struct msn_gw *gw);
249void msn_gw_open(struct msn_gw *gw);
250ssize_t msn_gw_read(struct msn_gw *gw, char **buf);
251void msn_gw_write(struct msn_gw *gw, char *buf, size_t len);
252
253#endif //_MSN_H
Note: See TracBrowser for help on using the repository browser.