e32tools/elf2e32/source/polydll_rebuild_target.cpp
changeset 2 39c28ec933dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/elf2e32/source/polydll_rebuild_target.cpp	Mon May 10 19:54:49 2010 +0100
@@ -0,0 +1,124 @@
+// 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 "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:
+// Implementation of the Class PolyDLL Rebuild Target for the elf2e32 tool
+// @internalComponent
+// @released
+// 
+//
+
+#include "polydll_rebuild_target.h"
+#include "deffile.h"
+#include "errorhandler.h"
+
+#include <iostream>
+
+using std::list;
+
+/**
+Constructor for the POLYDLLRebuildTarget Class
+
+@internalComponent
+@released
+*/
+POLYDLLRebuildTarget::POLYDLLRebuildTarget(ParameterListInterface* aParameterListInterface) : ExportTypeRebuildTarget(aParameterListInterface) {
+}
+
+/**
+Destructor for the POLYDLLRebuildTarget Class
+
+@internalComponent
+@released
+*/
+POLYDLLRebuildTarget::~POLYDLLRebuildTarget() 
+{
+}
+
+/**
+Function to process the symbols to be exported. In case of Poly DLL, there might be
+predefined symbols passed to '--sydef' option, need to consider them alongwith the 
+symbols coming from the DEF file and ELF file.
+ 
+@internalComponent
+@released
+*/
+void POLYDLLRebuildTarget::ProcessExports() 
+{
+	int count = iParameterListInterface->SysDefCount();
+	ParameterListInterface::Sys aSysDefSymbols[10];
+
+	int j=0, i=count;
+	while (i)
+	{
+		aSysDefSymbols[j] = iParameterListInterface->SysDefSymbols(j);
+		j++; i--;
+	}
+
+	typedef SymbolList::iterator Iterator;
+
+	Symbol *aSymbolEntry;
+
+	SymbolList *iSysDefExports = new SymbolList;
+
+	iDefExports = iDefFile->ReadDefFile(iParameterListInterface->DefInput());
+	
+	for (int k=0; k < count; k++)
+	{
+		SymbolType aType = SymbolTypeCode;
+		aSymbolEntry = new Symbol(aSysDefSymbols[k].iSysDefSymbolName, aType);
+		aSymbolEntry->SetOrdinal(aSysDefSymbols[k].iSysDefOrdinalNum);
+		iSysDefExports->push_back(aSymbolEntry);
+	}
+
+	// Check if the Sysdefs and the DEF file are matching.
+
+	Iterator aBegin = iSysDefExports->begin();
+	Iterator aEnd = iSysDefExports->end();
+
+	Iterator aDefBegin = iDefExports->begin();
+	Iterator aDefEnd = iDefExports->end();
+
+	std::list<String> aMissingSysDefList;
+
+	while ((aDefBegin != aDefEnd) && (aBegin != aEnd))
+	{
+		if (strcmp((*aBegin)->SymbolName(), (*aDefBegin)->SymbolName()))
+			aMissingSysDefList.push_back((*aBegin)->SymbolName());
+		aBegin++;
+		aDefBegin++;
+	}
+
+	if( aMissingSysDefList.size() ) 
+		throw SysDefMismatchError(SYSDEFSMISMATCHERROR, aMissingSysDefList, UseCaseBase::DefInput());
+		
+	ValidateExports(iDefExports);
+	CreateExports();
+}
+
+/**
+Function to generate the output E32 image. Incase of an output DEF file, then the 
+DEF file and the corresponding DSO file should be generated.
+  
+@internalComponent
+@released
+*/
+void POLYDLLRebuildTarget::GenerateOutput() {
+	
+	if( UseCaseBase::DefOutput() ) {
+		WriteDefFile();
+	}
+	if(UseCaseBase::DSOOutput() && UseCaseBase::LinkAsDLLName()) {
+		WriteDSOFile();
+	}
+	WriteE32();
+}