/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_framework.hxx" //_________________________________________________________________________________________________________________ // my own includes //_________________________________________________________________________________________________________________ #include #include #include #include //_________________________________________________________________________________________________________________ // interface includes //_________________________________________________________________________________________________________________ //_________________________________________________________________________________________________________________ // includes of other projects //_________________________________________________________________________________________________________________ #include #include #include //_________________________________________________________________________________________________________________ // namespace //_________________________________________________________________________________________________________________ namespace framework{ using namespace ::osl ; using namespace ::cppu ; using namespace ::com::sun::star::uno ; using namespace ::com::sun::star::lang ; using namespace ::com::sun::star::util ; //_________________________________________________________________________________________________________________ // non exported const //_________________________________________________________________________________________________________________ //_________________________________________________________________________________________________________________ // non exported definitions //_________________________________________________________________________________________________________________ //_________________________________________________________________________________________________________________ // declarations //_________________________________________________________________________________________________________________ //***************************************************************************************************************** // constructor //***************************************************************************************************************** URLTransformer::URLTransformer( const Reference< XMultiServiceFactory >& /*xFactory*/ ) { // Safe impossible cases. // Method not defined for all incoming parameter. //LOG_ASSERT( xFactory.is(), "URLTransformer::URLTransformer()\nInvalid parameter detected!\n" ) } //***************************************************************************************************************** // destructor //***************************************************************************************************************** URLTransformer::~URLTransformer() { } //***************************************************************************************************************** // XInterface, XTypeProvider, XServiceInfo //***************************************************************************************************************** DEFINE_XSERVICEINFO_MULTISERVICE ( URLTransformer , OWeakObject , SERVICENAME_URLTRANSFORMER , IMPLEMENTATIONNAME_URLTRANSFORMER ) DEFINE_INIT_SERVICE ( URLTransformer, { } ) namespace { void lcl_ParserHelper(INetURLObject& _rParser,URL& _rURL,bool _bUseIntern) { // Get all information about this URL. _rURL.Protocol = INetURLObject::GetScheme( _rParser.GetProtocol() ); _rURL.User = _rParser.GetUser ( INetURLObject::DECODE_WITH_CHARSET ); _rURL.Password = _rParser.GetPass ( INetURLObject::DECODE_WITH_CHARSET ); _rURL.Server = _rParser.GetHost ( INetURLObject::DECODE_WITH_CHARSET ); _rURL.Port = (sal_Int16)_rParser.GetPort(); sal_Int32 nCount = _rParser.getSegmentCount( false ); if ( nCount > 0 ) { // Don't add last segment as it is the name! --nCount; rtl::OUStringBuffer aPath; for ( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) { aPath.append( sal_Unicode( '/' )); aPath.append( _rParser.getName( nIndex, false, INetURLObject::NO_DECODE )); } if ( nCount > 0 ) aPath.append( sal_Unicode( '/' )); // final slash! _rURL.Path = aPath.makeStringAndClear(); _rURL.Name = _rParser.getName( INetURLObject::LAST_SEGMENT, false, INetURLObject::NO_DECODE ); } else { _rURL.Path = _rParser.GetURLPath( INetURLObject::NO_DECODE ); _rURL.Name = _rParser.GetName ( ); } _rURL.Arguments = _rParser.GetParam ( INetURLObject::NO_DECODE ); _rURL.Mark = _rParser.GetMark ( INetURLObject::DECODE_WITH_CHARSET ); // INetURLObject supports only an intelligent method of parsing URL's. So write // back Complete to have a valid encoded URL in all cases! _rURL.Complete = _rParser.GetMainURL( INetURLObject::NO_DECODE ); if ( _bUseIntern ) _rURL.Complete = _rURL.Complete.intern(); _rParser.SetMark ( ::rtl::OUString() ); _rParser.SetParam( ::rtl::OUString() ); _rURL.Main = _rParser.GetMainURL( INetURLObject::NO_DECODE ); } } //***************************************************************************************************************** // XURLTransformer //***************************************************************************************************************** sal_Bool SAL_CALL URLTransformer::parseStrict( URL& aURL ) throw( RuntimeException ) { // Safe impossible cases. if (( &aURL == NULL ) || ( aURL.Complete.getLength() < 1 ) ) { return sal_False; } // Try to extract the protocol sal_Int32 nURLIndex = aURL.Complete.indexOf( sal_Unicode( ':' )); ::rtl::OUString aProtocol; if ( nURLIndex > 1 ) { aProtocol = aURL.Complete.copy( 0, nURLIndex+1 ); // If INetURLObject knows this protocol let it parse if ( INetURLObject::CompareProtocolScheme( aProtocol ) != INET_PROT_NOT_VALID ) { // Initialize parser with given URL. INetURLObject aParser( aURL.Complete ); // Get all information about this URL. INetProtocol eINetProt = aParser.GetProtocol(); if ( eINetProt == INET_PROT_NOT_VALID ) { return sal_False; } else if ( !aParser.HasError() ) { lcl_ParserHelper(aParser,aURL,false); // Return "URL is parsed". return sal_True; } } else { // Minmal support for unknown protocols. This is mandatory to support the "Protocol Handlers" implemented // in framework! aURL.Protocol = aProtocol; aURL.Main = aURL.Complete; aURL.Path = aURL.Complete.copy( nURLIndex+1 );; // Return "URL is parsed". return sal_True; } } return sal_False; } //***************************************************************************************************************** // XURLTransformer //***************************************************************************************************************** sal_Bool SAL_CALL URLTransformer::parseSmart( URL& aURL , const ::rtl::OUString& sSmartProtocol ) throw( RuntimeException ) { // Safe impossible cases. if (( &aURL == NULL ) || ( aURL.Complete.getLength() < 1 ) ) { return sal_False; } // Initialize parser with given URL. INetURLObject aParser; aParser.SetSmartProtocol( INetURLObject::CompareProtocolScheme( sSmartProtocol )); bool bOk = aParser.SetSmartURL( aURL.Complete ); if ( bOk ) { lcl_ParserHelper(aParser,aURL,true); // Return "URL is parsed". return sal_True; } else { // Minmal support for unknown protocols. This is mandatory to support the "Protocol Handlers" implemented // in framework! if ( INetURLObject::CompareProtocolScheme( sSmartProtocol ) == INET_PROT_NOT_VALID ) { // Try to extract the protocol sal_Int32 nIndex = aURL.Complete.indexOf( sal_Unicode( ':' )); ::rtl::OUString aProtocol; if ( nIndex > 1 ) { aProtocol = aURL.Complete.copy( 0, nIndex+1 ); // If INetURLObject knows this protocol something is wrong as detected before => // give up and return false! if ( INetURLObject::CompareProtocolScheme( aProtocol ) != INET_PROT_NOT_VALID ) return sal_False; else aURL.Protocol = aProtocol; } else return sal_False; aURL.Main = aURL.Complete; aURL.Path = aURL.Complete.copy( nIndex+1 ); return sal_True; } else return sal_False; } } //***************************************************************************************************************** // XURLTransformer //***************************************************************************************************************** sal_Bool SAL_CALL URLTransformer::assemble( URL& aURL ) throw( RuntimeException ) { // Safe impossible cases. if ( &aURL == NULL ) return sal_False ; // Initialize parser. INetURLObject aParser; if ( INetURLObject::CompareProtocolScheme( aURL.Protocol ) != INET_PROT_NOT_VALID ) { ::rtl::OUStringBuffer aCompletePath( aURL.Path ); // Concat the name if it is provided, just support a final slash if ( aURL.Name.getLength() > 0 ) { sal_Int32 nIndex = aURL.Path.lastIndexOf( sal_Unicode('/') ); if ( nIndex == ( aURL.Path.getLength() -1 )) aCompletePath.append( aURL.Name ); else { aCompletePath.append( sal_Unicode( '/' ) ); aCompletePath.append( aURL.Name ); } } bool bResult = aParser.ConcatData( INetURLObject::CompareProtocolScheme( aURL.Protocol ) , aURL.User , aURL.Password , aURL.Server , aURL.Port , aCompletePath.makeStringAndClear() ); if ( !bResult ) return sal_False; // First parse URL WITHOUT ... aURL.Main = aParser.GetMainURL( INetURLObject::NO_DECODE ); // ...and then WITH parameter and mark. aParser.SetParam( aURL.Arguments); aParser.SetMark ( aURL.Mark, INetURLObject::ENCODE_ALL ); aURL.Complete = aParser.GetMainURL( INetURLObject::NO_DECODE ); // Return "URL is assembled". return sal_True; } else if ( aURL.Protocol.getLength() > 0 ) { // Minimal support for unknown protocols ::rtl::OUStringBuffer aBuffer( aURL.Protocol ); aBuffer.append( aURL.Path ); aURL.Complete = aBuffer.makeStringAndClear(); aURL.Main = aURL.Complete; return sal_True; } return sal_False; } //***************************************************************************************************************** // XURLTransformer //***************************************************************************************************************** ::rtl::OUString SAL_CALL URLTransformer::getPresentation( const URL& aURL , sal_Bool bWithPassword ) throw( RuntimeException ) { // Safe impossible cases. if (( &aURL == NULL ) || ( aURL.Complete.getLength() < 1 ) || (( bWithPassword != sal_True ) && ( bWithPassword != sal_False ) ) ) { return ::rtl::OUString(); } // Check given URL URL aTestURL = aURL; sal_Bool bParseResult = parseSmart( aTestURL, aTestURL.Protocol ); if ( bParseResult ) { if ( !bWithPassword && aTestURL.Password.getLength() > 0 ) { // Exchange password text with other placeholder string aTestURL.Password = ::rtl::OUString::createFromAscii( "<******>" ); assemble( aTestURL ); } // Convert internal URLs to "praesentation"-URLs! rtl::OUString sPraesentationURL; INetURLObject::translateToExternal( aTestURL.Complete, sPraesentationURL, INetURLObject::DECODE_UNAMBIGUOUS ); return sPraesentationURL; } else return ::rtl::OUString(); } //_________________________________________________________________________________________________________________ // debug methods //_________________________________________________________________________________________________________________ } // namespace framework