radioapp/radiopresetstorage/src/radiopresetstorage_win32.cpp
branchRCL_3
changeset 19 cce62ebc198e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radioapp/radiopresetstorage/src/radiopresetstorage_win32.cpp	Tue Aug 31 15:15:02 2010 +0300
@@ -0,0 +1,293 @@
+/*
+* 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:
+*
+*/
+
+// System includes
+#include <QString>
+#include <QSettings>
+#include <QDataStream>
+
+// User includes
+#include "radiopresetstorage.h"
+#include "radiopresetstorage_win32_p.h"
+#include "radiostationif.h"
+
+const QString KKeyBookKeeping = "BookKeeping";
+const QString KKeyBase = "Preset-";
+
+/*!
+ *
+ */
+static QString makeKey( int index ) {
+    QString key = KKeyBase;
+    key.append( index );
+    return key;
+}
+
+/*!
+ *
+ */
+Preset::Preset() :
+    mFrequency( 0 ),
+    mRenamedByUser( false ),
+    mGenre( -1 ),
+    mPiCode( -1 ),
+    mFavorite( false ),
+    mLocalStation( false )
+{
+}
+
+/*!
+ *
+ */
+Preset::~Preset()
+{
+}
+
+/*!
+ *
+ */
+void Preset::externalize( QDataStream& outStream )
+{
+    outStream << mFrequency;
+    outStream << mName;
+    outStream << mRenamedByUser;
+    outStream << mGenre;
+    outStream << mUrl;
+    outStream << mPiCode;
+    outStream << mFavorite;
+    outStream << mLocalStation;
+}
+
+/*!
+ *
+ */
+void Preset::internalize( QDataStream& inStream )
+{
+    inStream >> mFrequency;
+    inStream >> mName;
+    inStream >> mRenamedByUser;
+    inStream >> mGenre;
+    inStream >> mUrl;
+    inStream >> mPiCode;
+    inStream >> mFavorite;
+    inStream >> mLocalStation;
+}
+
+/*!
+ *
+ */
+RadioPresetStorage::RadioPresetStorage() :
+    d_ptr( new RadioPresetStoragePrivate() )
+{
+    Q_D( RadioPresetStorage );
+    d->init();
+}
+
+/*!
+ *
+ */
+RadioPresetStorage::~RadioPresetStorage()
+{
+}
+
+/*!
+ *
+ */
+int RadioPresetStorage::maxNumberOfPresets() const
+{
+    return 100;
+}
+
+/*!
+ *
+ */
+int RadioPresetStorage::presetCount() const
+{
+    Q_D( const RadioPresetStorage );
+    return d->mBookKeeping.count();
+}
+
+/*!
+ *
+ */
+int RadioPresetStorage::firstPreset() const
+{
+    Q_D( const RadioPresetStorage );
+    if ( d->mBookKeeping.count() > 0 ) {
+        return d->mBookKeeping.at( 0 );
+    }
+    return -1;
+}
+
+/*!
+ *
+ */
+int RadioPresetStorage::nextPreset( int fromIndex ) const
+{
+    Q_D( const RadioPresetStorage );
+    int index = d->mBookKeeping.indexOf( fromIndex ) + 1;
+    if ( index > 0 && index < d->mBookKeeping.count() ) {
+        return d->mBookKeeping.at( index );
+    }
+    return -1;
+}
+
+/*!
+ *
+ */
+bool RadioPresetStorage::deletePreset( int presetIndex )
+{
+    Q_D( RadioPresetStorage );
+    if ( presetIndex > -1 ) {
+        int index = d->mBookKeeping.indexOf( presetIndex );
+        if ( index > -1 ) {
+            d->mBookKeeping.remove( index, 1 );
+            d->mSettings->remove( makeKey( presetIndex ) );
+            d->removeIndex( presetIndex );
+            return true;
+        }
+    } else if ( presetIndex == -1 ) {
+        for ( int i = d->mBookKeeping.count() - 1; i >= 0; --i ) {
+            d->mSettings->remove( makeKey( d->mBookKeeping.at( i ) ) );
+        }
+        d->mBookKeeping.clear();
+        return true;
+    }
+    return false;
+}
+
+/*!
+ *
+ */
+bool RadioPresetStorage::savePreset( const RadioStationIf& station )
+{
+    Preset preset;
+    preset.mFrequency = station.frequency();
+    preset.mName = station.name();
+    preset.mRenamedByUser = station.isRenamedByUser()   ;
+    preset.mGenre = station.genre();
+    preset.mUrl = station.url();
+    preset.mPiCode = station.piCode();
+    preset.mFavorite = station.isFavorite();
+    preset.mLocalStation = station.isLocalStation();
+
+    QByteArray array;
+    QDataStream outStream( &array, QIODevice::WriteOnly );
+    preset.externalize( outStream );
+
+    Q_D( RadioPresetStorage );
+    d->mSettings->setValue( makeKey( station.presetIndex() ), array );
+
+    d->addIndex( station.presetIndex() );
+
+    return true;
+}
+
+/*!
+ *
+ */
+bool RadioPresetStorage::readPreset( int index, RadioStationIf& station )
+{
+    Q_D( RadioPresetStorage );
+    QByteArray array = d->mSettings->value( makeKey( index ) ).toByteArray();
+    if ( !array.isEmpty() ) {
+        Preset preset;
+
+        QDataStream inStream( array );
+        preset.internalize( inStream );
+
+        station.setPresetIndex( index );
+        station.setFrequency( preset.mFrequency );
+        station.setName( preset.mName );
+        station.setRenamedByUser( preset.mRenamedByUser );
+        station.setGenre( preset.mGenre );
+        station.setUrl( preset.mUrl );
+        station.setPiCode( preset.mPiCode );
+        station.setFavorite( preset.mFavorite );
+        station.setLocalStation( preset.mLocalStation );
+
+        return true;
+    }
+    return false;
+}
+
+/*!
+ *
+ */
+RadioPresetStoragePrivate::RadioPresetStoragePrivate()
+{
+}
+
+/*!
+ *
+ */
+RadioPresetStoragePrivate::~RadioPresetStoragePrivate()
+{
+}
+
+/*!
+ *
+ */
+bool RadioPresetStoragePrivate::init()
+{
+    mSettings.reset( new QSettings( "Nokia", "QtFmRadio" ) );
+    readBookKeeping();
+    return true;
+}
+
+/*!
+ *
+ */
+void RadioPresetStoragePrivate::readBookKeeping()
+{
+    QVariant value = mSettings->value( KKeyBookKeeping );
+    if ( value.isValid() ) {
+        mBookKeeping = value.toByteArray();
+    }
+}
+
+/*!
+ *
+ */
+void RadioPresetStoragePrivate::saveBookKeeping()
+{
+    mSettings->setValue( KKeyBookKeeping, mBookKeeping );
+}
+
+/*!
+ *
+ */
+void RadioPresetStoragePrivate::removeIndex( int index )
+{
+    int pos = mBookKeeping.indexOf( index );
+    if ( pos > -1 ) {
+        mBookKeeping.remove( pos, 1 );
+        saveBookKeeping();
+    }
+}
+
+/*!
+ *
+ */
+void RadioPresetStoragePrivate::addIndex( int index )
+{
+    int pos = mBookKeeping.indexOf( index );
+    if ( pos == -1 ) {
+        mBookKeeping.append( index );
+        saveBookKeeping();
+    }
+}