src/hbcore/inputfw/hbinputkeymapfactory.cpp
author hgs
Mon, 18 Oct 2010 18:23:13 +0300
changeset 34 ed14f46c0e55
parent 6 c3690ec91ef8
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     1
/****************************************************************************
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     2
**
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     3
** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     4
** All rights reserved.
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     5
** Contact: Nokia Corporation (developer.feedback@nokia.com)
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     6
**
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     7
** This file is part of the HbCore module of the UI Extensions for Mobile.
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     8
**
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     9
** GNU Lesser General Public License Usage
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    10
** This file may be used under the terms of the GNU Lesser General Public
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    11
** License version 2.1 as published by the Free Software Foundation and
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    12
** appearing in the file LICENSE.LGPL included in the packaging of this file.
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    13
** Please review the following information to ensure the GNU Lesser General
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    14
** Public License version 2.1 requirements will be met:
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    15
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    16
**
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    17
** In addition, as a special exception, Nokia gives you certain additional
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    18
** rights.  These rights are described in the Nokia Qt LGPL Exception
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    19
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    20
**
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    21
** If you have questions regarding the use of this file, please contact
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    22
** Nokia at developer.feedback@nokia.com.
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    23
**
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    24
****************************************************************************/
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
    25
#include "hbinputkeymapfactory.h"
34
hgs
parents: 6
diff changeset
    26
#include "hbinputkeymapfactory_p.h"
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    27
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    28
#include <QPluginLoader>
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    29
#include <QDir>
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    30
#include <QLibrary>
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    31
#include <QTextStream>
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    32
#include <QVector>
34
hgs
parents: 6
diff changeset
    33
#include <QDebug>
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    34
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    35
#include "hbinputkeymap.h"
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    36
#include "hbinputsettingproxy.h"
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    37
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    38
/// @cond
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    39
34
hgs
parents: 6
diff changeset
    40
void removeNonExistingPaths(QStringList &list)
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    41
{
34
hgs
parents: 6
diff changeset
    42
    for (int i = list.count()-1; i >= 0; --i) {
hgs
parents: 6
diff changeset
    43
        if (!QFile::exists(list.at(i))) {
hgs
parents: 6
diff changeset
    44
            list.removeAt(i);
hgs
parents: 6
diff changeset
    45
        }
hgs
parents: 6
diff changeset
    46
    }
hgs
parents: 6
diff changeset
    47
}
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    48
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    49
HbKeymapFactoryPrivate::HbKeymapFactoryPrivate()
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    50
{
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    51
}
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    52
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    53
HbKeymapFactoryPrivate::~HbKeymapFactoryPrivate()
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    54
{
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
    55
    foreach(HbKeymap *keymap, mKeymaps) {
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    56
        delete keymap;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    57
    }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    58
    mKeymaps.clear();
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    59
    mRomLanguages.clear();
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    60
}
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    61
34
hgs
parents: 6
diff changeset
    62
void HbKeymapFactoryPrivate::parseFileNames(const QStringList &files, QList<HbInputLanguage> &languages) const
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    63
{
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    64
    bool ok = false;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    65
    QLocale::Language language = QLocale::C;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    66
    QLocale::Country country = QLocale::AnyCountry;
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
    67
    foreach(const QString &file, files) {
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    68
        int underscorePos = file.indexOf('_');
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    69
        int periodPos = file.indexOf('.');
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    70
        if (underscorePos > 0 && underscorePos < periodPos) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    71
            language = static_cast<QLocale::Language>(file.left(underscorePos).toUInt(&ok));
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    72
            if (!ok) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    73
                continue;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    74
            }
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
    75
            country = static_cast<QLocale::Country>(file.mid(underscorePos + 1, periodPos - underscorePos - 1).toUInt(&ok));
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    76
            if (!ok) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    77
                continue;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    78
            }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    79
            HbInputLanguage toAdd(language, country);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    80
            if (!languages.contains(toAdd)) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    81
                languages.append(toAdd);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    82
            }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    83
        } else if (periodPos > 0) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    84
            language = static_cast<QLocale::Language>(file.left(periodPos).toUInt(&ok));
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    85
            if (!ok) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    86
                continue;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    87
            }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    88
            HbInputLanguage toAdd(language);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    89
            if (!languages.contains(toAdd)) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    90
                languages.append(toAdd);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    91
            }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    92
        }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    93
    }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    94
}
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    95
34
hgs
parents: 6
diff changeset
    96
int HbKeymapFactoryPrivate::keymapVersion(QFile &file) const
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
    97
{
34
hgs
parents: 6
diff changeset
    98
    int version = -1;
hgs
parents: 6
diff changeset
    99
    if (file.fileName().length() > 0) {
hgs
parents: 6
diff changeset
   100
        QChar driveLetter = file.fileName().at(0).toLower();
hgs
parents: 6
diff changeset
   101
        // The version on the 'softest' drive is given precedence
hgs
parents: 6
diff changeset
   102
        // Paths starting with z, :, or any other character are taken after these
hgs
parents: 6
diff changeset
   103
        if (driveLetter >= 'a' && driveLetter <= 'y') {
hgs
parents: 6
diff changeset
   104
            version = driveLetter.toAscii() - 'a' + 1;
5
627c4a0fd0e7 Revision: 201021
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   105
        } else {
34
hgs
parents: 6
diff changeset
   106
            version = 0;
5
627c4a0fd0e7 Revision: 201021
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   107
        }
627c4a0fd0e7 Revision: 201021
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   108
    }
34
hgs
parents: 6
diff changeset
   109
    return version;
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   110
}
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   111
34
hgs
parents: 6
diff changeset
   112
bool HbKeymapFactoryPrivate::findKeymapFile(const HbInputLanguage &language, const QStringList &searchPaths, QFile &file) const
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   113
{
34
hgs
parents: 6
diff changeset
   114
    QString filename, latestVersionFilename;
hgs
parents: 6
diff changeset
   115
    qreal maxVersionNumber = -1;
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   116
34
hgs
parents: 6
diff changeset
   117
    foreach(const QString &path, searchPaths) {
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   118
        if (language.variant() == QLocale::AnyCountry) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   119
            filename = path + '/' + QString::number(language.language()) + ".txt";
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   120
        } else {
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   121
            filename = path + '/' + QString::number(language.language()) + '_'
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   122
                       + QString::number(language.variant()) + ".txt";
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   123
        }
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   124
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   125
        if (QFile::exists(filename)) {
5
627c4a0fd0e7 Revision: 201021
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   126
            file.setFileName(filename);
34
hgs
parents: 6
diff changeset
   127
            int fileVersion = keymapVersion(file);
hgs
parents: 6
diff changeset
   128
            if (fileVersion > maxVersionNumber) {
hgs
parents: 6
diff changeset
   129
                latestVersionFilename = filename;
hgs
parents: 6
diff changeset
   130
                maxVersionNumber = fileVersion;
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   131
            }
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   132
        }
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   133
    }
34
hgs
parents: 6
diff changeset
   134
hgs
parents: 6
diff changeset
   135
    if (latestVersionFilename.isEmpty()) {
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   136
        if (language.variant() == QLocale::AnyCountry) {
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   137
            // File not found when trying to open with AnyCountry (no location specified), check whether
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   138
            // the language is available as a country-specific version
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   139
34
hgs
parents: 6
diff changeset
   140
            foreach(const HbInputLanguage &availableLanguage, HbKeymapFactory::availableLanguages()) {
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   141
                if (availableLanguage.language() == language.language()) {
34
hgs
parents: 6
diff changeset
   142
                    return findKeymapFile(availableLanguage, searchPaths, file);
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   143
                }
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   144
            }
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   145
        }
34
hgs
parents: 6
diff changeset
   146
        return false;
hgs
parents: 6
diff changeset
   147
    } else {
hgs
parents: 6
diff changeset
   148
        file.setFileName(latestVersionFilename);
hgs
parents: 6
diff changeset
   149
        return true;
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   150
    }
