usbuis/usbuiqt/src/usbuisettingmodel.cpp
changeset 43 4712310216c0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbuis/usbuiqt/src/usbuisettingmodel.cpp	Fri Apr 23 23:17:21 2010 +0300
@@ -0,0 +1,362 @@
+/*
+* 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 "usbuisettingmodel.h"
+#include "usbuimodelactive.h"
+#include "mydebug.h"
+#include <QStringList>
+#include <UsbWatcherInternalCRKeys.h>
+#include <XQSettingsKey>
+#include <usbman.h>
+
+const QString TextIdPrefix = ("txt_usb_");
+const QString ModeIconNamePrefix = (":/icons/usb_icon_mode_");
+
+/*!
+    Constructor.
+ */
+UsbUiSettingModel::UsbUiSettingModel( QObject *parent )
+    : QAbstractItemModel( parent )
+{
+    mModelActive = new UsbUiModelActive();
+    
+    for ( int i = 0; i < UsbUiSettingModel::EndOfSettings; i++ ) {
+        // Initialize the list with empty values.
+        mSettingsList.append( QMap< int, QVariant >() );
+    }
+    
+    mCurrentMode = currentMode();
+    mPreviousMode = mCurrentMode;
+    setUsbSettings(mCurrentMode);
+  	bool ret = mSettingsManager.startMonitoring( 
+   	        XQSettingsKey( XQSettingsKey::TargetCentralRepository, 
+   	                KCRUidUsbWatcher.iUid, KUsbWatcherPersonality ) );
+    myDebug() << ">>> UsbUiSettingModel::startMonitoring value=" 
+              << ret; 
+                              
+   	// signal: personality changed in the central repository                
+   	connect( &mSettingsManager, 
+   	        SIGNAL( valueChanged( const XQSettingsKey&, const QVariant& ) ), 
+   	        this, 
+   	        SLOT( usbModeChanged( const XQSettingsKey&, const QVariant& ) ) );
+   	        
+   // signal: response from usbwatcher to our attempt to set the personality 	        
+   	connect( mModelActive, 
+   	        SIGNAL( requestCompleted( int status ) ), 
+   	        this, 
+   	        SLOT( setPersonalityCompleted (int status )));
+
+}
+/*!
+ * calls the model's set functions to initialize the model's data
+ */
+void UsbUiSettingModel::setUsbSettings( int aModeId )
+    {
+    setUsbModelistSetting( aModeId ); 
+    setDefaultModeSetting();
+    setDescriptionSetting();
+    }
+
+/*!
+    Destructor.
+ */
+UsbUiSettingModel::~UsbUiSettingModel()
+{
+    myDebug() << ">>> UsbUiSettingModel::~UsbUiSettingModel";
+    mSettingsManager.stopMonitoring( 
+            XQSettingsKey( XQSettingsKey::TargetCentralRepository, 
+                    KCRUidUsbWatcher.iUid, KUsbWatcherPersonality ) );
+    delete mModelActive;
+    myDebug() << "<<< UsbUiSettingModel::~UsbUiSettingModel";
+}
+
+/*!
+    Provides notification of changes in selected usb mode
+ */
+void UsbUiSettingModel::usbModeChanged( const XQSettingsKey &key,  
+        const QVariant &value )  
+{
+Q_UNUSED(key);
+    myDebug() << ">>> UsbUiSettingModel::usbModeChanged";
+    // key is not checked, as we monitor only one key
+ 
+    setNewUsbMode(value.toInt());
+                                  
+    myDebug() << "<<< UsbUiSettingModel::usbModeChanged"; 
+}
+/*!
+ * updates the model rows and emits signal datachanged
+ */
+void UsbUiSettingModel::setNewUsbMode(int newPersonality)
+    
+    {
+    myDebug() << ">>> UsbUiSettingModel::setNewUsbMode value=" 
+            << newPersonality; 
+            
+    mCurrentMode = newPersonality;
+    setUsbSettings(mCurrentMode);
+   	
+    emit dataChanged( createIndex( DefaultMode, KDefaultColumn ), 
+            createIndex( UsbModeList, KDefaultColumn ) );   
+         
+    myDebug() << "<<< UsbUiSettingModel::setNewUsbMode"; 
+    }
+/*!
+ * Returns the index of the item in the model specified by the given row, column and parent index.
+ */
+QModelIndex UsbUiSettingModel::index( int row, int column, const QModelIndex &parent ) const
+{
+    return hasIndex( row, column, parent ) ? createIndex( row, column ) : QModelIndex();
+}
+
+
+/*
+    This model does not support hierarchy, so this returns an empty model index. 
+ */
+QModelIndex UsbUiSettingModel::parent( const QModelIndex &child ) const
+{
+    Q_UNUSED( child );
+    return QModelIndex();
+}
+/*!
+ * Returns the number of rows under the given parent
+ */
+int UsbUiSettingModel::rowCount( const QModelIndex &parent ) const
+{
+    Q_UNUSED( parent );
+    return mSettingsList.count();
+}
+
+
+/*!
+ * Returns the number of columns for the children of the given parent.
+ * This model is one-dimensional, so this returns 1.
+ */
+int UsbUiSettingModel::columnCount( const QModelIndex &parent ) const
+{
+    Q_UNUSED( parent );
+    return 1;
+}
+/*!
+ * Returns the data stored under the given role for the item referred to by the index.
+ */
+QVariant UsbUiSettingModel::data( const QModelIndex &index, int role ) const
+{
+    return mSettingsList.value( index.row() ).value( role );
+}
+
+
+/*!
+ * This is called when usb mode is changed, it only sets the personality when the given role is EditRole 
+ */
+bool UsbUiSettingModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+    myDebug() << ">>>  UsbUiSettingModel::setData";
+    bool success = false;
+    if ( role == Qt::EditRole ) {
+        // Only allow changes on the value with role EditRole. Others are managed here.
+        switch ( index.row() ) {
+        case UsbModeList: {            
+            mModelActive->SetUsbPersonality( mPersonalityIds.at( value.toInt() ) );
+            success = true;
+            // also update the rest of the model with the about to be selected mode right away
+            setNewUsbMode(mPersonalityIds.at( value.toInt() ));
+            break;
+            }
+        case DefaultMode:
+            //no break
+        case Description:
+            //no break
+        default:
+            myDebug() << "    UsbUiSettingModel::setData not supported row " << index.row();
+            break;
+        } 
+    }   
+    myDebug() << "<<<  UsbUiSettingModel::setData return " << success;
+    return success;
+}
+
+/*!
+ * Getter for the source data.
+ */
+const QModelIndex* UsbUiSettingModel::sourceData() const
+{
+    return new QModelIndex( createIndex( 0, 0 ) );
+}
+
+/*!
+ * creats the logical name of the modename string for the list
+ */
+QString UsbUiSettingModel::modeListName( int modeId )
+{
+    QString textId = TextIdPrefix + "modelistname_" + QString::number( modeId );
+    QString modeName = qtTrId( textId.toAscii() );
+    return modeName;
+}
+
+/*!
+ * Get the current USB mode (personality) ID
+ */
+int UsbUiSettingModel::currentMode()
+{
+    myDebug() << ">>>  UsbUiSettingModel::CurrentMode";
+    int currentMode = mSettingsManager.readItemValue(
+                XQSettingsKey( XQSettingsKey::TargetCentralRepository, 
+                KCRUidUsbWatcher.iUid, KUsbWatcherPersonality ) ).toInt();
+    myDebug() << "<<< UsbUiSettingModel::CurrentMode " << currentMode;
+    return currentMode;
+}
+
+/*!
+ * sets the value to different roles of the model's first row
+ */
+void UsbUiSettingModel::setDefaultModeSetting()
+{    
+    QString iconName;
+    QString modeName;
+    //empty iconName and modeName are used for a hidden personality
+    if ( !isPersonalityHidden(mCurrentMode) ) {
+        iconName = ModeIconNamePrefix + QString::number( mCurrentMode ) + ".svg";
+        QString textId = TextIdPrefix + "modename_" + QString::number( mCurrentMode );
+        modeName = qtTrId( textId.toAscii() );
+    }
+
+    myDebug() << ">>> UsbUiSettingModel::setDefaultModeSetting iconName=" 
+            << iconName << " modeName=" << modeName;
+    QMap< int, QVariant > val = mSettingsList.at( DefaultMode );
+    if ( val.isEmpty() ) {
+        val[ SettingType ] = QVariant( DefaultMode );
+    }    
+    val[ Qt::DecorationRole ] = QVariant(iconName) ;
+    val[ Qt::DisplayRole ]= QVariant(modeName) ;
+    mSettingsList.replace( DefaultMode, val );
+    myDebug() << "<<< UsbUiSettingModel::setDefaultModeSetting";
+}
+
+/*!
+    Updates all values related to the mode description.
+ */
+void UsbUiSettingModel::setDescriptionSetting()
+{
+    QString description;
+    //the description will be empty for a hidden personality
+    if ( !isPersonalityHidden(mCurrentMode) ) {
+        QString textId = TextIdPrefix + "description_" 
+                + QString::number( mCurrentMode );
+        description = qtTrId( textId.toAscii() );
+    }
+    myDebug() << ">>> UsbUiSettingModel::setDescriptionSetting description=" 
+            << description;
+    QMap< int, QVariant > val = mSettingsList.at( Description );
+    if ( val.isEmpty() ) {
+       
+        val[ SettingType ] = QVariant( Description );
+     
+    }
+    // The display role stores the string representation of the actual value.
+    val[ Qt::DisplayRole ] = QVariant( description );
+    	 mSettingsList.replace( Description, val );
+    myDebug() << "<<< UsbUiSettingModel::setDescriptionSetting";     
+}
+
+/*!
+    Updates all values related to the visibility setting.
+    Updates the selectable USB modes only in the 1st call.
+ */
+bool UsbUiSettingModel::setUsbModelistSetting( int aModeId )
+{
+    myDebug() << ">>> UsbUiSettingModel::setUsbModelistSetting aModeIndex="
+            << aModeId;
+   bool ret = true;
+    QMap< int, QVariant > val = mSettingsList.at(UsbModeList);
+    if ( val.isEmpty() ) {
+        val[ SettingType ] = QVariant( UsbModeList );
+
+        RUsb iUsbman;
+        if ( iUsbman.Connect() == KErrNone ) {
+            
+            RArray<TInt> personalityIds;
+            mPersonalityIds.clear();
+            if ( iUsbman.GetPersonalityIds( personalityIds ) == KErrNone ) {
+                QStringList modeList;
+                for ( int i = 0; i < personalityIds.Count(); i++ ) {
+                    if ( !isPersonalityHidden(iUsbman, personalityIds[i]) ) {
+                        mPersonalityIds.append( personalityIds[i] );
+                        modeList.append( modeListName( mPersonalityIds[i] ) );                    
+                    }
+                }
+                val[ SettingsModeNameList ] = QVariant( modeList ); 
+            }
+        }
+        else{
+        ret = false;
+        }
+        iUsbman.Close();
+    }
+    //index will be -1 for hidden personality
+    val[ Qt::EditRole ] = QVariant( mPersonalityIds.indexOf(aModeId) );
+    mSettingsList.replace( UsbModeList, val );
+    myDebug() << "<<< UsbUiSettingModel::setUsbModelistSetting";
+    return ret;
+}
+
+/*!
+ * it checks the response from usbwatcher to see if the new mode change has been successful
+ * it will go back to the previous personality if it has not been successfull
+ */
+void UsbUiSettingModel::setPersonalityCompleted (int status )
+{
+  myDebug() << ">>> UsbUiSettingModel::setPersonalityCompleted status= "
+    << status;    
+  // status contains Symbian error code from usbwatcher
+  // if the status is KErrNone, we are ready to process the next request
+  if (status != KErrNone) 
+    {
+    // changing the personality failed, so we need to set back the previous personality
+    // the value will be read from central repository and also updates mCurrentMode  
+    mPreviousMode = mSettingsManager.readItemValue(
+                   XQSettingsKey( XQSettingsKey::TargetCentralRepository, 
+                   KCRUidUsbWatcher.iUid, KUsbWatcherPersonality ) ).toInt();
+    setNewUsbMode(mPreviousMode);
+    }
+   
+   // after handling the return code we know the the current personality works
+   // and we will not go back to the previous one 
+   mPreviousMode = mCurrentMode; 
+   myDebug() << "<<< UsbUiSettingModel::setPersonalityCompleted";      
+}
+
+bool UsbUiSettingModel::isPersonalityHidden(RUsb &usbman, TInt personalityId)
+{
+    myDebug() << ">>> UsbUiSettingModel::isPersonalityHidden from USB Manager";
+    bool hidden = false;
+    TUint32 property = 0;
+    TInt ret = usbman.GetPersonalityProperty(personalityId, property);
+    if (ret == KErrNone) {
+        myDebug() << "property " << property;
+        if (property & KUsbPersonalityPropertyHidden) {
+            hidden = true;
+        }
+    } 
+    myDebug() << "<<< UsbUiSettingModel::isPersonalityHidden " << hidden;
+    return hidden;
+}
+
+bool UsbUiSettingModel::isPersonalityHidden(TInt personalityId)
+{
+    return ( mPersonalityIds.indexOf(personalityId) == -1 );
+}