diff -r 6385c4c93049 -r 8e6fa1719340 pushmtm/MtmUtilSrc/PushInitiatorList.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pushmtm/MtmUtilSrc/PushInitiatorList.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,358 @@ +/* +* 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: The definition of CPushInitiatorList. +* +*/ + + + +// INCLUDE FILES + +#include "PushInitiatorList.h" +#include "PushMtmLog.h" +#include "PushMtmUtilPanic.h" +#include "WhiteListImporter.h" +#include "PushMtmPrivateCRKeys.h" +#include + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CPushInitiatorList::NewL +// --------------------------------------------------------- +// +EXPORT_C CPushInitiatorList* CPushInitiatorList::NewL() + { + const TInt KGranularity( 8 ); + return new (ELeave) CPushInitiatorList( KGranularity ); + } + +// --------------------------------------------------------- +// CPushInitiatorList::~CPushInitiatorList +// --------------------------------------------------------- +// +EXPORT_C CPushInitiatorList::~CPushInitiatorList() + { + ResetAndDestroy(); + } + +// --------------------------------------------------------- +// CPushInitiatorList::AddL +// --------------------------------------------------------- +// +EXPORT_C TUint32 CPushInitiatorList::AddL + ( const CPushInitiator& aPushInitiator ) + { + CPushInitiator* temp = aPushInitiator.AllocLC(); + TUint32 entryId = AddL( temp ); + CleanupStack::Pop( temp ); + return entryId; + } + +// --------------------------------------------------------- +// CPushInitiatorList::AddL +// --------------------------------------------------------- +// +EXPORT_C TUint32 CPushInitiatorList::AddL( CPushInitiator* aPushInitiator ) + { + PUSHLOG_ENTERFN("CPushInitiatorList::AddL") + + __ASSERT_DEBUG( aPushInitiator, UtilPanic( EPushMtmUtilPanNull ) ); + + TUint32 entryId( ENullInitiatorEntryId ); + + if ( !aPushInitiator ) + { + // Nothing to insert. + } + else + { + // Get an ID for the new entry before we insert it to the list if it + // has not set yet: + entryId = aPushInitiator->EntryID(); + if ( entryId == ENullInitiatorEntryId ) + { + entryId = FreeId(); + // Give this new ID to the new entry: + aPushInitiator->SetEntryID( entryId ); + } + __ASSERT_DEBUG( entryId != ENullInitiatorEntryId, + UtilPanic( EPushMtmUtilPanNull ) ); + // And append it to the list: + AppendL( aPushInitiator ); + // Set flag that indicates that the list has changed: + iPushInitiatorListChanged = ETrue; + } + + PUSHLOG_WRITE_FORMAT(" entryId <%d>",entryId) + PUSHLOG_LEAVEFN("CPushInitiatorList::AddL") + return entryId; + } + +// --------------------------------------------------------- +// CPushInitiatorList::At +// --------------------------------------------------------- +// +EXPORT_C CPushInitiator& CPushInitiatorList::At( TInt aIndex ) const + { + return (CPushInitiator&) + (*CArrayPtrFlat::At( aIndex )); + } + +// --------------------------------------------------------- +// CPushInitiatorList::Delete +// --------------------------------------------------------- +// +EXPORT_C void CPushInitiatorList::Delete( TInt aIndex ) + { + delete &At( aIndex ); + CArrayPtrFlat::Delete( aIndex ); + // Set indicator flag. + iPushInitiatorListChanged = ETrue; + } + +// --------------------------------------------------------- +// CPushInitiatorList::Count +// --------------------------------------------------------- +// +EXPORT_C TInt CPushInitiatorList::Count() const + { + return CArrayPtrFlat::Count(); + } + +// --------------------------------------------------------- +// CPushInitiatorList::FreeId +// --------------------------------------------------------- +// +TUint32 CPushInitiatorList::FreeId() const + { + TUint32 largestId( 0 ); + // Find the largest ID: + const TInt count( Count() ); + for ( TInt i = 0; i < count; ++i ) + { + if ( largestId < At(i).EntryID() ) + { + largestId = At(i).EntryID(); + } + } + if ( largestId == KMaxTUint32 ) + { + return 0; + } + + return ( largestId + 1 ); + } + +// --------------------------------------------------------- +// CPushInitiatorList::Changed +// --------------------------------------------------------- +// +TBool CPushInitiatorList::Changed() const + { + return iPushInitiatorListChanged; + } + +// --------------------------------------------------------- +// CPushInitiatorList::ResetChanged +// --------------------------------------------------------- +// +void CPushInitiatorList::ResetChanged() + { + iPushInitiatorListChanged = EFalse; + } + +// --------------------------------------------------------- +// CPushInitiatorList::ResetAndDestroy +// --------------------------------------------------------- +// +EXPORT_C void CPushInitiatorList::ResetAndDestroy() + { + CArrayPtrFlat::ResetAndDestroy(); + // Set indicator flag. + iPushInitiatorListChanged = ETrue; + } + +// --------------------------------------------------------- +// CPushInitiatorList::Find +// --------------------------------------------------------- +// +EXPORT_C TInt CPushInitiatorList::Find( const CPushInitiator& aPushInitiator, + TInt& aIndex ) const + { + PUSHLOG_ENTERFN("CPushInitiatorList::Find") + + TInt ret( KErrNotFound ); + + PUSHLOG_WRITE_FORMAT2(" Searching for: <%S>, <%d>", + &aPushInitiator.Addr(),aPushInitiator.Type()) + + const TInt count( Count() ); + for ( TInt i = 0; i < count; ++i ) + { + PUSHLOG_WRITE_FORMAT2(" Item: <%S>, <%d>", + &At( i ).Addr(),At( i ).Type()) + + if ( At( i ) == aPushInitiator ) + { + // We have found push initiator which is identical with the one + // given in the parameter. + PUSHLOG_WRITE(" WL Found!") + aIndex = i; + ret = KErrNone; + break; + } + } + + PUSHLOG_LEAVEFN("CPushInitiatorList::Find") + return ret; + } + +// --------------------------------------------------------- +// CPushInitiatorList::operator== +// --------------------------------------------------------- +// +EXPORT_C TBool CPushInitiatorList::operator== + ( const CPushInitiatorList& aList ) const + { + TBool equal( EFalse ); + const TInt count = Count(); + + if ( count == aList.Count() ) + { + TBool inequalFound( EFalse ); + for ( TInt i = 0; i < count; ++i ) + { + if ( At(i) != aList.At(i) ) + { + inequalFound = ETrue; + break; + } + } + equal = !inequalFound; + } + + return equal; + } + +// --------------------------------------------------------- +// CPushInitiatorList::operator!= +// --------------------------------------------------------- +// +EXPORT_C TBool CPushInitiatorList::operator!= + ( const CPushInitiatorList& aList ) const + { + return !( *this == aList ); + } + +// --------------------------------------------------------- +// CPushInitiatorList::ExternalizeL +// --------------------------------------------------------- +// +void CPushInitiatorList::ExternalizeL( CRepository& aRepository ) const + { + PUSHLOG_ENTERFN("CPushInitiatorList::ExternalizeL"); + + HBufC* wlBuf = ParseAndProcessList2BufL(); + CleanupStack::PushL( wlBuf ); + User::LeaveIfError( aRepository.Set( KPushMtmWhiteList, *wlBuf ) ); + CleanupStack::PopAndDestroy( wlBuf ); // wlBuf + + PUSHLOG_LEAVEFN("CPushInitiatorList::ExternalizeL"); + } + +// --------------------------------------------------------- +// CPushInitiatorList::InternalizeL +// --------------------------------------------------------- +// +void CPushInitiatorList::InternalizeL( CRepository& aRepository ) + { + PUSHLOG_ENTERFN("CPushInitiatorList::InternalizeL"); + + HBufC* wlBuf = HBufC::NewLC( NCentralRepositoryConstants::KMaxUnicodeStringLength ); + TPtr nonConstWLBuf = wlBuf->Des(); + User::LeaveIfError( aRepository.Get( KPushMtmWhiteList, nonConstWLBuf ) ); + ParseAndProcessBuf2ListL( *wlBuf ); + CleanupStack::PopAndDestroy( wlBuf ); // wlBuf + + PUSHLOG_LEAVEFN("CPushInitiatorList::InternalizeL"); + } + +// --------------------------------------------------------- +// CPushInitiatorList::CPushInitiatorList +// --------------------------------------------------------- +// +CPushInitiatorList::CPushInitiatorList( const TInt aGranularity ) +: CArrayPtrFlat( aGranularity ), + iPushInitiatorListChanged( EFalse ) + { + } + +// --------------------------------------------------------- +// CPushInitiatorList::ParseAndProcessBuf2ListL +// --------------------------------------------------------- +// +void CPushInitiatorList::ParseAndProcessBuf2ListL + ( const TDesC& aStreamedBuf ) + { + PUSHLOG_ENTERFN("CPushInitiatorList::ParseAndProcessBuf2ListL"); + PUSHLOG_WRITE_FORMAT(" param: <%S>",&aStreamedBuf) + + CWhiteListConverter* converter = CWhiteListConverter::NewL( *this ); + CleanupStack::PushL( converter ); + + TRAPD( err, converter->Buffer2ListL( aStreamedBuf ) ); + PUSHLOG_WRITE_FORMAT(" <%d>",err); + if ( err == KErrOverflow || err == KErrCorrupt ) + { + // The input is corrupted. Leave the White List as is and + // do not forward these LEAVE values, because it would + // terminate the RFS of Push. + } + else + { + // Other error. Must be forwarded. + User::LeaveIfError( err ); + } + + CleanupStack::PopAndDestroy( converter ); // converter + + PUSHLOG_LEAVEFN("CPushInitiatorList::ParseAndProcessBuf2ListL"); + } + +// --------------------------------------------------------- +// CPushInitiatorList::ParseAndProcessList2BufL +// --------------------------------------------------------- +// +HBufC* CPushInitiatorList::ParseAndProcessList2BufL() const + { + PUSHLOG_ENTERFN("CPushInitiatorList::ParseAndProcessList2BufL"); + + CPushInitiatorList& nonConstPiList = (CPushInitiatorList&)*this; + CWhiteListConverter* converter = CWhiteListConverter::NewL( nonConstPiList ); + CleanupStack::PushL( converter ); + + HBufC* retBuf(0); + TRAPD( err, retBuf = converter->List2BufferL() ); + PUSHLOG_WRITE_FORMAT(" <%d>",err); + User::LeaveIfError( err ); + + CleanupStack::PopAndDestroy( converter ); // converter + + PUSHLOG_WRITE_FORMAT(" ret: <%S>",retBuf) + PUSHLOG_LEAVEFN("CPushInitiatorList::ParseAndProcessList2BufL"); + return retBuf; + } + +// End of File.