package org.awesomeapp.messenger.plugin.xmpp;
/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
import java.security.*;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.util.*;
/**
* Implements the presence extension corresponding to element name "x" and
* namespace "vcard-temp:x:update" (cf. XEP-0153). This ables to include the
* SHA-1 hash of the avatar image in the "photo" tag of this presence extension.
*
* @author Vincent Lucas
*/
public class VCardTempXUpdatePresenceExtension
implements ExtensionElement
{
/**
* This presence extension element name.
*/
public static final String ELEMENT_NAME = "x";
/**
* This presence extension namespace.
*/
public static final String NAMESPACE = "vcard-temp:x:update";
/**
* The SHA-1 hash in hexadecimal representation of the avatar image.
*/
private String imageSha1 = null;
/**
* The whole XML string generated by this presence extension.
*/
private String xmlString = null;
/**
* Creates a new instance of this presence extension with the avatar image
* given in parameter.
*
* @param imageBytes The avatar image.
*/
public VCardTempXUpdatePresenceExtension(byte[] imageBytes)
{
// Computes the default XML with an empty image avatar (necessary to
// manage the case when "imageBytes" is "null").
this.computeXML();
// Updates this presence extension with a new avatar image.
this.updateImage(imageBytes);
}
/**
* Updates the avatar image manged by this presence extension.
*
* @param imageBytes The avatar image.
*
* @return "false" if the new avatar image is the same as the current one.
* "true" if this presence extension has been updated with the new avatar
* image.
*/
public boolean updateImage(byte[] imageBytes)
{
boolean isImageUpdated = false;
// Computes the SHA-1 hash in hexadecimal representation.
String tmpImageSha1 =
VCardTempXUpdatePresenceExtension.getImageSha1(imageBytes);
// If the image has changed, then recomputes the XML string.
if(tmpImageSha1 != imageSha1)
{
imageSha1 = tmpImageSha1;
this.computeXML();
isImageUpdated = true;
}
return isImageUpdated;
}
/**
* Gets the String representation in hexadecimal of the SHA-1 hash of the
* image given in parameter.
*
* @param image The image to get the hexadecimal representation of the SHA-1
* hash.
*
* @return The SHA-A hash hexadecimal representation of the image. Null if
* the image is null or if the SHA1 is not recognized as a valid algorithm.
*/
public static String getImageSha1(byte[] image)
{
String imageSha1 = null;
try
{
if(image != null)
{
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
imageSha1 = StringUtils.encodeHex(messageDigest.digest(image));
}
}
catch(NoSuchAlgorithmException ex)
{
ex.printStackTrace();
}
return imageSha1;
}
/**
* Computes the XML string used by this presence extension.
*/
private void computeXML()
{
StringBuilder stringBuilder = new StringBuilder(
"<" + this.getElementName() +
" xmlns='" + this.getNamespace() + "'>");
if(imageSha1 == null)
{
stringBuilder.append("<photo/>");
}
else
{
stringBuilder.append("<photo>" + imageSha1 + "</photo>");
}
stringBuilder.append("</" + this.getElementName() + ">");
this.xmlString = stringBuilder.toString();
}
/**
* Returns the root element name.
*
* @return the element name.
*/
public String getElementName()
{
return ELEMENT_NAME;
}
/**
* Returns the root element XML namespace.
*
* @return the namespace.
*/
public String getNamespace()
{
return NAMESPACE;
}
/**
* Returns the XML representation of the PacketExtension.
*
* @return the packet extension as XML.
*/
public String toXML()
{
return this.xmlString;
}
/**
* Intercepts sent presence packets in order to add this extension.
*
* @param packet The sent presence packet.
*/
public void interceptPacket(Packet packet)
{
packet.addExtension(this);
}
}