LCOV - code coverage report
Current view: top level - rsc/source/parser - rscdb.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 208 310 67.1 %
Date: 2014-11-03 Functions: 31 36 86.1 %
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         419 : 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         419 :     , nFlags( nFlagsP )
      68             : {
      69         419 :     nUniqueId = 256;
      70         419 :     nPMId = RSC_VERSIONCONTROL +1; //mindestens einen groesser
      71         419 :     pEH = pErrHdl;
      72         419 :     Init();
      73         419 : }
      74             : 
      75          56 : OString RscTypCont::ChangeLanguage(const OString& rNewLang)
      76             : {
      77          56 :     OString aRet = aLanguage;
      78          56 :     aLanguage = rNewLang;
      79             : 
      80         112 :     ::std::vector< OUString > aFallbacks;
      81             : 
      82          56 :     if (rNewLang.isEmpty())
      83           0 :         aFallbacks.push_back( "" );     // do not resolve to SYSTEM (en-US)
      84             :     else
      85          56 :         aFallbacks = LanguageTag( OStringToOUString( rNewLang, RTL_TEXTENCODING_ASCII_US)).getFallbackStrings( true);
      86             : 
      87          56 :     bool bAppendEnUsFallback = ! (rNewLang.equalsIgnoreAsciiCase( "en-US" ) ||
      88          56 :                                   rNewLang.equalsIgnoreAsciiCase( "x-no-translate" ) );
      89          56 :     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          56 :     aLangFallbacks.clear();
      97             : 
      98         168 :     for (::std::vector< OUString >::const_iterator it( aFallbacks.begin()); it != aFallbacks.end(); ++it)
      99             :     {
     100         112 :         OString aLang( OUStringToOString( *it, RTL_TEXTENCODING_ASCII_US));
     101         112 :         sal_uInt32 nID = GetLangId( aLang );
     102         112 :         bool bAdd = (nID == 0);
     103         112 :         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         112 :         aLangFallbacks.push_back( nID);
     112         112 :     }
     113             : 
     114             : #if OSL_DEBUG_LEVEL > 1
     115             :     fprintf( stderr, "\n" );
     116             : #endif
     117             : 
     118         112 :     return aRet;
     119             : }
     120             : 
     121           0 : Atom RscTypCont::AddLanguage( const char* pLang )
     122             : {
     123           0 :     return aLangType.AddLanguage( pLang, aNmTb );
     124             : }
     125             : 
     126             : 
     127       56568 : void DestroyNode( RscTop * pRscTop, ObjNode * pObjNode )
     128             : {
     129       56568 :     if( pObjNode )
     130             :     {
     131       19066 :         DestroyNode( pRscTop, static_cast<ObjNode*>(pObjNode->Left()) );
     132       19066 :         DestroyNode( pRscTop, static_cast<ObjNode*>(pObjNode->Right()) );
     133             : 
     134       19066 :         if( pObjNode->GetRscObj() )
     135             :         {
     136       19066 :             pRscTop->Destroy( RSCINST( pRscTop, pObjNode->GetRscObj() ) );
     137       19066 :             rtl_freeMemory( pObjNode->GetRscObj() );
     138             :         }
     139       19066 :         delete pObjNode;
     140             :     }
     141       56568 : }
     142             : 
     143       37291 : void DestroySubTrees( RscTop * pRscTop )
     144             : {
     145       37291 :     if( pRscTop )
     146             :     {
     147       18436 :         DestroySubTrees( static_cast<RscTop*>(pRscTop->Left()) );
     148       18436 :         DestroyNode( pRscTop, pRscTop->GetObjNode() );
     149       18436 :         DestroySubTrees( static_cast<RscTop*>(pRscTop->Right()) );
     150             :     }
     151       37291 : }
     152             : 
     153       37291 : void DestroyTree( RscTop * pRscTop )
     154             : {
     155       37291 :     if( pRscTop )
     156             :     {
     157       18436 :         DestroyTree( static_cast<RscTop*>(pRscTop->Left()) );
     158       18436 :         DestroyTree( static_cast<RscTop*>(pRscTop->Right()) );
     159             : 
     160       18436 :         delete pRscTop;
     161             :     }
     162       37291 : }
     163             : 
     164       37291 : void Pre_dtorTree( RscTop * pRscTop )
     165             : {
     166       37291 :     if( pRscTop )
     167             :     {
     168       18436 :         Pre_dtorTree( static_cast<RscTop*>(pRscTop->Left()) );
     169       18436 :         Pre_dtorTree( static_cast<RscTop*>(pRscTop->Right()) );
     170             : 
     171       18436 :         pRscTop->Pre_dtor();
     172             :     }
     173       37291 : }
     174             : 
     175         838 : RscTypCont :: ~RscTypCont()
     176             : {
     177             :     // Alle Unterbaeume loeschen
     178         419 :     aVersion.pClass->Destroy( aVersion );
     179         419 :     rtl_freeMemory( aVersion.pData );
     180         419 :     DestroySubTrees( pRoot );
     181             : 
     182             :     // Alle Klassen noch gueltig, jeweilige Instanzen freigeben
     183             :     // BasisTypen
     184       56565 :     for ( size_t i = 0, n = aBaseLst.size(); i < n; ++i )
     185       56146 :         aBaseLst[ i ]->Pre_dtor();
     186             : 
     187         419 :     aBool.Pre_dtor();
     188         419 :     aShort.Pre_dtor();
     189         419 :     aUShort.Pre_dtor();
     190         419 :     aIdUShort.Pre_dtor();
     191         419 :     aIdNoZeroUShort.Pre_dtor();
     192         419 :     aNoZeroShort.Pre_dtor();
     193         419 :     aIdLong.Pre_dtor();
     194         419 :     aString.Pre_dtor();
     195         419 :     aWinBits.Pre_dtor();
     196         419 :     aVersion.pClass->Pre_dtor();
     197             :     // Zusammengesetzte Typen
     198         419 :     Pre_dtorTree( pRoot );
     199             : 
     200             :     // Klassen zerstoeren
     201         419 :     delete aVersion.pClass;
     202         419 :     DestroyTree( pRoot );
     203             : 
     204       56565 :     for ( size_t i = 0, n = aBaseLst.size(); i < n; ++i )
     205       56146 :         delete aBaseLst[ i ];
     206             : 
     207         419 :     aBaseLst.clear();
     208             : 
     209        1368 :     for ( size_t i = 0, n = aSysLst.size(); i < n; ++i )
     210         949 :         delete aSysLst[ i ];
     211             : 
     212         419 :     aSysLst.clear();
     213         419 : }
     214             : 
     215          56 : void RscTypCont::ClearSysNames()
     216             : {
     217          56 :     for ( size_t i = 0, n = aSysLst.size(); i < n; ++i )
     218           0 :         delete aSysLst[ i ];
     219             : 
     220          56 :     aSysLst.clear();
     221          56 : }
     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        1007 : sal_uInt32 RscTypCont :: PutSysName( sal_uInt32 nRscTyp, char * pFileName,
     270             :                                      sal_uInt32 nConst, sal_uInt32 nId, bool bFirst )
     271             : {
     272             :     RscSysEntry *pSysEntry;
     273        1007 :     RscSysEntry *pFoundEntry = NULL;
     274        1007 :     bool            bId1 = false;
     275             : 
     276       59279 :     for ( size_t i = 0, n = aSysLst.size(); i < n; ++i )
     277             :     {
     278       58330 :         pSysEntry = aSysLst[ i ];
     279       58330 :         if( pSysEntry->nKey == 1 )
     280           0 :             bId1 = true;
     281       58330 :         if( !strcmp( pSysEntry->aFileName.getStr(), pFileName ) )
     282         116 :             if(  pSysEntry->nRscTyp == nRscTyp &&
     283         116 :                  pSysEntry->nTyp    == nConst &&
     284          58 :                  pSysEntry->nRefId  == nId)
     285             :             {
     286          58 :                 pFoundEntry = pSysEntry;
     287          58 :                 break;
     288             :             }
     289             :     }
     290        1007 :     pSysEntry = pFoundEntry;
     291             : 
     292        1007 :     if ( !pSysEntry || (bFirst && !bId1) )
     293             :     {
     294         949 :         pSysEntry = new RscSysEntry;
     295         949 :         pSysEntry->nKey = nUniqueId++;
     296         949 :         pSysEntry->nRscTyp = nRscTyp;
     297         949 :         pSysEntry->nTyp = nConst;
     298         949 :         pSysEntry->nRefId = nId;
     299         949 :         pSysEntry->aFileName = (const char*)pFileName;
     300         949 :         if( bFirst && !bId1 )
     301             :         {
     302           0 :             pSysEntry->nKey = 1;
     303           0 :             aSysLst.insert( aSysLst.begin(), pSysEntry );
     304             :         }
     305             :         else
     306         949 :             aSysLst.push_back( pSysEntry );
     307             :     }
     308             : 
     309        1007 :     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         419 : 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        2464 :     ERRTYPE WriteRc( RscTop * pCl, ObjNode * pRoot )
     371             :     {
     372        2464 :         pClass = pCl;
     373        2464 :         if( pRoot )
     374         181 :             pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteRc ) );
     375        2464 :         return aError;
     376             :     }
     377       31988 :     ERRTYPE WriteSrc( RscTop * pCl, ObjNode * pRoot ){
     378       31988 :         pClass = pCl;
     379       31988 :         if( pRoot )
     380        1095 :             pRoot->EnumNodes( LINK( this, RscEnumerateObj, CallBackWriteSrc ) );
     381       31988 :         return aError;
     382             :     }
     383             : public:
     384             :     void WriteRcFile( RscWriteRc & rMem, FILE * fOutput );
     385             : };
     386             : 
     387       19066 : IMPL_LINK( RscEnumerateObj, CallBackWriteRc, ObjNode *, pObjNode )
     388             : {
     389        9533 :     RscWriteRc      aMem( pTypCont->GetByteOrder() );
     390             : 
     391       28599 :     aError = pClass->WriteRcHeader( RSCINST( pClass, pObjNode->GetRscObj() ),
     392             :                                      aMem, pTypCont,
     393       19066 :                                      pObjNode->GetRscId(), 0, true );
     394        9533 :     if( aError.IsError() || aError.IsWarning() )
     395           0 :         pTypCont->pEH->Error( aError, pClass, pObjNode->GetRscId() );
     396             : 
     397        9533 :     WriteRcFile( aMem, fOutput );
     398        9533 :     return 0;
     399             : }
     400             : 
     401       19121 : IMPL_LINK_INLINE_START( RscEnumerateObj, CallBackWriteSrc, ObjNode *, pObjNode )
     402             : {
     403       19121 :     if( pObjNode->GetFileKey() == lFileKey )
     404             :     {
     405             :         pClass->WriteSrcHeader( RSCINST( pClass, pObjNode->GetRscObj() ),
     406             :                                 fOutput, pTypCont, 0,
     407        9533 :                                 pObjNode->GetRscId(), "" );
     408        9533 :         fprintf( fOutput, ";\n" );
     409             :     }
     410       19121 :     return 0;
     411             : }
     412       19121 : IMPL_LINK_INLINE_END( RscEnumerateObj, CallBackWriteSrc, ObjNode *, pObjNode )
     413             : 
     414        9589 : 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        9589 :     sal_uInt32 nId = rMem.GetLong( 0 );
     427        9589 :     sal_uInt32 nRT = rMem.GetLong( 4 );
     428             : 
     429             :     // Tabelle wird entsprechend gefuellt
     430        9589 :     pTypCont->PutTranslatorKey( (sal_uInt64(nRT) << 32) + sal_uInt64(nId) );
     431             : 
     432        9589 :     if( nRT == RSC_VERSIONCONTROL )
     433             :     { // kommt immmer als letztes
     434          56 :         sal_Int32 nCount = pTypCont->aIdTranslator.size();
     435             :         // groesse der Tabelle
     436          56 :         sal_uInt32 nSize = (nCount * (sizeof(sal_uInt64)+sizeof(sal_Int32))) + sizeof(sal_Int32);
     437             : 
     438          56 :         rMem.Put( nCount ); //Anzahl speichern
     439       28935 :         for( std::map< sal_uInt64, sal_uLong >::const_iterator it =
     440       19346 :              pTypCont->aIdTranslator.begin(); it != pTypCont->aIdTranslator.end(); ++it )
     441             :         {
     442             :             // Schluessel schreiben
     443        9589 :             rMem.Put( it->first );
     444             :             // Objekt Id oder Position schreiben
     445        9589 :             rMem.Put( (sal_Int32)it->second );
     446             :         }
     447          56 :         rMem.Put( nSize ); // Groesse hinten Speichern
     448             :     }
     449             : 
     450             :     //Dateioffset neu setzen
     451        9589 :     pTypCont->IncFilePos( rMem.Size() );
     452             : 
     453             : 
     454             :     //Position wurde vorher in Tabelle geschrieben
     455        9589 :     bool bSuccess = (1 == fwrite( rMem.GetBuffer(), rMem.Size(), 1, fOut ));
     456             :     SAL_WARN_IF(!bSuccess, "rsc", "short write");
     457        9589 : };
     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         419 :     RscEnumerateRef( RscTypCont * pTC, RscTop * pR,
     470             :                      FILE * fOutput )
     471         419 :         {
     472         419 :             aEnumObj.pTypCont = pTC;
     473         419 :             aEnumObj.fOutput  = fOutput;
     474         419 :             pRoot             = pR;
     475         419 :         }
     476          56 :     ERRTYPE WriteRc()
     477             :         {
     478          56 :             aEnumObj.aError.Clear();
     479          56 :             pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteRc ) );
     480          56 :             return aEnumObj.aError;
     481             :         }
     482         727 :     ERRTYPE WriteSrc( sal_uLong lFileKey )
     483             :         {
     484         727 :             aEnumObj.lFileKey = lFileKey;
     485             : 
     486         727 :             aEnumObj.aError.Clear();
     487         727 :             pRoot->EnumNodes( LINK( this, RscEnumerateRef, CallBackWriteSrc ) );
     488         727 :             return aEnumObj.aError;
     489             :         }
     490             : };
     491             : 
     492        2464 : IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteRc, RscTop *, pRef )
     493             : {
     494        2464 :     aEnumObj.WriteRc( pRef, pRef->GetObjNode() );
     495        2464 :     return 0;
     496             : }
     497        2464 : IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteRc, RscTop *, pRef )
     498       31988 : IMPL_LINK_INLINE_START( RscEnumerateRef, CallBackWriteSrc, RscTop *, pRef )
     499             : {
     500       31988 :     aEnumObj.WriteSrc( pRef, pRef->GetObjNode() );
     501       31988 :     return 0;
     502             : }
     503       31988 : IMPL_LINK_INLINE_END( RscEnumerateRef, CallBackWriteSrc, RscTop *, pRef )
     504             : 
     505             : 
     506          56 : ERRTYPE RscTypCont::WriteRc( WriteRcContext& rContext )
     507             : {
     508          56 :     ERRTYPE       aError;
     509          56 :     RscEnumerateRef aEnumRef( this, pRoot, rContext.fOutput );
     510             : 
     511          56 :     aIdTranslator.clear();
     512          56 :     nFilePos = 0;
     513          56 :     nPMId = RSCVERSION_ID +1; //mindestens einen groesser
     514             : 
     515          56 :     aError = aEnumRef.WriteRc();
     516             : 
     517             :     // version control
     518          56 :     RscWriteRc aMem( nByteOrder );
     519          56 :     aVersion.pClass->WriteRcHeader( aVersion, aMem, this, RscId( RSCVERSION_ID ), 0, true );
     520          56 :     aEnumRef.aEnumObj.WriteRcFile( aMem, rContext.fOutput );
     521             : 
     522          56 :     return aError;
     523             : }
     524             : 
     525         363 : void RscTypCont :: WriteSrc( FILE * fOutput, sal_uLong nFileKey,
     526             :                              bool bName )
     527             : {
     528             :     RscFile     *   pFName;
     529         363 :     RscEnumerateRef aEnumRef( this, pRoot, fOutput );
     530             : 
     531         363 :     unsigned char aUTF8BOM[3] = { 0xef, 0xbb, 0xbf };
     532         363 :     size_t nItems = SAL_N_ELEMENTS(aUTF8BOM);
     533         363 :     bool bSuccess = (nItems == fwrite(aUTF8BOM, 1, nItems, fOutput));
     534             :     SAL_WARN_IF(!bSuccess, "rsc", "short write");
     535         363 :     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         363 :         RscId::SetNames( false );
     564         363 :         if( NOFILE_INDEX == nFileKey )
     565             :         {
     566         363 :             sal_uIntPtr aIndex = aFileTab.FirstIndex();
     567        1453 :             while( aIndex != UNIQUEINDEX_ENTRY_NOTFOUND )
     568             :             {
     569         727 :                 aEnumRef.WriteSrc( aIndex );
     570         727 :                 aIndex = aFileTab.NextIndex( aIndex );
     571             :             };
     572             :         }
     573             :         else
     574           0 :              aEnumRef.WriteSrc( nFileKey );
     575         363 :         RscId::SetNames();
     576             :     };
     577         363 : }
     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          56 : inline RscDel::RscDel( RscTop * pRoot, sal_uLong lKey )
     589             : {
     590          56 :     lFileKey = lKey;
     591          56 :     pRoot->EnumNodes( LINK( this, RscDel, Delete ) );
     592          56 : }
     593             : 
     594        2464 : IMPL_LINK_INLINE_START( RscDel, Delete, RscTop *, pNode )
     595             : {
     596        2464 :     if( pNode->GetObjNode() )
     597           0 :         pNode->pObjBiTree = pNode->GetObjNode()->DelObjNode( pNode, lFileKey );
     598        2464 :     return 0;
     599             : }
     600        2464 : IMPL_LINK_INLINE_END( RscDel, Delete, RscTop *, pNode )
     601             : 
     602          56 : void RscTypCont :: Delete( sal_uLong lFileKey )
     603             : {
     604             :     // Resourceinstanzen loeschen
     605          56 :     RscDel aDel( pRoot, lFileKey );
     606             :     // Defines loeschen
     607          56 :     aFileTab.DeleteFileContext( lFileKey );
     608          56 : }
     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( static_cast<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( static_cast<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( static_cast<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( static_cast<RscTop*>(pRscTop->Right()) ) )
     655           0 :             bRet = false;
     656             :     }
     657             : 
     658           0 :     return bRet;
     659             : }
     660             : 
     661        9589 : sal_uInt32 RscTypCont::PutTranslatorKey( sal_uInt64 nKey )
     662             : {
     663        9589 :     aIdTranslator[ nKey ] = nFilePos;
     664        9589 :     return nPMId++;
     665             : }
     666             : 
     667             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10