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

Generated by: LCOV version 1.11