javacommons/utils/javasrc/com/nokia/mj/impl/utils/ResourceLoaderAvkon.java
author hgs
Fri, 15 Oct 2010 12:29:39 +0300
changeset 80 d6dafc5d983f
permissions -rw-r--r--
v2.2.19_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     1
/*
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     2
* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     3
* All rights reserved.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     8
*
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
     9
* Initial Contributors:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    11
*
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    12
* Contributors:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    13
*
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    14
* Description:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    15
*
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    16
*/
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    17
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    18
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    19
package com.nokia.mj.impl.utils;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    20
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    21
import java.io.InputStream;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    22
import java.io.InputStreamReader;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    23
import java.io.IOException;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    24
import java.util.Hashtable;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    25
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    26
/**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    27
 * Resource loader to get localised strings and Formatter patterns.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    28
 * <br>
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    29
 * Usage:
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    30
 * <pre>
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    31
 *   ResourceLoader res = ResourceLoader.getInstance("javainstaller", "qtn_java_installer_");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    32
 *   Label subjectLabel = createLabel(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    33
 *       res.format("subject").arg(certificate.getSubject()).toString(),
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    34
 *       horizontalSpan, labelStyle);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    35
 * </pre>
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    36
 * @see ResourceLoader
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    37
 */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    38
class ResourceLoaderAvkon extends ResourceLoader
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    39
{
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    40
    /** Localisation resource basepath */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    41
    private static final String LOC_RESOURCE_BASE = "/resources/com/nokia/mj/impl/";
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    42
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    43
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    44
     * Resource string map for the resources that have been fetched
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    45
     * at least once.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    46
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    47
    private Hashtable iResourceMap = new Hashtable();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    48
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    49
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    50
     * Resource string maps for resources read from each resource file
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    51
     * specified in comma separated list of resource file names.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    52
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    53
    private Hashtable[] iResourceMaps = null;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    54
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    55
    /** Resource name prefix passed when ResourceLoader is constructed. */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    56
    private String iPrefix = null;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    57
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    58
    /** Array of resource name prefixes. */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    59
    private String[] iPrefixes = null;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    60
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    61
    /** Platform localisation type. */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    62
    private int iLocType = -1;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    63
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    64
    /*** ----------------------------- PUBLIC ------------------------------ */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    65
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    66
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    67
     * Returns a resource loader instance.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    68
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    69
     * @param avkonFileName name of the Avkon resource file
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    70
     * @param avkonPrefix prefix added before each id when retrieving
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    71
     * @param qtFileName name of the Qt resource file
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    72
     * @param qtPrefix prefix added before each id when retrieving
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    73
     * @return resource loader instance
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    74
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    75
    public static ResourceLoader getInstance(String avkonFileName,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    76
                                             String avkonPrefix,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    77
                                             String qtFileName,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    78
                                             String qtPrefix)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    79
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    80
        // Construct key from filenames and prefixes, this is the same
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    81
        // between platforms.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    82
        String key = (new StringBuffer()).append(avkonFileName).append(":")
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    83
            .append(avkonPrefix).append(":").append(qtFileName).append(":")
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    84
            .append(qtPrefix).toString();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    85
        ResourceLoader result = (ResourceLoader)iResourceLoaders.get(key);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    86
        if (result == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    87
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    88
            result = new ResourceLoaderAvkon(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    89
                avkonFileName, avkonPrefix, qtFileName, qtPrefix);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    90
            iResourceLoaders.put(key, result);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    91
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    92
        return result;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    93
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    94
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    95
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    96
     * Returns a resource loader instance.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    97
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    98
     * @param resourceName comma separated list of resource file names
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
    99
     * @param prefix comma separated list of prefixes added before each
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   100
     * id when retrieving
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   101
     * @return resource loader instance
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   102
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   103
    public static ResourceLoader getInstance(String resourceName, String prefix)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   104
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   105
        String key = resourceName + ":" + prefix;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   106
        ResourceLoader result = (ResourceLoader)iResourceLoaders.get(key);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   107
        if (result == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   108
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   109
            result = new ResourceLoaderAvkon(resourceName, prefix);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   110
            iResourceLoaders.put(key, result);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   111
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   112
        return result;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   113
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   114
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   115
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   116
     * Get a string formatter of a given resource id.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   117
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   118
     * @param id comma separated list of resource ids
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   119
     * @return formatter instance
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   120
     * @see Formatter
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   121
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   122
    public Formatter format(String id)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   123
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   124
        return new FormatterAvkon(string(id), iLocType);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   125
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   126
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   127
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   128
     * Get a string formatter of a given resource id.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   129
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   130
     * @param id resource id
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   131
     * @return formatter instance
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   132
     * @see Formatter
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   133
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   134
    public Formatter format(Id id)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   135
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   136
        return new FormatterAvkon(string(id.getString(iLocType)), iLocType);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   137
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   138
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   139
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   140
     * Formats localised text with specified parameters from an array.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   141
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   142
     * @param id comma separated list of resource ids
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   143
     * @param textParameters parameters to be filled into the text
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   144
     * @return localised text formatted with the provided parameters
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   145
     * @see Formatter
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   146
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   147
    public String format(String id, Object[] textParameters)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   148
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   149
        return new FormatterAvkon(string(id), iLocType).format(textParameters);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   150
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   151
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   152
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   153
     * Formats localised text with specified parameters from an array.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   154
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   155
     * @param id resource id
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   156
     * @param textParameters parameters to be filled into the text
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   157
     * @return localised text formatted with the provided parameters
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   158
     * @see Formatter
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   159
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   160
    public String format(Id id, Object[] textParameters)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   161
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   162
        return new FormatterAvkon(string(id.getString(iLocType)), iLocType).format(textParameters);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   163
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   164
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   165
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   166
    /*** ----------------------------- PRIVATE ---------------------------- */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   167
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   168
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   169
     * Get a plain string resource with a given resource id.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   170
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   171
     * @param id resource id, either with prefix or without
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   172
     * @return resource string, or the id if does not exist
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   173
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   174
    private String string(String id)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   175
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   176
        String str = (String)iResourceMap.get(id);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   177
        if (str == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   178
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   179
            str = getResourceStringByList(id);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   180
            // Put to resource map with original key for quick retrieval.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   181
            str = decode(str);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   182
            str = replaceCharacterCodes(str);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   183
            iResourceMap.put(id, str);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   184
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   185
        return str;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   186
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   187
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   188
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   189
     * Private constructor. Loads localisation resource file.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   190
     * On Avkon UI it's resources are loaded. On Qt platfor it's
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   191
     * resource is first read and if that fails Avkon one is read.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   192
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   193
     * @param avkonFileName Avkon localisation resource file.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   194
     * @param avkonPrefix   Avkon logical string prefix.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   195
     * @param qtFileName    Qt localisation resource file.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   196
     * @param qtPrefix      Qt logical string prefix.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   197
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   198
    private ResourceLoaderAvkon(String avkonFileName, String avkonPrefix,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   199
                                String qtFileName, String qtPrefix)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   200
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   201
        String localeId = getLocaleIdQt();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   202
        if (localeId == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   203
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   204
            iLocType = AVKON;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   205
            setPrefix(avkonPrefix);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   206
            loadFiles(avkonFileName, true);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   207
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   208
        else
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   209
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   210
            if (!loadFiles(qtFileName, false))
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   211
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   212
                // Fallback to Avkon
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   213
                iLocType = AVKON;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   214
                setPrefix(avkonPrefix);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   215
                loadFiles(avkonFileName, true);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   216
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   217
            else
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   218
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   219
                iLocType = QT;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   220
                setPrefix(qtPrefix);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   221
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   222
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   223
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   224
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   225
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   226
     * Creates resource loader, using the current locale of the environment.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   227
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   228
     * @param resourceName name of the resource
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   229
     * @param aPrefix prefix added before each id when retrieving
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   230
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   231
    private ResourceLoaderAvkon(String resourceName, String aPrefix)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   232
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   233
        iLocType = AVKON;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   234
        setPrefix(aPrefix);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   235
        loadFiles(resourceName, true); // Avkon
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   236
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   237
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   238
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   239
     * Initializes member variables according to given prefix.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   240
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   241
     * @param aPrefix comma separated list of text id prefixes
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   242
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   243
    private void setPrefix(String aPrefix)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   244
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   245
        iPrefix = aPrefix;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   246
        iPrefixes = Tokenizer.split(iPrefix, SEPARATOR);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   247
        if (iPrefixes == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   248
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   249
            iPrefixes = new String[0];
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   250
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   251
        for (int i = 0; i < iPrefixes.length; i++)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   252
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   253
            iPrefixes[i] = iPrefixes[i].trim();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   254
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   255
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   256
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   257
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   258
     * Loads the resources from .loc type files.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   259
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   260
     * @param resourceNames comma separated list of resource filenames.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   261
     * @param avkon true if Avkon based localisation is in use
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   262
     * @param true if operation succeed.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   263
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   264
    private boolean loadFiles(String resourceNames, boolean avkon)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   265
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   266
        if (resourceNames == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   267
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   268
            return false;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   269
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   270
        boolean result = false;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   271
        String[] filenames = Tokenizer.split(resourceNames, SEPARATOR);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   272
        iResourceMaps = new Hashtable[filenames.length];
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   273
        for (int i = 0; i < filenames.length; i++)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   274
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   275
            iResourceMaps[i] = new Hashtable();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   276
            if (loadFile(filenames[i].trim(), avkon, iResourceMaps[i]))
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   277
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   278
                // Return true if loading succeeds for at least one file.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   279
                result = true;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   280
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   281
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   282
        return result;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   283
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   284
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   285
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   286
     * Loads the resources from .loc type file.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   287
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   288
     * @param resourceName name of the resource file
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   289
     * @param avkon true if Avkon based localisation is in use
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   290
     * @param resourceMap Map where the resources are stored to
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   291
     * @param true if operation succeed.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   292
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   293
    private boolean loadFile(String resourceName, boolean avkon, Hashtable resourceMap)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   294
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   295
        InputStream is = null;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   296
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   297
        if (!avkon)  // Qt resources.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   298
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   299
            String langName = getLocaleIdQt();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   300
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   301
            // Emulator returns falsely en_GB as engineering English locale name.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   302
            if (langName.equals("en_GB"))
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   303
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   304
                langName = "en";
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   305
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   306
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   307
            // Load with real locale id
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   308
            is = this.getClass().getResourceAsStream(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   309
                LOC_RESOURCE_BASE + resourceName + "_" + langName + ".loc");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   310
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   311
            if (is == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   312
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   313
                // Load the reference without locale id
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   314
                is = this.getClass().getResourceAsStream(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   315
                         LOC_RESOURCE_BASE + resourceName + ".loc");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   316
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   317
            if (is == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   318
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   319
                /*
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   320
                 * Does not exist. No need to continue as avkon file cannot
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   321
                 * found using qt name.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   322
                 */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   323
                return false;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   324
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   325
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   326
        else  // Avkon resources.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   327
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   328
            // Load with real locale id
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   329
            is = this.getClass().getResourceAsStream(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   330
                 LOC_RESOURCE_BASE + resourceName + "_" + getLocaleId() + ".loc");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   331
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   332
            if (is == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   333
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   334
                // Load the engineering english
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   335
                is = this.getClass().getResourceAsStream(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   336
                         LOC_RESOURCE_BASE + resourceName + "_sc" + ".loc");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   337
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   338
            if (is == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   339
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   340
                // Load the reference engineering english
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   341
                is = this.getClass().getResourceAsStream(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   342
                         LOC_RESOURCE_BASE + resourceName + ".loc");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   343
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   344
            if (is == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   345
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   346
                Logger.WLOG(Logger.EUtils,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   347
                            "ResourceLoaderAvkon: Cannot load resource file: " +
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   348
                            resourceName);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   349
                return false;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   350
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   351
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   352
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   353
        try
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   354
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   355
            // Loc-files area always on UTF8 format
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   356
            LineReader lr = new LineReader(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   357
                new BufferedReader(new InputStreamReader(is, "UTF-8")));
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   358
            String line;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   359
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   360
            while ((line = lr.readLine()) != null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   361
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   362
                // Ignore lines which are not #define's
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   363
                if (!line.startsWith("#define "))
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   364
                {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   365
                    continue;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   366
                }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   367
                try
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   368
                {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   369
                    // Skip "#define" + any whitespace
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   370
                    line = line.substring(line.indexOf(' ')).trim();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   371
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   372
                    int idEnd = line.indexOf(' ');
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   373
                    String id = line.substring(0, idEnd);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   374
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   375
                    int strStart = line.indexOf('"', idEnd);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   376
                    int strEnd = line.lastIndexOf('"');
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   377
                    String str = line.substring(strStart + 1, strEnd);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   378
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   379
                    str = decode(str);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   380
                    str = replaceCharacterCodes(str);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   381
                    resourceMap.put(id, str);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   382
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   383
                }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   384
                catch (IndexOutOfBoundsException ex)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   385
                {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   386
                    String error = "ResourceLoaderAvkon: Incorrect line " +
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   387
                        resourceName + ":" + lr.getLineNumber() + "\"" +
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   388
                        line + "\"";
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   389
                    Logger.WLOG(Logger.EUtils, error);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   390
                }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   391
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   392
            is.close();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   393
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   394
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   395
        catch (IOException ex)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   396
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   397
            Logger.WLOG(Logger.EUtils,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   398
                        "ResourceLoaderAvkon: Resource file " + resourceName +
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   399
                        " handling failed: " + ex.getMessage());
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   400
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   401
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   402
        return true;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   403
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   404
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   405
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   406
     * Decode given string. Decoding means unescaping escaped characters.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   407
     * Currently \n, \t, \', \\ and \" patterns are decoded to respective
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   408
     * characters.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   409
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   410
     * @param str to be decoded.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   411
     * @return decoded String.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   412
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   413
    private String decode(String str)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   414
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   415
        str = replacePattern(str, "\\n", '\n');
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   416
        str = replacePattern(str, "\\\\", '\\');
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   417
        str = replacePattern(str, "\\\"", '\"');
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   418
        str = replacePattern(str, "\\t", '\t');
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   419
        str = replacePattern(str, "\\'", '\'');
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   420
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   421
        return str;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   422
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   423
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   424
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   425
     * Replace all occurrences of the pattern in the given String.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   426
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   427
     * @param resource string to be replaced.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   428
     * @param pattern to replace.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   429
     * @param replacement replacement character.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   430
     * @return String where all occurrences of the pattern are replaced.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   431
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   432
    private String replacePattern(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   433
        String resource, String pattern, char replacement)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   434
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   435
        StringBuffer sb = new StringBuffer();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   436
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   437
        int startIndex = resource.indexOf(pattern);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   438
        if (startIndex != -1)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   439
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   440
            sb.append(resource.substring(0, startIndex)).append(replacement);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   441
            startIndex = startIndex + pattern.length();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   442
            int endIndex = 0;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   443
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   444
            while ((endIndex = resource.indexOf(pattern, startIndex)) != -1)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   445
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   446
                sb.append(resource.substring(startIndex, endIndex))
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   447
                .append(replacement);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   448
                startIndex = endIndex + pattern.length();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   449
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   450
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   451
            if (startIndex < resource.length())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   452
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   453
                sb.append(resource.substring(startIndex, resource.length()));
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   454
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   455
            return sb.toString();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   456
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   457
        return resource;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   458
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   459
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   460
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   461
     * Replace character codes. They are given as <0x0000> format. Where 0x0000
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   462
     * contains character unicode as hex representation.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   463
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   464
     * @param str to replace characters.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   465
     * @return String where characters are replaced.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   466
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   467
    private String replaceCharacterCodes(String str)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   468
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   469
        StringBuffer sb = new StringBuffer();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   470
        int startIndex = str.indexOf("<0x");
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   471
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   472
        if (startIndex != -1 && str.charAt(startIndex + 7) == '>')
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   473
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   474
            sb.append(str.substring(0, startIndex));
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   475
            try
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   476
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   477
                int charint = Integer.parseInt(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   478
                                  str.substring(startIndex + 3, startIndex + 7), 16);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   479
                sb.append((char) charint);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   480
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   481
                int endIndex = 0;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   482
                startIndex += 7;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   483
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   484
                while ((endIndex = str.indexOf("<0x", startIndex)) != -1
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   485
                        && str.charAt(endIndex + 7) == '>')
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   486
                {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   487
                    sb.append(str.substring(startIndex + 1, endIndex));
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   488
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   489
                    charint = Integer.parseInt(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   490
                                  str.substring(endIndex + 3, endIndex + 7), 16);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   491
                    sb.append((char) charint);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   492
                    startIndex = endIndex + 7;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   493
                }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   494
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   495
            catch (NumberFormatException nfe)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   496
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   497
                Logger.ELOG(Logger.EUtils,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   498
                            "ResourceLoaderAvkon: Cannot replace character from string: " +
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   499
                            str);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   500
                return str;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   501
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   502
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   503
            if (startIndex < str.length())
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   504
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   505
                sb.append(str.substring(startIndex + 1, str.length()));
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   506
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   507
            return sb.toString();
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   508
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   509
        return str;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   510
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   511
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   512
    /**
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   513
     * Get a string from resource map with a given comma
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   514
     * separated resource id list.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   515
     *
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   516
     * @param id comma separated resource id list, either with prefix or without
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   517
     * @return resource string, or the id if does not exist
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   518
     */
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   519
    private String getResourceStringByList(String id)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   520
    {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   521
        String str = null;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   522
        String[] ids = Tokenizer.split(id, SEPARATOR);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   523
        for (int i = 0; i < ids.length && str == null; i++)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   524
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   525
            // Search text ids from resource maps.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   526
            for (int j = 0; j < iResourceMaps.length && str == null; j++)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   527
            {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   528
                str = (String)iResourceMaps[j].get(ids[i]);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   529
                if (str == null && iPrefixes != null && iPrefixes.length > j)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   530
                {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   531
                    // Try with prefix.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   532
                    str = (String)iResourceMaps[j].get(
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   533
                        iPrefixes[j] + ids[i]);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   534
                }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   535
            }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   536
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   537
        if (str == null)
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   538
        {
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   539
            // Not found. Use the id itself.
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   540
            str = id;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   541
            Logger.WLOG(Logger.EUtils,
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   542
                        "ResourceLoaderAvkon: Cannot find resource: " + id +
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   543
                        ", prefix: " + iPrefix);
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   544
        }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   545
        return str;
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   546
    }
d6dafc5d983f v2.2.19_1
hgs
parents:
diff changeset
   547
}