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