34
hgs
parents: 6
diff changeset
   151
}
5
627c4a0fd0e7 Revision: 201021
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   152
34
hgs
parents: 6
diff changeset
   153
HbKeymap *HbKeymapFactoryPrivate::parseKeymapDefinition(const HbInputLanguage &language, QTextStream &stream) const
hgs
parents: 6
diff changeset
   154
{
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   155
    HbKeymap *keymap = 0;
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   156
    HbKeyboardMap *keyboard = 0;
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   157
    while (!stream.atEnd()) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   158
        QString line = stream.readLine();
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   159
        // When an empty line is encountered, an ongoing keyboard definition ends
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   160
        if (line.isEmpty()) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   161
            if (keyboard) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   162
                if (!keymap) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   163
                    keymap = new HbKeymap(language);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   164
                }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   165
                keymap->addKeyboard(keyboard);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   166
                keyboard = 0;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   167
            }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   168
            continue;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   169
        }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   170
        // Line starting with "//" is a comment
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   171
        if (line.length() >= 2 && line.at(0) == '/' && line.at(1) == '/') {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   172
            continue;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   173
        }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   174
        // Non-empty line without ongoing keyboard definition is the start of a definition,
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   175
        // containing the keyboard type as hex
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   176
        if (!keyboard) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   177
            bool ok = false;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   178
            int keyType = line.toInt(&ok, 16);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   179
            if (ok) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   180
                keyboard = new HbKeyboardMap();
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   181
                keyboard->type = static_cast<HbKeyboardType>(keyType);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   182
            }
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   183
            // Non-empty line with ongoing keyboard definition contains a key definition
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   184
            // Format: <keycode(char)><tab><keys_nomod><tab><keys_shiftmod><tab><keys_fnmod><tab><keys_fn+shiftmod>
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   185
            // Keycode and keys_nomod should always be present, but the rest are optional
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   186
        } else {
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   187
            QStringList splitResult = line.split('\t');
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   188
            if (splitResult.count() == 0) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   189
                continue;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   190
            }
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   191
            HbMappedKey *mappedKey = new HbMappedKey();
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   192
            mappedKey->keycode = splitResult.at(0).at(0);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   193
            for (int i = 1; i < splitResult.count(); ++i) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   194
                switch (i) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   195
                case 1:
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   196
                    mappedKey->chars.append(splitResult.at(1));
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   197
                    break;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   198
                case 2:
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   199
                    mappedKey->chars.append(splitResult.at(2));
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   200
                    break;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   201
                case 3:
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   202
                    mappedKey->chars.append(splitResult.at(3));
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   203
                    break;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   204
                case 4:
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   205
                    mappedKey->chars.append(splitResult.at(4));
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   206
                    break;
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   207
                case 5:
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   208
                    mappedKey->chars.append(splitResult.at(5));
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   209
                    break;
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   210
                default:
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   211
                    break;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   212
                }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   213
            }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   214
            keyboard->keys.append(mappedKey);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   215
        }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   216
    }
34
hgs
parents: 6
diff changeset
   217
    if (keyboard) {
hgs
parents: 6
diff changeset
   218
        // The last keyboard definition was not terminated properly, so it needs to be freed at this point
hgs
parents: 6
diff changeset
   219
        delete keyboard;
hgs
parents: 6
diff changeset
   220
        keyboard = 0;
hgs
parents: 6
diff changeset
   221
        qDebug() << "HbInputKeymapFactory: unterminated keyboard definition detected";
hgs
parents: 6
diff changeset
   222
    }
hgs
parents: 6
diff changeset
   223
    if (!isValid(keymap)) {
hgs
parents: 6
diff changeset
   224
        delete keymap;
hgs
parents: 6
diff changeset
   225
        keymap = 0;
hgs
parents: 6
diff changeset
   226
        qDebug() << "HbInputKeymapFactory: invalid keymap definition detected";
hgs
parents: 6
diff changeset
   227
    }
hgs
parents: 6
diff changeset
   228
    return keymap;
