LCOV - code coverage report
Current view: top level - svtools/source/dialogs - ServerDetailsControls.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 1 224 0.4 %
Date: 2014-04-14 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             : 
      10             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      11             : #include <com/sun/star/task/InteractionHandler.hpp>
      12             : #include <com/sun/star/ucb/XCommandEnvironment.hpp>
      13             : #include <com/sun/star/ucb/XContentAccess.hpp>
      14             : #include <com/sun/star/sdbc/XResultSet.hpp>
      15             : #include <com/sun/star/sdbc/XRow.hpp>
      16             : 
      17             : #include <comphelper/processfactory.hxx>
      18             : #include <officecfg/Office/Common.hxx>
      19             : #include <rtl/uri.hxx>
      20             : #include <ucbhelper/content.hxx>
      21             : #include <ucbhelper/commandenvironment.hxx>
      22             : 
      23             : #include <svtools/PlaceEditDialog.hxx>
      24             : #include <svtools/ServerDetailsControls.hxx>
      25             : #include <config_oauth2.h>
      26             : 
      27             : using namespace std;
      28             : using namespace com::sun::star::lang;
      29             : using namespace com::sun::star::sdbc;
      30             : using namespace com::sun::star::task;
      31             : using namespace com::sun::star::ucb;
      32             : using namespace com::sun::star::uno;
      33             : 
      34           0 : DetailsContainer::DetailsContainer( VclBuilderContainer* pBuilder, const OString& rFrame )
      35             : {
      36           0 :     pBuilder->get( m_pFrame, rFrame );
      37           0 : }
      38             : 
      39           0 : DetailsContainer::~DetailsContainer( )
      40             : {
      41           0 : }
      42             : 
      43           0 : void DetailsContainer::show( bool bShow )
      44             : {
      45           0 :     m_pFrame->Show( bShow );
      46           0 : }
      47             : 
      48           0 : INetURLObject DetailsContainer::getUrl( )
      49             : {
      50             :     // Don't use that class directly: make it smarter by subclassing it.
      51           0 :     return INetURLObject( );
      52             : }
      53             : 
      54           0 : bool DetailsContainer::setUrl( const INetURLObject& )
      55             : {
      56             :     // That class doesn't contain any logic... it defers the dirty work
      57             :     // to the sub classes.
      58           0 :     return false;
      59             : }
      60             : 
      61           0 : void DetailsContainer::notifyChange( )
      62             : {
      63           0 :     m_aChangeHdl.Call( this );
      64           0 : }
      65             : 
      66           0 : IMPL_LINK( DetailsContainer, ValueChangeHdl, void *, EMPTYARG )
      67             : {
      68           0 :     notifyChange( );
      69           0 :     return 0;
      70             : }
      71             : 
      72           0 : HostDetailsContainer::HostDetailsContainer( VclBuilderContainer* pBuilder, sal_uInt16 nPort, const OUString& sScheme ) :
      73             :     DetailsContainer( pBuilder, "HostDetails" ),
      74             :     m_nDefaultPort( nPort ),
      75           0 :     m_sScheme( sScheme )
      76             : {
      77           0 :     pBuilder->get( m_pEDHost, "host" );
      78           0 :     m_pEDHost->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
      79             : 
      80           0 :     pBuilder->get( m_pEDPort, "port" );
      81           0 :     m_pEDPort->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
      82             : 
      83           0 :     pBuilder->get( m_pEDPath, "path" );
      84           0 :     m_pEDPath->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
      85             : 
      86           0 :     show( false );
      87           0 : }
      88             : 
      89           0 : void HostDetailsContainer::show( bool bShow )
      90             : {
      91           0 :     DetailsContainer::show( bShow );
      92           0 :     if ( bShow )
      93           0 :         m_pEDPort->SetValue( m_nDefaultPort );
      94           0 : }
      95             : 
      96           0 : INetURLObject HostDetailsContainer::getUrl( )
      97             : {
      98           0 :     OUString sHost = m_pEDHost->GetText().trim( );
      99           0 :     sal_Int64 nPort = m_pEDPort->GetValue();
     100           0 :     OUString sPath = m_pEDPath->GetText().trim( );
     101             : 
     102           0 :     OUString sUrl;
     103           0 :     if ( !sHost.isEmpty( ) )
     104             :     {
     105           0 :         sUrl = m_sScheme + "://" + sHost;
     106           0 :         if ( nPort != m_nDefaultPort )
     107           0 :             sUrl += ":" + OUString::number( nPort );
     108           0 :         if ( !sPath.isEmpty( ) )
     109           0 :             if ( sPath.indexOf( '/' ) != 0 )
     110           0 :                 sUrl += "/";
     111           0 :         sUrl += sPath;
     112             :     }
     113             : 
     114           0 :     return INetURLObject( sUrl );
     115             : }
     116             : 
     117           0 : bool HostDetailsContainer::setUrl( const INetURLObject& rUrl )
     118             : {
     119           0 :     bool bSuccess = verifyScheme( INetURLObject::GetScheme( rUrl.GetProtocol( ) ) );
     120             : 
     121           0 :     if ( bSuccess )
     122             :     {
     123           0 :         m_pEDHost->SetText( rUrl.GetHost( ) );
     124           0 :         m_pEDPort->SetValue( rUrl.GetPort( ) );
     125           0 :         m_pEDPath->SetText( rUrl.GetURLPath() );
     126             :     }
     127             : 
     128           0 :     return bSuccess;
     129             : }
     130             : 
     131           0 : bool HostDetailsContainer::verifyScheme( const OUString& sScheme )
     132             : {
     133           0 :     return sScheme.equals( m_sScheme + "://" );
     134             : }
     135             : 
     136           0 : DavDetailsContainer::DavDetailsContainer( VclBuilderContainer* pBuilder ) :
     137           0 :     HostDetailsContainer( pBuilder, 80, "http" )
     138             : {
     139           0 :     pBuilder->get( m_pCBDavs, "webdavs" );
     140           0 :     m_pCBDavs->SetToggleHdl( LINK( this, DavDetailsContainer, ToggledDavsHdl ) );
     141             : 
     142           0 :     show( false );
     143           0 : }
     144             : 
     145           0 : void DavDetailsContainer::show( bool bShow )
     146             : {
     147           0 :     HostDetailsContainer::show( bShow );
     148             : 
     149           0 :     m_pCBDavs->Show( bShow );
     150             : 
     151           0 :     if ( bShow )
     152           0 :         m_pCBDavs->Check( false );
     153           0 : }
     154             : 
     155           0 : bool DavDetailsContainer::verifyScheme( const OUString& rScheme )
     156             : {
     157           0 :     bool bValid = false;
     158           0 :     if ( rScheme.equals( "http://" ) )
     159             :     {
     160           0 :         bValid = true;
     161           0 :         m_pCBDavs->Check( false );
     162             :     }
     163           0 :     else if ( rScheme.equals( "https://" ) )
     164             :     {
     165           0 :         bValid = true;
     166           0 :         m_pCBDavs->Check( true );
     167             :     }
     168           0 :     return bValid;
     169             : }
     170             : 
     171           0 : IMPL_LINK( DavDetailsContainer, ToggledDavsHdl, CheckBox*, pCheckBox )
     172             : {
     173             :     // Change default port if needed
     174           0 :     sal_Bool bCheckedDavs = pCheckBox->IsChecked();
     175           0 :     if ( m_pEDPort->GetValue() == 80 && bCheckedDavs == sal_True)
     176           0 :         m_pEDPort->SetValue( 443 );
     177           0 :     else if ( m_pEDPort->GetValue() == 443 && bCheckedDavs == sal_False )
     178           0 :         m_pEDPort->SetValue( 80 );
     179             : 
     180           0 :     OUString sScheme( "http" );
     181           0 :     if ( bCheckedDavs )
     182           0 :         sScheme = "https";
     183           0 :     setScheme( sScheme );
     184             : 
     185           0 :     notifyChange( );
     186             : 
     187           0 :     return 0;
     188             : }
     189             : 
     190           0 : SmbDetailsContainer::SmbDetailsContainer( VclBuilderContainer* pBuilder ) :
     191           0 :     DetailsContainer( pBuilder, "SmbDetails" )
     192             : {
     193           0 :     pBuilder->get( m_pEDHost, "smbHost" );
     194           0 :     m_pEDHost->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
     195             : 
     196           0 :     pBuilder->get( m_pEDShare, "smbShare" );
     197           0 :     m_pEDShare->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
     198             : 
     199           0 :     pBuilder->get( m_pEDPath, "smbPath" );
     200           0 :     m_pEDPath->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
     201             : 
     202           0 :     show( false );
     203           0 : }
     204             : 
     205           0 : INetURLObject SmbDetailsContainer::getUrl( )
     206             : {
     207           0 :     OUString sHost = m_pEDHost->GetText().trim( );
     208           0 :     OUString sShare = m_pEDShare->GetText().trim( );
     209           0 :     OUString sPath = m_pEDPath->GetText().trim( );
     210             : 
     211           0 :     OUString sUrl;
     212           0 :     if ( !sHost.isEmpty( ) )
     213             :     {
     214           0 :         sUrl = "smb://" + sHost + "/";
     215           0 :         if ( !sShare.isEmpty( ) )
     216           0 :             sUrl += sShare;
     217           0 :         if ( !sPath.isEmpty( ) )
     218           0 :             if ( sPath.indexOf( '/' ) != 0 )
     219           0 :                 sUrl += "/";
     220           0 :         sUrl += sPath;
     221             :     }
     222             : 
     223           0 :     return INetURLObject( sUrl );
     224             : }
     225             : 
     226           0 : bool SmbDetailsContainer::setUrl( const INetURLObject& rUrl )
     227             : {
     228           0 :     bool bSuccess =  rUrl.GetProtocol() == INET_PROT_SMB;
     229             : 
     230           0 :     if ( bSuccess )
     231             :     {
     232           0 :         OUString sShare = rUrl.getName( 0 );
     233           0 :         OUString sFullPath = rUrl.GetURLPath( );
     234           0 :         OUString sPath;
     235           0 :         if ( sFullPath.getLength( ) > sShare.getLength( ) )
     236             :         {
     237           0 :             sal_Int32 nPos = sShare.getLength( );
     238           0 :             if ( nPos != 0 )
     239           0 :                 ++nPos;
     240           0 :             sPath = sFullPath.copy( nPos );
     241             :         }
     242             : 
     243           0 :         m_pEDHost->SetText( rUrl.GetHost( ) );
     244           0 :         m_pEDShare->SetText( sShare );
     245           0 :         m_pEDPath->SetText( sPath );
     246             :     }
     247             : 
     248           0 :     return bSuccess;
     249             : }
     250             : 
     251           0 : CmisDetailsContainer::CmisDetailsContainer( VclBuilderContainer* pBuilder ) :
     252             :     DetailsContainer( pBuilder, "CmisDetails" ),
     253             :     m_sUsername( ),
     254             :     m_xCmdEnv( ),
     255             :     m_aServerTypesURLs( ),
     256             :     m_aRepoIds( ),
     257           0 :     m_sRepoId( )
     258             : {
     259           0 :     Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
     260             :     Reference< XInteractionHandler > xGlobalInteractionHandler(
     261           0 :         InteractionHandler::createWithParent(xContext, 0), UNO_QUERY );
     262           0 :     m_xCmdEnv = new ucbhelper::CommandEnvironment( xGlobalInteractionHandler, Reference< XProgressHandler >() );
     263             : 
     264           0 :     pBuilder->get( m_pLBServerType, "serverType" );
     265           0 :     m_pLBServerType->SetSelectHdl( LINK( this, CmisDetailsContainer, SelectServerTypeHdl ) );
     266             : 
     267           0 :     pBuilder->get( m_pEDBinding, "binding" );
     268           0 :     m_pEDBinding->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
     269             : 
     270           0 :     pBuilder->get( m_pLBRepository, "repositories" );
     271           0 :     m_pLBRepository->SetSelectHdl( LINK( this, CmisDetailsContainer, SelectRepoHdl ) );
     272             : 
     273           0 :     pBuilder->get( m_pBTRepoRefresh, "repositoriesRefresh" );
     274           0 :     m_pBTRepoRefresh->SetClickHdl( LINK( this, CmisDetailsContainer, RefreshReposHdl ) );
     275             : 
     276           0 :     pBuilder->get( m_pEDPath, "cmisPath" );
     277           0 :     m_pEDPath->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
     278             : 
     279           0 :     show( false );
     280             : 
     281             :     // Load the ServerType entries
     282           0 :     bool bSkipGDrive = OUString( GDRIVE_CLIENT_ID ).isEmpty() ||
     283           0 :                        OUString( GDRIVE_CLIENT_SECRET ).isEmpty();
     284           0 :     bool bSkipAlfresco = OUString( ALFRESCO_CLOUD_CLIENT_ID ).isEmpty() ||
     285           0 :                        OUString( ALFRESCO_CLOUD_CLIENT_SECRET ).isEmpty();
     286             : 
     287           0 :     Sequence< OUString > aTypesUrlsList( officecfg::Office::Common::Misc::CmisServersUrls::get( xContext ) );
     288           0 :     Sequence< OUString > aTypesNamesList( officecfg::Office::Common::Misc::CmisServersNames::get( xContext ) );
     289           0 :     for ( sal_Int32 i = 0; i < aTypesUrlsList.getLength( ) && aTypesNamesList.getLength( ); ++i )
     290             :     {
     291           0 :         OUString sUrl = aTypesUrlsList[i];
     292           0 :         if ( !( sUrl == GDRIVE_BASE_URL && bSkipGDrive ) &&
     293           0 :              !( sUrl.startsWith( ALFRESCO_CLOUD_BASE_URL ) && bSkipAlfresco ) )
     294             :         {
     295           0 :             m_pLBServerType->InsertEntry( aTypesNamesList[i] );
     296           0 :             m_aServerTypesURLs.push_back( sUrl );
     297             :         }
     298           0 :     }
     299           0 : }
     300             : 
     301           0 : INetURLObject CmisDetailsContainer::getUrl( )
     302             : {
     303           0 :     OUString sBindingUrl = m_pEDBinding->GetText().trim( );
     304           0 :     OUString sPath = m_pEDPath->GetText().trim( );
     305             : 
     306           0 :     OUString sUrl;
     307           0 :     if ( !sBindingUrl.isEmpty( ) && !m_sRepoId.isEmpty() )
     308             :     {
     309             :         OUString sEncodedBinding = rtl::Uri::encode(
     310           0 :                 sBindingUrl + "#" + m_sRepoId,
     311             :                 rtl_UriCharClassRelSegment,
     312             :                 rtl_UriEncodeKeepEscapes,
     313           0 :                 RTL_TEXTENCODING_UTF8 );
     314           0 :         sUrl = "vnd.libreoffice.cmis://" + sEncodedBinding;
     315             :     }
     316           0 :     sUrl += sPath;
     317             : 
     318           0 :     return INetURLObject( sUrl );
     319             : }
     320             : 
     321           0 : bool CmisDetailsContainer::setUrl( const INetURLObject& rUrl )
     322             : {
     323           0 :     bool bSuccess =  rUrl.GetProtocol() == INET_PROT_CMIS;
     324             : 
     325           0 :     if ( bSuccess )
     326             :     {
     327           0 :         OUString sBindingUrl;
     328           0 :         OUString sRepositoryId;
     329             : 
     330           0 :         OUString sDecodedHost = rUrl.GetHost( INetURLObject::DECODE_WITH_CHARSET );
     331           0 :         INetURLObject aHostUrl( sDecodedHost );
     332           0 :         sBindingUrl = aHostUrl.GetURLNoMark( );
     333           0 :         sRepositoryId = aHostUrl.GetMark( );
     334             : 
     335           0 :         m_pEDBinding->SetText( sBindingUrl );
     336           0 :         m_pEDPath->SetText( rUrl.GetURLPath() );
     337             :     }
     338           0 :     return bSuccess;
     339             : }
     340             : 
     341           0 : void CmisDetailsContainer::setUsername( const OUString& rUsername )
     342             : {
     343           0 :     m_sUsername = rUsername;
     344           0 : }
     345             : 
     346           0 : void CmisDetailsContainer::selectRepository( )
     347             : {
     348             :     // Get the repo ID and call the Change listener
     349           0 :     sal_uInt16 nPos = m_pLBRepository->GetSelectEntryPos( );
     350           0 :     m_sRepoId = m_aRepoIds[nPos];
     351             : 
     352           0 :     notifyChange( );
     353           0 : }
     354             : 
     355           0 : IMPL_LINK( CmisDetailsContainer, SelectServerTypeHdl, void *, EMPTYARG  )
     356             : {
     357             :     // Set a sample URL for the server
     358           0 :     sal_uInt16 nId = m_pLBServerType->GetSelectEntryPos( );
     359           0 :     m_pEDBinding->SetText( m_aServerTypesURLs[nId] );
     360           0 :     return 0;
     361             : }
     362             : 
     363           0 : IMPL_LINK( CmisDetailsContainer, RefreshReposHdl, void *, EMPTYARG  )
     364             : {
     365           0 :     OUString sBindingUrl = m_pEDBinding->GetText().trim( );
     366             : 
     367             :     // Clean the listbox
     368           0 :     m_pLBRepository->Clear( );
     369           0 :     m_aRepoIds.clear( );
     370             : 
     371             :     // Compute the URL
     372           0 :     OUString sUrl;
     373           0 :     if ( !sBindingUrl.isEmpty( ) )
     374             :     {
     375             :         OUString sEncodedBinding = rtl::Uri::encode(
     376             :                 sBindingUrl,
     377             :                 rtl_UriCharClassRelSegment,
     378             :                 rtl_UriEncodeKeepEscapes,
     379           0 :                 RTL_TEXTENCODING_UTF8 );
     380           0 :         sUrl = "vnd.libreoffice.cmis://" + sEncodedBinding;
     381             :     }
     382             : 
     383             :     // Get the Content
     384           0 :     ::ucbhelper::Content aCnt( sUrl, m_xCmdEnv, comphelper::getProcessComponentContext() );
     385           0 :     Sequence< OUString > aProps( 1 );
     386           0 :     aProps[0] = "Title";
     387             : 
     388             :     try
     389             :     {
     390           0 :         Reference< XResultSet > xResultSet( aCnt.createCursor( aProps ), UNO_QUERY_THROW );
     391           0 :         Reference< XContentAccess > xAccess( xResultSet, UNO_QUERY_THROW );
     392           0 :         while ( xResultSet->next() )
     393             :         {
     394           0 :             OUString sURL = xAccess->queryContentIdentifierString( );
     395           0 :             INetURLObject aURL( sURL );
     396           0 :             OUString sId = aURL.GetURLPath( INetURLObject::DECODE_WITH_CHARSET );
     397           0 :             sId = sId.copy( 1 );
     398           0 :             m_aRepoIds.push_back( sId );
     399             : 
     400           0 :             Reference< XRow > xRow( xResultSet, UNO_QUERY );
     401           0 :             OUString sName = xRow->getString( 1 );
     402           0 :             m_pLBRepository->InsertEntry( sName );
     403           0 :         }
     404             :     }
     405           0 :     catch ( const Exception& )
     406             :     {
     407             :     }
     408             : 
     409             :     // Auto-select the first one
     410           0 :     if ( m_pLBRepository->GetEntryCount( ) > 0 )
     411             :     {
     412           0 :         m_pLBRepository->SelectEntryPos( 0 );
     413           0 :         selectRepository( );
     414             :     }
     415             : 
     416           0 :     return 0;
     417             : }
     418             : 
     419           0 : IMPL_LINK( CmisDetailsContainer, SelectRepoHdl, void *, EMPTYARG  )
     420             : {
     421           0 :     selectRepository( );
     422           0 :     return 0;
     423           3 : }
     424             : 
     425             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10