diff -r 820b22e13ff1 -r 39c28ec933dd bintools/rcomp/src/LINKARRA.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bintools/rcomp/src/LINKARRA.CPP Mon May 10 19:54:49 2010 +0100 @@ -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 +#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; + }