--- /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 <centralrepository.h>
+
+// ================= 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<CPushInitiator>::At( aIndex ));
+ }
+
+// ---------------------------------------------------------
+// CPushInitiatorList::Delete
+// ---------------------------------------------------------
+//
+EXPORT_C void CPushInitiatorList::Delete( TInt aIndex )
+ {
+ delete &At( aIndex );
+ CArrayPtrFlat<CPushInitiator>::Delete( aIndex );
+ // Set indicator flag.
+ iPushInitiatorListChanged = ETrue;
+ }
+
+// ---------------------------------------------------------
+// CPushInitiatorList::Count
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPushInitiatorList::Count() const
+ {
+ return CArrayPtrFlat<CPushInitiator>::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<CPushInitiator>::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<CPushInitiator>( 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.