xref: /AOO41X/main/framework/source/services/urltransformer.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_framework.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
32*cdf0e10cSrcweir //  my own includes
33*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
34*cdf0e10cSrcweir #include <services/urltransformer.hxx>
35*cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
36*cdf0e10cSrcweir #include <macros/debug.hxx>
37*cdf0e10cSrcweir #include <services.h>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
40*cdf0e10cSrcweir //  interface includes
41*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
44*cdf0e10cSrcweir //  includes of other projects
45*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
46*cdf0e10cSrcweir #include <tools/urlobj.hxx>
47*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
48*cdf0e10cSrcweir #include <vcl/svapp.hxx>
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
51*cdf0e10cSrcweir //  namespace
52*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir namespace framework{
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir using namespace ::osl                           ;
57*cdf0e10cSrcweir using namespace ::cppu                          ;
58*cdf0e10cSrcweir using namespace ::com::sun::star::uno           ;
59*cdf0e10cSrcweir using namespace ::com::sun::star::lang          ;
60*cdf0e10cSrcweir using namespace ::com::sun::star::util          ;
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
63*cdf0e10cSrcweir //  non exported const
64*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
67*cdf0e10cSrcweir //  non exported definitions
68*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
71*cdf0e10cSrcweir //  declarations
72*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir //*****************************************************************************************************************
75*cdf0e10cSrcweir //  constructor
76*cdf0e10cSrcweir //*****************************************************************************************************************
77*cdf0e10cSrcweir URLTransformer::URLTransformer( const Reference< XMultiServiceFactory >& /*xFactory*/ )
78*cdf0e10cSrcweir {
79*cdf0e10cSrcweir     // Safe impossible cases.
80*cdf0e10cSrcweir     // Method not defined for all incoming parameter.
81*cdf0e10cSrcweir     //LOG_ASSERT( xFactory.is(), "URLTransformer::URLTransformer()\nInvalid parameter detected!\n" )
82*cdf0e10cSrcweir }
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir //*****************************************************************************************************************
85*cdf0e10cSrcweir //  destructor
86*cdf0e10cSrcweir //*****************************************************************************************************************
87*cdf0e10cSrcweir URLTransformer::~URLTransformer()
88*cdf0e10cSrcweir {
89*cdf0e10cSrcweir }
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir //*****************************************************************************************************************
92*cdf0e10cSrcweir //  XInterface, XTypeProvider, XServiceInfo
93*cdf0e10cSrcweir //*****************************************************************************************************************
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir DEFINE_XSERVICEINFO_MULTISERVICE    (   URLTransformer                      ,
96*cdf0e10cSrcweir                                         OWeakObject                         ,
97*cdf0e10cSrcweir                                         SERVICENAME_URLTRANSFORMER          ,
98*cdf0e10cSrcweir                                         IMPLEMENTATIONNAME_URLTRANSFORMER
99*cdf0e10cSrcweir                                     )
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir DEFINE_INIT_SERVICE                 (   URLTransformer,
102*cdf0e10cSrcweir                                         {
103*cdf0e10cSrcweir                                         }
104*cdf0e10cSrcweir                                     )
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir namespace
107*cdf0e10cSrcweir {
108*cdf0e10cSrcweir     void lcl_ParserHelper(INetURLObject& _rParser,URL& _rURL,bool _bUseIntern)
109*cdf0e10cSrcweir     {
110*cdf0e10cSrcweir         // Get all information about this URL.
111*cdf0e10cSrcweir         _rURL.Protocol  = INetURLObject::GetScheme( _rParser.GetProtocol() );
112*cdf0e10cSrcweir         _rURL.User      = _rParser.GetUser  ( INetURLObject::DECODE_WITH_CHARSET );
113*cdf0e10cSrcweir         _rURL.Password  = _rParser.GetPass  ( INetURLObject::DECODE_WITH_CHARSET );
114*cdf0e10cSrcweir         _rURL.Server        = _rParser.GetHost  ( INetURLObject::DECODE_WITH_CHARSET );
115*cdf0e10cSrcweir         _rURL.Port      = (sal_Int16)_rParser.GetPort();
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir         sal_Int32 nCount = _rParser.getSegmentCount( false );
118*cdf0e10cSrcweir         if ( nCount > 0 )
119*cdf0e10cSrcweir         {
120*cdf0e10cSrcweir             // Don't add last segment as it is the name!
121*cdf0e10cSrcweir             --nCount;
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir             rtl::OUStringBuffer aPath;
124*cdf0e10cSrcweir             for ( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
125*cdf0e10cSrcweir             {
126*cdf0e10cSrcweir                 aPath.append( sal_Unicode( '/' ));
127*cdf0e10cSrcweir                 aPath.append( _rParser.getName( nIndex, false, INetURLObject::NO_DECODE ));
128*cdf0e10cSrcweir             }
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir             if ( nCount > 0 )
131*cdf0e10cSrcweir                 aPath.append( sal_Unicode( '/' )); // final slash!
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir             _rURL.Path = aPath.makeStringAndClear();
134*cdf0e10cSrcweir             _rURL.Name = _rParser.getName( INetURLObject::LAST_SEGMENT, false, INetURLObject::NO_DECODE );
135*cdf0e10cSrcweir         }
136*cdf0e10cSrcweir         else
137*cdf0e10cSrcweir         {
138*cdf0e10cSrcweir             _rURL.Path       = _rParser.GetURLPath( INetURLObject::NO_DECODE           );
139*cdf0e10cSrcweir             _rURL.Name      = _rParser.GetName  (                                    );
140*cdf0e10cSrcweir         }
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir         _rURL.Arguments  = _rParser.GetParam  ( INetURLObject::NO_DECODE           );
143*cdf0e10cSrcweir         _rURL.Mark      = _rParser.GetMark  ( INetURLObject::DECODE_WITH_CHARSET );
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir         // INetURLObject supports only an intelligent method of parsing URL's. So write
146*cdf0e10cSrcweir         // back Complete to have a valid encoded URL in all cases!
147*cdf0e10cSrcweir         _rURL.Complete  = _rParser.GetMainURL( INetURLObject::NO_DECODE           );
148*cdf0e10cSrcweir         if ( _bUseIntern )
149*cdf0e10cSrcweir             _rURL.Complete   = _rURL.Complete.intern();
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir         _rParser.SetMark    ( ::rtl::OUString() );
152*cdf0e10cSrcweir         _rParser.SetParam( ::rtl::OUString() );
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir         _rURL.Main       = _rParser.GetMainURL( INetURLObject::NO_DECODE           );
155*cdf0e10cSrcweir     }
156*cdf0e10cSrcweir }
157*cdf0e10cSrcweir //*****************************************************************************************************************
158*cdf0e10cSrcweir //  XURLTransformer
159*cdf0e10cSrcweir //*****************************************************************************************************************
160*cdf0e10cSrcweir sal_Bool SAL_CALL URLTransformer::parseStrict( URL& aURL ) throw( RuntimeException )
161*cdf0e10cSrcweir {
162*cdf0e10cSrcweir     // Safe impossible cases.
163*cdf0e10cSrcweir     if  (( &aURL                        ==  NULL    )   ||
164*cdf0e10cSrcweir          ( aURL.Complete.getLength()    <   1       )       )
165*cdf0e10cSrcweir     {
166*cdf0e10cSrcweir         return sal_False;
167*cdf0e10cSrcweir     }
168*cdf0e10cSrcweir     // Try to extract the protocol
169*cdf0e10cSrcweir     sal_Int32 nURLIndex = aURL.Complete.indexOf( sal_Unicode( ':' ));
170*cdf0e10cSrcweir     ::rtl::OUString aProtocol;
171*cdf0e10cSrcweir     if ( nURLIndex > 1 )
172*cdf0e10cSrcweir     {
173*cdf0e10cSrcweir         aProtocol = aURL.Complete.copy( 0, nURLIndex+1 );
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir         // If INetURLObject knows this protocol let it parse
176*cdf0e10cSrcweir         if ( INetURLObject::CompareProtocolScheme( aProtocol ) != INET_PROT_NOT_VALID )
177*cdf0e10cSrcweir         {
178*cdf0e10cSrcweir             // Initialize parser with given URL.
179*cdf0e10cSrcweir             INetURLObject aParser( aURL.Complete );
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir             // Get all information about this URL.
182*cdf0e10cSrcweir             INetProtocol eINetProt = aParser.GetProtocol();
183*cdf0e10cSrcweir             if ( eINetProt == INET_PROT_NOT_VALID )
184*cdf0e10cSrcweir             {
185*cdf0e10cSrcweir                 return sal_False;
186*cdf0e10cSrcweir             }
187*cdf0e10cSrcweir             else if ( !aParser.HasError() )
188*cdf0e10cSrcweir             {
189*cdf0e10cSrcweir                 lcl_ParserHelper(aParser,aURL,false);
190*cdf0e10cSrcweir                 // Return "URL is parsed".
191*cdf0e10cSrcweir                 return sal_True;
192*cdf0e10cSrcweir             }
193*cdf0e10cSrcweir         }
194*cdf0e10cSrcweir         else
195*cdf0e10cSrcweir         {
196*cdf0e10cSrcweir             // Minmal support for unknown protocols. This is mandatory to support the "Protocol Handlers" implemented
197*cdf0e10cSrcweir             // in framework!
198*cdf0e10cSrcweir             aURL.Protocol   = aProtocol;
199*cdf0e10cSrcweir             aURL.Main       = aURL.Complete;
200*cdf0e10cSrcweir             aURL.Path       = aURL.Complete.copy( nURLIndex+1 );;
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir             // Return "URL is parsed".
203*cdf0e10cSrcweir             return sal_True;
204*cdf0e10cSrcweir         }
205*cdf0e10cSrcweir     }
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir     return sal_False;
208*cdf0e10cSrcweir }
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir //*****************************************************************************************************************
211*cdf0e10cSrcweir //  XURLTransformer
212*cdf0e10cSrcweir //*****************************************************************************************************************
213*cdf0e10cSrcweir sal_Bool SAL_CALL URLTransformer::parseSmart(           URL&        aURL            ,
214*cdf0e10cSrcweir                                                 const   ::rtl::OUString&    sSmartProtocol  ) throw( RuntimeException )
215*cdf0e10cSrcweir {
216*cdf0e10cSrcweir     // Safe impossible cases.
217*cdf0e10cSrcweir     if  (( &aURL                            ==  NULL    ) ||
218*cdf0e10cSrcweir          ( aURL.Complete.getLength()        <   1       )    )
219*cdf0e10cSrcweir     {
220*cdf0e10cSrcweir         return sal_False;
221*cdf0e10cSrcweir     }
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir     // Initialize parser with given URL.
224*cdf0e10cSrcweir     INetURLObject aParser;
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir     aParser.SetSmartProtocol( INetURLObject::CompareProtocolScheme( sSmartProtocol ));
227*cdf0e10cSrcweir     bool bOk = aParser.SetSmartURL( aURL.Complete );
228*cdf0e10cSrcweir     if ( bOk )
229*cdf0e10cSrcweir     {
230*cdf0e10cSrcweir         lcl_ParserHelper(aParser,aURL,true);
231*cdf0e10cSrcweir         // Return "URL is parsed".
232*cdf0e10cSrcweir         return sal_True;
233*cdf0e10cSrcweir     }
234*cdf0e10cSrcweir     else
235*cdf0e10cSrcweir     {
236*cdf0e10cSrcweir         // Minmal support for unknown protocols. This is mandatory to support the "Protocol Handlers" implemented
237*cdf0e10cSrcweir         // in framework!
238*cdf0e10cSrcweir         if ( INetURLObject::CompareProtocolScheme( sSmartProtocol ) == INET_PROT_NOT_VALID )
239*cdf0e10cSrcweir         {
240*cdf0e10cSrcweir             // Try to extract the protocol
241*cdf0e10cSrcweir             sal_Int32 nIndex = aURL.Complete.indexOf( sal_Unicode( ':' ));
242*cdf0e10cSrcweir             ::rtl::OUString aProtocol;
243*cdf0e10cSrcweir             if ( nIndex > 1 )
244*cdf0e10cSrcweir             {
245*cdf0e10cSrcweir                 aProtocol = aURL.Complete.copy( 0, nIndex+1 );
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir                 // If INetURLObject knows this protocol something is wrong as detected before =>
248*cdf0e10cSrcweir                 // give up and return false!
249*cdf0e10cSrcweir                 if ( INetURLObject::CompareProtocolScheme( aProtocol ) != INET_PROT_NOT_VALID )
250*cdf0e10cSrcweir                     return sal_False;
251*cdf0e10cSrcweir                 else
252*cdf0e10cSrcweir                     aURL.Protocol = aProtocol;
253*cdf0e10cSrcweir             }
254*cdf0e10cSrcweir             else
255*cdf0e10cSrcweir                 return sal_False;
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir             aURL.Main = aURL.Complete;
258*cdf0e10cSrcweir             aURL.Path = aURL.Complete.copy( nIndex+1 );
259*cdf0e10cSrcweir             return sal_True;
260*cdf0e10cSrcweir         }
261*cdf0e10cSrcweir         else
262*cdf0e10cSrcweir             return sal_False;
263*cdf0e10cSrcweir     }
264*cdf0e10cSrcweir }
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir //*****************************************************************************************************************
267*cdf0e10cSrcweir //  XURLTransformer
268*cdf0e10cSrcweir //*****************************************************************************************************************
269*cdf0e10cSrcweir sal_Bool SAL_CALL URLTransformer::assemble( URL& aURL ) throw( RuntimeException )
270*cdf0e10cSrcweir {
271*cdf0e10cSrcweir     // Safe impossible cases.
272*cdf0e10cSrcweir     if  ( &aURL == NULL )
273*cdf0e10cSrcweir         return sal_False ;
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir     // Initialize parser.
276*cdf0e10cSrcweir     INetURLObject aParser;
277*cdf0e10cSrcweir 
278*cdf0e10cSrcweir     if ( INetURLObject::CompareProtocolScheme( aURL.Protocol ) != INET_PROT_NOT_VALID )
279*cdf0e10cSrcweir     {
280*cdf0e10cSrcweir         ::rtl::OUStringBuffer aCompletePath( aURL.Path );
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir         // Concat the name if it is provided, just support a final slash
283*cdf0e10cSrcweir         if ( aURL.Name.getLength() > 0 )
284*cdf0e10cSrcweir         {
285*cdf0e10cSrcweir             sal_Int32 nIndex = aURL.Path.lastIndexOf( sal_Unicode('/') );
286*cdf0e10cSrcweir             if ( nIndex == ( aURL.Path.getLength() -1 ))
287*cdf0e10cSrcweir                 aCompletePath.append( aURL.Name );
288*cdf0e10cSrcweir             else
289*cdf0e10cSrcweir             {
290*cdf0e10cSrcweir                 aCompletePath.append( sal_Unicode( '/' ) );
291*cdf0e10cSrcweir                 aCompletePath.append( aURL.Name );
292*cdf0e10cSrcweir             }
293*cdf0e10cSrcweir         }
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir         bool bResult = aParser.ConcatData(
296*cdf0e10cSrcweir                             INetURLObject::CompareProtocolScheme( aURL.Protocol )   ,
297*cdf0e10cSrcweir                             aURL.User                                               ,
298*cdf0e10cSrcweir                             aURL.Password                                           ,
299*cdf0e10cSrcweir                             aURL.Server                                             ,
300*cdf0e10cSrcweir                             aURL.Port                                               ,
301*cdf0e10cSrcweir                             aCompletePath.makeStringAndClear()                          );
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir         if ( !bResult )
304*cdf0e10cSrcweir             return sal_False;
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir         // First parse URL WITHOUT ...
307*cdf0e10cSrcweir         aURL.Main = aParser.GetMainURL( INetURLObject::NO_DECODE );
308*cdf0e10cSrcweir         // ...and then WITH parameter and mark.
309*cdf0e10cSrcweir         aParser.SetParam( aURL.Arguments);
310*cdf0e10cSrcweir         aParser.SetMark ( aURL.Mark, INetURLObject::ENCODE_ALL );
311*cdf0e10cSrcweir         aURL.Complete = aParser.GetMainURL( INetURLObject::NO_DECODE );
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir         // Return "URL is assembled".
314*cdf0e10cSrcweir         return sal_True;
315*cdf0e10cSrcweir     }
316*cdf0e10cSrcweir     else if ( aURL.Protocol.getLength() > 0 )
317*cdf0e10cSrcweir     {
318*cdf0e10cSrcweir         // Minimal support for unknown protocols
319*cdf0e10cSrcweir         ::rtl::OUStringBuffer aBuffer( aURL.Protocol );
320*cdf0e10cSrcweir         aBuffer.append( aURL.Path );
321*cdf0e10cSrcweir         aURL.Complete   = aBuffer.makeStringAndClear();
322*cdf0e10cSrcweir         aURL.Main       = aURL.Complete;
323*cdf0e10cSrcweir         return sal_True;
324*cdf0e10cSrcweir     }
325*cdf0e10cSrcweir 
326*cdf0e10cSrcweir     return sal_False;
327*cdf0e10cSrcweir }
328*cdf0e10cSrcweir 
329*cdf0e10cSrcweir //*****************************************************************************************************************
330*cdf0e10cSrcweir //  XURLTransformer
331*cdf0e10cSrcweir //*****************************************************************************************************************
332*cdf0e10cSrcweir ::rtl::OUString SAL_CALL URLTransformer::getPresentation(   const   URL&        aURL            ,
333*cdf0e10cSrcweir                                                             sal_Bool    bWithPassword   ) throw( RuntimeException )
334*cdf0e10cSrcweir {
335*cdf0e10cSrcweir     // Safe impossible cases.
336*cdf0e10cSrcweir     if  (( &aURL                        ==  NULL        )   ||
337*cdf0e10cSrcweir          ( aURL.Complete.getLength()    <   1           )   ||
338*cdf0e10cSrcweir             (( bWithPassword            !=  sal_True    )   &&
339*cdf0e10cSrcweir              ( bWithPassword            !=  sal_False   )       ) )
340*cdf0e10cSrcweir     {
341*cdf0e10cSrcweir         return ::rtl::OUString();
342*cdf0e10cSrcweir     }
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir     // Check given URL
345*cdf0e10cSrcweir     URL aTestURL = aURL;
346*cdf0e10cSrcweir     sal_Bool bParseResult = parseSmart( aTestURL, aTestURL.Protocol );
347*cdf0e10cSrcweir     if ( bParseResult )
348*cdf0e10cSrcweir     {
349*cdf0e10cSrcweir         if ( !bWithPassword && aTestURL.Password.getLength() > 0 )
350*cdf0e10cSrcweir         {
351*cdf0e10cSrcweir             // Exchange password text with other placeholder string
352*cdf0e10cSrcweir             aTestURL.Password = ::rtl::OUString::createFromAscii( "<******>" );
353*cdf0e10cSrcweir             assemble( aTestURL );
354*cdf0e10cSrcweir         }
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir         // Convert internal URLs to "praesentation"-URLs!
357*cdf0e10cSrcweir         rtl::OUString sPraesentationURL;
358*cdf0e10cSrcweir         INetURLObject::translateToExternal( aTestURL.Complete, sPraesentationURL, INetURLObject::DECODE_UNAMBIGUOUS );
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir         return sPraesentationURL;
361*cdf0e10cSrcweir     }
362*cdf0e10cSrcweir     else
363*cdf0e10cSrcweir         return ::rtl::OUString();
364*cdf0e10cSrcweir }
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
367*cdf0e10cSrcweir //  debug methods
368*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir }       //  namespace framework
372*cdf0e10cSrcweir 
373