--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qtinternetradio/ui/src/irchanneldataprovider.cpp Thu Sep 02 20:17:46 2010 +0300
@@ -0,0 +1,275 @@
+/*
+* 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:
+*
+*/
+
+#include <HbIcon>
+#include <QTimer>
+
+#include "irchanneldataprovider.h"
+#include "irqisdsdatastructure.h"
+#include "irqisdsclient.h"
+#include "irsearchresultdb.h"
+
+const int KBitmapSize = 59;
+const int KDownloadLogoInterval = 10; //msec
+
+IRChannelDataProvider::IRChannelDataProvider(QObject *aParent) : HgDataProviderModel(aParent),
+ iChannelList(NULL), iLogoPreset(NULL), iActivated(false)
+{
+ iDefaultLogo = HbIcon("qtg_large_internet_radio");
+
+ iLogoDownloadTimer = new QTimer(this);
+ iLogoDownloadTimer->setInterval(KDownloadLogoInterval);
+ connect(iLogoDownloadTimer, SIGNAL(timeout()), this, SLOT(downloadNextLogo()));
+
+ iIsdsClient = IRQIsdsClient::openInstance();
+}
+
+IRChannelDataProvider::~IRChannelDataProvider()
+{
+ if (iIsdsClient)
+ {
+ iIsdsClient->closeInstance();
+ iIsdsClient = NULL;
+ }
+
+ delete iLogoPreset;
+ iLogoPreset = NULL;
+
+ clearAndDestroyItems();
+ clearAndDestroyLogos();
+}
+
+void IRChannelDataProvider::activate()
+{
+ iActivated = true;
+ connect(iIsdsClient, SIGNAL(presetLogoDownloaded(IRQPreset* )),
+ this, SLOT(presetLogoDownload(IRQPreset* )));
+ connect(iIsdsClient, SIGNAL(presetLogoDownloadError()),
+ this, SLOT(presetLogoDownloadError()));
+
+ if (iRequestedItems.count() > 0)
+ {
+ iLogoDownloadTimer->start();
+ }
+}
+
+void IRChannelDataProvider::deactivate()
+{
+ iActivated = false;
+ disconnect(iIsdsClient, SIGNAL(presetLogoDownloaded(IRQPreset*)),
+ this, SLOT(presetLogoDownload(IRQPreset* )));
+ disconnect(iIsdsClient, SIGNAL(presetLogoDownloadError()),
+ this, SLOT(presetLogoDownloadError()));
+
+ iRequestedItems.clear();
+ iIsdsClient->isdsLogoDownCancelTransaction();
+ iLogoDownloadTimer->stop();
+}
+
+IRQChannelItem* IRChannelDataProvider::getChannelItemByIndex(int aIndex)
+{
+ if( aIndex < 0 || aIndex >= iChannelList->count() )
+ {
+ return NULL;
+ }
+
+ return iChannelList->at(aIndex);
+}
+
+void IRChannelDataProvider::doReleaseData(QList<int> aList, bool aSilent)
+{
+ Q_UNUSED(aSilent);
+ iIsdsClient->isdsLogoDownCancelTransaction();
+ iLogoDownloadTimer->stop();
+
+ int count = aList.count();
+ int index = 0;
+ for (int idx = 0; idx < count; ++idx)
+ {
+ index = aList[idx];
+ releasePixmap(index);
+ //if the index is saved in iRequestedItems, remove it
+ iRequestedItems.removeOne(index);
+ }
+}
+
+void IRChannelDataProvider::doRequestData(QList<int> aList, bool aSilent)
+{
+ Q_UNUSED(aSilent);
+ int count = aList.count();
+ int index = 0;
+ for (int idx = 0; idx < count; ++idx)
+ {
+ index = aList[idx];
+ if (index < iChannelList->count())
+ {
+ if (iChannelList->at(index)->imageURL != "")
+ {
+ if (NULL == iLogos[index])
+ {
+ //logo is not downloaded, add to requested items
+ iRequestedItems.append(index);
+ }
+ else
+ {
+ //logo is already downloaded, update icon
+ updateIcon(index, *iLogos[index]);
+ }
+ }
+ }
+ }
+
+ if (iActivated && iRequestedItems.count() > 0)
+ {
+ iLogoDownloadTimer->start();
+ }
+}
+
+QVariant IRChannelDataProvider::defaultIcon() const
+{
+ return iDefaultLogo;
+}
+
+void IRChannelDataProvider::doResetModel()
+{
+ int count = iChannelList->count();
+ for (int i = 0; i < count; ++i)
+ {
+ QList< QPair< QVariant, int > > item;
+ QVariantList list;
+ list.append(iChannelList->at(i)->channelName);
+ QString tempDes = iChannelList->at(i)->shortDescription;
+ if( 0 == tempDes.length() )
+ {
+ tempDes = " ";
+ }
+ list.append(tempDes);
+ item.append( QPair<QVariant, int>(list, Qt::DisplayRole));
+
+ newItem(&item);
+ }
+}
+
+//data received from ISDS server, add items
+void IRChannelDataProvider::updateData(QList<IRQChannelItem*> *aPushItemsList)
+{
+ if (NULL == aPushItemsList)
+ {
+ return;
+ }
+
+ if (iChannelList != aPushItemsList)
+ {
+ clearAndDestroyItems();
+ clearAndDestroyLogos();
+
+ iChannelList = aPushItemsList;
+ iRequestedItems.clear();
+ clearCache();
+ resetModel();
+ emit dataAvailable();
+ }
+}
+
+void IRChannelDataProvider::presetLogoDownload(IRQPreset* aPreset)
+{
+ if( NULL == aPreset )
+ {
+ presetLogoDownloadError();
+ return;
+ }
+
+ delete iLogoPreset;
+ iLogoPreset = aPreset;
+
+ if (iLogoPreset->logoData != KNullDesC8)
+ {
+ QPixmap tempMap;
+ const unsigned char * logoData = iLogoPreset->logoData.Ptr();
+ bool ret = tempMap.loadFromData(logoData, iLogoPreset->logoData.Length());
+
+ if( ret )
+ {
+ QIcon convertIcon(tempMap);
+ HbIcon *hbIcon = new HbIcon(convertIcon);
+ int index = iRequestedItems[0];
+ iLogos[index] = hbIcon;
+ updateIcon(index, *hbIcon);
+ iRequestedItems.removeAt(0);
+ if ( iRequestedItems.count() > 0 )
+ {
+ iLogoDownloadTimer->start();
+ }
+ return;
+ }
+ }
+
+ presetLogoDownloadError();
+}
+
+void IRChannelDataProvider::presetLogoDownloadError()
+{
+ // if the logo download fails, try to download the next
+ iRequestedItems.removeAt(0);
+ if ( iRequestedItems.count() > 0 )
+ {
+ iLogoDownloadTimer->start();
+ }
+}
+
+void IRChannelDataProvider::downloadNextLogo()
+{
+ iLogoDownloadTimer->stop();
+
+ if (iRequestedItems.count() > 0)
+ {
+ startDownloading(iRequestedItems[0]);
+ }
+}
+
+void IRChannelDataProvider::startDownloading(int aIndex)
+{
+ QString url = iChannelList->at(aIndex)->imageURL;
+ IRQPreset tempPreset;
+ tempPreset.imgUrl = url;
+ tempPreset.type = IRQPreset::EIsds;
+
+ iIsdsClient->isdsLogoDownSendRequest(&tempPreset, 0, KBitmapSize, KBitmapSize);
+}
+
+void IRChannelDataProvider::clearAndDestroyItems()
+{
+ if (iChannelList)
+ {
+ for (QList<IRQChannelItem*>::iterator it = iChannelList->begin(); it != iChannelList->end(); ++it)
+ {
+ delete *it;
+ }
+ delete iChannelList;
+ iChannelList = NULL;
+ }
+}
+
+void IRChannelDataProvider::clearAndDestroyLogos()
+{
+ for (QMap<int, HbIcon*>::iterator it = iLogos.begin(); it != iLogos.end(); ++it)
+ {
+ delete it.value();
+ }
+
+ iLogos.clear();
+}