diff -r 000000000000 -r f58d6ec98e88 aknlayoutcompiler/src/LayoutConfig.cpp --- /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 +#include + +using namespace std; + +const string KBuildConfigFile("\\epoc32\\include\\oem\\bldvariant.hrh"); +const string KLayoutMacroStart("__LAYOUT"); + +typedef LayoutProcessArgsErr 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& args) + { + if (args.size() < 3) + throw LayoutConfigArgsErr(); + + string mode = CdlTkUtil::ToLower(args[2]); + + auto_ptr config(0); + + if (mode == "wsini") + config = auto_ptr(new WsiniConfig); + else + throw LayoutConfigArgsErr(); + + config->ParseArgs(args); + return config->Process(); + } + +void LayoutConfig::ParseArgs(const vector& 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 [-t] [-l] []" << endl; + stream << " is one of wsini, epocini, aknlayout2" << endl; + stream << " is one of platform, product (default is platform)" << endl; + stream << " is one of legacy, nolegacy (default is legacy)" << endl; + stream << " is the file to be written to" << endl; + stream << " 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; + } +