diff -r 000000000000 -r 96612d01cf9f videofeeds/utils/src/CIptvIapList.cpp --- /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(iIapList.Count()); + } + +// ----------------------------------------------------------------------------- +// CIptvIapList::ExternalizeL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CIptvIapList::ExternalizeL(RDesWriteStream& aStream) const + { + TUint8 count; + count = static_cast(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; + } +