diff -r 075425b8d9a4 -r bc10a61bd7d3 radioapp/radiouiengine/src/radiouiengine.cpp --- a/radioapp/radiouiengine/src/radiouiengine.cpp Fri Jun 11 13:38:32 2010 +0300 +++ b/radioapp/radiouiengine/src/radiouiengine.cpp Fri Jun 25 19:09:05 2010 +0300 @@ -20,6 +20,8 @@ #include #include #include +#include +#include #ifdef BUILD_WIN32 # include @@ -40,30 +42,43 @@ #include "radiologger.h" // Constants -const uint DEFAULT_MIN_FREQUENCY = 87500000; const uint RADIO_CENREP_UID = 0x2002FF52; const uint RADIO_CENREP_FREQUENCY_KEY = 0x207; +const uint RADIO_CENREP_HEADSET_VOLUME = 0x200; +const QLatin1String OVI_STORE_URL( "http://www.music.nokia.co.uk/Touch/Search.aspx?artistsearch=#artist#&titlesearch=#title#" ); +const QLatin1String OTHER_STORE_URL( "http://www.amazon.com/gp/search/ref=sr_adv_m_digital/?search-alias=digital-music&field-author=#artist#&field-title=#title#" ); +const QLatin1String OTHER_STORE_ARTIST_TAG( "#artist#" ); +const QLatin1String OTHER_STORE_TITLE_TAG( "#title#" ); +const char WHITESPACE = ' '; +const char WHITESPACE_REPLACEMENT = '+'; + +// Constants used when launching radio server +const QLatin1String RADIO_SERVER_NAME( "radioserver.exe" ); +const QLatin1String RADIO_RANGE_USEURO( "useuro" ); +const QLatin1String RADIO_RANGE_JAPAN( "japan" ); + +// ====== STATIC FUNCTIONS ======== /*! - * + * Gets the last tuned frequency from central repository */ -uint RadioUiEngine::lastTunedFrequency() +uint RadioUiEngine::lastTunedFrequency( uint defaultFrequency ) { - uint frequency = DEFAULT_MIN_FREQUENCY; + uint frequency = defaultFrequency; #ifdef BUILD_WIN32 QScopedPointer settings( new QSettings( "Nokia", "QtFmRadio" ) ); frequency = settings->value( "CurrentFreq", DEFAULT_MIN_FREQUENCY ).toUInt(); if ( frequency == 0 ) { - frequency = DEFAULT_MIN_FREQUENCY; + frequency = defaultFrequency; } #else QScopedPointer settings( new XQSettingsManager() ); XQSettingsKey key( XQSettingsKey::TargetCentralRepository, RADIO_CENREP_UID, RADIO_CENREP_FREQUENCY_KEY ); frequency = settings->readItemValue( key, XQSettingsManager::TypeInt ).toUInt(); if ( frequency == 0 ) { - frequency = DEFAULT_MIN_FREQUENCY; + frequency = defaultFrequency; } #endif @@ -71,6 +86,42 @@ } /*! + * Gets the last used volume level + */ +int RadioUiEngine::lastVolume() +{ + int volume = DEFAULT_VOLUME_LEVEL; + +#ifndef BUILD_WIN32 + QScopedPointer settings( new XQSettingsManager() ); + XQSettingsKey key( XQSettingsKey::TargetCentralRepository, RADIO_CENREP_UID, RADIO_CENREP_HEADSET_VOLUME ); + volume = settings->readItemValue( key, XQSettingsManager::TypeInt ).toInt(); + if ( volume == 0 ) { + volume = DEFAULT_VOLUME_LEVEL; + } +#endif + + return volume; +} + +/*! + * Launches the radio server process + */ +void RadioUiEngine::launchRadioServer() +{ + QStringList args; + args << RADIO_RANGE_USEURO; //TODO: Determine current region + args << QString::number( lastTunedFrequency( 0 ) ); + args << QString::number( lastVolume() ); + + QProcess serverProcess; + bool success = serverProcess.startDetached( RADIO_SERVER_NAME, args ); + LOG_ASSERT( success, LOG( "Failed to start radio server!" ) ); +} + +// ====== MEMBER FUNCTIONS ======== + +/*! * */ RadioUiEngine::RadioUiEngine( QObject* parent ) : @@ -84,7 +135,6 @@ */ RadioUiEngine::~RadioUiEngine() { - delete d_ptr; } /*! @@ -196,15 +246,22 @@ } /*! - * + * Creates a scanner engine and returns a pointer to it + * The returned pointer is wrapped inside a QScopedPointer to ensure this won't + * leak memory. The returned engine will be deleted even if the caller ignored + * the return value. */ -RadioScannerEngine* RadioUiEngine::createScannerEngine() +RadioScannerEnginePtr RadioUiEngine::createScannerEngine() { Q_D( RadioUiEngine ); - if ( !d->mScannerEngine ) { - d->mScannerEngine = new RadioScannerEngine( *d ); - } - return d->mScannerEngine; +#if defined BUILD_WIN32 || defined __WINS__ + Q_ASSERT_X( !d->mScannerEngine, "RadioUiEngine::createScannerEngine", "Previous scanner instance not freed" ); +#endif + + RadioScannerEnginePtr enginePtr( new RadioScannerEngine( *d ) ); + d->mScannerEngine = enginePtr; + + return enginePtr; } /*! @@ -232,7 +289,7 @@ { Q_D( const RadioUiEngine ); if ( d->mScannerEngine ) { - return d->mScannerEngine->isScanning(); + return d->mScannerEngine.data()->isScanning(); } return false; } @@ -367,9 +424,24 @@ */ void RadioUiEngine::openMusicStore( const RadioHistoryItem& item, MusicStore store ) { - Q_UNUSED( item ); - Q_UNUSED( store ); - //TODO: Integrate to music store + QString artist = item.artist(); + artist.replace( WHITESPACE, WHITESPACE_REPLACEMENT ); + QString title = item.title(); + title.replace( WHITESPACE, WHITESPACE_REPLACEMENT ); + + QString url = store == OviStore ? OVI_STORE_URL : OTHER_STORE_URL; + url.replace( OTHER_STORE_ARTIST_TAG, artist ); + url.replace( OTHER_STORE_TITLE_TAG, title ); + + launchBrowser( url ); +} + +/*! + * + */ +void RadioUiEngine::launchBrowser( const QString& url ) +{ + QDesktopServices::openUrl( QUrl( url ) ); } /*!