diff --git a/src/jingle.rs b/src/jingle.rs
index 264aa18..dab5371 100644
--- a/src/jingle.rs
+++ b/src/jingle.rs
@@ -16,64 +16,170 @@ use error::Error;
use ns;
use iq::IqSetPayload;
-generate_attribute!(Action, "action", {
- ContentAccept => "content-accept",
- ContentAdd => "content-add",
- ContentModify => "content-modify",
- ContentReject => "content-reject",
- ContentRemove => "content-remove",
- DescriptionInfo => "description-info",
- SecurityInfo => "security-info",
- SessionAccept => "session-accept",
- SessionInfo => "session-info",
- SessionInitiate => "session-initiate",
- SessionTerminate => "session-terminate",
- TransportAccept => "transport-accept",
- TransportInfo => "transport-info",
- TransportReject => "transport-reject",
- TransportReplace => "transport-replace",
-});
+generate_attribute!(
+ /// The action attribute.
+ Action, "action", {
+ /// Accept a content-add action received from another party.
+ ContentAccept => "content-accept",
-generate_attribute!(Creator, "creator", {
- Initiator => "initiator",
- Responder => "responder",
-});
+ /// Add one or more new content definitions to the session.
+ ContentAdd => "content-add",
-generate_attribute!(Senders, "senders", {
- Both => "both",
- Initiator => "initiator",
- None => "none",
- Responder => "responder",
-}, Default = Both);
+ /// Change the directionality of media sending.
+ ContentModify => "content-modify",
-// From https://www.iana.org/assignments/cont-disp/cont-disp.xhtml
-generate_attribute!(Disposition, "disposition", {
- Inline => "inline",
- Attachment => "attachment",
- FormData => "form-data",
- Signal => "signal",
- Alert => "alert",
- Icon => "icon",
- Render => "render",
- RecipientListHistory => "recipient-list-history",
- Session => "session",
- Aib => "aib",
- EarlySession => "early-session",
- RecipientList => "recipient-list",
- Notification => "notification",
- ByReference => "by-reference",
- InfoPackage => "info-package",
- RecordingSession => "recording-session",
-}, Default = Session);
+ /// Reject a content-add action received from another party.
+ ContentReject => "content-reject",
-generate_id!(ContentId);
+ /// Remove one or more content definitions from the session.
+ ContentRemove => "content-remove",
+
+ /// Exchange information about parameters for an application type.
+ DescriptionInfo => "description-info",
+
+ /// Exchange information about security preconditions.
+ SecurityInfo => "security-info",
+
+ /// Definitively accept a session negotiation.
+ SessionAccept => "session-accept",
+
+ /// Send session-level information, such as a ping or a ringing message.
+ SessionInfo => "session-info",
+
+ /// Request negotiation of a new Jingle session.
+ SessionInitiate => "session-initiate",
+
+ /// End an existing session.
+ SessionTerminate => "session-terminate",
+
+ /// Accept a transport-replace action received from another party.
+ TransportAccept => "transport-accept",
+
+ /// Exchange transport candidates.
+ TransportInfo => "transport-info",
+
+ /// Reject a transport-replace action received from another party.
+ TransportReject => "transport-reject",
+
+ /// Redefine a transport method or replace it with a different method.
+ TransportReplace => "transport-replace",
+ }
+);
+
+generate_attribute!(
+ /// Which party originally generated the content type.
+ Creator, "creator", {
+ /// This content was created by the initiator of this session.
+ Initiator => "initiator",
+
+ /// This content was created by the responder of this session.
+ Responder => "responder",
+ }
+);
+
+generate_attribute!(
+ /// Which parties in the session will be generating content.
+ Senders, "senders", {
+ /// Both parties can send for this content.
+ Both => "both",
+
+ /// Only the initiator can send for this content.
+ Initiator => "initiator",
+
+ /// No one can send for this content.
+ None => "none",
+
+ /// Only the responder can send for this content.
+ Responder => "responder",
+ }, Default = Both
+);
+
+generate_attribute!(
+ /// How the content definition is to be interpreted by the recipient. The
+ /// meaning of this attribute matches the "Content-Disposition" header as
+ /// defined in RFC 2183 and applied to SIP by RFC 3261.
+ ///
+ /// Possible values are defined here:
+ /// https://www.iana.org/assignments/cont-disp/cont-disp.xhtml
+ Disposition, "disposition", {
+ /// Displayed automatically.
+ Inline => "inline",
+
+ /// User controlled display.
+ Attachment => "attachment",
+
+ /// Process as form response.
+ FormData => "form-data",
+
+ /// Tunneled content to be processed silently.
+ Signal => "signal",
+
+ /// The body is a custom ring tone to alert the user.
+ Alert => "alert",
+
+ /// The body is displayed as an icon to the user.
+ Icon => "icon",
+
+ /// The body should be displayed to the user.
+ Render => "render",
+
+ /// The body contains a list of URIs that indicates the recipients of
+ /// the request.
+ RecipientListHistory => "recipient-list-history",
+
+ /// The body describes a communications session, for example, an
+ /// RFC2327 SDP body.
+ Session => "session",
+
+ /// Authenticated Identity Body.
+ Aib => "aib",
+
+ /// The body describes an early communications session, for example,
+ /// and [RFC2327] SDP body.
+ EarlySession => "early-session",
+
+ /// The body includes a list of URIs to which URI-list services are to
+ /// be applied.
+ RecipientList => "recipient-list",
+
+ /// The payload of the message carrying this Content-Disposition header
+ /// field value is an Instant Message Disposition Notification as
+ /// requested in the corresponding Instant Message.
+ Notification => "notification",
+
+ /// The body needs to be handled according to a reference to the body
+ /// that is located in the same SIP message as the body.
+ ByReference => "by-reference",
+
+ /// The body contains information associated with an Info Package.
+ InfoPackage => "info-package",
+
+ /// The body describes either metadata about the RS or the reason for
+ /// the metadata snapshot request as determined by the MIME value
+ /// indicated in the Content-Type.
+ RecordingSession => "recording-session",
+ }, Default = Session
+);
+
+generate_id!(
+ /// An unique identifier in a session, referencing a
+ /// [struct.Content.html](Content element).
+ ContentId
+);
generate_element!(
Content, "content", JINGLE,
attributes: [
+ /// Who created this content.
creator: Creator = "creator" => required,
+
+ /// How the content definition is to be interpreted by the recipient.
disposition: Disposition = "disposition" => default,
+
+ /// A per-session unique identifier for this content.
name: ContentId = "name" => required,
+
+ /// Who can send data for this content.
senders: Senders = "senders" => default
],
children: [
@@ -124,22 +230,64 @@ impl Content {
#[derive(Debug, Clone, PartialEq)]
pub enum Reason {
+ /// The party prefers to use an existing session with the peer rather than
+ /// initiate a new session; the Jingle session ID of the alternative
+ /// session SHOULD be provided as the XML character data of the
+ /// child.
AlternativeSession, //(String),
+
+ /// The party is busy and cannot accept a session.
Busy,
+
+ /// The initiator wishes to formally cancel the session initiation request.
Cancel,
+
+ /// The action is related to connectivity problems.
ConnectivityError,
+
+ /// The party wishes to formally decline the session.
Decline,
+
+ /// The session length has exceeded a pre-defined time limit (e.g., a
+ /// meeting hosted at a conference service).
Expired,
+
+ /// The party has been unable to initialize processing related to the
+ /// application type.
FailedApplication,
+
+ /// The party has been unable to establish connectivity for the transport
+ /// method.
FailedTransport,
+
+ /// The action is related to a non-specific application error.
GeneralError,
+
+ /// The entity is going offline or is no longer available.
Gone,
+
+ /// The party supports the offered application type but does not support
+ /// the offered or negotiated parameters.
IncompatibleParameters,
+
+ /// The action is related to media processing problems.
MediaError,
+
+ /// The action is related to a violation of local security policies.
SecurityError,
+
+ /// The action is generated during the normal course of state management
+ /// and does not reflect any error.
Success,
+
+ /// A request has not been answered so the sender is timing out the
+ /// request.
Timeout,
+
+ /// The party supports none of the offered application types.
UnsupportedApplications,
+
+ /// The party supports none of the offered transport methods.
UnsupportedTransports,
}
@@ -244,7 +392,10 @@ impl From for Element {
}
}
-generate_id!(SessionId);
+generate_id!(
+ /// Unique identifier for a session between two JIDs.
+ SessionId
+);
#[derive(Debug, Clone)]
pub struct Jingle {