/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_rsc.hxx"
/****************** I N C L U D E S **************************************/

// C and C++ Includes.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// Programmabh�ngige Includes.
#include <rsccont.hxx>

#include <tools/rcid.h>

/****************** C O D E **********************************************/
/****************** E N T R Y S T R U C T ********************************/
/*************************************************************************
|*
|*	  ENTRYSTRUCT::Destroy()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 06.08.91
|*	  Letzte Aenderung	MM 06.08.91
|*
*************************************************************************/
void ENTRY_STRUCT::Destroy()
{
	aName.Destroy();
	if( aInst.IsInst() ){
		aInst.pClass->Destroy( aInst );
		rtl_freeMemory( aInst.pData );
	};
}

/****************** R s c B a s e C o n t ********************************/
/*************************************************************************
|*
|*	  RscBaseCont::RscBaseCont()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 25.05.91
|*	  Letzte Aenderung	MM 25.05.91
|*
*************************************************************************/
RscBaseCont::RscBaseCont( Atom nId, sal_uInt32 nTypeId, RscTop * pSuper,
						  sal_Bool bNoIdent )
	: RscTop( nId, nTypeId, pSuper ),
      nSize( 0 )
{
	pTypeClass = NULL;
	pTypeClass1 = NULL;
	bNoId = bNoIdent;
	nOffInstData = RscTop::Size();
	nSize = nOffInstData + ALIGNED_SIZE( sizeof( RscBaseContInst ) );
}

/*************************************************************************
|*
|*	  RscBaseCont::~RscBaseCont()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 25.05.91
|*	  Letzte Aenderung	MM 25.05.91
|*
*************************************************************************/
RscBaseCont::~RscBaseCont()
{
}

/*************************************************************************
|*
|*	  RscBaseCont::GetClassType()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 25.05.91
|*	  Letzte Aenderung	MM 25.05.91
|*
*************************************************************************/
RSCCLASS_TYPE RscBaseCont::GetClassType() const
{
	return RSCCLASS_COMPLEX;
}

/*************************************************************************
|*
|*	  DestroyElements()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
void RscBaseCont::DestroyElements( RscBaseContInst * pClassData )
{
	sal_uInt32	i = 0;

	if( pClassData->nEntries ){
		for( i = 0; i < pClassData->nEntries; i++ ){
			pClassData->pEntries[ i ].Destroy();
		};
		rtl_freeMemory( pClassData->pEntries );
		pClassData->pEntries = NULL;
		pClassData->nEntries = 0;
	};
}

/*************************************************************************
|*
|*	  RscBaseCont::Create()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
RSCINST RscBaseCont::Create( RSCINST * pInst, const RSCINST & rDflt,
							 sal_Bool bOwnClass )
{
	sal_uInt32	i = 0;
	RSCINST aInst;
	RscBaseContInst * pClassData;

	if( !pInst ){
		aInst.pClass = this;
		aInst.pData = (CLASS_DATA) rtl_allocateMemory( Size() );
	}
	else
		aInst = *pInst;
	if( !bOwnClass && rDflt.IsInst() )
		bOwnClass = rDflt.pClass->InHierarchy( this );

	RscTop::Create( &aInst, rDflt, bOwnClass );

	pClassData = (RscBaseContInst *)(aInst.pData + nOffInstData);
	pClassData->nEntries = 0;
	pClassData->pEntries = NULL;
	pClassData->bDflt = sal_True;

	if( bOwnClass ){
		RscBaseContInst *	pDfltClassData;
		RSCINST 		aDfltI;

		pDfltClassData = (RscBaseContInst *)(rDflt.pData + nOffInstData);

		if( 0 != pDfltClassData->nEntries ){
			*pClassData = *pDfltClassData;
			pClassData->pEntries =
				(ENTRY_STRUCT *)rtl_allocateMemory( sizeof( ENTRY_STRUCT )
												* pClassData->nEntries );
			for( i = 0; i < pClassData->nEntries; i++ ){
				pClassData->pEntries[ i ].Create();
				pClassData->pEntries[ i ].aName =
									pDfltClassData->pEntries[ i ].aName;
				aDfltI = pDfltClassData->pEntries[ i ].aInst;
				pClassData->pEntries[ i ].aInst =
									aDfltI.pClass->Create( NULL, aDfltI );
			};
		};
	}

	return( aInst );
}

/*************************************************************************
|*
|*	  RscBaseCont::Destroy()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 25.05.91
|*	  Letzte Aenderung	MM 25.05.91
|*
*************************************************************************/
void RscBaseCont::Destroy( const RSCINST & rInst ){
	RscBaseContInst * pClassData;

	RscTop::Destroy( rInst);

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
	DestroyElements( pClassData );
}

