LCOV - code coverage report
Current view: top level - libreoffice/cui/source/dialogs - hlinettp.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 217 0.5 %
Date: 2012-12-27 Functions: 2 35 5.7 %
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 <comphelper/string.hxx>
      21             : #include <unotools/pathoptions.hxx>
      22             : #include <unotools/useroptions.hxx>
      23             : #include <svl/adrparse.hxx>
      24             : 
      25             : #include "hlinettp.hxx"
      26             : #include "hyperdlg.hrc"
      27             : #include "hlmarkwn_def.hxx"
      28             : 
      29             : sal_Char const sAnonymous[]    = "anonymous";
      30             : sal_Char const sHTTPScheme[]   = INET_HTTP_SCHEME;
      31             : sal_Char const sHTTPSScheme[]  = INET_HTTPS_SCHEME;
      32             : sal_Char const sFTPScheme[]    = INET_FTP_SCHEME;
      33             : 
      34             : /*************************************************************************
      35             : |*
      36             : |* Constructor / Destructor
      37             : |*
      38             : |************************************************************************/
      39             : 
      40           0 : SvxHyperlinkInternetTp::SvxHyperlinkInternetTp ( Window *pParent,
      41             :                                                  const SfxItemSet& rItemSet)
      42           0 : :   SvxHyperlinkTabPageBase ( pParent, CUI_RES( RID_SVXPAGE_HYPERLINK_INTERNET ),
      43             :                               rItemSet ) ,
      44           0 :     maGrpLinkTyp           ( this, CUI_RES (GRP_LINKTYPE) ),
      45           0 :     maRbtLinktypInternet    ( this, CUI_RES (RB_LINKTYP_INTERNET) ),
      46           0 :     maRbtLinktypFTP         ( this, CUI_RES (RB_LINKTYP_FTP) ),
      47           0 :     maFtTarget              ( this, CUI_RES (FT_TARGET_HTML) ),
      48             :     maCbbTarget             ( this, INET_PROT_HTTP ),
      49           0 :     maBtBrowse              ( this, CUI_RES (BTN_BROWSE) ),
      50           0 :     maFtLogin               ( this, CUI_RES (FT_LOGIN) ),
      51           0 :     maEdLogin               ( this, CUI_RES (ED_LOGIN) ),
      52           0 :     maBtTarget              ( this, CUI_RES (BTN_TARGET) ),
      53           0 :     maFtPassword            ( this, CUI_RES (FT_PASSWD) ),
      54           0 :     maEdPassword            ( this, CUI_RES (ED_PASSWD) ),
      55           0 :     maCbAnonymous           ( this, CUI_RES (CBX_ANONYMOUS) ),
      56           0 :     mbMarkWndOpen           ( sal_False )
      57             : {
      58             :     // Disable display of bitmap names.
      59           0 :     maBtBrowse.EnableTextDisplay (sal_False);
      60           0 :     maBtTarget.EnableTextDisplay (sal_False);
      61             : 
      62           0 :     InitStdControls();
      63           0 :     FreeResource();
      64             : 
      65             :     // Init URL-Box (pos&size, Open-Handler)
      66           0 :     maCbbTarget.SetPosSizePixel ( LogicToPixel( Point( COL_2, 25 ), MAP_APPFONT ),
      67           0 :                                   LogicToPixel( Size ( 176 - COL_DIFF, 60), MAP_APPFONT ) );
      68           0 :     maCbbTarget.Show();
      69           0 :     maCbbTarget.SetHelpId( HID_HYPERDLG_INET_PATH );
      70             : 
      71           0 :     SetExchangeSupport ();
      72             : 
      73             :     ///////////////////////////////////////
      74             :     // set defaults
      75           0 :     maRbtLinktypInternet.Check ();
      76           0 :     maFtLogin.Show( sal_False );
      77           0 :     maFtPassword.Show( sal_False );
      78           0 :     maEdLogin.Show( sal_False );
      79           0 :     maEdPassword.Show( sal_False );
      80           0 :     maCbAnonymous.Show( sal_False );
      81           0 :     maBtTarget.Enable( sal_False );
      82           0 :     maBtBrowse.Enable( sal_True );
      83             : 
      84             :     ///////////////////////////////////////
      85             :     // overload handlers
      86           0 :     Link aLink( LINK ( this, SvxHyperlinkInternetTp, Click_SmartProtocol_Impl ) );
      87           0 :     maRbtLinktypInternet.SetClickHdl( aLink );
      88           0 :     maRbtLinktypFTP.SetClickHdl     ( aLink );
      89           0 :     maCbAnonymous.SetClickHdl       ( LINK ( this, SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl ) );
      90           0 :     maBtBrowse.SetClickHdl          ( LINK ( this, SvxHyperlinkInternetTp, ClickBrowseHdl_Impl ) );
      91           0 :     maBtTarget.SetClickHdl          ( LINK ( this, SvxHyperlinkInternetTp, ClickTargetHdl_Impl ) );
      92           0 :     maEdLogin.SetModifyHdl          ( LINK ( this, SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl ) );
      93           0 :     maCbbTarget.SetLoseFocusHdl     ( LINK ( this, SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl ) );
      94           0 :     maCbbTarget.SetModifyHdl        ( LINK ( this, SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl ) );
      95           0 :     maTimer.SetTimeoutHdl           ( LINK ( this, SvxHyperlinkInternetTp, TimeoutHdl_Impl ) );
      96             : 
      97           0 :     maFtTarget.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
      98           0 :     maCbbTarget.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
      99           0 :     maBtTarget.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
     100           0 :     maBtTarget.SetAccessibleRelationLabeledBy( &maFtTarget );
     101           0 :     maBtBrowse.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
     102           0 :     maBtBrowse.SetAccessibleRelationLabeledBy( &maFtTarget );
     103           0 : }
     104             : 
     105           0 : SvxHyperlinkInternetTp::~SvxHyperlinkInternetTp ()
     106             : {
     107           0 : }
     108             : 
     109             : /*************************************************************************
     110             : |*
     111             : |* Fill the all dialog-controls except controls in groupbox "more..."
     112             : |*
     113             : |************************************************************************/
     114             : 
     115           0 : void SvxHyperlinkInternetTp::FillDlgFields ( String& aStrURL )
     116             : {
     117           0 :     INetURLObject aURL( aStrURL );
     118           0 :     String aStrScheme = GetSchemeFromURL( aStrURL );
     119             : 
     120             :     // set additional controls for FTP: Username / Password
     121           0 :     if ( aStrScheme.SearchAscii( sFTPScheme ) == 0 )
     122             :     {
     123           0 :         if ( String(aURL.GetUser()).ToLowerAscii().SearchAscii ( sAnonymous ) == 0 )
     124           0 :             setAnonymousFTPUser();
     125             :         else
     126           0 :             setFTPUser(aURL.GetUser(), aURL.GetPass());
     127             : 
     128             :         //do not show password and user in url
     129           0 :         if(!aURL.GetUser().isEmpty() || !aURL.GetPass().isEmpty() )
     130           0 :             aURL.SetUserAndPass(aEmptyStr,aEmptyStr);
     131             :     }
     132             : 
     133             :     // set URL-field
     134             :     // Show the scheme, #72740
     135           0 :     if ( aURL.GetProtocol() != INET_PROT_NOT_VALID )
     136           0 :         maCbbTarget.SetText( aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) );
     137             :     else
     138           0 :         maCbbTarget.SetText( aStrURL ); // #77696#
     139             : 
     140           0 :     SetScheme( aStrScheme );
     141           0 : }
     142             : 
     143           0 : void SvxHyperlinkInternetTp::setAnonymousFTPUser()
     144             : {
     145           0 :     maEdLogin.SetText(rtl::OUString(sAnonymous));
     146           0 :     SvAddressParser aAddress( SvtUserOptions().GetEmail() );
     147           0 :     maEdPassword.SetText( aAddress.Count() ? aAddress.GetEmailAddress(0) : rtl::OUString() );
     148             : 
     149           0 :     maFtLogin.Disable ();
     150           0 :     maFtPassword.Disable ();
     151           0 :     maEdLogin.Disable ();
     152           0 :     maEdPassword.Disable ();
     153           0 :     maCbAnonymous.Check();
     154           0 : }
     155             : 
     156           0 : void SvxHyperlinkInternetTp::setFTPUser(const String& rUser, const String& rPassword)
     157             : {
     158           0 :     maEdLogin.SetText ( rUser );
     159           0 :     maEdPassword.SetText ( rPassword );
     160             : 
     161           0 :     maFtLogin.Enable ();
     162           0 :     maFtPassword.Enable ();
     163           0 :     maEdLogin.Enable ();
     164           0 :     maEdPassword.Enable ();
     165           0 :     maCbAnonymous.Check(sal_False);
     166           0 : }
     167             : 
     168             : /*************************************************************************
     169             : |*
     170             : |* retrieve and prepare data from dialog-fields
     171             : |*
     172             : |************************************************************************/
     173             : 
     174           0 : void SvxHyperlinkInternetTp::GetCurentItemData ( String& aStrURL, String& aStrName,
     175             :                                                  String& aStrIntName, String& aStrFrame,
     176             :                                                  SvxLinkInsertMode& eMode )
     177             : {
     178           0 :     aStrURL = CreateAbsoluteURL();
     179           0 :     GetDataFromCommonFields( aStrName, aStrIntName, aStrFrame, eMode );
     180           0 : }
     181             : 
     182           0 : String SvxHyperlinkInternetTp::CreateAbsoluteURL() const
     183             : {
     184           0 :     String aStrURL = maCbbTarget.GetText();
     185           0 :     String aScheme = GetSchemeFromURL(aStrURL);
     186             : 
     187           0 :     INetURLObject aURL(aStrURL);
     188             : 
     189           0 :     if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
     190             :     {
     191           0 :         aURL.SetSmartProtocol( GetSmartProtocolFromButtons() );
     192           0 :         aURL.SetSmartURL(aStrURL);
     193             :     }
     194             : 
     195             :     // username and password for ftp-url
     196           0 :     if( aURL.GetProtocol() == INET_PROT_FTP && maEdLogin.GetText().Len()!=0 )
     197           0 :         aURL.SetUserAndPass ( maEdLogin.GetText(), maEdPassword.GetText() );
     198             : 
     199           0 :     if ( aURL.GetProtocol() != INET_PROT_NOT_VALID )
     200           0 :         return aURL.GetMainURL( INetURLObject::DECODE_WITH_CHARSET );
     201             :     else //#105788# always create a URL even if it is not valid
     202           0 :         return aStrURL;
     203             : }
     204             : 
     205             : /*************************************************************************
     206             : |*
     207             : |* static method to create Tabpage
     208             : |*
     209             : |************************************************************************/
     210             : 
     211           0 : IconChoicePage* SvxHyperlinkInternetTp::Create( Window* pWindow, const SfxItemSet& rItemSet )
     212             : {
     213           0 :     return( new SvxHyperlinkInternetTp( pWindow, rItemSet ) );
     214             : }
     215             : 
     216             : /*************************************************************************
     217             : |*
     218             : |* Set initial focus
     219             : |*
     220             : |************************************************************************/
     221             : 
     222           0 : void SvxHyperlinkInternetTp::SetInitFocus()
     223             : {
     224           0 :     maCbbTarget.GrabFocus();
     225           0 : }
     226             : 
     227             : /*************************************************************************
     228             : |*
     229             : |* Contents of editfield "Target" modified
     230             : |*
     231             : |************************************************************************/
     232             : 
     233           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl)
     234             : {
     235           0 :     String aScheme = GetSchemeFromURL( maCbbTarget.GetText() );
     236           0 :     if(aScheme.Len()!=0)
     237           0 :         SetScheme( aScheme );
     238             : 
     239             :     // start timer
     240           0 :     maTimer.SetTimeout( 2500 );
     241           0 :     maTimer.Start();
     242             : 
     243           0 :     return( 0L );
     244             : }
     245             : 
     246             : /*************************************************************************
     247             : |*
     248             : |* If target-field was modify, to browse the new doc after timeout
     249             : |*
     250             : |************************************************************************/
     251             : 
     252           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, TimeoutHdl_Impl)
     253             : {
     254           0 :     RefreshMarkWindow();
     255           0 :     return( 0L );
     256             : }
     257             : 
     258             : /*************************************************************************
     259             : |*
     260             : |* Contents of editfield "Login" modified
     261             : |*
     262             : |************************************************************************/
     263             : 
     264           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl)
     265             : {
     266           0 :     String aStrLogin ( maEdLogin.GetText() );
     267           0 :     if ( aStrLogin.EqualsIgnoreCaseAscii( sAnonymous ) )
     268             :     {
     269           0 :         maCbAnonymous.Check();
     270           0 :         ClickAnonymousHdl_Impl(NULL);
     271             :     }
     272             : 
     273           0 :     return( 0L );
     274             : }
     275             : 
     276             : /*************************************************************************
     277             : |************************************************************************/
     278             : 
     279           0 : void SvxHyperlinkInternetTp::SetScheme( const String& aScheme )
     280             : {
     281             :     //if  aScheme is empty or unknown the default beaviour is like it where HTTP
     282             : 
     283           0 :     sal_Bool bFTP = aScheme.SearchAscii( sFTPScheme ) == 0;
     284           0 :     sal_Bool bInternet = !(bFTP);
     285             : 
     286             :     //update protocol button selection:
     287           0 :     maRbtLinktypFTP.Check(bFTP);
     288           0 :     maRbtLinktypInternet.Check(bInternet);
     289             : 
     290             :     //update target:
     291           0 :     RemoveImproperProtocol(aScheme);
     292           0 :     maCbbTarget.SetSmartProtocol( GetSmartProtocolFromButtons() );
     293             : 
     294             :     //show/hide  special fields for FTP:
     295           0 :     maFtLogin.Show( bFTP );
     296           0 :     maFtPassword.Show( bFTP );
     297           0 :     maEdLogin.Show( bFTP );
     298           0 :     maEdPassword.Show( bFTP );
     299           0 :     maCbAnonymous.Show( bFTP );
     300             : 
     301             :     //update 'link target in document'-window and opening-button
     302           0 :     if( aScheme.SearchAscii( sHTTPScheme ) == 0 || aScheme.Len() == 0 )
     303             :     {
     304           0 :         maBtTarget.Enable();
     305           0 :         if ( mbMarkWndOpen )
     306           0 :             ShowMarkWnd ();
     307             :     }
     308             :     else
     309             :     {
     310             :         //disable for https and ftp
     311           0 :         maBtTarget.Disable();
     312           0 :         if ( mbMarkWndOpen )
     313           0 :             HideMarkWnd ();
     314             :     }
     315           0 : }
     316             : 
     317             : /*************************************************************************
     318             : |*
     319             : |* Remove protocol if it does not fit to the current button selection
     320             : |*
     321             : |************************************************************************/
     322             : 
     323           0 : void SvxHyperlinkInternetTp::RemoveImproperProtocol(const String& aProperScheme)
     324             : {
     325           0 :     String aStrURL ( maCbbTarget.GetText() );
     326           0 :     if ( aStrURL != aEmptyStr )
     327             :     {
     328           0 :         String aStrScheme = GetSchemeFromURL( aStrURL );
     329           0 :         if ( aStrScheme != aEmptyStr && aStrScheme != aProperScheme )
     330             :         {
     331           0 :             aStrURL.Erase ( 0, aStrScheme.Len() );
     332           0 :             maCbbTarget.SetText ( aStrURL );
     333           0 :         }
     334           0 :     }
     335           0 : }
     336             : 
     337           0 : String SvxHyperlinkInternetTp::GetSchemeFromButtons() const
     338             : {
     339           0 :     if( maRbtLinktypFTP.IsChecked() )
     340           0 :         return rtl::OUString(INET_FTP_SCHEME);
     341           0 :     return rtl::OUString(INET_HTTP_SCHEME);
     342             : }
     343             : 
     344           0 : INetProtocol SvxHyperlinkInternetTp::GetSmartProtocolFromButtons() const
     345             : {
     346           0 :     if( maRbtLinktypFTP.IsChecked() )
     347             :     {
     348           0 :         return INET_PROT_FTP;
     349             :     }
     350           0 :     return INET_PROT_HTTP;
     351             : }
     352             : 
     353             : /*************************************************************************
     354             : |*
     355             : |* Click on Radiobutton : Internet or FTP
     356             : |*
     357             : |************************************************************************/
     358             : 
     359           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, Click_SmartProtocol_Impl)
     360             : {
     361           0 :     String aScheme = GetSchemeFromButtons();
     362           0 :     SetScheme( aScheme );
     363           0 :     return( 0L );
     364             : }
     365             : 
     366             : /*************************************************************************
     367             : |*
     368             : |* Click on Checkbox : Anonymous user
     369             : |*
     370             : |************************************************************************/
     371             : 
     372           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl)
     373             : {
     374             :     // disable login-editfields if checked
     375           0 :     if ( maCbAnonymous.IsChecked() )
     376             :     {
     377           0 :         if ( maEdLogin.GetText().ToLowerAscii().SearchAscii ( sAnonymous ) == 0 )
     378             :         {
     379           0 :             maStrOldUser = aEmptyStr;
     380           0 :             maStrOldPassword = aEmptyStr;
     381             :         }
     382             :         else
     383             :         {
     384           0 :             maStrOldUser = maEdLogin.GetText();
     385           0 :             maStrOldPassword = maEdPassword.GetText();
     386             :         }
     387             : 
     388           0 :         setAnonymousFTPUser();
     389             :     }
     390             :     else
     391           0 :         setFTPUser(maStrOldUser, maStrOldPassword);
     392             : 
     393           0 :     return( 0L );
     394             : }
     395             : 
     396             : /*************************************************************************
     397             : |*
     398             : |* Combobox Target lost the focus
     399             : |*
     400             : |************************************************************************/
     401             : 
     402           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl)
     403             : {
     404           0 :     RefreshMarkWindow();
     405           0 :     return (0L);
     406             : }
     407             : 
     408             : /*************************************************************************
     409             : |*
     410             : |* Click on imagebutton : Browse
     411             : |*
     412             : |************************************************************************/
     413             : 
     414           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickBrowseHdl_Impl)
     415             : {
     416             :     /////////////////////////////////////////////////
     417             :     // Open URL if available
     418             : 
     419           0 :     SfxStringItem aName( SID_FILE_NAME, rtl::OUString("http://") );
     420           0 :     SfxStringItem aRefererItem( SID_REFERER, rtl::OUString("private:user") );
     421           0 :     SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, sal_True );
     422           0 :     SfxBoolItem aSilent( SID_SILENT, sal_True );
     423           0 :     SfxBoolItem aReadOnly( SID_DOC_READONLY, sal_True );
     424             : 
     425           0 :     SfxBoolItem aBrowse( SID_BROWSE, sal_True );
     426             : 
     427           0 :     const SfxPoolItem *ppItems[] = { &aName, &aNewView, &aSilent, &aReadOnly, &aRefererItem, &aBrowse, NULL };
     428           0 :     (((SvxHpLinkDlg*)mpDialog)->GetBindings())->Execute( SID_OPENDOC, ppItems, 0, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
     429             : 
     430           0 :     return( 0L );
     431             : }
     432             : 
     433             : /*************************************************************************
     434             : |*
     435             : |* Click on imagebutton : Target
     436             : |*
     437             : |************************************************************************/
     438             : 
     439           0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickTargetHdl_Impl)
     440             : {
     441           0 :     RefreshMarkWindow();
     442           0 :     ShowMarkWnd ();
     443           0 :     mbMarkWndOpen = IsMarkWndVisible ();
     444             : 
     445           0 :     return( 0L );
     446             : }
     447             : 
     448           0 : void SvxHyperlinkInternetTp::RefreshMarkWindow()
     449             : {
     450           0 :     if ( maRbtLinktypInternet.IsChecked() && IsMarkWndVisible() )
     451             :     {
     452           0 :         EnterWait();
     453           0 :         String aStrURL( CreateAbsoluteURL() );
     454           0 :         if ( aStrURL != aEmptyStr )
     455           0 :             mpMarkWnd->RefreshTree ( aStrURL );
     456             :         else
     457           0 :             mpMarkWnd->SetError( LERR_DOCNOTOPEN );
     458           0 :         LeaveWait();
     459             :     }
     460             : 
     461           0 : }
     462             : 
     463             : /*************************************************************************
     464             : |*
     465             : |* Get String from Bookmark-Wnd
     466             : |*
     467             : |************************************************************************/
     468             : 
     469           0 : void SvxHyperlinkInternetTp::SetMarkStr ( String& aStrMark )
     470             : {
     471           0 :     String aStrURL ( maCbbTarget.GetText() );
     472             : 
     473           0 :     const sal_Unicode sUHash = '#';
     474           0 :     xub_StrLen nPos = aStrURL.SearchBackward( sUHash );
     475             : 
     476           0 :     if( nPos != STRING_NOTFOUND )
     477           0 :         aStrURL.Erase ( nPos );
     478             : 
     479           0 :     aStrURL += sUHash;
     480           0 :     aStrURL += aStrMark;
     481             : 
     482           0 :     maCbbTarget.SetText ( aStrURL );
     483           0 : }
     484             : 
     485             : /*************************************************************************
     486             : |*
     487             : |* Enable Browse-Button in subject to the office is in onlinemode
     488             : |*
     489             : |************************************************************************/
     490             : 
     491           0 : void SvxHyperlinkInternetTp::SetOnlineMode( sal_Bool /*bEnable*/ )
     492             : {
     493             :     // State of target-button in subject to the current url-string
     494             :     // ( Can't display any targets in an document, if there is no
     495             :     //   valid url to a document )
     496           0 :     String aStrCurrentTarget(comphelper::string::stripEnd(maCbbTarget.GetText(), ' '));
     497             : 
     498           0 :     if( aStrCurrentTarget == aEmptyStr                ||
     499           0 :         aStrCurrentTarget.EqualsIgnoreCaseAscii( sHTTPScheme )  ||
     500           0 :         aStrCurrentTarget.EqualsIgnoreCaseAscii( sHTTPSScheme ) )
     501           0 :         maBtTarget.Enable( sal_False );
     502             :     else
     503           0 :         maBtTarget.Enable( sal_True );
     504           3 : }
     505             : 
     506             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10