From 2b4fd2c89a38ccac13c72f2e94501a8702e7da4b Mon Sep 17 00:00:00 2001
From: Michael Meeks <michael.meeks@suse.com>
Date: Tue, 6 Nov 2012 12:12:33 +0000
Subject: re-base on ALv2 code. Includes:

    Patches contributed by Pedro Giffuni:
    Avoid some uses of non portable #!/bin/bash in shell scripts.
    http://svn.apache.org/viewvc?view=revision&revision=1235297
    Reduce the dependencies on non standard GNU copy.
    http://svn.apache.org/viewvc?view=revision&revision=1238684
    Correct /usr/bin/env path.
    http://svn.apache.org/viewvc?view=revision&revision=1235619

    Complex Toolbar Controls Extension from the SDK
    Patches contributed by Ariel Constenla-Haile
    http://svn.apache.org/viewvc?view=revision&revision=1190390
    i118615 - make epm more verbose
    http://svn.apache.org/viewvc?view=revision&revision=1204288

    Patches contributed by Mathias Bauer (and others)
    gnumake4 work variously
    http://svn.apache.org/viewvc?view=revision&revision=1394707
    http://svn.apache.org/viewvc?view=revision&revision=1394326

    Patches contributed by Juergen Schmidt:
    jsc341: i117327: take care if no dependency node in current
    description exists, create one
    http://svn.apache.org/viewvc?view=revision&revision=1172101
    jsc341: i117327: add extra extension dependency check
    http://svn.apache.org/viewvc?view=revision&revision=1172098
    make initial branding changes
    http://svn.apache.org/viewvc?view=revision&revision=1231878

    Patches contributed by Ingo Schmidt
    native373: #i117733# no linux jre installation on 64 bit systems
    http://svn.apache.org/viewvc?view=revision&revision=1167536
    native373: ##164464# improve debian support
    http://svn.apache.org/viewvc?view=revision&revision=1167537

    Patch contribtued by Armin Le-Grand:
    Changed various aspects concerning usages of old vendor names
    http://svn.apache.org/viewvc?view=revision&revision=1293313

fix for neon webdav, remove coinmp bits, improve odk script,
cleanup & remove OS/2 conditionals, system ucpp fixes,
remove OS/2 conditionals, restore our license filenames.
---
 .../deployment/inc/dp_descriptioninfoset.hxx       |  51 ++++---
 .../deployment/misc/dp_descriptioninfoset.cxx      | 158 +++++++++++++++++----
 2 files changed, 162 insertions(+), 47 deletions(-)

(limited to 'desktop')

diff --git a/desktop/source/deployment/inc/dp_descriptioninfoset.hxx b/desktop/source/deployment/inc/dp_descriptioninfoset.hxx
index d16e9127af8a..8a5361be372e 100644
--- a/desktop/source/deployment/inc/dp_descriptioninfoset.hxx
+++ b/desktop/source/deployment/inc/dp_descriptioninfoset.hxx
@@ -1,30 +1,21 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
+/*
+ * This file is part of the LibreOffice project.
  *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * This file incorporates work covered by the following license notice:
  *
- * 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.
- *
- ************************************************************************/
+ *   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 .
+ */
 
 #ifndef INCLUDED_DESKTOP_SOURCE_DEPLOYMENT_INC_DP_DESCRIPTIONINFOSET_HXX
 #define INCLUDED_DESKTOP_SOURCE_DEPLOYMENT_INC_DP_DESCRIPTIONINFOSET_HXX
@@ -277,6 +268,20 @@ private:
     SAL_DLLPRIVATE ::rtl::OUString
         getNodeValueFromExpression(::rtl::OUString const & expression) const;
 
+    /** Check the extensions blacklist if additional extension meta data (e.g. dependencies)
+        are defined for this extension and have to be taken into account.
+    */
+    SAL_DLLPRIVATE void
+        checkBlacklist() const;
+
+    /** Helper method to compare the versions with the current version
+     */
+    SAL_DLLPRIVATE bool
+        checkBlacklistVersion(::rtl::OUString currentversion,
+                              ::com::sun::star::uno::Sequence< ::rtl::OUString > const & versions) const;
+
+    ::com::sun::star::uno::Reference<
+        ::com::sun::star::uno::XComponentContext > m_context;
     ::com::sun::star::uno::Reference<
         ::com::sun::star::xml::dom::XNode > m_element;
     ::com::sun::star::uno::Reference<
