--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/srvuisrc/AknNotifierControllerPlugin.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,288 @@
+/*
+* Copyright (c) 2002-2007 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 <eikenv.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <uikon/eikenvinterface.h>
+#include <uikon/eiknotifyalert.h>
+#endif
+
+#include "AknNotifierControllerPlugin.h"
+#include <s32mem.h>
+#include <eikappui.h>
+#include <aknkeys.h>
+#include <coedef.h>
+#include <uikon/eiksrvui.h>
+#include <eikon.hrh>
+#include <apgwgnam.h>
+#include <AknDlgShut.h>
+#include <bautils.h>
+#include <AknNotifySignature.h>
+#include <AknCapServerDefs.h>
+
+const TInt KAknObserverListGranularity = 4;
+
+_LIT(KRESOURCEFILE,"z:\\resource\\aknnotpi.rsc");
+
+EXPORT_C void CAknNotifierController::RegisterNotifierControllerPlugin(CAknNotifierWrapper* aMe,
+ TBool aUnregister)
+ {
+ if (!aMe)
+ {
+ return;
+ }
+
+ if (!aUnregister)
+ {
+ if (FindNotifierWrapperIndex(aMe) == KErrNotFound)
+ {
+ TRAP_IGNORE( iRegisteredList->AppendL(aMe) );
+ }
+ }
+ else
+ {
+ TInt index = FindNotifierWrapperIndex(aMe);
+ if (index != KErrNotFound)
+ {
+ iRegisteredList->Delete(index);
+ }
+ }
+ }
+
+void CAknNotifierController::NotifyAppServers(TInt aCmd)
+ {
+ TUid commonServerUid = {0};
+
+ // Do this only once for common notifier server.
+ // Re-use existing session from pre-loaded wrapper, otherwise handle as any other wrapper.
+ if (iPreloadList.Count())
+ {
+ CAknCommonNotifierWrapper* ccl = iPreloadList[0];
+ commonServerUid = ccl->AppServerUid();
+ ccl->DoNotifierControllerCommand(aCmd);
+ }
+
+ // and for akncapserver
+ RAknUiServer* akncapserverClient = CAknSgcClient::AknSrv();
+ if ( akncapserverClient && akncapserverClient->Handle() )
+ {
+ akncapserverClient->DoNotifierControllerCommand(aCmd);
+ }
+
+ TInt count = iRegisteredList->Count();
+ for (TInt ii = 0; ii < count; ii++)
+ {
+ CAknNotifierWrapper* nw = (*iRegisteredList)[ii];
+ TUid appserverUid = nw->AppServerUid();
+ if ( appserverUid != commonServerUid && appserverUid != KAknCapServerUid)
+ {
+ nw->DoNotifierControllerCommand(aCmd);
+ }
+ }
+ }
+
+TInt CAknNotifierController::FindNotifierWrapperIndex(CAknNotifierWrapper* aPtr)
+ {
+ TInt index = KErrNotFound;
+ TInt count = iRegisteredList->Count();
+ for (TInt ii = 0; ii < count; ii++)
+ {
+ if ( ((*iRegisteredList)[ii]) == aPtr)
+ {
+ index = ii;
+ }
+ }
+ return index;
+ }
+
+CAknNotifierController* CAknNotifierController::NewL()
+ {
+ CAknNotifierController* self = new(ELeave)CAknNotifierController();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); //self
+ return self;
+ }
+
+void CAknNotifierController::ConstructL()
+ {
+ TFileName resourceFile;
+ resourceFile.Append(KRESOURCEFILE);
+ BaflUtils::NearestLanguageFile(CEikonEnv::Static()->FsSession(),resourceFile);
+ iResourceFileOffset = CEikonEnv::Static()->AddResourceFileL(resourceFile);
+
+ iObserverList = new(ELeave)CArrayPtrFlat<MAknKeyLockObserver>(KAknObserverListGranularity);
+ iRegisteredList = new(ELeave)CArrayPtrFlat<CAknNotifierWrapper>(KAknObserverListGranularity);
+ iController = new (ELeave) CAknNotifierControllerUtility(0);
+
+ // Make sure AppUi has a pointer to this (Obsolete, Fix Me !!)
+ STATIC_CAST(CEikServAppUi*,CEikonEnv::Static()->AppUi())->iKeyLockController = this;
+ }
+
+CAknNotifierController::CAknNotifierController()
+:iAllowNotifications(ETrue)
+ {
+ }
+
+CAknNotifierController::~CAknNotifierController()
+ {
+ delete iObserverList;
+ iPreloadList.Close();
+ if (iResourceFileOffset)
+ {
+ CCoeEnv::Static()->DeleteResourceFile(iResourceFileOffset);
+ }
+ }
+
+TBool CAknNotifierController::IsKeyLockEnabled()
+ {
+ TBool ret = EFalse;
+ if (KeylockReady())
+ {
+ ret = iKeylock.IsKeyLockEnabled();
+ }
+
+ return ret;
+ }
+
+TBool CAknNotifierController::AllowNotifications()
+ {
+ return iAllowNotifications;
+ }
+
+void CAknNotifierController::UnlockKeys()
+ {
+ if (KeylockReady())
+ {
+ iKeylock.DisableKeyLock();
+ }
+ }
+
+void CAknNotifierController::LockKeys(TBool aAutoLockOn)
+ {
+ if (KeylockReady())
+ {
+ if (!aAutoLockOn)
+ iKeylock.EnableKeyLock();
+ else
+ iKeylock.EnableAutoLockEmulation();
+ }
+ }
+
+void CAknNotifierController::AddObserverL(MAknKeyLockObserver* aObserver)
+ {
+#if defined(_DEBUG)
+ TInt count = iObserverList->Count();
+ for (TInt ii = 0; ii < count; ii++)
+ {
+ if ( ((*iObserverList)[ii]) == aObserver)
+ {
+ User::Invariant();
+ }
+ }
+#endif
+ iObserverList->AppendL(aObserver);
+ }
+
+void CAknNotifierController::RemoveObserver(MAknKeyLockObserver* aObserver)
+ {
+ TInt count = iObserverList->Count();
+ for (TInt ii = 0; ii < count; ii++)
+ {
+ if ( ((*iObserverList)[ii]) == aObserver)
+ {
+ iObserverList->Delete(ii);
+ return;
+ }
+ }
+#if defined(_DEBUG)
+ User::Invariant();
+#endif
+ }
+
+void CAknNotifierController::NotifyStatusChange(TKeyLockStatus aStatus)
+ {
+ TInt count = iObserverList->Count();
+ for (TInt ii = count-1; ii >= 0; ii--)
+ {
+ ((*iObserverList)[ii])->KeyLockStatusChange(aStatus);
+ }
+ }
+
+void CAknNotifierController::DoAllowNotifications()
+ {
+ TBool lastvalue = iAllowNotifications;
+ iAllowNotifications = ETrue;
+ NotifyStatusChange(EKeyLockAllowNotifications);
+ iController->DoAllowNotifications();
+ if (!lastvalue)
+ {
+ // Enable FSW (could use direct connect to AknCapServer to do this as well).
+ STATIC_CAST(CEikServAppUi*,CEikonEnv::Static()->AppUi())->SuppressAppSwitching(EFalse);
+ }
+ }
+
+void CAknNotifierController::DoStopNotifications()
+ {
+ TBool lastvalue = iAllowNotifications;
+ iAllowNotifications = EFalse;
+ NotifyStatusChange(EKeyLockStopNotifications);
+ iController->DoStopNotifications();
+ if (lastvalue)
+ {
+ // Disable FSW (could use direct connect to AknCapServer to do this as well).
+ STATIC_CAST(CEikServAppUi*,CEikonEnv::Static()->AppUi())->SuppressAppSwitching(ETrue);
+ }
+ }
+
+void CAknNotifierController::DoCancelAllNotificatons()
+ {
+ // Used when end key is pressed, to allow phone app to cancel all
+ // notifications. Global notes / soft notifications that would
+ // not normally be shown (out of priority) are not cancelled.
+ if ( IsKeyLockEnabled() )
+ {
+ return;
+ }
+
+ NotifyStatusChange(EKeyLockCancelNotification);
+
+ // Send cancel key event to all other notifications, and hope they cancel.
+ // Ignore error message - there's nothing more we can do.
+ TRAP_IGNORE(iController->DoCancelAllNotificatonsL());
+ }
+
+TBool CAknNotifierController::KeylockReady()
+ {
+ if (iKeylock.Handle() == 0)
+ {
+ if (iKeylock.Connect() != KErrNone)
+ {
+ return EFalse;
+ }
+ }
+ return ETrue;
+ }
+
+EXPORT_C void CAknNotifierController::RegisterPreloadPluginL(CAknCommonNotifierWrapper* aNotifier)
+ {
+ User::LeaveIfError(iPreloadList.Append(aNotifier));
+ }
+
+// end of file