/* * 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.thumbnail; import java.io.*; import java.security.*; import javax.xml.parsers.*; import net.java.sip.communicator.util.*; import org.jitsi.util.xml.*; import org.w3c.dom.*; /** * The <tt>ThumbnailElement</tt> represents a "thumbnail" XML element, that is * contained in the file element, we're sending to notify for a file transfer. * The <tt>ThumbnailElement</tt>'s role is to advertise a thumbnail. * * @author Yana Stamcheva */ public class ThumbnailElement { private static final Logger logger = Logger.getLogger(ThumbnailElement.class); /** * The name of the XML element used for transport of thumbnail parameters. */ public static final String ELEMENT_NAME = "thumbnail"; /** * The names XMPP space that the thumbnail elements belong to. */ public static final String NAMESPACE = "urn:xmpp:thumbs:0"; /** * The name of the thumbnail attribute "cid". */ public final static String CID = "cid"; /** * The name of the thumbnail attribute "mime-type". */ public final static String MIME_TYPE = "mime-type"; /** * The name of the thumbnail attribute "width". */ public final static String WIDTH = "width"; /** * The name of the thumbnail attribute "height". */ public final static String HEIGHT = "height"; private String cid; private String mimeType; private int width; private int height; /** * Creates a <tt>ThumbnailPacketExtension</tt> by specifying all extension * attributes. * * @param serverAddress the Jabber address of the destination contact * @param thumbnailData the byte array containing the thumbnail data * @param mimeType the mime type attribute * @param width the width of the thumbnail * @param height the height of the thumbnail */ public ThumbnailElement(String serverAddress, byte[] thumbnailData, String mimeType, int width, int height) { this.cid = createCid(serverAddress, thumbnailData); this.mimeType = mimeType; this.width = width; this.height = height; } /** * Creates a <tt>ThumbnailElement</tt> by parsing the given <tt>xml</tt>. * * @param xml the XML from which we obtain the needed information to create * this <tt>ThumbnailElement</tt> */ public ThumbnailElement(String xml) { DocumentBuilder builder; try { builder = XMLUtils.newDocumentBuilderFactory().newDocumentBuilder(); InputStream in = new ByteArrayInputStream (xml.getBytes()); Document doc = builder.parse(in); Element e = doc.getDocumentElement(); String elementName = e.getNodeName(); if (elementName.equals (ELEMENT_NAME)) { this.setCid(e.getAttribute (CID)); this.setMimeType(e.getAttribute(MIME_TYPE)); this.setHeight(Integer.parseInt(e.getAttribute(HEIGHT))); this.setHeight(Integer.parseInt(e.getAttribute(WIDTH))); } else if (logger.isDebugEnabled()) logger.debug ("Element name unknown!"); } catch (ParserConfigurationException ex) { if (logger.isDebugEnabled()) logger.debug ("Problem parsing Thumbnail Element : " + xml, ex); } catch (IOException ex) { if (logger.isDebugEnabled()) logger.debug ("Problem parsing Thumbnail Element : " + xml, ex); } catch (Exception ex) { if (logger.isDebugEnabled()) logger.debug ("Problem parsing Thumbnail Element : " + xml, ex); } } /** * Returns the XML representation of this PacketExtension. * * @return the packet extension as XML. */ public String toXML() { StringBuffer buf = new StringBuffer(); // open element buf.append("<").append(ELEMENT_NAME). append(" xmlns=\"").append(NAMESPACE).append("\""); // adding thumbnail parameters buf = addXmlAttribute(buf, CID, this.getCid()); buf = addXmlAttribute(buf, MIME_TYPE, this.getMimeType()); buf = addXmlIntAttribute(buf, WIDTH, this.getWidth()); buf = addXmlIntAttribute(buf, HEIGHT, this.getWidth()); // close element buf.append("/>"); return buf.toString(); } /** * Returns the Content-ID, corresponding to this <tt>ThumbnailElement</tt>. * @return the Content-ID, corresponding to this <tt>ThumbnailElement</tt> */ public String getCid() { return cid; } /** * Returns the mime type of this <tt>ThumbnailElement</tt>. * @return the mime type of this <tt>ThumbnailElement</tt> */ public String getMimeType() { return mimeType; } /** * Returns the width of this <tt>ThumbnailElement</tt>. * @return the width of this <tt>ThumbnailElement</tt> */ public int getWidth() { return width; } /** * Returns the height of this <tt>ThumbnailElement</tt>. * @return the height of this <tt>ThumbnailElement</tt> */ public int getHeight() { return height; } /** * Sets the content-ID of this <tt>ThumbnailElement</tt>. * @param cid the content-ID to set */ public void setCid(String cid) { this.cid = cid; } /** * Sets the mime type of the thumbnail. * @param mimeType the mime type of the thumbnail */ public void setMimeType(String mimeType) { this.mimeType = mimeType; } /** * Sets the width of the thumbnail * @param width the width of the thumbnail */ public void setWidth(int width) { this.width = width; } /** * Sets the height of the thumbnail * @param height the height of the thumbnail */ public void setHeight(int height) { this.height = height; } /** * Creates the XML <tt>String</tt> corresponding to the specified attribute * and value and adds them to the <tt>buff</tt> StringBuffer. * * @param buff the <tt>StringBuffer</tt> to add the attribute and value to. * @param attrName the name of the thumbnail attribute that we're adding. * @param attrValue the value of the attribute we're adding to the XML * buffer. * @return the <tt>StringBuffer</tt> that we've added the attribute and its * value to. */ private StringBuffer addXmlAttribute( StringBuffer buff, String attrName, String attrValue) { buff.append(" " + attrName + "=\"").append(attrValue).append("\""); return buff; } /** * Creates the XML <tt>String</tt> corresponding to the specified attribute * and value and adds them to the <tt>buff</tt> StringBuffer. * * @param buff the <tt>StringBuffer</tt> to add the attribute and value to. * @param attrName the name of the thumbnail attribute that we're adding. * @param attrValue the value of the attribute we're adding to the XML * buffer. * @return the <tt>StringBuffer</tt> that we've added the attribute and its * value to. */ private StringBuffer addXmlIntAttribute(StringBuffer buff, String attrName, int attrValue) { return addXmlAttribute(buff, attrName, String.valueOf(attrValue)); } /** * Creates the cid attrubte value for the given <tt>contactJabberAddress</tt> * and <tt>thumbnailData</tt>. * * @param serverAddress the Jabber server address * @param thumbnailData the byte array containing the data * @return the cid attrubte value for the thumbnail extension */ private String createCid( String serverAddress, byte[] thumbnailData) { try { return "sha1+" + Sha1Crypto.encode(thumbnailData) + "@" + serverAddress; } catch (NoSuchAlgorithmException e) { if (logger.isDebugEnabled()) logger.debug("Failed to encode the thumbnail in SHA-1.", e); } catch (UnsupportedEncodingException e) { if (logger.isDebugEnabled()) logger.debug("Failed to encode the thumbnail in SHA-1.", e); } return null; } }