mirror of https://github.com/sipwise/jitsi.git
parent
e07f0d07d9
commit
5418689151
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license.
|
||||
* See terms of license at gnu.org.
|
||||
*/
|
||||
package net.java.sip.communicator.impl.protocol.jabber.extensions.rayo;
|
||||
|
||||
import net.java.sip.communicator.impl.protocol.jabber.extensions.*;
|
||||
import org.jivesoftware.smack.packet.*;
|
||||
|
||||
/**
|
||||
* 'End' Rayo packet extension used to notify the client about call ended event.
|
||||
*
|
||||
* @author Pawel Domas
|
||||
*/
|
||||
public class EndExtension
|
||||
extends AbstractPacketExtension
|
||||
{
|
||||
/**
|
||||
* XML element name of this extension.
|
||||
*/
|
||||
public static final String ELEMENT_NAME = "end";
|
||||
|
||||
/**
|
||||
* End reason.
|
||||
*/
|
||||
private ReasonExtension reason;
|
||||
|
||||
/**
|
||||
* Creates new instance.
|
||||
*/
|
||||
protected EndExtension()
|
||||
{
|
||||
super(RayoIqProvider.NAMESPACE, ELEMENT_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if given <tt>elementName</tt> is valid end reason element.
|
||||
* @param elementName the XML element name to check.
|
||||
* @return <tt>true</tt> if given <tt>elementName</tt> is valid end reason
|
||||
* element.
|
||||
*/
|
||||
public static boolean isValidReason(String elementName)
|
||||
{
|
||||
return ReasonExtension.BUSY.equals(elementName)
|
||||
|| ReasonExtension.ERROR.equals(elementName)
|
||||
|| ReasonExtension.HANGUP.equals(elementName)
|
||||
|| ReasonExtension.HANGUP_COMMND.equals(elementName)
|
||||
|| ReasonExtension.REJECTED.equals(elementName)
|
||||
|| ReasonExtension.TIMEOUT.equals(elementName);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns {@link ReasonExtension} associated with this instance.
|
||||
* @return {@link ReasonExtension} associated with this instance.
|
||||
*/
|
||||
public ReasonExtension getReason()
|
||||
{
|
||||
return reason;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets new {@link ReasonExtension} for this <tt>EndExtension</tt> instance.
|
||||
* @param newReason the new {@link ReasonExtension} to set.
|
||||
*/
|
||||
public void setReason(ReasonExtension newReason)
|
||||
{
|
||||
if (this.reason != null)
|
||||
{
|
||||
getChildExtensions().remove(this.reason);
|
||||
}
|
||||
|
||||
this.reason = newReason;
|
||||
|
||||
addChildExtension(newReason);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates 'Presence' packet containing call ended Rayo notification that
|
||||
* contains specified end <tt>reason</tt>.
|
||||
* @param from source JID of this event.
|
||||
* @param to destination JID.
|
||||
* @param reason call end reason string. One of {@link ReasonExtension}
|
||||
* static constants.
|
||||
* @return 'Presence' packet containing call ended Rayo notification.
|
||||
*/
|
||||
public static Presence createEnd(String from, String to, String reason)
|
||||
{
|
||||
Presence presence = new Presence(Presence.Type.unavailable);
|
||||
|
||||
presence.setFrom(from);
|
||||
|
||||
presence.setTo(to);
|
||||
|
||||
EndExtension end = new EndExtension();
|
||||
end.setReason(new ReasonExtension(reason));
|
||||
|
||||
presence.addExtension(end);
|
||||
|
||||
return presence;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license.
|
||||
* See terms of license at gnu.org.
|
||||
*/
|
||||
package net.java.sip.communicator.impl.protocol.jabber.extensions.rayo;
|
||||
|
||||
import net.java.sip.communicator.impl.protocol.jabber.extensions.*;
|
||||
|
||||
/**
|
||||
* Header packet extension optionally included in {@link RayoIqProvider.RayoIq}.
|
||||
* Holds 'name' and 'value' attributes.
|
||||
*
|
||||
* @author Pawel Domas
|
||||
*/
|
||||
public class HeaderExtension
|
||||
extends AbstractPacketExtension
|
||||
{
|
||||
/**
|
||||
* XML element name.
|
||||
*/
|
||||
public static final String ELEMENT_NAME = "header";
|
||||
|
||||
/**
|
||||
* The name of 'name' attribute.
|
||||
*/
|
||||
public static final String NAME_ATTR_NAME = "name";
|
||||
|
||||
/**
|
||||
* The name of 'value' attribute.
|
||||
*/
|
||||
public static final String VALUE_ATTR_NAME = "value";
|
||||
|
||||
/**
|
||||
* Creates new instance of <tt>HeaderPacketExtension</tt>.
|
||||
*/
|
||||
public HeaderExtension()
|
||||
{
|
||||
super(null, ELEMENT_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the value of 'name' attribute.
|
||||
* @return the value of 'name' attribute.
|
||||
*/
|
||||
public String getName()
|
||||
{
|
||||
return getAttributeAsString(NAME_ATTR_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets new value for 'name' attribute of this extension.
|
||||
* @param name the new value to set for 'name' attribute.
|
||||
*/
|
||||
public void setName(String name)
|
||||
{
|
||||
setAttribute(NAME_ATTR_NAME, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of 'value' attribute.
|
||||
* @return the value of 'value' attribute.
|
||||
*/
|
||||
public String getValue()
|
||||
{
|
||||
return getAttributeAsString(VALUE_ATTR_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets new value for the 'value' attribute.
|
||||
* @param value new value for the 'value' attribute to set.
|
||||
*/
|
||||
public void setValue(String value)
|
||||
{
|
||||
setAttribute(VALUE_ATTR_NAME, value);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,587 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license.
|
||||
* See terms of license at gnu.org.
|
||||
*/
|
||||
package net.java.sip.communicator.impl.protocol.jabber.extensions.rayo;
|
||||
|
||||
import net.java.sip.communicator.impl.protocol.jabber.extensions.*;
|
||||
import org.jitsi.util.*;
|
||||
import org.jivesoftware.smack.packet.*;
|
||||
import org.jivesoftware.smack.provider.*;
|
||||
import org.xmlpull.v1.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Provider handles parsing of Rayo IQ stanzas and converting objects back to
|
||||
* their XML representation.
|
||||
*
|
||||
* FIXME: implements only the minimum required to start and hang up a call
|
||||
*
|
||||
* @author Pawel Domas
|
||||
*/
|
||||
public class RayoIqProvider
|
||||
implements IQProvider
|
||||
{
|
||||
/**
|
||||
* Rayo namespace.
|
||||
*/
|
||||
public final static String NAMESPACE = "urn:xmpp:rayo:1";
|
||||
|
||||
/**
|
||||
* Registers this IQ provider into given <tt>ProviderManager</tt>.
|
||||
* @param providerManager the <tt>ProviderManager</tt> to which this
|
||||
* instance wil be bound to.
|
||||
*/
|
||||
public void registerRayoIQs(ProviderManager providerManager)
|
||||
{
|
||||
// <dial>
|
||||
providerManager.addIQProvider(
|
||||
DialIq.ELEMENT_NAME,
|
||||
NAMESPACE,
|
||||
this);
|
||||
|
||||
// <ref>
|
||||
providerManager.addIQProvider(
|
||||
RefIq.ELEMENT_NAME,
|
||||
NAMESPACE,
|
||||
this);
|
||||
|
||||
// <hangup>
|
||||
providerManager.addIQProvider(
|
||||
HangUp.ELEMENT_NAME,
|
||||
NAMESPACE,
|
||||
this);
|
||||
|
||||
// <end> presence extension
|
||||
providerManager.addExtensionProvider(
|
||||
EndExtension.ELEMENT_NAME,
|
||||
NAMESPACE,
|
||||
new DefaultPacketExtensionProvider<EndExtension>(
|
||||
EndExtension.class));
|
||||
|
||||
// <header> extension
|
||||
providerManager.addExtensionProvider(
|
||||
HeaderExtension.ELEMENT_NAME,
|
||||
"",
|
||||
new DefaultPacketExtensionProvider<HeaderExtension>(
|
||||
HeaderExtension.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public IQ parseIQ(XmlPullParser parser)
|
||||
throws Exception
|
||||
{
|
||||
String namespace = parser.getNamespace();
|
||||
|
||||
// Check the namespace
|
||||
if (!NAMESPACE.equals(namespace))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
String rootElement = parser.getName();
|
||||
|
||||
RayoIq iq;
|
||||
DialIq dial;
|
||||
RefIq ref;
|
||||
//End end = null;
|
||||
|
||||
if (DialIq.ELEMENT_NAME.equals(rootElement))
|
||||
{
|
||||
iq = dial = new DialIq();
|
||||
String src = parser.getAttributeValue("", DialIq.SRC_ATTR_NAME);
|
||||
String dst = parser.getAttributeValue("", DialIq.DST_ATTR_NAME);
|
||||
|
||||
// Destination is mandatory
|
||||
if (StringUtils.isNullOrEmpty(dst))
|
||||
return null;
|
||||
|
||||
dial.setSource(src);
|
||||
dial.setDestination(dst);
|
||||
}
|
||||
else if (RefIq.ELEMENT_NAME.equals(rootElement))
|
||||
{
|
||||
iq = ref = new RefIq();
|
||||
String uri = parser.getAttributeValue("", RefIq.URI_ATTR_NAME);
|
||||
|
||||
if (StringUtils.isNullOrEmpty(uri))
|
||||
return null;
|
||||
|
||||
ref.setUri(uri);
|
||||
}
|
||||
else if (HangUp.ELEMENT_NAME.equals(rootElement))
|
||||
{
|
||||
iq = new HangUp();
|
||||
}
|
||||
/*else if (End.ELEMENT_NAME.equals(rootElement))
|
||||
{
|
||||
iq = end = new End();
|
||||
}*/
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
boolean done = false;
|
||||
HeaderExtension header = null;
|
||||
//ReasonExtension reason = null;
|
||||
|
||||
while (!done)
|
||||
{
|
||||
switch (parser.next())
|
||||
{
|
||||
case XmlPullParser.END_TAG:
|
||||
{
|
||||
String name = parser.getName();
|
||||
|
||||
if (rootElement.equals(name))
|
||||
{
|
||||
done = true;
|
||||
}
|
||||
else if (HeaderExtension.ELEMENT_NAME.equals(
|
||||
name))
|
||||
{
|
||||
if (header != null)
|
||||
{
|
||||
iq.addExtension(header);
|
||||
|
||||
header = null;
|
||||
}
|
||||
}
|
||||
/*else if (End.isValidReason(name))
|
||||
{
|
||||
if (end != null && reason != null)
|
||||
{
|
||||
end.setReason(reason);
|
||||
|
||||
reason = null;
|
||||
}
|
||||
}*/
|
||||
break;
|
||||
}
|
||||
|
||||
case XmlPullParser.START_TAG:
|
||||
{
|
||||
String name = parser.getName();
|
||||
|
||||
if (HeaderExtension.ELEMENT_NAME.equals(name))
|
||||
{
|
||||
header = new HeaderExtension();
|
||||
|
||||
String nameAttr
|
||||
= parser.getAttributeValue(
|
||||
"", HeaderExtension.NAME_ATTR_NAME);
|
||||
|
||||
header.setName(nameAttr);
|
||||
|
||||
String valueAttr
|
||||
= parser.getAttributeValue(
|
||||
"", HeaderExtension.VALUE_ATTR_NAME);
|
||||
|
||||
header.setValue(valueAttr);
|
||||
}
|
||||
/*else if (End.isValidReason(name))
|
||||
{
|
||||
reason = new ReasonPacketExtension(name);
|
||||
|
||||
String platformCode
|
||||
= parser.getAttributeValue(
|
||||
"", ReasonPacketExtension.PLATFORM_CODE_ATTRIBUTE);
|
||||
|
||||
if (!StringUtils.isNullOrEmpty(platformCode))
|
||||
{
|
||||
reason.setPlatformCode(platformCode);
|
||||
}
|
||||
}*/
|
||||
break;
|
||||
}
|
||||
|
||||
case XmlPullParser.TEXT:
|
||||
{
|
||||
// Parse some text here
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return iq;
|
||||
}
|
||||
|
||||
/**
|
||||
* Base class for all Ray IQs. Takes care of <header /> extension handling
|
||||
* as well as other functions shared by all IQs.
|
||||
*/
|
||||
public static abstract class RayoIq
|
||||
extends IQ
|
||||
{
|
||||
/**
|
||||
* The XML element name that will be used.
|
||||
*/
|
||||
private final String elementName;
|
||||
|
||||
/**
|
||||
* Creates new instance of <tt>RayoIq</tt>.
|
||||
*
|
||||
* @param elementName the name of XML element that will be used.
|
||||
*/
|
||||
protected RayoIq(String elementName)
|
||||
{
|
||||
this.elementName = elementName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementing classes should print their attributes if any in XML
|
||||
* format to given <tt>out</tt> <tt>StringBuilder</tt>.
|
||||
* @param out the <tt>StringBuilder</tt> instance used to construct XML
|
||||
* representation of this element.
|
||||
*/
|
||||
protected abstract void printAttributes(StringBuilder out);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String getChildElementXML()
|
||||
{
|
||||
StringBuilder xml = new StringBuilder();
|
||||
|
||||
xml.append('<').append(elementName);
|
||||
xml.append(" xmlns='").append(NAMESPACE).append("' ");
|
||||
|
||||
printAttributes(xml);
|
||||
|
||||
Collection<PacketExtension> extensions = getExtensions();
|
||||
if (extensions.size() > 0)
|
||||
{
|
||||
xml.append(">");
|
||||
for (PacketExtension extension : extensions)
|
||||
{
|
||||
xml.append(extension.toXML());
|
||||
}
|
||||
xml.append("</").append(elementName).append(">");
|
||||
}
|
||||
else
|
||||
{
|
||||
xml.append("/>");
|
||||
}
|
||||
|
||||
return xml.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns value of the header extension with given <tt>name</tt>
|
||||
* (if any).
|
||||
* @param name the name of header extension which value we want to
|
||||
* retrieve.
|
||||
* @return value of header extension with given <tt>name</tt> if it
|
||||
* exists or <tt>null</tt> otherwise.
|
||||
*/
|
||||
public String getHeader(String name)
|
||||
{
|
||||
HeaderExtension header = findHeader(name);
|
||||
|
||||
return header != null ? header.getValue() : null;
|
||||
}
|
||||
|
||||
private HeaderExtension findHeader(String name)
|
||||
{
|
||||
for(PacketExtension ext: getExtensions())
|
||||
{
|
||||
if (ext instanceof HeaderExtension)
|
||||
{
|
||||
HeaderExtension header = (HeaderExtension) ext;
|
||||
|
||||
if(name.equals(header.getName()))
|
||||
return header;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds 'header' extension to this Rayo IQ with given name and value
|
||||
* attributes.
|
||||
* @param name the attribute name of the 'header' extension to be added.
|
||||
* @param value the 'value' attribute of the 'header' extension that
|
||||
* will be added to this IQ.
|
||||
*/
|
||||
public void setHeader(String name, String value)
|
||||
{
|
||||
HeaderExtension headerExt = findHeader(name);
|
||||
|
||||
if (headerExt == null)
|
||||
{
|
||||
headerExt = new HeaderExtension();
|
||||
|
||||
headerExt.setName(name);
|
||||
|
||||
addExtension(headerExt);
|
||||
}
|
||||
|
||||
headerExt.setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The 'dial' IQ used to initiate new outgoing call session in Rayo
|
||||
* protocol.
|
||||
*/
|
||||
public static class DialIq
|
||||
extends RayoIq
|
||||
{
|
||||
/**
|
||||
* The name of XML element for this IQ.
|
||||
*/
|
||||
public static final String ELEMENT_NAME = "dial";
|
||||
|
||||
/**
|
||||
* The name of source URI/address attribute. Referred as "source" to
|
||||
* avoid confusion with "getFrom" and "setFrom" in {@link IQ} class.
|
||||
*/
|
||||
public static final String SRC_ATTR_NAME = "from";
|
||||
|
||||
/**
|
||||
* The name of destination URI/address attribute. Referred as "source"
|
||||
* to avoid confusion with "getFrom" and "setFrom" in {@link IQ} class.
|
||||
*/
|
||||
public static final String DST_ATTR_NAME = "to";
|
||||
|
||||
/**
|
||||
* Source URI/address.
|
||||
*/
|
||||
private String source;
|
||||
|
||||
/**
|
||||
* Destination URI/address.
|
||||
*/
|
||||
private String destination;
|
||||
|
||||
/**
|
||||
* Creates new instance of <tt>DialIq</tt>.
|
||||
*/
|
||||
public DialIq()
|
||||
{
|
||||
super(DialIq.ELEMENT_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new <tt>DialIq</tt> for given source and destination
|
||||
* addresses.
|
||||
* @param to the destination address/call URI to be used.
|
||||
* @param from the source address that will be set on
|
||||
* new <tt>DialIq</tt> instance.
|
||||
* @return new <tt>DialIq</tt> parametrized with given source and
|
||||
* destination addresses.
|
||||
*/
|
||||
public static DialIq create(String to, String from)
|
||||
{
|
||||
DialIq dialIq = new DialIq();
|
||||
|
||||
dialIq.setSource(from);
|
||||
|
||||
dialIq.setDestination(to);
|
||||
|
||||
return dialIq;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return source address value set on this <tt>DialIq</tt>.
|
||||
* @return source address value of this <tt>DialIq</tt>.
|
||||
*/
|
||||
public String getSource()
|
||||
{
|
||||
return source;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets new source address value on this <tt>DialIq</tt>.
|
||||
* @param source the new source address value to be set.
|
||||
*/
|
||||
public void setSource(String source)
|
||||
{
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns destination address/call URI associated with this instance.
|
||||
* @return destination address/call URI associated with this instance.
|
||||
*/
|
||||
public String getDestination()
|
||||
{
|
||||
return destination;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets new destination address/call URI on this <tt>DialIq</tt>.
|
||||
* @param destination the new destination address/call URI to set.
|
||||
*/
|
||||
public void setDestination(String destination)
|
||||
{
|
||||
this.destination = destination;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void printAttributes(StringBuilder out)
|
||||
{
|
||||
String src = getSource();
|
||||
if (!StringUtils.isNullOrEmpty(src))
|
||||
out.append(SRC_ATTR_NAME).append("='")
|
||||
.append(src).append("' ");
|
||||
|
||||
String dst = getDestination();
|
||||
if (!StringUtils.isNullOrEmpty(dst))
|
||||
out.append(DST_ATTR_NAME).append("='")
|
||||
.append(dst).append("' ");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rayo 'ref' IQ sent by the server as a reply to 'dial' request. Holds
|
||||
* created call's resource in 'uri' attribute.
|
||||
*/
|
||||
public static class RefIq
|
||||
extends RayoIq
|
||||
{
|
||||
/**
|
||||
* XML element name of <tt>RefIq</tt>.
|
||||
*/
|
||||
public static final String ELEMENT_NAME = "ref";
|
||||
|
||||
/**
|
||||
* Name of the URI attribute that stores call resource reference.
|
||||
*/
|
||||
public static final String URI_ATTR_NAME = "uri";
|
||||
|
||||
/**
|
||||
* Call resource/uri reference.
|
||||
*/
|
||||
private String uri;
|
||||
|
||||
/**
|
||||
* Creates new <tt>RefIq</tt>.
|
||||
*/
|
||||
protected RefIq()
|
||||
{
|
||||
super(RefIq.ELEMENT_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new <tt>RefIq</tt> parametrized with given call <tt>uri</tt>.
|
||||
* @param uri the call URI to be set on newly created <tt>RefIq</tt>.
|
||||
* @return new <tt>RefIq</tt> parametrized with given call <tt>uri</tt>.
|
||||
*/
|
||||
public static RefIq create(String uri)
|
||||
{
|
||||
RefIq refIq = new RefIq();
|
||||
|
||||
refIq.setUri(uri);
|
||||
|
||||
return refIq;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates result <tt>RefIq</tt> for given <tt>requestIq</tt>
|
||||
* parametrized with given call <tt>uri</tt>.
|
||||
* @param requestIq the request IQ which 'from', 'to' and 'id'
|
||||
* attributes will be used for constructing result IQ.
|
||||
* @param uri the call URI that will be included in newly created
|
||||
* <tt>RefIq</tt>.
|
||||
* @return result <tt>RefIq</tt> for given <tt>requestIq</tt>
|
||||
* parametrized with given call <tt>uri</tt>.
|
||||
*/
|
||||
public static RefIq createResult(IQ requestIq, String uri)
|
||||
{
|
||||
RefIq refIq = create(uri);
|
||||
|
||||
refIq.setType(IQ.Type.RESULT);
|
||||
refIq.setPacketID(requestIq.getPacketID());
|
||||
refIq.setFrom(requestIq.getTo());
|
||||
refIq.setTo(requestIq.getFrom());
|
||||
|
||||
return refIq;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void printAttributes(StringBuilder out)
|
||||
{
|
||||
String uri = getUri();
|
||||
if (!StringUtils.isNullOrEmpty(uri))
|
||||
out.append(URI_ATTR_NAME).append("='")
|
||||
.append(uri).append("' ");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets given call <tt>uri</tt> value on this instance.
|
||||
* @param uri the call <tt>uri</tt> to be stored in this instance.
|
||||
*/
|
||||
public void setUri(String uri)
|
||||
{
|
||||
this.uri = uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns call URI held by this instance.
|
||||
* @return the call URI held by this instance.
|
||||
*/
|
||||
public String getUri()
|
||||
{
|
||||
return uri;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rayo hangup IQ is sent by the controlling agent to tell the server that
|
||||
* call whose resource is mentioned in IQ's 'to' attribute should be
|
||||
* terminated. Server immediately replies with result IQ which means that
|
||||
* hangup operation is now scheduled. After it is actually executed presence
|
||||
* indication with {@link EndExtension} is sent through the presence to
|
||||
* confirm the operation.
|
||||
*/
|
||||
public static class HangUp
|
||||
extends RayoIq
|
||||
{
|
||||
/**
|
||||
* The name of 'hangup' element.
|
||||
*/
|
||||
public static final String ELEMENT_NAME = "hangup";
|
||||
|
||||
/**
|
||||
* Creates new instance of <tt>HangUp</tt> IQ.
|
||||
*/
|
||||
protected HangUp()
|
||||
{
|
||||
super(ELEMENT_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new, parametrized instance of {@link HangUp} IQ.
|
||||
* @param from source JID.
|
||||
* @param to the destination address/call URI to be ended by this IQ.
|
||||
* @return new, parametrized instance of {@link HangUp} IQ.
|
||||
*/
|
||||
public static HangUp create(String from, String to)
|
||||
{
|
||||
HangUp hangUp = new HangUp();
|
||||
hangUp.setFrom(from);
|
||||
hangUp.setTo(to);
|
||||
hangUp.setType(Type.SET);
|
||||
|
||||
return hangUp;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void printAttributes(StringBuilder out){ }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license.
|
||||
* See terms of license at gnu.org.
|
||||
*/
|
||||
package net.java.sip.communicator.impl.protocol.jabber.extensions.rayo;
|
||||
|
||||
import net.java.sip.communicator.impl.protocol.jabber.extensions.*;
|
||||
|
||||
/**
|
||||
* Rayo 'reason' packet extension.
|
||||
*
|
||||
* @author Pawel Domas
|
||||
*/
|
||||
public class ReasonExtension
|
||||
extends AbstractPacketExtension
|
||||
{
|
||||
/**
|
||||
* The name of optional platform code attribute.
|
||||
*/
|
||||
public static final String PLATFORM_CODE_ATTRIBUTE = "platform-code";
|
||||
|
||||
/**
|
||||
* Indication that the call ended due to a normal hangup by the remote
|
||||
* party.
|
||||
*/
|
||||
public static final String HANGUP = "hangup";
|
||||
|
||||
/**
|
||||
* Indication that the call ended due to a normal hangup triggered by
|
||||
* a hangup command.
|
||||
*/
|
||||
public static final String HANGUP_COMMND = "hangup-command";
|
||||
|
||||
/**
|
||||
* Indication that the call ended due to a timeout in contacting the remote
|
||||
* party.
|
||||
*/
|
||||
public static final String TIMEOUT = "timeout";
|
||||
|
||||
/**
|
||||
* Indication that the call ended due to being rejected by the remote party
|
||||
* subsequent to being accepted.
|
||||
*/
|
||||
public static final String BUSY = "busy";
|
||||
|
||||
/**
|
||||
* Indication that the call ended due to being rejected by the remote party
|
||||
* before being accepted.
|
||||
*/
|
||||
public static final String REJECTED = "rejected";
|
||||
|
||||
/**
|
||||
* Indication that the call ended due to a system error.
|
||||
*/
|
||||
public static final String ERROR = "error";
|
||||
|
||||
/**
|
||||
* Creates an {@link ReasonExtension} instance for the specified
|
||||
* <tt>namespace</tt> and <tt>elementName</tt>.
|
||||
*
|
||||
* @param elementName the name of the element
|
||||
*/
|
||||
public ReasonExtension(String elementName)
|
||||
{
|
||||
super(null, elementName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of platform code attribute.
|
||||
* @return the value of platform code attribute.
|
||||
*/
|
||||
public String getPlatformCode()
|
||||
{
|
||||
return getAttributeAsString(PLATFORM_CODE_ATTRIBUTE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets new value of platform code attribute. Pass <tt>null</tt> to remove.
|
||||
* @param code new value of platform code attribute. Pass <tt>null</tt> to
|
||||
* remove.
|
||||
*/
|
||||
public void setPlatformCode(String code)
|
||||
{
|
||||
setAttribute(PLATFORM_CODE_ATTRIBUTE, code);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue