graphicstools/bitmapfonttools/src/PDRREADR.CPP
author William Roberts <williamr@symbian.org>
Thu, 03 Jun 2010 17:39:46 +0100
branchNewGraphicsArchitecture
changeset 87 0709f76d91e5
parent 0 5d03bc08d59c
permissions -rw-r--r--
Add MMP files to build libOpenVG_sw.lib which uses LINKAS to redirect to libOpenVG.dll (and the same for libEGL_sw.lib and libOpenVGU_sw.lib). Only the libEGL_sw.lib redirection isn't activated - this can't happen until there is a merged libEGL.dll which supports the OpenWF synchronisation and also implements the graphical support functions. The overall aim is to eliminate the *_sw.dll implementations, at least as a compile-time way of choosing a software-only implementation.The correct way to choose is to put the right set of libraries into a ROM with suitable renaming, and in the emulator to use the "switching DLL" technique to pick the right set. As the Symbian Foundation doesn't have any alternative implementations, we don't need the switching DLLs and we can build directly to the correct name.

/*
* Copyright (c) 1997-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: 
* Header PDRREADR.CPP
*
*/


#include "PDRREADR.H"

const int NumResources=34;

String IdentResource[NumResources] =
	{
	"Reset",
	"SetPageSize",
	"PreAmble",
	"PostAmble",
	"SetTextColor",	//  !!
	"BoldOn",
	"BoldOff",
	"ItalicOn",
	"ItalicOff",
	"UnderlineOn",
	"UnderlineOff",
	"StrikethroughOn",
	"StrikethroughOff",
	"NewPage",
	"Portrait",
	"Landscape",
	"SetXPos",
	"SetYPos",
	"IncrementXPos",
	"IncrementYPos",
	"CarriageReturn",
	"SetGraphicsColor",	//  !!
	"BitmapStart",
	"BitmapEnd",
	"ScanLine",
	"EndScanLine",	//  !!
	"Resource1",
	"Resource2",
	"Resource3",
	"Resource4",
	"Resource5",
	"Resource6",
	"Resource7",
	"Resource8"
	};

const int NumDisplayModeValues = 11;

String IdentDisplayModeValue[NumDisplayModeValues] =
	{
	"None",
	"Gray2",
	"Gray4",
	"Gray16",
	"Gray256",
	"Color16",
	"Color256",
	"Color64K",
	"Color16M",
	"Rgb",
	"Color4K"
	};

EXPORT_C PdrReader::PdrReader()
 :	Reader(),
	iPdrModelStore(),
	iPdrStoreFile(NULL),
	iResources(NULL),
	iTranslates(NULL),
	iCodeSection(NULL),
	iFontInfo(NULL),
	iIndex(Normal),
	iFontHeight(NULL),
	iTypefaceFonts(NULL),
	iModel(NULL)
	{
	}

EXPORT_C boolean PdrReader::Read(const String& aFilename)
	{
	boolean state = Open(aFilename);

	while (!_EOF() && state)
		{
		if (IdentComp(IdentResources))
			state = ReadResources();
		else if (IdentComp(IdentTranslates))
			state = ReadTranslates();
		else if (IdentComp(IdentFontInfo))
			state = ReadFontInfo();
		else if (IdentComp(IdentTypefaceFonts))
			state = ReadTypefaceFonts();
//		else if (IdentComp(IdentExtraInfo))
//			state = ReadExtraInfo();
		else if (IdentComp(IdentModel))
			state = ReadModel();
		else if (IdentComp(IdentPdrStoreFile))
			state = ReadPdrStoreFile();
		else
			{
			Error("Resource identifier expected");
			state = efalse;
			}
		if (state)
			state = NewLine();
		}
	return state;
	}

EXPORT_C PdrReader::~PdrReader()
	{
	}

