secureswitools/swisistools/source/dumpsis/main.cpp
changeset 0 ba25891c3a9e
child 24 5cc91383ab1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/dumpsis/main.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,187 @@
+/*
+* Copyright (c) 2004-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: 
+*
+*/
+
+#ifdef _MSC_VER
+#pragma warning (disable: 4786)
+#endif // _MSC_VER
+
+
+#include <iostream>
+#include <string>
+#include <fstream>
+#include <wchar.h>
+#include <openssl/err.h>
+#include <stdio.h>
+
+#include "utility_interface.h"
+#include "options.h"
+#include "siscontents.h"
+#include "siscontroller.h"
+#include "dumpsis.h"
+
+enum DumpsisException
+	{
+	EDumpsisExecutionSuccessful,
+	EDumpsisExecutionError,
+	EDumpsisUnknownError
+	};
+
+void DisplayFileCapList(CDumpSis& dumpsis, Options& aOptions)
+	{
+	TFileCapTestList fileList;
+	dumpsis.GetCapVerifiedFileList(fileList);
+	int fileCount = fileList.size();
+
+	if(fileCount != 0 && aOptions.CreateECI() && !aOptions.Verbose())
+		{
+		std::wcout << L"[FILELIST]" << std::endl;
+		}
+
+	for(int i = 0; i < fileCount; ++i)
+		{
+		std::wcout << std::endl; 
+		const CSISFileDescription* fdesc = fileList[i].iFileDesc; 
+		std::wstring str = fdesc->Target().GetString();
+		std::wcout << L"File" << i+1;
+		if(aOptions.CreateECI() && !aOptions.Verbose())
+			{
+			std::wcout << L"=" << str;
+			std::wcout << L"@" << fdesc->Capabilities() << std::endl;
+			}
+		else
+			{
+			std::wcout << L":" << str;
+			std::vector<std::wstring> capList;
+			fdesc->GetCapabilityList(capList);
+			std::wcout << std::endl;
+			for(int j = 0; j < capList.size(); ++j)
+				{
+				std::wcout << L"\t" << capList[j] << std::endl;
+				}
+			}
+		}
+	if(!aOptions.Verbose())
+		{
+		for(int i = 0; i < fileCount; ++i)
+			{
+			if(fileList[i].iActualCap < 0)
+				{
+				continue;
+				}
+			if(aOptions.CreateECI() && fileList[i].iFileDesc->Capabilities() == 0)
+				{
+				std::wcout << L"0" << std::endl;
+				}
+			else if(!aOptions.CreateECI())
+				{
+				std::wcout << std::endl;
+				std::wcout << L"Executable" << i+1; 
+				if(fileList[i].iActualCap)
+					{
+					std::wcout << L": capabilities matched with the SIS file header capabilities";
+					}
+				else
+					{
+					std::wcout << L": capabilities mismatched with the SIS file header capabilities";
+					}
+				std::wcout << std::endl << std::endl;
+				}
+			}
+		}
+	}
+
+int main(int argc, char *argv[])
+	{
+	wchar_t **argv1 = CommandLineArgs(argc,argv);
+
+	Options* options = NULL;
+	int retVal = EDumpsisExecutionSuccessful;
+	try
+		{
+		options = new Options (argc, argv1);
+		
+		SISLogger::SetStream(std::wcout);
+		
+		CDumpSis dumpsis(options->SISFileName(), options->Verbose());
+		
+		CDumpSis::TExtractionLevel extractionLevel = CDumpSis::ENone;
+		
+		if(options->ExtractFiles())
+			{
+			extractionLevel = (options->Verbose())? CDumpSis::EEverything : CDumpSis::EAllButCerts;
+			}
+		else
+			{
+			extractionLevel = CDumpSis::EAllDataFiles;
+			}
+		
+		dumpsis.ExtractFiles(options->ExtractDirectory(), extractionLevel);
+		
+		if(options->Listexe())
+			{
+			DisplayFileCapList(dumpsis, *options);
+			}
+		}
+	catch (CmdLineException err)
+		{
+		Options::DisplayError (err);
+		retVal = EDumpsisExecutionError;
+		}
+	catch(CSISException oops)
+		{
+		switch(oops.ErrorCategory())
+			{
+			case CSISException::EFileProblem:
+				std::cerr << "cannot open specified SIS file for reading" << std::endl;
+				break;
+			case CSISException::EFileFormat:
+			case CSISException::EMemory:
+			case CSISException::EIllegal:
+				std::cerr << "error whilst parsing file contents" << std::endl;
+				break;
+			case CSISException::ELegacyFormat:
+				std::cerr << "This is an old format (pre 9.x) SIS file, which is no longer supported" << std::endl;
+				break;
+			case CSISException::ECompress:
+				std::cerr << "error while decompressing" << std::endl;
+				break;
+			default:
+				std::cerr << "unknown error reading SIS file" << std::endl;
+				break;
+			}
+		retVal = EDumpsisExecutionError;
+		}
+	catch (std::exception &err)
+		{
+		std::cerr << "Error: " << err.what() << std::endl;
+		retVal = EDumpsisExecutionError;
+		}
+	catch (...)
+		{
+		retVal = EDumpsisUnknownError;
+		std::cerr << "Unknown error";
+		}
+
+	if ((NULL != options) && (options->PauseOnExit()))
+		{
+		std::cout << argv[0] << " Finished" << std::endl;
+		getchar ();
+		}
+	delete options;
+
+	return retVal;
+	}