Yate
yatejingle.h
1
20
21#ifndef __YATEJINGLE_H
22#define __YATEJINGLE_H
23
24#include <yateclass.h>
25#include <yatejabber.h>
26
30namespace TelEngine {
31
32class JGRtpMedia; // A Jingle RTP data payload
33class JGCrypto; // Content crypto data
34class JGRtpMediaList; // A list of Jingle RTP data payloads
35class JGRtpCandidate; // A RTP transport candidate
36class JGRtpCandidates; // A list of RTP transport candidates
37class JGSessionContent; // A Jingle session content
38class JGStreamHost; // A Jingle file transfer stream host
39class JGSession; // A basic Jingle session
40class JGSession0; // A session implementing the old jingle protocol
41class JGSession1; // The version 1 of a jingle session
42class JGEvent; // An event generated by a Jingle session
43class JGEngine; // The Jingle engine
44class JGSentStanza; // Sent stanza timeout info
45
46
51class YJABBER_API JGRtpMedia : public GenObject
52{
53public:
65 inline JGRtpMedia(const char* id, const char* name, const char* clockrate,
66 const char* synonym, const char* channels = 0,
67 const char* pTime = 0, const char* maxPTime = 0, const char* bitRate = 0)
68 : m_params("")
69 { set(id,name,clockrate,synonym,channels,pTime,maxPTime,bitRate); }
70
76 : m_params("")
77 { fromXml(xml); }
78
82 inline JGRtpMedia(const JGRtpMedia& src)
83 : m_params("") {
84 set(src.m_id,src.m_name,src.m_clockrate,src.m_synonym,src.m_channels,
85 src.m_pTime,src.m_maxPTime,src.m_bitRate);
86 m_params = src.m_params;
87 }
88
100 inline void set(const char* id, const char* name, const char* clockrate,
101 const char* synonym = 0, const char* channels = 0,
102 const char* pTime = 0, const char* maxPTime = 0, const char* bitRate = 0) {
103 m_id = id;
104 m_name = name;
105 m_clockrate = clockrate;
106 m_synonym = synonym;
107 m_channels = channels;
108 m_pTime = pTime;
109 m_maxPTime = maxPTime;
110 m_bitRate = bitRate;
111 m_params.clearParams();
112 }
113
118 virtual const String& toString() const
119 { return m_id; }
120
126
131 void fromXml(XmlElement* xml);
132
137
142
147
152
157
162
167
172
177};
178
184class YJABBER_API JGCrypto : public String
185{
186public:
194 inline JGCrypto(const char* tag = "1", const char* suite = 0,
195 const char* key = 0, const char* session = 0)
196 : String(tag),
197 m_suite(suite), m_keyParams(key), m_sessionParams(session)
198 {}
199
204 inline JGCrypto(const XmlElement* xml)
205 { fromXml(xml); }
206
212
217 void fromXml(const XmlElement* xml);
218
225 static XmlElement* buildEncryption(const ObjList& list, bool required);
226
233 static void decodeEncryption(const XmlElement* xml, ObjList& list, bool& required);
234
235 String m_suite;
236 String m_keyParams;
237 String m_sessionParams;
238};
239
244class YJABBER_API JGRtpMediaList : public ObjList
245{
246public:
250 enum Media {
251 MediaMissing = -1,
252 MediaUnknown = 0,
253 Audio = 1,
254 };
255
261 inline JGRtpMediaList(Media m = MediaMissing, bool cryptoRequired = false)
262 : m_media(m), m_bandwidth(0), m_cryptoRequired(cryptoRequired), m_ready(false),
263 m_telEvent(101), m_telEventName("telephone-event")
264 {}
265
270 { TelEngine::destruct(m_bandwidth); }
271
276 inline Media media() const
277 { return m_media; }
278
290 inline void add(const char* id, const char* name, const char* clockrate,
291 const char* synonym = 0, const char* channels = 0,
292 const char* pTime = 0, const char* maxPTime = 0, const char* bitRate = 0)
293 { append(new JGRtpMedia(id,name,clockrate,synonym,channels,pTime,maxPTime,bitRate)); }
294
298 void reset();
299
306 void setMedia(const JGRtpMediaList& src, const String& only = String::empty());
307
312 void filterMedia(const String& only);
313
320
326 JGRtpMedia* findSynonym(const String& value) const;
327
333
338 void fromXml(XmlElement* xml);
339
347 bool createList(String& dest, bool synonym, const char* sep = ",");
348
355 void addTelEvent(XmlElement* xml, const char* name = 0) const;
356
360 static const TokenDict s_media[];
361
366
371
377
382 ObjList m_cryptoLocal;
383 ObjList m_cryptoRemote;
384
389
394
399
404};
405
406
411class YJABBER_API JGRtpCandidate : public String
412{
413public:
417 inline JGRtpCandidate(const char* id, const char* component = "1",
418 unsigned int generation = 0, unsigned int net = 0, int prio = 0)
419 : String(id),
420 m_port(0), m_component(component), m_generation(generation),
421 m_network(net), m_priority(prio), m_protocol("udp"), m_type("host")
422 {}
423
429 inline JGRtpCandidate(XmlElement* xml, const JGRtpCandidates& container)
430 { fromXml(xml,container); }
431
437 virtual XmlElement* toXml(const JGRtpCandidates& container) const;
438
444 void fromXml(XmlElement* xml, const JGRtpCandidates& container);
445
446 String m_address;
447 String m_port;
448 String m_component; // Candidate component
449 String m_generation; // Candidate generation
450 String m_network; // NIC card (diagnostic only)
451 String m_priority; // Candidate priority
452 String m_protocol; // The only allowable value is "udp"
453 String m_type; // A Candidate Type as defined in ICE-CORE
454};
455
456
461class YJABBER_API JGRtpCandidateP2P : public JGRtpCandidate
462{
464public:
469 : JGRtpCandidate("")
470 {}
471
477 inline JGRtpCandidateP2P(XmlElement* xml, const JGRtpCandidates& container)
478 : JGRtpCandidate("")
479 { fromXml(xml,container); }
480
486 virtual XmlElement* toXml(const JGRtpCandidates& container) const;
487
493 void fromXml(XmlElement* xml, const JGRtpCandidates& container);
494
495 String m_username;
496 String m_password;
497};
498
499
504class YJABBER_API JGRtpCandidates : public ObjList
505{
506public:
510 enum Type {
511 Unknown = -1,
512 RtpIceUdp = 1,
513 RtpRawUdp,
514 RtpP2P,
515 RtpGoogleRawUdp,
516 };
517
522 inline JGRtpCandidates(Type t = Unknown)
523 : m_type(t)
524 {}
525
530 inline const char* typeName() const
531 { return typeName(m_type); }
532
536 inline void generateIceAuth() {
537 generateIceToken(m_password,true);
538 generateIceToken(m_ufrag,false);
539 }
540
544 inline void generateOldIceAuth() {
545 generateOldIceToken(m_password);
546 generateOldIceToken(m_ufrag);
547 }
548
554 JGRtpCandidate* findByComponent(unsigned int component);
555
562 XmlElement* toXml(bool addCandidates, bool addAuth) const;
563
568 void fromXml(XmlElement* element);
569
577 static void generateIceToken(String& dest, bool pwd, unsigned int max = 0);
578
583 static void generateOldIceToken(String& dest);
584
591 static inline const char* typeName(int t, const char* defVal = "unknown")
592 { return TelEngine::lookup(t,s_type,defVal); }
593
597 static const TokenDict s_type[];
598
599 Type m_type;
600 String m_password;
601 String m_ufrag;
602};
603
604
611class YJABBER_API JGSessionContent : public RefObject
612{
613public:
617 enum Type {
618 Unknown = -1, // Unknown
619 UnknownFileTransfer = -2, // Unknown (unsupported) file transfer content
620 RtpIceUdp = 1, // Audio: RTP ICE-UDP transport
621 RtpRawUdp, // Audio: RTP RAW-UDP transport
622 RtpP2P, //
623 RtpGoogleRawUdp, //
624 FileBSBOffer, // File offer: byte stream (SOCKS) transport
625 FileBSBRequest, // File request: byte stream (SOCKS) transport
626 };
627
631 enum Senders {
632 SendUnknown = 0,
633 SendBoth = 1,
634 SendInitiator = 2,
635 SendResponder = 3
636 };
637
641 enum Creator {
642 CreatorUnknown = 0,
643 CreatorInitiator = 1,
644 CreatorResponder = 2
645 };
646
655 JGSessionContent(Type t, const char* name, Senders senders,
656 Creator creator, const char* disposition = 0);
657
662 inline Type type() const
663 { return m_type; }
664
669 inline Senders senders() const
670 { return m_senders; }
671
676 inline Creator creator() const
677 { return m_creator; }
678
684 inline bool isValidAudio() const
685 { return (m_rtpMedia.media() == JGRtpMediaList::Audio) && (0 != m_rtpMedia.skipNull()); }
686
690 virtual const String& toString() const
691 { return m_name; }
692
698 inline bool isSession() const
699 { return !m_disposition || m_disposition == "session"; }
700
705 inline bool isEarlyMedia() const
706 { return m_disposition == "early-session"; }
707
711 inline void setEarlyMedia()
712 { m_disposition = "early-session"; }
713
723 XmlElement* toXml(bool minimum, bool addDesc,
724 bool addTrans, bool addCandidates, bool addAuth) const;
725
734 String& error);
735
739 static const TokenDict s_senders[];
740
744 static const TokenDict s_creator[];
745
750
755
760
765
766private:
767 Type m_type;
768 String m_name;
769 Senders m_senders;
770 Creator m_creator;
771 String m_disposition;
772};
773
774
779class JGStreamHost : public String
780{
781public:
790 JGStreamHost(bool local, const char* jid, const char* addr, int port, const char* zeroConf = 0)
791 : String(jid),
792 m_local(local), m_address(addr), m_port(port), m_zeroConf(zeroConf)
793 {}
794
799 inline JGStreamHost(const JGStreamHost& src)
800 : String(src),
801 m_local(src.m_local), m_address(src.m_address), m_port(src.m_port),
802 m_zeroConf(src.m_zeroConf)
803 {}
804
810
817
825 static XmlElement* buildHosts(const ObjList& hosts, const char* sid,
826 const char* mode = "tcp");
827
833 static XmlElement* buildRsp(const char* jid);
834
835 bool m_local;
836 String m_address;
837 int m_port;
838 String m_zeroConf;
839};
840
841
846class YJABBER_API JGSession : public RefObject, public Mutex
847{
848 friend class JGEvent;
849 friend class JGEngine;
850public:
854 enum Version {
855 Version0 = 0,
856 Version1 = 1,
857 VersionUnknown
858 };
859
863 enum Reason {
864 ReasonUnknown = 0,
865 // Session termination reason
866 ReasonOk, // success
867 ReasonBusy, // busy
868 ReasonDecline, // decline
869 ReasonCancel, // cancel
870 ReasonExpired, // expired
871 ReasonConn, // connectivity-error
872 ReasonFailApp, // failed-application
873 ReasonFailTransport, // failed-transport
874 ReasonGone, // gone
875 ReasonParams, // incompatible-parameters
876 ReasonMedia, // media-error
877 ReasonTransport, // unsupported-transports
878 ReasonApp, // unsupported-applications
879 ReasonSecurity, // security-error
880 ReasonTimeout, // timeout
881 ReasonGeneral, // general-error
882 ReasonAltSess, // alternative-session
883 // Session transfer (XEP 0251)
884 Transferred, // transferred
885 // RTP session errors (XEP 0167)
886 CryptoRequired, // crypto-required
887 InvalidCrypto, // invalid-crypto
888 };
889
893 enum RtpInfo {
894 RtpActive, // active
895 RtpHold, // hold
896 RtpMute, // mute
897 RtpRinging, // ringing
898 };
899
903 enum State {
904 Idle = 0, // Outgoing stream is waiting for
905 Pending = 1, // Session is pending, session-initiate sent/received
906 Active = 2, // Session is active, session-accept sent/received
907 Ending = 3, // Session terminated: Wait for write result
908 Destroy = 4, // The session will be destroyed
909 };
910
914 enum Action {
915 ActAccept, // session-accept
916 ActInitiate, // session-initiate
917 ActTerminate, // session-terminate
918 ActReject, // reject
919 ActInfo, // session-info
920 ActTransportInfo, // transport-info
921 ActTransportAccept, // transport-accept
922 ActTransportReject, // transport-reject
923 ActTransportReplace, // transport-replace
924 ActCandidates, // candidates
925 ActContentAccept, // content-accept
926 ActContentAdd, // content-add
927 ActContentModify, // content-modify
928 ActContentReject, // content-reject
929 ActContentRemove, // content-remove
930 ActContentInfo, // content-info
931 ActDescriptionInfo, // description-info
932 ActTransfer, // session-info: Transfer
933 ActRinging, // session-info: Ringing
934 ActTrying, // session-info: Trying
935 ActReceived, // session-info: Received
936 ActHold, // session-info: Hold
937 ActActive, // session-info: Active
938 ActMute, // session-info: Mute
939 ActDtmf, // session-info: Dtmf
940 ActStreamHost,
941 ActCount,
942 };
943
948 FlagNoPing = 0x0001, // Don't send ping
949 FlagRingNsRtp = 0x0002, // Send ringing using rtp namespace instead of rtp info namespace
950 FlagNoOkInitiate = 0x0004, // Don't raise a ResultOk when initiate stanza is confirmed
951 };
952
956 virtual ~JGSession();
957
962 inline Version version() const
963 { return m_version; }
964
969 inline JGEngine* engine() const
970 { return m_engine; }
971
976 inline bool outgoing() const
977 { return m_outgoing; }
978
983 inline const String& sid() const
984 { return m_sid; }
985
990 inline const JabberID& local() const
991 { return m_local; }
992
997 inline const JabberID& remote() const
998 { return m_remote; }
999
1004 inline State state() const
1005 { return m_state; }
1006
1012 inline int flag(int mask) const
1013 { return m_flags & mask; }
1014
1019 inline void setFlags(int value)
1020 { m_flags = value; }
1021
1026 inline void* userData()
1027 { return m_private; }
1028
1033 inline void userData(void* userdata)
1034 { m_private = userdata; }
1035
1040 inline const String& line() const
1041 { return m_line; }
1042
1047 inline void line(const String& acc)
1048 { m_line = acc; }
1049
1056
1066 bool acceptIq(XMPPUtils::IqType type, const JabberID& from, const JabberID& to,
1067 const String& id, XmlElement* xml);
1068
1075
1085 const char* text = 0, XMPPError::ErrorType type = XMPPError::TypeModify);
1086
1094 virtual bool accept(const ObjList& contents, String* stanzaId = 0)
1095 { return false; }
1096
1103 virtual bool hangup(XmlElement* reason = 0);
1104
1111 { return 0; }
1112
1120 virtual XmlElement* createReason(int reason, const char* text = 0,
1121 XmlElement* child = 0)
1122 { return 0; }
1123
1130 { return 0; }
1131
1138 { return 0; }
1139
1149 virtual bool sendContent(Action action, const ObjList& contents, String* stanzaId = 0)
1150 { return false; }
1151
1161 inline bool sendContent(Action action, const JGSessionContent* content,
1162 String* stanzaId = 0) {
1163 if (!content)
1164 return false;
1165 ObjList tmp;
1166 tmp.append(content)->setDelete(false);
1167 return sendContent(action,tmp,stanzaId);
1168 }
1169
1178 virtual bool sendStreamHosts(const ObjList& hosts, String* stanzaId = 0)
1179 { return false; }
1180
1189 virtual bool sendStreamHostUsed(const char* jid, const char* stanzaId)
1190 { return false; }
1191
1197
1206 bool sendInfo(XmlElement* xml, String* stanzaId = 0, XmlElement* extra = 0);
1207
1216 bool sendDtmf(const char* dtmf, unsigned int msDuration = 0, String* stanzaId = 0);
1217
1224
1232 static XmlElement* buildTransfer(const String& transferTo, const String& transferFrom,
1233 const String& sid = String::empty());
1234
1241 static inline Version lookupVersion(const char* value, Version def = VersionUnknown)
1242 { return (Version)lookup(value,s_versions,def); }
1243
1250 static inline const char* lookupVersion(int value, const char* def = "unknown")
1251 { return lookup(value,s_versions,def); }
1252
1259 static inline int lookupReason(const char* value, int def = ReasonOk)
1260 { return lookup(value,s_reasons,def); }
1261
1268 static inline const char* lookupReason(int value, const char* def = 0)
1269 { return lookup(value,s_reasons,def); }
1270
1276 static const char* lookupState(int state)
1277 { return lookup(state,s_states); }
1278
1285 static const char* lookupAction(int act, Version ver);
1286
1293 static Action lookupAction(const char* str, Version ver);
1294
1298 static const TokenDict s_versions[];
1299
1303 static const TokenDict s_reasons[];
1304
1308 static const TokenDict s_rtpInfo[];
1309
1313 static const TokenDict s_states[];
1314
1318 static const TokenDict s_actions0[];
1319
1323 static const TokenDict s_actions1[];
1324
1328 static const TokenDict s_flagName[];
1329
1330protected:
1338 JGSession(Version ver, JGEngine* engine,
1339 const JabberID& caller, const JabberID& called);
1340
1350 JGSession(Version ver, JGEngine* engine, const JabberID& caller,
1351 const JabberID& called, XmlElement* xml, const String& id);
1352
1360 virtual bool initiate(const ObjList& contents, XmlElement* extra,
1361 const char* subject = 0) = 0;
1362
1369 virtual JGEvent* getEvent(u_int64_t time);
1370
1374 virtual void destroyed();
1375
1385 bool sendStanza(XmlElement* stanza, String* stanzaId = 0, bool confirmation = true,
1386 bool ping = false, unsigned int toutMs = 0);
1387
1393 bool sendPing(u_int64_t msecNow);
1394
1401 virtual JGEvent* decodeJingle(XmlElement*& xml, XmlElement* child) = 0;
1402
1411 virtual XmlElement* createJingle(Action action, XmlElement* element1 = 0,
1412 XmlElement* element2 = 0, XmlElement* element3 = 0) = 0;
1413
1420 virtual XmlElement* createDtmf(const char* dtmf, unsigned int msDuration = 0) = 0;
1421
1428 virtual JGEvent* processJingleSetEvent(JGEvent*& ev);
1429
1436 virtual JGEvent* processJabberIqResponse(bool result, XmlElement*& xml);
1437
1445 virtual JGEvent* processFileTransfer(bool set, XmlElement*& xml, XmlElement* child);
1446
1451 void eventTerminated(JGEvent* event);
1452
1457 void changeState(State newState);
1458
1459 Version m_version; // Session version
1460 State m_state; // Session state
1461 int m_flags; // Session flags
1462 u_int64_t m_timeToPing; // Time to send ping (empty session-info)
1463 JGEngine* m_engine; // The engine that owns this session
1464 bool m_outgoing; // Session direction
1465 String m_sid; // Session id
1466 JabberID m_local; // Local peer's JID
1467 JabberID m_remote; // Remote peer's JID
1468 XmlFragment m_queue; // Incoming, unprocessed, xml elements
1469 JGEvent* m_lastEvent; // Last generated event
1470 bool m_recvTerminate; // Flag indicating whether session-terminate was received
1471 void* m_private; // Arbitrary user data
1472 String m_localSid; // Local session id (used to generate element's id)
1473 u_int32_t m_stanzaId; // Sent stanza id counter
1474 ObjList m_sentStanza; // Sent stanzas' id
1475 String m_line; // Session account
1476
1477private:
1478 JGSession() {} // Don't use it
1479};
1480
1481
1486class YJABBER_API JGSession0 : public JGSession
1487{
1488 friend class JGEvent;
1489 friend class JGEngine;
1490public:
1494 virtual ~JGSession0();
1495
1503 virtual bool accept(const ObjList& contents, String* stanzaId = 0);
1504
1505protected:
1512 JGSession0(JGEngine* engine, const JabberID& caller, const JabberID& called);
1513
1522 JGSession0(JGEngine* engine, const JabberID& caller, const JabberID& called,
1523 XmlElement* xml, const String& id);
1524
1532 virtual bool initiate(const ObjList& contents, XmlElement* extra,
1533 const char* subject = 0);
1534
1544 virtual bool sendContent(Action action, const ObjList& contents, String* stanzaId = 0);
1545
1552 virtual JGEvent* decodeJingle(XmlElement*& xml, XmlElement* child);
1553
1562 virtual XmlElement* createJingle(Action action, XmlElement* element1 = 0,
1563 XmlElement* element2 = 0, XmlElement* element3 = 0);
1564
1571 virtual XmlElement* createDtmf(const char* dtmf, unsigned int msDuration = 0);
1572
1573protected:
1574 String m_sessContentName; // Content name advertised to upper layer
1575 Action m_candidatesAction; // Use candidates/transport-info for candidates
1576};
1577
1582class YJABBER_API JGSession1 : public JGSession
1583{
1584 friend class JGEvent;
1585 friend class JGEngine;
1586public:
1590 virtual ~JGSession1();
1591
1599 virtual bool accept(const ObjList& contents, String* stanzaId = 0);
1600
1607
1615 virtual XmlElement* createReason(int reason, const char* text = 0,
1616 XmlElement* child = 0);
1617
1623 virtual XmlElement* createTransferReason(int reason);
1624
1631
1641 virtual bool sendContent(Action action, const ObjList& contents, String* stanzaId = 0);
1642
1651 virtual bool sendStreamHosts(const ObjList& hosts, String* stanzaId = 0);
1652
1661 virtual bool sendStreamHostUsed(const char* jid, const char* stanzaId);
1662
1663protected:
1670 JGSession1(JGEngine* engine, const JabberID& caller, const JabberID& called);
1671
1680 JGSession1(JGEngine* engine, const JabberID& caller, const JabberID& called,
1681 XmlElement* xml, const String& id);
1682
1690 virtual bool initiate(const ObjList& contents, XmlElement* extra,
1691 const char* subject = 0);
1692
1699 virtual JGEvent* decodeJingle(XmlElement*& xml, XmlElement* child);
1700
1709 virtual XmlElement* createJingle(Action action, XmlElement* element1 = 0,
1710 XmlElement* element2 = 0, XmlElement* element3 = 0);
1711
1718 virtual XmlElement* createDtmf(const char* dtmf, unsigned int msDuration = 0);
1719
1727 virtual JGEvent* processFileTransfer(bool set, XmlElement*& xml, XmlElement* child);
1728
1729};
1730
1735class YJABBER_API JGEvent
1736{
1737 friend class JGSession;
1738 friend class JGSession0;
1739 friend class JGSession1;
1740public:
1744 enum Type {
1745 Jingle, //
1746 ResultOk, // Response for a sent stanza (iq with type=result)
1747 ResultError, // Response for a sent stanza (iq with type=error)
1748 ResultTimeout, // Response for a sent stanza (stanza timeout)
1749 // Final
1750 Terminated, // m_element is the element that caused the termination
1751 // m_reason contains the reason
1752 Destroy, // The engine sould delete the event (causing session destruction)
1753 };
1754
1758 virtual ~JGEvent();
1759
1764 inline Type type() const
1765 { return m_type; }
1766
1771 inline const char* name()
1772 { return lookupType(m_type); }
1773
1778 inline JGSession* session() const
1779 { return m_session; }
1780
1785 inline XmlElement* element() const
1786 { return m_element; }
1787
1793 inline XmlElement* jingle() const
1794 { return m_jingle; }
1795
1801 { return m_action; }
1802
1807 inline const char* actionName() const
1808 { return m_session ? JGSession::lookupAction(m_action,m_session->version()) : ""; }
1809
1814 inline const String& id() const
1815 { return m_id; }
1816
1821 inline const String& reason() const
1822 { return m_reason; }
1823
1828 inline const String& text() const
1829 { return m_text; }
1830
1836 XmlElement* tmp = m_element;
1837 m_jingle = m_element = 0;
1838 return tmp;
1839 }
1840
1845 inline bool final() const
1846 { return m_type == Terminated || m_type == Destroy; }
1847
1855 inline bool confirmElement(XMPPError::Type error = XMPPError::NoError,
1856 const char* text = 0, XMPPError::ErrorType type = XMPPError::TypeModify) {
1857 if (m_session && element() && !m_confirmed) {
1858 m_confirmed = true;
1859 if (error == XMPPError::NoError)
1860 return m_session->confirmResult(element());
1861 XmlElement* err = releaseXml();
1862 return m_session->confirmError(err,error,text,type);
1863 }
1864 return false;
1865 }
1866
1870 inline void setConfirmed()
1871 { m_confirmed = true; }
1872
1879
1884 static inline const char* lookupType(int type)
1885 { return lookup(type,s_typeName); }
1886
1890 static const TokenDict s_typeName[];
1891
1896
1901
1902protected:
1911 inline JGEvent(Type type, JGSession* session, XmlElement* element = 0,
1912 const char* reason = 0, const char* text = 0)
1913 : m_type(type), m_confirmed(true), m_session(0), m_element(element),
1914 m_jingle(0), m_action(JGSession::ActCount), m_reason(reason), m_text(text)
1915 { init(session); }
1916
1926 const char* reason = 0, const char* text = 0)
1927 : m_type(Jingle), m_confirmed(false), m_session(0), m_element(element), m_jingle(0),
1928 m_action(act), m_reason(reason), m_text(text) {
1929 init(session);
1930 setAction(act);
1931 }
1932
1933private:
1934 JGEvent() {} // Don't use it
1935 void init(JGSession* session);
1936
1937 Type m_type; // The type of this event
1938 bool m_confirmed; // Flag indicating that element was confirmed
1939 JGSession* m_session; // Jingle session that generated this event
1940 XmlElement* m_element; // XML element that generated this event
1941 XmlElement* m_jingle; // The session child, if present
1942 // Event specific
1943 JGSession::Action m_action; // The action if type is Jingle
1944 String m_id; // The element's id attribute
1945 String m_reason; // The reason if type is Error or Terminated
1946 String m_text; // Dtmf text
1947};
1948
1954class YJABBER_API JGEngine : public DebugEnabler, public Mutex
1955{
1956 friend class JGSession;
1957public:
1962 JGEngine(const char* name = "jgengine");
1963
1967 virtual ~JGEngine();
1968
1973 inline int sessionFlags() const
1974 { return m_sessionFlags; }
1975
1980 inline u_int64_t stanzaTimeout() const
1981 { return m_stanzaTimeout; }
1982
1987 inline u_int64_t streamHostTimeout() const
1988 { return m_streamHostTimeout; }
1989
1994 inline u_int64_t pingInterval() const
1995 { return m_pingInterval; }
1996
2001 virtual void initialize(const NamedList& params);
2002
2010 virtual bool sendStanza(JGSession* session, XmlElement*& stanza);
2011
2018 virtual bool sendMessage(JGSession* session, const char* body);
2019
2026 JGEvent* getEvent(u_int64_t time);
2027
2042 JGSession* call(JGSession::Version ver, const JabberID& caller, const JabberID& called,
2043 const ObjList& contents, XmlElement* extra = 0, const char* msg = 0,
2044 const char* subject = 0, const char* line = 0, int* flags = 0);
2045
2059 bool acceptIq(XMPPUtils::IqType type, const JabberID& from, const JabberID& to,
2060 const String& id, XmlElement* xml, const char* line,
2061 XMPPError::Type& error, String& text);
2062
2068
2074 virtual void processEvent(JGEvent* event);
2075
2082 static int decodeFlags(const String& list, const TokenDict* dict);
2083
2090 static void encodeFlags(String& buf, int flags, const TokenDict* dict);
2091
2092private:
2093 // Create a local session id
2094 void createSessionId(String& id);
2095
2096 ObjList m_sessions; // List of sessions
2097 u_int32_t m_sessionId; // Session id counter
2098 u_int64_t m_stanzaTimeout; // The timeout of a sent stanza
2099 u_int64_t m_streamHostTimeout; // The timeout of a sent stream host stanza
2100 u_int64_t m_pingInterval; // Interval to send ping (empty session-info)
2101 int m_sessionFlags; // Default session flags
2102};
2103
2104
2109class YJABBER_API JGSentStanza : public String
2110{
2111public:
2120 JGSentStanza(const char* id, u_int64_t time, bool notif = false, bool ping = false,
2121 JGSession::Action action = JGSession::ActCount)
2122 : String(id), m_time(time), m_notify(notif), m_ping(ping), m_action(action)
2123 {}
2124
2129 inline u_int64_t timeout() const
2130 { return m_time; }
2131
2136 inline bool timeout(u_int64_t time) const
2137 { return time > m_time; }
2138
2143 inline bool notify() const
2144 { return m_notify; }
2145
2150 inline bool ping() const
2151 { return m_ping; }
2152
2158 { return m_action; }
2159
2160private:
2161 u_int64_t m_time; // Timeout
2162 bool m_notify; // Notify timeout to sender
2163 bool m_ping; // Sent stanza is a ping one
2164 JGSession::Action m_action; // Sent stanza action
2165};
2166
2167};
2168
2169#endif /* __YATEJINGLE_H */
2170
2171/* vi: set ts=8 sw=4 sts=4 noet: */
DebugEnabler(int level=TelEngine::debugLevel(), bool enabled=true)
Definition yateclass.h:319
A Jabber ID.
Definition xmpputils.h:429
Mutex(bool recursive=false, const char *name=0)
A named string container class.
Definition yateclass.h:5016
A named string class.
Definition yateclass.h:3481
An object list class.
Definition yateclass.h:1454
ObjList * append(const GenObject *obj, bool compact=true)
void setDelete(bool autodelete)
Definition yateclass.h:1659
A C-style string handling class.
Definition yateclass.h:2131
static const String & empty()
Content crypto data.
Definition yatejingle.h:185
XmlElement * toXml() const
static void decodeEncryption(const XmlElement *xml, ObjList &list, bool &required)
void fromXml(const XmlElement *xml)
static XmlElement * buildEncryption(const ObjList &list, bool required)
JGCrypto(const XmlElement *xml)
Definition yatejingle.h:204
JGCrypto(const char *tag="1", const char *suite=0, const char *key=0, const char *session=0)
Definition yatejingle.h:194
A Jingle engine.
Definition yatejingle.h:1955
static int decodeFlags(const String &list, const TokenDict *dict)
JGSession * call(JGSession::Version ver, const JabberID &caller, const JabberID &called, const ObjList &contents, XmlElement *extra=0, const char *msg=0, const char *subject=0, const char *line=0, int *flags=0)
JGEngine(const char *name="jgengine")
bool acceptIq(XMPPUtils::IqType type, const JabberID &from, const JabberID &to, const String &id, XmlElement *xml, const char *line, XMPPError::Type &error, String &text)
u_int64_t stanzaTimeout() const
Definition yatejingle.h:1980
virtual void processEvent(JGEvent *event)
virtual bool sendStanza(JGSession *session, XmlElement *&stanza)
JGEvent * getEvent(u_int64_t time)
static void encodeFlags(String &buf, int flags, const TokenDict *dict)
virtual bool sendMessage(JGSession *session, const char *body)
u_int64_t streamHostTimeout() const
Definition yatejingle.h:1987
int sessionFlags() const
Definition yatejingle.h:1973
virtual void initialize(const NamedList &params)
u_int64_t pingInterval() const
Definition yatejingle.h:1994
void defProcessEvent(JGEvent *event)
A Jingle event.
Definition yatejingle.h:1736
ObjList m_streamHosts
Definition yatejingle.h:1900
static const TokenDict s_typeName[]
Definition yatejingle.h:1890
Type
Definition yatejingle.h:1744
JGSession::Action action() const
Definition yatejingle.h:1800
ObjList m_contents
Definition yatejingle.h:1895
JGEvent(JGSession::Action act, JGSession *session, XmlElement *element, const char *reason=0, const char *text=0)
Definition yatejingle.h:1925
bool confirmElement(XMPPError::Type error=XMPPError::NoError, const char *text=0, XMPPError::ErrorType type=XMPPError::TypeModify)
Definition yatejingle.h:1855
const char * actionName() const
Definition yatejingle.h:1807
const String & id() const
Definition yatejingle.h:1814
JGSession * session() const
Definition yatejingle.h:1778
XmlElement * element() const
Definition yatejingle.h:1785
void setAction(JGSession::Action act)
const char * name()
Definition yatejingle.h:1771
XmlElement * releaseXml()
Definition yatejingle.h:1835
static const char * lookupType(int type)
Definition yatejingle.h:1884
const String & text() const
Definition yatejingle.h:1828
const String & reason() const
Definition yatejingle.h:1821
Type type() const
Definition yatejingle.h:1764
XmlElement * jingle() const
Definition yatejingle.h:1793
void setConfirmed()
Definition yatejingle.h:1870
JGEvent(Type type, JGSession *session, XmlElement *element=0, const char *reason=0, const char *text=0)
Definition yatejingle.h:1911
void fromXml(XmlElement *xml, const JGRtpCandidates &container)
JGRtpCandidateP2P(XmlElement *xml, const JGRtpCandidates &container)
Definition yatejingle.h:477
JGRtpCandidateP2P()
Definition yatejingle.h:468
virtual XmlElement * toXml(const JGRtpCandidates &container) const
A RTP transport candidate.
Definition yatejingle.h:412
void fromXml(XmlElement *xml, const JGRtpCandidates &container)
JGRtpCandidate(const char *id, const char *component="1", unsigned int generation=0, unsigned int net=0, int prio=0)
Definition yatejingle.h:417
JGRtpCandidate(XmlElement *xml, const JGRtpCandidates &container)
Definition yatejingle.h:429
virtual XmlElement * toXml(const JGRtpCandidates &container) const
A list of RTP transport candidates.
Definition yatejingle.h:505
static void generateOldIceToken(String &dest)
static const TokenDict s_type[]
Definition yatejingle.h:597
Type
Definition yatejingle.h:510
JGRtpCandidates(Type t=Unknown)
Definition yatejingle.h:522
static void generateIceToken(String &dest, bool pwd, unsigned int max=0)
const char * typeName() const
Definition yatejingle.h:530
void generateIceAuth()
Definition yatejingle.h:536
void fromXml(XmlElement *element)
void generateOldIceAuth()
Definition yatejingle.h:544
XmlElement * toXml(bool addCandidates, bool addAuth) const
static const char * typeName(int t, const char *defVal="unknown")
Definition yatejingle.h:591
JGRtpCandidate * findByComponent(unsigned int component)
A List of Jingle RTP data payloads.
Definition yatejingle.h:245
XmlElement * toXml() const
Media m_media
Definition yatejingle.h:365
static const TokenDict s_media[]
Definition yatejingle.h:360
int m_telEvent
Definition yatejingle.h:393
bool m_ready
Definition yatejingle.h:388
String m_ssrc
Definition yatejingle.h:370
JGRtpMediaList(Media m=MediaMissing, bool cryptoRequired=false)
Definition yatejingle.h:261
bool createList(String &dest, bool synonym, const char *sep=",")
bool m_cryptoRequired
Definition yatejingle.h:381
JGRtpMedia * findSynonym(const String &value) const
Media
Definition yatejingle.h:250
void setMedia(const JGRtpMediaList &src, const String &only=String::empty())
void addTelEvent(XmlElement *xml, const char *name=0) const
~JGRtpMediaList()
Definition yatejingle.h:269
NamedString * m_bandwidth
Definition yatejingle.h:376
String m_telEventName2
Definition yatejingle.h:403
String m_telEventName
Definition yatejingle.h:398
JGRtpMedia * findMedia(const String &id)
void fromXml(XmlElement *xml)
void filterMedia(const String &only)
Media media() const
Definition yatejingle.h:276
void add(const char *id, const char *name, const char *clockrate, const char *synonym=0, const char *channels=0, const char *pTime=0, const char *maxPTime=0, const char *bitRate=0)
Definition yatejingle.h:290
A Jingle data payload.
Definition yatejingle.h:52
JGRtpMedia(const JGRtpMedia &src)
Definition yatejingle.h:82
XmlElement * toXml() const
String m_id
Definition yatejingle.h:136
void set(const char *id, const char *name, const char *clockrate, const char *synonym=0, const char *channels=0, const char *pTime=0, const char *maxPTime=0, const char *bitRate=0)
Definition yatejingle.h:100
String m_synonym
Definition yatejingle.h:151
JGRtpMedia(const char *id, const char *name, const char *clockrate, const char *synonym, const char *channels=0, const char *pTime=0, const char *maxPTime=0, const char *bitRate=0)
Definition yatejingle.h:65
String m_maxPTime
Definition yatejingle.h:166
virtual const String & toString() const
Definition yatejingle.h:118
String m_bitRate
Definition yatejingle.h:171
String m_pTime
Definition yatejingle.h:161
void fromXml(XmlElement *xml)
String m_name
Definition yatejingle.h:141
String m_channels
Definition yatejingle.h:156
NamedList m_params
Definition yatejingle.h:176
String m_clockrate
Definition yatejingle.h:146
JGRtpMedia(XmlElement *xml)
Definition yatejingle.h:75
Send stanza timeout info.
Definition yatejingle.h:2110
bool ping() const
Definition yatejingle.h:2150
u_int64_t timeout() const
Definition yatejingle.h:2129
JGSession::Action action() const
Definition yatejingle.h:2157
bool notify() const
Definition yatejingle.h:2143
bool timeout(u_int64_t time) const
Definition yatejingle.h:2136
JGSentStanza(const char *id, u_int64_t time, bool notif=false, bool ping=false, JGSession::Action action=JGSession::ActCount)
Definition yatejingle.h:2120
The version 0 of a jingle session.
Definition yatejingle.h:1487
JGSession0(JGEngine *engine, const JabberID &caller, const JabberID &called, XmlElement *xml, const String &id)
virtual JGEvent * decodeJingle(XmlElement *&xml, XmlElement *child)
virtual bool accept(const ObjList &contents, String *stanzaId=0)
virtual XmlElement * createDtmf(const char *dtmf, unsigned int msDuration=0)
virtual XmlElement * createJingle(Action action, XmlElement *element1=0, XmlElement *element2=0, XmlElement *element3=0)
virtual bool sendContent(Action action, const ObjList &contents, String *stanzaId=0)
virtual bool initiate(const ObjList &contents, XmlElement *extra, const char *subject=0)
JGSession0(JGEngine *engine, const JabberID &caller, const JabberID &called)
The version 1 of a jingle session.
Definition yatejingle.h:1583
virtual XmlElement * createReason(int reason, const char *text=0, XmlElement *child=0)
virtual JGEvent * processFileTransfer(bool set, XmlElement *&xml, XmlElement *child)
virtual XmlElement * createTransferReason(int reason)
virtual JGEvent * decodeJingle(XmlElement *&xml, XmlElement *child)
virtual bool accept(const ObjList &contents, String *stanzaId=0)
virtual XmlElement * createDtmf(const char *dtmf, unsigned int msDuration=0)
virtual XmlElement * createJingle(Action action, XmlElement *element1=0, XmlElement *element2=0, XmlElement *element3=0)
virtual bool sendContent(Action action, const ObjList &contents, String *stanzaId=0)
virtual XmlElement * createRtpSessionReason(int reason)
virtual bool sendStreamHostUsed(const char *jid, const char *stanzaId)
virtual bool initiate(const ObjList &contents, XmlElement *extra, const char *subject=0)
JGSession1(JGEngine *engine, const JabberID &caller, const JabberID &called, XmlElement *xml, const String &id)
virtual bool sendStreamHosts(const ObjList &hosts, String *stanzaId=0)
JGSession1(JGEngine *engine, const JabberID &caller, const JabberID &called)
virtual XmlElement * createRtpInfoXml(RtpInfo info)
A Jingle session content.
Definition yatejingle.h:612
JGRtpMediaList m_rtpMedia
Definition yatejingle.h:749
bool isValidAudio() const
Definition yatejingle.h:684
Creator
Definition yatejingle.h:641
Type
Definition yatejingle.h:617
JGRtpCandidates m_rtpRemoteCandidates
Definition yatejingle.h:759
Creator creator() const
Definition yatejingle.h:676
JGSessionContent(Type t, const char *name, Senders senders, Creator creator, const char *disposition=0)
XmlElement * toXml(bool minimum, bool addDesc, bool addTrans, bool addCandidates, bool addAuth) const
virtual const String & toString() const
Definition yatejingle.h:690
static JGSessionContent * fromXml(XmlElement *xml, XMPPError::Type &err, String &error)
void setEarlyMedia()
Definition yatejingle.h:711
Senders senders() const
Definition yatejingle.h:669
bool isSession() const
Definition yatejingle.h:698
Senders
Definition yatejingle.h:631
NamedList m_fileTransfer
Definition yatejingle.h:764
static const TokenDict s_creator[]
Definition yatejingle.h:744
Type type() const
Definition yatejingle.h:662
JGRtpCandidates m_rtpLocalCandidates
Definition yatejingle.h:754
bool isEarlyMedia() const
Definition yatejingle.h:705
static const TokenDict s_senders[]
Definition yatejingle.h:739
A basic Jingle session.
Definition yatejingle.h:847
static const TokenDict s_versions[]
Definition yatejingle.h:1298
void changeState(State newState)
bool confirmError(XmlElement *&xml, XMPPError::Type error, const char *text=0, XMPPError::ErrorType type=XMPPError::TypeModify)
static Version lookupVersion(const char *value, Version def=VersionUnknown)
Definition yatejingle.h:1241
Version
Definition yatejingle.h:854
virtual XmlElement * createJingle(Action action, XmlElement *element1=0, XmlElement *element2=0, XmlElement *element3=0)=0
bool sendContent(Action action, const JGSessionContent *content, String *stanzaId=0)
Definition yatejingle.h:1161
virtual JGEvent * processJingleSetEvent(JGEvent *&ev)
virtual void destroyed()
static XmlElement * buildTransfer(const String &transferTo, const String &transferFrom, const String &sid=String::empty())
JGSession(Version ver, JGEngine *engine, const JabberID &caller, const JabberID &called)
void line(const String &acc)
Definition yatejingle.h:1047
JGEngine * engine() const
Definition yatejingle.h:969
virtual XmlElement * createReason(int reason, const char *text=0, XmlElement *child=0)
Definition yatejingle.h:1120
virtual bool hangup(XmlElement *reason=0)
const String & line() const
Definition yatejingle.h:1040
static const TokenDict s_rtpInfo[]
Definition yatejingle.h:1308
virtual JGEvent * processFileTransfer(bool set, XmlElement *&xml, XmlElement *child)
static const char * lookupReason(int value, const char *def=0)
Definition yatejingle.h:1268
virtual XmlElement * createTransferReason(int reason)
Definition yatejingle.h:1129
static const TokenDict s_actions0[]
Definition yatejingle.h:1318
const JabberID & remote() const
Definition yatejingle.h:997
virtual JGEvent * decodeJingle(XmlElement *&xml, XmlElement *child)=0
void userData(void *userdata)
Definition yatejingle.h:1033
const String & sid() const
Definition yatejingle.h:983
static const char * lookupVersion(int value, const char *def="unknown")
Definition yatejingle.h:1250
int flag(int mask) const
Definition yatejingle.h:1012
void buildSocksDstAddr(String &buf)
State
Definition yatejingle.h:903
static Action lookupAction(const char *str, Version ver)
virtual bool accept(const ObjList &contents, String *stanzaId=0)
Definition yatejingle.h:1094
bool sendInfo(XmlElement *xml, String *stanzaId=0, XmlElement *extra=0)
SessionFlag
Definition yatejingle.h:947
void setFlags(int value)
Definition yatejingle.h:1019
bool sendDtmf(const char *dtmf, unsigned int msDuration=0, String *stanzaId=0)
Action
Definition yatejingle.h:914
const JabberID & local() const
Definition yatejingle.h:990
virtual bool sendContent(Action action, const ObjList &contents, String *stanzaId=0)
Definition yatejingle.h:1149
static const char * lookupState(int state)
Definition yatejingle.h:1276
bool acceptIq(XMPPUtils::IqType type, const JabberID &from, const JabberID &to, const String &id, XmlElement *xml)
static const TokenDict s_states[]
Definition yatejingle.h:1313
static int lookupReason(const char *value, int def=ReasonOk)
Definition yatejingle.h:1259
virtual XmlElement * createDtmf(const char *dtmf, unsigned int msDuration=0)=0
JGSession(Version ver, JGEngine *engine, const JabberID &caller, const JabberID &called, XmlElement *xml, const String &id)
virtual XmlElement * createRtpSessionReason(int reason)
Definition yatejingle.h:1137
static const char * lookupAction(int act, Version ver)
virtual bool sendStreamHostUsed(const char *jid, const char *stanzaId)
Definition yatejingle.h:1189
bool confirmResult(XmlElement *xml)
static const TokenDict s_actions1[]
Definition yatejingle.h:1323
virtual JGEvent * processJabberIqResponse(bool result, XmlElement *&xml)
void * userData()
Definition yatejingle.h:1026
static const TokenDict s_flagName[]
Definition yatejingle.h:1328
static const TokenDict s_reasons[]
Definition yatejingle.h:1303
bool hasFeature(XMPPNamespace::Type feature)
virtual bool sendStreamHosts(const ObjList &hosts, String *stanzaId=0)
Definition yatejingle.h:1178
Version version() const
Definition yatejingle.h:962
State state() const
Definition yatejingle.h:1004
RtpInfo
Definition yatejingle.h:893
virtual JGEvent * getEvent(u_int64_t time)
void eventTerminated(JGEvent *event)
bool sendPing(u_int64_t msecNow)
virtual bool initiate(const ObjList &contents, XmlElement *extra, const char *subject=0)=0
bool sendStanza(XmlElement *stanza, String *stanzaId=0, bool confirmation=true, bool ping=false, unsigned int toutMs=0)
Reason
Definition yatejingle.h:863
Action getAction(XmlElement *xml)
bool outgoing() const
Definition yatejingle.h:976
virtual XmlElement * createRtpInfoXml(RtpInfo info)
Definition yatejingle.h:1110
A Jingle file transfer stream host.
Definition yatejingle.h:780
JGStreamHost(bool local, const char *jid, const char *addr, int port, const char *zeroConf=0)
Definition yatejingle.h:790
XmlElement * toXml()
static XmlElement * buildHosts(const ObjList &hosts, const char *sid, const char *mode="tcp")
JGStreamHost(const JGStreamHost &src)
Definition yatejingle.h:799
static XmlElement * buildRsp(const char *jid)
static JGStreamHost * fromXml(XmlElement *xml)
Xml Element.
Definition yatexml.h:1137
Xml Fragment.
Definition yatexml.h:857
Type
Definition xmpputils.h:220
ErrorType
Definition xmpputils.h:286
Type
Definition xmpputils.h:130
IqType
Definition xmpputils.h:1090
Definition yatemime.h:34
Definition yateclass.h:848