boolean PdrReader::ReadResources()
	{
	boolean state = etrue;
	iResources = PdrResources::New();
	state = IdentCopy(iResources->iLabel);
	if (state)
		state = NewLine();
	while (!IdentComp(IdentEndResources) && !_EOF() && state)
		{
   	    int i; // DEF102183: Graphics tools fail to build using MS VC8.
		for (i = 0; (i < NumResources) && !IdentComp(IdentResource[i]); i++)
			{	//	Tries to match resources identifier
			}
		if (i < NumResources)
			{
			PdrResource *resource = PdrResource::New();
			state = Command(resource->iString);
			resource->iId = i;
			if (state)
				{
				iResources->AddResource(resource);
				state = NewLine();
				}
			else
				resource->Delete();
			}
		else
			{
			state = efalse;
			Error("Resources identifier expected");
			}
		}
	if (state)
		{
		iPdrModelStore.AddResources(iResources);
		cout << "Resources read\n";
		}
	else 
		iResources->Delete();
	return state;
	}

boolean PdrReader::ReadTranslates()
	{
	int num;
	boolean state = etrue;
	iTranslates = PdrTranslates::New();
	state = IdentCopy(iTranslates->iLabel);
	if (state)
		state = NewLine();
	while (!IdentComp(IdentEndTranslates) && !_EOF() && state)
		{
		if (iLex->iType == ELexNumber)
			{
			PdrTranslation *translation = PdrTranslation::New();
			Number(num);
			translation->iFrom = uint16(num);
			char ch;
			state = Operator(ch);
			if (state)
				{
				state = (ch == ':');
				if (state)
					{
					if (iLex->iType == ELexNumber)
						{
						state = Number(num);
						translation->iTo += char(num);
						}
					else 
						{
						state = Command(translation->iTo);
						}
					if (state)
						state = NewLine();
					}
				else
					{
					Error("Operator ':' expected");
					}
				}
			if (state)
				iTranslates->AddTranslation(translation);
			else
				translation->Delete();
			}
		}
	if (state)
		{
		iPdrModelStore.AddTranslates(iTranslates);
		cout << "Translates read\n";
		}
	else 
		iTranslates->Delete();
	return state;
	}

boolean PdrReader::ReadCodeSection(int aCode)
	{
	boolean state = etrue;
	int code;
	int num;
	iCodeSection = WidthsCodeSection::New();
	char ch = 0;
	state = Number(num);
	if ((num<aCode) && state)
		{
		Error("CodeSection out of sequence");
		state = efalse;
		}
	if (state)
		{
		iCodeSection->iStart = uint16(num);
		state = Operator(ch);
		if (state)
			state = (ch == ':');
		if (state)
			{
			state = Number(num);
			iCodeSection->iEnd = uint16(num);
			state = NewLine();
			}
		else
			{
			state = efalse;
			Error("Operator ':' expected");
			}
		}
	else
		state = efalse;
	while (!IdentComp(IdentEndCodeSection) && !_EOF() && state)
		{
		if (iLex->iType != ELexNL)
			{
			state = Number(code);
			if ((code != iCodeSection->iStart + iCodeSection->NumWidths()) && state)
				{
				state = efalse;
				Error("Width out of sequence");
				}
			if (state)
				state = Operator(ch);
			if (state)
				state = (ch == ':');
			if (state)
				{
				Width *width = Width::New();
				if (Number(num))
					{
					width->iWidthInPixels = (uint16) num;
					iCodeSection->AddWidth(width);
					}
				else
					{
					state = efalse;
					width->Delete();
					}
				}
			}
		else
			state = NewLine();
		}
	if (state)
		{
		num = ((iCodeSection->iEnd + 1) - iCodeSection->iStart);
		if ((num != iCodeSection->NumWidths()) && (iCodeSection->NumWidths() != 1))
			{
			Error("Wrong number of widths in codesection");
			state = efalse;
			}
		}
	if (state)
		{
		iFontInfo->AddCodeSection(iCodeSection);
//		cout << "Codesection read\n";
		}
	else 
		iCodeSection->Delete();
	return state;
	}

