aknlayoutcompiler/src/UpdateLayoutApi.cpp
changeset 0 f58d6ec98e88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aknlayoutcompiler/src/UpdateLayoutApi.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,197 @@
+/*
+* Copyright (c) 2002-2004 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: 
+*    
+*
+*/
+
+
+
+// disable "identifier was truncated to '255' characters in the browser information" warning
+#pragma warning (disable:4786)
+#include "UpdateLayoutApi.h"
+#include <cdlcompilertoolkit/cdltkprocess.h>
+#include "Lay2Cdl.h"
+#include "LayoutParse.h"
+#include "LayoutCompilerErr.h"
+#include <sstream>
+#include <iostream>
+
+using namespace std;
+
+typedef LayoutProcessArgsErr<UpdateLayoutApi> UpdateLayoutApiArgsErr;
+
+
+int UpdateLayoutApi::Process(const vector<string>& args)
+	{
+	if (args.size() != 6)
+		throw UpdateLayoutApiArgsErr();
+	
+	const string& cdlName = args[2];
+	const string& layoutName = args[3];
+	const string& legacyName = args[4];
+	const string& newName = args[5];
+
+	UpdateLayoutApi(cdlName, layoutName, legacyName, newName);
+
+	return 0;
+	}
+
+void UpdateLayoutApi::ShowHelp(ostream& stream)
+	{
+	stream << "UpdateLayoutApi <LayoutCdlApi> <CurrentLayout> <LegacyLayout> <NewLayout>" << endl;
+	}
+
+UpdateLayoutApi::UpdateLayoutApi(const std::string& aCdlName, const std::string& aLayoutName, const std::string& aLegacyName, const std::string& aNewName)
+: iCdlName(aCdlName), iLegacyName(aLegacyName), iInterface(0), iLayout(0), iLegacy(0), iNew(0), iInterfaceChanged(false)
+	{
+	LoadFiles(aLayoutName, aNewName);
+	MergeAndCheck();
+	ProcessNewApi();
+	WriteFiles();
+	Report();
+	}
+
+UpdateLayoutApi::~UpdateLayoutApi()
+	{
+	delete iInterface;
+	delete iLayout;
+	delete iLegacy;
+	delete iNew;
+	}
+
+void UpdateLayoutApi::LoadFiles(const std::string& aLayoutName, const std::string& aNewName)
+	{
+	CCdlTkCdlFileParser cdlParser(iCdlName);
+	auto_ptr<CCdlTkInterface> iface(cdlParser.LoadAndParse(false));
+	iInterface = iface.get();
+	iface.release();
+
+	auto_ptr<TLayParseLayout> layout(TLayParseLayout::Parse(aLayoutName));
+	iLayout = layout.get();
+	layout.release();
+
+	auto_ptr<TLayParseLayout> legacy(TLayParseLayout::Parse(iLegacyName));
+	iLegacy = legacy.get();
+	legacy.release();
+
+	auto_ptr<TLayParseLayout> newLay(TLayParseLayout::Parse(aNewName));
+	iNew = newLay.get();
+	newLay.release();
+	}
+
+void UpdateLayoutApi::MergeAndCheck()
+	{
+	TLayout combined(*iLayout);
+	combined.Merge(TLayout::KMergeModeMerge, *iLegacy);
+	auto_ptr<CCdlTkInterface> iface(LayoutToCdl::LayoutToInterface(combined));
+	InterfaceCheck check;
+	CCdlTkApiChecker process(*iInterface, *iface, check);
+	process.Process();
+	}
+
+void UpdateLayoutApi::ProcessNewApi()
+	{
+	auto_ptr<CCdlTkInterface> newIface(LayoutToCdl::LayoutToInterface(*iNew));
+	CCdlTkApiChecker process(*iInterface, *newIface, *this);
+	process.Process();
+	if (iInterfaceChanged)
+		{
+		CCdlTkInterface* curExt = iInterface->UltimateExtension();
+		if (!iExt)
+			iExt = new CCdlTkInterface();
+		curExt->SetExtension(iExt);
+		iExt->SetBase(curExt);
+		iExt->Header().SetVersion(CCdlTkInterfaceHeader::CVersion(curExt->Header().Version().Major(), curExt->Header().Version().Minor()+1));
+		}
+	}
+
+void UpdateLayoutApi::WriteFiles()
+	{
+	if (iInterfaceChanged)
+		{
+		}
+	if (iLegacyUpdated)
+		{
+		}
+	}
+
+void UpdateLayoutApi::Report()
+	{
+	if (!iReport.empty())
+		cout << iReport;
+	}
+
+void UpdateLayoutApi::StartCheck()
+	{
+	}
+
+void UpdateLayoutApi::CheckComplete()
+	{
+	}
+
+void UpdateLayoutApi::ApiInBoth(const CCdlTkApi& aApi)
+	{
+	}
+
+void UpdateLayoutApi::ApiNotInLeft(const CCdlTkApi& aApi)
+	{
+	// new API present - add it to the extension
+	iInterfaceChanged = true;
+	iExt->ApiList().push_back(aApi.Clone(*iExt));
+	}
+
+void UpdateLayoutApi::ApiNotInRight(const CCdlTkApi& aApi)
+	{
+	// old API not present - rename it in the API, add data to legacy.
+	iInterfaceChanged = true;
+	
+	string oldName = aApi.Name();
+	CCdlTkApi* api = iInterface->ApiList().Find(oldName);
+
+	CCdlTkInterfaceHeader& header = iInterface->UltimateExtension()->Header();
+	stringstream newName;
+	newName << oldName << "_V" << header.Version().Major() << "_" << header.Version().Minor();
+
+	api->SetName(newName.str());
+	AddDataToLegacy(oldName, newName.str());
+	}
+
+void UpdateLayoutApi::AddDataToLegacy(const std::string& /*aOldName*/, const std::string& /*aNewName*/)
+	{
+	iLegacyUpdated = true;
+	}
+
+
+void UpdateLayoutApi::InterfaceCheck::StartCheck()
+	{
+	}
+
+void UpdateLayoutApi::InterfaceCheck::CheckComplete()
+	{
+	}
+
+void UpdateLayoutApi::InterfaceCheck::ApiInBoth(const CCdlTkApi&)
+	{
+	}
+	
+void UpdateLayoutApi::InterfaceCheck::ApiNotInLeft(const CCdlTkApi&)
+	{
+	throw false;
+	}
+	
+	void UpdateLayoutApi::InterfaceCheck::ApiNotInRight(const CCdlTkApi&)
+	{
+	throw false;
+	}