blob: 99aa20404ea32d729970127d8fc99297cf0178e1 [file] [log] [blame]
/**************************************************************
*
* 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;
}