emailservices/nmutilities/src/emailmru.cpp
author hgs
Wed, 15 Sep 2010 12:09:55 +0300
changeset 68 83cc6bae1de8
child 74 6c59112cfd31
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  Object for accessing most recent used email addresses and
hgs
parents:
diff changeset
    15
 * display names.
hgs
parents:
diff changeset
    16
 *
hgs
parents:
diff changeset
    17
 */
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "emailtrace.h"
hgs
parents:
diff changeset
    20
#include "emailmru.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <XQSettingsManager>
hgs
parents:
diff changeset
    23
#include <XQCentralRepositoryUtils>
hgs
parents:
diff changeset
    24
#include <XQCentralRepositorySearchCriteria>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
/*!
hgs
parents:
diff changeset
    27
    Constructor
hgs
parents:
diff changeset
    28
 */
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
// ID 0, Last saved ID.
hgs
parents:
diff changeset
    31
// ID 1, Count of MRU Items.
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
EmailMRU::EmailMRU()
hgs
parents:
diff changeset
    34
{
hgs
parents:
diff changeset
    35
    NM_FUNCTION;
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
    mRepositoryManager = new XQSettingsManager();
hgs
parents:
diff changeset
    38
    Q_CHECK_PTR(mRepositoryManager);
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
    mLatestIndex = readCenRep(currentIndexKey).toInt();
hgs
parents:
diff changeset
    41
    mCount = readCenRep(countKey).toInt();
hgs
parents:
diff changeset
    42
}
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
/*!
hgs
parents:
diff changeset
    45
    Destructor
hgs
parents:
diff changeset
    46
 */
hgs
parents:
diff changeset
    47
EmailMRU::~EmailMRU()
hgs
parents:
diff changeset
    48
{
hgs
parents:
diff changeset
    49
    NM_FUNCTION;
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
    QString entryIndex;
hgs
parents:
diff changeset
    52
    entryIndex.setNum(mLatestIndex);
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
    QString count;
hgs
parents:
diff changeset
    55
    count.setNum(mCount);
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
    writeCenRep(currentIndexKey, entryIndex);
hgs
parents:
diff changeset
    58
    writeCenRep(countKey, count);
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    delete mRepositoryManager;
hgs
parents:
diff changeset
    61
}
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
/*!
hgs
parents:
diff changeset
    64
    Add entry to MRU database
hgs
parents:
diff changeset
    65
    \param displayName
hgs
parents:
diff changeset
    66
    \param emailAddress
hgs
parents:
diff changeset
    67
    \return success, was the update operation successful
hgs
parents:
diff changeset
    68
 */
hgs
parents:
diff changeset
    69
bool EmailMRU::updateMRU(QString displayName, QString emailAddress)
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
    NM_FUNCTION;
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    bool success = false;
hgs
parents:
diff changeset
    74
    qint32 foundEntryIndex = searchForAddress(emailAddress);
