StreamInitiationProvider.java

  1. /**
  2.  *
  3.  * Copyright 2003-2006 Jive Software.
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smackx.si.provider;

  18. import java.io.IOException;
  19. import java.text.ParseException;
  20. import java.util.Date;
  21. import java.util.logging.Level;
  22. import java.util.logging.Logger;

  23. import org.jivesoftware.smack.packet.IqData;
  24. import org.jivesoftware.smack.packet.XmlEnvironment;
  25. import org.jivesoftware.smack.parsing.SmackParsingException;
  26. import org.jivesoftware.smack.provider.IqProvider;
  27. import org.jivesoftware.smack.xml.XmlPullParser;
  28. import org.jivesoftware.smack.xml.XmlPullParserException;

  29. import org.jivesoftware.smackx.si.packet.StreamInitiation;
  30. import org.jivesoftware.smackx.si.packet.StreamInitiation.File;
  31. import org.jivesoftware.smackx.xdata.packet.DataForm;
  32. import org.jivesoftware.smackx.xdata.provider.DataFormProvider;

  33. import org.jxmpp.util.XmppDateTime;

  34. /**
  35.  * The StreamInitiationProvider parses StreamInitiation packets.
  36.  *
  37.  * @author Alexander Wenckus
  38.  *
  39.  */
  40. public class StreamInitiationProvider extends IqProvider<StreamInitiation> {
  41.     private static final Logger LOGGER = Logger.getLogger(StreamInitiationProvider.class.getName());

  42.     @Override
  43.     public StreamInitiation parse(XmlPullParser parser, int initialDepth, IqData iqData, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
  44.         // si
  45.         String id = parser.getAttributeValue("", "id");
  46.         String mimeType = parser.getAttributeValue("", "mime-type");

  47.         StreamInitiation initiation = new StreamInitiation();

  48.         // file
  49.         String name = null;
  50.         String size = null;
  51.         String hash = null;
  52.         String date = null;
  53.         String desc = null;
  54.         boolean isRanged = false;

  55.         // feature
  56.         DataForm form = null;
  57.         DataFormProvider dataFormProvider = new DataFormProvider();

  58.         outerloop: while (true) {
  59.             XmlPullParser.Event eventType = parser.next();
  60.             if (eventType == XmlPullParser.Event.START_ELEMENT) {
  61.                 String elementName = parser.getName();
  62.                 String namespace = parser.getNamespace();
  63.                 if (elementName.equals("file")) {
  64.                     name = parser.getAttributeValue("", "name");
  65.                     size = parser.getAttributeValue("", "size");
  66.                     hash = parser.getAttributeValue("", "hash");
  67.                     date = parser.getAttributeValue("", "date");
  68.                 } else if (elementName.equals("desc")) {
  69.                     desc = parser.nextText();
  70.                 } else if (elementName.equals("range")) {
  71.                     isRanged = true;
  72.                 } else if (elementName.equals("x")
  73.                         && namespace.equals("jabber:x:data")) {
  74.                     form = dataFormProvider.parse(parser);
  75.                 }
  76.             } else if (eventType == XmlPullParser.Event.END_ELEMENT) {
  77.                 if (parser.getDepth() == initialDepth) {
  78.                     break outerloop;
  79.                 }
  80.                 if (parser.getName().equals("file")) {
  81.                     long fileSize = 0;
  82.                     if (size != null && size.trim().length() != 0) {
  83.                         try {
  84.                             fileSize = Long.parseLong(size);
  85.                         }
  86.                         catch (NumberFormatException e) {
  87.                             LOGGER.log(Level.SEVERE, "Failed to parse file size from " + fileSize, e);
  88.                         }
  89.                     }

  90.                     Date fileDate = new Date();
  91.                     if (date != null) {
  92.                         try {
  93.                             fileDate = XmppDateTime.parseDate(date);
  94.                         } catch (ParseException e) {
  95.                             // couldn't parse date, use current date-time
  96.                         }
  97.                     }

  98.                     File file = new File(name, fileSize);
  99.                     file.setHash(hash);
  100.                     file.setDate(fileDate);
  101.                     file.setDesc(desc);
  102.                     file.setRanged(isRanged);
  103.                     initiation.setFile(file);
  104.                 }
  105.             }
  106.         }

  107.         initiation.setSessionID(id);
  108.         initiation.setMimeType(mimeType);

  109.         initiation.setFeatureNegotiationForm(form);

  110.         return initiation;
  111.     }

  112. }