/*************************************************************************
|*
|*	  RscBaseCont::SearchEle()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 17.05.91
|*	  Letzte Aenderung	MM 17.05.91
|*
*************************************************************************/
RSCINST RscBaseCont::SearchElePos( const RSCINST & rInst, const RscId & rEleName,
								   RscTop * pClass, sal_uInt32 nPos )
{
	sal_uInt32	i = 0;
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
	if( !pClass )
		pClass = pTypeClass;

	if( rEleName.IsId() ){
		for( i = nPos; i < pClassData->nEntries; i++ ){
			if( pClassData->pEntries[ i ].aName == rEleName
			  && pClassData->pEntries[ i ].aInst.pClass == pClass )
			{
				return( pClassData->pEntries[ i ].aInst );
			};
		};
	};
	return RSCINST();
}

/*************************************************************************
|*
|*	  RscBaseCont::SearchEle()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 17.05.91
|*	  Letzte Aenderung	MM 17.05.91
|*
*************************************************************************/
RSCINST RscBaseCont::SearchEle( const RSCINST & rInst, const RscId & rEleName,
								RscTop * pClass )
{
	return SearchElePos( rInst, rEleName, pClass, 0 );
}

/*************************************************************************
|*
|*	  RscBaseCont::GetElement()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::GetElement( const RSCINST & rInst, const RscId & rEleName,
								 RscTop * pCreateClass,
								 const RSCINST & rCreateInst, RSCINST * pGetInst )
{
	RscBaseContInst * pClassData;
	RSCINST 		  aTmpI;
	ERRTYPE 		  aError;

	if( !bNoId && !rEleName.IsId() )
		aError = WRN_CONT_NOID;
	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( pCreateClass ){
		if( !pCreateClass->InHierarchy( pTypeClass ) ){
			if( pTypeClass1 ){
				if( !pCreateClass->InHierarchy( pTypeClass1 ) ){
					// Falscher Typ
					return ERR_CONT_INVALIDTYPE;
				}
			}
			else{
				// Falscher Typ
				return ERR_CONT_INVALIDTYPE;
			};
		};
	}
	else
		pCreateClass = pTypeClass;

	pClassData->bDflt = sal_False;
	if( !bNoId )
		aTmpI = SearchEle( rInst, rEleName, pCreateClass );
	// Eintrag gefunden
	if( aTmpI.IsInst() ){
		aError = WRN_CONT_DOUBLEID;
		if( rCreateInst.IsInst() ){
			aTmpI.pClass->Destroy( aTmpI );
			aTmpI.pClass->Create( &aTmpI, rCreateInst );
		};
	}
	else {
		if( pClassData->pEntries ){
			pClassData->pEntries =
				(ENTRY_STRUCT *)rtl_reallocateMemory( pClassData->pEntries,
						 sizeof( ENTRY_STRUCT ) * (pClassData->nEntries +1) );
		}
		else {
			pClassData->pEntries =
				(ENTRY_STRUCT *)rtl_allocateMemory( sizeof( ENTRY_STRUCT )
												* (pClassData->nEntries +1) );
		};

		pClassData->pEntries[ pClassData->nEntries ].Create();
		pClassData->pEntries[ pClassData->nEntries ].aName = rEleName;

		if( rCreateInst.IsInst() ){
			// Instanz mit CreateInst-Daten initialisieren
			pClassData->pEntries[ pClassData->nEntries ].aInst =
						pCreateClass->Create( NULL, rCreateInst );
		}
		else {
			pClassData->pEntries[ pClassData->nEntries ].aInst =
						pCreateClass->Create( NULL, RSCINST() );
		};

		pClassData->nEntries++;
		aTmpI = pClassData->pEntries[ pClassData->nEntries -1 ].aInst;
	}

	*pGetInst = aTmpI;
	return aError;
}

/*************************************************************************
|*
|*	  RscBaseCont::GetCount()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
sal_uInt32 RscBaseCont::GetCount( const RSCINST & rInst ){
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
	return( pClassData->nEntries );
}

/*************************************************************************
|*
|*	  RscBaseCont::GetPosEle()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
RSCINST RscBaseCont::GetPosEle( const RSCINST & rInst, sal_uInt32 nPos ){
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( nPos < pClassData->nEntries )
		return( pClassData->pEntries[ nPos ].aInst );
	return RSCINST();
}

/*************************************************************************
|*
|*	  RscBaseCont::MovePosEle()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 23.10.91
|*	  Letzte Aenderung	MM 23.10.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::MovePosEle( const RSCINST & rInst, sal_uInt32 nDestPos,
								 sal_uInt32 nSourcePos )
{
	ERRTYPE aError;
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( (nDestPos < pClassData->nEntries) && (nSourcePos < pClassData->nEntries) ){
		ENTRY_STRUCT aEntry;
		int		     nInc = 1;
		sal_uInt32		 i = 0;

		// Quelle Merken
		aEntry = pClassData->pEntries[ nSourcePos ];
		// Richtung der for-Schleife bestimmen
		if( nDestPos < nSourcePos )
			nInc = -1;

		for( i = nSourcePos; i != nDestPos; i += nInc )
			pClassData->pEntries[ i ] = pClassData->pEntries[ i + nInc ];

		// Zuweisung Quelle auf Ziel
		pClassData->pEntries[ nDestPos ] = aEntry;
	}
	else
		aError = ERR_RSCCONT;
	return aError;
}

/*************************************************************************
|*
|*	  RscBaseCont::SetPosRscId()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 30.09.91
|*	  Letzte Aenderung	MM 30.09.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::SetPosRscId( const RSCINST & rInst, sal_uInt32 nPos,
								  const RscId & rId ){
	RscBaseContInst * pClassData;
	RSCINST 		  aTmpI;
	ERRTYPE 		  aError;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( nPos < pClassData->nEntries ){
		if( ! (rId == pClassData->pEntries[ nPos ].aName) )
			aTmpI = SearchEle( rInst, rId,
							   pClassData->pEntries[ nPos ].aInst.pClass );
		if( !aTmpI.IsInst() )
			pClassData->pEntries[ nPos ].aName = rId;
		else
			aError = ERR_RSCCONT;
	}
	else
		aError = ERR_RSCCONT;
	return( aError );
}

/*************************************************************************
|*
|*	  RscBaseCont::GetInfoEle()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
SUBINFO_STRUCT RscBaseCont::GetInfoEle( const RSCINST & rInst, sal_uInt32 nPos ){
	RscBaseContInst * pClassData;
	SUBINFO_STRUCT	aInfo;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( nPos < pClassData->nEntries ){
		aInfo.aId	 = pClassData->pEntries[ nPos ].aName;
		aInfo.nPos	 = nPos;
		aInfo.pClass = pClassData->pEntries[ nPos ].aInst.pClass;
	}
	return( aInfo );
}

/*************************************************************************
|*
|*	  RscBaseCont::SetString()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 29.04.91
|*	  Letzte Aenderung	MM 29.04.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::SetString( const RSCINST & rInst, const char * pStr )
{
	RscBaseContInst * pClassData;
	RSCINST aTmpI;
	ERRTYPE aError;
	char	*pTmpStr;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

//?B 040991
//?W 040991 sonst Endlosrekursion moeglich
if( RSC_NOTYPE == pTypeClass->GetTypId() ){
	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
	aError = aTmpI.pClass->GetString( aTmpI, &pTmpStr );
	if( aError.IsOk() )
		aError = aTmpI.pClass->SetString( aTmpI, pStr );
	else {
		aError.Clear();
		DeletePos( rInst, pClassData->nEntries -1 );
		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
		aError = aTmpI.pClass->GetString( aTmpI, &pTmpStr );
		if( aError.IsOk() )
			aError = aTmpI.pClass->SetString( aTmpI, pStr );
	}
	if( aError.IsError() )
		DeletePos( rInst, pClassData->nEntries -1 );
}
else
	aError = ERR_UNKNOWN_METHOD;

	return( aError );
}

/*************************************************************************
|*
|*	  RscBaseCont::SetNumber()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 12.06.91
|*	  Letzte Aenderung	MM 12.06.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::SetNumber( const RSCINST & rInst, sal_Int32 lValue ){
	RscBaseContInst * pClassData;
	RSCINST aTmpI;
	ERRTYPE aError;
	sal_Int32	lNumber;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

//?B 040991
//?W 040991 sonst Endlosrekursion moeglich
if( RSC_NOTYPE == pTypeClass->GetTypId() ){
	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
	aError = aTmpI.pClass->GetNumber( aTmpI, &lNumber );
	if( aError.IsOk() )
		aError = aTmpI.pClass->SetNumber( aTmpI, lValue );
	else {
		aError.Clear();
		DeletePos( rInst, pClassData->nEntries -1 );
		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
		aError = aTmpI.pClass->GetNumber( aTmpI, &lNumber );
		if( aError.IsOk() )
			aError = aTmpI.pClass->SetNumber( aTmpI, lValue );
	}
	if( aError.IsError() )
		DeletePos( rInst, pClassData->nEntries -1 );
}
else
	aError = ERR_UNKNOWN_METHOD;

	return( aError );
}

//==================================================================
ERRTYPE RscBaseCont::SetBool
(
	const RSCINST & rInst,
	sal_Bool bValue
)
{
	RscBaseContInst * pClassData;
	RSCINST aTmpI;
	ERRTYPE aError;
	sal_Bool	bBool;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

//?B 040991
//?W 040991 sonst Endlosrekursion moeglich
if( RSC_NOTYPE == pTypeClass->GetTypId() )
{
	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
	aError = aTmpI.pClass->GetBool( aTmpI, &bBool );
	if( aError.IsOk() )
		aError = aTmpI.pClass->SetBool( aTmpI, bValue );
	else {
		aError.Clear();
		DeletePos( rInst, pClassData->nEntries -1 );
		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
		aError = aTmpI.pClass->GetBool( aTmpI, &bBool );
		if( aError.IsOk() )
			aError = aTmpI.pClass->SetBool( aTmpI, bValue );
	}
	if( aError.IsError() )
		DeletePos( rInst, pClassData->nEntries -1 );
}
else
	aError = ERR_UNKNOWN_METHOD;

	return( aError );
}

//==================================================================
ERRTYPE RscBaseCont::SetConst
(
	const RSCINST & rInst,
	Atom nValueId,
	sal_Int32 lValue
)
{
	RscBaseContInst * pClassData;
	RSCINST aTmpI;
	ERRTYPE aError;
	Atom	nConst;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

//?B 040991
//?W 040991 sonst Endlosrekursion moeglich
if( RSC_NOTYPE == pTypeClass->GetTypId() ){
	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
	aError = aTmpI.pClass->GetConst( aTmpI, &nConst );
	if( aError.IsOk() )
		aError = aTmpI.pClass->SetConst( aTmpI, nValueId, lValue );
	else {
		aError.Clear();
		DeletePos( rInst, pClassData->nEntries -1 );
		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
		aError = aTmpI.pClass->GetConst( aTmpI, &nConst );
		if( aError.IsOk() )
			aError = aTmpI.pClass->SetConst( aTmpI, nValueId, lValue );
	}
	if( aError.IsError() )
		DeletePos( rInst, pClassData->nEntries -1 );
}
else
	aError = ERR_UNKNOWN_METHOD;

	return( aError );
}

/*************************************************************************
|*
|*	  RscBaseCont::SetRef()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 02.12.91
|*	  Letzte Aenderung	MM 02.12.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::SetRef( const RSCINST & rInst, const RscId & rRefId ){
	RscBaseContInst * pClassData;
	RSCINST aTmpI;
	ERRTYPE aError;
	RscId	aId;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

//?B 040991
//?W 040991 sonst Endlosrekursion moeglich
if( RSC_NOTYPE == pTypeClass->GetTypId() ){
	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
	aError = aTmpI.pClass->GetRef( aTmpI, &aId );
	if( aError.IsOk() )
		aError = aTmpI.pClass->SetRef( aTmpI, rRefId );
	else {
		aError.Clear();
		DeletePos( rInst, pClassData->nEntries -1 );
		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
		aError = aTmpI.pClass->GetRef( aTmpI, &aId );
		if( aError.IsOk() )
			aError = aTmpI.pClass->SetNumber( aTmpI, rRefId );
	}
	if( aError.IsError() )
		DeletePos( rInst, pClassData->nEntries -1 );
}
else
	aError = ERR_UNKNOWN_METHOD;

	return( aError );
}

/*************************************************************************
|*
|*	  RscBaseCont::IsConsistent()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 23.09.91
|*	  Letzte Aenderung	MM 23.09.91
|*
*************************************************************************/
sal_Bool RscBaseCont::IsConsistent( const RSCINST & rInst, RscInconsList * pList ){
	sal_uInt32	i = 0;
	RscBaseContInst * pClassData;
	sal_Bool	bRet;

	bRet = RscTop::IsConsistent( rInst, pList );

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	// auf doppelten Id Testen und Reihenfolge beibehalten
	// Komplexitaet = n^2 / 2
	for( i = 0; i < pClassData->nEntries; i++ ){
		if( !bNoId ){
			if( (sal_Int32)pClassData->pEntries[ i ].aName > 0x7FFF
			  || (sal_Int32)pClassData->pEntries[ i ].aName < 1 ){
				bRet = sal_False;
				if( pList )
					pList->Insert( new RscInconsistent(
						pClassData->pEntries[ i ].aName,
						pClassData->pEntries[ i ].aName ) );
			}
			else if( SearchElePos( rInst, pClassData->pEntries[ i ].aName,
				pClassData->pEntries[ i ].aInst.pClass, i +1 ).IsInst() )
			{
				 bRet = sal_False;
				 if( pList )
					 pList->Insert( new RscInconsistent(
						 pClassData->pEntries[ i	].aName,
						 pClassData->pEntries[ i +1 ].aName ) );
			 };
		}
		if( ! pClassData->pEntries[ i ].aInst.pClass->
			  IsConsistent( pClassData->pEntries[ i ].aInst, pList ) )
			bRet = sal_False;
	};

	return( bRet );
}

