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