securityanddataprivacytools/securitytools/certapp/encdec/capabilityset.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 17:00:08 +0300
branchRCL_3
changeset 95 641f389e9157
parent 8 35751d3474b7
permissions -rw-r--r--
Revision: 201035 Kit: 201035

/*
* 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<typeof(iCaps)> capsPckg(iCaps);
	aStream << capsPckg;
}

void CapabilitySet::InternalizeL(RReadStream &aStream)
{
	TPckg<typeof(iCaps)> capsPckg(iCaps);
	aStream >> capsPckg;
}



// End of file