diff -r 000000000000 -r ba25891c3a9e secureswitools/swisistools/source/sisxlibrary/siscapabilities.cpp --- /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 +#include +#include + +typedef int TInt; +typedef bool TBool; + +enum TCapability + { + ECapability_HardLimit = 255 + }; + +const TInt KCapabilitySetMaxSize = (((TInt)ECapability_HardLimit + 7)>>3); + +LPWSTR TempFileName(); + +#include + +CSISCapabilities::CSISCapabilities(const CSISCapabilities& aInitialiser) + : CStructure (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 ::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& 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; + } + } + +