hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mydataprovider.cpp
changeset 1 e48454f237ca
child 2 49c70dcc3f17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mydataprovider.cpp	Mon May 03 13:32:54 2010 +0300
@@ -0,0 +1,236 @@
+/*
+* 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 iconsfrom 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) && !containsRole(i, Qt::DecorationRole)) {//if there is icon, don't request new one
+            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, 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()
+{
+
+    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    
+}
+