--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/utils/src/CIptvIapList.cpp Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,345 @@
+/*
+* Copyright (c) 2005-2006 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: Class for handling group of IAPs.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CIptvIapList.h"
+#include "CIptvUtil.h"
+#include "IptvDebug.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+//defined to move default constructor to private
+CIptvIapList::CIptvIapList()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvIapList* CIptvIapList::NewL()
+ {
+ CIptvIapList* self = new (ELeave) CIptvIapList;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CIptvIapList::ConstructL()
+ {
+ iIapList.Reset();
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::~CIptvIapList
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvIapList::~CIptvIapList()
+ {
+ iIapList.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::AddIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvIapList::AddIap(TIptvIap& aIap)
+ {
+ if ( iIapList.Count() >= KIptvSmServicesDbMaxIaps )
+ {
+ return KErrOverflow;
+ }
+ return iIapList.Append( aIap );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::AddIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvIapList::AddIap( TIptvIap& aIap, TBool aIgnoreMax )
+ {
+ if ( iIapList.Count() >= KIptvSmServicesDbMaxIaps && !aIgnoreMax )
+ {
+ return KErrOverflow;
+ }
+ return iIapList.Append( aIap );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::DeleteIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvIapList::DeleteIap( TUint8 aIndex )
+ {
+ if ( aIndex >= iIapList.Count() )
+ {
+ return KErrOverflow;
+ }
+
+ iIapList.Remove( aIndex );
+ iIapList.Compress();
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::DeleteIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvIapList::DeleteIap( TIptvIap& aIap )
+ {
+ TInt i;
+ for ( i = 0; i < iIapList.Count(); i++ )
+ {
+ if ( aIap.iId == iIapList[i].iId )
+ {
+ iIapList.Remove( i );
+ iIapList.Compress();
+ return KErrNone;
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::ModifyIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvIapList::ModifyIap(TUint8 aIndex, TIptvIap& aIap)
+ {
+ if(aIndex > (iIapList.Count()-1))
+ {
+ return KErrOverflow;
+ }
+ iIapList.Remove(aIndex);
+ iIapList.Insert(aIap, aIndex);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::IapL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TIptvIap& CIptvIapList::IapL( TUint8 aIndex )
+ {
+ if ( aIndex > (iIapList.Count()-1) )
+ {
+ User::Leave( KErrOverflow );
+ }
+ return iIapList[aIndex];
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::GetIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvIapList::GetIap( TUint8 aIndex, TIptvIap& aIap )
+ {
+ if ( aIndex > (iIapList.Count()-1) )
+ {
+ return KErrOverflow;
+ }
+
+ aIap.iId = iIapList[aIndex].iId;
+ aIap.iPriority = iIapList[aIndex].iPriority;
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::Count
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint8 CIptvIapList::Count()
+ {
+ return static_cast<TUint8>(iIapList.Count());
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::ExternalizeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvIapList::ExternalizeL(RDesWriteStream& aStream) const
+ {
+ TUint8 count;
+ count = static_cast<TUint8>(iIapList.Count());
+ aStream.WriteUint8L(count);
+
+ TUint8 i;
+ for(i = 0; i < count; i++)
+ {
+ iIapList[i].ExternalizeL(aStream);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::InternalizeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvIapList::InternalizeL(RDesReadStream& aStream)
+ {
+ TUint8 count;
+ count = aStream.ReadUint8L();
+
+ //delete previous list data
+ iIapList.Reset();
+
+ //add uninitialized iaps
+ TUint8 i;
+ TIptvIap iap;
+ for(i = 0; i < count; i++)
+ {
+ iIapList.Append(iap);
+ }
+
+ //init iaps with stream data
+ for(i = 0; i < count; i++)
+ {
+ iIapList[i].InternalizeL(aStream);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::CountExternalizeSize
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CIptvIapList::CountExternalizeSize()
+ {
+ TUint8 i;
+ TUint32 externalizeSize = 1; //first item is count (1 byte)
+
+ for(i = 0; i < iIapList.Count(); i++)
+ {
+ externalizeSize += iIapList[i].CountExternalizeSize();
+ }
+ return externalizeSize;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::SetL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvIapList::SetL(CIptvIapList& aIapList)
+ {
+ HBufC8* iapDes = HBufC8::NewL(aIapList.CountExternalizeSize() +1);
+ CleanupStack::PushL(iapDes);
+ RDesWriteStream writeStream;
+ TPtr8 iapPtr8(iapDes->Des());
+ writeStream.Open(iapPtr8);
+ aIapList.ExternalizeL(writeStream);
+ writeStream.Close();
+ RDesReadStream readStream;
+ readStream.Open(iapDes->Des());
+ InternalizeL(readStream);
+ readStream.Close();
+ CleanupStack::PopAndDestroy(iapDes);
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::SortByPriorityL
+// Iaplist can have max of 10 items. This sorting is done as simply as possible
+// to avoid errors. Don't copy paste this code to any larger lists.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvIapList::SortByPriorityL()
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvIapList::SortByPriority()");
+
+ CIptvIapList* iapListSorted;
+ iapListSorted = CIptvIapList::NewL();
+ CleanupStack::PushL( iapListSorted );
+
+ TUint8 highestPriorityIndex;
+ TUint8 i;
+ TUint8 count;
+
+ count = Count();
+
+ for ( i = 0; i < count; i++ )
+ {
+ highestPriorityIndex = GetHighestPriorityIapIndexL();
+ iapListSorted->AddIap( iIapList[highestPriorityIndex] );
+ DeleteIap( highestPriorityIndex );
+ }
+
+ SetL(*iapListSorted);
+ CleanupStack::PopAndDestroy(iapListSorted);
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvIapList::SortByPriority() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::GetHighestPriorityIapIndexL
+// -----------------------------------------------------------------------------
+//
+TUint8 CIptvIapList::GetHighestPriorityIapIndexL()
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvIapList::GetHighestPriorityIapIndexL()");
+
+ if ( Count() < 1 )
+ {
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvIapList:: Error: No IAPs set");
+ User::Leave( KErrNotFound );
+ }
+
+ //small number = high priority
+ TUint8 highestPriorityFound = 255;
+ TUint8 highestPriorityIndex = 0;
+ TUint16 i;
+
+ for ( i = 0; i < Count(); i++ )
+ {
+
+ if ( highestPriorityFound > iIapList[i].iPriority )
+ {
+ highestPriorityFound = iIapList[i].iPriority; //store current best priority
+ highestPriorityIndex = i; //store current best priority location
+ }
+ }
+
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvIapList::GetHighestPriorityIapIndex() exit");
+
+ //return the index which had the highest priority (= smallest value)
+ return highestPriorityIndex;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvIapList::FindIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvIapList::FindIap( TUint32 aIapId, TUint8& aIndex )
+ {
+ TInt i;
+ for ( i = 0; i < Count(); i++ )
+ {
+ if( iIapList[i].iId == aIapId )
+ {
+ aIndex = i;
+ return KErrNone;
+ }
+ }
+ return KErrNotFound;
+ }
+