1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
|
/*
Jabber Protocol Plugin for Miranda IM
Copyright (C) 2002-04 Santithorn Bunchua
Copyright (C) 2005-12 George Hazan
Copyright (C) 2007 Maxim Mluhov
Copyright (C) 2012-13 Miranda NG Project
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _JABBER_CAPS_H_
#define _JABBER_CAPS_H_
#include "jabber_iq.h"
typedef unsigned __int64 JabberCapsBits;
#define JABBER_RESOURCE_CAPS_QUERY_TIMEOUT 10000
#ifdef __GNUC__
#define JABBER_RESOURCE_CAPS_ERROR 0x8000000000000000ULL
#define JABBER_RESOURCE_CAPS_IN_PROGRESS 0x8000000000000001ULL
#define JABBER_RESOURCE_CAPS_TIMEOUT 0x8000000000000002ULL
#define JABBER_RESOURCE_CAPS_UNINIT 0x8000000000000003ULL
#define JABBER_RESOURCE_CAPS_NONE 0x0000000000000000ULL
#else
#define JABBER_RESOURCE_CAPS_ERROR 0x8000000000000000
#define JABBER_RESOURCE_CAPS_IN_PROGRESS 0x8000000000000001
#define JABBER_RESOURCE_CAPS_TIMEOUT 0x8000000000000002
#define JABBER_RESOURCE_CAPS_UNINIT 0x8000000000000003
#define JABBER_RESOURCE_CAPS_NONE 0x0000000000000000
#endif
#define JABBER_FEAT_DISCO_INFO _T("http://jabber.org/protocol/disco#info")
#define JABBER_CAPS_DISCO_INFO ((JabberCapsBits)1)
#define JABBER_FEAT_DISCO_ITEMS _T("http://jabber.org/protocol/disco#items")
#define JABBER_CAPS_DISCO_ITEMS ((JabberCapsBits)1<<1)
#define JABBER_FEAT_ENTITY_CAPS _T("http://jabber.org/protocol/caps")
#define JABBER_CAPS_ENTITY_CAPS ((JabberCapsBits)1<<2)
#define JABBER_FEAT_SI _T("http://jabber.org/protocol/si")
#define JABBER_CAPS_SI ((JabberCapsBits)1<<3)
#define JABBER_FEAT_SI_FT _T("http://jabber.org/protocol/si/profile/file-transfer")
#define JABBER_CAPS_SI_FT ((JabberCapsBits)1<<4)
#define JABBER_FEAT_BYTESTREAMS _T("http://jabber.org/protocol/bytestreams")
#define JABBER_CAPS_BYTESTREAMS ((JabberCapsBits)1<<5)
#define JABBER_FEAT_IBB _T("http://jabber.org/protocol/ibb")
#define JABBER_CAPS_IBB ((JabberCapsBits)1<<6)
#define JABBER_FEAT_OOB _T("jabber:iq:oob")
#define JABBER_FEAT_OOB2 _T("jabber:x:oob")
#define JABBER_CAPS_OOB ((JabberCapsBits)1<<7)
#define JABBER_FEAT_COMMANDS _T("http://jabber.org/protocol/commands")
#define JABBER_CAPS_COMMANDS ((JabberCapsBits)1<<8)
#define JABBER_FEAT_REGISTER _T("jabber:iq:register")
#define JABBER_CAPS_REGISTER ((JabberCapsBits)1<<9)
#define JABBER_FEAT_MUC _T("http://jabber.org/protocol/muc")
#define JABBER_CAPS_MUC ((JabberCapsBits)1<<10)
#define JABBER_FEAT_CHATSTATES _T("http://jabber.org/protocol/chatstates")
#define JABBER_CAPS_CHATSTATES ((JabberCapsBits)1<<11)
#define JABBER_FEAT_LAST_ACTIVITY _T("jabber:iq:last")
#define JABBER_CAPS_LAST_ACTIVITY ((JabberCapsBits)1<<12)
#define JABBER_FEAT_VERSION _T("jabber:iq:version")
#define JABBER_CAPS_VERSION ((JabberCapsBits)1<<13)
#define JABBER_FEAT_ENTITY_TIME _T("urn:xmpp:time")
#define JABBER_CAPS_ENTITY_TIME ((JabberCapsBits)1<<14)
#define JABBER_FEAT_PING _T("urn:xmpp:ping")
#define JABBER_CAPS_PING ((JabberCapsBits)1<<15)
#define JABBER_FEAT_DATA_FORMS _T("jabber:x:data")
#define JABBER_CAPS_DATA_FORMS ((JabberCapsBits)1<<16)
#define JABBER_FEAT_MESSAGE_EVENTS _T("jabber:x:event")
#define JABBER_CAPS_MESSAGE_EVENTS ((JabberCapsBits)1<<17)
#define JABBER_FEAT_VCARD_TEMP _T("vcard-temp")
#define JABBER_CAPS_VCARD_TEMP ((JabberCapsBits)1<<18)
#define JABBER_FEAT_AVATAR _T("jabber:iq:avatar")
#define JABBER_FEAT_SERVER_AVATAR _T("storage:client:avatar")
#define JABBER_CAPS_AVATAR ((JabberCapsBits)1<<19)
#define JABBER_FEAT_XHTML _T("http://jabber.org/protocol/xhtml-im")
#define JABBER_CAPS_XHTML ((JabberCapsBits)1<<20)
#define JABBER_FEAT_AGENTS _T("jabber:iq:agents")
#define JABBER_CAPS_AGENTS ((JabberCapsBits)1<<21)
#define JABBER_FEAT_BROWSE _T("jabber:iq:browse")
#define JABBER_CAPS_BROWSE ((JabberCapsBits)1<<22)
#define JABBER_FEAT_FEATURE_NEG _T("http://jabber.org/protocol/feature-neg")
#define JABBER_CAPS_FEATURE_NEG ((JabberCapsBits)1<<23)
#define JABBER_FEAT_AMP _T("http://jabber.org/protocol/amp")
#define JABBER_CAPS_AMP ((JabberCapsBits)1<<24)
#define JABBER_FEAT_USER_MOOD _T("http://jabber.org/protocol/mood")
#define JABBER_CAPS_USER_MOOD ((JabberCapsBits)1<<25)
#define JABBER_FEAT_USER_MOOD_NOTIFY _T("http://jabber.org/protocol/mood+notify")
#define JABBER_CAPS_USER_MOOD_NOTIFY ((JabberCapsBits)1<<26)
#define JABBER_FEAT_PUBSUB _T("http://jabber.org/protocol/pubsub")
#define JABBER_CAPS_PUBSUB ((JabberCapsBits)1<<27)
#define JABBER_FEAT_SECUREIM _T("http://miranda-ng.org/caps/secureim")
#define JABBER_CAPS_SECUREIM ((JabberCapsBits)1<<28)
#define JABBER_FEAT_MIROTR _T("http://miranda-ng.org/caps/mirotr")
#define JABBER_CAPS_MIROTR ((JabberCapsBits)1<<42)
#define JABBER_FEAT_NEWGPG _T("http://miranda-ng.org/caps/new_gpg")
#define JABBER_CAPS_NEWGPG ((JabberCapsBits)1<<43)
#define JABBER_CAPS_PLATFORMX86 ((JabberCapsBits)1<<44)
#define JABBER_CAPS_PLATFORMX64 ((JabberCapsBits)1<<45)
#define JABBER_FEAT_PRIVACY_LISTS _T("jabber:iq:privacy")
#define JABBER_CAPS_PRIVACY_LISTS ((JabberCapsBits)1<<29)
#define JABBER_FEAT_MESSAGE_RECEIPTS _T("urn:xmpp:receipts")
#define JABBER_CAPS_MESSAGE_RECEIPTS ((JabberCapsBits)1<<30)
#define JABBER_FEAT_USER_TUNE _T("http://jabber.org/protocol/tune")
#define JABBER_CAPS_USER_TUNE ((JabberCapsBits)1<<31)
#define JABBER_FEAT_USER_TUNE_NOTIFY _T("http://jabber.org/protocol/tune+notify")
#define JABBER_CAPS_USER_TUNE_NOTIFY ((JabberCapsBits)1<<32)
#define JABBER_FEAT_PRIVATE_STORAGE _T("jabber:iq:private")
#define JABBER_CAPS_PRIVATE_STORAGE ((JabberCapsBits)1<<33)
#define JABBER_FEAT_ARCHIVE _T("urn:xmpp:archive")
#define JABBER_FEAT_ARCHIVE_AUTO _T("urn:xmpp:archive:auto")
#define JABBER_CAPS_ARCHIVE_AUTO ((JabberCapsBits)1<<34)
#define JABBER_FEAT_ARCHIVE_MANAGE _T("urn:xmpp:archive:manage")
#define JABBER_CAPS_ARCHIVE_MANAGE ((JabberCapsBits)1<<35)
#define JABBER_FEAT_CAPTCHA _T("urn:xmpp:captcha")
// deferred
#define JABBER_FEAT_ATTENTION _T("http://www.xmpp.org/extensions/xep-0224.html#ns")
#define JABBER_CAPS_ATTENTION ((JabberCapsBits)1<<34)
#define JABBER_FEAT_USER_ACTIVITY _T("http://jabber.org/protocol/activity")
#define JABBER_CAPS_USER_ACTIVITY ((JabberCapsBits)1<<35)
#define JABBER_FEAT_USER_ACTIVITY_NOTIFY _T("http://jabber.org/protocol/activity+notify")
#define JABBER_CAPS_USER_ACTIVITY_NOTIFY ((JabberCapsBits)1<<36)
#define JABBER_FEAT_ATTENTION_0 _T("urn:xmpp:attention:0")
#define JABBER_CAPS_ATTENTION_0 ((JabberCapsBits)1<<37)
#define JABBER_FEAT_MIRANDA_NOTES _T("http://miranda-ng.org/storage#notes")
#define JABBER_CAPS_MIRANDA_NOTES ((JabberCapsBits)1<<38)
#define JABBER_FEAT_JINGLE _T("urn:xmpp:jingle:1")
#define JABBER_CAPS_JINGLE ((JabberCapsBits)1<<39)
#define JABBER_FEAT_ROSTER_EXCHANGE _T("http://jabber.org/protocol/rosterx")
#define JABBER_CAPS_ROSTER_EXCHANGE ((JabberCapsBits)1<<40)
#define JABBER_FEAT_PUBSUB_EVENT _T("http://jabber.org/protocol/pubsub#event")
#define JABBER_FEAT_PUBSUB_NODE_CONFIG _T("http://jabber.org/protocol/pubsub#node_config")
#define JABBER_CAPS_MESSAGE_EVENTS_NO_DELIVERY ((JabberCapsBits)1<<62)
#define JABBER_CAPS_OTHER_SPECIAL (JABBER_CAPS_MESSAGE_EVENTS_NO_DELIVERY|JABBER_RESOURCE_CAPS_ERROR) // must contain all the caps not listed in g_JabberFeatCapPairs, to prevent using these bits for features registered through IJabberNetInterface::RegisterFeature()
#define JABBER_CAPS_MIRANDA_NODE _T("http://miranda-ng.org/caps")
#define JABBER_CAPS_MIRANDA_ALL (JABBER_CAPS_DISCO_INFO|JABBER_CAPS_DISCO_ITEMS|JABBER_CAPS_MUC|JABBER_CAPS_ENTITY_CAPS|JABBER_CAPS_SI|JABBER_CAPS_SI_FT|JABBER_CAPS_BYTESTREAMS|JABBER_CAPS_IBB|JABBER_CAPS_OOB|JABBER_CAPS_CHATSTATES|JABBER_CAPS_AGENTS|JABBER_CAPS_BROWSE|JABBER_CAPS_VERSION|JABBER_CAPS_LAST_ACTIVITY|JABBER_CAPS_DATA_FORMS|JABBER_CAPS_MESSAGE_EVENTS|JABBER_CAPS_VCARD_TEMP|JABBER_CAPS_ENTITY_TIME|JABBER_CAPS_PING|JABBER_CAPS_PRIVACY_LISTS|JABBER_CAPS_MESSAGE_RECEIPTS|JABBER_CAPS_PRIVATE_STORAGE|JABBER_CAPS_ATTENTION_0|JABBER_CAPS_JINGLE|JABBER_CAPS_ROSTER_EXCHANGE|JABBER_CAPS_SECUREIM|JABBER_CAPS_MIROTR|JABBER_CAPS_NEWGPG|JABBER_CAPS_COMMANDS|JABBER_CAPS_USER_MOOD_NOTIFY|JABBER_CAPS_USER_TUNE_NOTIFY|JABBER_CAPS_USER_ACTIVITY_NOTIFY|JABBER_CAPS_PLATFORMX86|JABBER_CAPS_PLATFORMX64)
#define JABBER_CAPS_MIRANDA_PARTIAL (JABBER_CAPS_DISCO_INFO|JABBER_CAPS_DISCO_ITEMS|JABBER_CAPS_MUC|JABBER_CAPS_ENTITY_CAPS|JABBER_CAPS_SI|JABBER_CAPS_SI_FT|JABBER_CAPS_BYTESTREAMS|JABBER_CAPS_IBB|JABBER_CAPS_OOB|JABBER_CAPS_CHATSTATES|JABBER_CAPS_AGENTS|JABBER_CAPS_BROWSE|JABBER_CAPS_VERSION|JABBER_CAPS_LAST_ACTIVITY|JABBER_CAPS_DATA_FORMS|JABBER_CAPS_MESSAGE_EVENTS|JABBER_CAPS_VCARD_TEMP|JABBER_CAPS_ENTITY_TIME|JABBER_CAPS_PING|JABBER_CAPS_PRIVACY_LISTS|JABBER_CAPS_MESSAGE_RECEIPTS|JABBER_CAPS_PRIVATE_STORAGE|JABBER_CAPS_ATTENTION_0|JABBER_CAPS_JINGLE|JABBER_CAPS_ROSTER_EXCHANGE)
#define JABBER_EXT_SECUREIM "secureim"
#define JABBER_EXT_MIROTR "mirotr"
#define JABBER_EXT_NEWGPG "new_gpg"
#define JABBER_EXT_COMMANDS "cmds"
#define JABBER_EXT_USER_MOOD "mood"
#define JABBER_EXT_USER_TUNE "tune"
#define JABBER_EXT_USER_ACTIVITY "activity"
#define JABBER_EXT_MIR_NOTES "mir_notes"
#define JABBER_EXT_PLATFORMX86 "x86"
#define JABBER_EXT_PLATFORMX64 "x64"
#define JABBER_FEAT_EXT_ADDRESSING _T("http://jabber.org/protocol/address")
#define JABBER_FEAT_NESTED_ROSTER_GROUPS _T("roster:delimiter")
#define JABBER_FEAT_RC _T("http://jabber.org/protocol/rc")
#define JABBER_FEAT_RC_SET_STATUS _T("http://jabber.org/protocol/rc#set-status")
#define JABBER_FEAT_RC_SET_OPTIONS _T("http://jabber.org/protocol/rc#set-options")
#define JABBER_FEAT_RC_FORWARD _T("http://jabber.org/protocol/rc#forward")
#define JABBER_FEAT_RC_LEAVE_GROUPCHATS _T("http://jabber.org/protocol/rc#leave-groupchats")
#define JABBER_FEAT_RC_WS_LOCK _T("http://miranda-ng.org/rc#lock_workstation")
#define JABBER_FEAT_RC_QUIT_MIRANDA _T("http://miranda-ng.org/rc#quit")
#define JABBER_FEAT_IQ_ROSTER _T("jabber:iq:roster")
#define JABBER_FEAT_DELAY _T("jabber:x:delay")
#define JABBER_FEAT_ENTITY_TIME_OLD _T("jabber:iq:time")
#define JABBER_FEAT_GTALK_SHARED_STATUS _T("google:shared-status")
#define JABBER_FEAT_MUC_ADMIN _T("http://jabber.org/protocol/muc#admin")
#define JABBER_FEAT_MUC_OWNER _T("http://jabber.org/protocol/muc#owner")
#define JABBER_FEAT_MUC_USER _T("http://jabber.org/protocol/muc#user")
#define JABBER_FEAT_NICK _T("http://jabber.org/protocol/nick")
#define JABBER_FEAT_HTTP_AUTH _T("http://jabber.org/protocol/http-auth")
class CJabberClientPartialCaps
{
protected:
TCHAR *m_szVer;
JabberCapsBits m_jcbCaps;
CJabberClientPartialCaps *m_pNext;
int m_nIqId;
DWORD m_dwRequestTime;
public:
CJabberClientPartialCaps(const TCHAR *szVer);
~CJabberClientPartialCaps();
CJabberClientPartialCaps* SetNext(CJabberClientPartialCaps *pCaps);
__inline CJabberClientPartialCaps* GetNext()
{ return m_pNext;
}
void SetCaps(JabberCapsBits jcbCaps, int nIqId = -1);
JabberCapsBits GetCaps();
__inline TCHAR* GetVersion()
{ return m_szVer;
}
__inline int GetIqId()
{ return m_nIqId;
}
};
class CJabberClientCaps
{
protected:
TCHAR *m_szNode;
CJabberClientPartialCaps *m_pCaps;
CJabberClientCaps *m_pNext;
protected:
CJabberClientPartialCaps* FindByVersion(const TCHAR *szVer);
CJabberClientPartialCaps* FindById(int nIqId);
public:
CJabberClientCaps(const TCHAR *szNode);
~CJabberClientCaps();
CJabberClientCaps* SetNext(CJabberClientCaps *pClient);
__inline CJabberClientCaps* GetNext()
{ return m_pNext;
}
JabberCapsBits GetPartialCaps(TCHAR *szVer);
BOOL SetPartialCaps(const TCHAR *szVer, JabberCapsBits jcbCaps, int nIqId = -1);
BOOL SetPartialCaps(int nIqId, JabberCapsBits jcbCaps);
__inline TCHAR* GetNode()
{ return m_szNode;
}
};
class CJabberClientCapsManager
{
protected:
CRITICAL_SECTION m_cs;
CJabberClientCaps *m_pClients;
CJabberProto *ppro;
protected:
CJabberClientCaps *FindClient(const TCHAR *szNode);
public:
CJabberClientCapsManager(CJabberProto* proto);
~CJabberClientCapsManager();
__inline void Lock()
{ EnterCriticalSection(&m_cs);
}
__inline void Unlock()
{ LeaveCriticalSection(&m_cs);
}
void AddDefaultCaps();
JabberCapsBits GetClientCaps(TCHAR *szNode, TCHAR *szVer);
BOOL SetClientCaps(const TCHAR *szNode, const TCHAR *szVer, JabberCapsBits jcbCaps, int nIqId = -1);
BOOL SetClientCaps(int nIqId, JabberCapsBits jcbCaps);
BOOL HandleInfoRequest(HXML iqNode, CJabberIqInfo* pInfo, const TCHAR *szNode);
};
struct JabberFeatCapPair
{
const TCHAR *szFeature;
JabberCapsBits jcbCap;
const TCHAR *tszDescription;
};
struct JabberFeatCapPairDynamic
{
TCHAR *szExt;
TCHAR *szFeature;
JabberCapsBits jcbCap;
TCHAR *szDescription;
};
extern const JabberFeatCapPair g_JabberFeatCapPairs[];
extern const JabberFeatCapPair g_JabberFeatCapPairsExt[];
#endif
|