uifw/EikStd/srvuisrc/AknNotifierControllerPlugin.cpp
changeset 0 2f259fa3e83a
--- /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