From 6a17ac9e4fa6d684602a87bac640d94ecb49be1b Mon Sep 17 00:00:00 2001 From: Oliver Bolte Date: Mon, 12 Mar 2007 09:55:24 +0000 Subject: INTEGRATION: CWS sb36 (1.1.2); FILE ADDED 2007/01/22 13:52:41 sb 1.1.2.2: Dropped obsolete SISSL header. 2005/07/14 12:38:51 sb 1.1.2.1: #i51803# Added support for vnd.sun.star.expand URLs. --- .../UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx | 275 +++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx (limited to 'stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx') diff --git a/stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx b/stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx new file mode 100644 index 000000000000..61ddeff9ea05 --- /dev/null +++ b/stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx @@ -0,0 +1,275 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: obo $ $Date: 2007-03-12 10:55:24 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#include "sal/config.h" + +#include "UriSchemeParser_vndDOTsunDOTstarDOTexpand.hxx" + +#include + +#include "com/sun/star/lang/IllegalArgumentException.hpp" +#include "com/sun/star/lang/XServiceInfo.hpp" +#include "com/sun/star/uno/Reference.hxx" +#include "com/sun/star/uno/RuntimeException.hpp" +#include "com/sun/star/uno/Sequence.hxx" +#include "com/sun/star/uno/XInterface.hpp" +#include "com/sun/star/uri/XUriReference.hpp" +#include "com/sun/star/uri/XUriSchemeParser.hpp" +#include "com/sun/star/uri/XVndSunStarExpandUrlReference.hpp" +#include "com/sun/star/util/XMacroExpander.hpp" +#include "cppuhelper/implbase1.hxx" +#include "cppuhelper/implbase2.hxx" +#include "cppuhelper/weak.hxx" +#include "rtl/textenc.h" +#include "rtl/uri.h" +#include "rtl/uri.hxx" +#include "rtl/ustring.h" +#include "rtl/ustring.hxx" +#include "sal/types.h" + +#include "UriReference.hxx" +#include "supportsService.hxx" + +namespace { + +namespace css = ::com::sun::star; + +bool parseSchemeSpecificPart(::rtl::OUString const & part) { + // Liberally accepts both an empty opaque_part and an opaque_part that + // starts with a non-escaped "/": + return part.getLength() == 0 + || ((::rtl::Uri::decode( + part, ::rtl_UriDecodeStrict, RTL_TEXTENCODING_UTF8). + getLength()) + != 0); +} + +class UrlReference: + public ::cppu::WeakImplHelper1< css::uri::XVndSunStarExpandUrlReference > +{ +public: + UrlReference(::rtl::OUString const & scheme, ::rtl::OUString const & path): + base_( + scheme, false, false, ::rtl::OUString(), path, false, + ::rtl::OUString()) + {} + + virtual ::rtl::OUString SAL_CALL getUriReference() + throw (css::uno::RuntimeException) + { return base_.getUriReference(); } + + virtual ::sal_Bool SAL_CALL isAbsolute() throw (css::uno::RuntimeException) + { return base_.isAbsolute(); } + + virtual ::rtl::OUString SAL_CALL getScheme() + throw (css::uno::RuntimeException) + { return base_.getScheme(); } + + virtual ::rtl::OUString SAL_CALL getSchemeSpecificPart() + throw (css::uno::RuntimeException) + { return base_.getSchemeSpecificPart(); } + + virtual ::sal_Bool SAL_CALL isHierarchical() + throw (css::uno::RuntimeException) + { return base_.isHierarchical(); } + + virtual ::sal_Bool SAL_CALL hasAuthority() + throw (css::uno::RuntimeException) + { return base_.hasAuthority(); } + + virtual ::rtl::OUString SAL_CALL getAuthority() + throw (css::uno::RuntimeException) + { return base_.getAuthority(); } + + virtual ::rtl::OUString SAL_CALL getPath() + throw (css::uno::RuntimeException) + { return base_.getPath(); } + + virtual ::sal_Bool SAL_CALL hasRelativePath() + throw (css::uno::RuntimeException) + { return base_.hasRelativePath(); } + + virtual ::sal_Int32 SAL_CALL getPathSegmentCount() + throw (css::uno::RuntimeException) + { return base_.getPathSegmentCount(); } + + virtual ::rtl::OUString SAL_CALL getPathSegment(sal_Int32 index) + throw (css::uno::RuntimeException) + { return base_.getPathSegment(index); } + + virtual ::sal_Bool SAL_CALL hasQuery() throw (css::uno::RuntimeException) + { return base_.hasQuery(); } + + virtual ::rtl::OUString SAL_CALL getQuery() + throw (css::uno::RuntimeException) + { return base_.getQuery(); } + + virtual ::sal_Bool SAL_CALL hasFragment() throw (css::uno::RuntimeException) + { return base_.hasFragment(); } + + virtual ::rtl::OUString SAL_CALL getFragment() + throw (css::uno::RuntimeException) + { return base_.getFragment(); } + + virtual void SAL_CALL setFragment(::rtl::OUString const & fragment) + throw (css::uno::RuntimeException) + { base_.setFragment(fragment); } + + virtual void SAL_CALL clearFragment() throw (css::uno::RuntimeException) + { base_.clearFragment(); } + + virtual ::rtl::OUString SAL_CALL expand( + css::uno::Reference< css::util::XMacroExpander > const & expander) + throw (css::lang::IllegalArgumentException, css::uno::RuntimeException); + +private: + UrlReference(UrlReference &); // not defined + void operator =(UrlReference); // not defined + + virtual ~UrlReference() {} + + stoc::uriproc::UriReference base_; +}; + +::rtl::OUString UrlReference::expand( + css::uno::Reference< css::util::XMacroExpander > const & expander) + throw (css::lang::IllegalArgumentException, css::uno::RuntimeException) +{ + OSL_ASSERT(expander.is()); + return expander->expandMacros( + ::rtl::Uri::decode( + getPath(), ::rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)); +} + +class Parser: public ::cppu::WeakImplHelper2< + css::lang::XServiceInfo, css::uri::XUriSchemeParser > +{ +public: + Parser() {} + + virtual ::rtl::OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException); + + virtual ::sal_Bool SAL_CALL supportsService( + ::rtl::OUString const & serviceName) + throw (css::uno::RuntimeException); + + virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL + getSupportedServiceNames() throw (css::uno::RuntimeException); + + virtual css::uno::Reference< css::uri::XUriReference > SAL_CALL + parse( + ::rtl::OUString const & scheme, + ::rtl::OUString const & schemeSpecificPart) + throw (css::uno::RuntimeException); + +private: + Parser(Parser &); // not defined + void operator =(Parser); // not defined + + virtual ~Parser() {} +}; + +::rtl::OUString Parser::getImplementationName() + throw (css::uno::RuntimeException) +{ + return ::stoc::uriproc::UriSchemeParser_vndDOTsunDOTstarDOTexpand:: + getImplementationName(); +} + +::sal_Bool Parser::supportsService(::rtl::OUString const & serviceName) + throw (css::uno::RuntimeException) +{ + return ::stoc::uriproc::supportsService( + getSupportedServiceNames(), serviceName); +} + +css::uno::Sequence< ::rtl::OUString > Parser::getSupportedServiceNames() + throw (css::uno::RuntimeException) +{ + return ::stoc::uriproc::UriSchemeParser_vndDOTsunDOTstarDOTexpand:: + getSupportedServiceNames(); +} + +css::uno::Reference< css::uri::XUriReference > Parser::parse( + ::rtl::OUString const & scheme, ::rtl::OUString const & schemeSpecificPart) + throw (css::uno::RuntimeException) +{ + if (!parseSchemeSpecificPart(schemeSpecificPart)) { + return css::uno::Reference< css::uri::XUriReference >(); + } + try { + return new UrlReference(scheme, schemeSpecificPart); + } catch (::std::bad_alloc &) { + throw css::uno::RuntimeException( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("std::bad_alloc")), + css::uno::Reference< css::uno::XInterface >()); + } +} + +} + +namespace stoc { namespace uriproc { +namespace UriSchemeParser_vndDOTsunDOTstarDOTexpand { + +css::uno::Reference< css::uno::XInterface > create( + css::uno::Reference< css::uno::XComponentContext > const &) + SAL_THROW((css::uno::Exception)) +{ + //TODO: single instance + try { + return static_cast< ::cppu::OWeakObject * >(new Parser); + } catch (::std::bad_alloc &) { + throw css::uno::RuntimeException( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("std::bad_alloc")), + css::uno::Reference< css::uno::XInterface >()); + } +} + +::rtl::OUString getImplementationName() { + return ::rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.comp.uri.UriSchemeParser_vndDOTsunDOTstarDOTexpand")); +} + +css::uno::Sequence< ::rtl::OUString > getSupportedServiceNames() { + css::uno::Sequence< ::rtl::OUString > s(1); + s[0] = ::rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.uri.UriSchemeParser_vndDOTsunDOTstarDOTexpand")); + return s; +} + +} } } -- cgit