phonebookui/cntlistmodel/cntinfofetcher.cpp
author hgs
Tue, 19 Oct 2010 12:51:10 +0300
changeset 84 63017c97b1d6
parent 81 640d30f4fb64
permissions -rw-r--r--
201041_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
81
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 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: Fetches visual info about contacts.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QPluginLoader>
hgs
parents:
diff changeset
    19
#include <QDir>
hgs
parents:
diff changeset
    20
#include <qtcontacts.h>
hgs
parents:
diff changeset
    21
#include <cntinfofetcher.h>
hgs
parents:
diff changeset
    22
#include <cntinfoproviderfactory.h>
hgs
parents:
diff changeset
    23
#include <cntinfoprovider.h>
hgs
parents:
diff changeset
    24
#include <cntdefaultinfoprovider.h>
hgs
parents:
diff changeset
    25
#include <cntpresenceinfoprovider.h>
hgs
parents:
diff changeset
    26
#include <cntdebug.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/*!
hgs
parents:
diff changeset
    29
    \class CntInfoCacheItem
hgs
parents:
diff changeset
    30
    \brief Cache item that holds some visual info about a contact.
hgs
parents:
diff changeset
    31
 */
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/*!
hgs
parents:
diff changeset
    34
    \class CntInfoFetcher
hgs
parents:
diff changeset
    35
    \brief CntInfoFetcher asynchronously fetches visual info about contacts.
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
    CntInfoFetcher queues requests for contact info that is to be cached.
hgs
parents:
diff changeset
    38
    It fetches the info later, when asked by the client to do so.
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
    There are three pieces of info that is fetched:
hgs
parents:
diff changeset
    41
      - secondary text, e.g. phone number
hgs
parents:
diff changeset
    42
      - primary icon, e.g. avatar for contact
hgs
parents:
diff changeset
    43
      - secondary icon, e.g. presence status
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
    Internally CntInfoFetcher uses plugins (info providers) to fetch the data.
hgs
parents:
diff changeset
    46
 */
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
// maximum amount of scheduled jobs; if there are more jobs, the least
hgs
parents:
diff changeset
    49
// important job is cancelled
hgs
parents:
diff changeset
    50
const int MaxInfoJobs = 20;
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
// directory of info providers
hgs
parents:
diff changeset
    53
const char *CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY = "/resource/qt/plugins/contacts/infoproviders/";
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
/*!
hgs
parents:
diff changeset
    56
    Creates a CntIconFetcher object.
hgs
parents:
diff changeset
    57
 */
hgs
parents:
diff changeset
    58
CntInfoFetcher::CntInfoFetcher(QContactManager *contactManager)
hgs
parents:
diff changeset
    59
    : CntAbstractFetcher(MaxInfoJobs),
hgs
parents:
diff changeset
    60
      mContactManager(contactManager)
hgs
parents:
diff changeset
    61
{
hgs
parents:
diff changeset
    62
    CNT_ENTRY
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
    // create static info provider plugins
hgs
parents:
diff changeset
    65
    mInfoProviders.insert(new CntDefaultInfoProvider(), ContactInfoAllFields);
hgs
parents:
diff changeset
    66
    mInfoProviders.insert(new CntPresenceInfoProvider(), ContactInfoIcon2Field);
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
    // load dynamic info provider plugins
hgs
parents:
diff changeset
    69
    QDir pluginsDir(CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY);
hgs
parents:
diff changeset
    70
    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
hgs
parents:
diff changeset
    71
        // create plugin loader
hgs
parents:
diff changeset
    72
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
hgs
parents:
diff changeset
    73
        if (pluginLoader.load()) {
hgs
parents:
diff changeset
    74
            CntInfoProviderFactory *factory = qobject_cast<CntInfoProviderFactory*>(pluginLoader.instance());
hgs
parents:
diff changeset
    75
            if (factory) {
hgs
parents:
diff changeset
    76
                CntInfoProvider *provider = factory->infoProvider();
hgs
parents:
diff changeset
    77
                mInfoProviders.insert(provider, provider->supportedFields());
hgs
parents:
diff changeset
    78
            }
hgs
parents:
diff changeset
    79
        }
hgs
parents:
diff changeset
    80
    }
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    // connect the providers
hgs
parents:
diff changeset
    83
    QMapIterator<CntInfoProvider*, ContactInfoFields> i(mInfoProviders);
hgs
parents:
diff changeset
    84
    while (i.hasNext()) {
hgs
parents:
diff changeset
    85
        i.next();
hgs
parents:
diff changeset
    86
        connect(static_cast<CntInfoProvider*>(i.key()),
hgs
parents:
diff changeset
    87
                SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)),
hgs
parents:
diff changeset
    88
                this,
hgs
parents:
diff changeset
    89
                SLOT(forwardInfoToClient(CntInfoProvider*, int, ContactInfoField, const QString&)));
