diff -r 000000000000 -r b497e44ab2fc policymanagement/dmutilserver/src/DMUtilObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/policymanagement/dmutilserver/src/DMUtilObserver.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,312 @@ +/* +* Copyright (c) 2000 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: Implementation of policymanagement components +* +*/ + + +// INCLUDES + +#include "DMUtilObserver.h" +#include "DMUtilActiveObserver.h" +#include "PMUtilInternalCRKeys.h" +#include "policymnginternalpskeys.h" +#include "debug.h" + +#include +#include +#include + + +// CONSTANTS + +_LIT( KPolicyChangeCounterIni, "pcounter.ini"); +_LIT( KRFSCounterIni, "rfscounter.ini"); + +// MACROS +// DATA TYPES +// FUNCTION PROTOTYPES +// FORWARD DECLARATIONS + +namespace ObserverUtils +{ + TBool CheckValueL( const TDesC& aFile, const TUint32& aCentRepKey) + { + TBool retVal = EFalse; + CRepository* repository = CRepository::NewLC( KCRUidPolicyManagementUtilInternalKeys); + + //get counter value from central repository + TInt counterPreValue(0); + TInt counterRealValue(0); + User::LeaveIfError( repository->Get( aCentRepKey, counterRealValue)); + CleanupStack::PopAndDestroy( repository); + + //create binary presentation for values + TPckg realCounterPack( counterRealValue); + TPckg preCounterPack( counterPreValue); + + //Open file + RFs rfs; + User::LeaveIfError( rfs.Connect()); + CleanupClosePushL( rfs); + + RFile file; + CleanupClosePushL( file); + TBuf<100> fullName; + User::LeaveIfError( rfs.PrivatePath( fullName)); + fullName.Append( aFile); + + TInt err = file.Open( rfs, fullName, EFileRead|EFileWrite); + + if ( err == KErrPathNotFound) + { + //create private path if not exists + User::LeaveIfError( rfs.CreatePrivatePath( EDriveC)); + err = KErrNotFound; + } + + if ( err == KErrNotFound) + { + //create file with current counter value + User::LeaveIfError( file.Create( rfs, fullName, EFileRead|EFileWrite)); + User::LeaveIfError( file.Write( realCounterPack)); + User::LeaveIfError( file.Flush()); + } + else + { + //read pre-counter value + User::LeaveIfError( err); + User::LeaveIfError( file.Read( preCounterPack)); + + + if ( counterPreValue != counterRealValue) + { + //if counter values has changed, changes return value and update pre-value... + retVal = ETrue; + TInt offset(0); + User::LeaveIfError( file.Seek( ESeekStart, offset)); + User::LeaveIfError( file.Write( realCounterPack)); + User::LeaveIfError( file.Flush()); + } + + } + + //close sessions + CleanupStack::PopAndDestroy( 2, &rfs); + + return retVal; + } +} + +// ----------------------------------------------------------------------------- +// TDMUtilPassiveObserver::IsPolicyChangedL +// ----------------------------------------------------------------------------- +// + +EXPORT_C TBool TDMUtilPassiveObserver::IsPolicyChangedL() +{ + return ObserverUtils::CheckValueL( KPolicyChangeCounterIni, KPolicyChangeCounter); +} + +// ----------------------------------------------------------------------------- +// TDMUtilStaticObserver::IsRFSPerformedL +// ----------------------------------------------------------------------------- +// + +EXPORT_C TBool TDMUtilPassiveObserver::IsRFSPerformedL() +{ + return ObserverUtils::CheckValueL( KRFSCounterIni, KRFSCounterKey ); +} + + +// ----------------------------------------------------------------------------- +// CDMUtilActiveObserver::CDMUtilActiveObserver +// ----------------------------------------------------------------------------- +// + +CDMUtilActiveObserver::CDMUtilActiveObserver() + : iActiveObserver(0) +{ + +} + +// ----------------------------------------------------------------------------- +// CDMUtilActiveObserver::~CDMUtilActiveObserver +// ----------------------------------------------------------------------------- +// + +CDMUtilActiveObserver::~CDMUtilActiveObserver() +{ + delete iActiveObserver; +} + +// ----------------------------------------------------------------------------- +// CDMUtilActiveObserver::NewL +// ----------------------------------------------------------------------------- +// +EXPORT_C CDMUtilActiveObserver* CDMUtilActiveObserver::NewL( TPolicyManagementEventTypes aType) +{ + CDMUtilActiveObserver* self = new (ELeave) CDMUtilActiveObserver(); + CleanupStack::PushL( self); + self->iActiveObserver = CActiveObserver::NewL( aType); + + CleanupStack::Pop( self); + return self; +} + +// ----------------------------------------------------------------------------- +// CDMUtilActiveObserver::SubscribeEventL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDMUtilActiveObserver::SubscribeEventL( MActiveCallBackObserver* aDynamicCallBackObserver) +{ + iActiveObserver->SubscribeEventL( aDynamicCallBackObserver); +} + +// ----------------------------------------------------------------------------- +// CDMUtilActiveObserver::UnSubscribeEventL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CDMUtilActiveObserver::UnSubscribeEvent() +{ + iActiveObserver->UnSubscribeEvent(); +} + +// ----------------------------------------------------------------------------- +// CActiveObserver::CActiveObserver +// ----------------------------------------------------------------------------- +// + +CActiveObserver::CActiveObserver( TPolicyManagementEventTypes aType) + : CActive(0), type( aType), iSubscribed( 0) +{ + +} + +// ----------------------------------------------------------------------------- +// CActiveObserver::~CActiveObserver +// ----------------------------------------------------------------------------- +// + +CActiveObserver::~CActiveObserver() +{ + iProperty.Close(); + iSubcribers.Close(); + Deque(); +} + +// ----------------------------------------------------------------------------- +// CActiveObserver::NewL +// ----------------------------------------------------------------------------- +// + +CActiveObserver* CActiveObserver::NewL( TPolicyManagementEventTypes aType) +{ + CActiveObserver* self = new (ELeave) CActiveObserver( aType); + return self; +} + +// ----------------------------------------------------------------------------- +// CActiveObserver::SubscribeEventL +// ----------------------------------------------------------------------------- +// +void CActiveObserver::SubscribeEventL( MActiveCallBackObserver* aDynamicCallBackObserver) +{ + //add subsribers info to list + iSubcribers.Append( aDynamicCallBackObserver); + + if ( !iSubscribed) + { + //subscribe event + TUint32 key = SubscribeKey( type); + iProperty.Attach( KPolicyMngProperty, key); + iProperty.Subscribe( iStatus); + + //init.... + CActiveScheduler::Add( this); + SetActive(); + } + + iSubscribed = ETrue; +} + + +// ----------------------------------------------------------------------------- +// CActiveObserver::UnSubscribeEventL +// ----------------------------------------------------------------------------- +// +TUint32 CActiveObserver::SubscribeKey( TPolicyManagementEventTypes aType) +{ + TUint32 retVal = 0; + + switch ( aType) + { + case EPolicyChangedEvent: + retVal = KPolicyChangedCounter; + break; + default: + break; + } + + return retVal; +} + + +// ----------------------------------------------------------------------------- +// CActiveObserver::UnSubscribeEventL +// ----------------------------------------------------------------------------- +// +void CActiveObserver::UnSubscribeEvent() +{ + DoCancel(); + iSubscribed = EFalse; +} + + +// ----------------------------------------------------------------------------- +// CActiveObserver::UnSubscribeEventL +// ----------------------------------------------------------------------------- +// +void CActiveObserver::RunL() +{ + //notify subscribers.... + for ( TInt i(0); i < iSubcribers.Count(); i++) + { + iSubcribers[i]->EventLaunchedL(); + } + + //subscribe again... + SetActive(); + iProperty.Subscribe( iStatus); +} + +// ----------------------------------------------------------------------------- +// CActiveObserver::DoCancel +// ----------------------------------------------------------------------------- +// +void CActiveObserver::DoCancel() +{ + iProperty.Close(); + iSubcribers.Reset(); +} + + + + + + + + + +