diff -r 000000000000 -r 09774dfdd46b qtinternetradio/ui/src/irapplication.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtinternetradio/ui/src/irapplication.cpp Mon Apr 19 14:01:53 2010 +0300 @@ -0,0 +1,815 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include +#include + + +#ifdef LOCALIZATION +#include +#include "irqutility.h" +#endif + +#include "irabstractviewmanager.h" +#include "irapplication.h" + +#include "irqnetworkcontroller.h" +#include "irqisdsclient.h" +#include "irplaycontroller.h" +#include "irlastplayedstationinfo.h" +#include "irqfavoritesdb.h" +#include "irqsettings.h" +#include "irmediakeyobserver.h" +#include "ircategoryview.h" +#include "irstationsview.h" +#include "irqmusicshop.h" +#include "irqnwkinfoobserver.h" +#include "irqstatisticsreporter.h" +#include "irsymbiandocument.h" +#include "irqdiskspacewatcher.h" +#include "irqlogger.h" +/* + * Description : constructor, initialize all data members + * Parameters : aViewManager : pointer to the view manager object + * Return : None + */ +IRApplication::IRApplication(IRAbstractViewManager* aViewManager): +#ifdef _DEBUG + iTestPreferredBitrate(false), +#endif + iViewManager(aViewManager), + iNetworkController(NULL), + iIsdsClient(NULL), + iPlayController(NULL), + iFavPresets(NULL), + iSettings(NULL), + iMediaKeyObserver(NULL), + iLastPlayedStationInfo(NULL), + iNwkInfoObserver(NULL), + iStatisticsReporter(NULL), + iMusicShop(NULL), + iAdvertisementClient(NULL), + iDiskSpaceWatcher(NULL), + iEnableGlobalAdv(true), + iDisconnected(false), + iConnectingCanceled(false), + iLocalServer(NULL), + iConnectingNote(NULL) + #ifdef LOCALIZATION + ,iTranslator(NULL) + #endif +{ + LOG_METHOD; + iViewManager->setApplication(this); + +#ifdef _DEBUG + readConfiguration(); +#endif + + createComponents(); + // get advertisement setting + iSettings->getGlobalAdvFlag(iEnableGlobalAdv); + setupConnection(); + setLaunchView(); +#ifdef LOCALIZATION + initLanguage(); +#endif +} + +/* + * Description : destructor, destroy all data members + * Parameters : None + * Return : None + */ +IRApplication::~IRApplication() +{ + LOG_METHOD; + setExitingView(); + destroyComponents(); + + if (iLocalServer) + { + iLocalServer->close(); + } + + delete iLastPlayedStationInfo; + iLastPlayedStationInfo = NULL; + + delete iConnectingNote; + iConnectingNote = NULL; + +#ifdef LOCALIZATION + if( iTranslator ) + { + qApp->removeTranslator(iTranslator); + delete iTranslator; + iTranslator = NULL; + } +#endif +} + +#ifdef LOCALIZATION +void IRApplication::initLanguage() +{ + iTranslator = new QTranslator(); + QString lang = QLocale::system().name(); + LOG_FORMAT( "Current language is %s", STRING2CHAR(lang) ); + QString path = "z:/resource/qt/translations/"; //this will be changed to a micro in future + bool ret = iTranslator->load(path + "internet_radio_10_1_" + lang); + qApp->installTranslator(iTranslator); +} +#endif +/* + * Description : When ir application is launched, set the correct view according to whether the + * application is used for the first time + * Parameters : None + * Return : None + */ +void IRApplication::setLaunchView() +{ + IRSymbianDocument *document = IRSymbianDocument::getInstance(); + if (document && document->isPlsAvailable()) + { + iViewManager->activateView(EIRView_PlsView); + } + else + { + launchStartingView(); + } + + QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + + iInitEvent = static_cast(QEvent::registerEventType()); + QEvent* initEvent = new QEvent(iInitEvent); + QCoreApplication::postEvent(this, initEvent, Qt::HighEventPriority); +} + +/* + * Description : verify if the network connection has been established + * Parameters : None + * Return : true : network connection has been established + * false : network connection has not been established + */ +bool IRApplication::verifyNetworkConnectivity(const QString &aConnectingText) +{ + Q_ASSERT(iNetworkController); + + bool ret = true; + + if (!iNetworkController->getNetworkStatus()) + { + ret = false; + if (!iNetworkController->isConnectRequestIssued()) + { + iConnectingText = aConnectingText; + iNetworkController->chooseAccessPoint(); + } + } + + return ret; +} + +void IRApplication::createConnectingDialog() +{ + LOG_METHOD_ENTER; + if (NULL == iConnectingNote) + { + iConnectingNote = new HbMessageBox(HbMessageBox::MessageTypeInformation); + iConnectingNote->setModal(true); + iConnectingNote->setTimeout(HbPopup::NoTimeout); + HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"), iConnectingNote); + iConnectingNote->setPrimaryAction(cancelAction); + connect(cancelAction, SIGNAL(triggered()), this, SLOT(cancelConnect())); + } + + iConnectingNote->setText(iConnectingText); + iConnectingNote->show(); +} + +void IRApplication::closeConnectingDialog() +{ + LOG_METHOD_ENTER; + if (iConnectingNote) + { + iConnectingNote->close(); + delete iConnectingNote; + iConnectingNote = NULL; + } +} + +/* + * Description : return the pointer to the view manager object + * Parameters : None + * Return : the pointer to the view manager object + */ +IRAbstractViewManager* IRApplication::getViewManager() const +{ + return iViewManager; +} + +/* + * Description : return the pointer to the network controller object + * Parameters : None + * Return : the pointer to the network controller object + */ +IRQNetworkController* IRApplication::getNetworkController() +{ + if(NULL == iNetworkController) + { + iNetworkController = IRQNetworkController::openInstance(); + } + return iNetworkController; +} + +/* + * Description : return the pointer to the isds client object + * Parameters : None + * Return : the pointer to the isds client object + */ +IRQIsdsClient* IRApplication::getIsdsClient() +{ + if(NULL == iIsdsClient) + { + iIsdsClient = IRQIsdsClient::openInstance(getFavoritesDB()); + } + return iIsdsClient; +} + +/* + * Description : return the pointer to the play controller object + * Parameters : None + * Return : the pointer to the play controller object + */ +IRPlayController* IRApplication::getPlayController() +{ + if(NULL == iPlayController) + { + iPlayController = new IRPlayController(this); + } + return iPlayController; +} + +IRLastPlayedStationInfo* IRApplication::getLastPlayedStationInfo() +{ + if(NULL == iLastPlayedStationInfo) + { + iLastPlayedStationInfo = new IRLastPlayedStationInfo(); + } + return iLastPlayedStationInfo; +} + +IRQFavoritesDB* IRApplication::getFavoritesDB() +{ + if(NULL == iFavPresets) + { + iFavPresets = new IRQFavoritesDB(); + } + return iFavPresets; +} + +IRQSettings * IRApplication::getSettings() +{ + if(NULL == iSettings) + { + iSettings = IRQSettings::openInstance(); + } + return iSettings; +} + +IRMediaKeyObserver* IRApplication::getMediaKeyObserver() +{ + if(NULL == iMediaKeyObserver) + { + iMediaKeyObserver = new IRMediaKeyObserver(this); + } + return iMediaKeyObserver; +} + +IRQNwkInfoObserver * IRApplication::getNwkInfoObserver() +{ + if(NULL == iNwkInfoObserver) + { + iNwkInfoObserver = IRQNwkInfoObserver::openInstance(); + } + return iNwkInfoObserver; +} + +IRQStatisticsReporter * IRApplication::getStatisticsReporter() +{ + if(NULL == iStatisticsReporter) + { + iStatisticsReporter = IRQStatisticsReporter::openInstance(getIsdsClient()); + } + return iStatisticsReporter; +} + +IRQMusicShop * IRApplication::getMusicShop() +{ + if(NULL == iMusicShop) + { + iMusicShop = IRQMusicShop::openInstance(); + } + return iMusicShop; +} + +IRQAdvClient* IRApplication::getAdvClient() +{ + if(iEnableGlobalAdv && (NULL == iAdvertisementClient)) + { + //iAdvertisementClient = IRQAdvClient::openInstance(); + } + + return iAdvertisementClient; +} +/* + * Description : create all the application level components, including network controller, + * favorites db, isds client, play controller, etc + * Parameters : None + * Return : None + */ +void IRApplication::createComponents() +{ + getNetworkController(); + getSettings(); +} + +/* + * Descriiption : destroy all the application level components + * Parameters : None + * Return : None + */ +void IRApplication::destroyComponents() +{ + delete iPlayController; + iPlayController = NULL; + + delete iDiskSpaceWatcher; + iDiskSpaceWatcher = NULL; + + if(iIsdsClient) + { + iIsdsClient->closeInstance(); + iIsdsClient = NULL; + } + + delete iFavPresets; + iFavPresets = NULL; + + if(iStatisticsReporter) + { + iStatisticsReporter->closeInstance(); + iStatisticsReporter = NULL; + } + + if(iNwkInfoObserver) + { + iNwkInfoObserver->closeInstance(); + iNwkInfoObserver = NULL; + } + + if(iMusicShop) + { + iMusicShop->closeInstance(); + iMusicShop = NULL; + } + + if(iNetworkController) + { + iNetworkController->closeInstance(); + iNetworkController = NULL; + } + + if(iSettings) + { + iSettings->closeInstance(); + iSettings = NULL; + } + + delete iMediaKeyObserver; + iMediaKeyObserver = NULL; +} + +void IRApplication::setupConnection() +{ + //connect IRApplication to IRQNetworkController + connect(iNetworkController, SIGNAL(networkEventNotified(IRQNetworkEvent)), + this, SLOT(networkEventNotified(IRQNetworkEvent))); + + connect(this, SIGNAL(quit()), qApp, SLOT(quit())); +} + +void IRApplication::cancelConnect() +{ + if (iConnectingCanceled) + { + return; + } + + iConnectingCanceled = true; + if (iNetworkController->getNetworkStatus()) + { + getIsdsClient()->isdsCancelRequest(); + } + else + { + iNetworkController->cancelConnecting(); + } + + iNetworkController->notifyActiveNetworkObservers(EIRQConnectingCancelled); +} + +// --------------------------------------------------------------------------- +// IRApplication::startMonitoringNwkInfo +// Start to monitor network info changes +// --------------------------------------------------------------------------- +// +void IRApplication::startMonitoringNwkInfo() +{ + getNwkInfoObserver(); + getStatisticsReporter(); + if(iNwkInfoObserver) + { + iNwkInfoObserver->startMonitorNwkInfo(); + connectAndAssert(iNwkInfoObserver, SIGNAL(currentNwkChanged(const QString, const QString)), + iStatisticsReporter, SLOT(updateCurrentNetwork(const QString, const QString))); + connectAndAssert(iNwkInfoObserver, SIGNAL(homeNwkChanged(const QString, const QString)), + iStatisticsReporter, SLOT(updateHomeOperator(const QString, const QString))); + } + +} + +//connect to signal 'networkEventNotified' from IRQNetworkController +void IRApplication::networkEventNotified(IRQNetworkEvent aEvent) +{ + LOG_SLOT_CALLER; + switch (aEvent) + { + case EIRQNetworkConnectionConnecting : + createConnectingDialog(); + iConnectingCanceled = false; + break; + + case EIRQNetworkConnectionEstablished : + iDisconnected = false; + if (EIR_DoDefault == handleConnectionEstablished()) + { + iNetworkController->notifyActiveNetworkObservers(aEvent); + } + + if (EIRQNoConnectionToNetwork == getPlayController()->getStopReason() && + iNetworkController->isHandlingOverConnection()) + { + getPlayController()->resume(); + } + break; + + case EIRQAccessPointSelectionCancelled : + closeConnectingDialog(); + cancelConnect(); + break; + + case EIRQNetworkConnectionDisconnected: + { + iDisconnected = true; + iNetworkController->resetConnectionStatus(); + getPlayController()->stop(EIRQNoConnectionToNetwork); + iNetworkController->notifyActiveNetworkObservers(aEvent); + } + break; + + case EIRQDisplayNetworkMessageNoConnectivity: + { + closeConnectingDialog(); + HbMessageBox note(hbTrId("txt_irad_info_no_network_connectiion"), HbMessageBox::MessageTypeWarning); + note.exec(); + + //reset setting to 'Always ask' + iSettings->setUserDefinedSelection(EIRAlwaysAsk); + iSettings->setDisplayAccessPoint(); + + if (!iDisconnected) + { + /* the handling is up to each view */ + iNetworkController->notifyActiveNetworkObservers(EIRQDisplayNetworkMessageNoConnectivity); + } + + } + break; + + default: + break; + } + +} + +void IRApplication::loadGenre() +{ + LOG_SLOT_CALLER; + bool hasCache = iIsdsClient->isdsIsCategoryCached(IRQIsdsClient::EGenre); + + if (!hasCache) + { + IRBaseView *currView = static_cast(iViewManager->currentView()); + Q_ASSERT(currView); + currView->setUseNetworkReason(EIR_UseNetwork_LoadCategory); + if (false == verifyNetworkConnectivity()) + { + return; + } + currView->setUseNetworkReason(EIR_UseNetwork_NoReason); + } + + IRCategoryView *categoryView = static_cast(getViewManager()->getView(EIRView_CategoryView, true)); + categoryView->loadCategory(IRQIsdsClient::EGenre); +} + +void IRApplication::newLocalSocketConnection() +{ + QLocalSocket *socket = iLocalServer->nextPendingConnection(); + if (!socket) + { + return; + } + + socket->waitForReadyRead(1000); + QTextStream stream(socket); + QString fileName; + stream>>fileName; + IRSymbianDocument *document = IRSymbianDocument::getInstance(); + document->parseFile(fileName); + + if (document->isPlsAvailable()) + { + iViewManager->activateView(EIRView_PlsView); + } + else + { + IRBaseView *topView = static_cast(iViewManager->currentView()); + topView->updateView(); + } + + iViewManager->raise(); + delete socket; +} + +void IRApplication::initApp() +{ + if (!iIsdsClient->isdsIsConstructSucceed()) + { + HbMessageBox note("No available access points, exiting...", HbMessageBox::MessageTypeWarning); + note.setPrimaryAction(NULL); + note.setTimeout(5000); + note.setModal(true); + note.exec(); + qApp->quit(); + } + else + { + static_cast(iViewManager->currentView())->launchAction(); + } + + getMediaKeyObserver(); + startMonitoringNwkInfo(); + startMonitoringDiskSpace(); + startLocalServer(); +} + +bool IRApplication::event(QEvent* e) +{ + if(e->type() == iInitEvent) + { + initApp(); + return true; + } + + return QObject::event(e); +} + +TIRHandleResult IRApplication::handleConnectionEstablished() +{ + IRBaseView *currView = static_cast(iViewManager->currentView()); + Q_ASSERT(currView); + + if (EIR_UseNetwork_LoadCategory == currView->getUseNetworkReason()) + { + closeConnectingDialog(); + IRCategoryView *categoryView = static_cast(getViewManager()->getView(EIRView_CategoryView, true)); + categoryView->loadCategory(IRQIsdsClient::EGenre); + currView->setUseNetworkReason(EIR_UseNetwork_NoReason); + return EIR_NoDefault; + } + + return EIR_DoDefault; +} + +void IRApplication::launchStartingView() +{ + TIRViewId viewId = EIRView_CategoryView; + iSettings->getStartingViewId(viewId); + TIRViewParameter viewParameter = EIRViewPara_Genre; + iSettings->getStartingViewParameter(viewParameter); + + iViewManager->activateView(viewId); + IRBaseView *currentView = iViewManager->getView(viewId); + + switch (viewId) + { + case EIRView_CategoryView: + { + IRCategoryView* categoryView = static_cast (currentView); + categoryView->setViewParameter(viewParameter); + + switch (viewParameter) + { + case EIRViewPara_Genre: + categoryView->setHeadingText(tr("Genre")); + break; + + case EIRViewPara_Language: + categoryView->setHeadingText(tr("Language")); + break; + + case EIRViewPara_Country: + categoryView->setHeadingText(tr("Country/Region")); + break; + + default: + break; + } + } + break; + + case EIRView_PlayingView: + iViewManager->pushViewById(EIRView_MainView); + break; + + default: + break; + } +} + +void IRApplication::setExitingView() +{ + IRQSettings *settings = getSettings(); + bool flag = false; + settings->getStickyViewFlag(flag); + if (!flag) + { + return; + } + + TIRViewId viewId = iViewManager->currentViewId(); + + switch (viewId) + { + case EIRView_CategoryView: + { + IRCategoryView *topView = (IRCategoryView*)(iViewManager->currentView()); + TIRViewParameter parameter = topView->getViewParameter(); + settings->setStartingViewParameter(parameter); + } + break; + + case EIRView_StationsView: + { + IRStationsView *topView = (IRStationsView*)(iViewManager->currentView()); + TIRViewParameter parameter = topView->getViewParameter(); + if (parameter == EIRViewPara_PopularStations) + { + settings->setStartingViewParameter(EIRViewPara_PopularStations); + } + else if (parameter == EIRViewPara_CategoryStations) + { + IRBaseView *baseView = iViewManager->getView(EIRView_CategoryView, false); + if (baseView) + { + IRCategoryView *categoryView = (IRCategoryView*)baseView; + TIRViewParameter parameter = categoryView->getViewParameter(); + settings->setStartingViewParameter(parameter); + settings->setStartingViewId(EIRView_CategoryView); + return; + } + } + else if (parameter == EIRViewPara_SearchResults) + { + + } + } + break; + + case EIRView_InvalidId: + case EIRView_StationDetailsView: + case EIRView_SettingsView: + case EIRView_OpenWebAddressView: + case EIRView_SearchView: + case EIRView_SearchResultView: + case EIRView_PlsView: + case EIRView_HistoryView: + case EIRView_SongHistoryView: + case EIRView_ViewCount: + { + // these views are not starting view, so do not change settings. + return; + } + + default: + break; + } + + settings->setStartingViewId(viewId); +} + +void IRApplication::startLocalServer() +{ + QString serverName = QCoreApplication::applicationName(); + iLocalServer = new QLocalServer(this); + connect(iLocalServer, SIGNAL(newConnection()), + this, SLOT(newLocalSocketConnection())); + + if (!iLocalServer->listen(serverName)) + { + QAbstractSocket::SocketError error = iLocalServer->serverError(); + QString fullServerName; + fullServerName = QDir::cleanPath(QDir::tempPath()); + fullServerName += QLatin1Char('/') + serverName; + bool fileExists = QFile::exists(fullServerName); + + if (error == QAbstractSocket::AddressInUseError && fileExists) + { + QFile::remove(fullServerName); + iLocalServer->listen(serverName); + } + } +} + +void IRApplication::startMonitoringDiskSpace() +{ + if(NULL == iDiskSpaceWatcher) + { + iDiskSpaceWatcher = new IRQDiskSpaceWatcher(); + } + + if(NULL != iDiskSpaceWatcher) + { + connect(iDiskSpaceWatcher, SIGNAL(diskSpaceLow(qint64)), + this, SLOT(handleDiskSpaceLow(qint64))); + iDiskSpaceWatcher->startMonitorDrive(); + } +} + +void IRApplication::handleDiskSpaceLow(qint64 aCriticalLevel) +{ + Q_UNUSED(aCriticalLevel); + HbDeviceMessageBox messageBox(hbTrId("txt_irad_info_no_space_on_c_drive_internet_radio_closed"), + HbMessageBox::MessageTypeWarning); + messageBox.setTimeout(HbPopup::NoTimeout); + messageBox.exec(); + qApp->quit(); +} + +#ifdef _DEBUG +void IRApplication::readConfiguration() +{ + QFile file("C:\\data\\QTIRConfigure.txt"); + if (file.open(QIODevice::ReadOnly)) + { + QTextStream stream( &file ); + QString line; + QStringList parameter; + while (!stream.atEnd()) + { + line = stream.readLine(); + parameter = line.split("="); + if (parameter.count() == 2) + { + if (parameter.first() == "testPreferredBitrate" + && parameter.last() == "true") + { + iTestPreferredBitrate = true; + } + } + } + } + file.close(); +} +#endif