diff -r 000000000000 -r f58d6ec98e88 cdlcompilertoolkit/src/CdlTkWriteInstance.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cdlcompilertoolkit/src/CdlTkWriteInstance.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,341 @@ +/* +* 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 +#include +using namespace std; + +namespace CdlCompilerToolkit { + +CCdlTkWriteInstance::CCdlTkWriteInstance(const CCdlTkInstance& aInstance) +: iInstance(aInstance), iCdl(aInstance.Interface()) + { + } + +CCdlTkWriteInstance::~CCdlTkWriteInstance() + { + } + +void CCdlTkWriteInstance::Process() + { + string implName = CdlTkUtil::ToLower(CdlTkUtil::OutputPath() + CdlTkUtil::StripPath(iInstance.Name())); + string headerName(implName + ".h"); + InitReplace(headerName); + ProcessCdl(); + + CCdlTkFileCleanup tempFile; + + ofstream hrhStream; + CdlTkUtil::OpenTempOutput(hrhStream, tempFile); + ProcessInstanceHrh(hrhStream, headerName+"rh"); + hrhStream.close(); + CdlTkUtil::ExportFileIfWritable(tempFile, headerName+"rh"); + + ofstream headerStream; + CdlTkUtil::OpenTempOutput(headerStream, tempFile); + ProcessInstanceHeader(headerStream, headerName); + headerStream.close(); + CdlTkUtil::ExportFileIfWritable(tempFile, headerName); + + ofstream cppStream; + CdlTkUtil::OpenTempOutput(cppStream, tempFile); + ProcessInstance(cppStream, headerName); + cppStream.close(); + CdlTkUtil::ExportFileIfWritable(tempFile, CdlTkUtil::CorrectFilenameCase(implName + ".cpp")); + } + +void CCdlTkWriteInstance::InitReplace(const std::string& aHeaderName) + { + iReplace.clear(); + iReplace.Add("$INSTNAME", iInstance.Name()); + iReplace.Add("$CDLNAME", CdlTkUtil::StripPath(iCdl.FileName())); + iReplace.Add("$CDLINCNAME", CdlTkUtil::ToLower(CdlTkUtil::StripPath(iCdl.FileName()))); + iReplace.Add("$HEADERNAME", CdlTkUtil::ToLower(CdlTkUtil::StripPath(aHeaderName))); + iReplace.Add("$EXTRA", iInstance.ExtraCpp()); + iReplace.Add("$INSTNS", CdlTkUtil::ToCpp(iInstance.Name())); + iReplace.Add("$CDLNS", iCdl.NamespaceName()); + iReplace.Add("$CDLGUARD", HeaderGuardName(iCdl.FileName() + ".custom.h")); + iReplace.Add("$INSTGUARD", HeaderGuardName(aHeaderName)); + iReplace.Add("$CMDLINE", CdlTkUtil::CommandLine()); + if (iInstance.Id() == KCdlTkGetInstanceIdFromHostDll) + { + iReplace.Add("$INSTID", iInstance.DllInstanceName()); + iReplace.Add("$DLLINSTHEADER", "#include \"" + KDllInstHeader + "\"\n"); + } + else + { + iReplace.Add("$INSTID", CdlTkUtil::IntToString(iInstance.Id())); + iReplace.Add("$DLLINSTHEADER", ""); + } + } + +void CCdlTkWriteInstance::ProcessCdl() const + { + AssertInterfaceNotExtended(iCdl); + + string baseName = CdlBaseNameAndPath(iCdl); + + string commonHeaderName(baseName + KCommonHeader); + CCdlTkWriteCommonDefs::ExportCommonDefs(iCdl, commonHeaderName); + + CCdlTkFileCleanup tempFile; + ofstream out; + CdlTkUtil::OpenTempOutput(out, tempFile); + string customHeaderName(baseName + ".custom.h"); + ProcessInstanceApi(out, customHeaderName); + out.close(); + CdlTkUtil::ExportFile(tempFile, customHeaderName); + } + + +const string KInstanceApiStart = "\ +/*\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\ +// This file was generated from $CDLNAME.\n\ +// It contains the customisation API.\n\ +// It should not be modified manually.\n\ +\n\ +#ifndef $CDLGUARD\n\ +#define $CDLGUARD\n\ +\n\ +#include \n\ +#include \"$CDLINCNAME.common.h\"\n\ +\n\ +namespace $CDLNS\n\ +{\n\ +\n\ +// This structure defines the interface to a customisation instance.\n\ +// A customisation instance must supply an instance of this structure, with the pointer\n\ +// members either being NULL, or pointing at functions or data of the correct type.\n\ +\n\ +#ifdef __WINS__\n\ +struct SCdlImpl0\n\ +#else\n\ +struct SCdlImpl\n\ +#endif\n\ +\t{\n"; + +const string KInstanceApiEnd = "\ +\t};\n\ +#ifdef __WINS__\n\ +struct SCdlImpl\n\ +\t{\n\ +\tSCdlImpl0 i0;\n\ +$SUBSTRUCTS\ +\t};\n\ +#endif\n\ +\n\ +} // end of namespace $CDLNS\n\ +#endif // $CDLGUARD\n"; + +const string KSubStructDecl = "\ +#ifdef __WINS__\n\ +\t};\n\ +\n\ +struct SCdlImpl$NUM\n\ +\t{\n\ +#endif\n"; + +const string KSubStructUse = "\tSCdlImpl$NUM i$NUM;\n"; + +const int KMsvcStructSplit = 1000; + +void CCdlTkWriteInstance::ProcessInstanceApi(ofstream& aStream, const string& aFileName) const + { + string subStructs; + int count=0; + aStream << CdlTkUtil::MultiReplace(iReplace, KInstanceApiStart); + for (CCdlTkApiList::const_iterator pApi = iCdl.ApiList().begin(); pApi != iCdl.ApiList().end(); ++pApi) + { + aStream << "\t" << (*pApi)->PointerType() << " " << (*pApi)->Name() << ";" << endl; + count++; + if ((count%KMsvcStructSplit) == 0) + { + string num = CdlTkUtil::IntToString(count/KMsvcStructSplit); + aStream << CdlTkUtil::Replace("$NUM", num, KSubStructDecl); + CdlTkUtil::AppendString(subStructs, CdlTkUtil::Replace("$NUM", num, KSubStructUse)); + } + } + string end = CdlTkUtil::Replace("$SUBSTRUCTS", subStructs, KInstanceApiEnd); + aStream << CdlTkUtil::MultiReplace(iReplace, end); + } + + +const string KInstanceCppStart = "\ +/*\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\ +// $INSTNAME generated by\n\ +// $CMDLINE\n\ +// This customisation implements the interface defined in $CDLNAME\n\ +\n\ +#include \"$HEADERNAME\"\n\ +$EXTRA\n\ +namespace $INSTNS\n\ +{\n\ +\n"; + +const string KInstanceCppMid = "\ +\n\ +const $CDLNS::SCdlImpl KCdlImpl = \n\ +\t{\n"; + +const string KInstanceCppEnd = "\ +\t};\n\ +\n\ +} // end of namespace $INSTNS\n"; + +void CCdlTkWriteInstance::ProcessInstance(ofstream& aStream, const string& aHeaderName) const + { + aStream << CdlTkUtil::MultiReplace(iReplace, KInstanceCppStart); + + const CCdlTkImplementations& impl = iInstance.Impl(); + CCdlTkImplementations::const_iterator pImpl; + // write the definitions + for (pImpl = impl.begin(); pImpl != impl.end(); ++pImpl) + { + const string& defn = (*pImpl)->Definition(); + if (defn.size()) + { + aStream << defn << endl; + aStream << endl; + } + } + + aStream << CdlTkUtil::MultiReplace(iReplace, KInstanceCppMid); + + // write the pointers + for (pImpl = impl.begin(); pImpl != impl.end(); ++pImpl) + aStream << "\t" << (*pImpl)->PointerReference() << "," << endl; + + aStream << CdlTkUtil::MultiReplace(iReplace, KInstanceCppEnd); + } + + +const string KInstanceHeader = "\ +/*\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\ +// This header file contains the customisation implementation identity for $INSTNAME\n\ +// It was generated by:\n\ +// $CMDLINE\n\ +// This file may be manually modified.\n\ +\n\ +#ifndef $INSTGUARD\n\ +#define $INSTGUARD\n\ +#include \"$CDLINCNAME.custom.h\"\n\ +#include \"$HEADERNAMErh\"\n\ +\n\ +namespace $INSTNS\n\ +{\n\ +\n\ +const TInt KCdlInstanceId = _CDL_$INSTNS_KCdlInstanceId;\n\ +using $CDLNS::KCdlInterface;\n\ +using $CDLNS::KCdlInterfaceUidValue;\n\ +GLREF_D const $CDLNS::SCdlImpl KCdlImpl;\n\ +\n\ +} // end of namespace $INSTNS\n\ +#endif // $INSTGUARD\n"; + +void CCdlTkWriteInstance::ProcessInstanceHeader(ofstream& aStream, const string& aFileName) const + { + aStream << CdlTkUtil::MultiReplace(iReplace, KInstanceHeader); + } + + +const string KInstanceHrh = "\ +/*\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\ +// This header file contains the customisation implementation identity for $INSTNAME\n\ +// It was generated by:\n\ +// $CMDLINE\n\ +// This file may be manually modified.\n\ +\n\ +#ifndef $INSTGUARDRH\n\ +#define $INSTGUARDRH\n\ +#include \"$CDLINCNAME.common.hrh\"\n\ +$DLLINSTHEADER\ +\n\ +#define _CDL_$INSTNS_KCdlInstanceInterfaceUidValue _CDL_$CDLNS_KCdlInterfaceUidValue\n\ +#define _CDL_$INSTNS_KCdlInstanceId $INSTID\n\ +\n\ +#endif // $INSTGUARDRH\n"; + +void CCdlTkWriteInstance::ProcessInstanceHrh(ofstream& aStream, const string& aFileName) const + { + aStream << CdlTkUtil::MultiReplace(iReplace, KInstanceHrh); + } + +} // end of namespace CdlCompilerToolkit