boolean PdrReader::ReadFontInfo()
	{
	boolean state = etrue;
	iFontInfo = FontInfo::New();
	int num;
	state = IdentCopy(iFontInfo->iLabel);
	if (state)
		state = NewLine();
	while (!IdentComp(IdentEndFontInfo) && !_EOF() && state)
		{
		if (iLex->iType == ELexIdent)
			{
			if (IdentComp(IdentCodeSection))
				{
				int code = 0,size = iFontInfo->NumCodeSections();
				if (size)
					code = iFontInfo->CodeSectionList(size - 1)->iEnd + 1;
				state = ReadCodeSection(code);
				}
			else if (IdentComp(IdentAscent))
				{
				if (Number(num))
					iFontInfo->iAscentInPixels = uint16(num);
				else
					state = efalse;
				}
			else if (IdentComp(IdentMaxNormalCharWidth))
				{
				state = Number(num);
				if (state)
					iFontInfo->iMaxNormalCharWidthInPixels = uint16(num);
				}
			else
				{
				Error("Unrecognised fontinfo identifier");
				state = efalse;
				}
			}
		else
			{
			Error("Fontinfo identifier expected");
			state = efalse;
			}
		if (state)
			state = NewLine();
		}	  
	if (state)
		{
		iFontInfo->iMaxCharWidthInPixels = 0;
		for (int i = 0; i < iFontInfo->NumCodeSections(); i++)
			{
			WidthsCodeSection* codesection = iFontInfo->CodeSectionList(i);
			for (int j = 0; j < codesection->NumWidths(); j++)
				{
				int width = codesection->WidthList(j)->iWidthInPixels;
				if (width > iFontInfo->iMaxCharWidthInPixels)
					iFontInfo->iMaxCharWidthInPixels = (uint16) width;
				}
			}
		}
	if (state)
		{
		iPdrModelStore.AddFontInfo(iFontInfo);
		cout << "Fontinfo read\n";
		}
	else
		iFontInfo->Delete();
	return state;
	}

boolean PdrReader::ReadStyle()
	{
	boolean state = etrue;
	Record *fontinfo;
	PdrStyle *style;
	String label;
	if (!iTypefaceFonts->iIsScalable)
		style = &iFontHeight->iStyle[iIndex];
	else
		style = &iTypefaceFonts->iScalableFontHeight.iStyle[iIndex];
	style->iIsAvailable = etrue;
	state = IdentCopy(label);
	if (state)
		{
		fontinfo = iPdrModelStore.FindFontInfo(label);
		if (fontinfo)
			style->iFontInfo = fontinfo;
		else
			{
			Error("Fontinfo not found");
			state = efalse;
			}
		}
	return state;
	}

boolean PdrReader::ReadFontHeight()
	{
	boolean state = etrue;
	int num;
	if (iTypefaceFonts->iIsScalable == etrue)
		{
		state = efalse;
		Error("Scalablefontheight already defined");
		}
	else
		iFontHeight = PdrFontHeight::New();
	if (state)
		state = NewLine();

	while (!IdentComp(IdentEndFontHeight) && !_EOF() && state)
		{
		if (iLex->iType == ELexIdent)
			{
			if (IdentComp(IdentHeight))
				{
				if (Number(num))
					iFontHeight->iHeightInTwips = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentWidthScale))
				{
				if (Number(num))
					iFontHeight->iWidthScale = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentNormal))
				{
				iIndex = Normal;
				state = ReadStyle();
				}
			else if (IdentComp(IdentBold))
				{
				iIndex = Bold;
				state = ReadStyle();
				}
			else if (IdentComp(IdentItalic))
				{
				iIndex = Italic;
				state = ReadStyle();
				}
			else if (IdentComp(IdentBoldItalic))
				{
				iIndex = BoldItalic;
				state = ReadStyle();
				}
			else if (IdentComp(IdentCommand))
				{
				state = Command(iFontHeight->iCommandString);
				}
			else
				{
				Error("Unrecognised fontheight identifier");
				state = efalse;
				}
			}
		else
			{
			Error("Fontheight identifier expected");
			state = efalse;
			}
		if (state)
			state = NewLine();
		}
	if (state)
		{
		iTypefaceFonts->AddFontHeight(iFontHeight);
		cout << "Fontheight read\n";
		}
	else
		iFontHeight->Delete();
	return state;
	}