/*************************************************************************
|*
|*	  RscBaseCont::SetToDefault()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 25.04.91
|*	  Letzte Aenderung	MM 25.04.91
|*
*************************************************************************/
void RscBaseCont::SetToDefault( const RSCINST & rInst )
{
	sal_uInt32	i = 0;
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	for( i = 0; i < pClassData->nEntries; i++ )
	{
		pClassData->pEntries[ i ].aInst.pClass->
				  SetToDefault( pClassData->pEntries[ i ].aInst );
	};

	RscTop::SetToDefault( rInst );
}

/*************************************************************************
|*
|*	  RscBaseCont::IsDefault()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 25.04.91
|*	  Letzte Aenderung	MM 25.04.91
|*
*************************************************************************/
sal_Bool RscBaseCont::IsDefault( const RSCINST & rInst ){
	sal_uInt32	i = 0;
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( !pClassData->bDflt )
		return sal_False;

	for( i = 0; i < pClassData->nEntries; i++ ){
		if( ! pClassData->pEntries[ i ].aInst.pClass->
				  IsDefault( pClassData->pEntries[ i ].aInst ) )
		{
			return( sal_False );
		};
	};

	return( RscTop::IsDefault( rInst ) );
}

/*************************************************************************
|*
|*	  RscBaseCont::IsValueDefault()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 25.04.91
|*	  Letzte Aenderung	MM 15.01.92
|*
*************************************************************************/
sal_Bool RscBaseCont::IsValueDefault( const RSCINST & rInst, CLASS_DATA pDef )
{
	RscBaseContInst * pClassData;

	if( !RscTop::IsValueDefault( rInst, pDef ) )
		return sal_False;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( pClassData->nEntries )
		return sal_False;
	else
		return sal_True;
}