hgs
parents:
diff changeset
    75
    if (foundEntryIndex) {
hgs
parents:
diff changeset
    76
        success = updateEntry(foundEntryIndex, displayName);
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    else {
hgs
parents:
diff changeset
    80
        qint32 entryIndex = getNextEntryIndex();
hgs
parents:
diff changeset
    81
        success = writeEntry(entryIndex, displayName, emailAddress);
hgs
parents:
diff changeset
    82
        mCount++;
hgs
parents:
diff changeset
    83
        if (mCount > emailAddressHistorySize) {
hgs
parents:
diff changeset
    84
            mCount = emailAddressHistorySize;
hgs
parents:
diff changeset
    85
        }
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
    return success;
hgs
parents:
diff changeset
    89
}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
/*!
hgs
parents:
diff changeset
    92
    Get the number of entries
hgs
parents:
diff changeset
    93
    \return number of entries
hgs
parents:
diff changeset
    94
 */
hgs
parents:
diff changeset
    95
quint32 EmailMRU::entryCount() const
hgs
parents:
diff changeset
    96
{
hgs
parents:
diff changeset
    97
    return mCount;
hgs
parents:
diff changeset
    98
}
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
/*!
hgs
parents:
diff changeset
   101
    Get entry details
hgs
parents:
diff changeset
   102
    \param entryIndex entry index to look for
hgs
parents:
diff changeset
   103
    \param displayName will contain displayname of entry if found
hgs
parents:
diff changeset
   104
    \param address will contain address of entry if found
hgs
parents:
diff changeset
   105
    \return success
hgs
parents:
diff changeset
   106
 */
hgs
parents:
diff changeset
   107
bool EmailMRU::getEntry(qint32 entryIndex, QString &displayName, QString &address)
hgs
parents:
diff changeset
   108
{
hgs
parents:
diff changeset
   109
    NM_FUNCTION;
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
    bool success = false;
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
    if ((entryIndex >= 1) && (mCount > 0)) {
hgs
parents:
diff changeset
   114
        displayName = readCenRep(nameKeyByEntryIndex(entryIndex));
hgs
parents:
diff changeset
   115
        address = readCenRep(addressKeyByEntryIndex(entryIndex));
hgs
parents:
diff changeset
   116
        success = true;
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
        if (address.size()==0) {
hgs
parents:
diff changeset
   119
            success = false;
hgs
parents:
diff changeset
   120
        }
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
    return success;
hgs
parents:
diff changeset
   124
}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
/*!
hgs
parents:
diff changeset
   127
    Resets repository
hgs
parents:
diff changeset
   128
 */
hgs
parents:
diff changeset
   129
void EmailMRU::reset()
hgs
parents:
diff changeset
   130
{
hgs
parents:
diff changeset
   131
    NM_FUNCTION;
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    XQCentralRepositoryUtils utils(*mRepositoryManager);
hgs
parents:
diff changeset
   134
    utils.resetRepository(emailMruRepositoryKey);
hgs
parents:
diff changeset
   135
    mLatestIndex = 0;
hgs
parents:
diff changeset
   136
    mCount = 0;
hgs
parents:
diff changeset
   137
}
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
/*!
hgs
parents:
diff changeset
   140
    Writes to central repository
hgs
parents:
diff changeset
   141
    \param index where to write
hgs
parents:
diff changeset
   142
    \param value what to write
hgs
parents:
diff changeset
   143
    \return success, whether write operation succeeded
hgs
parents:
diff changeset
   144
 */
hgs
parents:
diff changeset
   145
bool EmailMRU::writeCenRep(qint32 index, QString value)
hgs
parents:
diff changeset
   146
{
hgs
parents:
diff changeset
   147
    NM_FUNCTION;
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
    XQCentralRepositorySettingsKey writeKey(emailMruRepositoryKey, index);
hgs
parents:
diff changeset
   150
    bool success = mRepositoryManager->writeItemValue(writeKey, value);
hgs
parents:
diff changeset
   151
    if (!success) {
hgs
parents:
diff changeset
   152
        XQCentralRepositoryUtils utils(*mRepositoryManager);
hgs
parents:
diff changeset
   153
        success = utils.createKey(writeKey, value);
hgs
parents:
diff changeset
   154
    }
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
    return success;
hgs
parents:
diff changeset
   157
}
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
/*!
hgs
parents:
diff changeset
   160
    Reads from central repository
hgs
parents:
diff changeset
   161
    \param index to read
hgs
parents:
diff changeset
   162
    \return value
hgs
parents:
diff changeset
   163
 */
hgs
parents:
diff changeset
   164
QString EmailMRU::readCenRep(qint32 index)
hgs
parents:
diff changeset
   165
{
hgs
parents:
diff changeset
   166
    NM_FUNCTION;
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
    XQCentralRepositorySettingsKey readKey(emailMruRepositoryKey, index);
hgs
parents:
diff changeset
   169
    return mRepositoryManager->readItemValue(readKey, XQSettingsManager::TypeString).value<QString> ();
hgs
parents:
diff changeset
   170
}
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
/*!
hgs
parents:
diff changeset
   173
    Translates entry indexes into real central repository indexes
hgs
parents:
diff changeset
   174
    \return central repository index
hgs
parents:
diff changeset
   175
 */
hgs
parents:
diff changeset
   176
quint32 EmailMRU::getNextEntryIndex()
hgs
parents:
diff changeset
   177
{
hgs
parents:
diff changeset
   178
    NM_FUNCTION;
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
    mLatestIndex++;
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
    if (mLatestIndex > emailAddressHistorySize) {
hgs
parents:
diff changeset
   183
        mLatestIndex = 1;
hgs
parents:
diff changeset
   184
    }
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
    return mLatestIndex;
hgs
parents:
diff changeset
   187
}
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
/*!
hgs
parents:
diff changeset
   190
    Translates central repository indexes into entry index
hgs
parents:
diff changeset
   191
    \param realIndex central repository index
hgs
parents:
diff changeset
   192
    \return entry index
hgs
parents:
diff changeset
   193
 */
hgs
parents:
diff changeset
   194
qint32 EmailMRU::entryIndex(qint32 crKey)
hgs
parents:
diff changeset
   195
{
hgs
parents:
diff changeset
   196
    NM_FUNCTION;
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
    qint32 entryIndex = 0;
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
    if (crKey%2 == 0){
hgs
parents:
diff changeset
   201
        entryIndex = crKey/2;
hgs
parents:
diff changeset
   202
    }
hgs
parents:
diff changeset
   203
    else {
hgs
parents:
diff changeset
   204
        entryIndex = (crKey-1)/2;
hgs
parents:
diff changeset
   205
    }
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
    return entryIndex;
hgs
parents:
diff changeset
   208
}
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
/*!
hgs
parents:
diff changeset
   211
    Translates entry index into cenrep email address index
hgs
parents:
diff changeset
   212
    \param entryIndex
hgs
parents:
diff changeset
   213
    \return cenrep email address index
hgs
parents:
diff changeset
   214
 */
hgs
parents:
diff changeset
   215
qint32 EmailMRU::addressKeyByEntryIndex(qint32 entryIndex)
hgs
parents:
diff changeset
   216
{
hgs
parents:
diff changeset
   217
    return entryIndex*2+1;
hgs
parents:
diff changeset
   218
}
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
/*!
hgs
parents:
diff changeset
   221
    Translates entry index into cenrep displayname index
hgs
parents:
diff changeset
   222
    \param entryIndex
hgs
parents:
diff changeset
   223
    \return cenrep displayname index
hgs
parents:
diff changeset
   224
 */
hgs
parents:
diff changeset
   225
qint32 EmailMRU::nameKeyByEntryIndex(qint32 entryIndex)
hgs
parents:
diff changeset
   226
{
hgs
parents:
diff changeset
   227
    return entryIndex*2;
hgs
parents:
diff changeset
   228
}
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
/*!
hgs
parents:
diff changeset
   231
    Checks if MRU list already contains the address
hgs
parents:
diff changeset
   232
    \param address to search
hgs
parents:
diff changeset
   233
    \return entry index of found address, zero if not found
hgs
parents:
diff changeset
   234
 */
hgs
parents:
diff changeset
   235
qint32 EmailMRU::searchForAddress(QString address)
hgs
parents:
diff changeset
   236
{
hgs
parents:
diff changeset
   237
    NM_FUNCTION;
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
    quint32 partialKey(0x00000000);
hgs
parents:
diff changeset
   240
    quint32 bitMask(0x00000000);
hgs
parents:
diff changeset
   241
    XQCentralRepositorySearchCriteria criteria(emailMruRepositoryKey, partialKey, bitMask);
hgs
parents:
diff changeset
   242
    criteria.setValueCriteria(address);
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
    // Find the keys.
hgs
parents:
diff changeset
   245
    XQCentralRepositoryUtils utils(*mRepositoryManager);
hgs
parents:
diff changeset
   246
    QList<XQCentralRepositorySettingsKey> foundKeys = utils.findKeys(criteria);
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
    qint32 index = 0;
hgs
parents:
diff changeset
   249
    // We should only get one key as a result.
hgs
parents:
diff changeset
   250
    if (foundKeys.count() == 1) {
hgs
parents:
diff changeset
   251
        index = foundKeys[0].key();
hgs
parents:
diff changeset
   252
    }
hgs
parents:
diff changeset
   253
    return entryIndex(index);
hgs
parents:
diff changeset
   254
}
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
/*!
hgs
parents:
diff changeset
   257
    Moves entry, will overwrite the newEntryIndex
hgs
parents:
diff changeset
   258
    \param oldEntryIndex entry to be moved
hgs
parents:
diff changeset
   259
    \param newEntryIndex where to move
hgs
parents:
diff changeset
   260
 */
hgs
parents:
diff changeset
   261
void EmailMRU::moveEntry(qint32 oldEntryIndex, qint32 newEntryIndex)
hgs
parents:
diff changeset
   262
{
hgs
parents:
diff changeset
   263
    NM_FUNCTION;
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
    // Save the values to be moved
hgs
parents:
diff changeset
   266
    QString name = readCenRep(nameKeyByEntryIndex(oldEntryIndex));
hgs
parents:
diff changeset
   267
    QString address = readCenRep(addressKeyByEntryIndex(oldEntryIndex));
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
    // Overwrite values into new entry
hgs
parents:
diff changeset
   270
    writeEntry(newEntryIndex, name, address);
hgs
parents:
diff changeset
   271
}
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
/*!
hgs
parents:
diff changeset
   274
    Updates displayname and sets entry as newest
hgs
parents:
diff changeset
   275
    \param entryIndex to update
hgs
parents:
diff changeset
   276
    \param newDisplayName
hgs
parents:
diff changeset
   277
    \return success was update operation successfull
hgs
parents:
diff changeset
   278
 */
hgs
parents:
diff changeset
   279
bool EmailMRU::updateEntry(qint32 entryIndex, QString newDisplayName)
hgs
parents:
diff changeset
   280
{
hgs
parents:
diff changeset
   281
    NM_FUNCTION;
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
    // Save address
hgs
parents:
diff changeset
   284
    QString address = readCenRep(addressKeyByEntryIndex(entryIndex));
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
    // Move all entries following the one to be updated
hgs
parents:
diff changeset
   287
    // until we go past the newest entry
hgs
parents:
diff changeset
   288
    for (qint32 i = entryIndex, j = 0; i != mLatestIndex;) {
hgs
parents:
diff changeset
   289
        j = i+1;
hgs
parents:
diff changeset
   290
        if (j > emailAddressHistorySize) j = 1;
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
        moveEntry(j, i);
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
        i++;
hgs
parents:
diff changeset
   295
        if (i > emailAddressHistorySize) i = 1;
hgs
parents:
diff changeset
   296
    }
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
    // Write the updated entry as the newest entry
hgs
parents:
diff changeset
   299
    return writeEntry(mLatestIndex, newDisplayName, address);
hgs
parents:
diff changeset
   300
}
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
/*!
hgs
parents:
diff changeset
   303
    Writes entry. Overwrites any existing data at give index
hgs
parents:
diff changeset
   304
    \param entryIndex to write
hgs
parents:
diff changeset
   305
    \param displayName
hgs
parents:
diff changeset
   306
    \param emailAddress
hgs
parents:
diff changeset
   307
    \return success was update operation successfull
hgs
parents:
diff changeset
   308
 */
hgs
parents:
diff changeset
   309
bool EmailMRU::writeEntry(qint32 entryIndex, QString displayName, QString emailAddress)
hgs
parents:
diff changeset
   310
{
hgs
parents:
diff changeset
   311
    NM_FUNCTION;
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
    bool nameSuccess = false;
hgs
parents:
diff changeset
   314
    bool addressSuccess = false;
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
    nameSuccess = writeCenRep(nameKeyByEntryIndex(entryIndex), displayName);
hgs
parents:
diff changeset
   317
    if (nameSuccess) {
hgs
parents:
diff changeset
   318
        addressSuccess = writeCenRep(addressKeyByEntryIndex(entryIndex), emailAddress);
hgs
parents:
diff changeset
   319
    }
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
    // Writing name succeeded but writing address not, we destroy the name
hgs
parents:
diff changeset
   322
    if (!addressSuccess) {
hgs
parents:
diff changeset
   323
        XQCentralRepositoryUtils utils(*mRepositoryManager);
hgs
parents:
diff changeset
   324
        XQCentralRepositorySettingsKey deleteKey(emailMruRepositoryKey, nameKeyByEntryIndex(entryIndex));
hgs
parents:
diff changeset
   325
        utils.deleteKey(deleteKey);
hgs
parents:
diff changeset
   326
    }
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
    return (nameSuccess & addressSuccess);
hgs
parents:
diff changeset
   329
}
hgs
parents:
diff changeset
   330
hgs
parents:
diff changeset
   331
/*!
hgs
parents:
diff changeset
   332
    Writes entry. Overwrites any existing data at give index
hgs
parents:
diff changeset
   333
    \return contacts setting for lastname / firstname order.
hgs
parents:
diff changeset
   334
 */
hgs
parents:
diff changeset
   335
int EmailMRU::nameOrder()
hgs
parents:
diff changeset
   336
{
hgs
parents:
diff changeset
   337
    XQSettingsManager *repositoryManager = new XQSettingsManager();
hgs
parents:
diff changeset
   338
    Q_CHECK_PTR(repositoryManager);
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
    XQCentralRepositorySettingsKey readKey(contactsRepositoryKey,
hgs
parents:
diff changeset
   341
                                           nameOrderKey);
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
    int nameOrder = repositoryManager->readItemValue(readKey,
hgs
parents:
diff changeset
   344
                                                     XQSettingsManager::TypeInt).toInt();
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
    delete repositoryManager;
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
    return nameOrder;
hgs
parents:
diff changeset
   349
}
hgs
parents:
diff changeset
   350