diff -r 000000000000 -r f58d6ec98e88 cdlcompilertoolkit/src/CdlTkWriteCdlFile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cdlcompilertoolkit/src/CdlTkWriteCdlFile.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,169 @@ +/* +* 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 +using namespace std; + +namespace CdlCompilerToolkit { + + +// +// CleanupResetPtr +// + +class CleanupResetPtr + { +public: + CleanupResetPtr(const CCdlTkInterface*& aPtr) : iPtr(aPtr), iValue(aPtr) {} + ~CleanupResetPtr() { iPtr = iValue; } +private: + const CCdlTkInterface*& iPtr; + const CCdlTkInterface* iValue; + }; + + +// +// CCdlTkWriteCdlFile +// + +CCdlTkWriteCdlFile::CCdlTkWriteCdlFile(const CCdlTkInterface& aCdl) +: iCdl(&aCdl) + { + } + +CCdlTkWriteCdlFile::~CCdlTkWriteCdlFile() + { + } + +void CCdlTkWriteCdlFile::Process() + { + // this function modifies iCdl, but CleanupResetPtr will restore it at the end (it's also exception safe) + CleanupResetPtr resetPtr(iCdl); + + CCdlTkFileCleanup tempFile; + CdlTkUtil::OpenTempOutput(iOut, tempFile); + string targetName = iCdl->FileName(); + + WriteHeaderComment(); + int count = 0; + while (iCdl) + { + if (count++) + WriteSeparator("Header"); + WriteHeader(); + if (!iCdl->Cpp().empty()) + { + WriteSeparator("C++"); + WriteCpp(); + } + if (!iCdl->DataTypeTranslations().empty()) + { + WriteSeparator("Translation"); + WriteTranslation(); + } + if (!iCdl->ApiList().empty()) + { + WriteSeparator("API"); + WriteApi(); + } + iCdl = iCdl->Extension(); + } + + iOut.close(); + CdlTkUtil::ExportFile(tempFile, targetName); + + // resetPtr dtor will restore iCdl to original value + } + +void CCdlTkWriteCdlFile::WriteHeaderComment() + { + iOut << "// " << iCdl->FileName() << endl; + iOut << "// This file was generated by:" << endl; + iOut << "// " << CdlTkUtil::CommandLine() << endl; + iOut << iCdl->AdditionalComment() << endl; + } + +void CCdlTkWriteCdlFile::WriteHeader() + { + const CCdlTkInterfaceHeader& header = iCdl->Header(); + if (!header.Name().empty()) + iOut << "Name: " << header.Name() << endl; + iOut << "Version: " << header.Version().Major() << "." << header.Version().Minor() << endl; + if (header.Uid()) + iOut << "UID: 0x" << setbase(16) << setw(8) << setfill('0') << header.Uid() << endl; + const CCdlTkInterfaceHeader::CFlags& flags = header.Flags(); + for (int ii=0; iiCpp(); + if(cpp.size()) + { + CCdlTkCpp::const_iterator pStart = cpp.begin(); + CCdlTkCpp::const_iterator pFinish = cpp.end() ; + + // ignore the first line if it's empty + if(pStart->empty()) + ++pStart; + // if the last line isn't empty, move the iterator back to the end + if(!(--pFinish)->empty()) + ++pFinish; + + for (CCdlTkCpp::const_iterator pLine = pStart; pLine != pFinish; ++pLine) + { + iOut << *pLine << endl; + } + } + } + +void CCdlTkWriteCdlFile::WriteTranslation() + { + const CCdlTkDataTypeTranslations& translations = iCdl->DataTypeTranslations(); + for (CCdlTkDataTypeTranslations::const_iterator pTrans = translations.begin(); pTrans != translations.end(); ++pTrans) + { + if (pTrans->Source() == CCdlTkDataTypeTranslation::EFromCdl) + { + iOut << pTrans->Type() << " # " << pTrans->Definition() << " # " << pTrans->PointerReference() << endl; + } + } + } + +void CCdlTkWriteCdlFile::WriteApi() + { + const CCdlTkApiList& apiList = iCdl->ApiList(); + for (CCdlTkApiList::const_iterator pApi = apiList.begin(); pApi != apiList.end(); ++pApi) + { + CCdlTkApi& api = **pApi; + iOut << api.Comment(); + iOut << api.ReturnType() << " " << api.Name() << api.ParamsTypeAndNameList() << ";" << endl; + iOut << endl; + } + } + +} // end of namespace CdlCompilerToolkit