diff --git a/desktop/source/deployment/misc/dp_descriptioninfoset.cxx b/desktop/source/deployment/misc/dp_descriptioninfoset.cxx
index 48054bd77102..534b1c6afabc 100644
--- a/desktop/source/deployment/misc/dp_descriptioninfoset.cxx
+++ b/desktop/source/deployment/misc/dp_descriptioninfoset.cxx
@@ -1,31 +1,21 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
+/*
+ * This file is part of the LibreOffice project.
  *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * This file incorporates work covered by the following license notice:
  *
- * 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.
- *
- ************************************************************************/
-
+ *   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 .
+ */
 
 #include "dp_descriptioninfoset.hxx"
 
@@ -33,10 +23,15 @@
 #include "sal/config.h"
 
 #include "comphelper/sequence.hxx"
+#include "comphelper/seqstream.hxx"
 #include "comphelper/makesequence.hxx"
 #include "comphelper/processfactory.hxx"
 #include "boost/optional.hpp"
+#include "com/sun/star/container/XNameAccess.hpp"
 #include "com/sun/star/beans/Optional.hpp"
+#include "com/sun/star/beans/PropertyValue.hpp"
+#include "com/sun/star/beans/XPropertySet.hpp"
+#include "com/sun/star/io/SequenceInputStream.hpp"
 #include "com/sun/star/lang/XMultiComponentFactory.hpp"
 #include "com/sun/star/lang/Locale.hpp"
 #include "com/sun/star/uno/Reference.hxx"
@@ -361,6 +356,7 @@ DescriptionInfoset getDescriptionInfoset(OUString const & sExtensionFolderURL)
 DescriptionInfoset::DescriptionInfoset(
     css::uno::Reference< css::uno::XComponentContext > const & context,
     css::uno::Reference< css::xml::dom::XNode > const & element):