hgs
parents: 6
diff changeset
   229
}
hgs
parents: 6
diff changeset
   230
hgs
parents: 6
diff changeset
   231
bool HbKeymapFactoryPrivate::isValid(const HbKeymap *keymap) const
hgs
parents: 6
diff changeset
   232
{
hgs
parents: 6
diff changeset
   233
    if (!keymap) {
hgs
parents: 6
diff changeset
   234
        return false;
hgs
parents: 6
diff changeset
   235
    }
hgs
parents: 6
diff changeset
   236
    // Very basic sanity checking
hgs
parents: 6
diff changeset
   237
    // Check that basic keyboards are present and the number of keys make sense
hgs
parents: 6
diff changeset
   238
    const HbKeyboardMap* keyboard = keymap->keyboard(HbKeyboardTouchPortrait);
hgs
parents: 6
diff changeset
   239
    if (!keyboard || keyboard->keys.count() != 10) {
hgs
parents: 6
diff changeset
   240
        return false;
hgs
parents: 6
diff changeset
   241
    }
hgs
parents: 6
diff changeset
   242
    keyboard = keymap->keyboard(HbKeyboardTouchLandscape);
hgs
parents: 6
diff changeset
   243
    if (!keyboard || keyboard->keys.count() < 30 || keyboard->keys.count() > 45) {
hgs
parents: 6
diff changeset
   244
        return false;
hgs
parents: 6
diff changeset
   245
    }
hgs
parents: 6
diff changeset
   246
    keyboard = keymap->keyboard(HbKeyboardSctPortrait);
hgs
parents: 6
diff changeset
   247
    if (!keyboard || keyboard->keys.count() < 16) {
hgs
parents: 6
diff changeset
   248
        return false;
hgs
parents: 6
diff changeset
   249
    }
hgs
parents: 6
diff changeset
   250
    keyboard = keymap->keyboard(HbKeyboardSctLandscape);
hgs
parents: 6
diff changeset
   251
    if (!keyboard || keyboard->keys.count() < 30) {
hgs
parents: 6
diff changeset
   252
        return false;
hgs
parents: 6
diff changeset
   253
    }
hgs
parents: 6
diff changeset
   254
    return true;
hgs
parents: 6
diff changeset
   255
}
hgs
parents: 6
diff changeset
   256
hgs
parents: 6
diff changeset
   257
HbKeymap *HbKeymapFactoryPrivate::keymap(const HbInputLanguage &language) const
hgs
parents: 6
diff changeset
   258
{
hgs
parents: 6
diff changeset
   259
    QFile file;
hgs
parents: 6
diff changeset
   260
    HbKeymap *keymap = 0;
hgs
parents: 6
diff changeset
   261
    QStringList paths = HbInputSettingProxy::keymapPluginPaths();
hgs
parents: 6
diff changeset
   262
    removeNonExistingPaths(paths);
hgs
parents: 6
diff changeset
   263
    // First try to load the highest priority version of the keymap
hgs
parents: 6
diff changeset
   264
    if (findKeymapFile(language, paths, file)) {
hgs
parents: 6
diff changeset
   265
        QTextStream stream;
hgs
parents: 6
diff changeset
   266
        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
hgs
parents: 6
diff changeset
   267
            stream.setDevice(&file);
hgs
parents: 6
diff changeset
   268
            keymap = parseKeymapDefinition(language, stream);
hgs
parents: 6
diff changeset
   269
            file.close();
hgs
parents: 6
diff changeset
   270
        }
hgs
parents: 6
diff changeset
   271
        // If reading the keymap fails (and it was not in system resources to begin with),
hgs
parents: 6
diff changeset
   272
        // try to load a version from system resources
hgs
parents: 6
diff changeset
   273
        if (!keymap && file.fileName().left(2) != ":/") {
hgs
parents: 6
diff changeset
   274
            if (findKeymapFile(language, paths.filter(":/"), file)) {
hgs
parents: 6
diff changeset
   275
                if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
hgs
parents: 6
diff changeset
   276
                    stream.setDevice(&file);
hgs
parents: 6
diff changeset
   277
                    keymap = parseKeymapDefinition(language, stream);
hgs
parents: 6
diff changeset
   278
                    file.close();
hgs
parents: 6
diff changeset
   279
                }
hgs
parents: 6
diff changeset
   280
            }
hgs
parents: 6
diff changeset
   281
        }
