summaryrefslogtreecommitdiff
path: root/stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx
diff options
context:
space:
mode:
authorOliver Bolte <obo@openoffice.org>2007-03-12 09:55:24 +0000
committerOliver Bolte <obo@openoffice.org>2007-03-12 09:55:24 +0000
commit6a17ac9e4fa6d684602a87bac640d94ecb49be1b (patch)
treeac2be4a4ede70e8645022edae7d47698dc11623d /stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx
parentac079ebbebac96eeae0c2685d7ec15761446878d (diff)
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.
Diffstat (limited to 'stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx')
-rw-r--r--stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx275
1 files changed, 275 insertions, 0 deletions
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 <new>
+
+#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;
+}
+
+} } }