bintools/rcomp/src/INDEXTAB.CPP
changeset 0 044383f39525
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/rcomp/src/INDEXTAB.CPP	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,136 @@
+/*
+* 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 "ERRORHAN.H"
+#include "INDEXTAB.H"
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+using std::hex;
+using std::dec;
+using std::endl;
+using std::ostream;
+#endif //__MSVCDOTNET__
+
+int IndexTable::iInUse = 0;
+
+IndexTableItem::IndexTableItem(ResourceHeader* aResource)
+	{
+	iResource=aResource;
+	iOffset[0] = '\0';
+	iOffset[1] = '\0';
+	}
+
+IndexTableItem::~IndexTableItem()
+	{
+	delete iResource;
+	}
+
+void IndexTableItem::SetOffset(unsigned long aOffsetToSet)
+	{
+	assert(aOffsetToSet <= 0xFFFF);
+	
+	iOffset[0] = char(aOffsetToSet & 0xFF);
+	iOffset[1] = char((aOffsetToSet & 0xFF00)>>8);
+	}
+
+RCBinaryStream & operator<< ( RCBinaryStream & os, const IndexTableItem & o)
+	{
+	os.Write( o.iOffset, 2);
+	return os;
+	}
+
+ostream & operator<< ( ostream & os, const IndexTableItem & o)
+	{
+	unsigned long offset = (o.iOffset[1]<<8)|o.iOffset[0];
+	os << "IndexTableItem " << hex << offset << dec << "\t" << o.iResource->iLabel << endl;
+	return os;
+	}
+
+IndexTable::IndexTable()
+	{
+	assert( !iInUse);
+	iInUse = 1;		// Only one instance can be created at a time. This is because the class
+	}				// manages a lump of memory which is freed on destruction.
+
+IndexTable::~IndexTable()
+	{
+	assert( iInUse);
+	DeleteAll();
+	iInUse = 0;
+	}
+
+void IndexTable::Add( ResourceHeader* aResource)
+	{
+	Array::Add( new IndexTableItem( aResource) );
+	}
+
+void IndexTable::SetIndexOffset(unsigned long aOffsetToSet)
+	{
+	assert(aOffsetToSet <= 0xFFFF);
+	
+	iOffset[0] = char(aOffsetToSet & 0xFF);
+	iOffset[1] = char((aOffsetToSet & 0xFF00)>>8);
+	}
+
+
+ostream & operator<< ( ostream & os, const IndexTable & o)
+	{
+	os << "IndexTable" << endl;
+	
+	if ( o.Size() == 0)
+		{
+		os << "<None>" << endl;
+		return os;
+		}
+		
+	IndexTableIterator next( o);
+	IndexTableItem * p;
+	
+	while( ( p = next() ) != NULL)
+		os << * p;
+
+	unsigned long offset = (o.iOffset[1]<<8)|o.iOffset[0];
+	os << "IndexTable     " << hex << offset << dec << endl;
+	return os;
+	}
+
+RCBinaryStream & operator<< ( RCBinaryStream & os, const IndexTable & o)
+	{
+	if ( o.Size() == 0)
+		return os;
+		
+	IndexTableIterator next( o);
+	IndexTableItem * p;
+	
+	while( ( p = next() ) != NULL)
+		os << * p;
+
+	os.Write( o.iOffset, 2);
+	return os;
+	}
+
+IndexTableIterator::IndexTableIterator(const IndexTable & a):
+	ArrayIterator(a)
+	{}
+
+IndexTableItem * IndexTableIterator::operator() ()
+	{
+	return (IndexTableItem *) ArrayIterator::operator() ();
+	}