hgs
parents: 6
diff changeset
   282
    }
hgs
parents: 6
diff changeset
   283
    return keymap;
hgs
parents: 6
diff changeset
   284
}
hgs
parents: 6
diff changeset
   285
hgs
parents: 6
diff changeset
   286
/// @endcond
hgs
parents: 6
diff changeset
   287
hgs
parents: 6
diff changeset
   288
/*!
hgs
parents: 6
diff changeset
   289
@stable
hgs
parents: 6
diff changeset
   290
@hbcore
hgs
parents: 6
diff changeset
   291
\class HbKeymapFactory
hgs
parents: 6
diff changeset
   292
\brief A factory class for accessing keymap data.
hgs
parents: 6
diff changeset
   293
hgs
parents: 6
diff changeset
   294
Keymap factory constructs HbKeymap objects for given languages based on keymap resource files.
hgs
parents: 6
diff changeset
   295
It can also provide a list of available keymap files in the system.
hgs
parents: 6
diff changeset
   296
hgs
parents: 6
diff changeset
   297
\sa HbKeymap
hgs
parents: 6
diff changeset
   298
*/
hgs
parents: 6
diff changeset
   299
hgs
parents: 6
diff changeset
   300
/*!
hgs
parents: 6
diff changeset
   301
\enum HbKeymapFactory::Flag
hgs
parents: 6
diff changeset
   302
hgs
parents: 6
diff changeset
   303
Flags for controlling keymap loading by the factory.
hgs
parents: 6
diff changeset
   304
*/
hgs
parents: 6
diff changeset
   305
hgs
parents: 6
diff changeset
   306
/*!
hgs
parents: 6
diff changeset
   307
\var HbKeymapFactory::Flag HbKeymapFactory::Default
hgs
parents: 6
diff changeset
   308
hgs
parents: 6
diff changeset
   309
Default functionality, loaded keymaps are cached inside the factory and factory retains ownership of keymap objects.
hgs
parents: 6
diff changeset
   310
*/
hgs
parents: 6
diff changeset
   311
hgs
parents: 6
diff changeset
   312
/*!
hgs
parents: 6
diff changeset
   313
\var HbKeymapFactory::Flag HbKeymapFactory::NoCaching
hgs
parents: 6
diff changeset
   314
hgs
parents: 6
diff changeset
   315
Disabled cache for this function call. Keymaps are read directly from disk and are not stored in cache.
hgs
parents: 6
diff changeset
   316
Ownership of the returned keymaps is transferred to the caller.
hgs
parents: 6
diff changeset
   317
*/
hgs
parents: 6
diff changeset
   318
hgs
parents: 6
diff changeset
   319
/*!
hgs
parents: 6
diff changeset
   320
Returns reference to singleton instance.
hgs
parents: 6
diff changeset
   321
*/
hgs
parents: 6
diff changeset
   322
HbKeymapFactory *HbKeymapFactory::instance()
hgs
parents: 6
diff changeset
   323
{
hgs
parents: 6
diff changeset
   324
    static HbKeymapFactory myInstance;
hgs
parents: 6
diff changeset
   325
    return &myInstance;
hgs
parents: 6
diff changeset
   326
}
hgs
parents: 6
diff changeset
   327
hgs
parents: 6
diff changeset
   328
/*!
hgs
parents: 6
diff changeset
   329
Constructs the object.
hgs
parents: 6
diff changeset
   330
*/
hgs
parents: 6
diff changeset
   331
HbKeymapFactory::HbKeymapFactory()
hgs
parents: 6
diff changeset
   332
{
hgs
parents: 6
diff changeset
   333
    mPrivate = new HbKeymapFactoryPrivate();
hgs
parents: 6
diff changeset
   334
}
hgs
parents: 6
diff changeset
   335