boolean PdrReader::ReadScalableFontHeight()
	{
	boolean state = etrue;
	int num;
	if (iTypefaceFonts->NumFontHeights())
		{
		state = efalse;
		Error("Non-scalable fontheights already defined");
		}
	else if (iTypefaceFonts->iIsScalable == etrue)
		{
		state = efalse;
		Error("Scalablefontheight already defined");
		}
	iTypefaceFonts->iIsScalable=etrue;
	if (state)
		state = NewLine();

	while (!IdentComp(IdentEndScalableFontHeight) && !_EOF() && state)
		{
		if (iLex->iType == ELexIdent)
			{
			if (IdentComp(IdentHeightMin))
				{
				if (Number(num))
					iTypefaceFonts->iScalableFontHeight.iHeightMinInTwips = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentHeightMax))
				{
				if (Number(num))
					iTypefaceFonts->iScalableFontHeight.iHeightMaxInTwips = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentHeightDelta))
				{
				if (Number(num))
					iTypefaceFonts->iScalableFontHeight.iHeightDeltaInTwips = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentNormal))
				{
				iIndex = Normal;
				state = ReadStyle();
				}
			else if (IdentComp(IdentBold))
				{
				iIndex = Bold;
				state = ReadStyle();
				}
			else if (IdentComp(IdentItalic))
				{
				iIndex = Italic;
				state = ReadStyle();
				}
			else if (IdentComp(IdentBoldItalic))
				{
				iIndex = BoldItalic;
				state = ReadStyle();
				}
			else if (IdentComp(IdentCommand))
				{
				state = Command(iTypefaceFonts->iScalableFontHeight.iCommandString);
				}
			else
				{
				Error("Unrecognised scalablefontheight identifier");
				state = efalse;
				}
			}
		else
			{
			Error("Scalablefontheight identifier expected");
			state = efalse;
			}
		if (state)
			state = NewLine();
		}	  
	if (state)
		{
		cout << "Scalablefontheight read\n";
		}
	else
		{
		if (!iTypefaceFonts->iIsScalable)
			iFontHeight->Delete();
		}
	return state;
	}

boolean PdrReader::ReadTypefaceFonts()
	{
	boolean state = etrue;
	Record* translates;
	String label;
	iTypefaceFonts = TypefaceFonts::New();
	state = IdentCopy(iTypefaceFonts->iLabel);
	if (state)
		state = NewLine();
	while (!IdentComp(IdentEndTypefaceFonts) && !_EOF() && state)
		{
		if (iLex->iType == ELexIdent)
			{
			if (IdentComp(IdentTypefaceName))
				{
				if (StringCopy(iTypefaceFonts->iTypeface.iName))
					while (iLex->iType != ELexNL)
					{	if (IdentComp(IdentProportional))
							iTypefaceFonts->iTypeface.iFlags = boolean(iTypefaceFonts->iTypeface.iFlags | Proportional);
						else if (IdentComp(IdentSerif))
							iTypefaceFonts->iTypeface.iFlags = boolean(iTypefaceFonts->iTypeface.iFlags | Serif);
						else if (IdentComp(IdentSymbol))
							iTypefaceFonts->iTypeface.iFlags = boolean(iTypefaceFonts->iTypeface.iFlags | Symbol);
						else
							{ 
							Error("Typefacefonts identifier or newline expected");
							state = efalse;
							}
					}
				else
					state = efalse;
				}
			else if (IdentComp(IdentTypefaceTranslates))
				{
				state = IdentCopy(label);
				if (state)
					{
					translates = iPdrModelStore.FindTranslates(label);
					if (translates)
						iTypefaceFonts->iTranslates = translates;
					else
						{
						Error("Translates not found");
						state = efalse;
						}
					}
				}
			else if (IdentComp(IdentFontHeight))
				{
				state = ReadFontHeight();
				}
			else if (IdentComp(IdentScalableFontHeight))
				{
				state = ReadScalableFontHeight();
				}
			else
				{
				Error("Unrecognised typefacefonts identifier");
				state = efalse;
				}
			}
		else
			{
			Error("Typefacefonts identifier expected");
			state = efalse;
			}
		if (state)
			state = NewLine();
		}	  
	if (state)
		{
		iPdrModelStore.AddTypefaceFonts(iTypefaceFonts);
		cout << "Typefacefonts read\n";
		}
	else
		iTypefaceFonts->Delete();
	return state;
	}