/*************************************************************************
|*
|*	  RscBaseCont::Delete()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 12.06.91
|*	  Letzte Aenderung	MM 12.06.91
|*
*************************************************************************/
void RscBaseCont::Delete( const RSCINST & rInst, RscTop * pClass,
						  const RscId & rId )
{
	sal_uInt32	i = 0;
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
	if( !pClass )
		pClass = pTypeClass;

	for( i = 0; i < pClassData->nEntries; i++ ){
		if( pClassData->pEntries[ i ].aName == rId )
			if( pClassData->pEntries[ i ].aInst.pClass == pClass || !pClass ){
				DeletePos( rInst, i );
				return;
			};
	};

}

/*************************************************************************
|*
|*	  RscBaseCont::DeletePos()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 12.06.91
|*	  Letzte Aenderung	MM 12.06.91
|*
*************************************************************************/
void RscBaseCont::DeletePos( const RSCINST & rInst, sal_uInt32 nPos ){
	RscBaseContInst *	pClassData;
	sal_uInt32				i = 0;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	if( nPos < pClassData->nEntries ){
		if( 1 == pClassData->nEntries )
			DestroyElements( pClassData );
		else{
			pClassData->pEntries[ nPos ].Destroy();
			pClassData->nEntries--;
			for( i = nPos; i < pClassData->nEntries; i++ )
				pClassData->pEntries[ i ] = pClassData->pEntries[ i + 1 ];
		};
	};
}

