diff -r 000000000000 -r f58d6ec98e88 cdlcompilertoolkit/src/CdlTkWriteCommonDefs.cpp --- /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 +#include +#include +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