Milán Major

netscape-revival

1 branch
Code

lib/mac/VText/V_PowerPlant_Mods/LFlatTube.cp

//	===========================================================================
//	LFlatTube.cp				©1994 Metrowerks Inc. All rights reserved.
//	===========================================================================

//	For routine descriptions see LDataTube.cp.

#ifdef PowerPlant_PCH
#include PowerPlant_PCH
#endif

#include	"LFlatTube.h"
#include	<UMemoryMgr.h>
#include	<LTubeableItem.h>
#include	<LHandleStream.h>
#include	<URange32.h>


#pragma	warn_unusedarg off

LFlatTube::LFlatTube()
{
	mSwapDepth = 1;	
}

LFlatTube::~LFlatTube()
{
}

//	----------------------------------------------------------------------
//	Read:

Boolean	LFlatTube::FlavorExists(FlavorType inFlavor) const
{
	Boolean	rval = false;
	
	if (mTubeDepth > mSwapDepth) {
		rval = inherited::FlavorExists(inFlavor);
	}
	
	return rval;
}

Size	LFlatTube::GetFlavorSize(FlavorType inFlavor) const
{
	Size	rval = 0;

	if (mTubeDepth > mSwapDepth) {
		rval = inherited::GetFlavorSize(inFlavor);
	}
	
	return rval;
}

void *	LFlatTube::GetFlavorData(
	FlavorType	inFlavor,
	void		*outFlavorData
) const
{
	void	*rval = NULL;
	
	if (mTubeDepth > mSwapDepth) {
		rval = inherited::GetFlavorData(inFlavor, outFlavorData);
	} else {
		Throw_(noTypeErr);
	}
	
	return rval;
}

LStream &	LFlatTube::GetFlavorStreamOpen(FlavorType inFlavor) const
{
	if (mStream)
		Throw_(paramErr);	//	presently you can have a total of only one flavor stream open at a time
	
	if (mTubeDepth > mSwapDepth) {
		return inherited::GetFlavorStreamOpen(inFlavor);
	} else {
		LFlatTube	&my = (LFlatTube&)*this;
		
		my.mStreamFlavor = inFlavor;
		LHandleStream	*hStream = new LHandleStream();
		my.mStream = hStream;
		GetFlavorHandle(mStreamFlavor, hStream->GetDataHandle());
		hStream->SetLength(GetHandleSize(hStream->GetDataHandle()));
		return *mStream;
	}
}

void	LFlatTube::GetFlavorStreamClose(void) const
{
	if (!mStream)
		Throw_(paramErr);	//	close without balanced open

	if (mTubeDepth > mSwapDepth) {
		inherited::GetFlavorStreamClose();
	} else {
		LFlatTube	&my = (LFlatTube&)*this;

		delete mStream;
		my.mStream = NULL;
	}
}

//	----------------------------------------------------------------------
//	Write:

void	LFlatTube::AddFlavor(FlavorType inFlavor)
{
	if (mItemStack.Depth() > mSwapDepth) {
		inherited::AddFlavor(inFlavor);
	} else {
		//	data lost
	}
}

void	LFlatTube::SetFlavorData(
	FlavorType	inFlavor,
	const void	*inFlavorData,
	Int32		inFlavorSize
)
{
	if (mItemStack.Depth() > mSwapDepth) {
		inherited::SetFlavorData(inFlavor, inFlavorData, inFlavorSize);
	} else {
		//	data lost
	}
}

LStream &	LFlatTube::SetFlavorStreamOpen(FlavorType inFlavor)
{
	if (mStream)
		Throw_(paramErr);	//	presently you can have a total of only one flavor stream open at a time
	
	if (mItemStack.Depth() > mSwapDepth) {
		inherited::SetFlavorStreamOpen(inFlavor);
	} else {
		mStreamFlavor = inFlavor;
		mStream = new LHandleStream();
	}
	
	return *mStream;
}

void	LFlatTube::SetFlavorStreamClose(void)
{
	if (!mStream)
		Throw_(paramErr);	//	close without balanced open
	
	if (mItemStack.Depth() > mSwapDepth) {
		inherited::SetFlavorStreamClose();
	} else {
		LHandleStream	*hStream = dynamic_cast<LHandleStream*>(mStream);
		ThrowIfNULL_(hStream);
		SetFlavorHandle(mStreamFlavor, hStream->GetDataHandle());
		delete mStream;
		mStream = NULL;
	}
}

void	LFlatTube::WriteDesc(LAEStream *inStream) const
{
	if (mTubeDepth <= mSwapDepth) {
		StTempHandle	data(0);
		FlavorType		flavor;
		Int32			n,
						i;
		
		inStream->OpenRecord();
		
			//	Flavors
			n = FlavorCount();
			for (i = 1; i <= n; i++) {
				flavor = NthFlavor(i);
				GetFlavorHandle(flavor, data.mHandle);
				inStream->WriteKey(flavor);
				inStream->OpenDesc(flavor);
				StHandleLocker	lock(data.mHandle);
				inStream->WriteData(*(data.mHandle), GetHandleSize(data.mHandle));
				inStream->CloseDesc();
			}
			
			//	Items
			if (CountItems()) {
				inStream->WriteKey(typeTubeMapItems);
				inStream->OpenRecord();
				
				LDataTube		subTube;
				ItemReference	ref;
				
				n = CountItems();
				for (i = 1; i <= n; i++) {
					subTube = NthItem(i, &ref);
					inStream->WriteKey(ref);
					subTube.WriteDesc(inStream);
				}
				
				inStream->CloseRecord();
			}

		inStream->CloseRecord();

	} else {
		inherited::WriteDesc(inStream);
	}
}

void	LFlatTube::NewTop(void)
{
	if (mStream)
		Throw_(paramErr);	//	Flavor stream nesting error
		
	if (mItemStack.Depth() == mSwapDepth) {
		mItemStack.Top().stream = new LAEStream;
	} else if (mItemStack.Depth() > mSwapDepth) {
		mItemStack.Top().stream = mItemStack.PeekBack(1).stream;
	}
}

#include	<StClasses.t>

template class	StChange<void *>;

void	LFlatTube::OldTop(void)
{
	if (mStream)
		Throw_(paramErr);	//	Flavor stream nesting error
		
	if ((mItemStack.Depth() == mSwapDepth) && (mItemStack.Top().subCt)) {
		StAEDescriptor	subItems;	
		{
//+			StValueChanger<void *>	change(mDesc, &subItems.mDesc);
			StChange<void *>		change(&mDesc, &subItems.mDesc);
			
			inherited::OldTop();
		}
		Assert_(subItems.mDesc.descriptorType != typeNull);
		SetFlavorHandle(typeTubeMapItems, subItems.mDesc.dataHandle);
	} else {
		if (	(mItemStack.Depth() == mSwapDepth) || 
				(mItemStack.Depth() >= 2) && (mItemStack.Top().stream != mItemStack.PeekBack(1).stream)
		) {
//?			Assert_(mDesc->descriptorType == typeNull);
			mItemStack.Top().stream->Close(mDesc);
			delete mItemStack.Top().stream;
			mItemStack.Top().stream = NULL;
		}
	}
}

//	----------------------------------------------------------------------