cdlcompilertoolkit/src/CdlTkClientHeader.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdlcompilertoolkit/src/CdlTkClientHeader.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,216 @@
+/*
+* 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:
+*
+*/
+#include "CdlCompilerToolkit/CdlTkProcess.h"
+#include "CdlTkPriv.h"
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+using namespace std;
+
+namespace CdlCompilerToolkit {
+
+
+CCdlTkWriteClientHeader::CCdlTkWriteClientHeader(const CCdlTkInterface& aCdl)
+: iCdl(aCdl)
+	{
+	AssertInterfaceNotExtended(iCdl);
+	}
+
+CCdlTkWriteClientHeader::~CCdlTkWriteClientHeader()
+	{
+	}
+
+void CCdlTkWriteClientHeader::Process()
+	{
+	string baseName = CdlBaseNameAndPath(iCdl);
+
+	string commonHeaderName(baseName + KCommonHeader);
+	CCdlTkWriteCommonDefs::ExportCommonDefs(iCdl, commonHeaderName);
+
+	CCdlTkFileCleanup temp;
+	ofstream out;
+	CdlTkUtil::OpenTempOutput(out, temp);
+	string clientHeaderName(baseName + ".h");
+	ProcessApi(out, clientHeaderName);
+	out.close();
+	CdlTkUtil::ExportFile(temp, clientHeaderName);
+	}
+
+const string KClientApi = "$COMMENT $INDENT inline $TYPE $NAME $PARAMS $CONST\t\t{ $RETURN $CALL; }";
+const string KClientDataCall = "*($TYPE)($SCOPE::GetData($UID, EApiId_$NAME))";
+const string KClientFuncCall = "(*($TYPE)($SCOPE::GetFunction($UID, EApiId_$NAME)))($PARAMS)";
+
+void CCdlTkWriteClientHeader::WriteApi(const CCdlTkApi& aApi, ofstream& aStream, bool aCInstanceMember, const string& aIndent) const
+	{
+	CdlTkUtil::CReplaceSet callSet;
+	callSet.Add("$TYPE", aApi.PointerType());
+	callSet.Add("$SCOPE::", aCInstanceMember ? "" : "CdlEngine::");
+	callSet.Add("$UID, ", aCInstanceMember ? "" : "KCdlInterfaceUid, ");
+	callSet.Add("$NAME", aApi.Name());
+	callSet.Add("$PARAMS", aApi.IsFunc() ? aApi.AsFunc().ParamNameList() : "");
+	string call = CdlTkUtil::MultiReplace(callSet, aApi.IsFunc() ? KClientFuncCall : KClientDataCall);
+
+	string comment = CdlTkUtil::Replace("//", aIndent+"//", aApi.Comment());
+
+	CdlTkUtil::CReplaceSet apiSet;
+	apiSet.Add("$TYPE", ClientReturnType(aApi));
+	apiSet.Add("$NAME ", aApi.Name());
+	apiSet.Add("$PARAMS ", aApi.IsFunc() ? aApi.ParamsTypeAndNameList() : string("()"));
+	apiSet.Add("$CONST", aCInstanceMember ? " const" : "");
+	apiSet.Add("$RETURN ", (!aApi.IsFunc() || !aApi.IsVoidReturn()) ? "return " : "");
+	apiSet.Add("$CALL", call);
+	apiSet.Add("$INDENT ", aIndent);
+	apiSet.Add("$COMMENT ", comment);
+	string api = CdlTkUtil::MultiReplace(apiSet, KClientApi);
+
+	aStream << api << endl;
+	aStream << endl;
+	}
+
+string CCdlTkWriteClientHeader::ClientReturnType(const CCdlTkApi& aApi) const
+	{
+	string ret = aApi.ReturnType();
+	if (!aApi.IsFunc())
+		ret += " const&";
+	return ret;
+	}
+
+
+const string KBodyStart = "\
+/*\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 by:\n\
+// $CMDLINE\n\
+// It contains the client API.\n\
+// It should not be modified manually.\n\
+\n\
+$ADDITIONAL\
+#ifndef $CDLGUARD\n\
+#define $CDLGUARD\n\
+\n\
+#include <cdlengine.h>\n\
+#include <$FILE.common.h>\n\
+\n\
+namespace $CDLNS\n\
+{\n\
+\n\
+class CInstance;\n\
+\n\
+// Standard interface functions \n\
+inline void LoadCustomisationL(const TCdlRef& aRef)                          { CdlEngine::LoadCustomisationL(aRef); }\n\
+inline void LoadCustomisationL(const TDesC& aLibName, TInt aInstId)          { TCdlRef ref = { aInstId, { KCdlInterfaceUidValue }, &aLibName }; LoadCustomisationL(ref); }\n\
+inline void RequireCustomisationL()                                          { CdlEngine::RequireCustomisationL(&KCdlInterface); }\n\
+inline TBool IsCustomisationStarted()                                        { return CdlEngine::IsCustomisationStarted(&KCdlInterface); }\n\
+inline const CInstance& CustomisationInstance()                              { return (const CInstance&)(CdlEngine::CustomisationInstance(KCdlInterfaceUid)); }\n\
+inline void SetCustomisationChangeObserverL(MCdlChangeObserver* aObserver)   { CdlEngine::SetCustomisationChangeObserverL(aObserver, KCdlInterfaceUid); }\n\
+\n\
+inline const TCdlRef& LastAccessedRef()                                      { return CdlEngine::LastAccessedRef(KCdlInterfaceUid); }\n\
+inline void FileNameRelativeToLastAccessedInstance(TFileName& aFileName)     { CdlEngine::FileNameRelativeToLastAccessedInstance(KCdlInterfaceUid, aFileName); }\n\
+\n\
+\n\
+// CDL API functions, as defined in $FILE\n\
+\n";
+
+const string KPragmaMinTypeInfo = "\
+#ifdef __VC32__\n\
+#pragma component(mintypeinfo, $ONOFF)\n\
+#endif\n\
+\n";
+
+const string KBodyMid = "\
+\n\
+\n\
+class CInstance : public CCdlInstance\n\
+\t{\n\
+public:\n\
+\tenum { ETypeId = KCdlInterfaceUidValue };\n\
+\n\
+\tinline static const CInstance& CustomisationInstance()                                                    { return (const CInstance&)(CdlEngine::CustomisationInstance(KCdlInterfaceUid)); }\n\
+\tinline static CInstance* NewL(const TCdlRef& aRef, const CCdlInstance* aSubLayer = NULL)                  { return (CInstance*) CCdlInstance::NewL(aRef, &KCdlInterface, aSubLayer); }\n\
+\tinline static CInstance* NewLC(const TCdlRef& aRef, const CCdlInstance* aSubLayer = NULL)                 { return (CInstance*) CCdlInstance::NewLC(aRef, &KCdlInterface, aSubLayer); }\n\
+\tinline static CInstance* NewL(const TDesC& aLibName, TInt aImplId, const CCdlInstance* aSubLayer = NULL)  { TCdlRef ref = { aImplId, { KCdlInterfaceUidValue }, &aLibName }; return NewL(ref, aSubLayer); }\n\
+\tinline static CInstance* NewLC(const TDesC& aLibName, TInt aImplId, const CCdlInstance* aSubLayer = NULL) { TCdlRef ref = { aImplId, { KCdlInterfaceUidValue }, &aLibName }; return NewLC(ref, aSubLayer); }\n\
+\n\
+\tinline const CInstance* SubLayer()                                                                        { return static_cast<const CInstance*>(CCdlInstance::SubLayer()); }\n\
+\n\
+// CDL API functions, as defined in $FILE\n\
+\n";
+
+const string KBodyEnd = "\
+private:\n\
+\tCInstance();\n\
+\t};\n\
+\n";
+
+const string KBodyEndNameSpace = "\
+} // end of namespace $CDLNS\n\
+#endif // $CDLGUARD\n";
+
+const int KMsvcClassMaxSize = 1000;
+const string KTypeInfoOn = "on";
+const string KTypeInfoOff = "off";
+
+void CCdlTkWriteClientHeader::ProcessApi(ofstream& aStream, const string& aFileName) const
+	{
+	CdlTkUtil::CReplaceSet replace;
+	replace.Add("$FILE", CdlTkUtil::ToLower(CdlTkUtil::StripPath(iCdl.FileName())));
+	replace.Add("$CDLGUARD", HeaderGuardName(iCdl.FileName()));
+	replace.Add("$CDLNS", iCdl.NamespaceName());
+	replace.Add("$CMDLINE", CdlTkUtil::CommandLine());
+	replace.Add("$ADDITIONAL", iCdl.AdditionalComment());
+
+	bool tooMuchTypeInfo = iCdl.ApiList().size() > KMsvcClassMaxSize;
+
+	aStream << CdlTkUtil::MultiReplace(replace, KBodyStart);
+
+	CCdlTkApiList::const_iterator pApi;
+	for (pApi = iCdl.ApiList().begin(); pApi != iCdl.ApiList().end(); ++pApi)
+		WriteApi(**pApi, aStream, false, "");
+
+	if(tooMuchTypeInfo)
+		aStream << CdlTkUtil::Replace("$ONOFF", KTypeInfoOn, KPragmaMinTypeInfo);
+
+	aStream << CdlTkUtil::MultiReplace(replace, KBodyMid);
+
+	for (pApi = iCdl.ApiList().begin(); pApi != iCdl.ApiList().end(); ++pApi)
+		WriteApi(**pApi, aStream, true, "\t");
+
+	aStream << CdlTkUtil::MultiReplace(replace, KBodyEnd);
+
+	if(tooMuchTypeInfo)
+		aStream << CdlTkUtil::Replace("$ONOFF", KTypeInfoOff, KPragmaMinTypeInfo);
+
+	aStream << CdlTkUtil::MultiReplace(replace, KBodyEndNameSpace);
+	}
+
+
+}	// end of namespace CdlCompilerToolkit
+