summaryrefslogtreecommitdiff
path: root/stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx')
-rw-r--r--stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx271
1 files changed, 271 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..999bde852429
--- /dev/null
+++ b/stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx
@@ -0,0 +1,271 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_stoc.hxx"
+
+#include "sal/config.h"
+
+#include "stocservices.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_services::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_services::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_services { 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;
+}
+
+} }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */