hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mydataprovider.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 16:57:01 +0300
changeset 2 49c70dcc3f17
parent 1 e48454f237ca
child 3 c863538fcbb6
permissions -rw-r--r--
Revision: 201017 Kit: 201019

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*  Version     : %version: 1 %
*/
#include <QList>
#include "hglogger.h"
#include <hbicon.h>
#include "mydataprovider.h"

//#include "x:\sf\mw\qt\src\openvg\qpixmapdata_vg_p.h"
//typedef VGImage (*pfnVgCreateEGLImageTargetKHR)(VGeglImageKHR);

const int KItemIdRole = Qt::UserRole+1;

const int KThumbnailsPriority = EPriorityLess; //standard priority


MyDataProvider::MyDataProvider(QObject *parent) :
HgDataProviderModel(parent),
mDefaultIcon(new HbIcon(QIcon(QPixmap(":/icons/default.png")))),
mScheduler(new CActiveSchedulerWait()),
mWrapper( new ThumbnailManager() ),
mThumbnailRequestPending(false),
mThumbnailRequestIndex(-1),
mThumbnailRequestID(-1),
mThumbnailsize(ThumbnailManager::ThumbnailMedium),
mMDSLoadInProgress(false)
{
//    TX_ENTRY
    Q_UNUSED(parent);
    mWrapper->setThumbnailSize( mThumbnailsize );
    mWrapper->setQualityPreference( ThumbnailManager::OptimizeForPerformance );

    QObject::connect( mWrapper, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ),
                      this, SLOT( thumbnailReady( QPixmap , void* , int , int )));
    
    doResetModel(); //will read mds data
}

MyDataProvider::~MyDataProvider()
{
//    TX_ENTRY
    delete mDefaultIcon;
    delete mWrapper;
    delete mScheduler;
//    TX_EXIT
}

void MyDataProvider::changeIconSize(ThumbnailManager::ThumbnailSize aThumbnailsize)
{
//    TX_ENTRY
//	we could  remove all icons from cache and put default ones, but probably that would be waste of time, and it's better just to load new icons with correct sizes.
	mThumbnailsize = aThumbnailsize;
	mWrapper->setThumbnailSize( mThumbnailsize );
//    TX_EXIT
}

void MyDataProvider::doRequestData(QList<int> list, bool silent)
{
    TX_ENTRY
	Q_UNUSED(silent);
    QString items = "Requested items:";
    int i = 0;
	for (int idx=0; idx<list.count(); idx++){
        i = list[idx];
		if (containsRole(i, KItemIdRole) ) {
            items += QString("%0 ").arg(i);
			mWaitingThumbnails.append(i);
		}
	}
	TX_LOG_ARGS(items);
    getNextThumbnail();
    TX_EXIT
}

void MyDataProvider::getNextThumbnail()
{
//    TX_ENTRY
    if ( !mThumbnailRequestPending && mWaitingThumbnails.count()){
            int i = mWaitingThumbnails.takeFirst();
            if (i >=0 && i < count() && containsRole(i, KItemIdRole)) {
                int id = (data(i, KItemIdRole)).toInt();
                unsigned long int uId = (unsigned long int)id;
                TX_LOG_ARGS(QString("getThumbnail for index:%0 uID:%1").arg(i).arg(uId));
                void *clientData = reinterpret_cast<void *>(i);
                mThumbnailRequestID = mWrapper->getThumbnail(uId, clientData, KThumbnailsPriority);
                mThumbnailRequestIndex = i;
                mThumbnailRequestPending = true;            
        }
    }
//    TX_EXIT    
}

void MyDataProvider::readMDSData()
{
    mMDSLoadInProgress = true;
}

void MyDataProvider::thumbnailReady( QPixmap pixmap, void* data, int id, int error )
{
//    TX_ENTRY    
    Q_UNUSED(id);
    if (!error && pixmap.rect().height()>0  && pixmap.rect().width()>0 ) {
        int idx = reinterpret_cast<int>(data);
        TX_LOG_ARGS(QString("thumbnailReady idx = %0").arg(idx));
//        updateIcon(idx, HbIcon( QIcon( pixmap ) ) );
//        update(idx, HbIcon( QIcon( pixmap ) ), Qt::DecorationRole, false);
        updateIcon(idx, createIcon(idx, pixmap));
	} else {
        TX_LOG_ARGS(QString("error:%0 id:%0").arg(error).arg(id));
	}
    mThumbnailRequestIndex = -1;
    mThumbnailRequestID = -1;
    mThumbnailRequestPending = false;            
    getNextThumbnail();
//    TX_EXIT
}

