diff -r 000000000000 -r 094583676ce7 PECengine/AttributeLibrary2/SrcAttributeBase/CPEngAttrModelAsyncDataSetHook.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/AttributeLibrary2/SrcAttributeBase/CPEngAttrModelAsyncDataSetHook.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,201 @@ +/* +* Copyright (c) 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: Attribute asynhronous data set hook. +* +*/ + + +// INCLUDE FILES +#include "CPEngAttrModelAsyncDataSetHook.h" +#include "CPEngPresenceAttrModel.h" +#include "MPEngPresenceAttrModelTypeImp.h" +#include "PresenceDebugPrint.h" +#include + + +//LOCAL constants +namespace + { + _LIT( KPEngAsyncDataSetHookPanic, "AsyncDataSetHook" ); + enum TPEngAsyncDataSetHookPanicReasons + { + EHookNotReady + }; + + void PanicAsyncDataSetHook( TPEngAsyncDataSetHookPanicReasons aPanicReason ) + { + User::Panic( KPEngAsyncDataSetHookPanic, aPanicReason ); + } + + } + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::CPEngAttrModelAsyncDataSetHook +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngAttrModelAsyncDataSetHook::CPEngAttrModelAsyncDataSetHook() + : CActive( CActive::EPriorityStandard ) + { + CActiveScheduler::Add( this ); + } + + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CPEngAttrModelAsyncDataSetHook::~CPEngAttrModelAsyncDataSetHook() + { + CActive::Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::InitializeLC() +// ----------------------------------------------------------------------------- +// +void CPEngAttrModelAsyncDataSetHook::InitializeLC( TRequestStatus& aRequestStatus, + CPEngPresenceAttrModel& aAttributeModel, + MPEngPresenceAttrModelTypeImp& aTypeImp ) + { + __ASSERT_ALWAYS( !IsActive(), User::Leave( KErrInUse ) ); + CleanupStack::PushL( TCleanupItem( ResetTheHook, this ) ); + + iStatusToComplete = &aRequestStatus; + iHookOwner = &aAttributeModel; + iHookedImp = &aTypeImp; + } + + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::Status() +// ----------------------------------------------------------------------------- +// +TRequestStatus& CPEngAttrModelAsyncDataSetHook::Status() + { + return iStatus; + } + + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::Activate() +// ----------------------------------------------------------------------------- +// +void CPEngAttrModelAsyncDataSetHook::Activate() + { + __ASSERT_ALWAYS( ( iStatusToComplete && iHookOwner && iHookedImp ), + PanicAsyncDataSetHook( EHookNotReady ) ); + + if ( iStatus == KRequestPending ) + { + PENG_DP_TXT( "CPEngAttrModelAsyncDataSetHook: Puting hook pending." ); + *iStatusToComplete = KRequestPending; + SetActive(); + } + + else + { + PENG_DP_TXT( "CPEngAttrModelAsyncDataSetHook: Hook ended directly." ); + *iStatusToComplete = iStatus; + Reset(); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::RunL() +// ----------------------------------------------------------------------------- +// +void CPEngAttrModelAsyncDataSetHook::RunL() + { + if ( iStatus.Int() == KErrNone ) + { + //Data set done. Update the attribute state. + iHookOwner->SetQualifier( ETrue ); + } + + //complete the hooked request with return status from real operation + User::RequestComplete( iStatusToComplete, iStatus.Int() ); + + Reset(); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::DoCancel() +// ----------------------------------------------------------------------------- +// +void CPEngAttrModelAsyncDataSetHook::DoCancel() + { + iHookedImp->CancelSetDataAsync(); + + //then complete the client request + User::RequestComplete( iStatusToComplete, KErrCancel ); + + Reset(); + } + + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::Reset() +// ----------------------------------------------------------------------------- +// +void CPEngAttrModelAsyncDataSetHook::Reset() + { + //reset the state + iHookOwner = NULL; + iHookedImp = NULL; + + iStatusToComplete = NULL; + } + +// ----------------------------------------------------------------------------- +// CPEngAttrModelAsyncDataSetHook::ResetTheHook() +// ----------------------------------------------------------------------------- +// +void CPEngAttrModelAsyncDataSetHook::ResetTheHook( TAny* aHook ) + { + CPEngAttrModelAsyncDataSetHook* self = static_cast< CPEngAttrModelAsyncDataSetHook* >( aHook ); + self->Reset(); + } + + +// End of File + + + + + + + + + + + + + + + + + + + +