diff -r 675a964f4eb5 -r 35751d3474b7 cryptomgmtlibs/securitytestfw/test/testhandler2/t_capabilities.cpp
--- a/cryptomgmtlibs/securitytestfw/test/testhandler2/t_capabilities.cpp Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptomgmtlibs/securitytestfw/test/testhandler2/t_capabilities.cpp Thu Sep 10 14:01:51 2009 +0300
@@ -1,428 +1,426 @@
-/*
-* Copyright (c) 2005-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:
-* Parsing of capability names
-*
-*/
-
-
-
-
-/**
- @file
-*/
-
-#include "t_input.h"
-#include "t_output.h"
-
-// This file needs to be updated in three places whenever new capabilities are
-// added - the list of capability names below and the methods
-// Input::ParseCapabilityNameL and Output::writeCapabilityL.
-
-// Capability names
-_LIT8(KCapabilityTCB, "TCB");
-_LIT8(KCapabilityCommDD, "CommDD");
-_LIT8(KCapabilityPowerMgmt, "PowerMgmt");
-_LIT8(KCapabilityMultimediaDD, "MultimediaDD");
-_LIT8(KCapabilityReadDeviceData, "ReadDeviceData");
-_LIT8(KCapabilityWriteDeviceData, "WriteDeviceData");
-_LIT8(KCapabilityDRM, "DRM");
-_LIT8(KCapabilityTrustedUI, "TrustedUI");
-_LIT8(KCapabilityProtServ, "ProtServ");
-_LIT8(KCapabilityDiskAdmin, "DiskAdmin");
-_LIT8(KCapabilityNetworkControl, "NetworkControl");
-_LIT8(KCapabilityAllFiles, "AllFiles");
-_LIT8(KCapabilitySwEvent, "SwEvent");
-_LIT8(KCapabilityNetworkServices, "NetworkServices");
-_LIT8(KCapabilityLocalServices, "LocalServices");
-_LIT8(KCapabilityReadUserData, "ReadUserData");
-_LIT8(KCapabilityWriteUserData, "WriteUserData");
-_LIT8(KCapabilityLocation, "Location");
-_LIT8(KCapabilitySurroundingsDD, "SurroundingsDD");
-_LIT8(KCapabilityUserEnvironment, "UserEnvironment");
-
-// Script file tags
-_LIT8(KCapabilityStart, "");
-_LIT8(KCapabilityEnd, "");
-_LIT8(KPolicyPass, "");
-_LIT8(KPolicyFail, "");
-_LIT8(KSecureIdStart, "");
-_LIT8(KSecureIdEnd, "");
-_LIT8(KVendorIdStart, "");
-_LIT8(KVendorIdEnd, "");
-
-_LIT(KCommaSpace, ", ");
-
-EXPORT_C TCapability Input::ParseCapabilityNameL(const TDesC8& aName)
- {
- TCapability result = ECapability_None;
-
- if (aName == KCapabilityTCB) result = ECapabilityTCB;
- else if (aName == KCapabilityCommDD) result = ECapabilityCommDD;
- else if (aName == KCapabilityPowerMgmt) result = ECapabilityPowerMgmt;
- else if (aName == KCapabilityMultimediaDD) result = ECapabilityMultimediaDD;
- else if (aName == KCapabilityReadDeviceData) result = ECapabilityReadDeviceData;
- else if (aName == KCapabilityWriteDeviceData) result = ECapabilityWriteDeviceData;
- else if (aName == KCapabilityDRM) result = ECapabilityDRM;
- else if (aName == KCapabilityTrustedUI) result = ECapabilityTrustedUI;
- else if (aName == KCapabilityProtServ) result = ECapabilityProtServ;
- else if (aName == KCapabilityDiskAdmin) result = ECapabilityDiskAdmin;
- else if (aName == KCapabilityNetworkControl) result = ECapabilityNetworkControl;
- else if (aName == KCapabilityAllFiles) result = ECapabilityAllFiles;
- else if (aName == KCapabilitySwEvent) result = ECapabilitySwEvent;
- else if (aName == KCapabilityNetworkServices) result = ECapabilityNetworkServices;
- else if (aName == KCapabilityLocalServices) result = ECapabilityLocalServices;
- else if (aName == KCapabilityReadUserData) result = ECapabilityReadUserData;
- else if (aName == KCapabilityWriteUserData) result = ECapabilityWriteUserData;
- else if (aName == KCapabilityLocation) result = ECapabilityLocation;
- else if (aName == KCapabilitySurroundingsDD) result = ECapabilitySurroundingsDD;
- else if (aName == KCapabilityUserEnvironment) result = ECapabilityUserEnvironment;
-
- if (result == ECapability_None)
- {
- User::Leave(KErrArgument);
- }
-
- return result;
- }
-
-EXPORT_C void Input::ParseCapabilitySetL(const TDesC8& aIn, TCapabilitySet& aOut)
- {
- aOut.SetEmpty();
- TInt pos = 0, err = KErrNone;
- for (;;)
- {
- const TDesC8& match = Input::ParseElement(aIn, KCapabilityStart, KCapabilityEnd, pos, err);
- if (err != KErrNone)
- {
- break;
- }
- aOut.AddCapability(ParseCapabilityNameL(match));
- }
- if (err != KErrNone && err != KErrNotFound)
- {
- User::Leave(err);
- }
- }
-
-EXPORT_C void Input::ParseSecurityPolicyL(const TDesC8& aIn, TSecurityPolicy& aOut)
- {
- TInt options = 0;
-
- TBool pass = aIn.Find(KPolicyPass) != KErrNotFound; // why didn't we use a proper xml parser?
- if (pass) ++options;
-
- TBool fail = aIn.Find(KPolicyFail) != KErrNotFound;
- if (fail) ++options;
-
- TUint secureId = ParseIntElement(aIn, KSecureIdStart, KSecureIdEnd);
- if (secureId) ++options;
-
- TUint vendorId = ParseIntElement(aIn, KVendorIdStart, KVendorIdEnd);
- if (vendorId) ++options;
-
- // Can only sepcify one of pass, fail, secureid, vendorid
- if (options > 1)
- User::Leave(KErrArgument);
-
- // Parse the capabilities
- TCapabilitySet capSet;
- ParseCapabilitySetL(aIn, capSet);
-
- // Determine maximum number of capabilities allowed
- TInt maxCaps;
- if (pass || fail)
- {
- maxCaps = 0;
- }
- else if (secureId || vendorId)
- {
- maxCaps = 3;
- }
- else
- {
- maxCaps = 7;
- }
-
- TCapability caps[7];
- TInt count = 0;
-
- // Extract capabilities into array
- TInt i;
- for (i = 0 ; i < ECapability_Limit ; ++i)
- {
- TCapability c = static_cast(i);
- if (capSet.HasCapability(c))
- {
- // Check if more capabities are specified that allowed
- if (count == maxCaps)
- {
- User::Leave(KErrArgument);
- }
- caps[count++] = c;
- }
- }
-
- // Fill the rest of the array with ECapability_None
- for (i = count ; i < maxCaps ; ++i)
- {
- caps[i] = ECapability_None;
- }
-
- if (pass)
- {
- aOut = TSecurityPolicy(TSecurityPolicy::EAlwaysPass);
- }
- else if (fail)
- {
- aOut = TSecurityPolicy(TSecurityPolicy::EAlwaysFail);
- }
- else if (secureId)
- {
- aOut = TSecurityPolicy(TSecureId(secureId), caps[0], caps[1], caps[2]);
- }
- else if (vendorId)
- {
- aOut = TSecurityPolicy(TVendorId(vendorId), caps[0], caps[1], caps[2]);
- }
- else
- {
- aOut = TSecurityPolicy(caps[0], caps[1], caps[2], caps[3],
- caps[4], caps[5], caps[6]);
- }
- }
-
-EXPORT_C void Output::writeCapabilityL(TCapability aCap)
- {
- switch (aCap)
- {
- case ECapabilityTCB:
- writeString(KCapabilityTCB);
- break;
-
- case ECapabilityCommDD:
- writeString(KCapabilityCommDD);
- break;
-
- case ECapabilityPowerMgmt:
- writeString(KCapabilityPowerMgmt);
- break;
-
- case ECapabilityMultimediaDD:
- writeString(KCapabilityMultimediaDD);
- break;
-
- case ECapabilityReadDeviceData:
- writeString(KCapabilityReadDeviceData);
- break;
-
- case ECapabilityWriteDeviceData:
- writeString(KCapabilityWriteDeviceData);
- break;
-
- case ECapabilityDRM:
- writeString(KCapabilityDRM);
- break;
-
- case ECapabilityTrustedUI:
- writeString(KCapabilityTrustedUI);
- break;
-
- case ECapabilityProtServ:
- writeString(KCapabilityProtServ);
- break;
-
- case ECapabilityDiskAdmin:
- writeString(KCapabilityDiskAdmin);
- break;
-
- case ECapabilityNetworkControl:
- writeString(KCapabilityNetworkControl);
- break;
-
- case ECapabilityAllFiles:
- writeString(KCapabilityAllFiles);
- break;
-
- case ECapabilitySwEvent:
- writeString(KCapabilitySwEvent);
- break;
-
- case ECapabilityNetworkServices:
- writeString(KCapabilityNetworkServices);
- break;
-
- case ECapabilityLocalServices:
- writeString(KCapabilityLocalServices);
- break;
-
- case ECapabilityReadUserData:
- writeString(KCapabilityReadUserData);
- break;
-
- case ECapabilityWriteUserData:
- writeString(KCapabilityWriteUserData);
- break;
-
- case ECapabilityLocation:
- writeString(KCapabilityLocation);
- break;
-
- case ECapabilitySurroundingsDD:
- writeString(KCapabilitySurroundingsDD);
- break;
-
- case ECapabilityUserEnvironment:
- writeString(KCapabilityUserEnvironment);
- break;
-
- default:
- User::Invariant();
- }
- }
-
-EXPORT_C void Output::writeCapabilitySetL(const TCapabilitySet& aCaps)
- {
- TBool first = ETrue;
- for (TInt i = 0 ; i < ECapability_Limit ; ++i)
- {
- TCapability cap = static_cast(i);
- if (aCaps.HasCapability(cap))
- {
- if (!first)
- {
- writeString(KCommaSpace);
- }
- else
- {
- first = EFalse;
- }
- writeCapabilityL(cap);
- }
- }
- }
-
-/**
- * The real TSecurityPolicy class has no accessors, so to extract information
- * from it we cast it to this class, which has exactly the same layout.
- */
-class TPrintableSecurityPolicy
- {
-public:
- void WriteL(Output& aOut) const;
-
-public:
- enum TType
- {
- ETypeFail=0, // Always fail
- ETypePass=1, // Always pass
- ETypeC3=2, // Up to 3 capabilities
- ETypeC7=3, // Up to 7 capabilities
- ETypeS3=4, // SID + up to 3 capabilities
- ETypeV3=5, // VID + up to 3 capabilities
-
- ETypeLimit
- };
-
-private:
- TPrintableSecurityPolicy();
- TBool WriteCapsL(Output& aOut, TBool aFirst) const;
- void WriteExtraCapsL(Output& aOut, TBool aFirst) const;
-
-private:
- TUint8 iType;
- TUint8 iCaps[3]; // missing capabilities are set to 0xff
- union
- {
- TUint32 iSecureId;
- TUint32 iVendorId;
- TUint8 iExtraCaps[4]; // missing capabilities are set to 0xff
- };
- };
-
-// Check noone added another type to the enumeration
-__ASSERT_COMPILE(((TInt)TPrintableSecurityPolicy::ETypeLimit) == ((TInt)TSecurityPolicy::ETypeLimit));
-
-EXPORT_C void Output::writeSecurityPolicyL(const TSecurityPolicy& aPolicy)
- {
- const TPrintableSecurityPolicy* p = reinterpret_cast(&aPolicy);
- p->WriteL(*this);
- }
-
-void TPrintableSecurityPolicy::WriteL(Output& aOut) const
- {
- switch (iType)
- {
- case ETypeFail:
- aOut.writeString(_L("AlwaysFail"));
- break;
- case ETypePass:
- aOut.writeString(_L("AlwaysPass"));
- break;
- case ETypeC3:
- WriteCapsL(aOut, ETrue);
- break;
- case ETypeC7:
- {
- TBool first = WriteCapsL(aOut, ETrue);
- WriteExtraCapsL(aOut, first);
- }
- break;
- case ETypeS3:
- aOut.writeString(_L("SID 0x"));
- aOut.writeHex(iSecureId);
- WriteCapsL(aOut, EFalse);
- break;
- case ETypeV3:
- aOut.writeString(_L("VID 0x"));
- aOut.writeHex(iVendorId);
- WriteCapsL(aOut, EFalse);
- break;
- default:
- User::Invariant();
- }
- }
-
-TBool TPrintableSecurityPolicy::WriteCapsL(Output& aOut, TBool aFirst) const
- {
- for (TInt i = 0 ; i < 3 ; ++i)
- {
- if (iCaps[i] != 0xff)
- {
- if (!aFirst)
- {
- aOut.writeString(KCommaSpace);
- }
- aFirst = EFalse;
- aOut.writeCapabilityL((TCapability) iCaps[i]);
- }
- }
- return aFirst;
- }
-
-void TPrintableSecurityPolicy::WriteExtraCapsL(Output& aOut, TBool aFirst) const
- {
- for (TInt i = 0 ; i < 3 ; ++i)
- {
- if (iExtraCaps[i] != 0xff)
- {
- if (!aFirst)
- {
- aOut.writeString(KCommaSpace);
- }
- aFirst = EFalse;
- aOut.writeCapabilityL((TCapability) iExtraCaps[i]);
- }
- }
- }
+/*
+* Copyright (c) 2005-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:
+* Parsing of capability names
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include "t_input.h"
+#include "t_output.h"
+
+// This file needs to be updated in three places whenever new capabilities are
+// added - the list of capability names below and the methods
+// Input::ParseCapabilityNameL and Output::writeCapabilityL.
+
+// Capability names
+_LIT8(KCapabilityTCB, "TCB");
+_LIT8(KCapabilityCommDD, "CommDD");
+_LIT8(KCapabilityPowerMgmt, "PowerMgmt");
+_LIT8(KCapabilityMultimediaDD, "MultimediaDD");
+_LIT8(KCapabilityReadDeviceData, "ReadDeviceData");
+_LIT8(KCapabilityWriteDeviceData, "WriteDeviceData");
+_LIT8(KCapabilityDRM, "DRM");
+_LIT8(KCapabilityTrustedUI, "TrustedUI");
+_LIT8(KCapabilityProtServ, "ProtServ");
+_LIT8(KCapabilityDiskAdmin, "DiskAdmin");
+_LIT8(KCapabilityNetworkControl, "NetworkControl");
+_LIT8(KCapabilityAllFiles, "AllFiles");
+_LIT8(KCapabilitySwEvent, "SwEvent");
+_LIT8(KCapabilityNetworkServices, "NetworkServices");
+_LIT8(KCapabilityLocalServices, "LocalServices");
+_LIT8(KCapabilityReadUserData, "ReadUserData");
+_LIT8(KCapabilityWriteUserData, "WriteUserData");
+_LIT8(KCapabilityLocation, "Location");
+_LIT8(KCapabilitySurroundingsDD, "SurroundingsDD");
+_LIT8(KCapabilityUserEnvironment, "UserEnvironment");
+
+// Script file tags
+_LIT8(KCapabilityStart, "");
+_LIT8(KCapabilityEnd, "");
+_LIT8(KPolicyPass, "");
+_LIT8(KPolicyFail, "");
+_LIT8(KSecureIdStart, "");
+_LIT8(KSecureIdEnd, "");
+_LIT8(KVendorIdStart, "");
+_LIT8(KVendorIdEnd, "");
+
+_LIT(KCommaSpace, ", ");
+
+EXPORT_C TCapability Input::ParseCapabilityNameL(const TDesC8& aName)
+ {
+ TCapability result = ECapability_None;
+
+ if (aName == KCapabilityTCB) result = ECapabilityTCB;
+ else if (aName == KCapabilityCommDD) result = ECapabilityCommDD;
+ else if (aName == KCapabilityPowerMgmt) result = ECapabilityPowerMgmt;
+ else if (aName == KCapabilityMultimediaDD) result = ECapabilityMultimediaDD;
+ else if (aName == KCapabilityReadDeviceData) result = ECapabilityReadDeviceData;
+ else if (aName == KCapabilityWriteDeviceData) result = ECapabilityWriteDeviceData;
+ else if (aName == KCapabilityDRM) result = ECapabilityDRM;
+ else if (aName == KCapabilityTrustedUI) result = ECapabilityTrustedUI;
+ else if (aName == KCapabilityProtServ) result = ECapabilityProtServ;
+ else if (aName == KCapabilityDiskAdmin) result = ECapabilityDiskAdmin;
+ else if (aName == KCapabilityNetworkControl) result = ECapabilityNetworkControl;
+ else if (aName == KCapabilityAllFiles) result = ECapabilityAllFiles;
+ else if (aName == KCapabilitySwEvent) result = ECapabilitySwEvent;
+ else if (aName == KCapabilityNetworkServices) result = ECapabilityNetworkServices;
+ else if (aName == KCapabilityLocalServices) result = ECapabilityLocalServices;
+ else if (aName == KCapabilityReadUserData) result = ECapabilityReadUserData;
+ else if (aName == KCapabilityWriteUserData) result = ECapabilityWriteUserData;
+ else if (aName == KCapabilityLocation) result = ECapabilityLocation;
+ else if (aName == KCapabilitySurroundingsDD) result = ECapabilitySurroundingsDD;
+ else if (aName == KCapabilityUserEnvironment) result = ECapabilityUserEnvironment;
+
+ if (result == ECapability_None)
+ {
+ User::Leave(KErrArgument);
+ }
+
+ return result;
+ }
+
+EXPORT_C void Input::ParseCapabilitySetL(const TDesC8& aIn, TCapabilitySet& aOut)
+ {
+ aOut.SetEmpty();
+ TInt pos = 0, err = KErrNone;
+ for (;;)
+ {
+ const TDesC8& match = Input::ParseElement(aIn, KCapabilityStart, KCapabilityEnd, pos, err);
+ if (err != KErrNone)
+ {
+ break;
+ }
+ aOut.AddCapability(ParseCapabilityNameL(match));
+ }
+ if (err != KErrNone && err != KErrNotFound)
+ {
+ User::Leave(err);
+ }
+ }
+
+EXPORT_C void Input::ParseSecurityPolicyL(const TDesC8& aIn, TSecurityPolicy& aOut)
+ {
+ TInt options = 0;
+
+ TBool pass = aIn.Find(KPolicyPass) != KErrNotFound; // why didn't we use a proper xml parser?
+ if (pass) ++options;
+
+ TBool fail = aIn.Find(KPolicyFail) != KErrNotFound;
+ if (fail) ++options;
+
+ TUint secureId = ParseIntElement(aIn, KSecureIdStart, KSecureIdEnd);
+ if (secureId) ++options;
+
+ TUint vendorId = ParseIntElement(aIn, KVendorIdStart, KVendorIdEnd);
+ if (vendorId) ++options;
+
+ // Can only sepcify one of pass, fail, secureid, vendorid
+ if (options > 1)
+ User::Leave(KErrArgument);
+
+ // Parse the capabilities
+ TCapabilitySet capSet;
+ ParseCapabilitySetL(aIn, capSet);
+
+ // Determine maximum number of capabilities allowed
+ TInt maxCaps;
+ if (pass || fail)
+ {
+ maxCaps = 0;
+ }
+ else if (secureId || vendorId)
+ {
+ maxCaps = 3;
+ }
+ else
+ {
+ maxCaps = 7;
+ }
+
+ TCapability caps[7];
+ TInt count = 0;
+
+ // Extract capabilities into array
+ TInt i;
+ for (i = 0 ; i < ECapability_Limit ; ++i)
+ {
+ TCapability c = static_cast(i);
+ if (capSet.HasCapability(c))
+ {
+ // Check if more capabities are specified that allowed
+ if (count == maxCaps)
+ {
+ User::Leave(KErrArgument);
+ }
+ caps[count++] = c;
+ }
+ }
+
+ // Fill the rest of the array with ECapability_None
+ for (i = count ; i < maxCaps ; ++i)
+ {
+ caps[i] = ECapability_None;
+ }
+
+ if (pass)
+ {
+ aOut = TSecurityPolicy(TSecurityPolicy::EAlwaysPass);
+ }
+ else if (fail)
+ {
+ aOut = TSecurityPolicy(TSecurityPolicy::EAlwaysFail);
+ }
+ else if (secureId)
+ {
+ aOut = TSecurityPolicy(TSecureId(secureId), caps[0], caps[1], caps[2]);
+ }
+ else if (vendorId)
+ {
+ aOut = TSecurityPolicy(TVendorId(vendorId), caps[0], caps[1], caps[2]);
+ }
+ else
+ {
+ aOut = TSecurityPolicy(caps[0], caps[1], caps[2], caps[3],
+ caps[4], caps[5], caps[6]);
+ }
+ }
+
+EXPORT_C void Output::writeCapabilityL(TCapability aCap)
+ {
+ switch (aCap)
+ {
+ case ECapabilityTCB:
+ writeString(KCapabilityTCB);
+ break;
+
+ case ECapabilityCommDD:
+ writeString(KCapabilityCommDD);
+ break;
+
+ case ECapabilityPowerMgmt:
+ writeString(KCapabilityPowerMgmt);
+ break;
+
+ case ECapabilityMultimediaDD:
+ writeString(KCapabilityMultimediaDD);
+ break;
+
+ case ECapabilityReadDeviceData:
+ writeString(KCapabilityReadDeviceData);
+ break;
+
+ case ECapabilityWriteDeviceData:
+ writeString(KCapabilityWriteDeviceData);
+ break;
+
+ case ECapabilityDRM:
+ writeString(KCapabilityDRM);
+ break;
+
+ case ECapabilityTrustedUI:
+ writeString(KCapabilityTrustedUI);
+ break;
+
+ case ECapabilityProtServ:
+ writeString(KCapabilityProtServ);
+ break;
+
+ case ECapabilityDiskAdmin:
+ writeString(KCapabilityDiskAdmin);
+ break;
+
+ case ECapabilityNetworkControl:
+ writeString(KCapabilityNetworkControl);
+ break;
+
+ case ECapabilityAllFiles:
+ writeString(KCapabilityAllFiles);
+ break;
+
+ case ECapabilitySwEvent:
+ writeString(KCapabilitySwEvent);
+ break;
+
+ case ECapabilityNetworkServices:
+ writeString(KCapabilityNetworkServices);
+ break;
+
+ case ECapabilityLocalServices:
+ writeString(KCapabilityLocalServices);
+ break;
+
+ case ECapabilityReadUserData:
+ writeString(KCapabilityReadUserData);
+ break;
+
+ case ECapabilityWriteUserData:
+ writeString(KCapabilityWriteUserData);
+ break;
+
+ case ECapabilityLocation:
+ writeString(KCapabilityLocation);
+ break;
+
+ case ECapabilitySurroundingsDD:
+ writeString(KCapabilitySurroundingsDD);
+ break;
+
+ case ECapabilityUserEnvironment:
+ writeString(KCapabilityUserEnvironment);
+ break;
+
+ default:
+ User::Invariant();
+ }
+ }
+
+EXPORT_C void Output::writeCapabilitySetL(const TCapabilitySet& aCaps)
+ {
+ TBool first = ETrue;
+ for (TInt i = 0 ; i < ECapability_Limit ; ++i)
+ {
+ TCapability cap = static_cast(i);
+ if (aCaps.HasCapability(cap))
+ {
+ if (!first)
+ {
+ writeString(KCommaSpace);
+ }
+ else
+ {
+ first = EFalse;
+ }
+ writeCapabilityL(cap);
+ }
+ }
+ }
+
+/**
+ * The real TSecurityPolicy class has no accessors, so to extract information
+ * from it we cast it to this class, which has exactly the same layout.
+ */
+class TPrintableSecurityPolicy
+ {
+public:
+ void WriteL(Output& aOut) const;
+
+public:
+ enum TType
+ {
+ ETypeFail=0, // Always fail
+ ETypePass=1, // Always pass
+ ETypeC3=2, // Up to 3 capabilities
+ ETypeC7=3, // Up to 7 capabilities
+ ETypeS3=4, // SID + up to 3 capabilities
+ ETypeV3=5, // VID + up to 3 capabilities
+
+ ETypeLimit
+ };
+
+private:
+ TPrintableSecurityPolicy();
+ TBool WriteCapsL(Output& aOut, TBool aFirst) const;
+ void WriteExtraCapsL(Output& aOut, TBool aFirst) const;
+
+private:
+ TUint8 iType;
+ TUint8 iCaps[3]; // missing capabilities are set to 0xff
+ union
+ {
+ TUint32 iSecureId;
+ TUint32 iVendorId;
+ TUint8 iExtraCaps[4]; // missing capabilities are set to 0xff
+ };
+ };
+
+// Check noone added another type to the enumeration
+__ASSERT_COMPILE(((TInt)TPrintableSecurityPolicy::ETypeLimit) == ((TInt)TSecurityPolicy::ETypeLimit));
+
+EXPORT_C void Output::writeSecurityPolicyL(const TSecurityPolicy& aPolicy)
+ {
+ const TPrintableSecurityPolicy* p = reinterpret_cast(&aPolicy);
+ p->WriteL(*this);
+ }
+
+void TPrintableSecurityPolicy::WriteL(Output& aOut) const
+ {
+ switch (iType)
+ {
+ case ETypeFail:
+ aOut.writeString(_L("AlwaysFail"));
+ break;
+ case ETypePass:
+ aOut.writeString(_L("AlwaysPass"));
+ break;
+ case ETypeC3:
+ WriteCapsL(aOut, ETrue);
+ break;
+ case ETypeC7:
+ {
+ TBool first = WriteCapsL(aOut, ETrue);
+ WriteExtraCapsL(aOut, first);
+ }
+ break;
+ case ETypeS3:
+ aOut.writeString(_L("SID 0x"));
+ aOut.writeHex(iSecureId);
+ WriteCapsL(aOut, EFalse);
+ break;
+ case ETypeV3:
+ aOut.writeString(_L("VID 0x"));
+ aOut.writeHex(iVendorId);
+ WriteCapsL(aOut, EFalse);
+ break;
+ default:
+ User::Invariant();
+ }
+ }
+
+TBool TPrintableSecurityPolicy::WriteCapsL(Output& aOut, TBool aFirst) const
+ {
+ for (TInt i = 0 ; i < 3 ; ++i)
+ {
+ if (iCaps[i] != 0xff)
+ {
+ if (!aFirst)
+ {
+ aOut.writeString(KCommaSpace);
+ }
+ aFirst = EFalse;
+ aOut.writeCapabilityL((TCapability) iCaps[i]);
+ }
+ }
+ return aFirst;
+ }
+
+void TPrintableSecurityPolicy::WriteExtraCapsL(Output& aOut, TBool aFirst) const
+ {
+ for (TInt i = 0 ; i < 3 ; ++i)
+ {
+ if (iExtraCaps[i] != 0xff)
+ {
+ if (!aFirst)
+ {
+ aOut.writeString(KCommaSpace);
+ }
+ aFirst = EFalse;
+ aOut.writeCapabilityL((TCapability) iExtraCaps[i]);
+ }
+ }
+ }