/* * 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.jingleinfo; import org.jivesoftware.smack.packet.*; import org.jivesoftware.smack.provider.*; import org.xmlpull.v1.*; /** * Parser for RelayPacketExtension. * * @author Sebastien Vincent */ public class RelayProvider implements PacketExtensionProvider { /** * Parses a users extension sub-packet and creates a {@link * StunPacketExtension} instance. At the beginning of the method * call, the xml parser will be positioned on the opening element of the * packet extension. As required by the smack API, at the end of the method * call, the parser will be positioned on the closing element of the packet * extension. * * @param parser an XML parser positioned at the opening * <tt>Server</tt> element. * * @return a new {@link RelayPacketExtension} instance. * @throws java.lang.Exception if an error occurs parsing the XML. */ public PacketExtension parseExtension(XmlPullParser parser) throws Exception { boolean done = false; int eventType; String elementName = null; RelayPacketExtension ext = new RelayPacketExtension(); while (!done) { eventType = parser.next(); elementName = parser.getName(); if (eventType == XmlPullParser.START_TAG) { if(elementName.equals(ServerPacketExtension.ELEMENT_NAME)) { PacketExtensionProvider provider = (PacketExtensionProvider) ProviderManager.getInstance().getExtensionProvider( ServerPacketExtension.ELEMENT_NAME, ServerPacketExtension.NAMESPACE); PacketExtension childExtension = provider.parseExtension(parser); ext.addChildExtension(childExtension); } else if(elementName.equals("token")) { ext.setToken(parseText(parser)); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals( RelayPacketExtension.ELEMENT_NAME)) { done = true; } } } return ext; } /** * Returns the content of the next {@link XmlPullParser#TEXT} element that * we encounter in <tt>parser</tt>. * * @param parser the parse that we'll be probing for text. * * @return the content of the next {@link XmlPullParser#TEXT} element we * come across or <tt>null</tt> if we encounter a closing tag first. * * @throws java.lang.Exception if an error occurs parsing the XML. */ public static String parseText(XmlPullParser parser) throws Exception { boolean done = false; int eventType; String text = null; while (!done) { eventType = parser.next(); if (eventType == XmlPullParser.TEXT) { text = parser.getText(); } else if (eventType == XmlPullParser.END_TAG) { done = true; } } return text; } }