cdlcompilertoolkit/src/CdlTkWriteCommonDefs.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdlcompilertoolkit/src/CdlTkWriteCommonDefs.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,190 @@
+/*
+* Copyright (c) 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:
+*
+*/
+#pragma warning (disable:4786)	// disable "identifier was truncated to '255' characters in the browser information" warning
+#include "CdlCompilerToolkit/CdlTkProcess.h"
+#include "CdlTkPriv.h"
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+using namespace std;
+
+namespace CdlCompilerToolkit {
+
+void CCdlTkWriteCommonDefs::ExportCommonDefs(const CCdlTkInterface& aCdl, const std::string& aFileName)
+	{
+	CCdlTkFileCleanup tempFile;
+	ofstream out;
+
+	CdlTkUtil::OpenTempOutput(out, tempFile);
+	CCdlTkWriteCommonDefs commonDefs(aCdl, out, aFileName);
+	commonDefs.ProcessHRH(out);
+	out.close();
+	CdlTkUtil::ExportFileIfWritable(tempFile, CdlTkUtil::ToLower(aFileName+"rh"));
+
+	CdlTkUtil::OpenTempOutput(out, tempFile);
+	commonDefs.Process();
+	out.close();
+	CdlTkUtil::ExportFileIfWritable(tempFile, CdlTkUtil::ToLower(aFileName));
+	}
+
+CCdlTkWriteCommonDefs::CCdlTkWriteCommonDefs(const CCdlTkInterface& aCdl, ofstream& aStream, const string& aFileName)
+: iCdl(aCdl), iStream(&aStream), iFileName(aFileName)
+	{
+	}
+
+const string KCommonDefsHeader = "\
+/*\n\
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n\
+* All rights reserved.\n\
+* This component and the accompanying materials are made available\n\
+* under the terms of  \"Eclipse Public License v1.0\"\n\
+* which accompanies this distribution, and is available\n\
+* at the URL \"http://www.eclipse.org/legal/epl-v10.html\".\n\
+*\n\
+* Initial Contributors:\n\
+* Nokia Corporation - initial contribution.\n\
+*\n\
+* Contributors:\n\
+*\n\
+* Description:\n\
+*\n\
+*/\n\n\
+// It contains common definitions for the client and customisation API.\n\
+// It should not be modified manually.\n\
+\n";
+
+const string KHrhContents ="\
+// These constants are defined by the CDL interface: $NAME\n\
+#define _CDL_$NSPACE_KCdlInterfaceUidValue $UID\n\
+\n";
+
+void CCdlTkWriteCommonDefs::ProcessHRH(ofstream& aStream)
+	{
+	iStream = &aStream;
+	string fileName = iFileName + "rh";
+
+	string cdlFileName(CdlTkUtil::ToLower(iCdl.FileName()));
+//	Stream() << CdlTkUtil::Replace("$FILE", cdlFileName, KCommonDefsHeader);
+	Stream() << KCommonDefsHeader;
+	WriteHeaderGuardStart(fileName, Stream());
+
+	const CCdlTkInterfaceHeader& header = iCdl.Header();
+	CdlTkUtil::CReplaceSet headerSet;
+	headerSet.Add("$NAME", header.Name());
+	headerSet.Add("$UID", CdlTkUtil::IntToHexString(header.Uid()));
+	headerSet.Add("$NSPACE", iCdl.NamespaceName());
+	Stream() << CdlTkUtil::MultiReplace(headerSet, KHrhContents);
+
+	WriteHeaderGuardEnd(fileName, Stream());
+	}
+
+const string KInterfaceConstants ="\
+#include \"$THISFILErh\"\n\
+\n\
+// These constants are defined by the CDL interface: $NAME\n\
+_LIT(KCdlName, \"$NAME\");\n\
+const TInt KCdlInterfaceUidValue = _CDL_$NSPACE_KCdlInterfaceUidValue;\n\
+const TUid KCdlInterfaceUid = { KCdlInterfaceUidValue };\n\
+const TInt KCdlInterfaceMajorVersion = $MAJOR;\n\
+const TInt KCdlInterfaceMinorVersion = $MINOR;\n\
+const TUint KCdlInterfaceFlags = $FLAGS;\n\
+\n\
+// These are the API ids used in this interface.\n\
+enum TApiId\n\
+\t{\n";
+
+const string KCdlInterface = "\
+\tE_TApiId_TableSize\n\
+\t};\n\
+\n\
+// This is the CDL interface definition for this interface\n\
+const SCdlInterface KCdlInterface =\n\
+\t{\n\
+\tKCdlCompilerMajorVersion,\n\
+\tKCdlCompilerMinorVersion,\n\
+\tLIT_AS_DESC_PTR(KCdlName),\n\
+\t{ KCdlInterfaceUidValue },\n\
+\tKCdlInterfaceMajorVersion,\n\
+\tKCdlInterfaceMinorVersion,\n\
+\tKCdlInterfaceFlags,\n\
+\tE_TApiId_TableSize\n\
+\t};\n\
+\n\
+// These typedefs define the types for function APIs\n";
+
+void CCdlTkWriteCommonDefs::Process()
+	{
+	string cdlFileName(CdlTkUtil::ToLower(iCdl.FileName()));
+//	Stream() << CdlTkUtil::Replace("$FILE", cdlFileName, KCommonDefsHeader);
+	Stream() << KCommonDefsHeader;
+	WriteHeaderGuardStart(iFileName, Stream());
+	const CCdlTkCpp& cpp = iCdl.Cpp();
+	for (CCdlTkCpp::const_iterator pCpp = cpp.begin(); pCpp != cpp.end(); ++pCpp)
+		Stream() << *pCpp << endl;
+	Stream() << endl;
+	WriteNamespaceStart(iCdl, Stream());
+	const CCdlTkInterfaceHeader& header = iCdl.Header();
+	CdlTkUtil::CReplaceSet headerSet;
+	headerSet.Add("$NAME", header.Name());
+	headerSet.Add("$NSPACE", iCdl.NamespaceName());
+	headerSet.Add("$THISFILE", CdlTkUtil::ToLower(CdlTkUtil::StripPath(iFileName)));
+	headerSet.Add("$MAJOR", CdlTkUtil::IntToString(header.Version().Major()));
+	headerSet.Add("$MINOR", CdlTkUtil::IntToString(header.Version().Minor()));
+	headerSet.Add("$FLAGS", header.Flags().FlagsAsString());
+	Stream() << CdlTkUtil::MultiReplace(headerSet, KInterfaceConstants);
+	WriteApiEnum();
+	Stream() << KCdlInterface;
+	WriteApiTypedefs();
+	Stream() << endl;
+	WriteNamespaceEnd(iCdl, Stream());
+	WriteHeaderGuardEnd(iFileName, Stream());
+	}
+
+void CCdlTkWriteCommonDefs::WriteApiEnum()
+	{
+	const CCdlTkApiList& apiList = iCdl.ApiList();
+	for (CCdlTkApiList::const_iterator pApi = apiList.begin(); pApi != apiList.end(); ++pApi)
+		{
+		Stream() << "\tEApiId_" << (*pApi)->Name() << "," << endl;
+		}
+	}
+
+string CCdlTkWriteCommonDefs::TypedefForApi(const CCdlTkApi& aApi) const
+	{
+	if (aApi.IsFunc())
+		{
+		const CCdlTkFunctionApi& func = aApi.AsFunc();
+		return string("typedef ") + func.ReturnType() + " (" + func.ApiNameAsTypeName() + ")(" + func.ParamTypeList() + ");";
+		}
+	else
+		{
+		return string("// ") + aApi.ReturnType() + " " + aApi.Name() + " \tdoes not need a typedef";
+		}
+	}
+
+void CCdlTkWriteCommonDefs::WriteApiTypedefs()
+	{
+	for (CCdlTkApiList::const_iterator pApi = iCdl.ApiList().begin(); pApi != iCdl.ApiList().end(); ++pApi)
+		Stream() << TypedefForApi(**pApi) << endl;
+	}
+
+std::ofstream& CCdlTkWriteCommonDefs::Stream()
+	{
+	return *iStream;
+	}
+
+}	// end of namespace CdlCompilerToolkit