cdlcompilertoolkit/src/CdlTkInstance.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdlcompilertoolkit/src/CdlTkInstance.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,273 @@
+/*
+* 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/CdlTkInstance.h"
+#include "CdlTkPriv.h"
+using namespace std;
+
+namespace CdlCompilerToolkit {
+
+
+//
+// CCdlTkImplementation
+//
+
+CCdlTkImplementation::CCdlTkImplementation(const CCdlTkInstance& aInstance, const CCdlTkApi& aApi)
+: iInstance(aInstance), iApi(aApi)
+	{
+	SetNull();
+	}
+
+CCdlTkImplementation::~CCdlTkImplementation()
+	{
+	}
+
+string CCdlTkImplementation::Definition() const
+	{
+	return iDefn;
+	}
+
+void CCdlTkImplementation::SetDefinition(const string& aDefn)
+	{
+	iDefn = aDefn;
+	}
+
+const string KTemplateFuncDefn = "\
+$TYPE $NAME$PARAMS\n\
+\t{\n\
+\t//TODO: Implement this function.\n\
+\t}";
+
+void CCdlTkImplementation::SetTemplateDefinition()
+	{
+	if (iApi.IsFunc())
+		{
+		CdlTkUtil::CReplaceSet defnSet;
+		defnSet.Add("$TYPE", iApi.ReturnType());
+		defnSet.Add("$NAME", iApi.Name());
+		defnSet.Add("$PARAMS", iApi.ParamsTypeAndNameList());
+		iDefn = CdlTkUtil::MultiReplace(defnSet, KTemplateFuncDefn);
+		}
+	else
+		{
+		string typeVar;
+		iDefn = GetTranslation(iApi.ReturnType(), typeVar)->Definition();
+		CdlTkUtil::CReplaceSet defnSet;
+		defnSet.Add(KType, typeVar);
+		defnSet.Add(KName, iApi.Name());
+		iDefn = CdlTkUtil::MultiReplace(defnSet, iDefn);
+		CdlTkUtil::AppendString(iDefn, ";\t//TODO: Initialise this data.");
+		}
+	}
+
+const CCdlTkDataTypeTranslation* CCdlTkImplementation::GetTranslation(const string& aType, string& aTypeVar)
+	{
+	return iApi.Interface().DataTypeTranslations().Find(aType, aTypeVar);
+	}
+
+string CCdlTkImplementation::PointerReference() const
+	{
+	return iPtr;
+	}
+
+void CCdlTkImplementation::SetPointerReference(const string& aPtr)
+	{
+	iPtr = aPtr;
+	}
+
+void CCdlTkImplementation::SetTemplatePointerReference()
+	{
+	if (iApi.IsFunc())
+		{
+		iPtr = string("&") + iApi.Name();
+		}
+	else
+		{
+		string typeVar;
+		iPtr = GetTranslation(iApi.ReturnType(), typeVar)->PointerReference();
+		CdlTkUtil::CReplaceSet ptrSet;
+		ptrSet.Add(KType, typeVar);
+		ptrSet.Add(KName, iApi.Name());
+		iPtr = CdlTkUtil::MultiReplace(ptrSet, iPtr);
+		}
+	}
+
+const CCdlTkInstance& CCdlTkImplementation::Instance() const
+	{
+	return iInstance;
+	}
+
+const CCdlTkApi& CCdlTkImplementation::Api() const
+	{
+	return iApi;
+	}
+
+const string& CCdlTkImplementation::Name() const
+	{
+	return iApi.Name();
+	}
+
+void CCdlTkImplementation::SetTemplate()
+	{
+	SetTemplateDefinition();
+	SetTemplatePointerReference();
+	}
+
+void CCdlTkImplementation::SetNull()
+	{
+	SetDefinition("");
+	SetPointerReference("NULL");
+	}
+
+
+//
+// CCdlTkImplementations
+//
+
+CCdlTkImplementations::CCdlTkImplementations(const CCdlTkInstance& aInstance, const CCdlTkApiList& aApiList)
+	{
+	for (CCdlTkApiList::const_iterator pApi = aApiList.begin(); pApi != aApiList.end(); ++pApi)
+		{
+		iImpl.push_back(new CCdlTkImplementation(aInstance, **pApi));
+		}
+	}
+
+CCdlTkImplementations::~CCdlTkImplementations()
+	{
+	for (CImpl::iterator p = iImpl.begin(); p != iImpl.end(); ++p)
+		delete *p;
+	}
+
+CCdlTkImplementation* CCdlTkImplementations::Find(const string& aName) const
+	{
+	for (CImpl::const_iterator p = iImpl.begin(); p != iImpl.end(); ++p)
+		{
+		if ((*p)->Name() == aName)
+			return *p;
+		}
+	return 0;
+	}
+
+void CCdlTkImplementations::ClearAll()
+	{
+	for (CImpl::iterator pImp = iImpl.begin(); pImp != iImpl.end(); ++pImp)
+		{
+		(*pImp)->SetNull();
+		}
+	}
+
+void CCdlTkImplementations::TemplateAll()
+	{
+	for (CImpl::iterator pImp = iImpl.begin(); pImp != iImpl.end(); ++pImp)
+		{
+		(*pImp)->SetTemplate();
+		}
+	}
+
+
+//
+// CCdlTkInstance
+//
+
+#pragma warning (disable:4355)	// using "this" in initialisation list
+// note: "this" is not accessed during construction of iImpl
+CCdlTkInstance::CCdlTkInstance(const CCdlTkInterface& aInterface)
+: iInterface(aInterface), iImpl(*this, aInterface.ApiList()), iId(KCdlTkGetInstanceIdFromHostDll)
+	{
+	if (iInterface.Base() || iInterface.Extension())
+		throw CdlTkAssert("Can't create instance from extended interface - merge extensions first");
+	}
+#pragma warning (default:4355)	// using "this" in initialisation list
+
+CCdlTkInstance::~CCdlTkInstance()
+	{
+	}
+
+CCdlTkImplementations& CCdlTkInstance::Impl()
+	{
+	return iImpl;
+	}
+
+const CCdlTkImplementations& CCdlTkInstance::Impl() const
+	{
+	return iImpl;
+	}
+
+void CCdlTkInstance::SetName(const string& aName)
+	{
+	iName = aName;
+	}
+
+const string& CCdlTkInstance::Name() const
+	{
+	return iName;
+	}
+
+std::string CCdlTkInstance::DllInstanceName() const
+	{
+	return InstanceNameToDllInstanceName(iName);
+	}
+
+const string KDllInstanceName = "KDllInst_$INST";
+
+std::string CCdlTkInstance::InstanceNameToDllInstanceName(const std::string& aName)
+	{
+	return CdlTkUtil::Replace("$INST", CdlTkUtil::ToCpp(aName), KDllInstanceName);
+	}
+
+
+const CCdlTkInterface& CCdlTkInstance::Interface() const
+	{
+	return iInterface;
+	}
+
+void CCdlTkInstance::SetId()
+	{
+	iId = KCdlTkGetInstanceIdFromHostDll;
+	}
+
+void CCdlTkInstance::SetId(int aId)
+	{
+	iId = aId;
+	}
+
+int CCdlTkInstance::Id() const
+	{
+	return iId;
+	}
+
+const string& CCdlTkInstance::ExtraCpp() const
+	{
+	return iExtraCpp;
+	}
+
+void CCdlTkInstance::SetExtraCpp(const string& aExtra)
+	{
+	iExtraCpp = aExtra;
+	}
+
+void CCdlTkInstance::ClearAllImplementations()
+	{
+	iImpl.ClearAll();
+	}
+
+void CCdlTkInstance::TemplateAllImplementations()
+	{
+	iImpl.TemplateAll();
+	}
+
+}	// end of namespace CdlCompilerToolkit
+