uifw/AknGlobalUI/AknCapServer/src/akncapserverdiscreetpopuphandler.cpp
changeset 0 2f259fa3e83a
child 4 8ca85d2f0db7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AknGlobalUI/AknCapServer/src/akncapserverdiscreetpopuphandler.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,437 @@
+/*
+* Copyright (c) 2002-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:  Avkon cap server discreet popup handler.
+*
+*/
+
+#include <apgtask.h>
+#include <coeaui.h>
+#include <e32property.h>
+#include <avkondomainpskeys.h>
+
+#include "akncapserverdiscreetpopuphandler.h"
+#include "akndiscreetpopupcontrol.h"
+#include "akndiscreetpopupdata.h"
+
+const TUid KAknCapServerDiscreetPopupHandler = { 0x2001FDF8 };
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::~CAknCapServerDiscreetPopupHandler
+// ---------------------------------------------------------------------------
+//
+CAknCapServerDiscreetPopupHandler::~CAknCapServerDiscreetPopupHandler()
+    {
+    for ( TInt i = 0; i < iPopupDataArray.Count(); i++ )
+        {
+        if ( iPopupDataArray[ i ].iPopupControl )
+            {
+            delete iPopupDataArray[ i ].iPopupControl;
+            iPopupDataArray[ i ].iPopupControl = NULL;
+            }
+        }
+    iPopupDataArray.Close();    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::HandleDiscreetPopupMessageL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::HandleDiscreetPopupMessageL( 
+        const RMessage2& aMessage )
+    {
+    CAknCapServerDiscreetPopupHandler* instance 
+        = CAknCapServerDiscreetPopupHandler::InstanceL();
+    if ( instance )
+        {
+        instance->DoHandleDiscreetPopupMessageL( aMessage );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::CreateDiscreetPopupHandlerL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::CreateDiscreetPopupHandlerL()
+    {
+    CAknCapServerDiscreetPopupHandler* instance 
+        = CAknCapServerDiscreetPopupHandler::InstanceL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::CAknCapServerDiscreetPopupHandler
+// ---------------------------------------------------------------------------
+//
+CAknCapServerDiscreetPopupHandler::CAknCapServerDiscreetPopupHandler() 
+    : 
+    CCoeStatic( KAknCapServerDiscreetPopupHandler, CCoeStatic::EThread ),
+    iAppUi( CCoeEnv::Static()->AppUi() )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::ConstructL()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::InstanceL
+// ---------------------------------------------------------------------------
+//
+CAknCapServerDiscreetPopupHandler* CAknCapServerDiscreetPopupHandler::InstanceL()
+    {
+    CAknCapServerDiscreetPopupHandler* instance = 
+        static_cast<CAknCapServerDiscreetPopupHandler*>( 
+            CCoeEnv::Static( KAknCapServerDiscreetPopupHandler ) );
+    if ( !instance )
+        {
+        instance = new ( ELeave ) CAknCapServerDiscreetPopupHandler;
+        CleanupStack::PushL( instance );
+        instance->ConstructL();
+        CleanupStack::Pop( instance );
+        }
+    return instance;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::DoLaunchDiscreetPopupL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::DoHandleDiscreetPopupMessageL(
+    const RMessage2& aMessage )
+    {
+    TAknDiscreetPopupData dataType;
+    TPckg<TAknDiscreetPopupData> pkgType( dataType );
+    aMessage.ReadL( 0, pkgType );
+    switch ( dataType.Type() )
+        {
+        case ( TAknDiscreetPopupData::EAknPopupTypeResource ):
+            {
+            LaunchFromResourceL( aMessage );
+            break;
+            }
+        case ( TAknDiscreetPopupData::EAknPopupTypeParam ):
+            {
+            LaunchWithParamsL( aMessage );
+            break;
+            }
+        case ( TAknDiscreetPopupData::EAknPopupTypeCancelRequest ):
+            {
+            HandleRequestCancellationL( aMessage );
+            break;
+            }
+        case ( TAknDiscreetPopupData::EAknPopupTypeQueryInUseRect ):
+            {
+            HandleQueryInUseRect( aMessage );
+            break;
+            }        
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::LaunchFromResourceL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::LaunchFromResourceL(  
+        const RMessage2& aMessage )
+    {
+    TAknDiscreetPopupResourceData data;
+    TPckg<TAknDiscreetPopupResourceData> pkg( data );
+    aMessage.ReadL( 0, pkg );
+
+    MEikCommandObserver* observer( NULL );
+    TInt commandId( 0 );
+    if ( data.Action() )
+        {
+        commandId = NextAvailableCommandId();
+        observer = this;
+        }
+
+    CAknDiscreetPopupControl* popup = 
+        CAknDiscreetPopupControl::NewL( 
+                ETrue,
+                data.ResourceId(),
+                data.ResourceFile(),
+                commandId,
+                data.PopupId(),
+                observer );
+    CleanupStack::PushL( popup );
+    ShowPopupL( commandId,
+        popup,
+        data.AppUid(),
+        data.ViewUid(),
+        aMessage );
+    CleanupStack::Pop( popup );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::LaunchWithParamsL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::LaunchWithParamsL(  
+        const RMessage2& aMessage )
+    {
+    TAknDiscreetPopupParamData data;
+    TPckg<TAknDiscreetPopupParamData> pkg( data );
+    aMessage.ReadL( 0, pkg );
+
+    MEikCommandObserver* observer( NULL );
+    TInt commandId( 0 );
+    if ( data.Action() )
+        {
+        commandId = NextAvailableCommandId();
+        observer = this;
+        }
+
+    CAknDiscreetPopupControl* popup = 
+        CAknDiscreetPopupControl::NewL( 
+                ETrue,
+                data.TitleText(),
+                data.BodyText(),
+                NULL,
+                data.SkinId(),
+                data.BitmapFile(),
+                data.BitmapId(),
+                data.MaskId(),
+                data.Flags(),
+                commandId,
+                data.PopupId(),
+                observer );
+    CleanupStack::PushL( popup );
+    ShowPopupL( commandId,
+        popup,
+        data.AppUid(),
+        data.ViewUid(),
+        aMessage );
+    CleanupStack::Pop( popup );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::HandleRequestCancellationL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::HandleRequestCancellationL(  
+        const RMessage2& aMessage )
+    {
+    TAknDiscreetPopupCancelRequestData data;
+    TPckg<TAknDiscreetPopupCancelRequestData> pkg( data );
+    aMessage.ReadL( 0, pkg );
+    
+    for ( TInt i = 0; i < iPopupDataArray.Count(); i++ )
+        {
+        if ( !iPopupDataArray[ i ].iMessage.IsNull()
+                && ( TUint ) iPopupDataArray[ i ].iMessage.ClientStatus() 
+                == data.StatusHandle() )
+            {
+            iPopupDataArray[ i ].iMessage.Complete( KErrNone );
+            if ( !iPopupDataArray[ i ].iPopupControl->IsVisible() )
+                {
+                delete iPopupDataArray[ i ].iPopupControl;
+                iPopupDataArray[ i ].iPopupControl = NULL;
+                iPopupDataArray.Remove( i );
+                NotifyRunningGlobalDiscreetPopupChanged();
+                break;
+                }
+            }
+        }
+    aMessage.Complete( KErrNone );
+    }
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::HandleQueryInUseRect
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::HandleQueryInUseRect( 
+        const RMessage2& aMessage )
+    {
+    TRect rect(TRect::EUninitialized);
+    if( iPopupDataArray.Count() != 0 ) 
+        {
+        rect = iPopupDataArray[0].iPopupControl->Rect();
+        }
+    
+    TAknDiscreetPopupRectData data(rect);
+    TPckg<TAknDiscreetPopupRectData> pkg( data );
+    aMessage.WriteL( 0, pkg );
+    aMessage.Complete( KErrNone );
+    }
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::ShowPopupL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::ShowPopupL(
+        const TInt& aCommandId,
+        CAknDiscreetPopupControl* aPopup,
+        const TUid& aAppUid,
+        const TUid& aViewUid,
+        const RMessage2& aMessage )
+    {
+    aPopup->SetObserver( this );
+
+    // Inform other popups that new popup is launched
+    for ( TInt i = 0; i < iPopupDataArray.Count(); i++ )
+        {
+        iPopupDataArray[ i ].iPopupControl->HandleDiscreetPopupActionL( 
+            CAknDiscreetPopupControl::EAknDiscreetPopupAnotherLaunched );
+        }
+
+    aPopup->HandleDiscreetPopupActionL( 
+        CAknDiscreetPopupControl::EAknDiscreetPopupShow );
+
+    // Show popup and add it to popup list
+    TAknCapServerDiscreetPopupData popupData;
+    popupData.iCommandId = aCommandId;
+    popupData.iPopupControl = aPopup;
+    popupData.iAppUid = aAppUid;
+    popupData.iViewUid = aViewUid;
+    popupData.iMessage = aMessage;
+    iPopupDataArray.AppendL( popupData );
+    NotifyRunningGlobalDiscreetPopupChanged();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::NextAvailableCommandId
+// ---------------------------------------------------------------------------
+//
+TInt CAknCapServerDiscreetPopupHandler::NextAvailableCommandId()
+    {
+    TBool idFoundInArray( ETrue );
+    TInt commandId( 0 );
+    
+    while ( idFoundInArray )
+        {
+        commandId++;
+        idFoundInArray = EFalse;
+        for ( TInt i = 0; i < iPopupDataArray.Count(); i++ )
+            {
+            if ( iPopupDataArray[ i ].iCommandId == commandId )
+                {
+                idFoundInArray = ETrue;
+                break;
+                }
+            }
+        }
+    return commandId;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::NotifyRunningGlobalDiscreetPopupChanged
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::NotifyRunningGlobalDiscreetPopupChanged()
+    {
+    _LIT_SECURITY_POLICY_S0( writePolicy, RProcess().SecureId() );
+	_LIT_SECURITY_POLICY_PASS( readPolicy );
+    
+    TInt err = RProperty::Define( KPSUidAvkonDomain, 
+                                  KAknGlobalDiscreetPopupNumChanged, 
+                                  RProperty::EInt, 
+                                  readPolicy, 
+                                  writePolicy );
+
+    if( err == KErrAlreadyExists || err == KErrNone )
+        {
+        RProperty::Set( KPSUidAvkonDomain, KAknGlobalDiscreetPopupNumChanged, 0 );
+        }            
+    }
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::ProcessCommandL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::ProcessCommandL( TInt aCommandId )
+    {
+    TAknCapServerDiscreetPopupData* popupData( NULL );
+    for ( TInt i = 0; i < iPopupDataArray.Count(); i++ )
+        {
+        if ( iPopupDataArray[ i ].iCommandId == aCommandId )
+            {
+            popupData = &iPopupDataArray[ i ];
+            break;
+            }
+        }
+
+    // If client has defined application uid, it should be launched when the
+    // command is handled
+    if ( popupData && popupData->iAppUid != TUid::Null() && iAppUi )
+        {
+        TApaTaskList taskList( CCoeEnv::Static()->WsSession() );
+        TApaTask task = taskList.FindApp( popupData->iAppUid );
+        
+        if ( task.Exists() && popupData->iViewUid == TUid::Null() )
+            {
+            task.BringToForeground();
+            }
+        else
+            {
+            iAppUi->CreateActivateViewEventL(
+            TVwsViewId( popupData->iAppUid, popupData->iViewUid ),
+            TUid::Null(),
+            KNullDesC8() );   
+            }        
+
+        }
+    if ( popupData && !popupData->iMessage.IsNull() )
+        {
+        popupData->iMessage.Complete( KErrCompletion );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknCapServerDiscreetPopupHandler::HandleControlEventL
+// ---------------------------------------------------------------------------
+//
+void CAknCapServerDiscreetPopupHandler::HandleControlEventL( 
+    CCoeControl* aControl, TCoeEvent aEventType )
+    {
+    // Popup has been closed or cancelled - remove from array
+    if ( aEventType == EEventRequestExit || aEventType == EEventRequestCancel )
+        {
+        for ( TInt i = 0; i < iPopupDataArray.Count(); i++ )
+            {
+            if ( iPopupDataArray[ i ].iPopupControl == aControl )
+                {
+                if ( !iPopupDataArray[ i ].iMessage.IsNull() )
+                    {
+                    iPopupDataArray[ i ].iMessage.Complete( KErrNone );
+                    }
+                delete iPopupDataArray[ i ].iPopupControl;
+                iPopupDataArray[ i ].iPopupControl = NULL;
+                iPopupDataArray.Remove( i );
+                NotifyRunningGlobalDiscreetPopupChanged();
+                break;
+                }
+            }
+        }
+    }