LCOV - code coverage report
Current view: top level - starmath/source - smdetect.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 92 204 45.1 %
Date: 2012-08-25 Functions: 9 12 75.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 127 508 25.0 %

           Branch data     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                 :            : 
      21                 :            : #include "smdetect.hxx"
      22                 :            : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      23                 :            : #include <com/sun/star/beans/PropertyValue.hpp>
      24                 :            : #include <com/sun/star/frame/XFrame.hpp>
      25                 :            : #include <com/sun/star/frame/XModel.hpp>
      26                 :            : #include <com/sun/star/awt/XWindow.hpp>
      27                 :            : #include <com/sun/star/lang/XUnoTunnel.hpp>
      28                 :            : #include <comphelper/processfactory.hxx>
      29                 :            : #include <com/sun/star/io/XInputStream.hpp>
      30                 :            : #include <com/sun/star/task/XInteractionHandler.hpp>
      31                 :            : #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
      32                 :            : #include <com/sun/star/ucb/CommandAbortedException.hpp>
      33                 :            : #include <com/sun/star/ucb/InteractiveAppException.hpp>
      34                 :            : #include <com/sun/star/ucb/XContent.hpp>
      35                 :            : #include <com/sun/star/packages/zip/ZipIOException.hpp>
      36                 :            : #include <toolkit/helper/vclunohelper.hxx>
      37                 :            : #include <ucbhelper/simpleinteractionrequest.hxx>
      38                 :            : #include <rtl/ustring.h>
      39                 :            : #include <rtl/logfile.hxx>
      40                 :            : #include <svl/itemset.hxx>
      41                 :            : #include <vcl/window.hxx>
      42                 :            : #include <svl/eitem.hxx>
      43                 :            : #include <svl/stritem.hxx>
      44                 :            : #include <tools/urlobj.hxx>
      45                 :            : #include <osl/mutex.hxx>
      46                 :            : #include <svtools/sfxecode.hxx>
      47                 :            : #include <svtools/ehdl.hxx>
      48                 :            : #include <sot/storinfo.hxx>
      49                 :            : #include <vcl/svapp.hxx>
      50                 :            : #include <sfx2/app.hxx>
      51                 :            : #include <sfx2/sfxsids.hrc>
      52                 :            : #include <sfx2/request.hxx>
      53                 :            : #include <sfx2/docfile.hxx>
      54                 :            : #include <sfx2/docfilt.hxx>
      55                 :            : #include <sfx2/fcontnr.hxx>
      56                 :            : #include <sfx2/brokenpackageint.hxx>
      57                 :            : 
      58                 :            : #include "document.hxx"
      59                 :            : #include "eqnolefilehdr.hxx"
      60                 :            : 
      61                 :            : using namespace ::com::sun::star;
      62                 :            : using namespace ::com::sun::star::uno;
      63                 :            : using namespace ::com::sun::star::io;
      64                 :            : using namespace ::com::sun::star::frame;
      65                 :            : using namespace ::com::sun::star::task;
      66                 :            : using namespace ::com::sun::star::beans;
      67                 :            : using namespace ::com::sun::star::lang;
      68                 :            : using namespace ::com::sun::star::ucb;
      69                 :            : using namespace ::rtl;
      70                 :            : 
      71                 :         12 : SmFilterDetect::SmFilterDetect( const REFERENCE < ::com::sun::star::lang::XMultiServiceFactory >& /*xFactory*/ )
      72                 :            : {
      73                 :         12 : }
      74                 :            : 
      75                 :         12 : SmFilterDetect::~SmFilterDetect()
      76                 :            : {
      77         [ -  + ]:         24 : }
      78                 :            : 
      79                 :         12 : ::rtl::OUString SAL_CALL SmFilterDetect::detect( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lDescriptor ) throw( ::com::sun::star::uno::RuntimeException )
      80                 :            : {
      81                 :         12 :     REFERENCE< XInputStream > xStream;
      82                 :         12 :     REFERENCE< XContent > xContent;
      83                 :         12 :     REFERENCE< XInteractionHandler > xInteraction;
      84         [ +  - ]:         12 :     String aURL;
      85                 :         12 :     ::rtl::OUString sTemp;
      86         [ +  - ]:         12 :     String aTypeName;            // a name describing the type (from MediaDescriptor, usually from flat detection)
      87         [ +  - ]:         12 :     String aPreselectedFilterName;      // a name describing the filter to use (from MediaDescriptor, usually from UI action)
      88                 :            : 
      89                 :         12 :     ::rtl::OUString aDocumentTitle; // interesting only if set in this method
      90                 :            : 
      91                 :            :     // opening as template is done when a parameter tells to do so and a template filter can be detected
      92                 :            :     // (otherwise no valid filter would be found) or if the detected filter is a template filter and
      93                 :            :     // there is no parameter that forbids to open as template
      94                 :         12 :     sal_Bool bOpenAsTemplate = sal_False;
      95                 :         12 :     sal_Bool bWasReadOnly = sal_False, bReadOnly = sal_False;
      96                 :            : 
      97                 :         12 :     sal_Bool bRepairPackage = sal_False;
      98                 :         12 :     sal_Bool bRepairAllowed = sal_False;
      99                 :            : 
     100                 :            :     // now some parameters that can already be in the array, but may be overwritten or new inserted here
     101                 :            :     // remember their indices in the case new values must be added to the array
     102                 :         12 :     sal_Int32 nPropertyCount = lDescriptor.getLength();
     103                 :         12 :     sal_Int32 nIndexOfInputStream = -1;
     104                 :         12 :     sal_Int32 nIndexOfContent = -1;
     105                 :         12 :     sal_Int32 nIndexOfReadOnlyFlag = -1;
     106                 :         12 :     sal_Int32 nIndexOfTemplateFlag = -1;
     107                 :         12 :     sal_Int32 nIndexOfDocumentTitle = -1;
     108                 :            : 
     109         [ +  + ]:         98 :     for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty )
     110                 :            :     {
     111                 :            :         // extract properties
     112 [ +  - ][ +  + ]:         86 :         if( lDescriptor[nProperty].Name == "URL" )
     113                 :            :         {
     114         [ +  - ]:         12 :             lDescriptor[nProperty].Value >>= sTemp;
     115         [ +  - ]:         12 :             aURL = sTemp;
     116                 :            :         }
     117 [ +  + ][ +  - ]:         74 :         else if( !aURL.Len() && lDescriptor[nProperty].Name == "FileName" )
         [ -  + ][ -  + ]
     118                 :            :         {
     119         [ #  # ]:          0 :             lDescriptor[nProperty].Value >>= sTemp;
     120         [ #  # ]:          0 :             aURL = sTemp;
     121                 :            :         }
     122 [ +  - ][ +  + ]:         74 :         else if( lDescriptor[nProperty].Name == "TypeName" )
     123                 :            :         {
     124         [ +  - ]:          2 :             lDescriptor[nProperty].Value >>= sTemp;
     125         [ +  - ]:          2 :             aTypeName = sTemp;
     126                 :            :         }
     127 [ +  - ][ -  + ]:         72 :         else if( lDescriptor[nProperty].Name == "FilterName" )
     128                 :            :         {
     129         [ #  # ]:          0 :             lDescriptor[nProperty].Value >>= sTemp;
     130         [ #  # ]:          0 :             aPreselectedFilterName = sTemp;
     131                 :            :         }
     132 [ +  - ][ +  + ]:         72 :         else if( lDescriptor[nProperty].Name == "InputStream" )
     133                 :         12 :             nIndexOfInputStream = nProperty;
     134 [ +  - ][ -  + ]:         60 :         else if( lDescriptor[nProperty].Name == "ReadOnly" )
     135                 :          0 :             nIndexOfReadOnlyFlag = nProperty;
     136 [ +  - ][ +  + ]:         60 :         else if( lDescriptor[nProperty].Name == "UCBContent" )
     137                 :         12 :             nIndexOfContent = nProperty;
     138 [ +  - ][ -  + ]:         48 :         else if( lDescriptor[nProperty].Name == "AsTemplate" )
     139                 :            :         {
     140         [ #  # ]:          0 :             lDescriptor[nProperty].Value >>= bOpenAsTemplate;
     141                 :          0 :             nIndexOfTemplateFlag = nProperty;
     142                 :            :         }
     143 [ +  - ][ +  + ]:         48 :         else if( lDescriptor[nProperty].Name == "InteractionHandler" )
     144 [ +  - ][ +  - ]:         12 :             lDescriptor[nProperty].Value >>= xInteraction;
     145 [ +  - ][ -  + ]:         36 :         else if( lDescriptor[nProperty].Name == "RepairPackage" )
     146         [ #  # ]:          0 :             lDescriptor[nProperty].Value >>= bRepairPackage;
     147 [ +  - ][ -  + ]:         36 :         else if( lDescriptor[nProperty].Name == "DocumentTitle" )
     148                 :          0 :             nIndexOfDocumentTitle = nProperty;
     149                 :            :     }
     150                 :            : 
     151                 :            :     // can't check the type for external filters, so set the "dont" flag accordingly
     152         [ +  - ]:         12 :     SolarMutexGuard aGuard;
     153                 :            : 
     154         [ +  - ]:         12 :     SfxApplication* pApp = SFX_APP();
     155 [ +  - ][ +  - ]:         12 :     SfxAllItemSet *pSet = new SfxAllItemSet( pApp->GetPool() );
     156         [ +  - ]:         12 :     TransformParameters( SID_OPENDOC, lDescriptor, *pSet );
     157 [ +  - ][ +  - ]:         12 :     SFX_ITEMSET_ARG( pSet, pItem, SfxBoolItem, SID_DOC_READONLY, sal_False );
     158                 :            : 
     159 [ -  + ][ #  # ]:         12 :     bWasReadOnly = pItem && pItem->GetValue();
     160                 :            : 
     161         [ +  - ]:         12 :     String aFilterName;
     162         [ +  - ]:         12 :     String aPrefix = rtl::OUString( "private:factory/" );
     163 [ -  + ][ +  - ]:         12 :     if( aURL.Match( aPrefix ) == aPrefix.Len() )
     164                 :            :     {
     165                 :          0 :         const SfxFilter* pFilter = 0;
     166         [ #  # ]:          0 :         String aPattern( aPrefix );
     167         [ #  # ]:          0 :         aPattern += rtl::OUString("smath");
     168 [ #  # ][ #  # ]:          0 :         if ( aURL.Match( aPattern ) >= aPattern.Len() )
     169                 :            :         {
     170         [ #  # ]:          0 :             pFilter = SfxFilter::GetDefaultFilterFromFactory( aURL );
     171         [ #  # ]:          0 :             aTypeName = pFilter->GetTypeName();
     172         [ #  # ]:          0 :             aFilterName = pFilter->GetName();
     173         [ #  # ]:          0 :         }
     174                 :            :     }
     175                 :            :     else
     176                 :            :     {
     177                 :            :         // ctor of SfxMedium uses owner transition of ItemSet
     178 [ -  + ][ +  - ]:         12 :         SfxMedium aMedium( aURL, bWasReadOnly ? STREAM_STD_READ : STREAM_STD_READWRITE, NULL, pSet );
     179         [ +  - ]:         12 :         aMedium.UseInteractionHandler( true );
     180                 :            : 
     181         [ +  - ]:         12 :         bool bIsStorage = aMedium.IsStorage();
     182 [ +  - ][ +  - ]:         12 :         if ( aMedium.GetErrorCode() == ERRCODE_NONE )
     183                 :            :         {
     184                 :            :             // remember input stream and content and put them into the descriptor later
     185                 :            :             // should be done here since later the medium can switch to a version
     186 [ +  - ][ +  - ]:         12 :             xStream = aMedium.GetInputStream();
     187 [ +  - ][ +  - ]:         12 :             xContent = aMedium.GetContent();
     188         [ +  - ]:         12 :             bReadOnly = aMedium.IsReadOnly();
     189                 :            : 
     190         [ +  - ]:         12 :             if ( bIsStorage )
     191                 :            :             {
     192                 :            :                 //TODO/LATER: factor this out!
     193         [ +  - ]:         12 :                 uno::Reference < embed::XStorage > xStorage = aMedium.GetStorage( sal_False );
     194 [ +  - ][ -  + ]:         12 :                 if ( aMedium.GetLastStorageCreationState() != ERRCODE_NONE )
     195                 :            :                 {
     196                 :            :                     // error during storage creation means _here_ that the medium
     197                 :            :                     // is broken, but we can not handle it in medium since unpossibility
     198                 :            :                     // to create a storage does not _always_ means that the medium is broken
     199 [ #  # ][ #  # ]:          0 :                     aMedium.SetError( aMedium.GetLastStorageCreationState(), OSL_LOG_PREFIX );
     200         [ #  # ]:          0 :                     if ( xInteraction.is() )
     201                 :            :                     {
     202                 :          0 :                         OUString empty;
     203                 :            :                         try
     204                 :            :                         {
     205                 :            :                             InteractiveAppException xException( empty,
     206                 :            :                                                             REFERENCE< XInterface >(),
     207                 :            :                                                             InteractionClassification_ERROR,
     208 [ #  # ][ #  # ]:          0 :                                                             aMedium.GetError() );
     209                 :            : 
     210                 :            :                             REFERENCE< XInteractionRequest > xRequest(
     211                 :            :                                 new ucbhelper::SimpleInteractionRequest( makeAny( xException ),
     212 [ #  # ][ #  # ]:          0 :                                                                       ucbhelper::CONTINUATION_APPROVE ) );
         [ #  # ][ #  # ]
     213 [ #  # ][ #  # ]:          0 :                             xInteraction->handle( xRequest );
         [ #  # ][ #  # ]
     214                 :            :                         }
     215         [ #  # ]:          0 :                         catch ( Exception & ) {};
     216                 :            :                     }
     217                 :            :                 }
     218                 :            :                 else
     219                 :            :                 {
     220         [ +  - ]:         12 :                     aFilterName.Erase();
     221                 :            : 
     222                 :            :                     try
     223                 :            :                     {
     224                 :         12 :                         const SfxFilter* pFilter = aPreselectedFilterName.Len() ?
     225 [ #  # ][ -  + ]:         24 :                                 SfxFilterMatcher().GetFilter4FilterName( aPreselectedFilterName ) : aTypeName.Len() ?
         [ #  # ][ #  # ]
     226 [ #  # ][ +  + ]:         24 :                                 SfxFilterMatcher(rtl::OUString("smath")).GetFilter4EA( aTypeName ) : 0;
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
         [ +  - ][ +  + ]
         [ +  - ][ +  + ]
         [ +  + ][ #  #  
          #  #  #  #  #  
              # ][ -  + ]
     227         [ +  - ]:         12 :                         String aTmpFilterName;
     228         [ +  + ]:         12 :                         if ( pFilter )
     229         [ +  - ]:          2 :                             aTmpFilterName = pFilter->GetName();
     230 [ +  + ][ +  - ]:         12 :                         aTypeName = SfxFilter::GetTypeFromStorage( xStorage, pFilter ? pFilter->IsAllowedAsTemplate() : sal_False, &aTmpFilterName );
         [ +  - ][ +  - ]
                 [ +  - ]
     231                 :            :                     }
     232         [ #  # ]:          0 :                     catch( const lang::WrappedTargetException& aWrap )
     233                 :            :                     {
     234         [ #  # ]:          0 :                         packages::zip::ZipIOException aZipException;
     235                 :            : 
     236                 :            :                         // repairing is done only if this type is requested from outside
     237   [ #  #  #  #  :          0 :                         if ( ( aWrap.TargetException >>= aZipException ) && aTypeName.Len() )
             #  #  #  # ]
     238                 :            :                         {
     239         [ #  # ]:          0 :                             if ( xInteraction.is() )
     240                 :            :                             {
     241                 :            :                                 // the package is broken one
     242         [ #  # ]:          0 :                                    aDocumentTitle = aMedium.GetURLObject().getName(
     243                 :            :                                                             INetURLObject::LAST_SEGMENT,
     244                 :            :                                                             true,
     245         [ #  # ]:          0 :                                                             INetURLObject::DECODE_WITH_CHARSET );
     246                 :            : 
     247         [ #  # ]:          0 :                                 if ( !bRepairPackage )
     248                 :            :                                 {
     249                 :            :                                     // ask the user whether he wants to try to repair
     250         [ #  # ]:          0 :                                     RequestPackageReparation aRequest( aDocumentTitle );
     251   [ #  #  #  #  :          0 :                                     xInteraction->handle( aRequest.GetRequest() );
                   #  # ]
     252   [ #  #  #  # ]:          0 :                                     bRepairAllowed = aRequest.isApproved();
     253                 :            :                                 }
     254                 :            : 
     255         [ #  # ]:          0 :                                 if ( !bRepairAllowed )
     256                 :            :                                 {
     257                 :            :                                     // repair either not allowed or not successful
     258         [ #  # ]:          0 :                                     NotifyBrokenPackage aNotifyRequest( aDocumentTitle );
     259   [ #  #  #  #  :          0 :                                     xInteraction->handle( aNotifyRequest.GetRequest() );
             #  #  #  # ]
     260                 :            :                                 }
     261                 :            :                             }
     262                 :            : 
     263         [ #  # ]:          0 :                             if ( !bRepairAllowed )
     264         [ #  # ]:          0 :                                 aTypeName.Erase();
     265         [ #  # ]:          0 :                         }
     266                 :            :                     }
     267                 :          0 :                     catch( uno::RuntimeException& )
     268                 :            :                     {
     269                 :          0 :                         throw;
     270                 :            :                     }
     271   [ #  #  #  #  :          0 :                     catch( uno::Exception& )
                   #  # ]
     272                 :            :                     {
     273         [ #  # ]:          0 :                         aTypeName.Erase();
     274                 :            :                     }
     275                 :            : 
     276         [ +  - ]:         12 :                        if ( aTypeName.Len() )
     277                 :            :                     {
     278                 :            :                            const SfxFilter* pFilter =
     279 [ +  - ][ +  - ]:         12 :                                     SfxFilterMatcher( rtl::OUString("smath") ).GetFilter4EA( aTypeName );
         [ +  - ][ +  - ]
                 [ +  - ]
     280         [ -  + ]:         12 :                         if ( pFilter )
     281         [ #  # ]:          0 :                             aFilterName = pFilter->GetName();
     282                 :            :                     }
     283                 :         12 :                 }
     284                 :            :             }
     285                 :            :             else
     286                 :            :             {
     287                 :            :                 //Test to see if this begins with xml and if so run it through
     288                 :            :                 //the MathML filter. There are all sorts of things wrong with
     289                 :            :                 //this approach, to be fixed at a better level than here
     290         [ #  # ]:          0 :                 SvStream *pStrm = aMedium.GetInStream();
     291         [ #  # ]:          0 :                 aTypeName.Erase();
     292 [ #  # ][ #  # ]:          0 :                 if (pStrm && !pStrm->GetError())
                 [ #  # ]
     293                 :            :                 {
     294 [ #  # ][ #  # ]:          0 :                     SotStorageRef aStorage = new SotStorage ( pStrm, sal_False );
     295         [ #  # ]:          0 :                     if ( !aStorage->GetError() )
     296                 :            :                     {
     297 [ #  # ][ #  # ]:          0 :                         if (aStorage->IsStream(rtl::OUString("Equation Native")))
         [ #  # ][ #  # ]
     298                 :            :                         {
     299                 :            :                             sal_uInt8 nVersion;
     300 [ #  # ][ #  # ]:          0 :                             if (GetMathTypeVersion( aStorage, nVersion ) && nVersion <=3)
         [ #  # ][ #  # ]
     301         [ #  # ]:          0 :                                 aTypeName.AssignAscii( "math_MathType_3x" );
     302                 :            :                         }
     303                 :            :                     }
     304                 :            :                     else
     305                 :            :                     {
     306                 :          0 :                         const sal_uInt16 nSize = 5;
     307                 :            :                         sal_Char aBuffer[nSize+1];
     308                 :          0 :                         aBuffer[nSize] = 0;
     309         [ #  # ]:          0 :                         pStrm->Seek( STREAM_SEEK_TO_BEGIN );
     310         [ #  # ]:          0 :                         sal_uLong nBytesRead = pStrm->Read( aBuffer, nSize );
     311         [ #  # ]:          0 :                         if (nBytesRead == nSize)
     312                 :            :                         {
     313         [ #  # ]:          0 :                             if (0 == strncmp( "<?xml",aBuffer,nSize))
     314                 :            :                             {
     315                 :            :                                 // 200 should be enough for the XML
     316                 :            :                                 // version, encoding and !DOCTYPE
     317                 :            :                                 // stuff I hope?
     318                 :            :                                 sal_Char aBuffer2[200];
     319         [ #  # ]:          0 :                                 nBytesRead = pStrm->Read( aBuffer2, sizeof(aBuffer2) - 1);
     320                 :          0 :                                 aBuffer2[nBytesRead] = 0;
     321   [ #  #  #  # ]:          0 :                                 if (strstr( aBuffer2, "<math>" ) != NULL ||
     322                 :          0 :                                     strstr( aBuffer2, "<math " ) != NULL)
     323                 :            :                                 {
     324                 :            :                                     static const sal_Char sFltrNm_2[] = MATHML_XML;
     325                 :            :                                     static const sal_Char sTypeNm_2[] = "math_MathML_XML_Math";
     326         [ #  # ]:          0 :                                     aFilterName.AssignAscii( sFltrNm_2 );
     327         [ #  # ]:          0 :                                     aTypeName.AssignAscii( sTypeNm_2 );
     328                 :            :                                 }
     329                 :            :                             }
     330                 :            :                         }
     331                 :            :                     }
     332                 :            : 
     333         [ #  # ]:          0 :                     if ( aTypeName.Len() )
     334                 :            :                     {
     335 [ #  # ][ #  # ]:          0 :                         const SfxFilter* pFilt = SfxFilterMatcher( rtl::OUString("smath") ).GetFilter4EA( aTypeName );
         [ #  # ][ #  # ]
                 [ #  # ]
     336         [ #  # ]:          0 :                         if ( pFilt )
     337         [ #  # ]:          0 :                             aFilterName = pFilt->GetName();
     338         [ #  # ]:          0 :                     }
     339                 :            :                 }
     340                 :            :             }
     341         [ +  - ]:         12 :         }
     342                 :            :     }
     343                 :            : 
     344 [ -  + ][ #  # ]:         12 :     if ( nIndexOfInputStream == -1 && xStream.is() )
                 [ -  + ]
     345                 :            :     {
     346                 :            :         // if input stream wasn't part of the descriptor, now it should be, otherwise the content would be opend twice
     347         [ #  # ]:          0 :         lDescriptor.realloc( nPropertyCount + 1 );
     348         [ #  # ]:          0 :         lDescriptor[nPropertyCount].Name = "InputStream";
     349 [ #  # ][ #  # ]:          0 :         lDescriptor[nPropertyCount].Value <<= xStream;
     350                 :          0 :         nPropertyCount++;
     351                 :            :     }
     352                 :            : 
     353 [ -  + ][ #  # ]:         12 :     if ( nIndexOfContent == -1 && xContent.is() )
                 [ -  + ]
     354                 :            :     {
     355                 :            :         // if input stream wasn't part of the descriptor, now it should be, otherwise the content would be opend twice
     356         [ #  # ]:          0 :         lDescriptor.realloc( nPropertyCount + 1 );
     357         [ #  # ]:          0 :         lDescriptor[nPropertyCount].Name = "UCBContent";
     358 [ #  # ][ #  # ]:          0 :         lDescriptor[nPropertyCount].Value <<= xContent;
     359                 :          0 :         nPropertyCount++;
     360                 :            :     }
     361                 :            : 
     362         [ -  + ]:         12 :     if ( bReadOnly != bWasReadOnly )
     363                 :            :     {
     364         [ #  # ]:          0 :         if ( nIndexOfReadOnlyFlag == -1 )
     365                 :            :         {
     366         [ #  # ]:          0 :             lDescriptor.realloc( nPropertyCount + 1 );
     367         [ #  # ]:          0 :             lDescriptor[nPropertyCount].Name = "ReadOnly";
     368 [ #  # ][ #  # ]:          0 :             lDescriptor[nPropertyCount].Value <<= bReadOnly;
     369                 :          0 :             nPropertyCount++;
     370                 :            :         }
     371                 :            :         else
     372 [ #  # ][ #  # ]:          0 :             lDescriptor[nIndexOfReadOnlyFlag].Value <<= bReadOnly;
     373                 :            :     }
     374                 :            : 
     375 [ +  - ][ -  + ]:         12 :     if ( !bRepairPackage && bRepairAllowed )
     376                 :            :     {
     377         [ #  # ]:          0 :         lDescriptor.realloc( nPropertyCount + 1 );
     378         [ #  # ]:          0 :         lDescriptor[nPropertyCount].Name = "RepairPackage";
     379 [ #  # ][ #  # ]:          0 :         lDescriptor[nPropertyCount].Value <<= bRepairAllowed;
     380                 :          0 :         nPropertyCount++;
     381                 :            : 
     382                 :          0 :         bOpenAsTemplate = sal_True;
     383                 :            : 
     384                 :            :         // TODO/LATER: set progress bar that should be used
     385                 :            :     }
     386                 :            : 
     387         [ -  + ]:         12 :     if ( bOpenAsTemplate )
     388                 :            :     {
     389         [ #  # ]:          0 :         if ( nIndexOfTemplateFlag == -1 )
     390                 :            :         {
     391         [ #  # ]:          0 :             lDescriptor.realloc( nPropertyCount + 1 );
     392         [ #  # ]:          0 :             lDescriptor[nPropertyCount].Name = "AsTemplate";
     393 [ #  # ][ #  # ]:          0 :             lDescriptor[nPropertyCount].Value <<= bOpenAsTemplate;
     394                 :          0 :             nPropertyCount++;
     395                 :            :         }
     396                 :            :         else
     397 [ #  # ][ #  # ]:          0 :             lDescriptor[nIndexOfTemplateFlag].Value <<= bOpenAsTemplate;
     398                 :            :     }
     399                 :            : 
     400         [ -  + ]:         12 :     if ( !aDocumentTitle.isEmpty() )
     401                 :            :     {
     402                 :            :         // the title was set here
     403         [ #  # ]:          0 :         if ( nIndexOfDocumentTitle == -1 )
     404                 :            :         {
     405         [ #  # ]:          0 :             lDescriptor.realloc( nPropertyCount + 1 );
     406         [ #  # ]:          0 :             lDescriptor[nPropertyCount].Name = "DocumentTitle";
     407 [ #  # ][ #  # ]:          0 :             lDescriptor[nPropertyCount].Value <<= aDocumentTitle;
     408                 :          0 :             nPropertyCount++;
     409                 :            :         }
     410                 :            :         else
     411 [ #  # ][ #  # ]:          0 :             lDescriptor[nIndexOfDocumentTitle].Value <<= aDocumentTitle;
     412                 :            :     }
     413                 :            : 
     414         [ +  - ]:         12 :     if ( !aFilterName.Len() )
     415         [ +  - ]:         12 :         aTypeName.Erase();
     416                 :            : 
     417 [ +  - ][ +  - ]:         12 :     return aTypeName;
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
     418                 :            : }
     419                 :            : 
     420                 :            : /* XServiceInfo */
     421                 :          0 : rtl::OUString SAL_CALL SmFilterDetect::getImplementationName() throw( UNORUNTIMEEXCEPTION )
     422                 :            : {
     423                 :          0 :     return impl_getStaticImplementationName();
     424                 :            : }
     425                 :            :                                                                                                                                 \
     426                 :            : /* XServiceInfo */
     427                 :          0 : sal_Bool SAL_CALL SmFilterDetect::supportsService( const rtl::OUString& sServiceName ) throw( UNORUNTIMEEXCEPTION )
     428                 :            : {
     429         [ #  # ]:          0 :     UNOSEQUENCE< rtl::OUString > seqServiceNames = getSupportedServiceNames();
     430                 :          0 :     const rtl::OUString*         pArray          = seqServiceNames.getConstArray();
     431         [ #  # ]:          0 :     for ( sal_Int32 nCounter=0; nCounter<seqServiceNames.getLength(); nCounter++ )
     432                 :            :     {
     433         [ #  # ]:          0 :         if ( pArray[nCounter] == sServiceName )
     434                 :            :         {
     435                 :          0 :             return sal_True ;
     436                 :            :         }
     437                 :            :     }
     438         [ #  # ]:          0 :     return sal_False ;
     439                 :            : }
     440                 :            : 
     441                 :            : /* XServiceInfo */
     442                 :          0 : UNOSEQUENCE< rtl::OUString > SAL_CALL SmFilterDetect::getSupportedServiceNames() throw( UNORUNTIMEEXCEPTION )
     443                 :            : {
     444                 :          0 :     return impl_getStaticSupportedServiceNames();
     445                 :            : }
     446                 :            : 
     447                 :            : /* Helper for XServiceInfo */
     448                 :          6 : UNOSEQUENCE< rtl::OUString > SmFilterDetect::impl_getStaticSupportedServiceNames()
     449                 :            : {
     450                 :          6 :     UNOSEQUENCE< rtl::OUString > seqServiceNames( 1 );
     451         [ +  - ]:          6 :     seqServiceNames.getArray() [0] = "com.sun.star.frame.ExtendedTypeDetection";
     452                 :          6 :     return seqServiceNames ;
     453                 :            : }
     454                 :            : 
     455                 :            : /* Helper for XServiceInfo */
     456                 :         12 : rtl::OUString SmFilterDetect::impl_getStaticImplementationName()
     457                 :            : {
     458                 :         12 :     return rtl::OUString("com.sun.star.comp.math.FormatDetector");
     459                 :            : }
     460                 :            : 
     461                 :            : /* Helper for registry */
     462                 :         12 : UNOREFERENCE< UNOXINTERFACE > SAL_CALL SmFilterDetect::impl_createInstance( const UNOREFERENCE< UNOXMULTISERVICEFACTORY >& xServiceManager ) throw( UNOEXCEPTION )
     463                 :            : {
     464         [ +  - ]:         12 :     return UNOREFERENCE< UNOXINTERFACE >( *new SmFilterDetect( xServiceManager ) );
     465 [ +  - ][ +  - ]:         18 : }
     466                 :            : 
     467                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10