aknlayoutcompiler/src/LayoutConfig.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aknlayoutcompiler/src/LayoutConfig.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,251 @@
+/*
+* 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:
+*
+*/
+// disable "identifier was truncated to '255' characters in the browser information" warning
+#pragma warning (disable:4786)
+
+#include "LayoutConfig.h"
+#include "LayoutCompilerErr.h"
+#include <fstream>
+#include <iostream>
+
+using namespace std;
+
+const string KBuildConfigFile("\\epoc32\\include\\oem\\bldvariant.hrh");
+const string KLayoutMacroStart("__LAYOUT");
+
+typedef LayoutProcessArgsErr<LayoutConfig> LayoutConfigArgsErr;
+
+
+LayoutConfig::Size::Size()
+: iWidth(0), iHeight(0)
+	{
+	}
+
+LayoutConfig::Size::TOrientation LayoutConfig::Size::Orientation() const
+	{
+	if (iWidth < iHeight)
+		return EPortrait;
+	else if (iWidth == iHeight)
+		return ESquare;
+	else
+		return ELandscape;
+	}
+
+bool LayoutConfig::Size::operator>(const Size& aRhs) const
+	{
+	if (iWidth == aRhs.iWidth)
+		return iHeight > aRhs.iHeight;
+	else
+		return iWidth > aRhs.iWidth;
+	}
+
+
+int LayoutConfig::Process(const vector<string>& args)
+	{
+	if (args.size() < 3)
+		throw LayoutConfigArgsErr();
+
+	string mode = CdlTkUtil::ToLower(args[2]);
+
+	auto_ptr<LayoutConfig> config(0);
+
+	if (mode == "wsini")
+		config = auto_ptr<LayoutConfig>(new WsiniConfig);
+	else
+		throw LayoutConfigArgsErr();
+
+	config->ParseArgs(args);
+	return config->Process();
+	}
+
+void LayoutConfig::ParseArgs(const vector<string>& args)
+	{
+	int argsSize = args.size();
+	int nextArg = 3;
+	while (nextArg < argsSize && args[nextArg][0] == '-')
+		{
+		ParseOpt(CdlTkUtil::ToLower(args[nextArg]));
+		nextArg++;
+		}
+
+	if (nextArg == argsSize)
+		throw LayoutConfigArgsErr();
+
+	iTargetFileName = args[nextArg];
+	nextArg++;
+
+	if (nextArg < argsSize)
+		iBaseFileName = args[nextArg];
+	}
+
+void LayoutConfig::ParseOpt(const std::string& opt)
+	{
+	if (opt.size() < 2)
+		throw LayoutConfigArgsErr();
+
+	switch (opt[1])
+		{
+		case 't':
+			if (opt == "-tplatform")
+				iTarget = EPlatform;
+			else if (opt == "-tproduct")
+				iTarget = EProduct;
+			else
+				throw LayoutConfigArgsErr();
+			break;
+		case 'l':
+			if (opt == "-llegacy")
+				iLegacyMode = ELegacyMode;
+			else if (opt == "-lnolegacy")
+				iLegacyMode = ENoLegacyMode;
+			else
+				throw LayoutConfigArgsErr();
+			break;
+		default:
+			throw LayoutConfigArgsErr();
+			break;
+		}
+	}
+
+void LayoutConfig::ShowHelp(ostream& stream)
+	{
+	stream << "Config <configMode> [-t<target>] [-l<legacyMode>] <targetFile> [<baseFile>]" << endl;
+	stream << "  <configMode> is one of wsini, epocini, aknlayout2" << endl;
+	stream << "  <target> is one of platform, product (default is platform)" << endl;
+	stream << "  <legacyMode> is one of legacy, nolegacy (default is legacy)" << endl;
+	stream << "  <targetFile> is the file to be written to" << endl;
+	stream << "  <baseFile> is a file containing the template for the target file" << endl;
+	}
+
+LayoutConfig::LayoutConfig()
+: iTarget(EPlatform), iLegacyMode(ELegacyMode)
+	{
+	LoadAllSizes();
+	LoadConfiguredSizes();
+	}
+
+LayoutConfig::~LayoutConfig()
+	{
+	}
+
+const LayoutConfig::Sizes& LayoutConfig::AllSizes() const
+	{
+	return iAll;
+	}
+
+const LayoutConfig::Sizes& LayoutConfig::ConfiguredSizes() const
+	{
+	return iConf;
+	}
+
+const LayoutConfig::Sizes& LayoutConfig::SizesForTarget() const
+	{
+	if (iTarget == EPlatform)
+		return iAll;
+	else
+		return iConf;
+	}
+
+void LayoutConfig::LoadAllSizes()
+	{
+	ifstream bldCfg;
+	OpenBldCfg(bldCfg);
+
+	string line;
+	while (!bldCfg.eof())
+		{
+		getline(bldCfg, line);
+		Size s;
+		if (ParseSize(line, s))
+			{
+			iAll.insert(s);
+			if (line.find("#define") == 0)
+				iConf.insert(s);
+			}
+		}
+	}
+
+void LayoutConfig::LoadConfiguredSizes()
+	{
+	// done crudely as part of the LoadAllSizes() function currently
+	}
+
+void LayoutConfig::OpenBldCfg(ifstream& aBldCfg)
+	{
+	aBldCfg.open(KBuildConfigFile.c_str());
+	if (!aBldCfg.is_open())
+		throw NotFoundErr(KBuildConfigFile);
+	}
+
+bool LayoutConfig::ParseSize(const std::string& aLine, Size& aSize) const
+	{
+	int pos = aLine.find(KLayoutMacroStart);
+	if (pos == string::npos)
+		return false;
+
+	pos += KLayoutMacroStart.size();
+	pos = aLine.find_first_not_of('_', pos);
+	if (pos == string::npos)
+		return false;
+
+	aSize.iWidth = CdlTkUtil::ParseInt(aLine.substr(pos));
+
+	pos = aLine.find('_', pos);
+	if (pos == string::npos)
+		return false;
+	pos = aLine.find_first_not_of('_', pos);
+	if (pos == string::npos)
+		return false;
+
+	aSize.iHeight = CdlTkUtil::ParseInt(aLine.substr(pos));
+	
+	return (aSize.iWidth != 0 && aSize.iHeight != 0);
+	}
+
+/*
+int LayoutConfig::TestLayoutConfig()
+	{
+	LayoutConfig l;
+
+	cout << "All:" << endl;
+	for (Sizes::iterator pAll = l.iAll.begin(); pAll != l.iAll.end(); ++pAll)
+		{
+		Size& s = *pAll;
+		cout << s.iWidth << " x " << s.iHeight << endl;
+		}
+	cout << "Conf:" << endl;
+	for (Sizes::iterator pConf = l.iConf.begin(); pConf != l.iConf.end(); ++pConf)
+		{
+		Size& s = *pConf;
+		cout << s.iWidth << " x " << s.iHeight << endl;
+		}
+	return 0;
+	}
+*/
+
+
+int WsiniConfig::Process()
+	{
+	const Sizes& s = SizesForTarget();
+// need a lot more info to make a sensible descision here
+// eg what is the prefered size and orientation? How should legacy mode be
+// handled, etc.
+// also, what should we do with multiple screens?????
+// neeeds a lot more thought.
+	return 0;
+	}
+