diff -r 8e6fa1719340 -r 4455192101e4 pushmtm/plugins/WhiteListAdapterSrc/WhiteListAdapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pushmtm/plugins/WhiteListAdapterSrc/WhiteListAdapter.cpp Mon Sep 13 17:13:53 2010 +0100 @@ -0,0 +1,522 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Handles white list settings in provisioning. +* +*/ + + +// INCLUDE FILES + + // User includes +#include "PushInitiator.h" +#include "PushInitiatorList.h" +#include "PushMtmSettings.h" +#include "WhiteListAdapter.h" +#include "WhiteListAdapterDef.h" +#include "WhiteListAdapterItem.h" +#include "WhiteListAdapterLogger.h" +#include "WhiteListAdapterPanic.h" +#include "WhiteListAdapterUids.h" + // System includes +#include +#include + +// CONSTANTS + +// 'Push enabled' flag settings +const TInt KPushEnabledFlagLength = 1; +const TUint16 KPushEnabledFlagTrue = '1'; +const TUint16 KPushEnabledFlagFalse = '0'; + +// Granularity value for dynamic arrays +const TInt KDynamicArrayGranularity = 3; + +// ================= MEMBER FUNCTIONS ====================== + +// --------------------------------------------------------- +// CWhiteListAdapter::CWhiteListAdapter +// --------------------------------------------------------- +// +CWhiteListAdapter::CWhiteListAdapter() : CWPAdapter(), +iItems( KDynamicArrayGranularity ), +iItemsToBeAdded( KDynamicArrayGranularity ), +iLogicalProxyPushSupport( EPushDontCare ), iPhysicalProxyIsVisited( EFalse ) + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter c'tor" ) ) ); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::ConstructL +// --------------------------------------------------------- +// +void CWhiteListAdapter::ConstructL() + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "-> WhiteListAdapter::ConstructL" ) ) ); + + iMsvSession = CMsvSession::OpenSyncL( *this ); + iPushMtmSettings = CPushMtmSettings::NewL(); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "<- WhiteListAdapter::ConstructL" ) ) ); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::NewL +// --------------------------------------------------------- +// +CWhiteListAdapter* CWhiteListAdapter::NewL() + { + CWhiteListAdapter* self = new (ELeave) CWhiteListAdapter; + + CleanupStack::PushL( self ); + + self->ConstructL(); + + CleanupStack::Pop(); // self + + return self; + } + +// --------------------------------------------------------- +// CWhiteListAdapter::~CWhiteListAdapter +// --------------------------------------------------------- +// +CWhiteListAdapter::~CWhiteListAdapter() + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "-> WhiteListAdapter d'tor" ) ) ); + + delete iCurrentItem; + + delete iPushMtmSettings; // It has to be deleted before iMsvSession, + // because it uses iMsvSession->FileSession(). + delete iMsvSession; + + CLOG( ( ELogDetailed, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter d'tor, iItemsToBeAdded.Count:%d" ), + iItemsToBeAdded.Count() ) ); + iItemsToBeAdded.ResetAndDestroy(); + iItemsToBeAdded.Close(); + + CLOG( ( ELogDetailed, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter d'tor, iItems.Count:%d" ), iItems.Count() ) ); + iItems.ResetAndDestroy(); + iItems.Close(); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "<- WhiteListAdapter d'tor" ) ) ); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::ItemCount +// --------------------------------------------------------- +// +TInt CWhiteListAdapter::ItemCount() const + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::ItemCount %d" ), iItems.Count() ) ); + + return iItems.Count(); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::SummaryTitle +// --------------------------------------------------------- +// +const TDesC16& CWhiteListAdapter::SummaryTitle( TInt /*aIndex*/ ) const + { + // As WL text will never be shown, we simply return an empty string here. + return KNullDesC16(); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::SummaryText +// --------------------------------------------------------- +// +const TDesC16& CWhiteListAdapter::SummaryText( TInt /*aIndex*/ ) const + { + // As WL text will never be shown, we simply return an empty string here. + return KNullDesC16(); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::SaveL +// --------------------------------------------------------- +// +void CWhiteListAdapter::SaveL( TInt aItem ) + { + __ASSERT_DEBUG( 0 <= aItem && aItem < iItems.Count(), + Panic( EArrayIndexOutOfBounds ) ); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "-> WhiteListAdapter::SaveL %d" ), aItem ) ); + + CPushInitiator* pi = new (ELeave) CPushInitiator; + CleanupStack::PushL( pi ); + pi->SetAddressL( iItems[aItem]->Address(), + iItems[aItem]->AddressType() ); + + TUint32 entryId = iPushMtmSettings->PushInitiatorList().AddL( pi ); + CleanupStack::Pop( pi ); // pi, ownership taken over + // Save the ID of the added entry: + iItems[aItem]->SetId( entryId ); + + iPushMtmSettings->SaveL(); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "<- WhiteListAdapter::SaveL" ) ) ); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::CanSetAsDefault +// --------------------------------------------------------- +// +TBool CWhiteListAdapter::CanSetAsDefault( TInt /*aItem*/ ) const + { + return EFalse; + } + +// --------------------------------------------------------- +// CWhiteListAdapter::SetAsDefaultL +// --------------------------------------------------------- +// +void CWhiteListAdapter::SetAsDefaultL( TInt /*aItem*/ ) + { + } + +// --------------------------------------------------------- +// CWhiteListAdapter::DetailsL +// --------------------------------------------------------- +// +TInt CWhiteListAdapter::DetailsL( TInt /*aItem*/, + MWPPairVisitor& /*aVisitor*/ ) + { + return KErrNotSupported; + } + +// --------------------------------------------------------- +// CWhiteListAdapter::ContextExtension +// --------------------------------------------------------- +// +TInt CWhiteListAdapter::ContextExtension( MWPContextExtension*& aExtension ) + { + aExtension = this; + return KErrNone; + } + +// --------------------------------------------------------- +// CWhiteListAdapter::VisitL +// --------------------------------------------------------- +// +void CWhiteListAdapter::VisitL( CWPCharacteristic& aCharacteristic ) + { + if ( aCharacteristic.Type() == KWPPxLogical ) + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "-> WhiteListAdapter::VisitL PXLOGICAL" ) ) ); + + aCharacteristic.AcceptL( *this ); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL PXLOGICAL visited, push support is %d" ), + iLogicalProxyPushSupport ) ); + + // iItemsToBeAdded contains physical proxies whose push support + // is either PushEnabled or PushDontCare (i.e. PushDisabled proxies + // are not present in this array). + if ( iLogicalProxyPushSupport == EPushEnabled ) + { + // Knowing that the logical proxy's push support is PushEnabled, + // we have to add each element of the above-mentioned array. + for ( TInt i = 0; i < iItemsToBeAdded.Count(); i++ ) + { + // If addition fails, then we delete the item. Otherwise, + // the ownership has been taken over by iItems array. + if ( iItems.Append( iItemsToBeAdded[i] ) != KErrNone ) + { + delete iItemsToBeAdded[i]; + } + } + } + else + { + // We're here : logical proxy's push support is either PushDontCare + // or PushDisabled. In this case we have to add only those elements + // in the array whose push support is PushEnabled. This is because + // physical proxy's push support definition is stronger than the + // logical proxy's definition. + for ( TInt i = 0; i < iItemsToBeAdded.Count(); i++ ) + { + TWhiteListAdapterItem* item = iItemsToBeAdded[i]; + if ( item->PushSupport() == EPushEnabled ) + { + // If addition fails, then we delete the item. Otherwise, + // the ownership has been taken over by iItems array. + if ( iItems.Append( item ) != KErrNone ) + { + delete item; + } + } + else + { + delete item; + } + } + } + + // There is only one thing we need to do here : reset the array. + // At this point, each element in the array is invalid : if the + // element happened to be valid, then the other array (iItems) + // took over the ownership. Otherwise (i.e. the element was + // invalid), the element got deleted manually. + // Thus, we can safely reset the array. + iItemsToBeAdded.Reset(); + + iLogicalProxyPushSupport = EPushDontCare; + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "<- WhiteListAdapter::VisitL PXLOGICAL" ) ) ); + } + else if ( aCharacteristic.Type() == KWPPxPhysical ) + { + // This deletion is for safety's sake : if one of the leaving methods + // in this section (below) has left, then it may happen that this + // method is called again and iCurrentItem is not NULL. If it is the + // case, we can avoid having an orphaned memory area by deleting the + // current item before allocating a new one. + // However, in most cases iCurrentItem will be NULL. + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "-> WhiteListAdapter::VisitL PXPHYSICAL" ) ) ); + + delete iCurrentItem; + iCurrentItem = NULL; + iCurrentItem = new (ELeave) TWhiteListAdapterItem(); + + iPhysicalProxyIsVisited = ETrue; + + aCharacteristic.AcceptL( *this ); + + iPhysicalProxyIsVisited = EFalse; + + if ( iCurrentItem->Valid() ) + { + User::LeaveIfError( iItemsToBeAdded.Append( iCurrentItem ) ); + iCurrentItem = NULL; // Ownership transferred. + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL PXPHYSICAL valid & added" ) ) ); + } + else + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL PXPHYSICAL invalid" ) ) ); + // invalid physical proxy (at least from our point of view) + delete iCurrentItem; + iCurrentItem = NULL; + } + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "<- WhiteListAdapter::VisitL PXPHYSICAL" ) ) ); + } + } + +// --------------------------------------------------------- +// CWhiteListAdapter::VisitL +// --------------------------------------------------------- +// +void CWhiteListAdapter::VisitL( CWPParameter& aParameter ) + { + switch ( aParameter.ID() ) + { + case EWPParameterPhysicalProxyID : + { + __ASSERT_DEBUG( iCurrentItem, Panic( ENullProxy ) ); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL PhysicalProxyID" ) ) ); + + if ( iCurrentItem ) + { + iCurrentItem->SetProxyId( aParameter.Value() ); + } + + break; + } + case EWPParameterPxAddr : + { + __ASSERT_DEBUG( iCurrentItem, Panic( ENullProxy ) ); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL PxAddr" ) ) ); + + if ( iCurrentItem ) + { + iCurrentItem->SetAddress( aParameter.Value() ); + } + + break; + } + case EWPParameterPxAddrType : + { + __ASSERT_DEBUG( iCurrentItem, Panic( ENullProxy ) ); + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL PxAddrType" ) ) ); + + if ( iCurrentItem ) + { + iCurrentItem->SetAddressType( aParameter.Value() ); + } + + break; + } + case EWPParameterPushEnabled : + { + if ( iCurrentItem ) + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL Physical PushEnabled" ) ) ); + + // it is a physical proxy + iCurrentItem->SetPushSupport + ( ResolvePushSupport( aParameter.Value() ) ); + } + else + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::VisitL Logical PushEnabled" ) ) ); + + // it is a logical proxy + iLogicalProxyPushSupport = + ResolvePushSupport( aParameter.Value() ); + } + + break; + } + default : + break; + } + } + +// --------------------------------------------------------- +// CWhiteListAdapter::VisitLinkL +// --------------------------------------------------------- +// +void CWhiteListAdapter::VisitLinkL( CWPCharacteristic& /*aCharacteristic*/ ) + { + } + +// --------------------------------------------------------- +// CWhiteListAdapter::HandleSessionEventL +// --------------------------------------------------------- +// +void CWhiteListAdapter::HandleSessionEventL( TMsvSessionEvent /*aEvent*/, + TAny* /*aArg1*/, + TAny* /*aArg2*/, + TAny* /*aArg3*/ ) + { + } + +// --------------------------------------------------------- +// CWhiteListAdapter::ResolvePushSupport +// --------------------------------------------------------- +// +TPushSupport CWhiteListAdapter::ResolvePushSupport( const TDesC& aPushSupport ) + { + TPushSupport support = EPushDontCare; + + if ( aPushSupport.Length() == KPushEnabledFlagLength ) + { + if ( aPushSupport[0] == KPushEnabledFlagTrue ) + { + support = EPushEnabled; + } + else if ( aPushSupport[0] == KPushEnabledFlagFalse ) + { + support = EPushDisabled; + } + } + + return support; + } + +// --------------------------------------------------------- +// CWhiteListAdapter::SaveDataL +// --------------------------------------------------------- +// +const TDesC8& CWhiteListAdapter::SaveDataL( TInt aIndex ) const + { + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::SaveDataL %d %d %d" ), + iItems.Count(), aIndex, iItems[aIndex]->Id() ) ); + return ( iItems[aIndex]->IdBuf() ); + } + +// --------------------------------------------------------- +// CWhiteListAdapter::DeleteL +// --------------------------------------------------------- +// +void CWhiteListAdapter::DeleteL( const TDesC8& aSaveData ) + { + // Copy source into a package buffer: + TPckgBuf entryIdBuf; + entryIdBuf.Copy( aSaveData ); + // Extract the entry ID: + TUint32 entryId( entryIdBuf() ); + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::DeleteL ID %d" ), entryId ) ); + + // Now entryId holds the ID - we can remove it from WL: + CPushInitiatorList& whiteList = iPushMtmSettings->PushInitiatorList(); + // Find the index of the Initiator with the given ID. + TInt index( KErrNotFound ); + // As the entries are unique in WL by the ID, it's enough + // to continue the loop until first hit. + const TInt count( whiteList.Count() ); + for ( TInt i = 0; i < count; ++i ) + { + const CPushInitiator& initiator = whiteList.At(i); + if ( initiator.EntryID() == entryId ) + { + index = i; + // Found: + break; + } + } + + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::DeleteL index %d" ), index ) ); + if ( index != KErrNotFound ) + { + whiteList.Delete( index ); + // Commit changes. + iPushMtmSettings->SaveL(); + CLOG( ( ELogBasic, WHITELISTADAPTER_LOG_LEVEL, + _L( "WhiteListAdapter::DeleteL Saved..." ) ) ); + } + } + +// --------------------------------------------------------- +// CWhiteListAdapter::Uid +// --------------------------------------------------------- +// +TUint32 CWhiteListAdapter::Uid() const + { + return (TUint32)KWhiteListAdapterImplementationUid; + } + +// End of file