hgs
parents:
diff changeset
    90
    }
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    CNT_EXIT
hgs
parents:
diff changeset
    93
}
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
/*!
hgs
parents:
diff changeset
    96
    Cleans up and destructs the CntIconFetcher object.
hgs
parents:
diff changeset
    97
 */
hgs
parents:
diff changeset
    98
CntInfoFetcher::~CntInfoFetcher()
hgs
parents:
diff changeset
    99
{
hgs
parents:
diff changeset
   100
    CNT_ENTRY
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
    qDeleteAll(mInfoProviders.keys());
hgs
parents:
diff changeset
   103
    mInfoProviders.clear();
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
    CNT_EXIT
hgs
parents:
diff changeset
   106
}
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
/*!
hgs
parents:
diff changeset
   109
    Processes the next scheduled job. This function must not be
hgs
parents:
diff changeset
   110
    called until the previous job has completed.
hgs
parents:
diff changeset
   111
 */
hgs
parents:
diff changeset
   112
void CntInfoFetcher::processNextJob()
hgs
parents:
diff changeset
   113
{
hgs
parents:
diff changeset
   114
    CNT_ENTRY
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
    if (hasScheduledJobs()) {
hgs
parents:
diff changeset
   117
        // get the next job
hgs
parents:
diff changeset
   118
        CntInfoJob *job = static_cast<CntInfoJob *>(takeNextJob());
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
        // fetch a QContact object
hgs
parents:
diff changeset
   121
        QContactFetchHint restrictions;
hgs
parents:
diff changeset
   122
        restrictions.setOptimizationHints(QContactFetchHint::NoRelationships);
hgs
parents:
diff changeset
   123
        QContact contact = mContactManager->contact(job->contactId, restrictions);
hgs
parents:
diff changeset
   124
        
hgs
parents:
diff changeset
   125
        // request contact info from providers
hgs
parents:
diff changeset
   126
        QMapIterator<CntInfoProvider*, ContactInfoFields> i(mInfoProviders);
hgs
parents:
diff changeset
   127
        while (i.hasNext()) {
hgs
parents:
diff changeset
   128
            i.next();
hgs
parents:
diff changeset
   129
            if (i.value() != 0) {
hgs
parents:
diff changeset
   130
                i.key()->requestInfo(contact, i.value());
hgs
parents:
diff changeset
   131
            }
hgs
parents:
diff changeset
   132
        }
hgs
parents:
diff changeset
   133
        
hgs
parents:
diff changeset
   134
        delete job;
hgs
parents:
diff changeset
   135
    } else if (hasCancelledJobs()) {
hgs
parents:
diff changeset
   136
        CntInfoJob *cancelledJob = static_cast<CntInfoJob *>(takeNextCancelledJob());
hgs
parents:
diff changeset
   137
        emit infoCancelled(cancelledJob->contactId);
hgs
parents:
diff changeset
   138
        delete cancelledJob;
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
    CNT_EXIT
hgs
parents:
diff changeset
   142
}
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
/*!
hgs
parents:
diff changeset
   145
    \return true if a job is currently being processed; otherwise returns false.
hgs
parents:
diff changeset
   146
 */
hgs
parents:
diff changeset
   147
bool CntInfoFetcher::isProcessingJob()
hgs
parents:
diff changeset
   148
{
hgs
parents:
diff changeset
   149
    return false;
hgs
parents:
diff changeset
   150
}
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
/*!
hgs
parents:
diff changeset
   153
    Forward info from a provider to the client.
hgs
parents:
diff changeset
   154
 */
hgs
parents:
diff changeset
   155
void CntInfoFetcher::forwardInfoToClient(CntInfoProvider *sender,
hgs
parents:
diff changeset
   156
                                         int contactId,
hgs
parents:
diff changeset
   157
                                         ContactInfoField field,
hgs
parents:
diff changeset
   158
                                         const QString &text)
hgs
parents:
diff changeset
   159
{
hgs
parents:
diff changeset
   160
    CNT_ENTRY
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
    // there can be 3rd party info providers, so we cannot blindly trust them;
hgs
parents:
diff changeset
   163
    // info is emitted iff:
hgs
parents:
diff changeset
   164
    if (mInfoProviders.contains(sender)
hgs
parents:
diff changeset
   165
        && ((field & (field - 1)) == 0)                         // 1) exactly one field bit is set in parameter 'field'
hgs
parents:
diff changeset
   166
        && ((field & mInfoProviders.value(sender)) != 0)) {     // 2) the field bit has been assigned to this provider
hgs
parents:
diff changeset
   167
        emit infoUpdated(contactId, field, text);
hgs
parents:
diff changeset
   168
    }
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
    CNT_EXIT
hgs
parents:
diff changeset
   171
}