+    m_context(context),
     m_element(element)
 {
     css::uno::Reference< css::lang::XMultiComponentFactory > manager(
@@ -403,6 +399,117 @@ DescriptionInfoset::~DescriptionInfoset() {}
     return n.is() ? getNodeValue(n) : ::rtl::OUString();
 }
 
+void DescriptionInfoset::checkBlacklist() const
+{
+    if (m_element.is()) {
+        boost::optional< OUString > id(getIdentifier());
+        if (!id)
+            return; // nothing to check
+        OUString currentversion(getVersion());
+        if (currentversion.getLength() == 0)
+            return;  // nothing to check
+
+        css::uno::Reference< css::lang::XMultiComponentFactory > manager(
+            m_context->getServiceManager(), css::uno::UNO_QUERY_THROW);
+        css::uno::Reference< css::lang::XMultiServiceFactory> provider(
+            manager->createInstanceWithContext(
+                ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationProvider")), m_context),
+                css::uno::UNO_QUERY_THROW);
+
+        css::uno::Sequence< css::uno::Any > args = css::uno::Sequence< css::uno::Any >(1);
+        css::beans::PropertyValue prop;
+        prop.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath"));
+        prop.Value <<= ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Office.ExtensionDependencies/Extensions"));
+        args[0] <<= prop;
+
+        css::uno::Reference< css::container::XNameAccess > blacklist(
+            provider->createInstanceWithArguments(
+                ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationAccess")), args),
+                css::uno::UNO_QUERY_THROW);
+
+        // check first if a blacklist entry is available
+        if (blacklist.is() && blacklist->hasByName(*id)) {
+            css::uno::Reference< css::beans::XPropertySet > extProps(
+                blacklist->getByName(*id), css::uno::UNO_QUERY_THROW);
+
+            css::uno::Any anyValue = extProps->getPropertyValue(
+                ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Versions")));
+
+            css::uno::Sequence< ::rtl::OUString > blversions;
+            anyValue >>= blversions;
+
+            // check if the current version requires further dependency checks from the blacklist
+            if (checkBlacklistVersion(currentversion, blversions)) {
+                anyValue = extProps->getPropertyValue(
+                    ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Dependencies")));
+                ::rtl::OUString udeps;
+                anyValue >>= udeps;
+
+                if (udeps.getLength() == 0)
+                    return; // nothing todo
+
+                ::rtl::OString xmlDependencies = ::rtl::OUStringToOString(udeps, RTL_TEXTENCODING_UNICODE);
+
+                css::uno::Reference< css::xml::dom::XDocumentBuilder> docbuilder(
+                    manager->createInstanceWithContext(
+                        ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.dom.DocumentBuilder")), m_context),
+                    css::uno::UNO_QUERY_THROW);
+
+                css::uno::Sequence< sal_Int8 > byteSeq((const sal_Int8*)xmlDependencies.getStr(), xmlDependencies.getLength());
+
+                css::uno::Reference< css::io::XInputStream> inputstream( css::io::SequenceInputStream::createStreamFromSequence(m_context, byteSeq),
+                                                                         css::uno::UNO_QUERY_THROW);
+
+                css::uno::Reference< css::xml::dom::XDocument > xDocument(docbuilder->parse(inputstream));
+                css::uno::Reference< css::xml::dom::XElement > xElement(xDocument->getDocumentElement());
+                css::uno::Reference< css::xml::dom::XNodeList > xDeps(xElement->getChildNodes());
+                sal_Int32 nLen = xDeps->getLength();
+
+                // get the parent xml document  of current description info for the import
+                css::uno::Reference< css::xml::dom::XDocument > xCurrentDescInfo(m_element->getOwnerDocument());
+
+                // get dependency node of current description info to merge the new dependencies from the blacklist
+                css::uno::Reference< css::xml::dom::XNode > xCurrentDeps(
+                    m_xpath->selectSingleNode(m_element, ::rtl::OUString(
+                                                  RTL_CONSTASCII_USTRINGPARAM("desc:dependencies"))));
+
+                // if no dependency node exists, create a new one in the current description info
+                if (!xCurrentDeps.is()) {
+                    css::uno::Reference< css::xml::dom::XNode > xNewDepNode(
+                        xCurrentDescInfo->createElementNS(
+                            ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("http://openoffice.org/extensions/description/2006")),
+                            ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("dependencies"))), css::uno::UNO_QUERY_THROW);
+                    m_element->appendChild(xNewDepNode);
+                    xCurrentDeps = m_xpath->selectSingleNode(m_element, ::rtl::OUString(
+                                                  RTL_CONSTASCII_USTRINGPARAM("desc:dependencies")));
+                }
+
+                for (sal_Int32 i=0; i<nLen; i++) {
+                    css::uno::Reference< css::xml::dom::XNode > xNode(xDeps->item(i));
+                    css::uno::Reference< css::xml::dom::XElement > xDep(xNode, css::uno::UNO_QUERY);
+                    if (xDep.is()) {
+                        // found valid blacklist dependency, import the node first and append it to the existing dependency node
+                        css::uno::Reference< css::xml::dom::XNode > importedNode = xCurrentDescInfo->importNode(xNode, true);
+                        xCurrentDeps->appendChild(importedNode);
+                    }
+                }
+            }
+        }
+    }
+}
+
+bool DescriptionInfoset::checkBlacklistVersion(
+    ::rtl::OUString currentversion,
+    ::com::sun::star::uno::Sequence< ::rtl::OUString > const & versions) const
+{
+    sal_Int32 nLen = versions.getLength();
+    for (sal_Int32 i=0; i<nLen; i++) {
+        if (currentversion.equals(versions[i]))
+            return true;
+    }
+
+    return false;
+}
 
 ::rtl::OUString DescriptionInfoset::getVersion() const
 {
@@ -452,6 +559,9 @@ css::uno::Reference< css::xml::dom::XNodeList >
 DescriptionInfoset::getDependencies() const {
     if (m_element.is()) {
         try {
+            // check the extension blacklist first and expand the dependencies if applicable
+            checkBlacklist();
+
             return m_xpath->selectNodeList(m_element, ::rtl::OUString(
                         RTL_CONSTASCII_USTRINGPARAM("desc:dependencies/*")));
         } catch (const css::xml::xpath::XPathException &) {
-- 
cgit