hgs
parents: 6
diff changeset
   336
/*!
hgs
parents: 6
diff changeset
   337
Destructs the object.
hgs
parents: 6
diff changeset
   338
*/
hgs
parents: 6
diff changeset
   339
HbKeymapFactory::~HbKeymapFactory()
hgs
parents: 6
diff changeset
   340
{
hgs
parents: 6
diff changeset
   341
    delete mPrivate;
hgs
parents: 6
diff changeset
   342
}
hgs
parents: 6
diff changeset
   343
hgs
parents: 6
diff changeset
   344
/*!
hgs
parents: 6
diff changeset
   345
Returns a HbKeymap object initialized using keymap resource data in the system. Ownership of the
hgs
parents: 6
diff changeset
   346
HbKeymap object remains with HbKeymapFactory.
hgs
parents: 6
diff changeset
   347
hgs
parents: 6
diff changeset
   348
If no data is found for the given language, 0 is returned.
hgs
parents: 6
diff changeset
   349
hgs
parents: 6
diff changeset
   350
\param language Language for the keymap
hgs
parents: 6
diff changeset
   351
\param country Country for the keymap. If empty or AnyCountry, non-country specific version or a country-specific version will be returned.
hgs
parents: 6
diff changeset
   352
hgs
parents: 6
diff changeset
   353
\sa HbKeymap
hgs
parents: 6
diff changeset
   354
*/
hgs
parents: 6
diff changeset
   355
const HbKeymap *HbKeymapFactory::keymap(const QLocale::Language language, const QLocale::Country country)
hgs
parents: 6
diff changeset
   356
{
hgs
parents: 6
diff changeset
   357
    return keymap(HbInputLanguage(language, country), Default);
hgs
parents: 6
diff changeset
   358
}
hgs
parents: 6
diff changeset
   359
hgs
parents: 6
diff changeset
   360
/*!
hgs
parents: 6
diff changeset
   361
Returns a HbKeymap object initialized using keymap resource data in the system. Ownership of the
hgs
parents: 6
diff changeset
   362
HbKeymap object remains with HbKeymapFactory.
hgs
parents: 6
diff changeset
   363
hgs
parents: 6
diff changeset
   364
If no data is found for the given input language, 0 is returned. If the variant of the input language
hgs
parents: 6
diff changeset
   365
is AnyCountry, the function can return either a keymap with no variant specified or a keymap with any variant.
hgs
parents: 6
diff changeset
   366
hgs
parents: 6
diff changeset
   367
\param language HbInputLanguage defining the language-country combination.
hgs
parents: 6
diff changeset
   368
hgs
parents: 6
diff changeset
   369
\sa HbKeymap
hgs
parents: 6
diff changeset
   370
\sa HbInputLanguage
hgs
parents: 6
diff changeset
   371
*/
hgs
parents: 6
diff changeset
   372
const HbKeymap *HbKeymapFactory::keymap(const HbInputLanguage language)
hgs
parents: 6
diff changeset
   373
{
hgs
parents: 6
diff changeset
   374
    return keymap(language, Default);
hgs
parents: 6
diff changeset
   375
}
hgs
parents: 6
diff changeset
   376
hgs
parents: 6
diff changeset
   377
/*!
hgs
parents: 6
diff changeset
   378
Returns a HbKeymap object initialized using keymap resource data in the system. Ownership of the
hgs
parents: 6
diff changeset
   379
HbKeymap object remains with HbKeymapFactory unless otherwise specified with flags.
hgs
parents: 6
diff changeset
   380
hgs
parents: 6
diff changeset
   381
If no data is found for the given input language, 0 is returned. If the variant of the input language
hgs
parents: 6
diff changeset
   382
is AnyCountry, the function can return either a keymap with no variant specified or a keymap with any variant.
hgs
parents: 6
diff changeset
   383
hgs
parents: 6
diff changeset
   384
\param language HbInputLanguage defining the language-country combination.
hgs
parents: 6
diff changeset
   385
\param flags HbKeymapFactory flags for controlling this keymap loading.
hgs
parents: 6
diff changeset
   386
hgs
parents: 6
diff changeset
   387
\sa HbKeymap
hgs
parents: 6
diff changeset
   388
\sa HbInputLanguage
hgs
parents: 6
diff changeset
   389
\sa HbKeymapFactory::Flags
hgs
parents: 6
diff changeset
   390
*/
hgs
parents: 6
diff changeset
   391
