LCOV - code coverage report
Current view: top level - rsc/source/parser - rscdb.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 310 0.0 %
Date: 2014-04-14 Functions: 0 36 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <ctype.h>
      21             : #include <stdlib.h>
      22             : #include <stdio.h>
      23             : #include <string.h>
      24             : 
      25             : #include <tools/rc.h>
      26             : #include <i18nlangtag/languagetag.hxx>
      27             : #include <rtl/strbuf.hxx>
      28             : #include <sal/log.hxx>
      29             : #include <sal/macros.h>
      30             : 
      31             : #include <rsctree.hxx>
      32             : #include <rsctop.hxx>
      33             : #include <rscmgr.hxx>
      34             : #include <rscdb.hxx>
      35             : #include <rscrsc.hxx>
      36             : 
      37             : 
      38           0 : RscTypCont :: RscTypCont( RscError * pErrHdl,
      39             :                           RSCBYTEORDER_TYPE nOrder,
      40             :                           const OString& rSearchPath,
      41             :                           sal_uInt32 nFlagsP )
      42             :     : nSourceCharSet( RTL_TEXTENCODING_UTF8 )
      43             :     , nByteOrder( nOrder )
      44             :     , aSearchPath( rSearchPath )
      45             :     , aBool( pHS->getID( "sal_Bool" ), RSC_NOTYPE )
      46             :     , aShort( pHS->getID( "short" ), RSC_NOTYPE )
      47             :     , aUShort( pHS->getID( "sal_uInt16" ), RSC_NOTYPE )
      48             :     , aLong( pHS->getID( "long" ), RSC_NOTYPE )
      49             :     , aEnumLong( pHS->getID( "enum_long" ), RSC_NOTYPE )
      50             :     , aIdUShort( pHS->getID( "IDUSHORT" ), RSC_NOTYPE )
      51             :     , aIdNoZeroUShort( pHS->getID( "IDUSHORT" ), RSC_NOTYPE )
      52             :     , aNoZeroShort( pHS->getID( "NoZeroShort" ), RSC_NOTYPE )
      53             :     , a1to12Short( pHS->getID( "MonthShort" ), RSC_NOTYPE )
      54             :     , a0to23Short( pHS->getID( "HourShort" ), RSC_NOTYPE )
      55             :     , a1to31Short( pHS->getID( "DayShort" ), RSC_NOTYPE )
      56             :     , a0to59Short( pHS->getID( "MinuteShort" ), RSC_NOTYPE )
      57             :     , a0to99Short( pHS->getID( "_0to59Short" ), RSC_NOTYPE )
      58             :     , a0to9999Short( pHS->getID( "YearShort" ), RSC_NOTYPE )
      59             :     , aIdLong( pHS->getID( "IDLONG" ), RSC_NOTYPE )
      60             :     , aString( pHS->getID( "Chars" ), RSC_NOTYPE )
      61             :     , aStringLiteral( pHS->getID( "Chars" ), RSC_NOTYPE )
      62             :     , aWinBits( pHS->getID( "WinBits" ), RSC_NOTYPE )
      63             :     , aLangType()
      64             :     , aLangString( pHS->getID( "Lang_Chars" ), RSC_NOTYPE, &aString, &aLangType )
      65             :     , aLangShort( pHS->getID( "Lang_short" ), RSC_NOTYPE, &aShort, &aLangType )
      66             :     , nAcceleratorType( 0 )
      67           0 :     , nFlags( nFlagsP )
      68             : {
      69           0 :     nUniqueId = 256;
      70           0 :     nPMId = RSC_VERSIONCONTROL +1; //mindestens einen groesser
      71           0 :     pEH = pErrHdl;
      72           0 :     Init();
      73           0 : }
      74             : 
      75           0 : OString RscTypCont::ChangeLanguage(const OString& rNewLang)
      76             : {
      77           0 :     OString aRet = aLanguage;
      78           0 :     aLanguage = rNewLang;
      79             : 
      80           0 :     ::std::vector< OUString > aFallbacks;
      81             : 
      82           0 :     if (rNewLang.isEmpty())
      83           0 :         aFallbacks.push_back( "" );     // do not resolve to SYSTEM (en-US)
      84             :     else
      85           0 :         aFallbacks = LanguageTag( OStringToOUString( rNewLang, RTL_TEXTENCODING_ASCII_US)).getFallbackStrings( true);
      86             : 
      87           0 :     bool bAppendEnUsFallback = ! (rNewLang.equalsIgnoreAsciiCase( "en-US" ) ||
      88           0 :                                   rNewLang.equalsIgnoreAsciiCase( "x-no-translate" ) );
      89           0 :     if (bAppendEnUsFallback)
      90           0 :         aFallbacks.push_back( "en-US");
      91             : 
      92             : #if OSL_DEBUG_LEVEL > 1
      93             :     fprintf( stderr, "RscTypCont::ChangeLanguage: " );
      94             : #endif
      95             : 
      96           0 :     aLangFallbacks.clear();
      97             : 
      98           0 :     for (::std::vector< OUString >::const_iterator it( aFallbacks.begin()); it != aFallbacks.end(); ++it)
      99             :     {
     100           0 :         OString aLang( OUStringToOString( *it, RTL_TEXTENCODING_ASCII_US));
     101           0 :         sal_uInt32 nID = GetLangId( aLang );
     102           0 :         bool bAdd = (nID == 0);
     103           0 :         if ( bAdd )
     104             :         {
     105           0 :             AddLanguage( aLang.getStr() );
     106           0 :             nID = GetLangId( aLang );
     107             :         }
     108             : #if OSL_DEBUG_LEVEL > 1
     109             :         fprintf( stderr, " '%s' (0x%hx) (%s)", aLang.getStr(), (int)nID, (bAdd ? "added" : "exists") );
     110             : #endif
     111           0 :         aLangFallbacks.push_back( nID);
     112           0 :     }
     113             : 
     114             : #if OSL_DEBUG_LEVEL > 1
     115             :     fprintf( stderr, "\n" );
     116             : #endif
     117             : 
     118           0 :     return aRet;
     119             : }
     120             : 
     121           0 : Atom RscTypCont::AddLanguage( const char* pLang )
     122             : {
     123           0 :     return aLangType.AddLanguage( pLang, aNmTb );
     124             : }
     125             : 
     126             : 
     127           0 : void DestroyNode( RscTop * pRscTop, ObjNode * pObjNode )
     128             : {
     129           0 :     if( pObjNode )
     130             :     {
     131           0 :         DestroyNode( pRscTop, (ObjNode*)pObjNode->Left() );
     132           0 :         DestroyNode( pRscTop, (ObjNode*)pObjNode->Right() );
     133             : 
     134           0 :         if( pObjNode->GetRscObj() )
     135             :         {
     136           0 :             pRscTop->Destroy( RSCINST( pRscTop, pObjNode->GetRscObj() ) );
     137           0 :             rtl_freeMemory( pObjNode->GetRscObj() );
     138             :         }
     139           0 :         delete pObjNode;
     140             :     };
     141           0 : }
     142             : 
     143           0 : void DestroySubTrees( RscTop * pRscTop )
     144             : {
     145           0 :     if( pRscTop )
     146             :     {
     147           0 :         DestroySubTrees( (RscTop*)pRscTop->Left() );
     148           0 :         DestroyNode( pRscTop, pRscTop->GetObjNode() );
     149           0 :         DestroySubTrees( (RscTop*)pRscTop->Right() );
     150             :     };
     151           0 : }
     152             : 
     153           0 : void DestroyTree( RscTop * pRscTop )
     154             : {
     155           0 :     if( pRscTop )
     156             :     {
     157           0 :         DestroyTree( (RscTop*)pRscTop->Left() );
     158           0 :         DestroyTree( (RscTop*)pRscTop->Right() );
     159             : 
     160           0 :         delete pRscTop;
     161             :     };
     162           0 : }
     163             : 
     164           0 : void Pre_dtorTree( RscTop * pRscTop )
     165             : {
     166           0 :     if( pRscTop )
     167             :     {
     168           0 :         Pre_dtorTree( (RscTop*)pRscTop->Left() );
     169           0 :         Pre_dtorTree( (RscTop*)pRscTop->Right() );
     170             : 
     171           0 :         pRscTop->Pre_dtor();
     172             :     };
     173           0 : }
     174             : 
     175           0 : RscTypCont :: ~RscTypCont()
     176             : {
     177             :     // Alle Unterbaeume loeschen
     178           0 :     aVersion.pClass->Destroy( aVersion );
     179           0 :     rtl_freeMemory( aVersion.pData );
     180           0 :     DestroySubTrees( pRoot );
     181             : 
     182             :     // Alle Klassen noch gueltig, jeweilige Instanzen freigeben
     183             :     // BasisTypen
     184           0 :     for ( size_t i = 0, n = aBaseLst.size(); i < n; ++i )
     185           0 :         aBaseLst[ i ]->Pre_dtor();
     186             : 
     187           0 :     aBool.Pre_dtor();
     188           0 :     aShort.Pre_dtor();
     189           0 :     aUShort.Pre_dtor();
     190           0 :     aIdUShort.Pre_dtor();
     191           0 :     aIdNoZeroUShort.Pre_dtor();
     192           0 :     aNoZeroShort.Pre_dtor();
     193           0 :     aIdLong.Pre_dtor();
     194           0 :     aString.Pre_dtor();
     195           0 :     aWinBits.Pre_dtor();
     196           0 :     aVersion.pClass->Pre_dtor();
     197             :     // Zusammengesetzte Typen
     198           0 :     Pre_dtorTree( pRoot );
     199             : 
     200             :     // Klassen zerstoeren
     201           0 :     delete aVersion.pClass;
     202           0 :     DestroyTree( pRoot );
     203             : 
     204           0 :     for ( size_t i = 0, n = aBaseLst.size(); i < n; ++i )
     205           0 :         delete aBaseLst[ i ];
     206             : 
     207           0 :     aBaseLst.clear();
     208             : 
     209           0 :     for ( size_t i = 0, n = aSysLst.size(); i < n; ++i )
     210           0 :         delete aSysLst[ i ];
     211             : 
     212           0 :     aSysLst.clear();
     213           0 : }
     214             : 
     215           0 : void RscTypCont::ClearSysNames()
     216             : {
     217           0 :     for ( size_t i = 0, n = aSysLst.size(); i < n; ++i )
     218           0 :         delete aSysLst[ i ];
     219             : 
     220           0 :     aSysLst.clear();
     221           0 : }
     222             : 
     223           0 : RscTop * RscTypCont::SearchType( Atom nId )
     224             : {
     225             :     /*  [Beschreibung]
     226             : 
     227             :         Sucht eine Basistyp nId;
     228             :     */
     229           0 :     if( nId == InvalidAtom )
     230           0 :         return NULL;
     231             : 
     232             : #define ELSE_IF( a )                \
     233             :     else if( a.GetId() == nId ) \
     234             :         return &a;                  \
     235             : 
     236           0 :     if( aBool.GetId() == nId )
     237           0 :         return &aBool;
     238           0 :     ELSE_IF( aShort )
     239           0 :     ELSE_IF( aUShort )
     240           0 :     ELSE_IF( aLong )
     241           0 :     ELSE_IF( aEnumLong )
     242           0 :     ELSE_IF( aIdUShort )
     243           0 :     ELSE_IF( aIdNoZeroUShort )
     244           0 :     ELSE_IF( aNoZeroShort )
     245           0 :     ELSE_IF( a1to12Short )
     246           0 :     ELSE_IF( a0to23Short )
     247           0 :     ELSE_IF( a1to31Short )
     248           0 :     ELSE_IF( a0to59Short )
     249           0 :     ELSE_IF( a0to99Short )
     250           0 :     ELSE_IF( a0to9999Short )
     251           0 :     ELSE_IF( aIdLong )
     252           0 :     ELSE_IF( aString )
     253           0 :     ELSE_IF( aWinBits )
     254           0 :     ELSE_IF( aLangType )
     255           0 :     ELSE_IF( aLangString )
     256           0 :     ELSE_IF( aLangShort )
     257             : // al least to not pollute
     258             : #undef ELSE_IF
     259             : 
     260           0 :     for ( size_t i = 0, n = aBaseLst.size(); i < n; ++i )
     261             :     {
     262           0 :         RscTop* pEle = aBaseLst[ i ];
     263           0 :         if( pEle->GetId() == nId )
     264           0 :             return pEle;
     265             :     }
     266           0 :     return NULL;
     267             : }
     268             : 
     269           0 : sal_uInt32 RscTypCont :: PutSysName( sal_uInt32 nRscTyp, char * pFileName,
     270             :                                      sal_uInt32 nConst, sal_uInt32 nId, bool bFirst )
     271             : {
     272             :     RscSysEntry *pSysEntry;
     273           0 :     RscSysEntry *pFoundEntry = NULL;
     274           0 :     bool            bId1 = false;
     275             : 
     276           0 :     for ( size_t i = 0, n = aSysLst.size(); i < n; ++i )
     277             :     {
     278           0 :         pSysEntry = aSysLst[ i ];
     279           0 :         if( pSysEntry->nKey == 1 )
     280           0 :             bId1 = true;
     281           0 :         if( !strcmp( pSysEntry->aFileName.getStr(), pFileName ) )
     282           0 :             if(  pSysEntry->nRscTyp == nRscTyp &&
     283           0 :                  pSysEntry->nTyp    == nConst &&
     284           0 :                  pSysEntry->nRefId  == nId)
     285             :             {
     286           0 :                 pFoundEntry = pSysEntry;
     287           0 :                 break;
     288             :             }
     289             :     }
     290           0 :     pSysEntry = pFoundEntry;
     291             : 
     292           0 :     if ( !pSysEntry || (bFirst && !bId1) )
     293             :     {
     294           0 :         pSysEntry = new RscSysEntry;
     295           0 :         pSysEntry->nKey = nUniqueId++;
     296           0 :         pSysEntry->nRscTyp = nRscTyp;
     297           0 :         pSysEntry->nTyp = nConst;
     298           0 :         pSysEntry->nRefId = nId;
     299           0 :         pSysEntry->aFileName = (const char*)pFileName;
     300           0 :         if( bFirst && !bId1 )
     301             :         {
     302           0 :             pSysEntry->nKey = 1;
     303           0 :             aSysLst.insert( aSysLst.begin(), pSysEntry );
     304             :         }
     305             :         else
     306           0 :             aSysLst.push_back( pSysEntry );
     307             :     }
     308             : 
     309           0 :     return pSysEntry->nKey;
     310             : }
     311             : 
     312           0 : void RscTypCont :: WriteInc( FILE * fOutput, sal_uLong lFileKey )
     313             : {
     314             : 
     315           0 :     if( NOFILE_INDEX == lFileKey )
     316             :     {
     317           0 :         sal_uIntPtr aIndex = aFileTab.FirstIndex();
     318           0 :         while( aIndex != UNIQUEINDEX_ENTRY_NOTFOUND )
     319             :         {
     320           0 :             RscFile   * pFName = aFileTab.Get( aIndex );
     321           0 :             if( pFName->IsIncFile() )
     322             :             {
     323           0 :                 fprintf( fOutput, "#include " );
     324             :                 fprintf( fOutput, "\"%s\"\n",
     325           0 :                                   pFName->aFileName.getStr() );
     326             :             }
     327           0 :             aIndex = aFileTab.NextIndex( aIndex );
     328             :         }
     329             :     }
     330             :     else
     331             :     {
     332             :         RscDepend *     pDep;
     333             :         RscFile   *     pFile;
     334             : 
     335           0 :         RscFile   *     pFName = aFileTab.Get( lFileKey );
     336           0 :         if( pFName )
     337             :         {
     338           0 :             for ( size_t i = 0, n = pFName->aDepLst.size(); i < n; ++i )
     339             :             {
     340           0 :                 pDep = pFName->aDepLst[ i ];
     341           0 :                 if( pDep->GetFileKey() != lFileKey )
     342             :                 {
     343           0 :                     pFile = aFileTab.GetFile( pDep->GetFileKey() );
     344           0 :                     if( pFile )
     345             :                     {
     346           0 :                         fprintf( fOutput, "#include " );
     347             :                         fprintf( fOutput, "\"%s\"\n",
     348           0 :                                  pFile->aFileName.getStr() );
     349             :                     }
     350             :                 }
     351             :             }
     352             :         }
     353             :     }
     354           0 : }
     355             : 
     356             : 
     357           0 : class RscEnumerateObj
     358             : {
     359             : friend class RscEnumerateRef;
     360             : private:
     361             :     ERRTYPE     aError;     // Enthaelt den ersten Fehler
     362             :     RscTypCont* pTypCont;
     363             :     FILE *      fOutput;    // AusgabeDatei
     364             :     sal_uLong   lFileKey;   // Welche src-Datei
     365             :     RscTop *    pClass;
     366             : 
     367             :     DECL_LINK( CallBackWriteRc, ObjNode * );
     368             :     DECL_LINK( CallBackWriteSrc, ObjNode * );
     369             : 
     370           0 :     ERRTYPE WriteRc( RscTop * pCl, ObjNode * pRoot )
     371             :     {
     372           0 :         pClass = pCl;
     373           0 :         if( pRoot )
     374           0 :             pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteRc ) );
     375           0 :         return aError;
     376             :     }
     377           0 :     ERRTYPE WriteSrc( RscTop * pCl, ObjNode * pRoot ){
     378           0 :         pClass = pCl;
     379           0 :         if( pRoot )
     380           0 :             pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteSrc ) );
     381           0 :         return aError;
     382             :     }
     383             : public:
     384             :     void WriteRcFile( RscWriteRc & rMem, FILE * fOutput );
     385             : };
     386             : 
     387           0 : IMPL_LINK( RscEnumerateObj, CallBackWriteRc, ObjNode *, pObjNode )
     388             : {
     389           0 :     RscWriteRc      aMem( pTypCont->GetByteOrder() );
     390             : 
     391           0 :     aError = pClass->WriteRcHeader( RSCINST( pClass, pObjNode->GetRscObj() ),
     392             :                                      aMem, pTypCont,
     393           0 :                                      pObjNode->GetRscId(), 0, true );
     394           0 :     if( aError.IsError() || aError.IsWarning() )
     395           0 :         pTypCont->pEH->Error( aError, pClass, pObjNode->GetRscId() );
     396             : 
     397           0 :     WriteRcFile( aMem, fOutput );
     398           0 :     return 0;
     399             : }
     400             : 
     401           0 : IMPL_LINK_INLINE_START( RscEnumerateObj, CallBackWriteSrc, ObjNode *, pObjNode )
     402             : {
     403           0 :     if( pObjNode->GetFileKey() == lFileKey )
     404             :     {
     405             :         pClass->WriteSrcHeader( RSCINST( pClass, pObjNode->GetRscObj() ),
     406             :                                 fOutput, pTypCont, 0,
     407           0 :                                 pObjNode->GetRscId(), "" );
     408           0 :         fprintf( fOutput, ";\n" );
     409             :     }
     410           0 :     return 0;
     411             : }
     412           0 : IMPL_LINK_INLINE_END( RscEnumerateObj, CallBackWriteSrc, ObjNode *, pObjNode )
     413             : 
     414           0 : void RscEnumerateObj :: WriteRcFile( RscWriteRc & rMem, FILE * fOut )
     415             : {
     416             :     // Definition der Struktur, aus denen die Resource aufgebaut ist
     417             :     /*
     418             :     struct RSHEADER_TYPE{
     419             :         sal_uInt32          nId;        // Identifier der Resource
     420             :         sal_uInt32          nRT;        // Resource Typ
     421             :         sal_uInt32          nGlobOff;   // Globaler Offset
     422             :         sal_uInt32          nLocalOff;  // Lokaler Offset
     423             :     } aHeader;
     424             :     */
     425             : 
     426           0 :     sal_uInt32 nId = rMem.GetLong( 0 );
     427           0 :     sal_uInt32 nRT = rMem.GetLong( 4 );
     428             : 
     429             :     // Tabelle wird entsprechend gefuellt
     430           0 :     pTypCont->PutTranslatorKey( (sal_uInt64(nRT) << 32) + sal_uInt64(nId) );
     431             : 
     432           0 :     if( nRT == RSC_VERSIONCONTROL )
     433             :     { // kommt immmer als letztes
     434           0 :         sal_Int32 nCount = pTypCont->aIdTranslator.size();
     435             :         // groesse der Tabelle
     436           0 :         sal_uInt32 nSize = (nCount * (sizeof(sal_uInt64)+sizeof(sal_Int32))) + sizeof(sal_Int32);
     437             : 
     438           0 :         rMem.Put( nCount ); //Anzahl speichern
     439           0 :         for( std::map< sal_uInt64, sal_uLong >::const_iterator it =
     440           0 :              pTypCont->aIdTranslator.begin(); it != pTypCont->aIdTranslator.end(); ++it )
     441             :         {
     442             :             // Schluessel schreiben
     443           0 :             rMem.Put( it->first );
     444             :             // Objekt Id oder Position schreiben
     445           0 :             rMem.Put( (sal_Int32)it->second );
     446             :         }
     447           0 :         rMem.Put( nSize ); // Groesse hinten Speichern
     448             :     }
     449             : 
     450             :     //Dateioffset neu setzen
     451           0 :     pTypCont->IncFilePos( rMem.Size() );
     452             : 
     453             : 
     454             :     //Position wurde vorher in Tabelle geschrieben
     455           0 :     bool bSuccess = (1 == fwrite( rMem.GetBuffer(), rMem.Size(), 1, fOut ));
     456             :     SAL_WARN_IF(!bSuccess, "rsc", "short write");
     457           0 : };
     458             : 
     459             : class RscEnumerateRef
     460             : {
     461             : private:
     462             :     RscTop *        pRoot;
     463             : 
     464             :     DECL_LINK( CallBackWriteRc, RscTop * );
     465             :     DECL_LINK( CallBackWriteSrc, RscTop * );
     466             : public:
     467             :     RscEnumerateObj aEnumObj;
     468             : 
     469           0 :     RscEnumerateRef( RscTypCont * pTC, RscTop * pR,
     470             :                      FILE * fOutput )
     471           0 :         {
     472           0 :             aEnumObj.pTypCont = pTC;
     473           0 :             aEnumObj.fOutput  = fOutput;
     474           0 :             pRoot             = pR;
     475           0 :         }
     476           0 :     ERRTYPE WriteRc()
     477             :         {
     478           0 :             aEnumObj.aError.Clear();
     479           0 :             pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteRc ) );
     480           0 :             return aEnumObj.aError;
     481             :         }
     482           0 :     ERRTYPE WriteSrc( sal_uLong lFileKey )
     483             :         {
     484           0 :             aEnumObj.lFileKey = lFileKey;
     485             : 
     486           0 :             aEnumObj.aError.Clear();
     487           0 :             pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteSrc ) );
     488           0 :             return aEnumObj.aError;
     489             :         }
     490             : };
     491             : 
     492           0 : IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteRc, RscTop *, pRef )
     493             : {
     494           0 :     aEnumObj.WriteRc( pRef, pRef->GetObjNode() );
     495           0 :     return 0;
     496             : }
     497           0 : IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteRc, RscTop *, pRef )
     498           0 : IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteSrc, RscTop *, pRef )
     499             : {
     500           0 :     aEnumObj.WriteSrc( pRef, pRef->GetObjNode() );
     501           0 :     return 0;
     502             : }
     503           0 : IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteSrc, RscTop *, pRef )
     504             : 
     505             : 
     506           0 : ERRTYPE RscTypCont::WriteRc( WriteRcContext& rContext )
     507             : {
     508           0 :     ERRTYPE       aError;
     509           0 :     RscEnumerateRef aEnumRef( this, pRoot, rContext.fOutput );
     510             : 
     511           0 :     aIdTranslator.clear();
     512           0 :     nFilePos = 0;
     513           0 :     nPMId = RSCVERSION_ID +1; //mindestens einen groesser
     514             : 
     515           0 :     aError = aEnumRef.WriteRc();
     516             : 
     517             :     // version control
     518           0 :     RscWriteRc aMem( nByteOrder );
     519           0 :     aVersion.pClass->WriteRcHeader( aVersion, aMem, this, RscId( RSCVERSION_ID ), 0, true );
     520           0 :     aEnumRef.aEnumObj.WriteRcFile( aMem, rContext.fOutput );
     521             : 
     522           0 :     return aError;
     523             : }
     524             : 
     525           0 : void RscTypCont :: WriteSrc( FILE * fOutput, sal_uLong nFileKey,
     526             :                              bool bName )
     527             : {
     528             :     RscFile     *   pFName;
     529           0 :     RscEnumerateRef aEnumRef( this, pRoot, fOutput );
     530             : 
     531           0 :     unsigned char aUTF8BOM[3] = { 0xef, 0xbb, 0xbf };
     532           0 :     size_t nItems = SAL_N_ELEMENTS(aUTF8BOM);
     533           0 :     bool bSuccess = (nItems == fwrite(aUTF8BOM, 1, nItems, fOutput));
     534             :     SAL_WARN_IF(!bSuccess, "rsc", "short write");
     535           0 :     if( bName )
     536             :     {
     537           0 :         WriteInc( fOutput, nFileKey );
     538             : 
     539           0 :         if( NOFILE_INDEX == nFileKey )
     540             :         {
     541           0 :             sal_uIntPtr aIndex = aFileTab.FirstIndex();
     542           0 :             while( aIndex != UNIQUEINDEX_ENTRY_NOTFOUND )
     543             :             {
     544           0 :                 pFName = aFileTab.Get( aIndex );
     545           0 :                 if( !pFName->IsIncFile() )
     546           0 :                     pFName->aDefLst.WriteAll( fOutput );
     547           0 :                 aEnumRef.WriteSrc( aIndex );
     548           0 :                 aIndex = aFileTab.NextIndex( aIndex );
     549             :             };
     550             :         }
     551             :         else
     552             :         {
     553           0 :             pFName = aFileTab.Get( nFileKey );
     554           0 :             if( pFName )
     555             :             {
     556           0 :                 pFName->aDefLst.WriteAll( fOutput );
     557           0 :                 aEnumRef.WriteSrc( nFileKey );
     558             :             }
     559             :         }
     560             :     }
     561             :     else
     562             :     {
     563           0 :         RscId::SetNames( false );
     564           0 :         if( NOFILE_INDEX == nFileKey )
     565             :         {
     566           0 :             sal_uIntPtr aIndex = aFileTab.FirstIndex();
     567           0 :             while( aIndex != UNIQUEINDEX_ENTRY_NOTFOUND )
     568             :             {
     569           0 :                 aEnumRef.WriteSrc( aIndex );
     570           0 :                 aIndex = aFileTab.NextIndex( aIndex );
     571             :             };
     572             :         }
     573             :         else
     574           0 :              aEnumRef.WriteSrc( nFileKey );
     575           0 :         RscId::SetNames();
     576             :     };
     577           0 : }
     578             : 
     579             : class RscDel
     580             : {
     581             :     sal_uLong lFileKey;
     582             :     DECL_LINK( Delete, RscTop * );
     583             : public:
     584             :     RscDel( RscTop * pRoot, sal_uLong lKey );
     585             : };
     586             : 
     587             : 
     588           0 : inline RscDel::RscDel( RscTop * pRoot, sal_uLong lKey )
     589             : {
     590           0 :     lFileKey = lKey;
     591           0 :     pRoot->EnumNodes( LINK( this, RscDel, Delete ) );
     592           0 : }
     593             : 
     594           0 : IMPL_LINK_INLINE_START( RscDel, Delete, RscTop *, pNode )
     595             : {
     596           0 :     if( pNode->GetObjNode() )
     597           0 :         pNode->pObjBiTree = pNode->GetObjNode()->DelObjNode( pNode, lFileKey );
     598           0 :     return 0;
     599             : }
     600           0 : IMPL_LINK_INLINE_END( RscDel, Delete, RscTop *, pNode )
     601             : 
     602           0 : void RscTypCont :: Delete( sal_uLong lFileKey )
     603             : {
     604             :     // Resourceinstanzen loeschen
     605           0 :     RscDel aDel( pRoot, lFileKey );
     606             :     // Defines loeschen
     607           0 :     aFileTab.DeleteFileContext( lFileKey );
     608           0 : }
     609             : 
     610           0 : bool IsInstConsistent( ObjNode * pObjNode, RscTop * pRscTop )
     611             : {
     612           0 :     bool bRet = true;
     613             : 
     614           0 :     if( pObjNode )
     615             :     {
     616           0 :         RSCINST aTmpI;
     617             : 
     618           0 :         if( ! IsInstConsistent( (ObjNode*)pObjNode->Left(), pRscTop ) )
     619           0 :             bRet = false;
     620             : 
     621           0 :         aTmpI.pClass = pRscTop;
     622           0 :         aTmpI.pData = pObjNode->GetRscObj();
     623           0 :         if( ! aTmpI.pClass->IsConsistent( aTmpI ) )
     624           0 :             bRet = false;
     625             : 
     626           0 :         if( ! IsInstConsistent( (ObjNode*)pObjNode->Right(), pRscTop ) )
     627           0 :             bRet = false;
     628             :     };
     629             : 
     630           0 :     return bRet;
     631             : }
     632             : 
     633           0 : bool MakeConsistent( RscTop * pRscTop )
     634             : {
     635           0 :     bool bRet = true;
     636             : 
     637           0 :     if( pRscTop )
     638             :     {
     639           0 :         if( ! ::MakeConsistent( (RscTop*)pRscTop->Left() ) )
     640           0 :             bRet = false;
     641             : 
     642           0 :         if( pRscTop->GetObjNode() )
     643             :         {
     644           0 :             if( ! pRscTop->GetObjNode()->IsConsistent() )
     645             :             {
     646           0 :                 pRscTop->GetObjNode()->OrderTree();
     647           0 :                 if( ! pRscTop->GetObjNode()->IsConsistent() )
     648           0 :                     bRet = false;
     649             :             }
     650           0 :             if( ! IsInstConsistent( pRscTop->GetObjNode(), pRscTop ) )
     651           0 :                 bRet = false;
     652             :         }
     653             : 
     654           0 :         if( ! ::MakeConsistent( (RscTop*)pRscTop->Right() ) )
     655           0 :             bRet = false;
     656             :     };
     657             : 
     658           0 :     return bRet;
     659             : }
     660             : 
     661           0 : sal_uInt32 RscTypCont::PutTranslatorKey( sal_uInt64 nKey )
     662             : {
     663           0 :     aIdTranslator[ nKey ] = nFilePos;
     664           0 :     return nPMId++;
     665             : }
     666             : 
     667             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10