--- /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