boolean PdrReader::ReadModel()
	{
	boolean state = etrue;
	int num;
	iModel = PrinterModelHeader::New();
	Record* resources;
//	Record* extrainfo;
	String label;
	state = IdentCopy(iModel->iLabel);
	if (state)
		state = NewLine();
	while (!IdentComp(IdentEndModel) && !_EOF() && state)
		{
		if (iLex->iType == ELexIdent)
			{
			if	(IdentComp(IdentModelName))
				{
				if (StringCopy(iModel->iEntry.iName))
					while (iLex->iType != ELexNL)
						{
						if (IdentComp(IdentRequiresPrinterPort))
							iModel->iEntry.iRequiresPrinterPort = etrue;
						else
							{
							Error("Model identifier or newline expected");
							state = efalse;
							}
						}
				else
					state = efalse;
				}
			else if (IdentComp(IdentModelUid))
				state = Number(iModel->iEntry.iUid);
			else if (IdentComp(IdentModelFlags))
				{
				state = Number(num);
				iModel->iInfo.iFlags = num;
				}
			else if (IdentComp(IdentModelResources))
				{
				state = IdentCopy(label);
				if (state)
					{
					resources = iPdrModelStore.FindResources(label);
					if (resources)
						iModel->iInfo.iResources = resources;
					else
						{
						Error("Resources not found");
						state = efalse;
						}
					}
				}
/*			else if (IdentComp(IdentSpareRecord))
				{
				state = IdentCopy(label);
				if (state)
					{
					extrainfo = iPdrModelStore.FindExtraInfo(label);
					if (extrainfo)
						iModel->iInfo.iSpareRecord = extrainfo;
					else
						{
						Error("Spare record not found");
						state = efalse;
						}
					}
				}
*/
			else if (IdentComp(IdentKPixelWidth))
				{
				if (Number(num))
					iModel->iInfo.iKPixelWidthInTwips = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentKPixelHeight))
				{
				if (Number(num))
					iModel->iInfo.iKPixelHeightInTwips = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentPortraitOffset))
				{
				if (Number(num))
					{
					iModel->iInfo.iPortraitOffsetInPixels.iX = num;
					if (Number(num))
						iModel->iInfo.iPortraitOffsetInPixels.iY = num;
					else
						state = efalse;
					}
				else
					state = efalse;
				}
			else if (IdentComp(IdentLandscapeOffset))
				{
				if (Number(num))
					{
					iModel->iInfo.iLandscapeOffsetInPixels.iX = num;
					if (Number(num))
						iModel->iInfo.iLandscapeOffsetInPixels.iY = num;
					else
						state = efalse;
					}
				else
					state = efalse;
				}
			else if (IdentComp(IdentMinMarginLeft))
				{
				if (Number(num))
					iModel->iInfo.iMinMarginsInPixels.iLeft = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentMinMarginRight))
				{
				if (Number(num))
					iModel->iInfo.iMinMarginsInPixels.iRight = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentMinMarginTop))
				{
				if (Number(num))
					iModel->iInfo.iMinMarginsInPixels.iTop = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentMinMarginBottom))
				{
				if (Number(num))
					iModel->iInfo.iMinMarginsInPixels.iBottom = num;
				else
					state = efalse;
				}
			else if (IdentComp(IdentDisplayMode))
				{
        	    int i; // DEF102183: Graphics tools fail to build using MS VC8.
				for (i = 0; (i < NumDisplayModeValues) && !IdentComp(IdentDisplayModeValue[i]); i++)
					{	// Tries to match display mode identifier
					}
				if (i < NumDisplayModeValues)
					{
					iModel->iInfo.iDisplayMode = i;
					}
				else
					{
					state = efalse;
					Error("Display mode identifier expected");
					}
				}
			else if (IdentComp(IdentTypefaceFontss))
				{
				state = NewLine();
				while (!IdentComp(IdentEndTypefaceFontss) && !_EOF() && state)
					{
					TypefaceFontsEntry* typefacefontsentry = NULL;
					if (iLex->iType == ELexIdent)
						{
						state = IdentCopy(label);
						Record* typefacefonts = iPdrModelStore.FindTypefaceFonts(label);
						if (typefacefonts)
							{
							typefacefontsentry = TypefaceFontsEntry::New(typefacefonts);
							state = etrue;
							}
						else
							{
							Error("Typefacefonts not found");
							state = efalse;
							}
						}
					if (state)
						{
						while ((iLex->iType != ELexNL) && !_EOF() && state)
							{
							if (IdentComp(IdentNotInPortrait))
								{
								typefacefontsentry->iNotInPortrait = etrue;
								}
							else if (IdentComp(IdentNotInLandscape))
								{
								typefacefontsentry->iNotInLandscape = etrue;
								}
							else
								{
								Error("Typefacefontsentry identifier or newline expected");
								state = efalse;
								}
							}
						if (state)
							iModel->iInfo.AddTypefaceFontsEntry(typefacefontsentry);
						else
							typefacefontsentry->Delete();
						}
					if (state)
						state = NewLine();
					}
				}
			else
				{
				Error("unrecognised model identifier");
				state = efalse;
				}
			}
		else
			{
			Error("Model identifier expected");
			state = efalse;
			}
		if (state)
			state = NewLine();
		}
	if (state)
		{
		iPdrModelStore.AddModel(iModel);
		cout << "Model read\n";
		}
	else
		iModel->Delete();
	return state;
	}

