phonebookui/cntlistmodel/cnticonfetcher.cpp
author hgs
Fri, 15 Oct 2010 12:24:46 +0300
changeset 81 640d30f4fb64
permissions -rw-r--r--
201041
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 icons for contacts.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <thumbnailmanager_qt.h>
hgs
parents:
diff changeset
    19
#include <cnticonfetcher.h>
hgs
parents:
diff changeset
    20
#include <cntdebug.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
// maximum amount of scheduled jobs; if there are more jobs, the least
hgs
parents:
diff changeset
    23
// important job is cancelled
hgs
parents:
diff changeset
    24
const int MaxIconJobs = 20;
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
// the id that states that no icon is currently pending from thumbnail manager
hgs
parents:
diff changeset
    27
const int NoIconRequest = -1;
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
/*!
hgs
parents:
diff changeset
    30
    \class CntIconJob
hgs
parents:
diff changeset
    31
    \brief Holds info about one icon job.
hgs
parents:
diff changeset
    32
 */
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
/*!
hgs
parents:
diff changeset
    35
    \class CntIconFetcher
hgs
parents:
diff changeset
    36
    \brief CntIconFetcher asynchronously fetches contact icons.
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
    CntIconFetcher queues requests for contact icons that are to be cached.
hgs
parents:
diff changeset
    39
    It fetches the icons later, when asked by the client to do so.
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
    Internally CntIconFetcher uses thumbnail manager to fetch the icons.
hgs
parents:
diff changeset
    42
 */
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
/*!
hgs
parents:
diff changeset
    45
    Creates a CntIconFetcher object.
hgs
parents:
diff changeset
    46
 */
hgs
parents:
diff changeset
    47
CntIconFetcher::CntIconFetcher()
hgs
parents:
diff changeset
    48
    : CntAbstractFetcher(MaxIconJobs),
hgs
parents:
diff changeset
    49
      mThumbnailManager(NULL),
hgs
parents:
diff changeset
    50
      mIconRequestId(NoIconRequest)
hgs
parents:
diff changeset
    51
{
hgs
parents:
diff changeset
    52
    CNT_ENTRY
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
    // create & connect the thumbnail manager
hgs
parents:
diff changeset
    55
    mThumbnailManager = new ThumbnailManager(this);
hgs
parents:
diff changeset
    56
    mThumbnailManager->setMode(ThumbnailManager::Default);
hgs
parents:
diff changeset
    57
    mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForPerformance);
hgs
parents:
diff changeset
    58
    mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailSmall);
hgs
parents:
diff changeset
    59
    connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void *, int, int)),
hgs
parents:
diff changeset
    60
            this, SLOT(forwardIconToClient(QPixmap, void *, int, int)));
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
    CNT_EXIT
hgs
parents:
diff changeset
    63
}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
/*!
hgs
parents:
diff changeset
    66
    Cleans up and destructs the CntIconFetcher object.
hgs
parents:
diff changeset
    67
 */
hgs
parents:
diff changeset
    68
CntIconFetcher::~CntIconFetcher()
hgs
parents:
diff changeset
    69
{
hgs
parents:
diff changeset
    70
    CNT_ENTRY
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
    if (mIconRequestId != NoIconRequest) {
hgs
parents:
diff changeset
    73
        mThumbnailManager->cancelRequest(mIconRequestId);
hgs
parents:
diff changeset
    74
    }
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
    delete mThumbnailManager;
hgs
parents:
diff changeset
    77
    mThumbnailManager = NULL;
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    CNT_EXIT
hgs
parents:
diff changeset
    80
}
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
/*!
hgs
parents:
diff changeset
    83
    Processes the next scheduled job. This function must not be
hgs
parents:
diff changeset
    84
    called until the previous job has completed.
hgs
parents:
diff changeset
    85
 */
hgs
parents:
diff changeset
    86
void CntIconFetcher::processNextJob()
hgs
parents:
diff changeset
    87
{
hgs
parents:
diff changeset
    88
    CNT_ENTRY
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
    Q_ASSERT(mIconRequestId == NoIconRequest);
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    if (hasScheduledJobs()) {
hgs
parents:
diff changeset
    93
        // request icon from thumbnail manager
hgs
parents:
diff changeset
    94
        CntIconJob *job = static_cast<CntIconJob *>(takeNextJob());
hgs
parents:
diff changeset
    95
        mIconRequestName = job->iconName;
hgs
parents:
diff changeset
    96
        mIconRequestId = mThumbnailManager->getThumbnail(mIconRequestName, NULL, 0);
hgs
parents:
diff changeset
    97
        delete job;
hgs
parents:
diff changeset
    98
    } else if (hasCancelledJobs()) {
hgs
parents:
diff changeset
    99
        CntIconJob *job = static_cast<CntIconJob *>(takeNextCancelledJob());
hgs
parents:
diff changeset
   100
        emit iconCancelled(job->iconName);
hgs
parents:
diff changeset
   101
        delete job;
hgs
parents:
diff changeset
   102
    }
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
    CNT_EXIT
hgs
parents:
diff changeset
   105
}
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
/*!
hgs
parents:
diff changeset
   108
    \return true if a job is currently being processed; otherwise returns false.
hgs
parents:
diff changeset
   109
 */
hgs
parents:
diff changeset
   110
bool CntIconFetcher::isProcessingJob()
hgs
parents:
diff changeset
   111
{
hgs
parents:
diff changeset
   112
    return (mIconRequestId != NoIconRequest);
hgs
parents:
diff changeset
   113
}
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
/*!
hgs
parents:
diff changeset
   116
    Forwards an icon from thumbnail manager to the client.
hgs
parents:
diff changeset
   117
 */
hgs
parents:
diff changeset
   118
void CntIconFetcher::forwardIconToClient(const QPixmap &pixmap, void *data, int id, int error)
hgs
parents:
diff changeset
   119
{
hgs
parents:
diff changeset
   120
    CNT_ENTRY
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    Q_UNUSED(data);
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    if (id != mIconRequestId) {
hgs
parents:
diff changeset
   125
        // this pixmap was requested by someone else sharing the same thumbnail manager instance
hgs
parents:
diff changeset
   126
        CNT_EXIT_ARGS("not our pixmap")
hgs
parents:
diff changeset
   127
        return;
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
    mIconRequestId = NoIconRequest;
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    if (error == 0) {
hgs
parents:
diff changeset
   133
        emit iconFetched(mIconRequestName, HbIcon(pixmap));
hgs
parents:
diff changeset
   134
    } else {
hgs
parents:
diff changeset
   135
        emit iconFetched(mIconRequestName, HbIcon());
hgs
parents:
diff changeset
   136
    }
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
    CNT_EXIT
hgs
parents:
diff changeset
   139
}