homescreenapp/hsutils/src/hsdeviceinfolistener.cpp
changeset 39 4e8ebe173323
child 60 30f14686fb04
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/src/hsdeviceinfolistener.cpp	Mon May 03 12:24:59 2010 +0300
@@ -0,0 +1,220 @@
+/*
+* Copyright (c) 2010 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 "hsdeviceinfolistener.h"
+#include <QDebug>
+
+#ifdef Q_OS_SYMBIAN
+#include <e32property.h>
+#include <startupdomainpskeys.h>
+#endif
+/*!
+
+*/
+HsDeviceInfoListener::HsDeviceInfoListener(QObject *parent)
+    : QObject(parent),
+      mCurrentNetworkMode(QSystemNetworkInfo::UnknownMode),
+      mStatus(NoService)
+{
+    mNetworkInfo = new QSystemNetworkInfo(this);
+    mDeviceInfo = new QSystemDeviceInfo(this);
+    
+    connect(mNetworkInfo, SIGNAL(networkStatusChanged(QSystemNetworkInfo::NetworkMode, QSystemNetworkInfo::NetworkStatus)), SLOT(onNetworkStatusChanged(QSystemNetworkInfo::NetworkMode, QSystemNetworkInfo::NetworkStatus)));
+    connect(mNetworkInfo, SIGNAL(networkNameChanged(QSystemNetworkInfo::NetworkMode,const QString &)), SLOT(onNetworkNameChanged(QSystemNetworkInfo::NetworkMode,const QString &)));
+    connect(mDeviceInfo, SIGNAL(currentProfileChanged(QSystemDeviceInfo::Profile)), SLOT(onCurrentProfileChanged(QSystemDeviceInfo::Profile)));
+    
+    updateCurrentNetworkMode();
+    updateStatus();
+}
+
+/*!
+
+*/
+HsDeviceInfoListener::~HsDeviceInfoListener()
+{
+}
+
+/*!
+
+*/
+QString HsDeviceInfoListener::operatorName() const
+{
+    return QSystemNetworkInfo::networkName(mCurrentNetworkMode);
+}
+
+/*!
+
+*/
+HsDeviceInfoListener::HsDeviceInfoStatus HsDeviceInfoListener::status() const
+{
+    return mStatus;
+}
+
+/*!
+
+*/
+void HsDeviceInfoListener::onNetworkStatusChanged(QSystemNetworkInfo::NetworkMode networkMode, QSystemNetworkInfo::NetworkStatus networkStatus)
+{
+    Q_UNUSED(networkMode);
+    Q_UNUSED(networkStatus);
+    updateCurrentNetworkMode();
+    updateStatus();
+}
+
+/*!
+
+*/
+void HsDeviceInfoListener::onNetworkNameChanged(QSystemNetworkInfo::NetworkMode networkMode,const QString &networkName)
+{
+    Q_UNUSED(networkMode);
+    updateCurrentNetworkMode();
+    if(mCurrentNetworkMode != QSystemNetworkInfo::UnknownMode) {
+        qDebug() << "HsDeviceInfoListener::onNetworkNameChanged() - " << networkName;
+        emit networkNameChanged(networkName);
+    }
+    updateStatus();
+}
+
+/*!
+
+*/
+void HsDeviceInfoListener::onCurrentProfileChanged(QSystemDeviceInfo::Profile profile)
+{
+    Q_UNUSED(profile);
+    updateStatus();
+}
+
+/*!
+
+*/
+QSystemNetworkInfo::NetworkStatus HsDeviceInfoListener::networkStatus()
+{
+    return mNetworkInfo->networkStatus(mCurrentNetworkMode);
+}
+
+/*!
+
+*/
+void HsDeviceInfoListener::updateCurrentNetworkMode()
+{
+    //We are keen only GSM and WCDMA network connections.
+    //Other networks (WLAN etc.) are treated as UnknowMode.
+    qDebug() << "HsDeviceInfoListener::updateCurrentNetworkMode() - Entry: mCurrentNetworkMode == "
+             << mCurrentNetworkMode;
+    if(isConnected(QSystemNetworkInfo::GsmMode)) {
+        mCurrentNetworkMode = QSystemNetworkInfo::GsmMode;
+    } else if (isConnected(QSystemNetworkInfo::WcdmaMode)) {
+        mCurrentNetworkMode = QSystemNetworkInfo::WcdmaMode;
+    } else {
+        mCurrentNetworkMode = QSystemNetworkInfo::UnknownMode;
+    }
+    qDebug() << "HsDeviceInfoListener::updateCurrentNetworkMode() - Exit: mCurrentNetworkMode == "
+             << mCurrentNetworkMode;
+}
+
+/*!
+
+*/
+bool HsDeviceInfoListener::isConnected(QSystemNetworkInfo::NetworkMode mode)
+{
+    bool connected = false;
+
+    qDebug() << "HsDeviceInfoListener::isConnected():";
+    qDebug() << "   - Mode:" << (mode == QSystemNetworkInfo::WcdmaMode ? "WcdmaMode" : "GsmMode");
+    QSystemNetworkInfo::NetworkStatus status = mNetworkInfo->networkStatus(mode);
+    switch (status) {
+        case QSystemNetworkInfo::Connected:
+            qDebug() << "   - Status: Connected";
+            //Fall through
+        case QSystemNetworkInfo::HomeNetwork:
+            qDebug() << "   - Status: HomeNetwork";
+            //Fall through
+        case QSystemNetworkInfo::Roaming:
+            qDebug() << "   - Status: Roaming";
+            connected = true;
+            break;
+        default:
+            qDebug() << "   - Status: " << status;
+            break;
+    };
+
+    qDebug() << "   - Is connected:" << connected;
+    
+    return connected;
+}
+
+/*!
+
+*/
+void HsDeviceInfoListener::updateStatus()
+{
+    qDebug() << "HsDeviceInfoListener::updateStatus() - Entry: mStatus == "
+             << mStatus;
+
+    HsDeviceInfoStatus currentStatus;
+    if ( mDeviceInfo->currentProfile() == QSystemDeviceInfo::OfflineProfile &&
+         simStatus() != QSystemDeviceInfo::SimNotAvailable) {
+        currentStatus = OfflineProfile;
+    } else if (mCurrentNetworkMode == QSystemNetworkInfo::UnknownMode) {
+        currentStatus = NoService;
+    } else {
+        currentStatus = ServiceAvailable;
+    }
+
+    if(mStatus != currentStatus) {
+        mStatus = currentStatus;
+        emit statusChanged(mStatus);
+    }
+    qDebug() << "HsDeviceInfoListener::updateStatus() - Exit: mStatus == "
+             << mStatus;
+}
+
+/*!
+
+*/
+QSystemDeviceInfo::SimStatus HsDeviceInfoListener::simStatus() const
+{
+    QSystemDeviceInfo::SimStatus qtSimStatus = QSystemDeviceInfo::SimNotAvailable;
+
+#ifdef Q_OS_SYMBIAN
+    TInt simCardStatus(ESimNotPresent);
+    RProperty symbianSimStatus;
+    qt_symbian_throwIfError( symbianSimStatus.Attach( KPSUidStartup, KPSSimStatus ) );
+    qt_symbian_throwIfError( symbianSimStatus.Get( simCardStatus ) );
+    symbianSimStatus.Close();
+    
+    switch (simCardStatus) {
+        case ESimUsable:
+            // The Sim card is fully usable.
+            qtSimStatus = QSystemDeviceInfo::SingleSimAvailable;
+            qDebug() << "HsDeviceInfoListener::simStatus() - SingleSimAvailable";
+            break;
+        default:
+            //ESimReadable == The SIM card is not fully usable, but the emergency number can be read.
+            //ESimNotReady == The Sim card is present but not ready or usable.
+            //ESimNotPresent == The Sim card is not present.
+            //ESimNotSupported == SIM/RUIM is not supported. Some CDMA phones do not support a SIM/RUIM at all.
+            qtSimStatus = QSystemDeviceInfo::SimNotAvailable;
+            qDebug() << "HsDeviceInfoListener::simStatus() - SimNotAvailable";
+            break;
+    };
+#else
+    qtSimStatus = mDeviceInfo->simStatus();
+#endif
+
+    return qtSimStatus;
+}