/*************************************************************************
|*
|*	  RscBaseCont::ContWriteSrc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
void RscBaseCont::ContWriteSrc( const RSCINST & rInst, FILE * fOutput,
								RscTypCont * pTC, sal_uInt32 nTab,
								const char * pVarName )
{
	sal_uInt32	i = 0, t = 0;
	RscBaseContInst * pClassData;

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	for( i = 0; i < pClassData->nEntries; i++ )
	{
		for( t = 0; t < nTab; t++ )
			fputc( '\t', fOutput );
		pClassData->pEntries[ i ].aInst.pClass->
				  WriteSrcHeader( pClassData->pEntries[ i ].aInst,
								  fOutput, pTC, nTab,
								  pClassData->pEntries[ i ].aName, pVarName );
		fprintf( fOutput, ";\n" );
	};
}

/*************************************************************************
|*
|*	  RscBaseCont::ContWriteRc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::ContWriteRc( const RSCINST & rInst, RscWriteRc & rMem,
							  RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
{
	sal_uInt32		  i = 0;
	RscBaseContInst * pClassData;
	ERRTYPE 	  aError;

	if( bExtra || bNoId )
	{ // Nur Subresourcen schreiben, wenn bExtra == sal_True
		pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

		for( i = 0; i < pClassData->nEntries && aError.IsOk(); i++ ){
			aError = pClassData->pEntries[ i ].aInst.pClass->
						 WriteRcHeader( pClassData->pEntries[ i ].aInst,
										rMem, pTC,
										pClassData->pEntries[ i ].aName,
										nDeep, bExtra );
		}
	}

	return( aError );
}

//==================================================================
void RscBaseCont::ContWriteRcAccess
(
	FILE * fOutput,
	RscTypCont * pTC,
	const char * pName,
	sal_Bool bWriteSize
)
{
	if( (bNoId || bWriteSize) && !pTypeClass1 )
	{
		fprintf( fOutput, "\t\tsal_uInt32 nItems = *(sal_uInt32 *)(pResData+nOffset) );\n" );
		fprintf( fOutput, "\t\tnOffset += sizeof( sal_uInt32 );\n" );

		fprintf( fOutput, "\t\t// Items hinzufuegen\n" );
		fprintf( fOutput, "\t\tfor( sal_uInt32 i = 0; i < nItems; i++ )\n" );
		fprintf( fOutput, "\t\t{\n" );
		pTypeClass->WriteRcAccess( fOutput, pTC, "Item" );
		fprintf( fOutput, "\t\t}\n" );
	}
	else
	{
		fprintf( fOutput, "\t\tSet%s( %s ", pName, pHS->getString( GetId() ).getStr() );
		fprintf( fOutput, "%s ", aCallPar2.GetBuffer() );
		fprintf( fOutput, "ResId( (RSHEADER_TYPE*)(pResData+nOffset) ) ) );\n" );
		fprintf( fOutput, "\t\tnOffset += GetObjSizeRes( (RSHEADER_TYPE*)(pResData+nOffset) );\n" );
	}
}


/*************************************************************************
|*
|*	  RscBaseCont::WriteSrc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
void RscBaseCont::WriteSrc( const RSCINST & rInst, FILE * fOutput,
							RscTypCont * pTC, sal_uInt32 nTab,
							const char * pVarName )
{
	RscTop::WriteSrc( rInst, fOutput, pTC, nTab, pVarName );
	ContWriteSrc( rInst, fOutput, pTC, nTab, pVarName );
}

/*************************************************************************
|*
|*	  RscBaseCont::WriteRc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
							  RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
{
	ERRTYPE 	  aError;

	aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
	if( aError.IsOk() )
		aError = ContWriteRc( rInst, rMem, pTC, nDeep, bExtra );

	return( aError );
}

/*************************************************************************
|*
|*	  RscBaseCont::WriteHxx()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::WriteHxx( const RSCINST & rInst, FILE * fOutput,
							   RscTypCont * pTC, const RscId & rRscId )
{
	sal_uInt32		  i = 0;
	RscBaseContInst * pClassData;
	ERRTYPE 	  aError;

	aError = RscTop::WriteHxx( rInst, fOutput, pTC, rRscId );

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	for( i = 0; i < pClassData->nEntries && aError.IsOk(); i++ )
	{
		if( pClassData->pEntries[ i ].aName.IsId()
		  && pClassData->pEntries[ i ].aInst.pClass->IsCodeWriteable() )
		{
			aError = pClassData->pEntries[ i ].aInst.pClass->
						 WriteHxx( pClassData->pEntries[ i ].aInst,
								   fOutput, pTC,
								   pClassData->pEntries[ i ].aName );
		}
	};

	return( aError );
}

/*************************************************************************
|*
|*	  RscBaseCont::WriteCxx()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 26.04.91
|*	  Letzte Aenderung	MM 26.04.91
|*
*************************************************************************/
ERRTYPE RscBaseCont::WriteCxx( const RSCINST & rInst, FILE * fOutput,
							   RscTypCont * pTC, const RscId & rRscId )
{
	sal_uInt32		  i = 0;
	RscBaseContInst * pClassData;
	ERRTYPE 	  aError;

	aError = RscTop::WriteCxx( rInst, fOutput, pTC, rRscId );

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	for( i = 0; i < pClassData->nEntries && aError.IsOk(); i++ )
	{
		if( pClassData->pEntries[ i ].aName.IsId()
		  && pClassData->pEntries[ i ].aInst.pClass->IsCodeWriteable() )
		{
			aError = pClassData->pEntries[ i ].aInst.pClass->
						 WriteCxx( pClassData->pEntries[ i ].aInst,
								   fOutput, pTC,
								   pClassData->pEntries[ i ].aName );
		}
	};

	return( aError );
}

