diff -r 000000000000 -r 2e3d3ce01487 commonappservices/alarmserver/Server/Source/ASSrvEnvironmentChangeManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonappservices/alarmserver/Server/Source/ASSrvEnvironmentChangeManager.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,183 @@ +// Copyright (c) 1999-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 "ASSrvEnvironmentChangeManager.h" + +// System includes + +// User includes +#include "ASSrvStaticUtils.h" +#include "ASSrvServerWideData.h" +#include "ASSrvSessionCollection.h" +#include "ASSrvEnvironmentChangeObserver.h" + +// Type definitions + +// Constants + +// Enumerations + +// Classes referenced + + +// +// ----> CASSrvEnvironmentChangeManager (source) +// + +//************************************************************************************* +CASSrvEnvironmentChangeManager::CASSrvEnvironmentChangeManager(CASSrvServerWideData& aServerWideData) +: iServerWideData(aServerWideData) + { + } + + +//************************************************************************************* +CASSrvEnvironmentChangeManager::~CASSrvEnvironmentChangeManager() + { + iObservers.Close(); + delete iChangeNotifier; + } + + +//************************************************************************************* +void CASSrvEnvironmentChangeManager::ConstructL() + { + CachedWorkDays() = TLocale().WorkDays(); + +#ifdef _DEBUG + iEnvChgHandling = ETrue; +#endif + + + // The priority of the change notifier should also be above that of the CASSrvAlarmTimer + // When the system time is moved forward, if the UI broadcasts multiple events, like locale change + // then at the end of handling of the first locale event, the alarm's due time is calculated as the old time + // and the timer is called with it. In the meantime if the system time is also changed then the timer + // expires with KErrUnderflow which causes the old alarm to go off. + iChangeNotifier = CEnvironmentChangeNotifier::NewL(CActive::EPriorityHigh+1, TCallBack(EnvironmentChangeCallBack, this)); + iChangeNotifier->Start(); + } + + +//************************************************************************************* +CASSrvEnvironmentChangeManager* CASSrvEnvironmentChangeManager::NewL(CASSrvServerWideData& aServerWideData) + { + CASSrvEnvironmentChangeManager* self = new(ELeave) CASSrvEnvironmentChangeManager(aServerWideData); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +// +// +// + + +//************************************************************************************* +/** + * Request environment change notifications + */ +void CASSrvEnvironmentChangeManager::RequestEnvironmentChangesL(MASSrvEnvironmentChangeObserver& aObserver) + { + User::LeaveIfError(iObservers.InsertInAddressOrder(&aObserver)); + } + + +//************************************************************************************* +/** + * Cancel a previous change notification request + */ +void CASSrvEnvironmentChangeManager::RequestEnvironmentChangesCancel(MASSrvEnvironmentChangeObserver& aObserver) + { + TInt index = KErrNotFound; + const TInt error = iObservers.FindInAddressOrder(&aObserver, index); + if (error != KErrNotFound) + iObservers.Remove(index); + } + + +// +// +// + + +//************************************************************************************* +/** + * @internalComponent + */ +TBool CASSrvEnvironmentChangeManager::EnvironmentChangeCallBack(TAny* aSelf) + { + CASSrvEnvironmentChangeManager& self = *reinterpret_cast(aSelf); +#ifdef _DEBUG + if(!self.iEnvChgHandling) + { + return ETrue; + } +#endif + self.HandleEnvironmentChange(); + return ETrue; + } + + +// +// +// + + +//************************************************************************************* +/** + * Handle an environment change event + */ +void CASSrvEnvironmentChangeManager::HandleEnvironmentChange() + { + if (!iHaveAbsorbedFirstChange) + { + iHaveAbsorbedFirstChange = ETrue; + return; + } + + const TInt changes = iChangeNotifier->Change(); + // + TBool workDaysChanged = EFalse; + if (changes & EChangesLocale) + { + const TUint workdays = TLocale().WorkDays(); + if (workdays != CachedWorkDays()) + { + CachedWorkDays() = workdays; + workDaysChanged = ETrue; + } + } + + // Cascade changes to observers + const TInt count = iObservers.Count(); + for(TInt i=0; iMEnvChangeHandleEvent(changes, CachedWorkDays(), workDaysChanged); + } + + } + + + + + + + + + +