/**************************************************************
 *
 * 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_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;
}

} }
