secureswitools/swisistools/source/sisxlibrary/siscapabilities.cpp
changeset 0 ba25891c3a9e
child 26 04d4a7bbc3e0
child 50 c6e8afe0ba85
child 62 5cc91383ab1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/sisxlibrary/siscapabilities.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,203 @@
+/*
+* 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: 
+*
+*/
+
+
+/**
+ @file
+*/
+
+#ifdef _MSC_VER
+#pragma warning (disable: 4786)
+#endif // _MSC_VER
+
+
+#include "siscapabilities.h"
+#include "utility_interface.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/stat.h>
+
+typedef int TInt;
+typedef bool TBool;
+
+enum TCapability
+	{
+	ECapability_HardLimit			= 255
+	};
+
+const TInt KCapabilitySetMaxSize	= (((TInt)ECapability_HardLimit + 7)>>3);
+
+LPWSTR TempFileName();
+
+#include <seclib.h>
+
+CSISCapabilities::CSISCapabilities(const CSISCapabilities& aInitialiser)
+	: CStructure<CSISFieldRoot::ESISCapabilities> (aInitialiser),
+	iCapabilities(aInitialiser.iCapabilities),
+	iCapabilitySetSize(0)
+	{
+	
+	InsertMembers();
+	
+	}
+
+std::string CSISCapabilities::Name() const
+	{
+	
+	return "Capabilties";
+
+	}
+
+void CSISCapabilities::ExtractCapabilities(const std::wstring& aFileName)
+	{
+	SBinarySecurityInfo info;
+
+	// This call has some rather innapropriate side effects when called
+	// on a file that isn't an executable.
+	// Here we redirect stderr, so that we don't see them.
+
+	int oldStderr = 0;
+	FILE* nulStderr;
+
+	_dup2(oldStderr, 2);
+
+	CSISException::ThrowIf(oldStderr == -1, CSISException::EFileProblem, "Failed in redirection operation");
+
+	#ifdef __TOOLS2_LINUX__
+	nulStderr = fopen("NULL", "w");
+	#else
+	nulStderr = fopen("NUL:", "w");
+	#endif
+
+	CSISException::ThrowIf(nulStderr == NULL, CSISException::EFileProblem, "Failed in redirection operation");
+
+	CSISException::ThrowIf(_dup2(_fileno(nulStderr), 2) == -1, CSISException::EFileProblem, "Failed in redirection operation");
+ 	TInt err = 1;
+	char buffer[PATHMAX] = {0};
+	ConvertWideCharToMultiByte(aFileName.c_str(),-1,buffer,sizeof(buffer));
+	err = GetSecurityInfo(buffer, info);
+	fflush(stdout);
+	_dup2(oldStderr, 2);
+
+	fclose(nulStderr);
+
+	if (!err)
+		{
+
+		iCapabilitySetSize = 0;
+
+		for (TInt i = KCapabilitySetMaxSize - 1; i > 0; i--)
+			{
+		
+			if (!iCapabilitySetSize && info.iCapabilities[i])
+				{
+				iCapabilitySetSize = i + 1;
+				} 
+		
+			iCapabilities |= info.iCapabilities[i];
+			iCapabilities = iCapabilities << 8;
+			
+			}
+		
+		iCapabilities |= info.iCapabilities[0];
+		
+		if (iCapabilities && !iCapabilitySetSize)
+			{
+			iCapabilitySetSize = 1;
+			}
+		
+		} 
+	}
+
+bool CSISCapabilities::WasteOfSpace() const
+	{
+	
+	return (0 == iCapabilities);
+	
+	}
+
+void CSISCapabilities::Verify(const TUint32 aLanguages) const
+	{
+	
+	CStructure <CSISFieldRoot::ESISCapabilities>::Verify (aLanguages);
+
+	CSISException::ThrowIf(iCapabilitySetSize > sizeof(iCapabilities),
+		CSISException::EVerification, 
+		"Capability set size if greater than this version of makesis is capable of storing");
+	
+	}
+
+void CSISCapabilities::AddPackageEntry(std::wostream& aStream, bool aVerbose) const
+	{
+	if(WasteOfSpace() || !aVerbose)
+		{
+		return;
+		}
+
+	// Following neads to be printed only if aVerbose is true
+	aStream << L"; Capabilities: ";
+	int capability = 0;
+
+	TUint32 capabilityField = iCapabilities.Value();
+	for (int i = 0; i < KCapabilitySetMaxSize; ++i, ++capability)
+		{
+		if (capabilityField & 0x01)
+			{
+			 if (capability < NUMOFCAPABILITIES)
+				{
+				aStream << KCapabilityNames[capability] << L", ";
+				}
+			 else
+				{
+				aStream << L"Unknown Capability (" << (capability + 1) << L"), ";	
+				}
+			}
+
+		capabilityField >>= 1;
+		}
+	aStream << std::endl;
+	}
+
+void CSISCapabilities::GetCapabilityList(std::vector<std::wstring>& aCapList) const
+	{
+	int capability = 0;
+
+	TUint32 capabilityField = iCapabilities.Value();
+	for (int i = 0; (i < KCapabilitySetMaxSize) && (0 != capabilityField); ++i, ++capability)
+		{
+		if (capabilityField & 0x01)
+			{
+			 if (capability < NUMOFCAPABILITIES)
+				{
+				 aCapList.push_back(KCapabilityNames[capability]);
+				}
+			 else
+				{
+				wchar_t capName[35];
+#ifdef _MSC_VER
+				swprintf(capName, L"Unknown Capability (%d)", (capability + 1));
+#else
+				swprintf(capName, 35, L"Unknown Capability (%d)", (capability + 1));
+#endif //_MSC_VER
+				aCapList.push_back(capName);
+				}
+			}
+		capabilityField >>= 1;
+		}
+	}
+
+