summaryrefslogtreecommitdiff
path: root/rsc/source/res/rscmgr.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'rsc/source/res/rscmgr.cxx')
-rw-r--r--rsc/source/res/rscmgr.cxx778
1 files changed, 778 insertions, 0 deletions
diff --git a/rsc/source/res/rscmgr.cxx b/rsc/source/res/rscmgr.cxx
new file mode 100644
index 000000000000..4ad36873727f
--- /dev/null
+++ b/rsc/source/res/rscmgr.cxx
@@ -0,0 +1,778 @@
+/*************************************************************************
+ *
+ * $RCSfile: rscmgr.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:42:56 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (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.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+/************************************************************************
+
+ Source Code Control System - Header
+
+ $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/rsc/source/res/rscmgr.cxx,v 1.1.1.1 2000-09-18 16:42:56 hr Exp $
+
+ Source Code Control System - Update
+
+ $Log: not supported by cvs2svn $
+ Revision 1.21 2000/09/17 12:51:11 willem.vandorp
+ OpenOffice header added.
+
+ Revision 1.20 2000/07/26 17:13:22 willem.vandorp
+ Headers/footers replaced
+
+ Revision 1.19 2000/07/12 11:38:32 th
+ Unicode
+
+ Revision 1.18 1999/09/20 17:26:04 pl
+ PutAt with short
+
+ Revision 1.17 1999/09/08 09:24:59 mm
+ BigEndian/LittleEndian komplett durchgezogen
+
+**************************************************************************/
+/****************** I N C L U D E S **************************************/
+
+// C and C++ Includes.
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+// Programmabhaengige Includes.
+#ifndef _RSCMGR_HXX
+#include <rscmgr.hxx>
+#endif
+#ifndef _RSCDB_HXX
+#include <rscdb.hxx>
+#endif
+
+/****************** C O D E **********************************************/
+/****************** R s c M g r ******************************************/
+/*************************************************************************
+|*
+|* RscMgr::RscMgr()
+|*
+|* Beschreibung
+|* Ersterstellung MM 26.04.91
+|* Letzte Aenderung MM 26.04.91
+|*
+*************************************************************************/
+RscMgr::RscMgr( HASHID nId, USHORT nTypeId, RscTop * pSuperCl )
+ : RscClass( nId, nTypeId, pSuperCl )
+{
+}
+
+/*************************************************************************
+|*
+|* RscMgr::Size()
+|*
+|* Beschreibung
+|* Ersterstellung MM 26.04.91
+|* Letzte Aenderung MM 26.04.91
+|*
+*************************************************************************/
+USHORT RscMgr::Size()
+{
+ return RscClass::Size() + ALIGNED_SIZE( sizeof( RscMgrInst ) );
+}
+
+/*************************************************************************
+|*
+|* RscMgr::Create()
+|*
+|* Beschreibung
+|* Ersterstellung MM 03.04.91
+|* Letzte Aenderung MM 03.04.91
+|*
+*************************************************************************/
+RSCINST RscMgr::Create( RSCINST * pInst, const RSCINST & rDflt, BOOL bOwnClass ){
+ RSCINST aInst;
+ RscMgrInst * pClassData;
+
+ if( !pInst ){
+ aInst.pClass = this;
+ aInst.pData = (CLASS_DATA) RscMem::Malloc( Size() );
+ }
+ else
+ aInst = *pInst;
+ if( !bOwnClass && rDflt.IsInst() )
+ bOwnClass = rDflt.pClass->InHierarchy( this );
+
+ RscClass::Create( &aInst, rDflt, bOwnClass );
+
+ pClassData = (RscMgrInst *)(aInst.pData + RscClass::Size() );
+ pClassData->Create();
+
+ if( bOwnClass ){
+ RscMgrInst * pDfltData = (RscMgrInst *)(rDflt.pData + RscClass::Size());
+ *pClassData = *pDfltData;
+ };
+
+ return( aInst );
+}
+
+/*************************************************************************
+|*
+|* RscMgr::Destroy()
+|*
+|* Beschreibung
+|* Ersterstellung MM 21.06.91
+|* Letzte Aenderung MM 21.06.91
+|*
+*************************************************************************/
+void RscMgr::Destroy( const RSCINST & rInst ){
+ RscMgrInst * pClassData;
+
+ RscClass::Destroy( rInst );
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+ pClassData->Destroy();
+}
+
+/*************************************************************************
+|*
+|* RscMgr::SetToDefault()
+|*
+|* Beschreibung
+|* Ersterstellung MM 12.06.91
+|* Letzte Aenderung MM 12.06.91
+|*
+*************************************************************************/
+void RscMgr::SetToDefault( const RSCINST & rInst )
+{
+ RscMgrInst * pClassData;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+ pClassData->bDflt = TRUE;
+
+ RscClass::SetToDefault( rInst );
+}
+
+/*************************************************************************
+|*
+|* RscMgr::IsDefault()
+|*
+|* Beschreibung
+|* Ersterstellung MM 12.06.91
+|* Letzte Aenderung MM 12.06.91
+|*
+*************************************************************************/
+BOOL RscMgr::IsDefault( const RSCINST & rInst ){
+ RscMgrInst * pClassData;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+ if( !pClassData->bDflt )
+ return( FALSE );
+
+ return( RscClass::IsDefault( rInst ) );
+}
+
+/*************************************************************************
+|*
+|* RscMgr::IsValueDefault()
+|*
+|* Beschreibung
+|* Ersterstellung MM 12.06.91
+|* Letzte Aenderung MM 12.06.91
+|*
+*************************************************************************/
+BOOL RscMgr::IsValueDefault( const RSCINST & rInst, CLASS_DATA pDef ){
+ RscMgrInst * pClassData;
+ RscMgrInst * pDfltData;
+
+ if( !RscClass::IsValueDefault( rInst, pDef ) )
+ return FALSE;
+
+ if( pDef ){
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+ pDfltData = (RscMgrInst *)(pDef + RscClass::Size());
+
+ if( !pClassData->aRefId.IsId() && !pDfltData->aRefId.IsId() ){
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
+/*************************************************************************
+|*
+|* RscMgr::WriteSrcHeader()
+|*
+|* Beschreibung
+|* Ersterstellung MM 08.04.91
+|* Letzte Aenderung MM 08.04.91
+|*
+*************************************************************************/
+void RscMgr::WriteSrcHeader( const RSCINST & rInst, FILE * fOutput,
+ RscTypCont * pTC, USHORT nTab,
+ const RscId & rId, const char * pVarName )
+{
+ RscMgrInst * pClassData;
+ USHORT i;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+
+ fprintf( fOutput, "%s %s",
+ pHS->Get( rInst.pClass->GetId() ),
+ (rId.GetName()).GetBuffer() );
+ if( pClassData->aRefId.IsId() )
+ fprintf( fOutput, ",%s", pClassData->aRefId.GetName().GetBuffer() );
+ else
+ {
+ fprintf( fOutput, "\n" );
+ for( i = 0; i < nTab; i++ )
+ fputc( '\t', fOutput );
+ fprintf( fOutput, "{\n" );
+
+ rInst.pClass->WriteSrc( rInst, fOutput, pTC, nTab +1, pVarName );
+
+ RscClass::WriteSrc( rInst, fOutput, pTC, nTab +1, pVarName);
+
+ for( i = 0; i < nTab; i++ )
+ fputc( '\t', fOutput );
+ fprintf( fOutput, "}" );
+ }
+}
+
+/*************************************************************************
+|*
+|* RscMgr::WriteSrc()
+|*
+|* Beschreibung
+|* Ersterstellung MM 08.04.91
+|* Letzte Aenderung MM 08.04.91
+|*
+*************************************************************************/
+void RscMgr::WriteSrc( const RSCINST &, FILE *, RscTypCont *, USHORT,
+ const char * )
+{
+}
+
+/*************************************************************************
+|*
+|* RscMgr::WriteRcHeader()
+|*
+|* Beschreibung
+|* Ersterstellung MM 15.04.91
+|* Letzte Aenderung MM 15.04.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::WriteRcHeader( const RSCINST & rInst, RscWriteRc & rMem,
+ RscTypCont * pTC, const RscId &rId,
+ USHORT nDeep, BOOL bExtra )
+{
+ RscMgrInst * pClassData;
+ ERRTYPE aError;
+ ObjNode * pObjNode = NULL;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+
+ if( pClassData->aRefId.IsId() )
+ {
+ //Erhoehen und abfragen um Endlosrekusion zu vermeiden
+ nDeep++;
+ if( nDeep > nRefDeep )
+ aError = ERR_REFTODEEP;
+ else
+ pObjNode = rInst.pClass->GetRefClass()->
+ GetObjNode( pClassData->aRefId );
+ if( !pObjNode && pTC )
+ {
+ ByteString aMsg( pHS->Get( rInst.pClass->GetId() ) );
+ aMsg += ' ';
+ aMsg += pClassData->aRefId.GetName();
+ aError = WRN_MGR_REFNOTFOUND;
+ pTC->pEH->Error( aError, rInst.pClass, rId, aMsg.GetBuffer() );
+ }
+ }
+
+ if( aError.IsOk() )
+ {
+ if( pObjNode )
+ {
+ RSCINST aRefI;
+ RscTop * pTmpRefClass = rInst.pClass->GetRefClass();
+
+ aRefI = RSCINST( rInst.pClass, pObjNode->GetRscObj() );
+ if( pTmpRefClass == rInst.pClass )
+ {
+ aError = aRefI.pClass->WriteRcHeader( aRefI, rMem, pTC,
+ rId, nDeep, bExtra );
+ }
+ else
+ {
+ RSCINST aRefInst = rInst.pClass->Create( NULL, aRefI );
+ aError = aRefI.pClass->WriteRcHeader( aRefInst, rMem, pTC,
+ rId, nDeep, bExtra );
+ pTmpRefClass->Destroy( aRefInst );
+ }
+ }
+ else
+ {
+ USHORT nOldSize;
+ USHORT nLocalSize;
+
+ nOldSize = rMem.IncSize( 8 /*sizeof( RSHEADER_TYPE )*/ );
+
+ aError = rInst.pClass->WriteRc( rInst, rMem, pTC, nDeep, bExtra );
+ if( aError.IsOk() )
+ aError = WriteInstRc( rInst, rMem, pTC, nDeep, bExtra );
+ nLocalSize = rMem.Size();
+
+ if( aError.IsOk() )
+ {
+ // RscClass wird uebersprungen
+ aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
+ };
+
+ /*
+ // Definition der Struktur, aus denen die Resource aufgebaut ist
+ struct RSHEADER_TYPE{
+ RESOURCE_TYPE nRT; // Resource Typ
+ USHORT nRT; // Resource Typ
+ USHORT nGlobOff; // Globaler Offset
+ USHORT nLocalOff; // Lokaler Offset
+ };
+ */
+ USHORT nID = rId;
+ rMem.PutAt( nOldSize, nID );
+ rMem.PutAt( nOldSize +2, (USHORT)rInst.pClass->GetTypId() );
+ rMem.PutAt( nOldSize +4, (USHORT)(rMem.Size() - nOldSize) );
+ rMem.PutAt( nOldSize +6, (USHORT)(nLocalSize - nOldSize) );
+ };
+ };
+
+ return( aError );
+}
+
+/*************************************************************************
+|*
+|* RscMgr::WriteRc()
+|*
+|* Beschreibung
+|* Ersterstellung MM 26.04.91
+|* Letzte Aenderung MM 26.04.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::WriteRc( const RSCINST &, RscWriteRc &,
+ RscTypCont *, USHORT, BOOL )
+
+{
+ return( ERR_OK );
+}
+
+
+static ByteString MakeSmartName( const ByteString & rDefName )
+{
+ ByteString aSmartName;
+ if( rDefName.Len() )
+ {
+ char * pStr = (char *)rDefName.GetBuffer();
+ aSmartName = (char)toupper( *pStr );
+ while( *++pStr )
+ {
+ if( '_' == *pStr )
+ {
+ if( *++pStr )
+ aSmartName += (char)toupper( *pStr );
+ else
+ break;
+ }
+ else
+ aSmartName += (char)tolower( *pStr );
+ }
+ }
+ return aSmartName;
+}
+
+static ByteString MakeName( RscTypCont * pTypCon, RscTop * pClass,
+ const ByteString & rName )
+{
+ ByteString aRet;
+ if( !pTypCon->IsSmart() || isdigit( rName.GetChar(0) ) )
+ {
+ aRet += pHS->Get( pClass->GetId() );
+ aRet += rName;
+ }
+ else
+ aRet += MakeSmartName( rName );
+ return aRet;
+}
+
+/*************************************************************************
+|*
+|* RscMgr::WriteHxxHeader()
+|*
+|* Beschreibung
+|* Ersterstellung MM 29.05.91
+|* Letzte Aenderung MM 29.05.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::WriteHxxHeader( const RSCINST & rInst, FILE * fOutput,
+ RscTypCont * pTC, const RscId &rId )
+{
+ RscMgrInst * pClassData;
+ ERRTYPE aError;
+ ObjNode * pObjNode = NULL;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+
+ if( pClassData->aRefId.IsId() )
+ {
+ pObjNode = rInst.pClass->GetObjNode( pClassData->aRefId );
+ if( !pObjNode && pTC )
+ {
+ ByteString aMsg( pHS->Get( rInst.pClass->GetId() ) );
+ aMsg += ' ';
+ aMsg += pClassData->aRefId.GetName();
+ aError = WRN_MGR_REFNOTFOUND;
+ pTC->pEH->Error( aError, rInst.pClass, rId, aMsg.GetBuffer() );
+ }
+ }
+
+ if( pObjNode )
+ {
+ RSCINST aRefI;
+
+ aRefI = RSCINST( rInst.pClass, pObjNode->GetRscObj() );
+ aError = aRefI.pClass->WriteHxxHeader( aRefI, fOutput, pTC,
+ rId );
+ }
+ else
+ {
+ fprintf( fOutput, "class %s",
+ MakeName( pTC, rInst.pClass,
+ rId.GetName() ).GetBuffer() );
+ fprintf( fOutput, " : public %s",
+ pHS->Get( rInst.pClass->GetId() ) );
+ fprintf( fOutput, "\n{\nprotected:\n" );
+
+ aError = RscClass::WriteHxx( rInst, fOutput, pTC, rId );
+
+ RSCINST aExtraInst = rInst.pClass->GetCopyVar( rInst, nRsc_EXTRADATA );
+ if( aExtraInst.IsInst() )
+ {
+ if( aExtraInst.pClass->GetCount( aExtraInst ) )
+ fprintf( fOutput, " char * pExtraData;\n" );
+ }
+ if( aError.IsOk() )
+ {
+ fprintf( fOutput, "public:\n " );
+ fprintf( fOutput, "%s%s bFreeRes = TRUE )",
+ MakeName( pTC, rInst.pClass,
+ rId.GetName() ).GetBuffer(),
+ (rInst.pClass->aCallParType).GetBuffer() );
+ fprintf( fOutput, ";\n};\n\n" );
+ }
+ };
+ return aError;
+}
+
+/*************************************************************************
+|*
+|* RscMgr::WriteHxx()
+|*
+|* Beschreibung
+|* Ersterstellung MM 29.05.91
+|* Letzte Aenderung MM 29.05.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::WriteHxx( const RSCINST & rInst, FILE * fOutput,
+ RscTypCont * pTC, const RscId & rId )
+{
+ fprintf( fOutput, " %s", pHS->Get( rInst.pClass->GetId() ) );
+ fprintf( fOutput, " a%s;\n",
+ MakeName( pTC, rInst.pClass, rId.GetName() ).GetBuffer() );
+
+ return ERR_OK;
+}
+
+/*************************************************************************
+|*
+|* RscClass::WriteCxxHeader()
+|*
+|* Beschreibung
+|* Ersterstellung MM 29.05.91
+|* Letzte Aenderung MM 29.05.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::WriteCxxHeader( const RSCINST & rInst, FILE * fOutput,
+ RscTypCont * pTC, const RscId & rId )
+{
+ RscMgrInst * pClassData;
+ ERRTYPE aError;
+ ObjNode * pObjNode = NULL;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+
+ if( pClassData->aRefId.IsId() )
+ {
+ pObjNode = rInst.pClass->GetObjNode( pClassData->aRefId );
+ if( !pObjNode && pTC )
+ {
+ ByteString aMsg( pHS->Get( rInst.pClass->GetId() ) );
+ aMsg += ' ';
+ aMsg += pClassData->aRefId.GetName();
+ aError = WRN_MGR_REFNOTFOUND;
+ pTC->pEH->Error( aError, rInst.pClass, rId, aMsg.GetBuffer() );
+ }
+ }
+
+ if( pObjNode )
+ {
+ RSCINST aRefI;
+
+ aRefI = RSCINST( rInst.pClass, pObjNode->GetRscObj() );
+ aError = aRefI.pClass->WriteCxxHeader( aRefI, fOutput, pTC,
+ rId );
+ }
+ else
+ {
+ fprintf( fOutput, "%s::%s",
+ MakeName( pTC, rInst.pClass, rId.GetName() ).GetBuffer(),
+ MakeName( pTC, rInst.pClass, rId.GetName() ).GetBuffer() );
+ fprintf( fOutput, "%s", (rInst.pClass->aCallParType).GetBuffer() );
+ if( GetCount( rInst ) )
+ fprintf( fOutput, " bFreeRes" );
+ fprintf( fOutput, " )\n : %s", pHS->Get( rInst.pClass->GetId() ) );
+ fprintf( fOutput, "%s", (rInst.pClass->aCallPar1).GetBuffer() );
+ fprintf( fOutput, " rResId )" );
+
+ aError = RscClass::WriteCxx( rInst, fOutput, pTC, rId );
+
+ fprintf( fOutput, "\n{\n" );
+ RSCINST aExtraInst = rInst.pClass->GetCopyVar( rInst, nRsc_EXTRADATA );
+ if( aExtraInst.IsInst() )
+ {
+ if( aExtraInst.pClass->GetCount( aExtraInst ) )
+ {
+ fprintf( fOutput, " //read extra data\n" );
+ fprintf( fOutput, " pExtraData = new char "
+ "[ GetRemainSizeRes() ];\n" );
+ fprintf( fOutput, " memcpy( pExtraData, "
+ "GetClassRes(), GetRemainSizeRes() );\n" );
+ fprintf( fOutput, " IncrementRes( GetRemainSizeRes() );\n" );
+ }
+ }
+
+ if( GetCount( rInst ) )
+ { // Es gibt UnterResourcen
+ fprintf( fOutput, " if( bFreeRes ) FreeResource();\n" );
+ }
+ else
+ {
+ fprintf( fOutput,
+ " // No subresources, automatic free resource\n" );
+ }
+ fprintf( fOutput, "}\n\n" );
+ }
+ return aError;
+}
+
+/*************************************************************************
+|*
+|* RscClass::WriteCxx()
+|*
+|* Beschreibung
+|* Ersterstellung MM 29.05.91
+|* Letzte Aenderung MM 29.05.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::WriteCxx( const RSCINST & rInst, FILE * fOutput,
+ RscTypCont * pTC, const RscId & rId )
+{
+ const char * pName = rId.GetName().GetBuffer();
+ fprintf( fOutput, ",\n a%s",
+ MakeName( pTC, rInst.pClass, rId.GetName() ).GetBuffer() );
+ fprintf( fOutput, "%s", (rInst.pClass->aCallPar2).GetBuffer() );
+ fprintf( fOutput, " ResId( %s ) )", (rId.GetName()).GetBuffer() );
+
+ return ERR_OK;
+}
+
+/*************************************************************************
+|*
+|* RscArray::IsConsistent()
+|*
+|* Beschreibung
+|* Ersterstellung MM 23.09.91
+|* Letzte Aenderung MM 23.09.91
+|*
+*************************************************************************/
+BOOL RscMgr::IsConsistent( const RSCINST & rInst, RscInconsList * pList )
+{
+ BOOL bRet;
+ RscMgrInst * pClassData;
+
+ bRet = RscClass::IsConsistent( rInst, pList );
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+ if( pClassData->aRefId.IsId() &&
+ ((pClassData->aRefId.GetNumber() < 1)
+ || (pClassData->aRefId.GetNumber() > 0x7FFF)
+ || IsToDeep( rInst ).IsError()) )
+ {
+ if( pList )
+ pList->Insert(
+ new RscInconsistent( pClassData->aRefId,
+ pClassData->aRefId ) );
+ bRet = FALSE;
+ }
+
+ return( bRet );
+}
+
+/*************************************************************************
+|*
+|* RscMgr::GetRef()
+|*
+|* Beschreibung
+|* Ersterstellung MM 15.05.91
+|* Letzte Aenderung MM 15.05.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::GetRef( const RSCINST & rInst, RscId * pRscId ){
+ RscMgrInst * pClassData;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+ *pRscId = pClassData->aRefId;
+ return ERR_OK;
+}
+
+/*************************************************************************
+|*
+|* RscMgr::IsToDeep()
+|*
+|* Beschreibung
+|* Ersterstellung MM 15.05.91
+|* Letzte Aenderung MM 15.05.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::IsToDeep( const RSCINST & rInst, USHORT nDeep )
+{
+ RscMgrInst * pClassData;
+ RscId aOldId, aId;
+ ERRTYPE aError;
+ RSCINST aTmpI = rInst;
+ ObjNode * pObjNode;
+
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+
+ while( aTmpI.IsInst() && (nDeep < nRefDeep) && aError.IsOk() )
+ {
+ // Referenz holen
+ aTmpI.pClass->GetRef( aTmpI, &aId );
+ // Referenziertes Objekt holen
+ pObjNode = aTmpI.pClass->GetObjNode( aId );
+ // Referenzierte Objekt gefunden ?
+ if( pObjNode )
+ {
+ aTmpI.pData = pObjNode->GetRscObj();
+ nDeep++;
+ }
+ else //aTmpI.IsInst() wird FALSE, Schleife beenden
+ aTmpI.pData = NULL;
+ }
+
+ if( nDeep >= nRefDeep )
+ {
+ pClassData->aRefId = aOldId;
+ aError = ERR_REFTODEEP;
+ }
+
+ return( aError );
+}
+
+/*************************************************************************
+|*
+|* RscMgr::SetRef()
+|*
+|* Beschreibung
+|* Ersterstellung MM 15.05.91
+|* Letzte Aenderung MM 15.05.91
+|*
+*************************************************************************/
+ERRTYPE RscMgr::SetRef( const RSCINST & rInst, const RscId & rRefId )
+{
+ RscMgrInst * pClassData;
+ RscId aOldId, aId;
+ ERRTYPE aError;
+ RSCINST aTmpI = rInst;
+
+ if( rRefId.IsId() &&
+ ((rRefId.GetNumber() < 1) || (rRefId.GetNumber() > 0x7FFF)) )
+ {
+ aError = ERR_IDRANGE;
+ }
+ else
+ {
+ pClassData = (RscMgrInst *)(rInst.pData + RscClass::Size());
+ aOldId = pClassData->aRefId;// Alten Wert merken
+ pClassData->aRefId = rRefId;// vorher eintragen,
+ // sonst Fehler bei rekursion
+
+
+ aError = IsToDeep( rInst );
+ if( aError.IsOk() )
+ pClassData->bDflt = FALSE;
+ else
+ pClassData->aRefId = aOldId;
+ }
+
+ return( aError );
+}