/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.protocol.jabber.extensions.jirecon; import org.jitsi.util.*; import org.jivesoftware.smack.packet.*; import java.util.*; /** * The IQ used to communicate with Jirecon recording container. * * @author lishunyang * @author Pawel Domas */ public class JireconIq extends IQ { /** * Name space of recording packet extension. */ public static final String NAMESPACE = JireconIqProvider.NAMESPACE; /** * XML element name of recording packet extension. */ public static final String ELEMENT_NAME = "recording"; /** * Attribute name of "action". */ public static final String ACTION_ATTR_NAME = "action"; /** * Attribute name of "status". */ public static final String STATUS_ATTR_NAME = "status"; /** * Attribute name of "mucjid". */ public static final String MUCJID_ATTR_NAME = "mucjid"; /** * Attribute name of "dst". */ public static final String OUTPUT_ATTR_NAME = "dst"; /** * Attribute name of "rid". */ public static final String RID_ATTR_NAME = "rid"; /** * Jirecon container action. */ private Action action = Action.UNDEFINED; /** * Muc JID of the participant that communicates with Jirecon. */ private String mucJid; /** * Recording output path. */ private String output; /** * Recording identifier. */ private String rid; /** * Recording status returned by Jirecon. */ private Status status = Status.UNDEFINED; @Override public String getChildElementXML() { StringBuilder xml = new StringBuilder(); xml.append('<').append(ELEMENT_NAME); xml.append(" xmlns='").append(NAMESPACE).append("' "); printStringAttribute(xml, RID_ATTR_NAME, rid); if (action != Action.UNDEFINED) { printStringAttribute(xml, ACTION_ATTR_NAME, action.toString()); } if (status != Status.UNDEFINED) { printStringAttribute(xml, STATUS_ATTR_NAME, status.toString()); } printStringAttribute(xml, MUCJID_ATTR_NAME, mucJid); printStringAttribute(xml, OUTPUT_ATTR_NAME, output); Collection<PacketExtension> extensions = getExtensions(); if (extensions.size() > 0) { xml.append(">"); for (PacketExtension extension : extensions) { xml.append(extension.toXML()); } xml.append("</").append(ELEMENT_NAME).append(">"); } else { xml.append("/>"); } return xml.toString(); } private void printStringAttribute( StringBuilder xml, String attrName, String attr) { if (!StringUtils.isNullOrEmpty(attr)) xml.append(attrName).append("='") .append(attr).append("' "); } /** * Sets the value of 'action' attribute. * * @param action the value to be set as 'action' attribute of this IQ. */ public void setAction(Action action) { this.action = action; } /** * Returns the value of 'action' attribute. One of {@link JireconIq.Action}. */ public Action getAction() { return action; } /** * Sets the value of 'status' attribute. One of {@link JireconIq.Status}. * * @param status one of {@link JireconIq.Status} to be set as 'status' * attribute value of this IQ. */ public void setStatus(Status status) { this.status = status; } /** * Returns the value of 'status' attribute. */ public Status getStatus() { return status; } /** * Sets the value of 'mucjid' attribute of this IQ. * @param mucJid the value to be set as 'mucjid' attribute in form of: * roomname@muc.server.net/nickname */ public void setMucJid(String mucJid) { this.mucJid = mucJid; } /** * Returns the value of 'mucjid' attribute of this IQ. */ public String getMucJid() { return mucJid; } /** * Sets the value of 'output' attribute of this IQ. * * @param output the output path to be set in 'output' attribute. */ public void setOutput(String output) { this.output = output; } /** * Returns the output path value contained in 'output' attribute. */ public String getOutput() { return output; } /** * Sets the recording id value of this IQ. * * @param rid the recording identifier that will be stored in 'rid' * attribute of this IQ. */ public void setRid(String rid) { this.rid = rid; } /** * Returns the value of 'rid' attribute that is the recording id. */ public String getRid() { return rid; } /** * Enumerative value of attribute "action" in recording extension. * * @author lishunyang * @author Pawel Domas * */ public enum Action { /** * It can only be set in packet sent from client to component, in order * to let Jirecon component start a new recording session. */ START("start"), /** * It can only be set in packet sent from client to component, in order * to let Jirecon component stop an specified recording session. */ STOP("stop"), /** * It can be set both in packet sent from client to component or packet * sent from component to client, in order to notify the opposite with * some information, such as recording session status. */ INFO("info"), /** * Means that the action has not been specified. */ UNDEFINED("undefined"); private String name; private Action(String name) { this.name = name; } @Override public String toString() { return name; } /** * Parses <tt>Action</tt> from given string. * * @param action the string representation of <tt>Action</tt>. * * @return <tt>Action</tt> value for given string or * {@link JireconIq.Action#UNDEFINED} if given string does not * reflect any of valid values. */ public static Action parse(String action) { if (StringUtils.isNullOrEmpty(action)) return UNDEFINED; try { return Action.valueOf(action.toUpperCase()); } catch(IllegalArgumentException e) { return UNDEFINED; } } } /** * Enumerative value of attribute "status" in recording extension. * * @author lishunyang * @author Pawel Domas * */ public enum Status { /** * It can only be set in packet sent from component to client, notify * the opposite that "start" command has been received and recording * session is starting. */ INITIATING("initiating"), /** * It can only be set in packet sent from component to client, notify * the opposite that recording session has been started successfully. */ STARTED("started"), /** * It can only be set in packet sent from component to client, notify * the opposite that "stop" command has been received and recording * session is stopping. */ STOPPING("stopping"), /** * It can only be set in packet sent from component to client, notify * the opposite that recording session has been stopped successfully. */ STOPPED("stopped"), /** * It can only be set in packet sent from component to client, notify * the opposite that recording session has been aborted. */ ABORTED("aborted"), /** * Means that the status has not been specified. */ UNDEFINED("undefined"); private String name; private Status(String name) { this.name = name; } @Override public String toString() { return name; } /** * Parses <tt>Status</tt> from given string. * * @param status the string representation of <tt>Status</tt>. * * @return <tt>Status</tt> value for given string or * {@link JireconIq.Status#UNDEFINED} if given string does not * reflect any of valid values. */ public static Status parse(String status) { if (StringUtils.isNullOrEmpty(status)) return UNDEFINED; try { return Status.valueOf(status.toUpperCase()); } catch(IllegalArgumentException e) { return UNDEFINED; } } } }