serviceproviders/sapi_sysinfo/sysinfoservice/src/activerequests.cpp
changeset 5 989d2f495d90
child 23 50974a8b132e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_sysinfo/sysinfoservice/src/activerequests.cpp	Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,553 @@
+/*
+* 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:  class implementation
+*
+*/
+
+
+#include <centralrepository.h>
+#include <btserversdkcrkeys.h>
+#include <SettingsInternalCRKeys.h>
+#include <HWRMVibraSDKCRKeys.h>
+#include <HWRMLightDomainCRKeys.h>
+#include <AknFepInternalCRKeys.h>
+#include <SysUtilDomainCRKeys.h>
+
+#include <UikonInternalPSKeys.h>
+#include <NetworkHandlingDomainPSKeys.h>
+#include <HWRMDomainPSKeys.h>
+#include <hwrmpowerstatesdkpskeys.h>
+#include <IR_SOCK.H>
+
+#include "activerequests.h"
+#include "sysinfoservice.h"
+#include "entitykeys.h"
+#include "SysInfoUtils.h"
+
+using namespace SysInfo;
+_LIT(KDriveSeperator,":\\");
+const TInt KMaxDriveLength = 5;
+
+// --------------------------------------------------------------------
+// CCenrepNotifier::CCenrepNotifier()
+// C++ default constructor.
+// --------------------------------------------------------------------
+//
+CCenrepNotifier::CCenrepNotifier(TSysRequest::TRequestType aReqType,
+                                TInt32 aTransID, TCommand aCommand,
+                                ISystemObserver* aObsrver)
+                                :CActiveRequest(aReqType,aTransID,aObsrver),	
+                                iCommand(aCommand)
+    {
+    }
+
+// --------------------------------------------------------------------
+// CCenrepNotifier::~CCenrepNotifier()
+// Destructor.
+// --------------------------------------------------------------------
+//
+CCenrepNotifier::~CCenrepNotifier()
+    {
+    Cancel();
+    delete iCenrep;
+    delete iEntity;
+    delete iKey;
+    }
+
+// --------------------------------------------------------------------
+// CCenrepNotifier::NewL()
+// Two-phased constructor, returns instance of this class.
+// --------------------------------------------------------------------
+//
+CCenrepNotifier* CCenrepNotifier::NewL(const TSysRequest& aRequest, 
+                                                    TCommand aCommand)
+    {
+    CCenrepNotifier* self;
+    self = new (ELeave) CCenrepNotifier(aRequest.RequestType(),
+                                        aRequest.TransactionID(),
+                                        aCommand,aRequest.Observer());
+
+    CleanupStack::PushL(self);
+    self->ConstructL(aRequest);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// --------------------------------------------------------------------
+// CCenrepNotifier::ConstructL()
+// 2nd Phase constructor to allocate required resources for this obj.
+// --------------------------------------------------------------------
+//
+void CCenrepNotifier::ConstructL(const TSysRequest& aRequest)
+    {
+    //supportes only notifications.
+    if(TSysRequest::ENotification != RequestType())
+        User::Leave(KErrNotSupported);
+
+    // Identify repository uid and key.
+    switch (iCommand)
+        {
+        case EPridictiveText:
+            iRepositoryUid = KCRUidAknFep;
+            iRepositoryKey = KAknFepPredTxtFlag;
+            break;
+
+        case EInputLanguage:
+            iRepositoryUid = KCRUidAknFep;
+            iRepositoryKey = KAknFepInputTxtLang;
+            break;
+
+        case EBlueTooth:
+            iRepositoryUid = KCRUidBluetoothPowerState;
+            iRepositoryKey = KBTPowerState;
+            break;
+
+        case EVibra:
+            iRepositoryUid = KCRUidVibraCtrl;
+            iRepositoryKey = KVibraCtrlProfileVibraEnabled;
+            break;
+    
+        case EKeyLock:
+            iRepositoryUid = KCRUidSecuritySettings;
+            iRepositoryKey = KSettingsAutolockStatus;
+            break;
+
+        default: 
+            User::Leave(KErrNotFound);
+        }
+
+    // create repository instance.
+    iCenrep = CRepository::NewL(iRepositoryUid);	
+    // Make local copy of SA.
+    iEntity = aRequest.Entity().AllocL();
+    iKey	= aRequest.Key().AllocL();
+    }
+
+// --------------------------------------------------------------------
+// CCenrepNotifier::Request()
+// Issues notification request.
+// --------------------------------------------------------------------
+//
+TInt CCenrepNotifier::Request ()
+    {
+    if( !IsActive() )
+        {
+        iCenrep->NotifyRequest(iRepositoryKey, iStatus);
+        SetActive ();
+        }
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------
+// CCenrepNotifier::RunL()
+// Gets called in event of request completion or error situation.
+// --------------------------------------------------------------------
+//
+void CCenrepNotifier::RunL()
+    {
+    TInt Error(iStatus.Int());
+
+    if (KErrNone <= Error)
+        {
+        // Re-Issue request
+        Request ();
+        Error = iCenrep->Get(iRepositoryKey,iValue);
+        //Create CSysData
+        CStatus* Status = CStatus::NewL(iValue);
+        // Calling Observer response method.
+        TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity, *iKey, Status,
+                                            TransactionID(),RequestType(),Error));
+        }
+    else
+        {
+        TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity, *iKey, NULL,
+                TransactionID(),RequestType(),Error));
+
+        ActiveStore::RemoveRequest(TransactionID());
+        }
+    }
+
+// --------------------------------------------------------------------
+// CCenrepNotifier::DoCancel()
+// Cancel ongoing request.
+// --------------------------------------------------------------------
+//
+void CCenrepNotifier::DoCancel()
+    {
+    iCenrep->NotifyCancel(iRepositoryKey);
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::CPubSubNotifier()
+// C++ default constructor.
+// --------------------------------------------------------------------
+//
+CPubSubNotifier::CPubSubNotifier(TSysRequest::TRequestType aReqType, 
+                                TInt32 aTransID, TCommand aCommand,
+                                ISystemObserver* aObsrver)
+                                :CActiveRequest(aReqType,aTransID,aObsrver),	
+                                iValue(EUnknown), iCommand(aCommand)
+    {
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::~CPubSubNotifier()
+// Destructor.
+// --------------------------------------------------------------------
+//
+CPubSubNotifier::~CPubSubNotifier()
+    {
+    Cancel();
+    iProperty.Close();
+    delete iEntity;
+    delete iKey;
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::NewL()
+// Two-phased constructor, returns instance of this class.
+// --------------------------------------------------------------------
+//
+CPubSubNotifier* CPubSubNotifier::NewL(const TSysRequest& aRequest, 
+                                                    TCommand aCommand)
+    {
+    CPubSubNotifier* self;
+    self = new (ELeave) CPubSubNotifier( aRequest.RequestType(),
+                                        aRequest.TransactionID(),
+                                        aCommand,aRequest.Observer() );
+
+    CleanupStack::PushL(self);
+    self->ConstructL (aRequest);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::ConstructL()
+// 2nd Phase constructor to allocate required resources for this obj.
+// --------------------------------------------------------------------
+//
+void CPubSubNotifier::ConstructL (const TSysRequest& aRequest)
+    {
+    //supportes only notifications.
+    if(TSysRequest::ENotification != RequestType())
+        User::Leave(KErrNotSupported);
+
+    // Identify publish subscribe category uid and key based on command.
+    switch (iCommand)
+        {
+        case ERegistrationStatus:
+            iPropertyUid = KPSUidNetworkInfo;
+            iPropertyKey = KNWRegistrationStatus;
+            break;
+
+        case ENetworkMode:
+            iPropertyUid = KPSUidNetworkInfo;
+            iPropertyKey = KNWTelephonyNetworkMode;
+            break;
+
+        case EChargingStatus:
+            iPropertyUid = KPSUidHWRMPowerState;
+            iPropertyKey = KHWRMChargingStatus;
+            break;
+
+        case EFlipStatus:
+            iPropertyUid = KPSUidHWRM;
+            iPropertyKey = KHWRMFlipStatus;
+            break;
+
+        case EGripStatus:
+            iPropertyUid = KPSUidHWRM;
+            iPropertyKey = KHWRMGripStatus;
+            break;
+
+        case EInfraRed:
+            iPropertyUid = KIrdaPropertyCategory;
+            iPropertyKey = KIrdaStatus;
+            break;
+
+        case EMemoryCard:
+            iPropertyUid = KPSUidUikon;
+            iPropertyKey = KUikMMCInserted;
+            break;
+
+        default:
+            User::Leave(KErrNotFound);
+        }
+
+    User::LeaveIfError (iProperty.Attach(iPropertyUid,iPropertyKey));
+    // Make local copy of SA.
+    iEntity = aRequest.Entity().AllocL();
+    iKey	= aRequest.Key().AllocL();
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::Request()
+// Issues notification request.
+// --------------------------------------------------------------------
+//
+TInt CPubSubNotifier::Request()
+    {
+    if( !IsActive() )
+        {
+        iProperty.Subscribe(iStatus);
+        SetActive ();
+        }
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::RunL()
+// Gets called in event of request completion or error situation.
+// --------------------------------------------------------------------
+//
+void CPubSubNotifier::RunL()
+    {
+    //get error.
+    TInt Error(iStatus.Int());
+    TInt value = 0;	
+
+    if (KErrNone <= Error)
+    {
+    // Re-Issue request
+    Request();
+    // read value.
+    iProperty.Get(value);
+    switch (iCommand)
+        {
+        case EChargingStatus:
+            // ChargeStatus need to be mapped to one these states Charging,
+            // NotCharging and Unknown
+            if ( EChargingStatusCharging == value || 
+                    EChargingStatusAlmostComplete == value ||
+                    EChargingStatusChargingContinued == value )
+                value = ECharging;
+            
+            else if( EChargingStatusNotConnected == value || 
+                        EChargingStatusNotCharging == value || 
+                        EChargingStatusChargingComplete == value)
+                value = ENotCharging;
+            
+            else
+                value = EUnknown;
+            break;
+
+        case EInfraRed:
+            // IRStatus need to be mapped to one these states 
+            // ON, OFF, UNKNOWN.
+            if ( TIrdaStatusCodes::EIrLoaded == value || 
+                    TIrdaStatusCodes::EIrDiscoveredPeer == value ||
+                    TIrdaStatusCodes::EIrBlocked == value || 
+                    TIrdaStatusCodes::EIrLostPeer == value || 
+                    TIrdaStatusCodes::EIrDisconnected == value )
+                value = EOn;
+            else if( TIrdaStatusCodes::EIrUnloaded == value )
+                value = EOff;
+            else
+                value = EUnknown;
+            break;
+
+        case EFlipStatus:
+        case EGripStatus:
+            if (value == EPSHWRMFlipOpen)
+                value = EOpen;
+            else if (value == EPSHWRMFlipClosed)
+                value = EClosed;
+            else
+                value = EUnknown;
+            break;
+        
+        case ERegistrationStatus:
+        case ENetworkMode :	
+        case EMemoryCard:
+            break;
+        
+        default:
+            Error= KErrGeneral;
+        }
+    
+    if((value != iValue))
+        {
+        iValue = value;
+        //Create output CSysData
+        CStatus* Status = CStatus::NewL(iValue);
+        //Calling Observer Handle.
+        TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity, *iKey, Status,
+                                        TransactionID(),RequestType(),Error));
+        }    
+    }
+    else
+    {
+    TRAP_IGNORE(SystemObserver()->HandleResponseL(*iEntity, *iKey, NULL,
+            TransactionID(),RequestType(),Error));
+
+    ActiveStore::RemoveRequest(TransactionID());
+    }
+
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::DoCancel()
+// Cancel ongoing request.
+// --------------------------------------------------------------------
+//
+void CPubSubNotifier::DoCancel()
+    {
+    iProperty.Cancel();
+    }
+
+// --------------------------------------------------------------------
+// CCriticalMemNotifier::CCriticalMemNotifier()
+// C++ default constructor.
+// --------------------------------------------------------------------
+//
+CCriticalMemNotifier::CCriticalMemNotifier(TSysRequest::TRequestType aReqType, 
+                                TInt32 aTransID,ISystemObserver* aObsrver)
+                                :CActiveRequest(aReqType,aTransID,aObsrver)
+    {
+    }
+
+// --------------------------------------------------------------------
+// CCriticalMemNotifier::~CCriticalMemNotifier()
+// Destructor.
+// --------------------------------------------------------------------
+//
+CCriticalMemNotifier::~CCriticalMemNotifier()
+    {
+    Cancel();
+    iFs.Close();
+    }
+
+// --------------------------------------------------------------------
+// CCriticalMemNotifier::NewL()
+// Two-phased constructor, returns instance of this class.
+// --------------------------------------------------------------------
+//
+CCriticalMemNotifier* CCriticalMemNotifier::NewL(const TSysRequest& aRequest)
+    {
+    CCriticalMemNotifier* self;
+    self = new (ELeave) CCriticalMemNotifier(aRequest.RequestType(),
+                        aRequest.TransactionID(),aRequest.Observer());
+
+    CleanupStack::PushL(self);
+    self->ConstructL (aRequest);
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// --------------------------------------------------------------------
+// CCriticalMemNotifier::ConstructL()
+// 2nd Phase constructor to allocate required resources for this obj.
+// --------------------------------------------------------------------
+//
+void CCriticalMemNotifier::ConstructL(const TSysRequest& aRequest)
+    {
+    //supportes only notifications.
+    if(TSysRequest::ENotification != RequestType())
+        User::Leave(KErrNotSupported);
+
+    CDriveInfo* DrvInfo=NULL;
+    //Input validation.
+    if( aRequest.SystemData() && 
+            CSysData::EDriveInfo == aRequest.SystemData()->DataType() )
+        DrvInfo = (CDriveInfo*)aRequest.SystemData();
+    else
+        User::Leave(KErrArgument);
+
+    iDrvNumber = DrvInfo->DriveNumber();
+    iCriticalFreeMemory = DrvInfo->CriticalSpace();
+
+    CleanupClosePushL(iFs);
+    User::LeaveIfError(iFs.Connect());
+
+    // If Critical Memory not specified assume system defaults.
+    if( -1 == iCriticalFreeMemory )
+        {
+        TVolumeInfo VolumeInfo;
+        User::LeaveIfError(iFs.Volume(VolumeInfo,iDrvNumber));
+        if(EMediaRam == VolumeInfo.iDrive.iType)
+            RepositoryUtil::GetRepositoryKeyL(KCRUidDiskLevel,
+                                KRamDiskCriticalLevel, iCriticalFreeMemory);
+        else
+            RepositoryUtil::GetRepositoryKeyL(KCRUidDiskLevel,
+                                KDiskCriticalThreshold, iCriticalFreeMemory);
+        }
+    CleanupStack::Pop(&iFs);
+    }
+
+// --------------------------------------------------------------------
+// CCriticalMemNotifier::Request()
+// Issues notification request.
+// --------------------------------------------------------------------
+//
+TInt CCriticalMemNotifier::Request ()
+    {
+    if( !IsActive() )
+        {
+        iFs.NotifyDiskSpace(iCriticalFreeMemory,iDrvNumber,iStatus);
+        SetActive();
+        }
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------
+// CCriticalMemNotifier::RunL()
+// Gets called in event of request completion or error situation.
+// --------------------------------------------------------------------
+//
+void CCriticalMemNotifier::RunL()
+    {
+    TInt error(iStatus.Int());
+
+    if(KErrNone <= error)
+        {
+        //Re-Issue request.
+        Request();
+    
+        //Specify the Drive number in output CSysData.
+        TBuf<KMaxDriveLength> drv;
+        drv.FillZ();
+        drv.Append('A'+iDrvNumber);
+        drv.Append(KDriveSeperator);
+        CStringData* drive = CStringData::NewL(drv);
+    
+        TVolumeInfo VolumeInfo;
+        iFs.Volume(VolumeInfo,iDrvNumber);
+    
+        //Call Observer handle.
+        if(VolumeInfo.iFree <= iCriticalFreeMemory)
+        	TRAP_IGNORE(SystemObserver()->HandleResponseL(KMemory, KCriticalMemory,
+                                        drive,TransactionID(),RequestType(),error));
+        }
+    else
+        {
+        TRAP_IGNORE(SystemObserver()->HandleResponseL(KMemory, KCriticalMemory,
+                                    NULL,TransactionID(),RequestType(),error));
+        ActiveStore::RemoveRequest(TransactionID());
+        }
+
+    }
+
+// --------------------------------------------------------------------
+// CPubSubNotifier::DoCancel()
+// Cancel ongoing request.
+// --------------------------------------------------------------------
+//
+void CCriticalMemNotifier::DoCancel()
+    {
+    iFs.NotifyDiskSpaceCancel(iStatus);
+    }
+
+// End of file