--- 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 <QProcess>
#include <QFile>
#include <QTimer>
+#include <QDesktopServices>
+#include <QUrl>
#ifdef BUILD_WIN32
# include <QSettings>
@@ -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<QSettings> settings( new QSettings( "Nokia", "QtFmRadio" ) );
frequency = settings->value( "CurrentFreq", DEFAULT_MIN_FREQUENCY ).toUInt();
if ( frequency == 0 ) {
- frequency = DEFAULT_MIN_FREQUENCY;
+ frequency = defaultFrequency;
}
#else
QScopedPointer<XQSettingsManager> 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<XQSettingsManager> 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 ) );
}
/*!