radioapp/radiouiengine/src/radiouiengine.cpp
changeset 34 bc10a61bd7d3
parent 28 075425b8d9a4
child 36 ba22309243a1
--- 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 ) );
 }
 
 /*!