diff -r 000000000000 -r bde4ae8d615e os/security/contentmgmt/contentaccessfwfordrm/source/cafutils/bitset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/security/contentmgmt/contentaccessfwfordrm/source/cafutils/bitset.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,309 @@ +/* +* Copyright (c) 2003-2009 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: +* +*/ + + +#ifndef REMOVE_CAF1 + +#include +#include +#include +#include +#include + +using namespace ContentAccess; + +EXPORT_C CBitset* CBitset::NewLC(TInt aMaxBits) + { + CBitset* self = new(ELeave) CBitset(); + CleanupStack::PushL(self); + self->ConstructL(aMaxBits); + return self; + } + +EXPORT_C CBitset* CBitset::NewL(TInt aMaxBits) + { + CBitset* self=CBitset::NewLC(aMaxBits); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CBitset* CBitset::NewLC(const CBitset& aSource) + { + CBitset* self = new (ELeave) CBitset(aSource); + CleanupStack::PushL(self); + self->ConstructL(aSource); + return self; + } + +EXPORT_C CBitset* CBitset::NewL(const CBitset& aSource) + { + CBitset* self=CBitset::NewLC(aSource); + CleanupStack::Pop(self); + return self; + } + +CBitset::~CBitset() + { + delete [] iBitSet; + } + +CBitset::CBitset() + { + } + +CBitset::CBitset(const CBitset& aSource) + : iWidth(aSource.iWidth), iMaxBits(aSource.iMaxBits) + { + } + +void CBitset::IdentifyBit(TInt aBitId, // in + TInt &aByte, // out + TInt &aBitInByte) const // out + { + // Identify the byte & bit corresponding to the Id + aByte = aBitId / 8; + aBitInByte = aBitId % 8; + } + +EXPORT_C void CBitset::Invert() + { + // Invert array + for (TInt j = 0; j < iWidth ; j++) + { + iBitSet[j] = static_cast (~iBitSet[j]); + } + } + +EXPORT_C TInt CBitset::MaxBits() const + { + return iMaxBits; + } + +EXPORT_C void CBitset::Set(TInt aBit) + { + __ASSERT_ALWAYS(ValidBit(aBit), User::Panic(KCafUtilsPanic, EInvalidBit)); + + TInt targetByte; + TInt targetBit; + IdentifyBit(aBit, targetByte, targetBit); + + // Or-in the relevant bit + iBitSet[targetByte] |= (1 << targetBit); + } + +EXPORT_C void CBitset::Unset(TInt aBit) + { + __ASSERT_ALWAYS(ValidBit(aBit), User::Panic(KCafUtilsPanic, EInvalidBit)); + TInt targetByte; + TInt targetBit; + IdentifyBit(aBit, targetByte, targetBit); + + // And-in NOT(the relevant bit) + iBitSet[targetByte] &= ~(1 << targetBit); + } + +EXPORT_C TBool CBitset::IsSet(TInt aBit) const + { + __ASSERT_ALWAYS(ValidBit(aBit), User::Panic(KCafUtilsPanic, EInvalidBit)); + + TInt targetByte; + TInt targetBit; + IdentifyBit(aBit, targetByte, targetBit); + + // And-in the relevant bit and test for non-zero + if (iBitSet[targetByte] & (1 << targetBit)) + { + return(ETrue); + } + else + { + return(EFalse); + } + } + +EXPORT_C void CBitset::Reset() + { + // Reset the array + Mem::FillZ(iBitSet, iWidth); + } + +EXPORT_C void CBitset::SetAll() + { + Mem::Fill(iBitSet, iWidth, 0xFF); + } + +void CBitset::ConstructL(TInt aMaxBits) + { + // Calculate the required number of bytes + iMaxBits = aMaxBits; + iWidth = 1 + aMaxBits / 8; + + iBitSet = new (ELeave) TUint8[iWidth]; + Reset(); // Zero the set + } + +void CBitset::ConstructL(const CBitset& aSource) + { + // Copy the bits of the source + iBitSet = new (ELeave) TUint8[iWidth]; + Mem::Copy(iBitSet, aSource.iBitSet, iWidth); + } + +EXPORT_C void CBitset::ExternalizeL(RWriteStream& aStream) const + { + // Write the max-Id + aStream.WriteInt32L(iMaxBits); + // Create a descriptor to encapsulate the set + TPtrC8 ptr(iBitSet, iWidth); + // Write the descriptor + aStream.WriteL(ptr); + } + +EXPORT_C void CBitset::InternalizeL(RReadStream& aStream) + { + // Delete the array + delete [] iBitSet; + iBitSet = NULL; // safety + // Call the constructor with the max-Id value + ConstructL(aStream.ReadInt32L()); + // Create a descriptor to encapsulate the set + TPtr8 ptr(iBitSet, 0, iWidth); + // Load into the descriptor + aStream.ReadL(ptr); + } + +// +// NB: leavescan will complain that this method calls a leaving +// function. The Leave is properly documented in the header +// file. Other than that, not much can be done, especially this +// class has already been deprecated. +EXPORT_C CBitset& CBitset::operator=(const CBitset& aSource) + { + // avoid self-assignment + if (this == &aSource) + { + return *this; + } + + // check for source/dest size mismatch + if (aSource.iWidth != iWidth) + { + // always use largest width + TInt widest = iWidth; + if (widest < aSource.iWidth) + { + widest = aSource.iWidth; + } + + // Malloc the desired width + TUint8 *temp = (TUint8 *) new (ELeave) TUint8[widest]; + + // And zero + Mem::FillZ(temp, widest); + + // Now it is safe to re-assign the set + delete [] iBitSet; + iBitSet = temp; + iWidth = widest; + } + + // Width may be the same, but the Max-Id may not, so + // align these here + iMaxBits = aSource.iMaxBits; + + // Based on the source-size, copy the bitset + Mem::Copy(iBitSet, aSource.iBitSet, aSource.iWidth); + + return *this; + } + +EXPORT_C TBool CBitset::operator==(const CBitset& aSource) const + { + TBool result = ETrue; + if (this == &aSource) + { + return ETrue; + } + TInt narrowest = iMaxBits; + if (narrowest > aSource.iMaxBits) + { + narrowest = aSource.iMaxBits; + } + + // Compare the first "narrowest/8" bytes - if the result is non-zero, + // then they are not equal + if (Mem::Compare(iBitSet, narrowest/8, aSource.iBitSet, narrowest/8)) + { + return EFalse; + } + + // Now, compare the last set of bits manually + for (TInt i = narrowest/8 * 8; i < narrowest; ++i) + { + // Comparison of booleans - compare their negations + if (!IsSet(i) != !aSource.IsSet(i)) + { + return EFalse; + } + } + + return result; + } + +EXPORT_C void CBitset::SetListL(TInt aItems, ...) + { + va_list ap; + va_start(ap, aItems); + + // Create a new set (of identical size) + CBitset *tempSet = CBitset::NewLC(iMaxBits); + + // Duplicate this into temporary bitset + *tempSet = *this; + + for (TInt i = 0; i < aItems; i++) + { + TInt x = va_arg(ap, TInt); + tempSet->Set(x); + } + + // No failure, so copy back into this + *this = *tempSet; + va_end(ap); + + CleanupStack::Pop(tempSet); + delete tempSet; + } + +EXPORT_C TBool CBitset::IsSetList(TInt aItems, ...) const + { + va_list ap; + va_start(ap, aItems); + + for (TInt i = 0; i < aItems; i++) + { + TInt x = va_arg(ap, TInt); + if (!IsSet(x)) + { + return (EFalse); + } + } + va_end(ap); + return (ETrue); + } + +#endif // #ifndef REMOVE_CAF1