void MyDataProvider::doReleaseData(QList<int> list, bool silent)
{
    TX_ENTRY    
    Q_UNUSED(silent);
    int i = 0;
    QString items = "Released items:";
    for (int idx=0;idx<list.count(); idx++){
        i = list[idx];
        if (mThumbnailRequestPending && mThumbnailRequestIndex==i ){
            TX_LOG_ARGS( QString("Cancel also thumbnail request for item %0").arg(i));
            mWrapper->cancelRequest(mThumbnailRequestID);
            mThumbnailRequestIndex = -1;
            mThumbnailRequestID = -1;
            mThumbnailRequestPending = false;
        }
        items += QString("%0 ").arg(i);
        mWaitingThumbnails.removeAll(i);
        releasePixmap(i);
    }
    TX_LOG_ARGS(items);

    getNextThumbnail();
    TX_EXIT        
}

QVariant MyDataProvider::defaultIcon() const
{
    return *mDefaultIcon;
}

void MyDataProvider::HandleSessionOpened(CMdESession& aSession, TInt aError)
{
    Q_UNUSED(aSession);
    Q_UNUSED(aError);	
    mScheduler->AsyncStop();
}

// ----------------------------------------------------------------------------
// HandleQueryCompleted
// ----------------------------------------------------------------------------
//
void MyDataProvider::HandleQueryCompleted(CMdEQuery& aQuery, TInt aError)
{
    Q_UNUSED(aError);	
    clearCache();
    mMDSLoadInProgress = false;
    int size = aQuery.ResultIds().Count();
    
    for(int i = 0; i < size ; i++){
        QList< QPair< QVariant, int > > list;
        unsigned long int id = aQuery.ResultId(i);
        QVariant v;
        v.setValue(id);
        list.append( QPair< QVariant, int >(v, KItemIdRole) );
        int a = count();
        int b = -count();
		int c = a/4 + b/10 + i%30 + i/2;
		QString s = QString("ITEM%1 %2 %3").arg(c).arg(a).arg(b);
		if (i%2){
            s = s.toLower();
		}
        list.append( QPair< QVariant, int >(s, Qt::DisplayRole) );
        list.append( QPair< QVariant, int >(QVariant(a), Qt::UserRole+2) );
        list.append( QPair< QVariant, int >(QVariant(b), Qt::UserRole+3) );
        list.append( QPair< QVariant, int >(QVariant(c), Qt::UserRole+4) );
        
        newItem(&list);
    }
    
    TX_LOG_ARGS( QString("size=%1").arg(count()) );
    
    mScheduler->AsyncStop();
}

void MyDataProvider::doResetModel()
{
    TX_ENTRY
    if (mThumbnailRequestPending && mThumbnailRequestID!=-1){
        mWrapper->cancelRequest(mThumbnailRequestID);
    }
    mThumbnailRequestIndex = -1;
    mThumbnailRequestID = -1;
    mThumbnailRequestPending = false;
    mWaitingThumbnails.clear();
    
    //read MDS data once again
    TRAP_IGNORE(
        CMdESession* session = CMdESession::NewL( *this ); 
        mScheduler->Start();
        
        CMdENamespaceDef& namespaceDef = session->GetDefaultNamespaceDefL();
                
        CMdEObjectDef& objectDef = namespaceDef.GetObjectDefL(_L("Image"));
    
        CMdEObjectQuery* imageQuery = session->NewObjectQueryL( namespaceDef, objectDef, this );
        CleanupStack::PushL( imageQuery );
        imageQuery->SetResultMode( EQueryResultModeId );
        imageQuery->FindL( );
        mScheduler->Start();
        CleanupStack::PopAndDestroy( 1 );
        delete session;        
    );    
    
    
    TX_EXIT    
}