javamanager/javainstaller/installer/javasrc/com/nokia/mj/impl/installer/utils/IconConverterEswt.java
author hgs
Fri, 29 Oct 2010 11:49:32 +0300
changeset 87 1627c337e51e
permissions -rw-r--r--
v2.2.21_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
87
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     1
/*
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     3
* All rights reserved.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     8
*
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
     9
* Initial Contributors:
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    11
*
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    12
* Contributors:
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    13
*
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    14
* Description:
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    15
* Icon conversion utility implemented using eSWT.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    16
*
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    17
*/
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    18
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    19
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    20
package com.nokia.mj.impl.installer.utils;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    21
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    22
import java.io.InputStream;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    23
import java.io.IOException;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    24
import java.io.OutputStream;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    25
import java.util.jar.JarFile;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    26
import java.util.jar.JarEntry;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    27
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    28
import org.eclipse.swt.SWT;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    29
import org.eclipse.swt.graphics.Image;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    30
import org.eclipse.swt.graphics.ImageData;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    31
import org.eclipse.swt.graphics.ImageLoader;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    32
import org.eclipse.swt.graphics.Point;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    33
import org.eclipse.swt.internal.extension.Toolkit;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    34
import org.eclipse.swt.widgets.Display;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    35
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    36
/**
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    37
 * Icon conversion utility implemented using eSWT.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    38
 */
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    39
public class IconConverterEswt
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    40
{
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    41
    /** List of unsupported bitmap image format filename extensions. */
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    42
    private static String[] iUnsupportedBitmapFormats =
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    43
        new String[] { ".wbmp", ".wmf" };
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    44
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    45
    /**
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    46
     * Converts icon to platform specific format.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    47
     *
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    48
     * @param aInputIconFilename file name for input icon file
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    49
     * @param aOutputIconFilename file name for output icon file
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    50
     * @param aJarFilename jar file name if aInputIconFilename specifies
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    51
     *    file inside jar file,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    52
     *    or null if aInputIconFilename specifies file from disk
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    53
     * @param aIconSuffix the correct suffix of the icon is returned through
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    54
     *    this parameter, will contain '.png' or '.svg' when function returns
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    55
     * @return true if the conversion succeeds
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    56
     */
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    57
    public static boolean convertIcon(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    58
        String aInputIconFilename, String aOutputIconFilename,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    59
        String aJarFilename, StringBuffer aIconSuffix)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    60
    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    61
        Log.log("IconConverterEswt.convertIcon: " + aInputIconFilename +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    62
                " to " + aOutputIconFilename + " from " + aJarFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    63
        boolean result = false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    64
        try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    65
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    66
            if (isSvgIcon(aInputIconFilename, aJarFilename))
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    67
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    68
                result = convertSvgIcon(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    69
                    aInputIconFilename, aOutputIconFilename,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    70
                    aJarFilename, aIconSuffix);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    71
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    72
            else
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    73
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    74
                result = convertBitmapIcon(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    75
                    aInputIconFilename, aOutputIconFilename,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    76
                    aJarFilename, aIconSuffix);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    77
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    78
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    79
        catch (Throwable t)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    80
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    81
            Log.logWarning("IconConverterEswt.convertIcon: Exception when " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    82
                           "converting " + aInputIconFilename + " to " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    83
                           aOutputIconFilename + " from " + aJarFilename, t);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    84
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    85
        return result;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    86
    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    87
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    88
    /**
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    89
     * Converts bitmap icon to platform specific format.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    90
     *
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    91
     * @param aInputIconFilename file name for input icon file
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    92
     * @param aOutputIconFilename file name for output icon file
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    93
     * @param aJarFilename jar file name if aInputIconFilename specifies
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    94
     *    file inside jar file,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    95
     *    or null if aInputIconFilename specifies file from disk
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    96
     * @param aIconSuffix the correct suffix of the icon is returned through
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    97
     *    this parameter
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    98
     * @return true if the conversion succeeds
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
    99
     */
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   100
    private static boolean convertBitmapIcon(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   101
        String aInputIconFilename, String aOutputIconFilename,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   102
        String aJarFilename, StringBuffer aIconSuffix)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   103
    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   104
        if (!isSupportedBitmapIcon(aInputIconFilename, aJarFilename))
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   105
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   106
            Log.logWarning("IconConverterEswt.convertBitmapIcon: unsupported " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   107
                           "image format " + aInputIconFilename + " from " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   108
                           aJarFilename + " not converted");
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   109
            return false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   110
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   111
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   112
        final Display display = Toolkit.getInternalDisplay();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   113
        if (display == null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   114
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   115
            Log.logWarning("IconConverterEswt: Getting Display failed, " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   116
                           "icon conversion aborted for " + aInputIconFilename +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   117
                           " from " + aJarFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   118
            return false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   119
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   120
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   121
        final Point iconSize = new Point(88, 88);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   122
        if (iconSize != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   123
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   124
            display.syncExec(new Runnable()
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   125
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   126
                public void run()
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   127
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   128
                    display.setData("org.eclipse.swt.internal.image.loadSize",
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   129
                                    iconSize);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   130
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   131
            });
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   132
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   133
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   134
        Image image = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   135
        if (aJarFilename == null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   136
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   137
            // Load image from file.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   138
            image = new Image(display, aInputIconFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   139
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   140
        else
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   141
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   142
            // Load image from jar file.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   143
            JarFile jarFile = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   144
            try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   145
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   146
                jarFile = new JarFile(aJarFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   147
                InputStream inputStream = jarFile.getInputStream(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   148
                    new JarEntry(FileUtils.trimJarEntry(aInputIconFilename)));
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   149
                image = new Image(display, inputStream);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   150
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   151
            catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   152
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   153
                Log.logWarning("IconConverterEswt: Getting icon " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   154
                               aInputIconFilename + " from " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   155
                               aJarFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   156
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   157
            finally
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   158
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   159
                if (jarFile != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   160
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   161
                    try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   162
                    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   163
                        jarFile.close(); // Closes also InputStream.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   164
                        jarFile = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   165
                    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   166
                    catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   167
                    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   168
                        Log.logWarning("IconConverterEswt: Closing " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   169
                                       aJarFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   170
                    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   171
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   172
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   173
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   174
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   175
        boolean result = false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   176
        if (image != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   177
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   178
            // Save image to file.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   179
            OutputStream outputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   180
            try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   181
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   182
                outputStream = FileUtils.getOutputStream(aOutputIconFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   183
                ImageLoader imageLoader = new ImageLoader();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   184
                imageLoader.data = new ImageData[] { image.getImageData() };
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   185
                imageLoader.save(outputStream, SWT.IMAGE_PNG);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   186
                aIconSuffix.append(".png");
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   187
                result = true;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   188
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   189
            catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   190
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   191
                Log.logWarning("IconConverterEswt: Saving icon " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   192
                               aOutputIconFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   193
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   194
            finally
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   195
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   196
                if (outputStream != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   197
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   198
                    try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   199
                    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   200
                        outputStream.close();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   201
                        outputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   202
                    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   203
                    catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   204
                    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   205
                        Log.logWarning("IconConverterEswt: Closing " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   206
                                       aOutputIconFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   207
                    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   208
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   209
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   210
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   211
        return result;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   212
    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   213
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   214
    /**
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   215
     * Converts SVG icon to platform specific format.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   216
     *
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   217
     * @param aInputIconFilename file name for input icon file
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   218
     * @param aOutputIconFilename file name for output icon file
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   219
     * @param aJarFilename jar file name if aInputIconFilename specifies
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   220
     *    file inside jar file,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   221
     *    or null if aInputIconFilename specifies file from disk
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   222
     * @param aIconSuffix the correct suffix of the icon is returned through
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   223
     *    this parameter
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   224
     * @return true if the conversion succeeds
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   225
     */
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   226
    private static boolean convertSvgIcon(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   227
        String aInputIconFilename, String aOutputIconFilename,
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   228
        String aJarFilename, StringBuffer aIconSuffix)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   229
    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   230
        boolean result = false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   231
        JarFile jarFile = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   232
        InputStream inputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   233
        OutputStream outputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   234
        try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   235
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   236
            if (aJarFilename == null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   237
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   238
                inputStream = FileUtils.getInputStream(aInputIconFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   239
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   240
            else
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   241
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   242
                jarFile = new JarFile(aJarFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   243
                inputStream = jarFile.getInputStream(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   244
                    new JarEntry(FileUtils.trimJarEntry(aInputIconFilename)));
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   245
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   246
            outputStream = FileUtils.getOutputStream(aOutputIconFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   247
            // Copy the image data from InputStream to OutputStream.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   248
            byte[] buf = new byte[16384];
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   249
            int i = 0;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   250
            while ((i = inputStream.read(buf)) != -1)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   251
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   252
                outputStream.write(buf, 0, i);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   253
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   254
            aIconSuffix.append(".svg");
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   255
            result = true;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   256
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   257
        catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   258
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   259
            Log.logWarning("IconConverterEswt: Saving SVG icon " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   260
                           aInputIconFilename + " from " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   261
                           aJarFilename + " to " + aOutputIconFilename +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   262
                           " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   263
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   264
        finally
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   265
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   266
            if (outputStream != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   267
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   268
                try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   269
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   270
                    outputStream.close();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   271
                    outputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   272
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   273
                catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   274
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   275
                    Log.logWarning("IconConverterEswt: Closing " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   276
                                   aOutputIconFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   277
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   278
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   279
            if (inputStream != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   280
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   281
                try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   282
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   283
                    inputStream.close();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   284
                    inputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   285
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   286
                catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   287
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   288
                    Log.logWarning("IconConverterEswt: Closing " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   289
                                   aInputIconFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   290
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   291
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   292
            if (jarFile != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   293
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   294
                try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   295
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   296
                    jarFile.close();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   297
                    jarFile = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   298
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   299
                catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   300
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   301
                    Log.logWarning("IconConverterEswt: Closing " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   302
                                   aJarFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   303
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   304
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   305
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   306
        return result;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   307
    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   308
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   309
    /**
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   310
     * Returns true if given icon file is in SVG format.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   311
     */
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   312
    private static boolean isSvgIcon(String aIconFilename, String aJarFilename)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   313
    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   314
        boolean result = false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   315
        // Simple file type detection from filename extension.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   316
        //if (aIconFilename.toLowerCase().endsWith(".svg"))
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   317
        //{
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   318
        //    result = true;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   319
        //}
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   320
        //return result;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   321
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   322
        // Detect SVG files by checking if file begins with "<?xml".
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   323
        JarFile jarFile = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   324
        InputStream inputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   325
        try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   326
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   327
            if (aJarFilename == null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   328
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   329
                inputStream = FileUtils.getInputStream(aIconFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   330
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   331
            else
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   332
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   333
                jarFile = new JarFile(aJarFilename);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   334
                inputStream = jarFile.getInputStream(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   335
                    new JarEntry(FileUtils.trimJarEntry(aIconFilename)));
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   336
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   337
            byte[] bytes = new byte[5];
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   338
            int readCount = inputStream.read(bytes);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   339
            if (readCount == bytes.length)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   340
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   341
                result = true;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   342
                byte[] xmlDecl = { '<', '?', 'x', 'm', 'l' };
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   343
                for (int i = 0; i < readCount; i++)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   344
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   345
                    if (bytes[i] != xmlDecl[i])
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   346
                    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   347
                        result = false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   348
                        break;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   349
                    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   350
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   351
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   352
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   353
        catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   354
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   355
            Log.logWarning("IconConverterEswt.isSvgIcon: Checking file type of " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   356
                           aIconFilename + " from " + aJarFilename +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   357
                           " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   358
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   359
        finally
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   360
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   361
            if (inputStream != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   362
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   363
                try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   364
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   365
                    inputStream.close();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   366
                    inputStream = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   367
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   368
                catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   369
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   370
                    Log.logWarning("IconConverterEswt.isSvgIcon: Closing " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   371
                                   aIconFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   372
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   373
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   374
            if (jarFile != null)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   375
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   376
                try
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   377
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   378
                    jarFile.close();
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   379
                    jarFile = null;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   380
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   381
                catch (IOException ioe)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   382
                {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   383
                    Log.logWarning("IconConverterEswt.isSvgIcon: Closing " +
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   384
                                   aJarFilename + " failed", ioe);
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   385
                }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   386
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   387
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   388
        return result;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   389
    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   390
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   391
    /**
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   392
     * Returns true if given icon file is in supported bitmap format.
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   393
     */
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   394
    private static boolean isSupportedBitmapIcon(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   395
        String aIconFilename, String aJarFilename)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   396
    {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   397
        boolean result = true;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   398
        for (int i = 0; i < iUnsupportedBitmapFormats.length; i++)
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   399
        {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   400
            if (aIconFilename.toLowerCase().endsWith(
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   401
                    iUnsupportedBitmapFormats[i]))
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   402
            {
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   403
                result = false;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   404
                break;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   405
            }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   406
        }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   407
        return result;
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   408
    }
1627c337e51e v2.2.21_1
hgs
parents:
diff changeset
   409
}