--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/rcomp/src/RESOURCE.CPP Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,411 @@
+/*
+* 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 the License "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:
+*
+*/
+
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "RESOURCE.H"
+#include "TOKENS.H"
+#include "ERRORHAN.H"
+
+// ResourceItem
+
+ResourceItem::ResourceItem(const String& aLabelToSet, int aResourceItemType):
+ iLabel(aLabelToSet),
+ iLineNumber(0),
+ iResourceItemType(aResourceItemType)
+ {}
+
+ResourceItem & ResourceItem::operator= ( const ResourceItem &)
+ {
+ assert(0);
+ return * this;
+ }
+
+void ResourceItem::Set(const String* aFileNameToSet, int aLineNumberToSet)
+ {
+ iFileName = aFileNameToSet;
+ iLineNumber = aLineNumberToSet;
+ }
+
+void ResourceItem::RegisterErrorLocation()
+ {
+ ErrorHandler::Register(iFileName,iLineNumber);
+ }
+
+int ResourceItem::GetResourceItemType()
+ {
+ return iResourceItemType;
+ }
+
+String ResourceItem::GetLabel()
+ {
+ return iLabel;
+ }
+
+/***************************************************************/
+/* SimpleResourceItem */
+/***************************************************************/
+SimpleResourceItem::SimpleResourceItem(SimpleStructItem* aItem):
+ ResourceItem(aItem->iLabel, ESimpleResourceItem),
+ iStructItem(aItem),
+ iValueSet(0)
+ {}
+
+void SimpleResourceItem::Set(const String& aValueToSet)
+ {
+ ResourceItem::Set( ErrorHandler::GetFileName(), ErrorHandler::GetLineNumber() );
+
+ unsigned long lengthLimit = 0; // max length of string, 0 = unchecked
+ switch ( iStructItem->iItemType)
+ {
+ case L_LTEXT8:
+ case L_LTEXT16:
+ lengthLimit = 255; // length encoded as a single byte
+ // fall through...
+ case L_TEXT8:
+ case L_BUF8:
+ case L_TEXT16:
+ case L_BUF16:
+ if ( iStructItem->iLengthLimit.Length() > 0)
+ {
+ NumericValue limit(iStructItem->iLengthLimit, L_LONG);
+ lengthLimit = limit.GetULong();
+ }
+ if ( lengthLimit && aValueToSet.ExportLength(TargetCharacterSet,SourceCharacterSet) > lengthLimit )
+ {
+ char buf[256];
+ sprintf(buf, "Text length exceeds specified limit of %lx", lengthLimit);
+ ErrorHandler::OutputErrorLine( buf);
+ exit(1);
+ }
+ }
+
+ iValue = aValueToSet;
+ iValueSet = 1;
+ }
+
+void SimpleResourceItem::Set(const StringArray& /*aValues*/)
+ {
+ // Can't store array of values
+ ErrorHandler::OutputErrorLine( "SimpleResourceItem cannot hold array of values");
+ exit(1);
+ }
+
+ResourceItemArray * SimpleResourceItem::GetRIA()
+ {
+ assert(0); // Don't have RIA in this class.
+ return NULL;
+ }
+
+void SimpleResourceItem::AddDefault()
+ {
+ if(!iValueSet)
+ iValue = iStructItem->iDefault;
+ }
+
+void SimpleResourceItem::SetSRLink(unsigned long aSRLinkToSet)
+ {
+ if(iStructItem->iItemType == L_SRLINK)
+ iLinkValue = aSRLinkToSet;
+ }
+
+// ArrayResourceItem
+
+ArrayResourceItem::ArrayResourceItem( ArrayStructItem * p):
+ ResourceItem( p->iLabel, EArrayResourceItem),
+ iStructItem(p)
+ {}
+
+ArrayResourceItem::~ArrayResourceItem()
+ {
+ iValues.DeleteAll();
+ }
+
+void ArrayResourceItem::Set(const String& /*aValue*/)
+ {
+ // Can't store single value
+ ErrorHandler::OutputErrorLine( "ArrayResourceItem requires array of values");
+ exit(1);
+ }
+
+void ArrayResourceItem::Set(const StringArray& aValuesToSet)
+ {
+ ResourceItem::Set(ErrorHandler::GetFileName(),ErrorHandler::GetLineNumber());
+ iValues = aValuesToSet;
+ }
+
+ResourceItemArray * ArrayResourceItem::GetRIA()
+ {
+ assert(0); // Don't have RIA in this class.
+ return NULL;
+ }
+
+void ArrayResourceItem::AddDefault()
+ {
+ StringArrayIterator NextActual(iValues);
+ String* actualvalue;
+ StringArrayIterator NextDefault( iStructItem->iDefaults);
+ String* defaultvalue;
+ // Iterate through actual values and default values.
+ while((actualvalue = NextActual()) != NULL)
+ {
+ if((defaultvalue = NextDefault()) == NULL)
+ return; // Stop if end of defaults reached.
+ }
+ // Having reached the end of the actual values see if there are any
+ // default values to add.
+ while((defaultvalue = NextDefault()) != NULL)
+ iValues.Add(new String (*defaultvalue));
+ }
+
+void ArrayResourceItem::SetSRLink(unsigned long /*aSRLinkToSet*/)
+ {}
+
+// StructTypeResourceItem
+
+StructTypeResourceItem::StructTypeResourceItem(StructTypeStructItem* p):
+ ResourceItem( p->iLabel, EStructTypeResourceItem),
+ iStructItem(p)
+ {}
+
+void StructTypeResourceItem::Set(const String& aStructName)
+ {
+ ResourceItem::Set(ErrorHandler::GetFileName(),ErrorHandler::GetLineNumber());
+ iResourceItems.FillFromStruct(aStructName);
+ }
+
+void StructTypeResourceItem::Set(const StringArray& /*aValues*/)
+ {
+ // Can't store array of values
+ ErrorHandler::OutputErrorLine( "StructTypeResourceItem cannot hold array of values");
+ exit(1);
+ }
+
+ResourceItemArray * StructTypeResourceItem::GetRIA()
+ {
+ return& iResourceItems;
+ }
+
+void StructTypeResourceItem::AddDefault()
+ {
+ ResourceItemArrayIterator NextActualItem(iResourceItems);
+ ResourceItem * pActualItem;
+
+ // Add defaults to each of the items already set up.
+ while( ( pActualItem = NextActualItem() ) != NULL)
+ pActualItem->AddDefault();
+ }
+
+void StructTypeResourceItem::SetSRLink(unsigned long /*aSRLinkToSet*/)
+ {}
+
+// StructArrayResourceItem
+
+StructArrayResourceItem::StructArrayResourceItem(StructArrayStructItem* p):
+ ResourceItem(p->iLabel, EStructArrayResourceItem),
+ iStructItem(p),
+ iLastRIA( NULL)
+ {}
+
+void StructArrayResourceItem::Set( const String & StructName)
+ {
+ ResourceItem::Set( ErrorHandler::GetFileName(), ErrorHandler::GetLineNumber() );
+ ResourceItemArray* p = new ResourceItemArray;
+ iArrayOfResourceItemArrays.Add(p);
+ p->FillFromStruct( StructName);
+ iLastRIA = p;
+ }
+
+void StructArrayResourceItem::Set(const StringArray& /*aValues*/)
+ {}
+
+ResourceItemArray * StructArrayResourceItem::GetRIA()
+ {
+ return iLastRIA;
+ }
+
+void StructArrayResourceItem::AddDefault()
+ {
+ ResourceItemArrayArrayIterator next(iArrayOfResourceItemArrays);
+ ResourceItemArray * p;
+ while( ( p = next() ) != NULL)
+ p->AddDefault();
+ }
+
+void StructArrayResourceItem::SetSRLink(unsigned long /*aSRLinkToSet*/)
+ {}
+
+// ResourceItemArray
+
+ResourceItemArray::ResourceItemArray():
+ iLenType(0)
+ {}
+
+ResourceItemArray::~ResourceItemArray()
+ {
+ DeleteAll();
+ }
+
+void ResourceItemArray::Add( ResourceItem * p)
+ {
+ Array::Add( p);
+ }
+
+void ResourceItemArray::FillFromStruct(const String& aStructName)
+ {
+ extern StructHeaderArray * pSHA;
+ StructHeader * pSH = pSHA->Find(aStructName);
+ StructItemArrayIterator next( pSH->iSIA);
+ StructItem * pItem;
+ while ( ( pItem = next() ) != NULL)
+ Add( pItem->NewResourceItem() );
+ iLenType = pSH->iLenType;
+ }
+
+void ResourceItemArray::Set( const String & Label, const String & Value)
+ {
+ ResourceItem * p = Find( Label);
+ p->Set( Value);
+ }
+
+void ResourceItemArray::Set( const String & Label, const StringArray & Values)
+ {
+ ResourceItem * p = Find( Label);
+ p->Set( Values);
+ }
+
+ResourceItem * ResourceItemArray::Find( const String & LabelSought)
+ {
+ ResourceItemArrayIterator next( * this);
+ ResourceItem * p;
+
+ while( ( p = next() ) != NULL)
+ if ( p->iLabel == LabelSought)
+ return p;
+
+ ErrorHandler::OutputErrorLine( "Label not found");
+ exit(1);
+ }
+
+void ResourceItemArray::AddDefault()
+ {
+ ResourceItemArrayIterator next( * this);
+ ResourceItem * p;
+
+ while( ( p = next() ) != NULL)
+ p->AddDefault();
+ }
+
+// ResourceHeader
+
+ResourceHeader::ResourceHeader(String aLabelToSet):
+ iLabel(aLabelToSet),
+ iLocal(0),
+ iResourceId(0xdeaddead),
+ iFormatAsHex(0),
+ iContainsCompressedUnicode(false)
+ {
+ }
+
+ResourceHeader::ResourceHeader():
+ iLocal(0),
+ iResourceId(0xdeaddead),
+ iFormatAsHex(0),
+ iContainsCompressedUnicode(false)
+ {
+ }
+
+ResourceHeader::~ResourceHeader()
+ {
+ }
+
+void ResourceHeader::AddDefault()
+ {
+ iRIA.AddDefault();
+ }
+
+void ResourceHeader::SetResourceId(NameIdMap& aMap, unsigned long aId, int aFormatAsHex)
+ {
+ iResourceId = aId;
+ iFormatAsHex = aFormatAsHex;
+ if (iLabel.Length() > 0)
+ aMap.Add(iLabel, aId);
+
+ ResourceItemArrayIterator next(iRIA);
+ ResourceItem * pItem;
+ while( ( pItem = next() ) != NULL)
+ pItem->SetSRLink(aId);
+ }
+
+void ResourceHeader::StreamOut(RCBinaryStream& aStream, int& aSizeOfLargestResourceWhenUncompressed, const char* aDumpFile)
+ {
+ ResourceDataStream stream;
+ iRIA.StreamOut(stream);
+ if (aDumpFile!=NULL)
+ {
+ // dump the resource to aDumpFile in its uncompressed and unpadded state - LINKs, LLINKs, etc will be undefined
+ stream.Dump(aDumpFile);
+ }
+ int sizeWhenUncompressed=0;
+ iContainsCompressedUnicode=stream.StreamOutReturningWhetherContainsCompressedUnicode(aStream, sizeWhenUncompressed);
+ // this check is unnecessary, zero size resources are allowed so
+ // there is no benefit to this assert.
+
+ if (aSizeOfLargestResourceWhenUncompressed<sizeWhenUncompressed)
+ {
+ aSizeOfLargestResourceWhenUncompressed=sizeWhenUncompressed;
+ }
+ }
+
+// ResourceItemArrayArray
+
+ResourceItemArrayArray::ResourceItemArrayArray()
+ {}
+
+ResourceItemArrayArray::~ResourceItemArrayArray()
+ {
+ DeleteAll();
+ }
+
+void ResourceItemArrayArray::Add( ResourceItemArray * pNewItem)
+ {
+ Array::Add( pNewItem);
+ }
+
+// ResourceItemArrayIterator
+
+ResourceItemArrayIterator::ResourceItemArrayIterator( const ResourceItemArray & c):
+ ArrayIterator( c)
+ {}
+
+ResourceItem * ResourceItemArrayIterator::operator()()
+ {
+ return (ResourceItem *) ArrayIterator::operator()();
+ }
+
+// ResourceItemArrayArrayIterator
+
+ResourceItemArrayArrayIterator::ResourceItemArrayArrayIterator(const ResourceItemArrayArray & c):
+ ArrayIterator( c)
+ {}
+
+ResourceItemArray* ResourceItemArrayArrayIterator::operator()()
+ {
+ return (ResourceItemArray*) ArrayIterator::operator()();
+ }