diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfwplugins/PSStateSourcePlugIn/src/psstatemappertext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextframework/cfwplugins/PSStateSourcePlugIn/src/psstatemappertext.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,179 @@ +/* +* Copyright (c) 2006-2006 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: CPSStateMapperText class implementation. +* +*/ + + +#include +#include + +#include "psstatemappertext.h" + +/* +namespace + { + #ifdef _DEBUG + + // Panic category + _LIT( KPanicCat, "PSStateMapText" ); + + // Panic codes + enum TPanicReason + { + EInvalidConstructionParameters + }; + + // Local panic function + LOCAL_C void Panic( TInt aCode ) + { + User::Panic( KPanicCat, aCode ); + } + + #endif + } +*/ + +CPSStateMapperText* CPSStateMapperText::NewL( + MCFContextInterface& aCF ) + { + CPSStateMapperText* self = CPSStateMapperText::NewLC( aCF ); + CleanupStack::Pop(); + + return self; + } + +CPSStateMapperText* CPSStateMapperText::NewLC( + MCFContextInterface& aCF ) + { + CPSStateMapperText* self = new( ELeave ) CPSStateMapperText( aCF ); + CleanupStack::PushL( self ); + self->ConstructL( ); + + return self; + } + +// Destructor +CPSStateMapperText::~CPSStateMapperText() + { + if(iStartCB) + { + iStartCB->Cancel(); + delete iStartCB; iStartCB = 0; + } + iTextMappings.ResetAndDestroy(); + } + +CPSStateMapperText::CPSStateMapperText( + MCFContextInterface& aCF ) : CPSStateMapper( aCF ) + { + } + +// METHODS + +TInt CPSStateMapperText::MapperType() const + { + return EPSTextMapper; + } + +void CPSStateMapperText::AddMappingL(const TDesC& aPSValue, + const TDesC& aContextValue) + { + CTextPair* mapping = CTextPair::NewLC(aPSValue, aContextValue ); + iTextMappings.AppendL(mapping); + CleanupStack::Pop(); // mapping + } + + +void CPSStateMapperText::Define() + { + RProperty::Define( iPSCategory, + iPSKey, + RProperty::EText ); + + iCF.DefineContext( *iSource, + *iType, + iSecurityPolicy ); + } + +void CPSStateMapperText::InitializeL() + { + User::LeaveIfError( + iProperty.Attach( iPSCategory, iPSKey ) ); + iStartCB = new (ELeave) CAsyncCallBack(TCallBack(CPSStateMapperText::StartCallback, this), EPriorityStandard); + iStartCB->CallBack(); + } + +//----------------------------------------------------------------------------- +// CPSStateMapperText::ProperyChangedL +//----------------------------------------------------------------------------- +// +void CPSStateMapperText::ProperyChangedL() + { + TBool mappingFound = EFalse; + + HBufC* psvalue = HBufC::NewLC( 512 ); // >> cleanup + TPtr bufPtr = psvalue->Des(); + bufPtr.Zero(); + + if ( iProperty.Get ( bufPtr ) == KErrNone ) + { + for (TInt i = 0; i < iTextMappings.Count(); i++) + { + if (iTextMappings[i]->Text1() == *psvalue) + { + mappingFound = ETrue; + + // Configure context object + iContext->SetSourceL( *iSource ); + iContext->SetTypeL( *iType ); + iContext->SetValueL( iTextMappings[i]->Text2() ); + + // Publish + RThread thread; + iCF.PublishContext( *iContext, thread ); + thread.Close(); + } + } + + if ( !mappingFound && iPassThrough ) + { + // Configure context object + iContext->SetSourceL( *iSource ); + iContext->SetTypeL( *iType ); + iContext->SetValueL( *psvalue ); + + // Publish + RThread thread; + iCF.PublishContext( *iContext, thread ); + thread.Close(); + } + } + + CleanupStack::PopAndDestroy(); // psvalue + } + +TInt CPSStateMapperText::StartCallback(TAny* aPtr) + { + static_cast(aPtr)->DoStart(); + + return 0; + } + +void CPSStateMapperText::DoStart() + { + Subscribe(); + TRAP_IGNORE(ProperyChangedL()); + } +