const HbKeymap *HbKeymapFactory::keymap(const HbInputLanguage &language, HbKeymapFactory::Flags flags)
hgs
parents: 6
diff changeset
   392
{
hgs
parents: 6
diff changeset
   393
    if (!flags.testFlag(NoCaching)) {
hgs
parents: 6
diff changeset
   394
        foreach(HbKeymap *keymap, mPrivate->mKeymaps) {
hgs
parents: 6
diff changeset
   395
            if (keymap->language() == language) {
hgs
parents: 6
diff changeset
   396
                return keymap;
hgs
parents: 6
diff changeset
   397
            }
hgs
parents: 6
diff changeset
   398
        }
hgs
parents: 6
diff changeset
   399
    }
hgs
parents: 6
diff changeset
   400
hgs
parents: 6
diff changeset
   401
    HbKeymap *keymap = mPrivate->keymap(language);
hgs
parents: 6
diff changeset
   402
hgs
parents: 6
diff changeset
   403
    if (keymap && !flags.testFlag(NoCaching)) {
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   404
        mPrivate->mKeymaps.append(keymap);
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   405
    }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   406
    return keymap;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   407
}
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   408
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   409
/*!
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   410
Returns a list of available languages (or keymap data files) in the system.
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   411
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   412
\sa HbInputLanguage
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   413
*/
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   414
QList<HbInputLanguage> HbKeymapFactory::availableLanguages()
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   415
{
6
c3690ec91ef8 Revision: 201023
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 5
diff changeset
   416
    HbKeymapFactory *instance = HbKeymapFactory::instance();
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   417
    bool romLanguagesCached = !instance->mPrivate->mRomLanguages.isEmpty();
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   418
    QList<HbInputLanguage> languages;
34
hgs
parents: 6
diff changeset
   419
    QStringList* files = new QStringList();
hgs
parents: 6
diff changeset
   420
    QStringList* romFiles = new QStringList();
hgs
parents: 6
diff changeset
   421
    QStringList paths = HbInputSettingProxy::keymapPluginPaths();
hgs
parents: 6
diff changeset
   422
    removeNonExistingPaths(paths);
hgs
parents: 6
diff changeset
   423
    foreach(const QString &path, paths) {
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   424
        if (path.left(2) == ":/" || path.left(2) == "z:") {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   425
            if (romLanguagesCached) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   426
                continue;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   427
            }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   428
            QDir languagedir(path);
34
hgs
parents: 6
diff changeset
   429
            *romFiles += languagedir.entryList(QStringList(QString("*.txt")), QDir::Files);
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   430
        } else {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   431
            QDir languagedir(path);
34
hgs
parents: 6
diff changeset
   432
            *files += languagedir.entryList(QStringList(QString("*.txt")), QDir::Files);
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   433
        }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   434
    }
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   435
    if (romLanguagesCached) {
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   436
        languages = instance->mPrivate->mRomLanguages;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   437
    } else {
34
hgs
parents: 6
diff changeset
   438
        instance->mPrivate->parseFileNames(*romFiles, languages);
5
627c4a0fd0e7 Revision: 201021
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   439
        instance->mPrivate->mRomLanguages = languages;
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   440
    }
34
hgs
parents: 6
diff changeset
   441
    instance->mPrivate->parseFileNames(*files, languages);
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   442
34
hgs
parents: 6
diff changeset
   443
    delete files;
hgs
parents: 6
diff changeset
   444
    delete romFiles;
0
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   445
    return languages;
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   446
}
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   447
16d8024aca5e Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   448
// End of file