securityanddataprivacytools/securitytools/certapp/encdec/capabilityset.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /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<typeof(iCaps)> capsPckg(iCaps);
+	aStream << capsPckg;
+}
+
+void CapabilitySet::InternalizeL(RReadStream &aStream)
+{
+	TPckg<typeof(iCaps)> capsPckg(iCaps);
+	aStream >> capsPckg;
+}
+
+
+
+// End of file