--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/rcomp/src/LINKARRA.CPP Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,143 @@
+/*
+* 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 "LINKARRA.H"
+#include "NAMEIDMA.H"
+#include "RCBINSTR.H"
+#include "TOKENS.H"
+#include "MEM.H"
+#include "ERRORHAN.H"
+#include "RCBINSTR.H"
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+using std::cout;
+using std::cerr;
+using std::endl;
+#endif //__MSVCDOTNET__
+
+extern NameIdMap* pResourceNameIds;
+extern int verbose;
+extern RCTypeArray gTypes;
+
+int LinkArray::iInUse = 0;
+
+LinkArray::LinkArray()
+ {
+ assert(!iInUse);
+ iInUse = 1;
+ }
+
+LinkArray::~LinkArray()
+ {
+ assert(iInUse);
+ DeleteAll();
+ }
+
+void LinkArray::Add( LinkItem * pNewItem)
+ {
+ Array::Add( pNewItem);
+ }
+
+void LinkArray::OverwriteLinks ( RCBinaryStream & os ) const
+ {
+ if ( verbose) { MOFF; cout << "Writing in correct links." << endl; MON;}
+ LinkArrayIterator next( *this);
+ LinkItem * p;
+ while ( ( p = next() ) != NULL)
+ p->OverwriteLink( os);
+ }
+
+LinkItem::LinkItem(ResourceDataStream& aStream,const String& aResourceName,const String& aFileName,int aLineNumber):
+ iStreamPosition(0xeebbeebb), // garbage initialization
+ iResourceName(aResourceName),
+ iFileName(aFileName),
+ iLineNumber(aLineNumber)
+ {
+ aStream.EnquireStreamPositionWhenKnown(iStreamPosition); // causes iStream to be correctly set at some point later
+ }
+
+int WordLink::NumberOfBytesOccupiesInStream()
+ { // static
+ return gTypes.GetSize(L_WORD);
+ }
+
+int LongLink::NumberOfBytesOccupiesInStream()
+ { // static
+ return gTypes.GetSize(L_LONG);
+ }
+
+void WordLink::OverwriteLink( RCBinaryStream & os ) const
+ {
+ if ( verbose) { MOFF; cout << "Writing WORD link: " << iResourceName << "\t" << iStreamPosition << endl; MON;}
+ os.SetPosition(iStreamPosition);
+ ErrorHandler::Register(iFileName,iLineNumber);
+ os << NumericValue(pResourceNameIds->FindId(iResourceName),L_WORD);
+ }
+
+void LongLink::OverwriteLink( RCBinaryStream & os ) const
+ {
+ if ( verbose) { MOFF; cout << "Writing LONG link: " << iResourceName << "\t" << iStreamPosition << endl; MON;}
+ os.SetPosition(iStreamPosition);
+ ErrorHandler::Register(iFileName,iLineNumber);
+ os << NumericValue(pResourceNameIds->FindId(iResourceName),L_LONG);
+ }
+
+LinkArrayIterator::LinkArrayIterator(const LinkArray& c):
+ ArrayIterator(c)
+ {}
+
+LinkItem * LinkArrayIterator::operator() ()
+ {
+ return (LinkItem *) ArrayIterator::operator() ();
+ }
+
+WordLink::WordLink(ResourceDataStream& aStream,const String& aResourceName,const String& aFileName,int aLineNumber):
+ LinkItem(aStream,aResourceName,aFileName,aLineNumber)
+ {}
+
+LongLink::LongLink(ResourceDataStream& aStream,const String& aResourceName,const String& aFileName,int aLineNumber):
+ LinkItem(aStream,aResourceName,aFileName,aLineNumber)
+ {}
+
+ostream & WordLink::StreamOut ( ostream & os)
+ {
+ os << "WordLink: " << iStreamPosition << "\t" << iResourceName << endl;
+
+ return os;
+ }
+
+ostream & LongLink::StreamOut( ostream & os)
+ {
+ os << "LongLink: " << iStreamPosition << "\t" << iResourceName << endl;
+
+ return os;
+ }
+
+ostream & operator<< ( ostream & os, LinkArray & o)
+ {
+ os << "LinkArray *******" << endl;
+
+ LinkArrayIterator next( o);
+ LinkItem * p;
+
+ while( ( p = next() ) != NULL)
+ p->StreamOut( os);
+
+ return os;
+ }