serviceproviders/sapi_sysinfo/sysinfoservice/src/sysinfoservice.cpp
changeset 19 989d2f495d90
child 22 fc9cf246af83
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_sysinfo/sysinfoservice/src/sysinfoservice.cpp	Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,917 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  CSysInfoService class implementation
+*
+*/
+
+
+#include <W32STD.H>
+#include <hal.h>
+#include <FeatMgr.h>
+#include <bldvariant.hrh>
+#include <PtiEngine.h>
+#include <driveinfo.h>
+
+
+#include <centralrepository.h>
+#include <HWRMVibraSDKCRKeys.h>
+#include <SettingsInternalCRKeys.h>
+#include <HWRMLightDomainCRKeys.h>
+#include <AknFepInternalCRKeys.h>
+#include <IR_SOCK.H>
+#include <btserversdkcrkeys.h>
+#include <SysUtilDomainCRKeys.h>
+
+#include <e32property.h>
+#include <HWRMDomainPSKeys.h>
+#include <NetworkHandlingDomainPSKeys.h>
+#include <HWRMPowerStateSDKPSKeys.h>
+#include <wlaninternalpskeys.h>
+#include <UikonInternalPSKeys.h>
+#include <btengsettings.h>
+
+#include <usbman.h>
+#include <AknsWallpaperUtils.h>
+
+#include "sysinfoservice.h"
+#include "sysinfo.h"
+#include "SysInfoUtils.h"
+#include "entitykeys.h"
+#include "activerequests.h"
+#include "deviceinfo.h"
+#include "sysrange.h"
+
+
+using namespace SysInfo;
+
+// CONSTANT DECLARATIONS
+const TInt KGranularity(2);
+const TInt KPhoneWlanMacAddressLength = 50;
+const TChar KPhoneWlanSeparator (':');
+_LIT(KWLanMACDataFormat, "%02x");
+
+// --------------------------------------------------------------------
+// CSysInfoService::CSysInfoService()
+// C++ default constructor.
+// --------------------------------------------------------------------
+//
+EXPORT_C CSysInfoService::CSysInfoService():iFeatureManagerInitialized(EFalse)
+    {
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::~CSysInfoService()
+// Destructor.
+// --------------------------------------------------------------------
+//
+CSysInfoService::~CSysInfoService()
+    {
+    //If initialized uninitialize.
+    if(iFeatureManagerInitialized)
+        FeatureManager::UnInitializeLib();
+
+    delete iDeviceInfo;
+
+    // Cancel any ongoing asynchronous requests and 
+    // Deallocate resources.
+    ActiveStore::ReleaseResources();
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::NewL()
+// Two-phased constructor.
+// --------------------------------------------------------------------
+//
+EXPORT_C CSysInfoService* CSysInfoService::NewL ()
+    {
+    CSysInfoService* self = new (ELeave) CSysInfoService();
+    return self;
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::SetInfoL()
+// Modifies the system attribute value specified in aRequest.
+// --------------------------------------------------------------------
+//
+EXPORT_C void CSysInfoService::SetInfoL( const TDesC& aEntity, 
+                            const TDesC& aKey, const CSysData* aInput )
+    {
+    if(!aInput)
+        User::Leave(KErrArgument);
+
+    if( !aEntity.CompareF(KGeneral) )
+        SetGeneralInfoL(aKey,aInput);
+    else if( !aEntity.CompareF(KDisplay) )
+        SetDisplayInfoL(aKey,aInput);
+// Bluetooth and IR which require WriteDeviceData are not usergratable permissions, 
+// hence this funtionality is not exposed currently.    
+#ifdef _REQUIRE_WRITEDEVICEDATA_
+    else if( !aEntity.CompareF(KConnectivity) )
+      SetConnectivityInfoL(aKey,aInput);
+#endif
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::Cancel()
+// Cancels any outstanding requests and releases resources owned by them.
+// --------------------------------------------------------------------
+//
+EXPORT_C void CSysInfoService::Cancel(TInt32 aTransID)
+    {
+    ActiveStore::RemoveRequest(aTransID);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::SetConnectivityInfoL()
+// Modifies the Connectivity Entity key values.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::SetConnectivityInfoL(const TDesC& aKey, 
+                                            const CSysData* aInput)
+    {
+    //In Connectivity bluetooth, Infrared takes input argument of type EStatus.
+    if( CSysData::EStatus != aInput->DataType() )
+        User::Leave(KErrArgument);
+
+    TInt inputStatus = ((CStatus*)aInput)->Status();
+
+    if( !aKey.CompareF(KBlueTooth) )
+        {
+        CBTEngSettings* BtSettings = CBTEngSettings::NewLC();
+        if( inputStatus == EOn)
+            User::LeaveIfError(BtSettings->SetPowerState( EBTPowerOn ));
+        else if(inputStatus == EOff)
+            User::LeaveIfError(BtSettings->SetPowerState( EBTPowerOff ));
+        else
+            User::Leave(KErrArgument);
+        CleanupStack::PopAndDestroy(BtSettings);
+        }
+
+    else if( !aKey.CompareF(KInfraRed) )
+        {
+        if(inputStatus == EOn)
+            User::LeaveIfError(RProperty::Set(KIrdaPropertyCategory,
+                                KIrdaStatus,TIrdaStatusCodes::EIrLoaded));
+        else if(inputStatus == EOff)
+            User::LeaveIfError(RProperty::Set(KIrdaPropertyCategory,
+                                KIrdaStatus,TIrdaStatusCodes::EIrUnloaded));
+        else
+            User::Leave(KErrArgument);
+        }
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::SetGeneralInfoL()
+// Modifies the General Entity key values.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::SetGeneralInfoL(const TDesC& aKey, const CSysData* aInput)
+    {
+    // for all General Entity keys input must be of type EStatus.
+    if( aInput->DataType() != CSysData::EStatus )
+        User::Leave(KErrArgument);
+
+    TInt inStatus = ((CStatus*)aInput)->Status();
+
+    if( !aKey.CompareF(KInputLanguage) )
+        {
+        CPtiEngine* PtiEngine;
+        PtiEngine = CPtiEngine::NewL();
+        CleanupStack::PushL(PtiEngine);
+        User::LeaveIfError(PtiEngine->ActivateLanguageL(inStatus));
+        CleanupStack::PopAndDestroy(PtiEngine);
+        RepositoryUtil::SetRepositoryKeyL(KCRUidAknFep,
+                                        KAknFepInputTxtLang,inStatus);
+        }
+    else if( !aKey.CompareF(KPridictiveText) )
+        {
+        if( EEnabled == inStatus || EDisabled == inStatus )
+            RepositoryUtil::SetRepositoryKeyL(KCRUidAknFep,
+                                            KAknFepPredTxtFlag,inStatus);
+        else
+            User::Leave(KErrArgument);
+        }
+    else if( !aKey.CompareF(KVibraActive) )
+        {
+        if( EEnabled == inStatus || EDisabled == inStatus )
+            RepositoryUtil::SetRepositoryKeyL(KCRUidVibraCtrl,
+                                    KVibraCtrlProfileVibraEnabled,inStatus);
+        else
+            User::Leave(KErrArgument);
+        }
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::SetDisplayInfoL()
+// Modifies the Display Entity key values.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::SetDisplayInfoL(const TDesC& aKey, const CSysData* aInput)
+    {
+    // Input validation.
+    // For wallpaper input type must be EStingData and 
+    // for others keys input type must be EStatus.
+    if( !aKey.CompareF(KWallpaper) )
+        {
+        if(aInput->DataType() != CSysData::EStringData)
+            User::Leave(KErrArgument);
+        }
+    else if( aInput->DataType() != CSysData::EStatus )
+        User::Leave(KErrArgument);
+
+    TInt 	inputStatus = 0;
+    TPtrC 	inputString;
+    //Read Input data into InputStatus, InputString.
+    if( !aKey.CompareF(KWallpaper) )
+        {
+        ((CStringData*)aInput)->StringData(inputString);
+        }
+    else
+        {
+        inputStatus = ((CStatus*)aInput)->Status();
+        inputStatus = inputStatus;
+        }
+
+    //go thru Display entity keys.
+    // Display Entity keys requiring WriteDeviceData are commented currently as these are not
+    // usergrantable permissions.
+#ifdef _REQUIRE_WRITEDEVICEDATA_
+    if( !aKey.CompareF(KBrightness) )
+        {
+        if ( KBrightnessMax < inputStatus || KBrightnessMin > inputStatus )
+            User::Leave(KErrArgument);
+
+        RepositoryUtil::SetRepositoryKeyL(KCRUidLightSettings,
+                                            KLightIntensity,inputStatus);
+        }
+    else if( !aKey.CompareF(KScreenSaverTimeOut) )
+        {
+        if ( KScreenSaverTimeoutMax < inputStatus || 
+                KScreenSaverTimeoutMin > inputStatus )
+            User::Leave(KErrArgument);
+
+        RepositoryUtil::SetRepositoryKeyL(KCRUidPersonalizationSettings,
+                                    KSettingsScreenSaverPeriod,inputStatus);
+        }
+    else if( !aKey.CompareF(KAutoLockTime) )
+        {
+        if ( KAutoLockTimeoutMax < inputStatus || 
+                KAutoLockTimeoutMin > inputStatus )
+            User::Leave(KErrArgument);
+
+        RepositoryUtil::SetRepositoryKeyL(KCRUidSecuritySettings,
+                                    KSettingsAutoLockTime,inputStatus);
+        }
+    else if( !aKey.CompareF(KKeyGaurdTime) )
+        {
+        if ( KKeyGaurdTimeoutMax < inputStatus || 
+                KKeyGaurdTimeoutMin > inputStatus )
+            User::Leave(KErrArgument);
+
+        RepositoryUtil::SetRepositoryKeyL(KCRUidSecuritySettings,
+                                    KSettingsAutomaticKeyguardTime,inputStatus);
+        }
+    else if( !aKey.CompareF(KLightTimeOut) )
+        {
+        if ( KLightTimeoutMax < inputStatus || 
+                    KLightTimeoutMin > inputStatus )
+            User::Leave(KErrArgument);
+
+        RepositoryUtil::SetRepositoryKeyL(KCRUidLightSettings,
+                                    KDisplayLightsTimeout,inputStatus);
+        }
+#endif
+    if( !aKey.CompareF(KWallpaper) )
+        {
+        User::LeaveIfError(
+                AknsWallpaperUtils::SetIdleWallpaper(inputString,NULL,0));
+        }
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetInfoL() SYNC
+// Retrives the specified attribute value.
+// aOutput contains attribute value.
+// --------------------------------------------------------------------
+//
+EXPORT_C void CSysInfoService::GetInfoL( const TDesC& aEntity, const TDesC& aKey, 
+                                    CSysData*& aOutput,const CSysData* aInput )
+    {
+    // retrieve data based Entity
+    if( !aEntity.CompareF(KNetwork) )
+        GetNetworkInfoL(aKey,aOutput);
+
+    else if( !aEntity.CompareF(KBattery) )
+        GetBatteryInfoL(aKey,aOutput);
+
+    else if( !aEntity.CompareF(KConnectivity) )
+        GetConnectivittyInfoL(aKey,aOutput);
+
+    else if( !aEntity.CompareF(KDisplay) )
+        GetDisplayInfoL(aKey,aOutput);
+
+    else if( !aEntity.CompareF(KGeneral) )
+        GetGeneralInfoL(aKey,aOutput);
+
+    else if( !aEntity.CompareF(KMemory) )
+        GetMemoryInfoL(aKey,aInput,aOutput);
+
+    else if( !aEntity.CompareF(KDevice) )
+        GetDeviceInfoL(aKey,aOutput);
+
+    else if( !aEntity.CompareF(KFeatures) )
+        GetFeatureInfoL(aKey,aOutput);
+
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetInfoL() ASYNC
+// Creates an appropriate active object to serve the purpose of the 
+// specified system attribute. Adds created active object to 
+// Active Store.
+// --------------------------------------------------------------------
+//
+EXPORT_C void CSysInfoService::GetInfoL( const TDesC& aEntity, const TDesC& aKey, 
+                                    TInt32 aTransID, ISystemObserver* aCallback, 
+                                    const CSysData* aInput )
+    {
+    if(!aCallback)
+        User::Leave(KErrGeneral);
+
+    TSysRequest systemRequest(aEntity,aKey,aInput,aTransID,aCallback,
+                                            TSysRequest::EASyncONESHOT);
+
+    CActiveRequest* activeRequestObj;
+    CActiveRequest::CreateActiveRequestL(systemRequest,activeRequestObj);
+
+    //place handle on cleanupstack.
+    CleanupStack::PushL(activeRequestObj);
+    //Add request handle to active store.
+    ActiveStore::AddRequestL(activeRequestObj);
+    CleanupStack::Pop(activeRequestObj);
+    //Issue request.
+    TInt err = activeRequestObj->Request();
+
+    if( KErrNone != err)
+        {
+        ActiveStore::RemoveRequest(aTransID);
+        User::Leave(err);
+        }
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetNotificationL() ASYNC
+// Creates an appropriate active object to serve the purpose of the 
+// specified system attribute. Adds created active object to 
+// Active Store.
+// --------------------------------------------------------------------
+//
+EXPORT_C void CSysInfoService::GetNotificationL( const TDesC& aEntity, 
+                                    const TDesC& aKey, TInt32 aTransID, 
+                                    ISystemObserver* aCallback, 
+                                    const CSysData* aInput )
+    {
+    if(!aCallback)
+        User::Leave(KErrGeneral);
+
+    TSysRequest systemRequest(aEntity,aKey,aInput,aTransID,aCallback,
+                                        TSysRequest::ENotification);
+
+    CActiveRequest* activeRequestObj;
+    CActiveRequest::CreateActiveRequestL(systemRequest,activeRequestObj);
+
+    //place handle on cleanupstack.
+    CleanupStack::PushL(activeRequestObj);
+
+    //Add request handle to active store.
+    ActiveStore::AddRequestL(activeRequestObj);
+
+    //Issue request.
+    TInt err = activeRequestObj->Request();
+
+    if( KErrNone != err)
+        {
+        //remove request handle on cleanup stack.
+        CleanupStack::Pop(activeRequestObj);
+        ActiveStore::RemoveRequest(aTransID);
+        User::Leave(err);
+        }
+
+    //remove request handle on cleanup stack.
+    CleanupStack::Pop(activeRequestObj);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetNetworkInfoL()
+// Retrives network related synchronous keys information.
+// returns CSysData.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetNetworkInfoL(TPtrC aKey,CSysData*& aSysData)
+    {
+    TInt status = 0;
+    if ( !aKey.CompareF(KRegistrationStatus) )
+        {
+        User::LeaveIfError(RProperty::Get(KPSUidNetworkInfo,
+                                    KNWRegistrationStatus,status));
+        }
+    else if( !aKey.CompareF(KNetworkMode) )
+        {
+        User::LeaveIfError(RProperty::Get(KPSUidNetworkInfo,
+                                    KNWTelephonyNetworkMode,status));
+        }
+    else
+        {
+        User::Leave(KErrNotFound);
+        }
+    aSysData = CStatus::NewL((status-1));
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetBatteryInfoL()
+// Retrives battery related synchronous keys information.
+// On return aSysData consists of key value.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetBatteryInfoL(TPtrC aKey,CSysData*& aSysData)
+    {
+    TInt status = 0;
+    if( !aKey.CompareF(KChargingStatus) )
+        {
+        TInt chargeStatus = 0;
+        User::LeaveIfError(RProperty::Get(KPSUidHWRMPowerState,
+                                    KHWRMChargingStatus,chargeStatus));
+        // ChargeStatus is manupulated to give only these states Charging,
+        // NotCharging and Unknown
+        if ( EChargingStatusCharging == chargeStatus || 
+                EChargingStatusAlmostComplete == chargeStatus || 
+                EChargingStatusChargingContinued == chargeStatus )
+            status = ECharging;
+        else if( EChargingStatusNotConnected == chargeStatus || 
+                    EChargingStatusNotCharging == chargeStatus ||
+                    EChargingStatusChargingComplete == chargeStatus )
+            status = ENotCharging;
+        else
+            status = EUnknown;
+        }
+    else
+        User::Leave(KErrNotFound);
+    aSysData = CStatus::NewL(status);	
+    }
+// --------------------------------------------------------------------
+// CSysInfoService::GetMemoryInfoL()
+// Retrives memory related synchronous keys information.
+// On return aSysData consists of SA value.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetMemoryInfoL(const TDesC& aKey, const CSysData* aInput,
+										CSysData*& aOutput)
+    {
+    RFs Fs;
+    CleanupClosePushL(Fs);
+    User::LeaveIfError(Fs.Connect());
+
+    if ( !aKey.CompareF(KListDrives) )
+        {
+        TDriveList drives;
+        User::LeaveIfError(Fs.DriveList(drives));
+        aOutput = CDriveList::NewL(drives);
+        }
+    else if( !aKey.CompareF(KDriveInfo) )
+        {
+        CDriveInfo* inputDrvInfo=NULL;
+        if( aInput && CSysData::EDriveInfo == aInput->DataType())
+            inputDrvInfo = (CDriveInfo*) aInput;
+        else
+            User::Leave(KErrArgument);
+
+        TInt drvNumber = inputDrvInfo->DriveNumber();
+        if ( !Fs.IsValidDrive(drvNumber) )
+            User::Leave(KErrNotFound);
+
+        TVolumeInfo volumeInfo;
+        User::LeaveIfError(Fs.Volume(volumeInfo,drvNumber));
+        aOutput = CDriveInfo::NewL(drvNumber,volumeInfo);
+        }
+    else if( !aKey.CompareF(KMemoryCard) )
+        {
+        TInt memoryCardState (-1);
+        TInt defaultMemoryCard( 0 );
+        User::LeaveIfError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, defaultMemoryCard ) );
+        TUint driveStatus( 0 );
+        User::LeaveIfError( DriveInfo::GetDriveStatus( Fs, defaultMemoryCard, driveStatus ) );
+        if( driveStatus & DriveInfo::EDrivePresent )
+            memoryCardState = ETrue;
+        else
+            memoryCardState = EFalse;        
+        aOutput = CStatus::NewL(memoryCardState);
+
+        }
+    else
+        User::Leave(KErrNotFound);
+ 
+    CleanupStack::PopAndDestroy(&Fs);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetFeatureInfoL()
+// Retrives feature related synchronous keys information.
+// On return aSysData consists of key value.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetFeatureInfoL(TPtrC aKey,CSysData*& aSysData)
+    {
+    TInt featureID(0);
+
+    // Get the Feature ID to query feature manager.
+    if( !aKey.CompareF(KBlueTooth) )
+        featureID = KFeatureIdBt;
+    else if( !aKey.CompareF(KInfraRed) )
+        featureID = KFeatureIdIrda;
+    else if( !aKey.CompareF(KCamera) )
+        featureID = KFeatureIdCamera;
+    else if( !aKey.CompareF(KMemoryCard) )
+        featureID = KFeatureIdMmc;
+    else if( !aKey.CompareF(KFMRadio) )
+        featureID = KFeatureIdFmRadio;
+    else if( !aKey.CompareF(KQwerty) )
+        featureID = KFeatureIdQwertyInput;
+    else if( !aKey.CompareF(KWLan) )
+        featureID = KFeatureIdProtocolWlan;
+    else if( !aKey.CompareF(KUsb) )
+        featureID = KFeatureIdUsb;
+    else if( !aKey.CompareF(KPen) )
+        featureID = KFeatureIdPenSupport;
+    else if( !aKey.CompareF(KLED) )
+        featureID = KFeatureIdPenSupport;
+    else if( !aKey.CompareF(KCoverUI) )
+        featureID = KFeatureIdCoverDisplay;
+    else if( !aKey.CompareF(KSideVolumeKeys) )
+        featureID = KFeatureIdSideVolumeKeys;
+    else if( !aKey.CompareF(KVibra) )
+        featureID = KFeatureIdVibra;
+    else
+        User::Leave(KErrNotFound);
+
+    //Initialize feature manager if not.
+    if (!iFeatureManagerInitialized)
+        {
+        FeatureManager::InitializeLibL();
+        iFeatureManagerInitialized = ETrue;
+        }
+
+    TBool isSupported = ETrue;
+    // LED feature is read using HAL others feature manager.
+    if( !aKey.CompareF(KLED) )
+        {
+        TInt NumLEDs(0);
+        TInt Err = HAL::Get(HALData::ELEDs,NumLEDs);
+        if( KErrNone == Err )
+            isSupported = ETrue;
+        else if( KErrNotSupported == Err )
+            isSupported = EFalse;
+        else
+            User::Leave(Err);
+        }
+    else
+        {
+        isSupported = FeatureManager::FeatureSupported(featureID);
+        }
+
+    aSysData = CStatus::NewL(isSupported);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetConnectivityInfoL()
+// Retrives Connectivity related synchronous keys information.
+// On return aSysData consists of key value.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetConnectivittyInfoL(TPtrC aKey,CSysData*& aSysData)
+    {
+    if ( !aKey.CompareF(KBlueTooth) )
+        {
+        TInt bTPower = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidBluetoothPowerState,
+                                                KBTPowerState,bTPower);
+        aSysData = CStatus::NewL(bTPower);
+        }
+    else if( !aKey.CompareF(KInfraRed) )
+        {
+        TInt IRStatus(0);
+        TInt status(0);
+        User::LeaveIfError(RProperty::Get(KIrdaPropertyCategory,
+                                                KIrdaStatus,IRStatus));
+
+        // Map all possible Infra red status values to ON, OFF and UnKnown states.
+        if ( TIrdaStatusCodes::EIrLoaded == IRStatus || 
+                TIrdaStatusCodes::EIrDiscoveredPeer == IRStatus ||
+                TIrdaStatusCodes::EIrBlocked == IRStatus || 
+                TIrdaStatusCodes::EIrLostPeer == IRStatus || 
+                TIrdaStatusCodes::EIrDisconnected == IRStatus )
+            status = EOn;
+        else if( TIrdaStatusCodes::EIrUnloaded == IRStatus )
+            status = EOff;
+        else
+            status = EUnknown;
+
+        aSysData = CStatus::NewL(status);
+        }
+    else if( !aKey.CompareF(KWLanMacAddress) )
+        {
+        //result format 00:18:0f:1e:96:a2.
+        TBuf8<KPSWlanMacAddressLength> DesC8AddrText;
+        TBuf<KPhoneWlanMacAddressLength> FormatedMacAddress;
+
+        User::LeaveIfError(RProperty::Get(KPSUidWlan,
+                                        KPSWlanMacAddress,DesC8AddrText));
+        for ( TInt i=0; i < KPSWlanMacAddressLength; i++ )
+            {
+            // Set separator
+            if( i > 0 )
+                FormatedMacAddress.Append(KPhoneWlanSeparator);
+            
+            // Set data
+            TBuf<10> FormatText;
+            FormatText.Format(KWLanMACDataFormat,DesC8AddrText[i]);
+            FormatedMacAddress.Append(FormatText);
+            }  
+        aSysData = CStringData::NewL(FormatedMacAddress);
+        }
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetGeneralInfoL()
+// Retrives General Entity related synchronous keys information.
+// On return aSysData consists of key value.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetGeneralInfoL(TPtrC aKey,CSysData*& aSysData)
+    {
+    if( !aKey.CompareF(KConnectedAccessories) )
+        {
+        aSysData = CAccList::NewL();
+        }
+    else if( !aKey.CompareF(KInputLanguage) )
+        {
+        TInt inputLang = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidAknFep,
+                                        KAknFepInputTxtLang,inputLang);
+        aSysData = CStatus::NewL(inputLang);
+        }
+    else if( !aKey.CompareF(KSupportedLanguages) )
+        {
+        aSysData = CLanguageList::NewL();
+        }
+    else if( !aKey.CompareF(KPridictiveText) )
+        {
+        TInt pridictiveText =0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidAknFep,
+                                        KAknFepPredTxtFlag,pridictiveText);
+        aSysData = CStatus::NewL(pridictiveText);
+        }
+    else if( !aKey.CompareF(KVibraActive) )
+        {
+        TInt vibraState =0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidVibraCtrl,
+                                KVibraCtrlProfileVibraEnabled,vibraState);
+        aSysData = CStatus::NewL(vibraState);
+        }
+    else if( !aKey.CompareF(KFlipStatus) )
+        {
+        TInt flipState = 0;
+        User::LeaveIfError(RProperty::Get(KPSUidHWRM,
+                                            KHWRMFlipStatus,flipState));
+        if (flipState == EPSHWRMFlipOpen)
+            flipState = EOpen;
+        else if (flipState == EPSHWRMFlipClosed)
+            flipState = EClosed;
+        else
+            flipState = EUnknown;
+
+        aSysData = CStatus::NewL(flipState);
+        }	
+    else if( !aKey.CompareF(KGripStatus) )
+        {
+        TInt gripState = 0;
+        User::LeaveIfError(RProperty::Get(KPSUidHWRM,
+                                            KHWRMGripStatus,gripState));
+        if (gripState == EPSHWRMGripOpen)
+            gripState = EOpen;
+        else if (gripState == EPSHWRMGripClosed)
+            gripState = EClosed;
+        else
+            gripState = EUnknown;
+        
+        aSysData = CStatus::NewL(gripState);
+        }
+    else if( !aKey.CompareF(KAvailableUSBModes) )
+        {
+        GetAvailableUsbModesL(aSysData);
+        }
+    else if( !aKey.CompareF(KActiveUSBMode) )
+        {
+        RUsb usbsessn;
+
+        CleanupClosePushL(usbsessn);
+        User::LeaveIfError(usbsessn.Connect());
+        TInt activePersonality = 0;
+        User::LeaveIfError(usbsessn.GetCurrentPersonalityId(activePersonality));
+        HBufC* activeUsbMode = NULL;
+        User::LeaveIfError(usbsessn.GetDescription(activePersonality,activeUsbMode));
+        aSysData = CStringData::NewL(*activeUsbMode);
+        CleanupStack::PopAndDestroy(&usbsessn);
+        }
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetDisplayInfoL()
+// Retrives Display Entity related synchronous keys information.
+// On return aSysData consists of key value.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetDisplayInfoL(TPtrC aKey,CSysData*& aSysData)
+    {
+    if( !aKey.CompareF(KBrightness) )
+        {
+        TInt brightness = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidLightSettings,
+                                            KLightIntensity,brightness);
+        
+        aSysData = CStatus::NewL(brightness);
+        }
+    else if( !aKey.CompareF(KKeyGaurdTime) )
+        {
+        TInt keygaurdtime = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidSecuritySettings,
+                                KSettingsAutomaticKeyguardTime,keygaurdtime);
+        
+        aSysData = CStatus::NewL(keygaurdtime);
+        }
+    else if( !aKey.CompareF(KScreenSaverTimeOut) )
+        {
+        TInt screenSaverTimeOut = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidPersonalizationSettings,
+                                KSettingsScreenSaverPeriod,screenSaverTimeOut);
+        
+        aSysData = CStatus::NewL(screenSaverTimeOut);
+        }	
+    else if( !aKey.CompareF(KAutoLockTime) )
+        {
+        TInt autoLockTime = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidSecuritySettings,
+                                KSettingsAutoLockTime,autoLockTime);
+        
+        aSysData = CStatus::NewL(autoLockTime);
+        }	
+    else if( !aKey.CompareF(KAutoLockStatus) )
+        {
+        TInt keyLockState = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidSecuritySettings,
+                                KSettingsAutolockStatus,keyLockState);
+        
+        aSysData = CStatus::NewL(keyLockState);
+        }	
+    else if( !aKey.CompareF(KWallpaper) )
+        {
+        User::Leave(KErrNotSupported);
+        }
+    else if( !aKey.CompareF(KLightTimeOut) )
+        {
+        TInt lightTimeOut = 0;
+        RepositoryUtil::GetRepositoryKeyL(KCRUidLightSettings,
+                                KDisplayLightsTimeout,lightTimeOut);
+        
+        aSysData = CStatus::NewL(lightTimeOut);
+        }
+    else if( !aKey.CompareF(KDisplayResolution) )
+        {
+        TInt xPixels(0);
+        TInt yPixels(0);
+        User::LeaveIfError(HAL::Get(HALData::EDisplayXPixels,xPixels));
+        User::LeaveIfError(HAL::Get(HALData::EDisplayYPixels,yPixels));
+        aSysData = CResolution::NewL(xPixels,yPixels);
+        }		
+    else if( !aKey.CompareF(KDisplayOrientation) )
+        {
+        RWsSession session;
+        CleanupClosePushL(session);
+        User::LeaveIfError(session.Connect());
+        CWsScreenDevice *Device = new (ELeave) CWsScreenDevice(session);
+        CleanupStack::PushL(Device);
+        Device->Construct();
+        TPixelsTwipsAndRotation twipsRotation;
+        Device->GetDefaultScreenSizeAndRotation(twipsRotation);
+        aSysData = CStatus::NewL(twipsRotation.iRotation);
+        CleanupStack::PopAndDestroy(2,&session);
+        }
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetDeviceInfoL()
+// Retrives Device Entity related synchronous keys information.
+// On return aSysData consists of key value.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetDeviceInfoL(TPtrC aKey,CSysData*& aSysData)
+    {
+    //if iDeviceInfo not instantiated before. Instantiate now.
+    if( !iDeviceInfo )
+        iDeviceInfo = CDeviceInfo::NewL();
+
+    // read the requested key value.
+    if ( !aKey.CompareF(KFirmwareVersion) )
+        aSysData = CStringData::NewL(iDeviceInfo->FirmwareVersion());
+
+    else if( !aKey.CompareF(KProductType) )
+        aSysData = CStringData::NewL(iDeviceInfo->ProductType());
+
+    else if( !aKey.CompareF(KManufacturer) )
+        aSysData = CStringData::NewL(iDeviceInfo->Manufaturer());
+
+    else if( !aKey.CompareF(KPhoneModel) )
+        aSysData = CStringData::NewL(iDeviceInfo->Model());
+
+    else if( !aKey.CompareF(KIMEI) )
+        aSysData = CStringData::NewL(iDeviceInfo->IMEI());
+
+    else if( !aKey.CompareF(KMachineID) )
+        aSysData = CStatus::NewL(iDeviceInfo->MachineId());
+
+    else if( !aKey.CompareF(KPlatformVersion) )
+        {
+        TInt majorVer(0);
+        TInt minorVer(0);
+        iDeviceInfo->GetPlatformVersion(majorVer,minorVer);
+        aSysData = CVersion::NewL(majorVer,minorVer);
+        }
+    else
+        User::Leave(KErrNotFound);
+    }
+
+// --------------------------------------------------------------------
+// CSysInfoService::GetAvailableUsbModesL()
+// Retrives available USB modes.
+// returns CSysData.
+// --------------------------------------------------------------------
+//
+void CSysInfoService::GetAvailableUsbModesL(CSysData*& aSysData)
+    {
+    RUsb usbsessn;
+    CleanupClosePushL(usbsessn);
+    User::LeaveIfError(usbsessn.Connect());
+
+    RArray<TInt> usbModes;
+    CleanupClosePushL(usbModes);
+
+    User::LeaveIfError(usbsessn.GetPersonalityIds(usbModes));
+
+    CDesCArray*		usbModesDesArray;
+    usbModesDesArray = new (ELeave) CDesCArrayFlat(KGranularity);
+    CleanupStack::PushL(usbModesDesArray);
+
+    HBufC* modeName = NULL;
+    TInt Count = usbModes.Count();
+    for (TInt i=0; i<Count; i++)
+        {
+        usbsessn.GetDescription(usbModes[i],modeName);
+        //Creates own copy of the text.
+        usbModesDesArray->AppendL(*modeName);
+        // free allocated memory by GetDescription.
+        delete modeName;
+        }
+
+    //UsbModesDesArray ownership passed to CStringList.
+    aSysData = CStringList::NewL(usbModesDesArray);
+    CleanupStack::Pop(usbModesDesArray);
+    CleanupStack::PopAndDestroy(2,&usbsessn);
+    }
+
+// End of file.