diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/dlgsrc/AknMediatorFacade.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/dlgsrc/AknMediatorFacade.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,248 @@ +/* +* Copyright (c) 2002-2004 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 +#include +#include +#include +#include +#include + +#include "AknMediatorFacade.h" +#include "AknMediatorObserver.h" + +const TInt KBufferGranularity = 128; // quite big, perhaps + +EXPORT_C CAknMediatorFacade* CAknMediatorFacade::NewL(CEikDialog* aDialog) + { + CAknMediatorFacade* me = new (ELeave) CAknMediatorFacade(aDialog); + CleanupStack::PushL(me); + me->ConstructL(); + CleanupStack::Pop(); + return me; + } + +EXPORT_C CAknMediatorFacade* AknMediatorFacade(const MObjectProvider* aMop) + { + CAknMediatorFacade* caps = NULL; + if( aMop ) + { + const_cast(aMop)->MopGetObject( caps ); + } + + return caps; + } + +void CAknMediatorFacade::ConstructL() + { + iCommander = CMediatorCommandInitiator::NewL(this); + iUpdater = CMediatorEventConsumer::NewL(this); + iBuf = CBufFlat::NewL(KBufferGranularity); + iStream.Open(*iBuf); + } + +EXPORT_C void CAknMediatorFacade::IssueCommand() + { + if (iDialogIndex == 0) + return; + + __ASSERT_DEBUG(iDialogIndex != KErrNotFound, User::Invariant()); + if (iAppUid == KNullUid) + { + iAppUid = ((CEikAppUi*)CEikonEnv::Static()->AppUi())->Application()->AppDllUid(); + } + + // ingnore return value, if this fails we have no feed back channel from cover. + iUpdater->SubscribeEvent( KMediatorSecondaryDisplayDomain, + iAppUid, + iDialogIndex, + TVersion(0,0,0)); + + // we don't care this return value either. + iCommander->IssueCommand( KMediatorSecondaryDisplayDomain, + iAppUid, + iDialogIndex, + TVersion(0,0,0), + iBuf->Ptr(0)); + + + + } + +EXPORT_C void CAknMediatorFacade::CancelCommand() + { + if (iDialogIndex == 0) + { + return; + } + + if (iUpdater) + { + iUpdater->UnsubscribeEvent( KMediatorSecondaryDisplayDomain, + iAppUid, + iDialogIndex); + } + + if (iCommander) + { + iCommander->CancelCommand( KMediatorSecondaryDisplayDomain, + iAppUid, + iDialogIndex); + } + } + +EXPORT_C void CAknMediatorFacade::ResetBuffer() + { + iStream.Release(); + iBuf->Reset(); + iStream.Open(*iBuf); + } + +EXPORT_C void CAknMediatorFacade::SetObserver(MAknDialogMediatorObserver* aObserver) + { + iExternalObserver = aObserver; + } + +CAknMediatorFacade::~CAknMediatorFacade() + { + if(iExternalObserver) + { + iExternalObserver->NotifyMediatorExit(); + } + // as mediator does not cancel all functionality related to session to be terminated + // cancel commands manually + CancelCommand(); + + // These will cancel remaining active requests in destructor. + delete iCommander; + delete iUpdater; + delete iUpdateToCover; + + iStream.Close(); + delete iBuf; + } + +void CAknMediatorFacade::MediatorEventL( TUid aDomain, + TUid aCategory, + TInt aEventId, + const TDesC8& aData ) + { + TAknDialogMediatorObserverCommand cmd = EHandleAsNormal; + + if (iExternalObserver) + { + cmd = iExternalObserver->MediatorCommandL( aDomain, aCategory, + aEventId, aData ); + } + + HandleCommandL(cmd, aData); + } + +void CAknMediatorFacade::CommandResponseL( TUid aDomain, + TUid aCategory, + TInt aCommandId, + TInt aStatus, + const TDesC8& aData ) + { + if (aStatus == KErrNone) + { + TAknDialogMediatorObserverCommand cmd = EHandleAsNormal; + + if (iExternalObserver) + { + cmd = iExternalObserver->MediatorCommandL( aDomain, aCategory, + aCommandId, aData ); + } + HandleCommandL(cmd, aData); + } + } + +CAknMediatorFacade::CAknMediatorFacade(CEikDialog* aDialog) + :iDialogIndex(KErrNotFound),iDialog(aDialog) + { + __ASSERT_ALWAYS(iDialog, User::Invariant()); + } + +void CAknMediatorFacade::HandleCommandL(TAknDialogMediatorObserverCommand aCmd, const TDesC8& aData) + { + switch (aCmd) + { + case EAcceptDialog: + { + iDialog->TryExitL(EEikBidOk); // simulates selection key + break; + } + case ECancelDialog: + { + iDialog->TryExitL(EEikBidCancel); + break; + } + case EHandleAsNormal: + { + ProcessDataL( aData ); + } // fall through + case EDoNothingWithThisCommand: + default: + break; + + } + + } + +void CAknMediatorFacade::ProcessDataL( const TDesC8& aData ) + { + if (aData.Length() >= 4) + { + SAknDialogFeedback* key = (SAknDialogFeedback*)aData.Ptr(); + + TInt dialogCommand = key->iCommandId; // four bytes of data + + if (dialogCommand == KAknMediatorFacade // for bc though nobody should use this + || dialogCommand == EAknDialogFeedback) + { + TKeyResponse kresp = EKeyWasNotConsumed; + if (iDialog->ButtonGroupContainer().ButtonGroup() ) + { + kresp = iDialog->ButtonGroupContainer().ButtonGroup()->AsControl()->OfferKeyEventL(key->iKey, EEventKey); + } + if (kresp != EKeyWasConsumed) + { + iDialog->OfferKeyEventL(key->iKey, EEventKey); // all we can do + } + } + } + } + +EXPORT_C void CAknMediatorFacade::PostUpdatedDataL(TInt aEventId) + { + if (iAppUid == KNullUid) + return; // no commands have been sent before, ignore update event + + if (!iUpdateToCover) + { + iUpdateToCover = CMediatorEventProvider::NewL(); + } + + iUpdateToCover->RaiseEvent( KMediatorSecondaryDisplayDomain, + iAppUid, + aEventId!=0?aEventId:iDialogIndex+KAknMediatorUpdateChannelOffset, + TVersion(0,0,0), + iBuf->Ptr(0)); + } + +// end of file +