diff -r 5723da102db1 -r 38bbf2dcd608 qtinternetradio/ui/src/irhistorymodel.cpp --- a/qtinternetradio/ui/src/irhistorymodel.cpp Fri Sep 17 08:27:59 2010 +0300 +++ b/qtinternetradio/ui/src/irhistorymodel.cpp Mon Oct 04 00:07:46 2010 +0300 @@ -15,37 +15,58 @@ * */ -#include +#include +#include -#include "irqsonghistoryinfo.h" -#include "irqsonghistoryengine.h" +#include "irqisdsdatastructure.h" +#include "channelhistorywrapper.h" +#include "urlinfowrapper.h" #include "irhistorymodel.h" +#include "irqisdsclient.h" +#include "irlogoprovider.h" -IRHistoryModel::IRHistoryModel(QObject *aParent) : QAbstractListModel(aParent) +IRHistoryModel::IRHistoryModel(QObject *aParent) : QAbstractListModel(aParent), + iHistoryEngine(NULL), iUrlInfoWrapper(NULL), iStationLogo(NULL), + iIsdsClient(NULL), iLogoProvider(NULL), iTimer(NULL) { iStationLogo = new HbIcon("qtg_large_internet_radio"); - iHistoryEngine = IRQSongHistoryEngine::openInstance(); - getAllList(); + iHistoryEngine = new channelHistoryWrapper(); + + iUrlInfoWrapper = new urlInfoWrapper(); + + iIsdsClient = IRQIsdsClient::openInstance(); + iLogoProvider = new IRLogoProvider(iIsdsClient); + + iTimer = new QTimer(); + iTimer->setInterval(10); + connect(iTimer, SIGNAL(timeout()), this, SLOT(downloadNextLogo())); + + refreshModel(); } IRHistoryModel::~IRHistoryModel() { + clearModel(); + delete iStationLogo; iStationLogo = NULL; - - clearAndDestroyLogos(); - - while (!iHistoryList.isEmpty()) + + delete iHistoryEngine; + iHistoryEngine = NULL; + + delete iUrlInfoWrapper; + iUrlInfoWrapper = NULL; + + stopDownloadingLogo(); + + delete iLogoProvider; + if (iIsdsClient) { - delete iHistoryList.takeFirst(); + iIsdsClient->closeInstance(); + iIsdsClient = NULL; } - - if (iHistoryEngine) - { - iHistoryEngine->closeInstance(); - iHistoryEngine = NULL; - } + delete iTimer; } int IRHistoryModel::rowCount(const QModelIndex &aParent) const @@ -56,11 +77,17 @@ QString IRHistoryModel::getImageUrl(int aRow) const { - return iHistoryList.at(aRow)->getImageUrl(); + return iHistoryList.at(aRow)->imgUrl; } void IRHistoryModel::setLogo(HbIcon *aIcon, int aIndex) { + int elementCountNeedToAdd = aIndex + 1 - iLogos.size(); + while (elementCountNeedToAdd > 0) + { + iLogos.append(NULL); + elementCountNeedToAdd--; + } iLogos[aIndex] = aIcon; emit dataChanged(index(aIndex), index(aIndex)); } @@ -82,10 +109,10 @@ QVariantList list; int row = aIndex.row(); - QString primaryText = iHistoryList.at(row)->getChannelName(); + QString primaryText = iHistoryList.at(row)->nickName; list.append(primaryText); // fix bug #9888,if left descriptions as blank, only one line appears - QString tempDes = iHistoryList.at(row)->getChannelDesc(); + QString tempDes = iHistoryList.at(row)->shortDesc; if (0 == tempDes.length()) { tempDes = " "; @@ -98,23 +125,29 @@ { QVariantList list; int row = aIndex.row(); - const HbIcon *icon = iLogos.value(row); - if (icon) + if(row < iLogos.size()) { - list.append(*icon); + const HbIcon *icon = iLogos[row]; + if (icon) + { + list.append(*icon); + } + else + { + list.append(*iStationLogo); + } } else { list.append(*iStationLogo); - } - + } return list; } return QVariant(); } -IRQSongHistoryInfo* IRHistoryModel::getHistoryInfo(int aIndex) +IRQPreset* IRHistoryModel::getHistoryInfo(int aIndex) { if (aIndex >= 0 && aIndex < iHistoryList.count()) { @@ -124,54 +157,246 @@ return NULL; } -void IRHistoryModel::clearAllList() +void IRHistoryModel::clearAllHistory() { - while (!iHistoryList.isEmpty()) + if (iHistoryEngine->deleteChannelHistory()) { - IRQSongHistoryInfo *firstItem = iHistoryList.takeFirst(); - delete firstItem; + clearModel(); + emit modelChanged(); } - iHistoryEngine->clearAllHistory(); - clearAndDestroyLogos(); - emit modelChanged(); } bool IRHistoryModel::checkHistoryUpdate() { - getAllList(); + refreshModel(); return true; } void IRHistoryModel::clearAndDestroyLogos() { - for (QMap::iterator it = iLogos.begin(); it != iLogos.end(); ++it) + int size = iLogos.size(); + for (int i = 0; i < size; i ++) { - delete it.value(); + delete iLogos[i]; + iLogos[i] = NULL; } - iLogos.clear(); } -void IRHistoryModel::getAllList() +void IRHistoryModel::refreshModel() { - iHistoryEngine->getAllHistory(iHistoryList); - + clearModel(); + + QList* historySet = NULL; + historySet = iHistoryEngine->getChannelHistory(); + + if (NULL == historySet) + { + return; + } + int dataSize = historySet->size(); + for (int i = 0; i < dataSize; i++) + { + IRQPreset* preset = new IRQPreset(); + preset->presetId = (*(historySet->at(i) + channelId)).toUInt(); + preset->name = (*(historySet->at(i) + channelName)).toString(); + preset->nickName = (*(historySet->at(i) + channelNickName)).toString(); + + preset->genreName = (*(historySet->at(i) + genreName)).toString(); + preset->genreId = (*(historySet->at(i) + genreId)).toString(); + preset->languageName = (*(historySet->at(i) + languageName)).toString(); + preset->languageCode = (*(historySet->at(i) + languageCode)).toString(); + + preset->countryName = (*(historySet->at(i) + countryName)).toString(); + preset->countryCode = (*(historySet->at(i) + countryCode)).toString(); + preset->description = (*(historySet->at(i) + description)).toString(); + preset->shortDesc = (*(historySet->at(i) + shortDesc)).toString(); + + preset->lastModified = (*(historySet->at(i) + lastModified)).toString(); + preset->type = (*(historySet->at(i) + channelType)).toInt(); + preset->musicStoreStatus = (*(historySet->at(i) + musicStoreStatus)).toString(); + + preset->imgUrl = (*(historySet->at(i) + imgUrl)).toString(); + + preset->advertisementUrl = (*(historySet->at(i) + advertisementUrl)).toString(); + preset->advertisementInUse = (*(historySet->at(i) + advertisementInUse)).toString(); + + columnMap selectCriteria; + selectCriteria.insert(channelId, QString::number(preset->presetId)); + + QList* urlInfoList = iUrlInfoWrapper->getUrlInfo(&selectCriteria, NULL, i, dataSize-1); + if (NULL == urlInfoList) + { + delete preset; + preset = NULL; + continue; + } + int urlSize = urlInfoList->size(); + for (int j = 0; j < urlSize; j++) + { + IRQChannelServerURL urlInfo; + urlInfo.serverName = preset->name; + urlInfo.url = (*(urlInfoList->at(j) + channelUrl_URL)).toString(); + urlInfo.bitrate = (*(urlInfoList->at(j) + bitRate_URL)).toInt(); + preset->insertChannelServer(urlInfo); + } + + while(false == urlInfoList->isEmpty()) + { + delete []urlInfoList->takeFirst(); + } + urlInfoList->clear(); + + delete urlInfoList; + urlInfoList = NULL; + + iHistoryList.append(preset); + } + + while(false == historySet->isEmpty()) + { + delete []historySet->takeFirst(); + } + historySet->clear(); + + delete historySet; + historySet = NULL; + + updateIconIndexArray(); + emit modelChanged(); } -bool IRHistoryModel::deleteOneItem(int aIndex) +void IRHistoryModel::clearModel() +{ + while (!iHistoryList.isEmpty()) + { + IRQPreset *firstItem = iHistoryList.takeFirst(); + delete firstItem; + } + + clearAndDestroyLogos(); + updateIconIndexArray(); +} + +bool IRHistoryModel::deleteHistory(int aIndex) { - bool ret = iHistoryEngine->deleteOneItem(aIndex); - - if( !ret ) + if (aIndex < 0 && aIndex >= iHistoryList.count()) + { + return false; + } + + if (!iIconIndexArray.empty()) + { + iIsdsClient->isdsLogoDownCancelTransaction(); + iTimer->stop(); + } + + columnMap selectCriteria; + selectCriteria.insert(channelId, QString::number(iHistoryList.at(aIndex)->presetId)); + + if (!iHistoryEngine->deleteChannelHistory(&selectCriteria)) { return false; } beginRemoveRows(QModelIndex(), aIndex, aIndex); + + delete iHistoryList.at(aIndex); iHistoryList.removeAt(aIndex); + + if (aIndex < iLogos.size()) + { + delete iLogos[aIndex]; + iLogos.removeAt(aIndex); + } + + updateIconIndexArray(); + endRemoveRows(); - emit modelChanged(); + emit modelChanged(); + + if (!iIconIndexArray.empty()) + { + iTimer->start(); + } + return true; } + +void IRHistoryModel::startDownloadingLogo() +{ + iLogoProvider->activate(this, SLOT(logoData(const QByteArray&))); + iTimer->start(); +} + +void IRHistoryModel::stopDownloadingLogo() +{ + iIsdsClient->isdsLogoDownCancelTransaction(); + iTimer->stop(); + iIconIndexArray.clear(); + iLogoProvider->deactivate(); +} + +void IRHistoryModel::downloadNextLogo() +{ + iTimer->stop(); + int leftCount = iIconIndexArray.count(); + + if (0 != leftCount) + { + iLogoProvider->getLogo(iHistoryList.at(iIconIndexArray[0])); + } +} + +void IRHistoryModel::logoData(const QByteArray &aLogoData) +{ + if (aLogoData.size() > 0) + { + QPixmap tempMap; + bool ret = tempMap.loadFromData((const unsigned char*)aLogoData.constData(), aLogoData.size()); + if( ret ) + { + QIcon convertIcon(tempMap); + HbIcon *hbIcon = new HbIcon(convertIcon); + int index = iIconIndexArray[0]; + setLogo(hbIcon, index); + } + } + + iIconIndexArray.removeAt(0); + int leftCount = iIconIndexArray.count(); + if( leftCount > 0 ) + { + iTimer->start(); + } +} + +bool IRHistoryModel::isLogoReady(int aIndex) const +{ + int logoListCount = iLogos.count(); + if (aIndex >= 0 + && aIndex < logoListCount) + { + return iLogos[aIndex] != NULL; + } + else + { + return false; + } +} + +void IRHistoryModel::updateIconIndexArray() +{ + iIconIndexArray.clear(); + + for (int i = 0; i < rowCount(); ++i) + { + if (getImageUrl(i) != "" && !isLogoReady(i)) + { + iIconIndexArray.append(i); + } + } +} +