boolean PdrReader::ReadPdrStoreFile()
	{
	boolean state = etrue;
	if (iPdrStoreFile)
		{
		state = efalse;
		Error("Pdrstorefile already read");
		}
	else
		{
		iPdrStoreFile = PdrStoreFile::New();
		String label;
		Record* model;
		state = NewLine();
		while (!IdentComp(IdentEndPdrStoreFile) && !_EOF() && state)
			{
			if (IdentComp(IdentPDLName))
				{
				state = StringCopy(iPdrStoreFile->iPDLName);
				}
			else if (IdentComp(IdentPDLUid))
				{
				state = Number(iPdrStoreFile->iPDLUid);
				}
			else if (IdentComp(IdentModels))
				{
				state = NewLine();
				while (!IdentComp(IdentEndModels) && !_EOF() && state)
					{
					state = IdentCopy(label);
					if (state)
						{
						model = iPdrModelStore.FindModel(label);
						if (model)
							{
							iPdrStoreFile->AddModel((PrinterModelHeader*)model);
							}
						else
							{
							Error("model not found");
							state = efalse;
							}
						}
					if (state)
						state = NewLine();
					}
				}
			else
				{
				Error("Pdrstorefile identifier expected");
				state = efalse;
				}
			if (state)
				state = NewLine();
			}
		if (state)
			{
			iPdrModelStore.AddPdrStoreFile(iPdrStoreFile);
			cout << "Pdrstorefile read\n";
			}	
		else
			iPdrStoreFile->Delete();
		}
	return state;
	}

EXPORT_C boolean PdrReader::Store(const String& aFilename)
	{
	boolean state = etrue;
	if (!iPdrStoreFile)
		{
		state = efalse;
		Error("No pdrstore file record");
		}
	else
		state = iPdrModelStore.Store(aFilename);
	return state;
	}

boolean PdrReader::Command(String& aCommand)
	{
	boolean state = etrue;
	String string;
	state = StringCopy(string);
	int length = string.Length();
	for (int i = 0; i < length; i++)
		{
		char ch = string[i];
		if (ch == '<')	// Read control character
			{
			ch = 0;
			for (i = i + 1; (i < length) && (string[i] != '>'); i++)
				ch = char((ch * 10) + (string[i] - '0'));
			}
		aCommand += ch;
		}
	return state;
	}
/*
boolean PdrReader::ReadExtraInfo()
	{
	boolean state = etrue;
	String label;
	PdrExtraInfo* extrainfo = new PdrExtraInfo();
	state = IdentCopy(extrainfo->iLabel);
	if (state)
		state = NewLine();
	while (!IdentComp(IdentEndExtraInfo) && !_EOF() && state)
		{
		String* string = new String;
		state = Command(*string);
		if (state)
			extrainfo->iInfo.Add(string);
		else
			delete string;
		state = NewLine();
		}
	if (state)
		{
		iPdrModelStore.AddExtraInfo(extrainfo);
		cout << "Extra info read\n";
		}
	else
		delete extrainfo;
	return state;
	}
*/