diff -r 000000000000 -r 2c201484c85f securityanddataprivacytools/securitytools/certapp/encdec/capabilityset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/securityanddataprivacytools/securitytools/certapp/encdec/capabilityset.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,148 @@ +/* +* Copyright (c) 2008-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: +* +*/ + + +#define __INCLUDE_CAPABILITY_NAMES__ +#include "capabilityset.h" + +CapabilitySet::CapabilitySet() +{ + memset(iCaps,0,sizeof(iCaps)); +} + +#if 0 +// Not currently used or tested +CapabilitySet::CapabilitySet(const CapabilitySet &aRef) +{ + memcpy(iCaps, aRef.iCaps, sizeof(iCaps)); +} +#endif + +CapabilitySet &CapabilitySet::operator=(const CapabilitySet &aRhs) +{ +BULLSEYE_OFF + if(this == &aRhs) return *this; // handle self assignment +BULLSEYE_RESTORE + memcpy(iCaps, aRhs.iCaps, sizeof(iCaps)); + return *this; +} + + +void CapabilitySet::AddCapability(TCapability aCapability) +{ + BULLSEYE_OFF + if((TUint32)aCapability>=(TUint32)ECapability_HardLimit) + { + dbg << Log::Indent() << "Illegal capabaility value " << aCapability << Log::Endl(); + FatalError(); + } + BULLSEYE_RESTORE + + TInt index = aCapability>>3; + TUint8 mask = (TUint8)(1<<(aCapability&7)); + //mask &= ((TUint8*)&AllSupportedCapabilities)[index]; + ((TUint8*)iCaps)[index] |= mask; +} + +TBool CapabilitySet::HasCapability(TCapability aCapability) const +{ + BULLSEYE_OFF + if((TUint32)aCapability>=(TUint32)ECapability_HardLimit) + { + FatalError(); + } + BULLSEYE_RESTORE + + return (((TUint8*)iCaps)[aCapability>>3]>>(aCapability&7))&1; +} + + +void EncodeHuman(REncodeWriteStream& aStream,const CapabilitySet &aCapSet) +{ + aStream.WriteCStr(" { "); + for(TUint32 cap=0; cap < ECapability_Limit; ++cap) + { + if(aCapSet.HasCapability(TCapability(cap))) + { + aStream.WriteCStr(CapabilityNames[cap]); + aStream.WriteSpace(); + } + } + + for(TUint32 cap=ECapability_Limit; cap < ECapability_HardLimit; ++cap) + { + if(aCapSet.HasCapability(TCapability(cap))) + { + EncodeHuman(aStream, TUint32(cap)); + aStream.WriteSpace(); + } + } + + aStream.WriteByte('}'); +} + +void DecodeHuman(RDecodeReadStream& aStream, CapabilitySet &aCapSet) +{ + aStream.CheckName("{"); + while(aStream.PeakToken() != "}") + { + AutoIndent ai(prog); + // We process PeakToken so if it is not valid we can call + // DecodeHuman TUint32 to read the next token and process it + // as a number. + prog << Log::Indent() << "Parsing capability '" << aStream.PeakToken() << "'" << Log::Endl(); + TUint32 cap; + for(cap=0; cap < ECapability_Limit; ++cap) + { + if(aStream.PeakToken() == CapabilityNames[cap]) + { + break; + } + } + if(cap < ECapability_Limit) + { + // The token was ok, so read/discard it. + aStream.ReadNextToken(); + } + else + { + // Fallback to decoding as a number + prog<< Log::Indent() << "WARNING: Unknown capability '" << aStream.PeakToken() << "' attempting to decode as a bit number..." << Log::Endl(); + DecodeHuman(aStream, cap); + prog << Log::Indent() << "Decoded as " << cap << Log::Endl(); + } + aCapSet.AddCapability(TCapability(cap)); + } + aStream.CheckName("}"); +} + + +void CapabilitySet::ExternalizeL(RWriteStream &aStream) const +{ + TPckg capsPckg(iCaps); + aStream << capsPckg; +} + +void CapabilitySet::InternalizeL(RReadStream &aStream) +{ + TPckg capsPckg(iCaps); + aStream >> capsPckg; +} + + + +// End of file