source: protocols/msn/msn.h @ 89db90e

Last change on this file since 89db90e was 5ebff60, checked in by dequis <dx@…>, at 2015-02-20T22:50:54Z

Reindent everything to K&R style with tabs

Used uncrustify, with the configuration file in ./doc/uncrustify.cfg

Commit author set to "Indent <please@…>" so that it's easier to
skip while doing git blame.

  • Property mode set to 100644
File size: 8.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/* 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        MSN_GOT_PROFILE = 1,
95        MSN_GOT_PROFILE_DN = 2,
96        MSN_DONE_ADL = 4,
97        MSN_REAUTHING = 8,
98        MSN_EMAIL_UNVERIFIED = 16,
99} msn_flags_t;
100
101struct msn_handler_data {
102        int fd, inpa;
103        int rxlen;
104        char *rxq;
105
106        int msglen;
107        char *cmd_text;
108
109        /* Either ic or sb */
110        gpointer data;
111
112        int (*exec_command) (struct msn_handler_data *handler, char **cmd, int count);
113        int (*exec_message) (struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int count);
114};
115
116struct msn_data {
117        struct im_connection *ic;
118
119        struct msn_handler_data ns[1];
120        msn_flags_t flags;
121
122        int trId;
123        char *tokens[4];
124        char *lock_key, *pp_policy;
125        char *uuid;
126
127        GSList *msgq, *grpq, *soapq;
128        GSList *switchboards;
129        int sb_failures;
130        time_t first_sb_failure;
131
132        const struct msn_away_state *away_state;
133        GSList *groups;
134        char *profile_rid;
135
136        /* Mostly used for sending the ADL command; since MSNP13 the client
137           is responsible for downloading the contact list and then sending
138           it to the MSNP server. */
139        GTree *domaintree;
140        int adl_todo;
141};
142
143struct msn_switchboard {
144        struct im_connection *ic;
145
146        /* The following two are also in the handler. TODO: Clean up. */
147        int fd;
148        gint inp;
149        struct msn_handler_data *handler;
150        gint keepalive;
151
152        int trId;
153        int ready;
154
155        int session;
156        char *key;
157
158        GSList *msgq;
159        char *who;
160        struct groupchat *chat;
161};
162
163struct msn_away_state {
164        char code[4];
165        char name[16];
166};
167
168struct msn_status_code {
169        int number;
170        char *text;
171        int flags;
172};
173
174struct msn_message {
175        char *who;
176        char *text;
177};
178
179struct msn_groupadd {
180        char *who;
181        char *group;
182};
183
184typedef enum {
185        MSN_BUDDY_FL = 1,   /* Warning: FL,AL,BL *must* be 1,2,4. */
186        MSN_BUDDY_AL = 2,
187        MSN_BUDDY_BL = 4,
188        MSN_BUDDY_RL = 8,
189        MSN_BUDDY_PL = 16,
190        MSN_BUDDY_ADL_SYNCED = 256,
191        MSN_BUDDY_FED = 512,
192} msn_buddy_flags_t;
193
194struct msn_buddy_data {
195        char *cid;
196        msn_buddy_flags_t flags;
197};
198
199struct msn_group {
200        char *name;
201        char *id;
202};
203
204/* Bitfield values for msn_status_code.flags */
205#define STATUS_FATAL            1
206#define STATUS_SB_FATAL         2
207#define STATUS_SB_IM_SPARE      4       /* Make one-to-one conversation switchboard available again, invite failed. */
208#define STATUS_SB_CHAT_SPARE    8       /* Same, but also for groupchats (not used yet). */
209
210extern int msn_chat_id;
211extern const struct msn_away_state msn_away_state_list[];
212extern const struct msn_status_code msn_status_code_list[];
213
214/* Keep a list of all the active connections. We need these lists because
215   "connected" callbacks might be called when the connection they belong too
216   is down already (for example, when an impatient user disabled the
217   connection), the callback should check whether it's still listed here
218   before doing *anything* else. */
219extern GSList *msn_connections;
220extern GSList *msn_switchboards;
221
222/* ns.c */
223int msn_ns_write(struct im_connection *ic, int fd, const char *fmt, ...) G_GNUC_PRINTF(3, 4);
224gboolean msn_ns_connect(struct im_connection *ic, struct msn_handler_data *handler, const char *host, int port);
225void msn_ns_close(struct msn_handler_data *handler);
226void msn_auth_got_passport_token(struct im_connection *ic, const char *token, const char *error);
227void msn_auth_got_contact_list(struct im_connection *ic);
228int msn_ns_finish_login(struct im_connection *ic);
229int msn_ns_sendmessage(struct im_connection *ic, struct bee_user *bu, const char *text);
230void msn_ns_oim_send_queue(struct im_connection *ic, GSList **msgq);
231
232/* msn_util.c */
233int msn_buddy_list_add(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_,
234                       const char *group);
235int msn_buddy_list_remove(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group);
236void msn_buddy_ask(bee_user_t *bu);
237char **msn_linesplit(char *line);
238int msn_handler(struct msn_handler_data *h);
239void msn_msgq_purge(struct im_connection *ic, GSList **list);
240char *msn_p11_challenge(char *challenge);
241gint msn_domaintree_cmp(gconstpointer a_, gconstpointer b_);
242struct msn_group *msn_group_by_name(struct im_connection *ic, const char *name);
243struct msn_group *msn_group_by_id(struct im_connection *ic, const char *id);
244int msn_ns_set_display_name(struct im_connection *ic, const char *value);
245const char *msn_normalize_handle(const char *handle);
246
247/* tables.c */
248const struct msn_away_state *msn_away_state_by_number(int number);
249const struct msn_away_state *msn_away_state_by_code(char *code);
250const struct msn_away_state *msn_away_state_by_name(char *name);
251const struct msn_status_code *msn_status_by_number(int number);
252
253/* sb.c */
254int msn_sb_write(struct msn_switchboard *sb, const char *fmt, ...) G_GNUC_PRINTF(2, 3);;
255struct msn_switchboard *msn_sb_create(struct im_connection *ic, char *host, int port, char *key, int session);
256struct msn_switchboard *msn_sb_by_handle(struct im_connection *ic, const char *handle);
257struct msn_switchboard *msn_sb_by_chat(struct groupchat *c);
258struct msn_switchboard *msn_sb_spare(struct im_connection *ic);
259int msn_sb_sendmessage(struct msn_switchboard *sb, char *text);
260struct groupchat *msn_sb_to_chat(struct msn_switchboard *sb);
261void msn_sb_destroy(struct msn_switchboard *sb);
262gboolean msn_sb_connected(gpointer data, gint source, b_input_condition cond);
263int msn_sb_write_msg(struct im_connection *ic, struct msn_message *m);
264void msn_sb_start_keepalives(struct msn_switchboard *sb, gboolean initial);
265void msn_sb_stop_keepalives(struct msn_switchboard *sb);
266
267#endif //_MSN_H
Note: See TracBrowser for help on using the repository browser.