diff -r 000000000000 -r 2f259fa3e83a uifw/AknGlobalUI/AknCapServer/src/akncapserverdiscreetpopuphandler.cpp --- /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 +#include +#include +#include + +#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( + 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 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 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 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 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 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; + } + } + } + }