aknlayoutcompiler/src/LayCdlCheck.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aknlayoutcompiler/src/LayCdlCheck.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,206 @@
+/*
+* 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 "LayCdlCheck.h"
+#include <iostream>
+#include "LayoutCompilerErr.h"
+#include "LayoutParse.h"
+#include "Lay2Cdl.h"
+#include <cdlcompilertoolkit/cdltkprocess.h>
+using namespace std;
+using namespace CdlCompilerToolkit;
+
+
+typedef LayoutProcessArgsErr<LayCdlCheck> LayCdlCheckArgsErr;
+
+const string KDefaultLayCdlCheckOptions = "lcm";
+
+int LayCdlCheck::Process(const vector<string>& args)
+	{
+	if (args.size() < 4)
+		throw LayCdlCheckArgsErr();
+
+	int nextArg = 2;
+	string opt = args[nextArg];
+	if (opt.size() >= 2 && opt.substr(0,2) == "-o")
+		{
+		nextArg++;
+		opt = opt.substr(2);
+		}
+	else
+		{
+		opt = KDefaultLayCdlCheckOptions;
+		}
+
+	string layoutName = args[nextArg++];
+	auto_ptr<TLayParseLayout> layout(TLayParseLayout::Parse(layoutName));
+	auto_ptr<CCdlTkInterface> iface(new CCdlTkInterface);
+	CCdlTkApiList& apiList = iface->ApiList();
+	auto_ptr<CCdlTkInterface> xIface(new CCdlTkInterface);
+	CCdlTkApiList& xApiList = xIface->ApiList();
+
+	for (int arg = nextArg; arg < args.size(); arg++)
+		{
+		string fileName = args[arg];
+		if (fileName.size() < 4)
+			throw LayCdlCheckArgsErr();
+		string ext = CdlTkUtil::ToLower(fileName.substr(fileName.size()-4));
+
+		if (ext == ".lay")
+			{
+			auto_ptr<TLayParseLayout> nextLayout(TLayParseLayout::Parse(fileName));
+			layout->Merge(TLayout::KMergeModeVariant, *nextLayout);
+			}
+		else if (ext == ".cdl")
+			{
+			CCdlTkApiList* pApiList = &apiList;
+			if (fileName.substr(0,2) == "-x")
+				{
+				pApiList = &xApiList;
+				fileName = fileName.substr(2);
+				}
+			CCdlTkCdlFileParser parser(fileName);
+			auto_ptr<CCdlTkInterface> nextIface(parser.LoadAndParse(true));
+			CCdlTkApiList& nextApi = nextIface->ApiList();
+			for (CCdlTkApiList::iterator pApi = nextApi.begin(); pApi != nextApi.end(); ++pApi)
+				pApiList->push_back((*pApi)->Clone(*iface));
+			}
+		else
+			throw LayCdlCheckArgsErr();
+		}
+
+	LayCdlCheck process(*layout, *iface, *xIface, opt);
+	process.Process();
+
+	return 0;
+	}
+
+void LayCdlCheck::ShowHelp(ostream& stream)
+	{
+	stream << "LayCdlCheck [-o[glcm]] <layoutName>* <cdlName>* [-x<cdlName>*]" << endl;
+	stream << "  Compare API for lay files against CDL interfaces" << endl;
+	stream << "  -o[glcm] (default = -olcm) -  show output for:" << endl;
+	stream << "    g = good matches" << endl;
+	stream << "    l = lay file only" << endl;
+	stream << "    c = CDL interface only" << endl;
+	stream << "    m = mismatches" << endl;
+	stream << "  Where multiple <layoutName> are specified, the layouts are merged with variant mode." << endl;
+	stream << "  Where multiple <cdlName> are specified, the CDL interfaces are added together." << endl;
+	stream << "  -x<cdlName> - exclude APIs in <cdlName> from the report." << endl;
+	}
+
+
+LayCdlCheck::LayCdlCheck(TLayout& aLayout, CCdlTkInterface& aInterface, CCdlTkInterface& aExcluded, const string& aOpt)
+: iLayout(aLayout), iInterface(aInterface), iExcluded(aExcluded), iLayoutInterface(0), iOpt(aOpt)
+	{
+	}
+
+LayCdlCheck::~LayCdlCheck()
+	{
+	delete iLayoutInterface;
+	}
+
+void LayCdlCheck::Process()
+	{
+	delete iLayoutInterface;
+	iLayoutInterface = 0;
+
+	auto_ptr<CCdlTkInterface> iface(LayoutToCdl::LayoutToInterface(iLayout));
+	iLayoutInterface = iface.get();
+	iface.release();
+
+	vector<string> good;
+	vector<string> onlyLay;
+	vector<string> onlyCdl;
+	vector<string> paramMismatch;
+
+	Compare(good, onlyLay, onlyCdl, paramMismatch);
+
+	if (HasOpt('g'))
+		Report("Good API", good);
+	if (HasOpt('l'))
+		Report("API only in lay file", onlyLay);
+	if (HasOpt('c'))
+		Report("API only in CDL file", onlyCdl);
+	if (HasOpt('m'))
+		Report("API with mismatched interface", paramMismatch);
+	}
+
+void LayCdlCheck::Compare(vector<string>& aGood, vector<string>& aOnlyLay, vector<string>& aOnlyCdl, vector<string>& aParamMismatch)
+	{
+	CCdlTkApiList& layApi = iLayoutInterface->ApiList();
+	CCdlTkApiList& cdlApi = iInterface.ApiList();
+	CCdlTkApiList& xApi = iExcluded.ApiList();
+	for (CCdlTkApiList::iterator pLay = layApi.begin(); pLay != layApi.end(); ++pLay)
+		{
+		const string& name = (*pLay)->Name();
+		CCdlTkApi* xCdl = xApi.Find(name);
+		if (xCdl && (*xCdl) == (**pLay))
+			continue;
+
+		string fullName = (*pLay)->ReturnType() + " " + name + (*pLay)->ParamsTypeAndNameList() + ";";
+		CCdlTkApi* cdl = cdlApi.Find(name);
+		if (cdl)
+			{
+			if (*cdl == **pLay)
+				{
+				aGood.push_back(fullName);
+				}
+			else
+				{
+				aParamMismatch.push_back(fullName + " vs " + cdl->ParamsTypeAndNameList());
+				}
+			}
+		else
+			{
+			aOnlyLay.push_back(fullName);
+			}
+		}
+
+	for (CCdlTkApiList::iterator pCdl = cdlApi.begin(); pCdl != cdlApi.end(); ++pCdl)
+		{
+		const string& name = (*pCdl)->Name();
+		string fullName = (*pCdl)->ReturnType() + " " + name + (*pCdl)->ParamsTypeAndNameList();
+		CCdlTkApi* lay = layApi.Find(name);
+		if (!lay)
+			{
+			aOnlyCdl.push_back(fullName);
+			}
+		}
+	}
+
+void LayCdlCheck::Report(const string& aTitle, vector<string>& aApi)
+	{
+	cout << aTitle << endl;
+	for (vector<string>::iterator pApi = aApi.begin(); pApi != aApi.end(); ++pApi)
+		{
+		cout << *pApi << endl;
+		}
+	cout << endl;
+	}
+
+bool LayCdlCheck::HasOpt(char c)
+	{
+	return iOpt.find(c) != string::npos;
+	}
+
+