/*************** R s c C o n t W r i t e S r c ***************************/
/*************************************************************************
|*
|*	  RscContWriteSrc::RscContWriteSrc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
RscContWriteSrc::RscContWriteSrc( Atom nId, sal_uInt32 nTypeId,
								 RscTop * pSuper, sal_Bool bNoIdent )
				  : RscBaseCont( nId, nTypeId, pSuper, bNoIdent )
{}

/*************************************************************************
|*
|*	  RscContWriteSrc::WriteSrc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
void RscContWriteSrc::WriteSrc( const RSCINST & rInst, FILE * fOutput,
								RscTypCont * pTC, sal_uInt32 nTab,
								const char * pVarName )
{
	sal_uInt32	i;

	RscTop::WriteSrc( rInst, fOutput, pTC, nTab, pVarName );

	fprintf( fOutput, "\n" );
	for( i = 0; i < nTab; i++ )
		fputc( '\t', fOutput );
	fprintf( fOutput, "{\n" );

	ContWriteSrc( rInst, fOutput, pTC, nTab +1, pVarName );

	for( i = 0; i < nTab; i++ )
		fputc( '\t', fOutput );
	fprintf( fOutput, "}" );
}

/*************** R s c C o n t *******************************************/
/*************************************************************************
|*
|*	  RscCont::RscCont()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
RscCont::RscCont( Atom nId, sal_uInt32 nTypeId, RscTop * pSuper, sal_Bool bNoIdent )
			  : RscContWriteSrc( nId, nTypeId, pSuper, bNoIdent )
{}

/*************************************************************************
|*
|*	  RscCont::WriteRc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
ERRTYPE RscCont::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
								 RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
{
	RscBaseContInst * pClassData;
	ERRTYPE aError;

	aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );

	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);

	rMem.Put( pClassData->nEntries );

	if( aError.IsOk() )
		aError = ContWriteRc( rInst, rMem, pTC, nDeep, bExtra );

	return aError;
}

//==================================================================
void RscCont::WriteRcAccess
(
	FILE * fOutput,
	RscTypCont * pTC,
	const char * pName
)
{
	ContWriteRcAccess( fOutput, pTC, pName, sal_True );
}

/*************************************************************************
|*
|*	  RscContExtraData::RscContExtraData()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
RscContExtraData::RscContExtraData( Atom nId, sal_uInt32 nTypeId,
							 RscTop * pSuper, sal_Bool bNoIdent )
					 : RscContWriteSrc( nId, nTypeId, pSuper, bNoIdent )
{}

/*************************************************************************
|*
|*	  RscContExtraData::WriteRc()
|*
|*	  Beschreibung
|*	  Ersterstellung	MM 08.05.91
|*	  Letzte Aenderung	MM 08.05.91
|*
*************************************************************************/
ERRTYPE RscContExtraData::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
							 RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
{
	ERRTYPE aError;

	if( bExtra )
		aError = RscContWriteSrc::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
	else
		aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );

	return aError;
}
