summaryrefslogtreecommitdiff
path: root/rsc/source/parser/rscdb.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'rsc/source/parser/rscdb.cxx')
-rw-r--r--rsc/source/parser/rscdb.cxx1115
1 files changed, 1115 insertions, 0 deletions
diff --git a/rsc/source/parser/rscdb.cxx b/rsc/source/parser/rscdb.cxx
new file mode 100644
index 000000000000..05f7210fd357
--- /dev/null
+++ b/rsc/source/parser/rscdb.cxx
@@ -0,0 +1,1115 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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 <ctype.h> // isdigit(), isalpha()
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <tools/fsys.hxx>
+#include <tools/rc.h>
+#include <tools/isofallback.hxx>
+#include <rtl/strbuf.hxx>
+
+// Programmabhaengige Includes.
+#include <rsctree.hxx>
+#include <rsctop.hxx>
+#include <rscmgr.hxx>
+#include <rscdb.hxx>
+#include <rscrsc.hxx>
+
+using namespace rtl;
+
+/*************************************************************************
+|*
+|* RscTypCont :: RscTypCont
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 22.03.90
+|* Letzte Aenderung MM 27.06.90
+|*
+*************************************************************************/
+RscTypCont :: RscTypCont( RscError * pErrHdl,
+ RSCBYTEORDER_TYPE nOrder,
+ const ByteString & rSearchPath,
+ sal_uInt32 nFlagsP )
+ :
+ nSourceCharSet( RTL_TEXTENCODING_UTF8 ),
+ nByteOrder( nOrder ),
+ aSearchPath( rSearchPath ),
+ aBool( pHS->getID( "BOOL" ), RSC_NOTYPE ),
+ aShort( pHS->getID( "short" ), RSC_NOTYPE ),
+ aUShort( pHS->getID( "USHORT" ), RSC_NOTYPE ),
+ aLong( pHS->getID( "long" ), RSC_NOTYPE ),
+ aEnumLong( pHS->getID( "enum_long" ), RSC_NOTYPE ),
+ aIdUShort( pHS->getID( "IDUSHORT" ), RSC_NOTYPE ),
+ aIdNoZeroUShort( pHS->getID( "IDUSHORT" ), RSC_NOTYPE ),
+ aNoZeroShort( pHS->getID( "NoZeroShort" ), RSC_NOTYPE ),
+ a1to12Short( pHS->getID( "MonthShort" ), RSC_NOTYPE ),
+ a0to23Short( pHS->getID( "HourShort" ), RSC_NOTYPE ),
+ a1to31Short( pHS->getID( "DayShort" ), RSC_NOTYPE ),
+ a0to59Short( pHS->getID( "MinuteShort" ), RSC_NOTYPE ),
+ a0to99Short( pHS->getID( "_0to59Short" ), RSC_NOTYPE ),
+ a0to9999Short( pHS->getID( "YearShort" ), RSC_NOTYPE ),
+ aIdLong( pHS->getID( "IDLONG" ), RSC_NOTYPE ),
+ aString( pHS->getID( "Chars" ), RSC_NOTYPE ),
+ aStringLiteral( pHS->getID( "Chars" ), RSC_NOTYPE ),
+ aWinBits( pHS->getID( "WinBits" ), RSC_NOTYPE ),
+ aLangType(),
+ aLangString( pHS->getID( "Lang_Chars" ), RSC_NOTYPE, &aString, &aLangType ),
+ aLangShort( pHS->getID( "Lang_short" ), RSC_NOTYPE, &aShort, &aLangType ),
+ nAcceleratorType( 0 ),
+ nFlags( nFlagsP )
+{
+ nUniqueId = 256;
+ nPMId = RSC_VERSIONCONTROL +1; //mindestens einen groesser
+ pEH = pErrHdl;
+ Init();
+}
+
+static sal_uInt32 getLangIdAndShortenLocale( RscTypCont* pTypCont,
+ rtl::OString& rLang,
+ rtl::OString& rCountry,
+ rtl::OString& rVariant )
+{
+ rtl::OStringBuffer aLangStr( 64 );
+ aLangStr.append( rLang.toAsciiLowerCase() );
+ if( rCountry.getLength() )
+ {
+ aLangStr.append( '-' );
+ aLangStr.append( rCountry.toAsciiUpperCase() );
+ }
+ if( rVariant.getLength() )
+ {
+ aLangStr.append( '-' );
+ aLangStr.append( rVariant );
+ }
+ rtl::OString aL( aLangStr.makeStringAndClear() );
+ sal_uInt32 nRet = GetLangId( aL );
+ if( nRet == 0 )
+ {
+ pTypCont->AddLanguage( aL );
+ nRet = GetLangId( aL );
+ }
+ if( rVariant.getLength() )
+ rVariant = rtl::OString();
+ else if( rCountry.getLength() )
+ rCountry = rtl::OString();
+ else
+ rLang = rtl::OString();
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, " %s (0x%hx)", aL.getStr(), (int)nRet );
+#endif
+ return nRet;
+}
+
+ByteString RscTypCont::ChangeLanguage( const ByteString& rNewLang )
+{
+ ByteString aRet = aLanguage;
+ aLanguage = rNewLang;
+
+ rtl::OString aLang = aLanguage;
+ rtl::OString aLg, aCountry, aVariant;
+ sal_Int32 nIndex = 0;
+ aLg = aLang.getToken( 0, '-', nIndex );
+ if( nIndex != -1 )
+ aCountry = aLang.getToken( 0, '-', nIndex );
+ if( nIndex != -1 )
+ aVariant = aLang.copy( nIndex );
+
+ bool bAppendEnUsFallback =
+ ! (rNewLang.EqualsIgnoreCaseAscii( "en-US" ) ||
+ rNewLang.EqualsIgnoreCaseAscii( "x-no-translate" ) );
+
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "RscTypCont::ChangeLanguage:" );
+#endif
+ aLangFallbacks.clear();
+
+ do
+ {
+ aLangFallbacks.push_back(getLangIdAndShortenLocale( this, aLg, aCountry, aVariant ) );
+ } while( aLg.getLength() );
+
+ if( bAppendEnUsFallback )
+ {
+ aLg = "en";
+ aCountry = "US";
+ aVariant = rtl::OString();
+ aLangFallbacks.push_back( getLangIdAndShortenLocale( this, aLg, aCountry, aVariant ) );
+ }
+
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "\n" );
+#endif
+
+ return aRet;
+}
+
+Atom RscTypCont::AddLanguage( const char* pLang )
+{
+ return aLangType.AddLanguage( pLang, aNmTb );
+}
+
+
+/*************************************************************************
+|*
+|* RscTypCont :: ~RscTypCont
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 22.03.90
+|* Letzte Aenderung MM 27.06.90
+|*
+*************************************************************************/
+void DestroyNode( RscTop * pRscTop, ObjNode * pObjNode ){
+ if( pObjNode ){
+ DestroyNode( pRscTop, (ObjNode*)pObjNode->Left() );
+ DestroyNode( pRscTop, (ObjNode*)pObjNode->Right() );
+
+ if( pObjNode->GetRscObj() ){
+ pRscTop->Destroy( RSCINST( pRscTop, pObjNode->GetRscObj() ) );
+ rtl_freeMemory( pObjNode->GetRscObj() );
+ }
+ delete pObjNode;
+ };
+}
+
+void DestroySubTrees( RscTop * pRscTop ){
+ if( pRscTop ){
+ DestroySubTrees( (RscTop*)pRscTop->Left() );
+
+ DestroyNode( pRscTop, pRscTop->GetObjNode() );
+
+ DestroySubTrees( (RscTop*)pRscTop->Right() );
+ };
+}
+
+void DestroyTree( RscTop * pRscTop ){
+ if( pRscTop ){
+ DestroyTree( (RscTop*)pRscTop->Left() );
+ DestroyTree( (RscTop*)pRscTop->Right() );
+
+ delete pRscTop;
+ };
+}
+
+void Pre_dtorTree( RscTop * pRscTop ){
+ if( pRscTop ){
+ Pre_dtorTree( (RscTop*)pRscTop->Left() );
+ Pre_dtorTree( (RscTop*)pRscTop->Right() );
+
+ pRscTop->Pre_dtor();
+ };
+}
+
+RscTypCont :: ~RscTypCont(){
+ RscTop * pRscTmp;
+ RscSysEntry * pSysEntry;
+
+ // Alle Unterbaeume loeschen
+ aVersion.pClass->Destroy( aVersion );
+ rtl_freeMemory( aVersion.pData );
+ DestroySubTrees( pRoot );
+
+ // Alle Klassen noch gueltig, jeweilige Instanzen freigeben
+ // BasisTypen
+ pRscTmp = aBaseLst.First();
+ while( pRscTmp ){
+ pRscTmp->Pre_dtor();
+ pRscTmp = aBaseLst.Next();
+ };
+ aBool.Pre_dtor();
+ aShort.Pre_dtor();
+ aUShort.Pre_dtor();
+ aIdUShort.Pre_dtor();
+ aIdNoZeroUShort.Pre_dtor();
+ aNoZeroShort.Pre_dtor();
+ aIdLong.Pre_dtor();
+ aString.Pre_dtor();
+ aWinBits.Pre_dtor();
+ aVersion.pClass->Pre_dtor();
+ // Zusammengesetzte Typen
+ Pre_dtorTree( pRoot );
+
+ // Klassen zerstoeren
+ delete aVersion.pClass;
+ DestroyTree( pRoot );
+
+ while( NULL != (pRscTmp = aBaseLst.Remove()) ){
+ delete pRscTmp;
+ };
+
+ while( NULL != (pSysEntry = aSysLst.Remove()) ){
+ delete pSysEntry;
+ };
+}
+
+void RscTypCont::ClearSysNames()
+{
+ RscSysEntry * pSysEntry;
+ while( NULL != (pSysEntry = aSysLst.Remove()) ){
+ delete pSysEntry;
+ };
+}
+
+//=======================================================================
+RscTop * RscTypCont::SearchType( Atom nId )
+/* [Beschreibung]
+
+ Sucht eine Basistyp nId;
+*/
+{
+ if( nId == InvalidAtom )
+ return NULL;
+
+#define ELSE_IF( a ) \
+ else if( a.GetId() == nId ) \
+ return &a; \
+
+ if( aBool.GetId() == nId )
+ return &aBool;
+ ELSE_IF( aShort )
+ ELSE_IF( aUShort )
+ ELSE_IF( aLong )
+ ELSE_IF( aEnumLong )
+ ELSE_IF( aIdUShort )
+ ELSE_IF( aIdNoZeroUShort )
+ ELSE_IF( aNoZeroShort )
+ ELSE_IF( a1to12Short )
+ ELSE_IF( a0to23Short )
+ ELSE_IF( a1to31Short )
+ ELSE_IF( a0to59Short )
+ ELSE_IF( a0to99Short )
+ ELSE_IF( a0to9999Short )
+ ELSE_IF( aIdLong )
+ ELSE_IF( aString )
+ ELSE_IF( aWinBits )
+ ELSE_IF( aLangType )
+ ELSE_IF( aLangString )
+ ELSE_IF( aLangShort )
+
+ RscTop * pEle = aBaseLst.First();
+ while( pEle )
+ {
+ if( pEle->GetId() == nId )
+ return pEle;
+ pEle = aBaseLst.Next();
+ }
+ return NULL;
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: Search
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 22.03.90
+|* Letzte Aenderung MM 27.06.90
+|*
+*************************************************************************/
+RscTop * RscTypCont :: Search( Atom nRT ){
+ return( (RscTop *)pRoot->Search( nRT ) );
+}
+
+CLASS_DATA RscTypCont :: Search( Atom nRT, const RscId & rId ){
+ ObjNode *pObjNode;
+ RscTop *pRscTop;
+
+ if( NULL != (pRscTop = Search( nRT )) ){
+ if( NULL != (pObjNode = pRscTop->GetObjNode( rId )) ){
+ return( pObjNode->GetRscObj() );
+ }
+ }
+ return( (CLASS_DATA)0 );
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: Delete()
+|*
+|* Beschreibung
+|* Ersterstellung MM 10.07.91
+|* Letzte Aenderung MM 10.07.91
+|*
+*************************************************************************/
+void RscTypCont :: Delete( Atom nRT, const RscId & rId ){
+ ObjNode * pObjNode;
+ RscTop * pRscTop;
+
+ if( NULL != (pRscTop = Search( nRT )) ){
+ if( NULL != (pObjNode = pRscTop->GetObjNode()) ){
+ pObjNode = pObjNode->Search( rId );
+
+ if( pObjNode ){
+ //Objekt aus Baum entfernen
+ pRscTop->pObjBiTree =
+ (ObjNode *)pRscTop->pObjBiTree->Remove( pObjNode );
+
+ if( pObjNode->GetRscObj() ){
+ pRscTop->Destroy( RSCINST( pRscTop,
+ pObjNode->GetRscObj() ) );
+ rtl_freeMemory( pObjNode->GetRscObj() );
+ }
+ delete pObjNode;
+ }
+ }
+ }
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: PutSysName()
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 22.03.90
+|* Letzte Aenderung MM 27.06.90
+|*
+*************************************************************************/
+sal_uInt32 RscTypCont :: PutSysName( sal_uInt32 nRscTyp, char * pFileName,
+ sal_uInt32 nConst, sal_uInt32 nId, BOOL bFirst )
+{
+ RscSysEntry * pSysEntry;
+ BOOL bId1 = FALSE;
+
+ pSysEntry = aSysLst.First();
+ while( pSysEntry )
+ {
+ if( pSysEntry->nKey == 1 )
+ bId1 = TRUE;
+ if( !strcmp( pSysEntry->aFileName.GetBuffer(), pFileName ) )
+ if( pSysEntry->nRscTyp == nRscTyp
+ && pSysEntry->nTyp == nConst
+ && pSysEntry->nRefId == nId )
+ break;
+ pSysEntry = aSysLst.Next();
+ }
+
+ if ( !pSysEntry || (bFirst && !bId1) )
+ {
+ pSysEntry = new RscSysEntry;
+ pSysEntry->nKey = nUniqueId++;
+ pSysEntry->nRscTyp = nRscTyp;
+ pSysEntry->nTyp = nConst;
+ pSysEntry->nRefId = nId;
+ pSysEntry->aFileName = (const char*)pFileName;
+ if( bFirst && !bId1 )
+ {
+ pSysEntry->nKey = 1;
+ aSysLst.Insert( pSysEntry, (ULONG)0 );
+ }
+ else
+ aSysLst.Insert( pSysEntry, LIST_APPEND );
+ }
+
+ return pSysEntry->nKey;
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: WriteInc
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 21.06.90
+|* Letzte Aenderung MM 21.06.90
+|*
+*************************************************************************/
+void RscTypCont :: WriteInc( FILE * fOutput, ULONG lFileKey )
+{
+ RscFile * pFName;
+
+ if( NOFILE_INDEX == lFileKey )
+ {
+ pFName = aFileTab.First();
+ while( pFName )
+ {
+ if( pFName && pFName->IsIncFile() )
+ {
+ fprintf( fOutput, "#include " );
+ fprintf( fOutput, "\"%s\"\n",
+ pFName->aFileName.GetBuffer() );
+ }
+ pFName = aFileTab.Next();
+ }
+ }
+ else
+ {
+ RscDepend * pDep;
+ RscFile * pFile;
+
+ pFName = aFileTab.Get( lFileKey );
+ if( pFName )
+ {
+ pDep = pFName->First();
+ while( pDep )
+ {
+ if( pDep->GetFileKey() != lFileKey )
+ {
+ pFile = aFileTab.GetFile( pDep->GetFileKey() );
+ if( pFile )
+ {
+ fprintf( fOutput, "#include " );
+ fprintf( fOutput, "\"%s\"\n",
+ pFile->aFileName.GetBuffer() );
+ }
+ }
+ pDep = pFName->Next();
+ };
+ };
+ };
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: Methoden die ueber all Knoten laufen
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 22.03.90
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+
+class RscEnumerateObj
+{
+friend class RscEnumerateRef;
+private:
+ ERRTYPE aError; // Enthaelt den ersten Fehler
+ RscTypCont* pTypCont;
+ FILE * fOutput; // AusgabeDatei
+ ULONG lFileKey; // Welche src-Datei
+ RscTop * pClass;
+
+ DECL_LINK( CallBackWriteRc, ObjNode * );
+ DECL_LINK( CallBackWriteSrc, ObjNode * );
+ DECL_LINK( CallBackWriteCxx, ObjNode * );
+ DECL_LINK( CallBackWriteHxx, ObjNode * );
+
+ ERRTYPE WriteRc( RscTop * pCl, ObjNode * pRoot )
+ {
+ pClass = pCl;
+ if( pRoot )
+ pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteRc ) );
+ return aError;
+ }
+ ERRTYPE WriteSrc( RscTop * pCl, ObjNode * pRoot ){
+ pClass = pCl;
+ if( pRoot )
+ pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteSrc ) );
+ return aError;
+ }
+ ERRTYPE WriteCxx( RscTop * pCl, ObjNode * pRoot ){
+ pClass = pCl;
+ if( pRoot )
+ pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteCxx ) );
+ return aError;
+ }
+ ERRTYPE WriteHxx( RscTop * pCl, ObjNode * pRoot ){
+ pClass = pCl;
+ if( pRoot )
+ pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteHxx ) );
+ return aError;
+ }
+public:
+ void WriteRcFile( RscWriteRc & rMem, FILE * fOutput );
+};
+
+/*************************************************************************
+|*
+|* RscEnumerateObj :: CallBackWriteRc
+|*
+|* Beschreibung
+|* Ersterstellung MM 09.12.91
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+IMPL_LINK( RscEnumerateObj, CallBackWriteRc, ObjNode *, pObjNode )
+{
+ RscWriteRc aMem( pTypCont->GetByteOrder() );
+
+ aError = pClass->WriteRcHeader( RSCINST( pClass, pObjNode->GetRscObj() ),
+ aMem, pTypCont,
+ pObjNode->GetRscId(), 0, TRUE );
+ if( aError.IsError() || aError.IsWarning() )
+ pTypCont->pEH->Error( aError, pClass, pObjNode->GetRscId() );
+
+ WriteRcFile( aMem, fOutput );
+ return 0;
+}
+
+/*************************************************************************
+|*
+|* RscEnumerateObj :: CallBackWriteSrc
+|*
+|* Beschreibung
+|* Ersterstellung MM 09.12.91
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+IMPL_LINK_INLINE_START( RscEnumerateObj, CallBackWriteSrc, ObjNode *, pObjNode )
+{
+ if( pObjNode->GetFileKey() == lFileKey ){
+ pClass->WriteSrcHeader( RSCINST( pClass, pObjNode->GetRscObj() ),
+ fOutput, pTypCont, 0,
+ pObjNode->GetRscId(), "" );
+ fprintf( fOutput, ";\n" );
+ }
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateObj, CallBackWriteSrc, ObjNode *, pObjNode )
+
+/*************************************************************************
+|*
+|* RscEnumerateObj :: CallBackWriteCxx
+|*
+|* Beschreibung
+|* Ersterstellung MM 09.12.91
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+IMPL_LINK_INLINE_START( RscEnumerateObj, CallBackWriteCxx, ObjNode *, pObjNode )
+{
+ if( pClass->IsCodeWriteable() && pObjNode->GetFileKey() == lFileKey )
+ aError = pClass->WriteCxxHeader(
+ RSCINST( pClass, pObjNode->GetRscObj() ),
+ fOutput, pTypCont, pObjNode->GetRscId() );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateObj, CallBackWriteCxx, ObjNode *, pObjNode )
+
+/*************************************************************************
+|*
+|* RscEnumerateObj :: CallBackWriteHxx
+|*
+|* Beschreibung
+|* Ersterstellung MM 09.12.91
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+IMPL_LINK_INLINE_START( RscEnumerateObj, CallBackWriteHxx, ObjNode *, pObjNode )
+{
+ if( pClass->IsCodeWriteable() && pObjNode->GetFileKey() == lFileKey )
+ aError = pClass->WriteHxxHeader(
+ RSCINST( pClass, pObjNode->GetRscObj() ),
+ fOutput, pTypCont, pObjNode->GetRscId() );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateObj, CallBackWriteHxx, ObjNode *, pObjNode )
+
+/*************************************************************************
+|*
+|* RscEnumerateObj :: WriteRcFile
+|*
+|* Beschreibung
+|* Ersterstellung MM 09.12.91
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+void RscEnumerateObj :: WriteRcFile( RscWriteRc & rMem, FILE * fOut ){
+ // Definition der Struktur, aus denen die Resource aufgebaut ist
+ /*
+ struct RSHEADER_TYPE{
+ sal_uInt32 nId; // Identifier der Resource
+ sal_uInt32 nRT; // Resource Typ
+ sal_uInt32 nGlobOff; // Globaler Offset
+ sal_uInt32 nLocalOff; // Lokaler Offset
+ } aHeader;
+ */
+
+ sal_uInt32 nId = rMem.GetLong( 0 );
+ sal_uInt32 nRT = rMem.GetLong( 4 );
+
+ // Tabelle wird entsprechend gefuellt
+ pTypCont->PutTranslatorKey( (sal_uInt64(nRT) << 32) + sal_uInt64(nId) );
+
+ if( nRT == RSC_VERSIONCONTROL )
+ { // kommt immmer als letztes
+ INT32 nCount = pTypCont->aIdTranslator.size();
+ // groesse der Tabelle
+ UINT32 nSize = (nCount * (sizeof(sal_uInt64)+sizeof(INT32))) + sizeof(INT32);
+
+ rMem.Put( nCount ); //Anzahl speichern
+ for( std::map< sal_uInt64, ULONG >::const_iterator it =
+ pTypCont->aIdTranslator.begin(); it != pTypCont->aIdTranslator.end(); ++it )
+ {
+ // Schluessel schreiben
+ rMem.Put( it->first );
+ // Objekt Id oder Position schreiben
+ rMem.Put( (INT32)it->second );
+ }
+ rMem.Put( nSize ); // Groesse hinten Speichern
+ }
+
+ //Dateioffset neu setzen
+ pTypCont->IncFilePos( rMem.Size() );
+
+
+ //Position wurde vorher in Tabelle geschrieben
+ fwrite( rMem.GetBuffer(), rMem.Size(), 1, fOut );
+
+};
+
+class RscEnumerateRef
+{
+private:
+ RscTop * pRoot;
+
+ DECL_LINK( CallBackWriteRc, RscTop * );
+ DECL_LINK( CallBackWriteSrc, RscTop * );
+ DECL_LINK( CallBackWriteCxx, RscTop * );
+ DECL_LINK( CallBackWriteHxx, RscTop * );
+ DECL_LINK( CallBackWriteSyntax, RscTop * );
+ DECL_LINK( CallBackWriteRcCtor, RscTop * );
+public:
+ RscEnumerateObj aEnumObj;
+
+ RscEnumerateRef( RscTypCont * pTC, RscTop * pR,
+ FILE * fOutput )
+ {
+ aEnumObj.pTypCont = pTC;
+ aEnumObj.fOutput = fOutput;
+ pRoot = pR;
+ }
+ ERRTYPE WriteRc()
+ {
+ aEnumObj.aError.Clear();
+ pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteRc ) );
+ return aEnumObj.aError;
+ };
+
+ ERRTYPE WriteSrc( ULONG lFileKey )
+ {
+ aEnumObj.lFileKey = lFileKey;
+
+ aEnumObj.aError.Clear();
+ pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteSrc ) );
+ return aEnumObj.aError;
+ }
+
+ ERRTYPE WriteCxx( ULONG lFileKey )
+ {
+ aEnumObj.lFileKey = lFileKey;
+
+ aEnumObj.aError.Clear();
+ pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteCxx ) );
+ return aEnumObj.aError;
+ }
+
+ ERRTYPE WriteHxx( ULONG lFileKey )
+ {
+ aEnumObj.lFileKey = lFileKey;
+
+ aEnumObj.aError.Clear();
+ pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteHxx ) );
+ return aEnumObj.aError;
+ }
+
+ void WriteSyntax()
+ {
+ pRoot->EnumNodes( LINK( this, RscEnumerateRef,
+ CallBackWriteSyntax ) );
+ }
+
+ void WriteRcCtor()
+ {
+ pRoot->EnumNodes( LINK( this, RscEnumerateRef,
+ CallBackWriteRcCtor ) );
+ }
+};
+
+/*************************************************************************
+|*
+|* RscRscEnumerateRef :: CallBack...
+|*
+|* Beschreibung
+|* Ersterstellung MM 09.12.91
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteRc, RscTop *, pRef )
+{
+ aEnumObj.WriteRc( pRef, pRef->GetObjNode() );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteRc, RscTop *, pRef )
+IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteSrc, RscTop *, pRef )
+{
+ aEnumObj.WriteSrc( pRef, pRef->GetObjNode() );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteSrc, RscTop *, pRef )
+IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteCxx, RscTop *, pRef )
+{
+ if( pRef->IsCodeWriteable() )
+ aEnumObj.WriteCxx( pRef, pRef->GetObjNode() );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteCxx, RscTop *, pRef )
+IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteHxx, RscTop *, pRef )
+{
+ if( pRef->IsCodeWriteable() )
+ aEnumObj.WriteHxx( pRef, pRef->GetObjNode() );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteHxx, RscTop *, pRef )
+IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteSyntax, RscTop *, pRef )
+{
+ pRef->WriteSyntaxHeader( aEnumObj.fOutput, aEnumObj.pTypCont );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteSyntax, RscTop *, pRef )
+IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteRcCtor, RscTop *, pRef )
+{
+ pRef->WriteRcCtor( aEnumObj.fOutput, aEnumObj.pTypCont );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteRcCtor, RscTop *, pRef )
+
+/*************************************************************************
+|*
+|* RscTypCont :: WriteRc
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 22.03.90
+|* Letzte Aenderung MM 22.07.91
+|*
+*************************************************************************/
+
+ERRTYPE RscTypCont::WriteRc( WriteRcContext& rContext )
+{
+ ERRTYPE aError;
+ RscEnumerateRef aEnumRef( this, pRoot, rContext.fOutput );
+
+ aIdTranslator.clear();
+ nFilePos = 0;
+ nPMId = RSCVERSION_ID +1; //mindestens einen groesser
+
+ aError = aEnumRef.WriteRc();
+
+ // version control
+ RscWriteRc aMem( nByteOrder );
+ aVersion.pClass->WriteRcHeader( aVersion, aMem, this, RscId( RSCVERSION_ID ), 0, TRUE );
+ aEnumRef.aEnumObj.WriteRcFile( aMem, rContext.fOutput );
+
+ return aError;
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: WriteSrc
+|*
+|* Beschreibung RES.DOC
+|* Ersterstellung MM 22.03.90
+|* Letzte Aenderung MM 27.06.90
+|*
+*************************************************************************/
+void RscTypCont :: WriteSrc( FILE * fOutput, ULONG nFileKey,
+ CharSet /*nCharSet*/, BOOL bName )
+{
+ RscFile * pFName;
+ RscEnumerateRef aEnumRef( this, pRoot, fOutput );
+
+ unsigned char aUTF8BOM[3] = { 0xef, 0xbb, 0xbf };
+ fwrite( aUTF8BOM, sizeof(unsigned char), sizeof(aUTF8BOM)/sizeof(aUTF8BOM[0]), fOutput );
+ if( bName )
+ {
+ WriteInc( fOutput, nFileKey );
+
+ if( NOFILE_INDEX == nFileKey )
+ {
+ pFName = aFileTab.First();
+ while( pFName ){
+ if( !pFName->IsIncFile() )
+ pFName->aDefLst.WriteAll( fOutput );
+ aEnumRef.WriteSrc( aFileTab.GetIndex( pFName ) );
+ pFName = aFileTab.Next();
+ };
+ }
+ else
+ {
+ pFName = aFileTab.Get( nFileKey );
+ if( pFName ){
+ pFName->aDefLst.WriteAll( fOutput );
+ aEnumRef.WriteSrc( nFileKey );
+ }
+ }
+ }
+ else
+ {
+ RscId::SetNames( FALSE );
+ if( NOFILE_INDEX == nFileKey )
+ {
+ pFName = aFileTab.First();
+ while( pFName )
+ {
+ aEnumRef.WriteSrc( aFileTab.GetIndex( pFName ) );
+ pFName = aFileTab.Next();
+ };
+ }
+ else
+ aEnumRef.WriteSrc( nFileKey );
+ RscId::SetNames();
+ };
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: WriteHxx
+|*
+|* Beschreibung
+|* Ersterstellung MM 30.05.91
+|* Letzte Aenderung MM 30.05.91
+|*
+*************************************************************************/
+ERRTYPE RscTypCont :: WriteHxx( FILE * fOutput, ULONG nFileKey )
+{
+ fprintf( fOutput, "#include <tools/rc.hxx>\n" );
+ fprintf( fOutput, "#include <tools/resid.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/accel.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/bitmap.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/button.hxx>\n" );
+ fprintf( fOutput, "#include <tools/color.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/combobox.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/ctrl.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/dialog.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/edit.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/field.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/fixed.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/group.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/image.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/imagebtn.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/keycod.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/lstbox.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/mapmod.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/menu.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/menubtn.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/morebtn.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/msgbox.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/scrbar.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/spin.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/spinfld.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/splitwin.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/status.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/tabctrl.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/tabdlg.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/tabpage.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/toolbox.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/window.hxx>\n" );
+ fprintf( fOutput, "#include <vcl/wrkwin.hxx>\n" );
+ fprintf( fOutput, "#include <svtools/svmedit.hxx>\n" );
+
+ RscEnumerateRef aEnumRef( this, pRoot, fOutput );
+ ERRTYPE aError;
+
+ if( NOFILE_INDEX == nFileKey )
+ {
+ RscFile * pFName;
+
+ pFName = aFileTab.First();
+ while( pFName )
+ {
+ aError = aEnumRef.WriteHxx( aFileTab.GetIndex( pFName ) );
+ pFName = aFileTab.Next();
+ };
+ }
+ else
+ aError = aEnumRef.WriteHxx( nFileKey );
+
+ return aError;
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: WriteCxx
+|*
+|* Beschreibung
+|* Ersterstellung MM 30.05.91
+|* Letzte Aenderung MM 30.05.91
+|*
+*************************************************************************/
+ERRTYPE RscTypCont::WriteCxx( FILE * fOutput, ULONG nFileKey,
+ const ByteString & rHxxName )
+{
+ RscEnumerateRef aEnumRef( this, pRoot, fOutput );
+ ERRTYPE aError;
+ fprintf( fOutput, "#include <string.h>\n" );
+ WriteInc( fOutput, nFileKey );
+ if( rHxxName.Len() )
+ fprintf( fOutput, "#include \"%s\"\n", rHxxName.GetBuffer() );
+ fprintf( fOutput, "\n\n" );
+
+ if( NOFILE_INDEX == nFileKey )
+ {
+ RscFile * pFName;
+
+ pFName = aFileTab.First();
+ while( pFName )
+ {
+ aError = aEnumRef.WriteCxx( aFileTab.GetIndex( pFName ) );
+ pFName = aFileTab.Next();
+ };
+ }
+ else
+ aError = aEnumRef.WriteCxx( nFileKey );
+
+ return aError;
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: WriteSyntax
+|*
+|* Beschreibung
+|* Ersterstellung MM 30.05.91
+|* Letzte Aenderung MM 30.05.91
+|*
+*************************************************************************/
+void RscTypCont::WriteSyntax( FILE * fOutput )
+{
+ for( sal_uInt32 i = 0; i < aBaseLst.Count(); i++ )
+ aBaseLst.GetObject( i )->WriteSyntaxHeader( fOutput, this );
+ RscEnumerateRef aEnumRef( this, pRoot, fOutput );
+ aEnumRef.WriteSyntax();
+}
+
+//=======================================================================
+void RscTypCont::WriteRcCtor
+(
+ FILE * fOutput
+)
+{
+ RscEnumerateRef aEnumRef( this, pRoot, fOutput );
+ aEnumRef.WriteRcCtor();
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: Delete()
+|*
+|* Beschreibung
+|* Ersterstellung MM 09.12.91
+|* Letzte Aenderung MM 09.12.91
+|*
+*************************************************************************/
+class RscDel
+{
+ ULONG lFileKey;
+ DECL_LINK( Delete, RscTop * );
+public:
+ RscDel( RscTop * pRoot, ULONG lKey );
+};
+
+
+inline RscDel::RscDel( RscTop * pRoot, ULONG lKey )
+{
+ lFileKey = lKey;
+ pRoot->EnumNodes( LINK( this, RscDel, Delete ) );
+}
+
+IMPL_LINK_INLINE_START( RscDel, Delete, RscTop *, pNode )
+{
+ if( pNode->GetObjNode() )
+ pNode->pObjBiTree = pNode->GetObjNode()->DelObjNode( pNode, lFileKey );
+ return 0;
+}
+IMPL_LINK_INLINE_END( RscDel, Delete, RscTop *, pNode )
+
+void RscTypCont :: Delete( ULONG lFileKey ){
+ // Resourceinstanzen loeschen
+ RscDel aDel( pRoot, lFileKey );
+ // Defines loeschen
+ aFileTab.DeleteFileContext( lFileKey );
+}
+
+/*************************************************************************
+|*
+|* RscTypCont :: MakeConsistent()
+|*
+|* Beschreibung
+|* Ersterstellung MM 23.09.91
+|* Letzte Aenderung MM 23.09.91
+|*
+*************************************************************************/
+BOOL IsInstConsistent( ObjNode * pObjNode, RscTop * pRscTop,
+ RscInconsList * pList )
+{
+ BOOL bRet = TRUE;
+
+ if( pObjNode ){
+ RSCINST aTmpI;
+
+ if( ! IsInstConsistent( (ObjNode*)pObjNode->Left(), pRscTop, pList ) )
+ bRet = FALSE;
+
+ aTmpI.pClass = pRscTop;
+ aTmpI.pData = pObjNode->GetRscObj();
+ if( ! aTmpI.pClass->IsConsistent( aTmpI, pList ) )
+ bRet = FALSE;
+
+ if( ! IsInstConsistent( (ObjNode*)pObjNode->Right(), pRscTop, pList ) )
+ bRet = FALSE;
+ };
+
+ return( bRet );
+}
+
+BOOL MakeConsistent( RscTop * pRscTop, RscInconsList * pList )
+{
+ BOOL bRet = TRUE;
+
+ if( pRscTop ){
+ if( ! ::MakeConsistent( (RscTop*)pRscTop->Left(), pList ) )
+ bRet = FALSE;
+
+ if( pRscTop->GetObjNode() ){
+ if( ! pRscTop->GetObjNode()->IsConsistent() ){
+ pRscTop->GetObjNode()->OrderTree();
+ if( ! pRscTop->GetObjNode()->IsConsistent( pList ) )
+ bRet = FALSE;
+ }
+ if( ! IsInstConsistent( pRscTop->GetObjNode(), pRscTop, pList ) )
+ bRet = FALSE;
+ }
+
+ if( ! ::MakeConsistent( (RscTop*)pRscTop->Right(), pList ) )
+ bRet = FALSE;
+ };
+
+ return bRet;
+}
+
+BOOL RscTypCont :: MakeConsistent( RscInconsList * pList ){
+ return( ::MakeConsistent( pRoot, pList ) );
+}
+
+sal_uInt32 RscTypCont::PutTranslatorKey( sal_uInt64 nKey )
+{
+ aIdTranslator[ nKey ] = nFilePos;
+ return nPMId++;
+}