Yate
xmpputils.h
1
20
21#ifndef __XMPPUTILS_H
22#define __XMPPUTILS_H
23
24#include <yateclass.h>
25#include <yatexml.h>
26
27#ifdef _WINDOWS
28
29#ifdef LIBYJABBER_EXPORTS
30#define YJABBER_API __declspec(dllexport)
31#else
32#ifndef LIBYJABBER_STATIC
33#define YJABBER_API __declspec(dllimport)
34#endif
35#endif
36
37#endif /* _WINDOWS */
38
39#ifndef YJABBER_API
40#define YJABBER_API
41#endif
42
43// Support old RFC 3920
44// If not defined RFC 3920bis changes will be used
45#define RFC3920
46
50namespace TelEngine {
51
52class StringArray; // A String array
53class XMPPNamespace; // XMPP namespaces
54class XMPPError; // XMPP errors
55class JabberID; // A Jabber ID (JID)
56class JIDIdentity; // A JID's identity
57class JIDIdentityList; // A list of JID identities
58class XMPPFeature; // A feature (stream or JID)
59class XMPPFeatureSasl; // A SASL feature
60class XMPPFeatureCompress; // A stream compression feature
61class XMPPFeatureList; // Feature list
62class XMPPUtils; // Utilities
63class XMPPDirVal; // Direction flags
64class XmlElementOut; // An outgoing xml element
65
70class YJABBER_API StringArray
71{
72public:
78 inline StringArray(const String* array, unsigned int len)
79 : m_array((String*)array), m_length(len)
80 {}
81
87 inline const String& at(unsigned int index) const
88 { return index < m_length ? m_array[index] : String::empty(); }
89
95 inline const String& operator[](unsigned int index) const
96 { return m_array[index]; }
97
103 inline int operator[](const String& token) {
104 unsigned int i = 0;
105 for (; i < m_length; i++)
106 if (m_array[i] == token)
107 return i;
108 return m_length;
109 }
110
111protected:
112 String* m_array;
113 unsigned int m_length;
114
115private:
116 StringArray() {}
117};
118
119
124class YJABBER_API XMPPNamespace : public StringArray
125{
126public:
130 enum Type {
131 Stream = 0, // http://etherx.jabber.org/streams
132 Client, // jabber:client
133 Server, // jabber:server
134 Dialback, // jabber:server:dialback
135 StreamError, // urn:ietf:params:xml:ns:xmpp-streams
136 StanzaError, // urn:ietf:params:xml:ns:xmpp-stanzas
137 Ping, // urn:xmpp:ping
138 Register, // http://jabber.org/features/iq-register
139 IqRegister, // jabber:iq:register
140 IqPrivate, // jabber:iq:private
141 IqAuth, // jabber:iq:auth
142 IqAuthFeature, // http://jabber.org/features/iq-auth
143 IqVersion, // jabber:iq:version
144 Delay, // urn:xmpp:delay
145 Tls, // urn:ietf:params:xml:ns:xmpp-tls
146 Sasl, // urn:ietf:params:xml:ns:xmpp-sasl
147 Session, // urn:ietf:params:xml:ns:xmpp-session
148 Bind, // urn:ietf:params:xml:ns:xmpp-bind
149 Roster, // jabber:iq:roster
150 DynamicRoster, // jabber:iq:roster-dynamic
151 DiscoInfo, // http://jabber.org/protocol/disco#info
152 DiscoItems, // http://jabber.org/protocol/disco#items
153 EntityCaps, // http://jabber.org/protocol/caps
154 VCard, // vcard-temp
155 SIProfileFileTransfer, // http://jabber.org/protocol/si/profile/file-transfer
156 ByteStreams, // http://jabber.org/protocol/bytestreams
157 Jingle, // urn:xmpp:jingle:1
158 JingleError, // urn:xmpp:jingle:errors:1
159 JingleAppsRtp, // urn:xmpp:jingle:apps:rtp:1
160 JingleAppsRtpError, // urn:xmpp:jingle:apps:rtp:errors:1
161 JingleAppsRtpInfo, // urn:xmpp:jingle:apps:rtp:info:1
162 JingleAppsRtpAudio, // urn:xmpp:jingle:apps:rtp:audio
163 JingleAppsFileTransfer, // urn:xmpp:jingle:apps:file-transfer:1
164 JingleTransportIceUdp, // urn:xmpp:jingle:transports:ice-udp:1
165 JingleTransportRawUdp, // urn:xmpp:jingle:transports:raw-udp:1
166 JingleTransportRawUdpInfo, // urn:xmpp:jingle:transports:raw-udp:info:1
167 JingleTransportByteStreams, // urn:xmpp:jingle:transports:bytestreams:1
168 JingleTransfer, // urn:xmpp:jingle:transfer:0
169 JingleDtmf, // urn:xmpp:jingle:dtmf:0
170 JingleSession, // http://www.google.com/session
171 JingleAudio, // http://www.google.com/session/phone
172 JingleTransport, // http://www.google.com/transport/p2p
173 JingleVoiceV1, // http://www.google.com/xmpp/protocol/voice/v1
174 JingleRtpInfoOld, // urn:xmpp:jingle:apps:rtp:info
175 DtmfOld, // http://jabber.org/protocol/jingle/info/dtmf
176 XOob, // jabber:x:oob
177 Command, // http://jabber.org/protocol/command
178 MsgOffline, // msgoffline
179 ComponentAccept, // jabber:component:accept
180 Muc, // http://jabber.org/protocol/muc
181 MucAdmin, // http://jabber.org/protocol/muc#admin
182 MucOwner, // http://jabber.org/protocol/muc#owner
183 MucUser, // http://jabber.org/protocol/muc#user
184 DialbackFeature, // urn:xmpp:features:dialback
185 Compress, // http://jabber.org/protocol/compress
186 CompressFeature, // http://jabber.org/features/compress
187 XData, // jabber:x:data
188 ChatStates, // http://jabber.org/protocol/chatstates
189 YateCluster, // http://yate.null.ro/yate/cluster
190 JingleTransportGoogleRawUdp, // http://www.google.com/transport/raw-udp
191 Hash, // urn:xmpp:hashes:1
192 ResultSetMngt, // http://jabber.org/protocol/rsm
193 FileInfoShare, // urn:xmpp:mam
194 // This value MUST be the last one: it's used as array bound
195 Count,
196 };
197
202 : StringArray(s_array,Count)
203 {}
204
205private:
206 static const String s_array[Count]; // Namespace list
207};
208
209
214class YJABBER_API XMPPError : public StringArray
215{
216public:
220 enum Type {
221 NoError = 0,
222 BadFormat, // bad-format
223 BadNamespace, // bad-namespace-prefix
224 Conflict, // conflict
225 ConnTimeout, // connection-timeout
226 HostGone, // host-gone
227 HostUnknown, // host-unknown
228 BadAddressing, // improper-addressing
229 Internal, // internal-server-error
230 InvalidFrom, // invalid-from
231 InvalidId, // invalid-id
232 InvalidNamespace, // invalid-namespace
233 InvalidXml, // invalid-xml
234 NotAuth, // not-authorized
235 Policy, // policy-violation
236 RemoteConn, // remote-connection-failed
237 ResConstraint, // resource-constraint
238 RestrictedXml, // restricted-xml
239 SeeOther, // see-other-host
240 Shutdown, // system-shutdown
241 UndefinedCondition, // undefined-condition
242 UnsupportedEnc, // unsupported-encoding
243 UnsupportedStanza, // unsupported-stanza-type
244 UnsupportedVersion, // unsupported-version
245 Xml, // xml-not-well-formed
246 Aborted, // aborted
247 AccountDisabled, // account-disabled
248 CredentialsExpired, // credentials-expired
249 EncryptionRequired, // encryption-required
250 IncorrectEnc, // incorrect-encoding
251 InvalidAuth, // invalid-authzid
252 InvalidMechanism, // invalid-mechanism
253 MalformedRequest, // malformed-request
254 MechanismTooWeak, // mechanism-too-weak
255 NotAuthorized, // not-authorized
256 TempAuthFailure, // temporary-auth-failure
257 TransitionNeeded, // transition-needed
258 ResourceConstraint, // resource-constraint
259 NotAllowed, // not-allowed
260 BadRequest, // bad-request
261 FeatureNotImpl, // feature-not-implemented
262 Forbidden, // forbidden
263 Gone, // gone
264 ItemNotFound, // item-not-found
265 BadJid, // jid-malformed
266 NotAcceptable, // not-acceptable
267 Payment, // payment-required
268 Unavailable, // recipient-unavailable
269 Redirect, // redirect
270 Reg, // registration-required
271 NoRemote, // remote-server-not-found
272 RemoteTimeout, // remote-server-timeout
273 ServiceUnavailable, // service-unavailable
274 Subscription, // subscription-required
275 Request, // unexpected-request
276 SocketError, // Don't send any error or stream end tag to remote party
277 UnsupportedMethod, // unsupported-method
278 SetupFailed, // setup-failed
279 // This value MUST be the last one: it's used as error type start
280 TypeCount
281 };
282
287 TypeCancel = TypeCount, // do not retry (the error is unrecoverable)
288 TypeContinue, // proceed (the condition was only a warning)
289 TypeModify, // retry after changing the data sent
290 TypeAuth, // retry after providing credentials
291 TypeWait, // retry after waiting (the error is temporary)
292 // This value MUST be the last one: it's used as array bound
293 Count
294 };
295
299 inline XMPPError()
300 : StringArray(s_array,Count)
301 {}
302
303private:
304 static const String s_array[Count]; // Error list
305};
306
311class YJABBER_API XmlTag : public StringArray
312{
313public:
317 enum Type {
318 Stream = 0, // stream
319 Error, // error
320 Features, // features
321 Register, // register
322 Starttls, // starttls
323 Auth, // auth
324 Challenge, // challenge
325 Abort, // abort
326 Aborted, // aborted
327 Response, // response
328 Proceed, // proceed
329 Success, // success
330 Failure, // failure
331 Mechanisms, // mechanisms
332 Mechanism, // mechanism
333 Session, // session
334 Iq, // iq
335 Message, // message
336 Presence, // presence
337 Query, // query
338 VCard, // vCard
339 Jingle, // jingle
340 Description, // description
341 PayloadType, // payload-type
342 Transport, // transport
343 Candidate, // candidate
344 Body, // body
345 Subject, // subject
346 Feature, // feature
347 Bind, // bind
348 Resource, // resource
349 Transfer, // transfer
350 Hold, // hold
351 Active, // active
352 Ringing, // ringing
353 Mute, // mute
354 Registered, // registered
355 Remove, // remove
356 Jid, // jid
357 Username, // username
358 Password, // password
359 Digest, // digest
360 Required, // required
361 Optional, // optional
362 Dtmf, // dtmf
363 DtmfMethod, // dtmf-method
364 Command, // command
365 Text, // text
366 Item, // item
367 Group, // group
368 Reason, // reason
369 Content, // content
370 Trying, // trying
371 Received, // received
372 File, // file
373 Offer, // offer
374 Request, // request
375 StreamHost, // streamhost
376 StreamHostUsed, // streamhost-used
377 Ping, // ping
378 Encryption, // encryption
379 Crypto, // crypto
380 Parameter, // parameter
381 Identity, // identity
382 Priority, // priority
383 EntityCapsTag, // c
384 Handshake, // handshake
385 Dialback, // dialback
386 Method, // method
387 Compress, // compress
388 Compressed, // compressed
389 Compression, // compression
390 X, // x
391 Hash, // hash
392 Algo, // algo
393 Size, // size
394 Date, // date
395 Desc, // desc
396 Set, // set
397 After, // after
398 Before, // before
399 CountTag, // count
400 First, // first
401 Index, // index
402 Last, // last
403 Max, // max
404 Match, // match
405 Directory, // directory
406 Name, // name
407 Changed, // changed
408 // This value MUST be the last one: it's used as array bound
409 Count
410 };
411
415 inline XmlTag()
416 : StringArray(s_array,Count)
417 {}
418
419private:
420 static const String s_array[Count]; // Tag list
421};
422
423
428class YJABBER_API JabberID : public String
429{
430 YCLASS(JabberID,String)
431public:
435 inline JabberID() {}
436
441 inline JabberID(const char* jid)
442 { set(jid); }
443
448 inline JabberID(const String& jid)
449 { set(jid); }
450
455 inline JabberID(const String* jid)
456 { set(TelEngine::c_safe(jid)); }
457
464 inline JabberID(const char* node, const char* domain, const char* resource = 0)
465 { set(node,domain,resource); }
466
471 inline JabberID(const JabberID& src)
472 { *this = src; }
473
478 inline bool valid() const
479 { return null() || m_domain; }
480
485 inline const String& node() const
486 { return m_node; }
487
492 inline const String& bare() const
493 { return m_bare; }
494
499 inline const String& domain() const
500 { return m_domain; }
501
506 inline void domain(const char* d)
507 { set(m_node.c_str(),d,m_resource.c_str()); }
508
513 inline const String& resource() const
514 { return m_resource; }
515
520 inline bool isFull() const
521 { return m_node && m_domain && m_resource; }
522
526 inline void clear() {
528 m_node.clear();
529 m_domain.clear();
530 m_resource.clear();
531 m_bare.clear();
532 }
533
540 inline bool match(const JabberID& src) const
541 { return (src.resource().null() || (resource() == src.resource())) && (bare() &= src.bare()); }
542
549
555 inline JabberID& operator=(const String& src)
556 { set(src); return *this; }
557
563 inline JabberID& operator=(const String* src)
564 { set(TelEngine::c_safe(src)); return *this; }
565
572 inline bool operator==(const JabberID& src) const
573 { return (resource() == src.resource()) && (bare() &= src.bare()); }
574
580 inline bool operator==(const String& src) const
581 { JabberID tmp(src); return operator==(tmp); }
582
588 inline bool operator!=(const JabberID& src) const
589 { return !operator==(src); }
590
596 inline bool operator!=(const String& src) const
597 { return !operator==(src); }
598
603 inline void resource(const char* res)
604 { set(m_node.c_str(),m_domain.c_str(),res); }
605
610 void set(const char* jid);
611
618 void set(const char* node, const char* domain, const char* resource = 0);
619
624 static const JabberID& empty();
625
631 static bool valid(const String& value);
632
637
638private:
639 void parse(); // Parse the string. Set the data
640 void normalize(); // Lowercase node and domain. Set bare jid and jid
641
642 String m_node; // The node part
643 String m_domain; // The domain part
644 String m_resource; // The resource part
645 String m_bare; // The bare JID: node@domain
646};
647
648
655class YJABBER_API JIDIdentity : public GenObject
656{
657 YCLASS(JIDIdentity,GenObject)
658public:
665 inline JIDIdentity(const char* c, const char* t, const char* name = 0)
666 : m_category(c), m_type(t), m_name(name)
667 {}
668
673 inline JIDIdentity(XmlElement* identity)
674 { fromXml(identity); }
675
680 inline XmlElement* toXml() const {
681 if (!(m_category && m_type))
682 return 0;
683 return createIdentity(m_category,m_type,m_name);
684 }
685
690 void fromXml(XmlElement* identity);
691
699 static XmlElement* createIdentity(const char* category,
700 const char* type, const char* name);
701
702 String m_category;
703 String m_type;
704 String m_name;
705};
706
707
712class YJABBER_API JIDIdentityList : public ObjList
713{
715public:
720 void toXml(XmlElement* parent) const;
721
726 void fromXml(XmlElement* parent);
727};
728
733class YJABBER_API XMPPFeature : public String
734{
735 YCLASS(XMPPFeature,GenObject)
736public:
743 inline XMPPFeature(int xml, int feature, bool required = false)
744 : m_xml(xml), m_required(required)
745 { setFeature(feature); }
746
753 inline XMPPFeature(int xml, const char* feature, bool required = false)
754 : String(feature), m_xml(xml), m_required(required)
755 {}
756
761 inline XMPPFeature(int feature)
762 : m_xml(XmlTag::Count), m_required(false)
763 { setFeature(feature); }
764
769 inline XMPPFeature(const char* feature)
770 : String(feature), m_xml(XmlTag::Count), m_required(false)
771 {}
772
776 virtual ~XMPPFeature()
777 {}
778
783 inline bool required() const
784 { return m_required; }
785
791 virtual XmlElement* build(bool addReq = true);
792
797 virtual XmlElement* buildFeature();
798
803 void addReqChild(XmlElement& xml);
804
810 static XMPPFeature* fromStreamFeature(XmlElement& xml);
811
812private:
813 void setFeature(int feature);
814
815 int m_xml; // Element tag as enumeration
816 bool m_required; // Required flag
817};
818
819
824class YJABBER_API XMPPFeatureSasl : public XMPPFeature
825{
827public:
833 inline XMPPFeatureSasl(int mech, bool required = false)
834 : XMPPFeature(XmlTag::Mechanisms,XMPPNamespace::Sasl,required),
835 m_mechanisms(mech)
836 {}
837
842 inline int mechanisms() const
843 { return m_mechanisms; }
844
849 inline bool mechanism(int mech) const
850 { return 0 != (m_mechanisms & mech); }
851
857 virtual XmlElement* build(bool addReq = true);
858
859private:
860 int m_mechanisms; // Authentication mechanisms
861};
862
863
868class YJABBER_API XMPPFeatureCompress : public XMPPFeature
869{
871public:
877 inline XMPPFeatureCompress(const String& meth, bool required = false)
878 : XMPPFeature(XmlTag::Compression,XMPPNamespace::CompressFeature,required),
879 m_methods(meth)
880 {}
881
886 inline const String& methods() const
887 { return m_methods; }
888
894 bool hasMethod(const String& method) const;
895
901 virtual XmlElement* build(bool addReq = true);
902
903private:
904 String m_methods; // Compression methods
905};
906
907
912class YJABBER_API XMPPFeatureList : public ObjList
913{
915public:
923 inline bool add(int xml, int feature, bool required = false) {
924 if (get(feature))
925 return false;
926 append(new XMPPFeature(xml,feature,required));
927 return true;
928 }
929
935 inline bool add(int feature) {
936 if (get(feature))
937 return false;
938 append(new XMPPFeature(feature));
939 return true;
940 }
941
947 inline bool add(XMPPFeature* feature) {
948 if (!feature || get(*feature)) {
949 TelEngine::destruct(feature);
950 return false;
951 }
952 append(feature);
953 return true;
954 }
955
959 inline void reset() {
960 clear();
961 m_identities.clear();
962 m_entityCapsHash.clear();
963 }
964
969 void add(XMPPFeatureList& list);
970
975 void fromStreamFeatures(XmlElement& xml);
976
981 void fromDiscoInfo(XmlElement& xml);
982
987 inline void remove(int feature)
988 { ObjList::remove(get(feature),true); }
989
995 XMPPFeature* get(int feature);
996
1002 inline XMPPFeature* get(const String& feature) {
1003 ObjList* o = find(feature);
1004 return o ? static_cast<XMPPFeature*>(o->get()) : 0;
1005 }
1006
1012 { return YOBJECT(XMPPFeatureSasl,get(XMPPNamespace::Sasl)); }
1013
1019 { return YOBJECT(XMPPFeatureCompress,get(XMPPNamespace::CompressFeature)); }
1020
1025 XmlElement* buildStreamFeatures();
1026
1036 XmlElement* buildDiscoInfo(const char* from, const char* to, const char* id,
1037 const char* node = 0, const char* cap = 0);
1038
1043 void add(XmlElement& xml);
1044
1049
1050 JIDIdentityList m_identities;
1051 String m_entityCapsHash; // SHA-1 entity caps as defined in XEP 0115
1052};
1053
1054
1059class YJABBER_API XMPPUtils
1060{
1061public:
1066 Probe, // probe
1067 Subscribe, // subscribe request
1068 Subscribed, // subscribe accepted
1069 Unavailable, // unavailable
1070 Unsubscribe, // unsubscribe request
1071 Unsubscribed, // unsubscribe accepted
1072 PresenceError, // error
1073 PresenceNone
1074 };
1075
1079 enum MsgType {
1080 Chat, // chat
1081 GroupChat, // groupchat
1082 HeadLine, // headline
1083 Normal, // normal
1084 MsgError, // error
1085 };
1086
1090 enum IqType {
1091 IqSet, // set
1092 IqGet, // get
1093 IqResult, // result
1094 IqError, // error
1095 IqCount
1096 };
1097
1102 CommExecute,
1103 CommCancel,
1104 CommPrev,
1105 CommNext,
1106 CommComplete,
1107 };
1108
1113 CommExecuting,
1114 CommCompleted,
1115 CommCancelled,
1116 };
1117
1122 AuthNone = 0x00, // No authentication mechanism
1123 AuthSHA1 = 0x01, // SHA1 digest
1124 AuthMD5 = 0x02, // MD5 digest
1125 AuthPlain = 0x04, // Plain text password
1126 AuthDialback = 0x08, // Dialback authentication
1127 };
1128
1135 static int findTag(const String& tag, int* tags);
1136
1142 static inline bool isResponse(const XmlElement& xml) {
1143 String* tmp = xml.getAttribute("type");
1144 return tmp && (*tmp == "result" || *tmp == "error");
1145 }
1146
1152 static inline void getJIDTo(const NamedList& params, JabberID& jid) {
1153 jid = params[YSTRING("to")];
1154 if (jid && !jid.resource())
1155 jid.resource(params[YSTRING("to_instance")]);
1156 }
1157
1163 static inline void getJIDFrom(const NamedList& params, JabberID& jid) {
1164 jid = params[YSTRING("from")];
1165 if (jid && !jid.resource())
1166 jid.resource(params[YSTRING("from_instance")]);
1167 }
1168
1176 static inline XmlElement* createElement(const char* name, const char* text = 0,
1177 const String& ns = String::empty()) {
1178 XmlElement* xml = new XmlElement(String(name),true);
1179 if (!TelEngine::null(text))
1180 xml->addText(text);
1181 if (ns)
1182 xml->setXmlns(String::empty(),true,ns);
1183 return xml;
1184 }
1185
1192 static inline XmlElement* createElement(int type, const char* text = 0)
1193 { return createElement(s_tag[type],text); }
1194
1202 static inline XmlElement* createElement(const char* name, int ns,
1203 const char* text = 0) {
1204 XmlElement* xml = createElement(name,text);
1205 setXmlns(*xml,String::empty(),true,ns);
1206 return xml;
1207 }
1208
1216 static inline XmlElement* createElement(int type, int ns, const char* text = 0)
1217 { return createElement(s_tag[type],ns,text); }
1218
1227 static XmlElement* createElement(const XmlElement& src, bool response, bool result);
1228
1237 static inline XmlElement* createElementAttr(int tag, const String& attrName,
1238 const char* attrValue, int ns = XMPPNamespace::Count) {
1239 XmlElement* x = createElement(tag,ns);
1240 x->setAttributeValid(attrName,attrValue);
1241 return x;
1242 }
1243
1252 static XmlElement* createIq(IqType type, const char* from = 0,
1253 const char* to = 0, const char* id = 0);
1254
1263 static inline XmlElement* createIqResult(const char* from, const char* to,
1264 const char* id, XmlElement* child = 0) {
1265 XmlElement* xml = createIq(IqResult,from,to,id);
1266 if (child)
1267 xml->addChild(child);
1268 return xml;
1269 }
1270
1282 static XmlElement* createIqError(const char* from, const char* to, XmlElement*& xml,
1283 int type, int error, const char* text = 0);
1284
1292 static XmlElement* createPing(const char* id = 0, const char* from = 0,
1293 const char* to = 0);
1294
1303 static XmlElement* createVCard(bool get, const char* from, const char* to, const char* id);
1304
1312 static XmlElement* createCommand(CommandAction action, const char* node,
1313 const char* sessionId = 0);
1314
1326 static XmlElement* createIqDisco(bool info, bool req, const char* from, const char* to,
1327 const char* id, const char* node = 0, const char* cap = 0);
1328
1339 static XmlElement* createIqVersionRes(const char* from, const char* to,
1340 const char* id, const char* name, const char* version, const char* os = 0);
1341
1349 static XmlElement* createError(int type, int error, const char* text = 0);
1350
1360 static XmlElement* createError(XmlElement* xml, int type, int error,
1361 const char* text = 0);
1362
1370 static XmlElement* createStreamError(int error, const char* text = 0, const char* content = 0);
1371
1383 static XmlElement* createRegisterQuery(IqType type, const char* from,
1384 const char* to, const char* id,
1385 XmlElement* child1 = 0, XmlElement* child2 = 0, XmlElement* child3 = 0);
1386
1392 static inline XmlElement* createIqAuthGet(const char* id) {
1393 XmlElement* iq = createIq(IqGet,0,0,id);
1394 iq->addChild(createElement(XmlTag::Query,XMPPNamespace::IqAuth));
1395 return iq;
1396 }
1397
1407 static XmlElement* createIqAuthSet(const char* id, const char* username,
1408 const char* resource, const char* authStr, bool digest);
1409
1417 static XmlElement* createIqAuthOffer(const char* id, bool digest = true,
1418 bool plain = false);
1419
1429 static inline XmlElement* createRegisterQuery(const char* from,
1430 const char* to, const char* id,
1431 const char* username, const char* password) {
1432 return createRegisterQuery(XMPPUtils::IqSet,from,to,id,
1433 createElement(XmlTag::Username,username),
1434 createElement(XmlTag::Password,password));
1435 }
1436
1443 static inline XmlElement* createFailure(XMPPNamespace::Type ns,
1444 XMPPError::Type error = XMPPError::NoError) {
1445 XmlElement* xml = createElement(XmlTag::Failure,ns);
1446 if (error != XMPPError::NoError)
1447 xml->addChild(new XmlElement(s_error[error]));
1448 return xml;
1449 }
1450
1457 static inline XmlElement* createXOobUrl(const char* url, const char* desc = 0) {
1458 XmlElement* xml = createElement(XmlTag::X,XMPPNamespace::XOob);
1459 xml->addChild(createElement("url",url));
1460 if (desc)
1461 xml->addChild(createElement("desc",desc));
1462 return xml;
1463 }
1464
1473 static XmlElement* createDelay(unsigned int timeSec, const char* from = 0,
1474 unsigned int fractions = 0, const char* text = 0);
1475
1481 static XmlElement* createFileNsTransfer(const char* name = 0);
1482
1489 static XmlElement* createHash(const char* name, const char* value);
1490
1497 static void decodeHash(XmlElement& xml, const char*& name, const char*& value);
1498
1504 static inline XmlElement* createFileInfoShareMatch(XmlElement* child = 0) {
1505 XmlElement* m = createElement(XmlTag::Match,XMPPNamespace::FileInfoShare);
1506 if (child)
1507 m->addChildSafe(child);
1508 return m;
1509 }
1510
1517 static XmlElement* createRSM(const NamedList& params, const String& prefix = "rsm_");
1518
1525 static void addRSM(XmlElement* rsm, NamedList& params, const String& prefix = "rsm_");
1526
1532 static inline bool remove(XmlElement& xml)
1533 { return 0 != findFirstChild(xml,XmlTag::Remove); }
1534
1540 static inline bool required(XmlElement& xml)
1541 { return 0 != findFirstChild(xml,XmlTag::Required); }
1542
1549 static int priority(XmlElement& xml, int defVal = 0);
1550
1556 static inline void setPriority(XmlElement& xml, const char* prio)
1557 { xml.addChild(createElement(XmlTag::Priority,prio)); }
1558
1564 static inline int xmlns(XmlElement& xml) {
1565 String* x = xml.xmlns();
1566 return x ? s_ns[*x] : XMPPNamespace::Count;
1567 }
1568
1575 static inline bool hasDefaultXmlns(const XmlElement& xml, int ns) {
1576 String* s = xml.xmlnsAttribute(XmlElement::s_ns);
1577 return s && *s == s_ns[ns];
1578 }
1579
1586 static inline bool hasXmlns(const XmlElement& xml, int ns)
1587 { return xml.hasXmlns(s_ns[ns]); }
1588
1597 static inline bool setXmlns(XmlElement& xml, const String& name = String::empty(),
1598 bool addAttr = false, int ns = XMPPNamespace::Count) {
1599 if (ns < XMPPNamespace::Count)
1600 return xml.setXmlns(name,addAttr,s_ns[ns]);
1601 return xml.setXmlns(name);
1602 }
1603
1610 static inline bool setStreamXmlns(XmlElement& xml, bool addAttr = true)
1611 { return setXmlns(xml,"stream",addAttr,XMPPNamespace::Stream); }
1612
1618 static inline bool setDbXmlns(XmlElement& xml)
1619 { return setXmlns(xml,"db",true,XMPPNamespace::Dialback); }
1620
1628 static XmlElement* findFirstChild(const XmlElement& xml, int t = XmlTag::Count,
1629 int ns = XMPPNamespace::Count);
1630
1639 static XmlElement* findNextChild(const XmlElement& xml, XmlElement* start,
1640 int t = XmlTag::Count, int ns = XMPPNamespace::Count);
1641
1649 static inline const String* childText(XmlElement& xml, int tag, int ns = XMPPNamespace::Count) {
1650 XmlElement* c = findFirstChild(xml,tag,ns);
1651 return c ? &(c->getText()) : 0;
1652 }
1653
1667 static inline int childTextInt(XmlElement& xml, int tag, int ns = XMPPNamespace::Count,
1668 int defVal = 0, int base = 0, int minvalue = INT_MIN, int maxvalue = INT_MAX,
1669 bool clamp = true) {
1670 const String* tmp = childText(xml,tag,ns);
1671 return tmp ? tmp->toInteger(defVal,base,minvalue,maxvalue,clamp) : defVal;
1672 }
1673
1683 static void decodeError(XmlElement* xml, int ns = XMPPNamespace::Count,
1684 String* error = 0, String* text = 0, String* content = 0);
1685
1692 static void decodeError(XmlElement* xml, String& error, String& text);
1693
1701 static void encodeDateTimeSec(String& buf, unsigned int timeSec,
1702 unsigned int fractions = 0);
1703
1711 static unsigned int decodeDateTimeSec(const String& time, unsigned int* fractions = 0);
1712
1718 static unsigned int decodeDateTimeSecXDelay(const String& time);
1719
1726 static void print(String& xmlStr, XmlChild& xml, bool verbose);
1727
1734 static void toList(XmlElement& xml, NamedList& dest, const char* prefix);
1735
1745 static bool split(NamedList& dest, const char* src, const char sep,
1746 bool nameFirst);
1747
1754 static int decodeFlags(const String& src, const TokenDict* dict);
1755
1762 static void buildFlags(String& dest, int src, const TokenDict* dict);
1763
1770 static bool addChidren(XmlElement* dest, ObjList& list);
1771
1778 static XmlElement* createEntityCaps(const String& hash, const char* node);
1779
1786 static XmlElement* createEntityCapsGTalkV1(const char* node = 0,
1787 bool muc = false);
1788
1796 static XmlElement* createPresence(const char* from,
1797 const char* to, Presence type = PresenceNone);
1798
1808 static XmlElement* createMessage(const char* type, const char* from,
1809 const char* to, const char* id, const char* body);
1810
1820 static inline XmlElement* createMessage(MsgType type, const char* from,
1821 const char* to, const char* id, const char* body)
1822 { return createMessage(msgText(type),from,to,id,body); }
1823
1831 static XmlElement* createDialbackKey(const char* from, const char* to,
1832 const char* key);
1833
1842 static XmlElement* createDialbackResult(const char* from, const char* to,
1843 XMPPError::Type rsp = XMPPError::NoError);
1844
1853 static XmlElement* createDialbackVerify(const char* from, const char* to,
1854 const char* id, const char* key);
1855
1865 static XmlElement* createDialbackVerifyRsp(const char* from, const char* to,
1866 const char* id, XMPPError::Type rsp = XMPPError::NoError);
1867
1874 static int decodeDbRsp(XmlElement* xml);
1875
1881 static inline XmlElement* createSubject(const char* subject)
1882 { return createElement(XmlTag::Subject,subject); }
1883
1889 static inline const String& subject(XmlElement& xml) {
1890 XmlElement* s = findFirstChild(xml,XmlTag::Subject);
1891 return s ? s->getText() : String::empty();
1892 }
1893
1900 static inline XmlElement* createBody(const char* body, int ns = XMPPNamespace::Count)
1901 { return createElement(XmlTag::Body,ns,body); }
1902
1909 static const String& body(XmlElement& xml, int ns = XMPPNamespace::Count);
1910
1918 static inline XmlElement* createParameter(const char* name, const char* value,
1919 const char* tag = "parameter") {
1920 XmlElement* tmp = new XmlElement(tag);
1921 tmp->setAttributeValid("name",name);
1922 tmp->setAttributeValid("value",value);
1923 return tmp;
1924 }
1925
1932 static inline XmlElement* createParameter(const NamedString& pair,
1933 const char* tag = "parameter")
1934 { return createParameter(pair.name(),pair,tag); }
1935
1941 static inline int ns(const XmlElement& xml) {
1942 String* xmlns = xml.xmlns();
1943 return xmlns ? s_ns[*xmlns] : XMPPNamespace::Count;
1944 }
1945
1951 static inline int tag(const XmlElement& xml)
1952 { return s_tag[xml.getTag()]; }
1953
1961 static inline bool getTag(const XmlElement& xml, int& tag, int& ns) {
1962 const String* t = 0;
1963 const String* n = 0;
1964 if (!xml.getTag(t,n))
1965 return false;
1966 tag = s_tag[*t];
1967 ns = n ? s_ns[*n] : XMPPNamespace::Count;
1968 return tag != XmlTag::Count;
1969 }
1970
1978 static inline bool isTag(const XmlElement& xml, int tag, int ns) {
1979 int t,n;
1980 return getTag(xml,t,n) && tag == t && n == ns;
1981 }
1982
1989 static inline bool isUnprefTag(const XmlElement& xml, int tag)
1990 { return xml.unprefixedTag() == s_tag[tag]; }
1991
1997 static inline bool isStanza(const XmlElement& xml) {
1998 int t,n;
1999 return getTag(xml,t,n) &&
2000 (t == XmlTag::Iq || t == XmlTag::Presence || t == XmlTag::Message);
2001 }
2002
2010 static XmlElement* getXml(GenObject* gen, bool takeOwnerShip = true);
2011
2018 static XmlElement* getXml(const String& data);
2019
2029 static XmlElement* getXml(NamedList& list, const char* param = "xml",
2030 const char* extra = "data");
2031
2044 static XmlElement* getPresenceXml(NamedList& list, const char* param = "xml",
2045 const char* extra = "data", Presence type = PresenceNone, bool build = true);
2046
2058 static XmlElement* getChatXml(NamedList& list, const char* param = "xml",
2059 const char* extra = "data", bool build = true);
2060
2068 static int cmpBytes(const String& s1, const String& s2);
2069
2075 static inline Presence presenceType(const char* text)
2076 { return (Presence)lookup(text,s_presence,PresenceNone); }
2077
2083 static inline const char* presenceText(Presence presence)
2084 { return lookup(presence,s_presence,0); }
2085
2091 static inline MsgType msgType(const char* text)
2092 { return (MsgType)lookup(text,s_msg,Normal); }
2093
2099 static inline const char* msgText(MsgType msg)
2100 { return lookup(msg,s_msg,0); }
2101
2107 static inline IqType iqType(const char* text)
2108 { return (IqType)lookup(text,s_iq,IqCount); }
2109
2116 static inline int authMeth(const char* text, int defVal = AuthNone)
2117 { return lookup(text,s_authMeth,defVal); }
2118
2123
2128
2133
2137 static const TokenDict s_presence[];
2138
2142 static const TokenDict s_msg[];
2143
2147 static const TokenDict s_iq[];
2148
2153
2158
2162 static const TokenDict s_authMeth[];
2163};
2164
2169class YJABBER_API XMPPDirVal
2170{
2171public:
2176 None = 0x00,
2177 To = 0x01,
2178 From = 0x02,
2179 PendingIn = 0x10,
2180 PendingOut = 0x20,
2181 // Masks
2182 Both = 0x03,
2183 Pending = 0x30
2184 };
2185
2190 inline XMPPDirVal(int flags = None)
2191 : m_value(flags)
2192 {}
2193
2198 inline XMPPDirVal(const String& flags)
2199 : m_value(0)
2200 { replace(flags); }
2201
2206 inline XMPPDirVal(const XMPPDirVal& other)
2207 : m_value(other.m_value)
2208 {}
2209
2214 inline void replace(int flag)
2215 { m_value = flag; }
2216
2221 inline void replace(const String& flags)
2222 { m_value = XMPPUtils::decodeFlags(flags,s_names); }
2223
2229 void toString(String& buf, bool full) const;
2230
2235 void toSubscription(String& buf) const;
2236
2241 inline void set(int flag)
2242 { m_value |= flag; }
2243
2248 inline void reset(int flag)
2249 { m_value &= ~flag; }
2250
2256 inline bool test(int mask) const
2257 { return (m_value & mask) != 0; }
2258
2263 inline bool to() const
2264 { return test(To); }
2265
2270 inline bool from() const
2271 { return test(From); }
2272
2276 inline operator int()
2277 { return m_value; }
2278
2282 static const TokenDict s_names[];
2283
2284private:
2285 int m_value; // The value
2286};
2287
2292class YJABBER_API XmlElementOut : public RefObject
2293{
2294public:
2301 inline XmlElementOut(XmlElement* element, const char* senderID = 0,
2302 bool unclose = false)
2303 : m_element(element), m_offset(0), m_id(senderID), m_unclose(unclose),
2304 m_sent(false)
2305 {}
2306
2312 { TelEngine::destruct(m_element); }
2313
2318 inline XmlElement* element() const
2319 { return m_element; }
2320
2325 inline bool sent() const
2326 { return m_sent; }
2327
2332 inline const String& buffer()
2333 { return m_buffer; }
2334
2339 inline const String& id() const
2340 { return m_id; }
2341
2346 inline unsigned int dataCount()
2347 { return m_buffer.length() - m_offset; }
2348
2354 inline const char* getData(unsigned int& nCount) {
2355 if (!m_buffer)
2356 prepareToSend();
2357 nCount = dataCount();
2358 return m_buffer.c_str() + m_offset;
2359 }
2360
2365 inline void dataSent(unsigned int nCount) {
2366 m_sent = true;
2367 m_offset += nCount;
2368 if (m_offset > m_buffer.length())
2369 m_offset = m_buffer.length();
2370 }
2371
2377 inline XmlElement* release() {
2378 XmlElement* e = m_element;
2379 m_element = 0;
2380 return e;
2381 }
2382
2387 inline void toBuffer(String& buffer) {
2388 if (m_element)
2389 m_element->toString(buffer,true,String::empty(),String::empty(),!m_unclose);
2390 }
2391
2395 inline void prepareToSend()
2396 { toBuffer(m_buffer); }
2397
2398private:
2399 XmlElement* m_element; // The XML element
2400 String m_buffer; // Data to send
2401 unsigned int m_offset; // Offset to send
2402 String m_id; // Sender's id
2403 bool m_unclose; // Close or not the element's tag
2404 bool m_sent; // Sent flag (true if an attempt to send was done)
2405};
2406
2407};
2408
2409#endif /* __XMPPUTILS_H */
2410
2411/* vi: set ts=8 sw=4 sts=4 noet: */
Definition yateclass.h:1049
A list of JID identities.
Definition xmpputils.h:713
void fromXml(XmlElement *parent)
void toXml(XmlElement *parent) const
XmlElement * toXml() const
Definition xmpputils.h:680
void fromXml(XmlElement *identity)
static XmlElement * createIdentity(const char *category, const char *type, const char *name)
JIDIdentity(XmlElement *identity)
Definition xmpputils.h:673
JIDIdentity(const char *c, const char *t, const char *name=0)
Definition xmpputils.h:665
A Jabber ID.
Definition xmpputils.h:429
JabberID & operator=(const JabberID &src)
JabberID & operator=(const String *src)
Definition xmpputils.h:563
bool valid() const
Definition xmpputils.h:478
JabberID(const String &jid)
Definition xmpputils.h:448
JabberID(const char *jid)
Definition xmpputils.h:441
bool match(const JabberID &src) const
Definition xmpputils.h:540
void resource(const char *res)
Definition xmpputils.h:603
static const JabberID & empty()
void set(const char *node, const char *domain, const char *resource=0)
const String & node() const
Definition xmpputils.h:485
const String & resource() const
Definition xmpputils.h:513
JabberID(const String *jid)
Definition xmpputils.h:455
void set(const char *jid)
static Regexp s_regExpValid
Definition xmpputils.h:636
bool operator==(const JabberID &src) const
Definition xmpputils.h:572
JabberID()
Definition xmpputils.h:435
bool operator!=(const JabberID &src) const
Definition xmpputils.h:588
const String & bare() const
Definition xmpputils.h:492
JabberID(const char *node, const char *domain, const char *resource=0)
Definition xmpputils.h:464
JabberID(const JabberID &src)
Definition xmpputils.h:471
bool operator==(const String &src) const
Definition xmpputils.h:580
void clear()
Definition xmpputils.h:526
static bool valid(const String &value)
bool isFull() const
Definition xmpputils.h:520
const String & domain() const
Definition xmpputils.h:499
void domain(const char *d)
Definition xmpputils.h:506
bool operator!=(const String &src) const
Definition xmpputils.h:596
JabberID & operator=(const String &src)
Definition xmpputils.h:555
A named string container class.
Definition yateclass.h:5016
A named string class.
Definition yateclass.h:3481
const String & name() const
Definition yateclass.h:3495
An object list class.
Definition yateclass.h:1454
ObjList * find(const GenObject *obj) const
ObjList * append(const GenObject *obj, bool compact=true)
GenObject * get() const
Definition yateclass.h:1490
void clear()
GenObject * remove(bool delobj=true)
A regexp matching class.
Definition yateclass.h:3271
A String array.
Definition xmpputils.h:71
StringArray(const String *array, unsigned int len)
Definition xmpputils.h:78
const String & operator[](unsigned int index) const
Definition xmpputils.h:95
const String & at(unsigned int index) const
Definition xmpputils.h:87
int operator[](const String &token)
Definition xmpputils.h:103
A C-style string handling class.
Definition yateclass.h:2131
bool null() const
Definition yateclass.h:2265
void clear()
int toInteger(int defvalue=0, int base=0, int minvalue=INT_MIN, int maxvalue=INT_MAX, bool clamp=true) const
static const String & empty()
void reset(int flag)
Definition xmpputils.h:2248
void toString(String &buf, bool full) const
bool from() const
Definition xmpputils.h:2270
void replace(const String &flags)
Definition xmpputils.h:2221
Direction
Definition xmpputils.h:2175
XMPPDirVal(int flags=None)
Definition xmpputils.h:2190
void toSubscription(String &buf) const
XMPPDirVal(const String &flags)
Definition xmpputils.h:2198
XMPPDirVal(const XMPPDirVal &other)
Definition xmpputils.h:2206
bool test(int mask) const
Definition xmpputils.h:2256
bool to() const
Definition xmpputils.h:2263
void replace(int flag)
Definition xmpputils.h:2214
void set(int flag)
Definition xmpputils.h:2241
static const TokenDict s_names[]
Definition xmpputils.h:2282
XMPP errors.
Definition xmpputils.h:215
Type
Definition xmpputils.h:220
ErrorType
Definition xmpputils.h:286
XMPPError()
Definition xmpputils.h:299
A compression feature.
Definition xmpputils.h:869
XMPPFeatureCompress(const String &meth, bool required=false)
Definition xmpputils.h:877
virtual XmlElement * build(bool addReq=true)
const String & methods() const
Definition xmpputils.h:886
bool hasMethod(const String &method) const
JID feature list.
Definition xmpputils.h:913
void fromDiscoInfo(XmlElement &xml)
XMPPFeature * get(const String &feature)
Definition xmpputils.h:1002
XmlElement * buildDiscoInfo(const char *from, const char *to, const char *id, const char *node=0, const char *cap=0)
XmlElement * buildStreamFeatures()
void fromStreamFeatures(XmlElement &xml)
XMPPFeature * get(int feature)
void add(XmlElement &xml)
XMPPFeatureSasl * getSasl()
Definition xmpputils.h:1011
bool add(XMPPFeature *feature)
Definition xmpputils.h:947
void updateEntityCaps()
XMPPFeatureCompress * getCompress()
Definition xmpputils.h:1018
void reset()
Definition xmpputils.h:959
bool add(int xml, int feature, bool required=false)
Definition xmpputils.h:923
bool add(int feature)
Definition xmpputils.h:935
void remove(int feature)
Definition xmpputils.h:987
void add(XMPPFeatureList &list)
A SASL feature.
Definition xmpputils.h:825
int mechanisms() const
Definition xmpputils.h:842
bool mechanism(int mech) const
Definition xmpputils.h:849
virtual XmlElement * build(bool addReq=true)
XMPPFeatureSasl(int mech, bool required=false)
Definition xmpputils.h:833
A feature.
Definition xmpputils.h:734
XMPPFeature(int xml, const char *feature, bool required=false)
Definition xmpputils.h:753
virtual ~XMPPFeature()
Definition xmpputils.h:776
void addReqChild(XmlElement &xml)
virtual XmlElement * build(bool addReq=true)
XMPPFeature(int feature)
Definition xmpputils.h:761
XMPPFeature(const char *feature)
Definition xmpputils.h:769
XMPPFeature(int xml, int feature, bool required=false)
Definition xmpputils.h:743
bool required() const
Definition xmpputils.h:783
static XMPPFeature * fromStreamFeature(XmlElement &xml)
virtual XmlElement * buildFeature()
XMPP namespaces.
Definition xmpputils.h:125
Type
Definition xmpputils.h:130
XMPPNamespace()
Definition xmpputils.h:201
General XMPP utilities.
Definition xmpputils.h:1060
static bool isStanza(const XmlElement &xml)
Definition xmpputils.h:1997
static bool isResponse(const XmlElement &xml)
Definition xmpputils.h:1142
static XmlElement * createFileNsTransfer(const char *name=0)
static XmlElement * getXml(NamedList &list, const char *param="xml", const char *extra="data")
static XmlElement * createIqAuthOffer(const char *id, bool digest=true, bool plain=false)
static XmlElement * createDialbackKey(const char *from, const char *to, const char *key)
static XmlElement * createElement(const char *name, int ns, const char *text=0)
Definition xmpputils.h:1202
static bool isUnprefTag(const XmlElement &xml, int tag)
Definition xmpputils.h:1989
static XmlElement * createElement(int type, int ns, const char *text=0)
Definition xmpputils.h:1216
static XmlElement * createParameter(const NamedString &pair, const char *tag="parameter")
Definition xmpputils.h:1932
static XmlElement * createElement(const char *name, const char *text=0, const String &ns=String::empty())
Definition xmpputils.h:1176
static XmlElement * createMessage(const char *type, const char *from, const char *to, const char *id, const char *body)
static bool remove(XmlElement &xml)
Definition xmpputils.h:1532
static int cmpBytes(const String &s1, const String &s2)
static XmlElement * createSubject(const char *subject)
Definition xmpputils.h:1881
static XmlElement * createPing(const char *id=0, const char *from=0, const char *to=0)
static XmlElement * createIqDisco(bool info, bool req, const char *from, const char *to, const char *id, const char *node=0, const char *cap=0)
static int decodeDbRsp(XmlElement *xml)
static int priority(XmlElement &xml, int defVal=0)
static bool hasXmlns(const XmlElement &xml, int ns)
Definition xmpputils.h:1586
static XmlElement * getXml(GenObject *gen, bool takeOwnerShip=true)
static bool setDbXmlns(XmlElement &xml)
Definition xmpputils.h:1618
static const TokenDict s_presence[]
Definition xmpputils.h:2137
static XmlElement * createDialbackVerifyRsp(const char *from, const char *to, const char *id, XMPPError::Type rsp=XMPPError::NoError)
static bool split(NamedList &dest, const char *src, const char sep, bool nameFirst)
MsgType
Definition xmpputils.h:1079
static XmlElement * createElement(const XmlElement &src, bool response, bool result)
static XmlElement * createRegisterQuery(const char *from, const char *to, const char *id, const char *username, const char *password)
Definition xmpputils.h:1429
static XmlElement * createMessage(MsgType type, const char *from, const char *to, const char *id, const char *body)
Definition xmpputils.h:1820
static const String * childText(XmlElement &xml, int tag, int ns=XMPPNamespace::Count)
Definition xmpputils.h:1649
static bool setStreamXmlns(XmlElement &xml, bool addAttr=true)
Definition xmpputils.h:1610
static XmlElement * createEntityCaps(const String &hash, const char *node)
static int decodeFlags(const String &src, const TokenDict *dict)
static void print(String &xmlStr, XmlChild &xml, bool verbose)
static XmlElement * getXml(const String &data)
static int tag(const XmlElement &xml)
Definition xmpputils.h:1951
static void setPriority(XmlElement &xml, const char *prio)
Definition xmpputils.h:1556
static bool required(XmlElement &xml)
Definition xmpputils.h:1540
static const TokenDict s_commandAction[]
Definition xmpputils.h:2152
static unsigned int decodeDateTimeSec(const String &time, unsigned int *fractions=0)
static void decodeError(XmlElement *xml, int ns=XMPPNamespace::Count, String *error=0, String *text=0, String *content=0)
static XmlElement * createXOobUrl(const char *url, const char *desc=0)
Definition xmpputils.h:1457
static const TokenDict s_iq[]
Definition xmpputils.h:2147
static XmlElement * createRegisterQuery(IqType type, const char *from, const char *to, const char *id, XmlElement *child1=0, XmlElement *child2=0, XmlElement *child3=0)
static XmlElement * createIqVersionRes(const char *from, const char *to, const char *id, const char *name, const char *version, const char *os=0)
static XmlElement * createIqAuthGet(const char *id)
Definition xmpputils.h:1392
static int ns(const XmlElement &xml)
Definition xmpputils.h:1941
static XmlElement * createStreamError(int error, const char *text=0, const char *content=0)
static XmlElement * findFirstChild(const XmlElement &xml, int t=XmlTag::Count, int ns=XMPPNamespace::Count)
static XmlElement * createDialbackResult(const char *from, const char *to, XMPPError::Type rsp=XMPPError::NoError)
static bool getTag(const XmlElement &xml, int &tag, int &ns)
Definition xmpputils.h:1961
static void getJIDFrom(const NamedList &params, JabberID &jid)
Definition xmpputils.h:1163
static XmlElement * createError(int type, int error, const char *text=0)
static XmlElement * findNextChild(const XmlElement &xml, XmlElement *start, int t=XmlTag::Count, int ns=XMPPNamespace::Count)
static bool hasDefaultXmlns(const XmlElement &xml, int ns)
Definition xmpputils.h:1575
static bool isTag(const XmlElement &xml, int tag, int ns)
Definition xmpputils.h:1978
static XmlElement * createFileInfoShareMatch(XmlElement *child=0)
Definition xmpputils.h:1504
AuthMethod
Definition xmpputils.h:1121
static const TokenDict s_authMeth[]
Definition xmpputils.h:2162
static void getJIDTo(const NamedList &params, JabberID &jid)
Definition xmpputils.h:1152
static void decodeError(XmlElement *xml, String &error, String &text)
static void decodeHash(XmlElement &xml, const char *&name, const char *&value)
static XmlElement * createElementAttr(int tag, const String &attrName, const char *attrValue, int ns=XMPPNamespace::Count)
Definition xmpputils.h:1237
static XmlElement * createBody(const char *body, int ns=XMPPNamespace::Count)
Definition xmpputils.h:1900
static XmlElement * createHash(const char *name, const char *value)
static XmlElement * getPresenceXml(NamedList &list, const char *param="xml", const char *extra="data", Presence type=PresenceNone, bool build=true)
static XmlElement * createIqError(const char *from, const char *to, XmlElement *&xml, int type, int error, const char *text=0)
static const TokenDict s_commandStatus[]
Definition xmpputils.h:2157
static IqType iqType(const char *text)
Definition xmpputils.h:2107
static XmlElement * createDialbackVerify(const char *from, const char *to, const char *id, const char *key)
static Presence presenceType(const char *text)
Definition xmpputils.h:2075
static XmlElement * createIqAuthSet(const char *id, const char *username, const char *resource, const char *authStr, bool digest)
static XmlElement * createFailure(XMPPNamespace::Type ns, XMPPError::Type error=XMPPError::NoError)
Definition xmpputils.h:1443
IqType
Definition xmpputils.h:1090
static const String & body(XmlElement &xml, int ns=XMPPNamespace::Count)
static bool addChidren(XmlElement *dest, ObjList &list)
static const String & subject(XmlElement &xml)
Definition xmpputils.h:1889
static XMPPError s_error
Definition xmpputils.h:2127
static XmlElement * getChatXml(NamedList &list, const char *param="xml", const char *extra="data", bool build=true)
static XmlElement * createRSM(const NamedList &params, const String &prefix="rsm_")
Presence
Definition xmpputils.h:1065
static void buildFlags(String &dest, int src, const TokenDict *dict)
static XmlElement * createIq(IqType type, const char *from=0, const char *to=0, const char *id=0)
static XmlElement * createIqResult(const char *from, const char *to, const char *id, XmlElement *child=0)
Definition xmpputils.h:1263
static int authMeth(const char *text, int defVal=AuthNone)
Definition xmpputils.h:2116
static XmlElement * createDelay(unsigned int timeSec, const char *from=0, unsigned int fractions=0, const char *text=0)
static bool setXmlns(XmlElement &xml, const String &name=String::empty(), bool addAttr=false, int ns=XMPPNamespace::Count)
Definition xmpputils.h:1597
static XmlElement * createError(XmlElement *xml, int type, int error, const char *text=0)
static void addRSM(XmlElement *rsm, NamedList &params, const String &prefix="rsm_")
static const TokenDict s_msg[]
Definition xmpputils.h:2142
static int findTag(const String &tag, int *tags)
static XmlElement * createEntityCapsGTalkV1(const char *node=0, bool muc=false)
static unsigned int decodeDateTimeSecXDelay(const String &time)
static const char * msgText(MsgType msg)
Definition xmpputils.h:2099
static void toList(XmlElement &xml, NamedList &dest, const char *prefix)
static XMPPNamespace s_ns
Definition xmpputils.h:2122
static XmlElement * createCommand(CommandAction action, const char *node, const char *sessionId=0)
static const char * presenceText(Presence presence)
Definition xmpputils.h:2083
static XmlTag s_tag
Definition xmpputils.h:2132
static int xmlns(XmlElement &xml)
Definition xmpputils.h:1564
static int childTextInt(XmlElement &xml, int tag, int ns=XMPPNamespace::Count, int defVal=0, int base=0, int minvalue=INT_MIN, int maxvalue=INT_MAX, bool clamp=true)
Definition xmpputils.h:1667
CommandAction
Definition xmpputils.h:1101
static XmlElement * createParameter(const char *name, const char *value, const char *tag="parameter")
Definition xmpputils.h:1918
static XmlElement * createPresence(const char *from, const char *to, Presence type=PresenceNone)
static void encodeDateTimeSec(String &buf, unsigned int timeSec, unsigned int fractions=0)
static MsgType msgType(const char *text)
Definition xmpputils.h:2091
CommandStatus
Definition xmpputils.h:1112
static XmlElement * createElement(int type, const char *text=0)
Definition xmpputils.h:1192
static XmlElement * createVCard(bool get, const char *from, const char *to, const char *id)
void dataSent(unsigned int nCount)
Definition xmpputils.h:2365
XmlElementOut(XmlElement *element, const char *senderID=0, bool unclose=false)
Definition xmpputils.h:2301
const String & buffer()
Definition xmpputils.h:2332
XmlElement * release()
Definition xmpputils.h:2377
virtual ~XmlElementOut()
Definition xmpputils.h:2311
bool sent() const
Definition xmpputils.h:2325
const String & id() const
Definition xmpputils.h:2339
XmlElement * element() const
Definition xmpputils.h:2318
void prepareToSend()
Definition xmpputils.h:2395
unsigned int dataCount()
Definition xmpputils.h:2346
const char * getData(unsigned int &nCount)
Definition xmpputils.h:2354
void toBuffer(String &buffer)
Definition xmpputils.h:2387
XML known tags array.
Definition xmpputils.h:312
Type
Definition xmpputils.h:317
XmlTag()
Definition xmpputils.h:415
Definition yatemime.h:34
Definition yateclass.h:848