/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package net.java.sip.communicator.impl.resources; import java.io.*; import java.net.*; import javax.swing.*; import net.java.sip.communicator.impl.resources.util.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.resources.*; import net.java.sip.communicator.util.*; import org.osgi.framework.*; /** * A default implementation of the ResourceManagementService. * * @author Damian Minkov * @author Yana Stamcheva * @author Lubomir Marinov * @author Adam Netocny */ public class ResourceManagementServiceImpl extends AbstractResourcesService { /** * The Logger used by the ResourceManagementServiceImpl * class and its instances for logging output. */ private static final Logger logger = Logger.getLogger(ResourceManagementServiceImpl.class); /** * UI Service reference. */ private UIService uiService = null; /** * Initializes already registered default resource packs. */ ResourceManagementServiceImpl() { super(ResourceManagementActivator.bundleContext); UIService serv = getUIService(); if (serv != null) { serv.repaintUI(); } } /** * Returns the UIService obtained from the bundle context. * * @return the UIService obtained from the bundle context */ private UIService getUIService() { if (uiService == null) { uiService = ServiceUtils.getService( ResourceManagementActivator.bundleContext, UIService.class); } return uiService; } /** * Gets a reference to the UIService when this one is registered. * * @param event the ServiceEvent that has notified us */ @Override public void serviceChanged(ServiceEvent event) { super.serviceChanged(event); Object sService = ResourceManagementActivator.bundleContext .getService(event.getServiceReference()); if (sService instanceof UIService && uiService == null && event.getType() == ServiceEvent.REGISTERED) { uiService = (UIService) sService; uiService.repaintUI(); } else if (sService instanceof UIService && event.getType() == ServiceEvent.UNREGISTERING) { if (uiService != null && uiService.equals(sService)) { uiService = null; } } } /** * Repaints the whole UI when a skin pack has changed. */ @Override protected void onSkinPackChanged() { UIService serv = getUIService(); if (serv != null) { serv.repaintUI(); } } /** * Returns the int representation of the color corresponding to the * given key. * * @param key The key of the color in the colors properties file. * @return the int representation of the color corresponding to the * given key. */ public int getColor(String key) { String res = getColorResources().get(key); if(res == null) { logger.error("Missing color resource for key: " + key); return 0xFFFFFF; } else return Integer.parseInt(res, 16); } /** * Returns the string representation of the color corresponding to the * given key. * * @param key The key of the color in the colors properties file. * @return the string representation of the color corresponding to the * given key. */ public String getColorString(String key) { String res = getColorResources().get(key); if(res == null) { logger.error("Missing color resource for key: " + key); return "0xFFFFFF"; } else return res; } /** * Returns the InputStream of the image corresponding to the given * path. * * @param path The path to the image file. * @return the InputStream of the image corresponding to the given * path. */ public InputStream getImageInputStreamForPath(String path) { SkinPack skinPack = getSkinPack(); if(skinPack!=null) { if(skinPack.getClass().getClassLoader() .getResourceAsStream(path)!=null) { return skinPack.getClass().getClassLoader() .getResourceAsStream(path); } } ImagePack imagePack = getImagePack(); if (path != null && imagePack != null) return imagePack.getClass().getClassLoader() .getResourceAsStream(path); return null; } /** * Returns the InputStream of the image corresponding to the given * key. * * @param streamKey The identifier of the image in the resource properties * file. * @return the InputStream of the image corresponding to the given * key. */ public InputStream getImageInputStream(String streamKey) { String path = getImagePath(streamKey); if (path == null || path.length() == 0) { logger.warn("Missing resource for key: " + streamKey); return null; } return getImageInputStreamForPath(path); } /** * Returns the URL of the image corresponding to the given key. * * @param urlKey The identifier of the image in the resource properties file. * @return the URL of the image corresponding to the given key */ public URL getImageURL(String urlKey) { String path = getImagePath(urlKey); if (path == null || path.length() == 0) { if (logger.isInfoEnabled()) logger.info("Missing resource for key: " + urlKey); return null; } return getImageURLForPath(path); } /** * Returns the URL of the image corresponding to the given path. * * @param path The path to the given image file. * @return the URL of the image corresponding to the given path. */ public URL getImageURLForPath(String path) { SkinPack skinPack = getSkinPack(); if(skinPack!=null) { if(skinPack.getClass().getClassLoader().getResource(path)!=null) { return skinPack.getClass().getClassLoader().getResource(path); } } ImagePack imagePack = getImagePack(); return imagePack.getClass().getClassLoader().getResource(path); } /** * Returns the URL of the sound corresponding to the given * property key. * * @return the URL of the sound corresponding to the given * property key. */ public URL getSoundURL(String urlKey) { String path = getSoundPath(urlKey); if (path == null || path.length() == 0) { logger.warn("Missing resource for key: " + urlKey); return null; } return getSoundURLForPath(path); } /** * Returns the URL of the sound corresponding to the given path. * * @param path the path, for which we're looking for a sound URL * @return the URL of the sound corresponding to the given path. */ public URL getSoundURLForPath(String path) { return getSoundPack().getClass().getClassLoader().getResource(path); } /** * Loads an image from a given image identifier. * * @param imageID The identifier of the image. * @return The image for the given identifier. */ @Override public byte[] getImageInBytes(String imageID) { InputStream in = getImageInputStream(imageID); if(in == null) return null; byte[] image = null; try { image = new byte[in.available()]; in.read(image); } catch (IOException e) { logger.error("Failed to load image:" + imageID, e); } return image; } /** * Loads an image from a given image identifier. * * @param imageID The identifier of the image. * @return The image for the given identifier. */ @Override public ImageIcon getImage(String imageID) { URL imageURL = getImageURL(imageID); return (imageURL == null) ? null : new ImageIcon(imageURL); } /** * Builds a new skin bundle from the zip file content. * * @param zipFile Zip file with skin information. * @return File for the bundle. * @throws Exception When something goes wrong. */ public File prepareSkinBundleFromZip(File zipFile) throws Exception { return SkinJarBuilder.createBundleFromZip(zipFile, getImagePack()); } }