secureswitools/swisistools/source/sisxlibrary/sisfiledata.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/sisxlibrary/sisfiledata.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2007-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 
+ @internalComponent
+ @released
+*/
+
+#include <string>
+#include <algorithm>
+
+#include "sisfiledata.h"
+#include "blob.h"
+#include "utility.h"
+
+
+void CSISFileData::Load (const std::wstring& aFile, TUint64* aSize)
+
+	{
+	TUint64 size = 0;
+	HANDLE file = OpenFileAndGetSize (aFile, &size);
+	try
+		{
+		iData.Content ().SetByteCount (size);
+		}
+	catch (...)
+		{
+		::CloseHandle(file);
+		throw;
+		}
+	ReadAndCloseFile (file, size, iData.Content ().Data ());
+	if (aSize)
+		{
+		*aSize = size;
+		}
+	}
+
+TUint32 CSISFileData::GetSid() const 
+	{
+	const int fileLength = UncompressedSize();
+	if(fileLength <= sizeof(TUint32)*0x05)
+		{
+		return 0;
+		}
+
+	const unsigned char* data8 = Data();
+	const TUint32* data32 = reinterpret_cast<const TUint32*>(data8);
+	
+	TUint32 ret = 0;
+	// Check the file signature. If its a ARM based symbian executable
+	// then the signature should be "EPOC". Check E32ImageHeader for more
+	// details
+	if ( data32[0x04] == KFileHeaderSignature )
+		{
+		// If its a symbian executable then check the SID
+		// of the executable.
+		if(fileLength > (0x80 + sizeof(TUint32)))
+			{
+			ret = *((TUint32*) (data8 + 0x80 ));
+			}
+		}
+	else if (data8[0] == 'M' && data8[1] == 'Z')
+		{
+		// Emulator executable has a different format.
+		// All symbian emulator based executable will have ".SYMBIAN" 
+		// in it. Symbian header will be after this signature.
+		// So search for this marker to read symbian file header.
+		const char symbian[] = ".SYMBIAN";
+		const int  len2      = sizeof(symbian)-1;
+
+		const unsigned char* index = std::search(data8, data8+fileLength, symbian, symbian+len2);
+		if (index != data8+fileLength)
+			{
+			index += KHeaderUidLength;
+			TInt32 offset = *(TInt32*)index;
+			
+			// There should be enough data to read the UIDs from the file.
+			if(fileLength <= (offset + 4*sizeof(TUint32)))
+				{
+				return 0;
+				}
+			
+			const TUint32* x = (TUint32*)(data8+offset);
+			// The three UIDs (12 bytes) of the file
+			// x[0] = the structure of the file
+			// x[1] = identifies the interface the polymorphic DLL implements
+			//		or for shared library DLLs that others link to, this value is always the same
+			//		or for executables the UID value has to be set to KUidApp or NULL
+			// x[3] = distinguishes between objects with the same UID2 
+			//		and can be thought of as a project identifier
+			if (x[0] == KExecutableImageUid)
+				{
+				ret = x[4];
+				}
+			}
+		}
+	return ret;
+	} 
+
+
+bool CSISFileData::IsExecutable() const 
+	{
+	return IsExecutableData(Data(), UncompressedSize());
+	}
+
+bool CSISFileData::IsEmulatorExecutable() const
+	{
+	return IsEmulatorExecutableData(Data(), UncompressedSize());
+	}
+
+bool CSISFileData::IsExe() const
+	{
+	return IsExeData(Data(), UncompressedSize());
+	}
+
+bool CSISFileData::IsDll() const
+	{
+	return IsDllData(Data(), UncompressedSize());
+	}
+
+