| /************************************************************** |
| * |
| * 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_desktop.hxx" |
| |
| #include "sal/config.h" |
| |
| #include "com/sun/star/uno/Reference.hxx" |
| #include "com/sun/star/uno/Sequence.hxx" |
| #include "com/sun/star/xml/dom/XElement.hpp" |
| #include "com/sun/star/xml/dom/XNode.hpp" |
| #include "com/sun/star/xml/dom/XNodeList.hpp" |
| #include "rtl/bootstrap.hxx" |
| #include "rtl/string.h" |
| #include "rtl/ustring.h" |
| #include "rtl/ustring.hxx" |
| #include "sal/types.h" |
| #include "tools/string.hxx" |
| |
| #include "deployment.hrc" |
| #include "dp_resource.h" |
| |
| #include "dp_dependencies.hxx" |
| #include "dp_descriptioninfoset.hxx" |
| #include "dp_version.hxx" |
| |
| namespace { |
| |
| namespace css = ::com::sun::star; |
| |
| static char const xmlNamespace[] = |
| "http://openoffice.org/extensions/description/2006"; |
| |
| bool satisfiesMinimalVersion(::rtl::OUString const & version) { |
| ::rtl::OUString v( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("version") |
| ":Version:OOOPackageVersion}")); |
| ::rtl::Bootstrap::expandMacros(v); |
| return ::dp_misc::compareVersions(v, version) != ::dp_misc::LESS; |
| } |
| |
| } |
| |
| namespace dp_misc { |
| |
| namespace Dependencies { |
| |
| css::uno::Sequence< css::uno::Reference< css::xml::dom::XElement > > |
| check(::dp_misc::DescriptionInfoset const & infoset) { |
| css::uno::Reference< css::xml::dom::XNodeList > deps( |
| infoset.getDependencies()); |
| ::sal_Int32 n = deps->getLength(); |
| css::uno::Sequence< css::uno::Reference< css::xml::dom::XElement > > |
| unsatisfied(n); |
| ::sal_Int32 unsat = 0; |
| for (::sal_Int32 i = 0; i < n; ++i) { |
| static char const minimalVersion[] = "OpenOffice.org-minimal-version"; |
| css::uno::Reference< css::xml::dom::XElement > e( |
| deps->item(i), css::uno::UNO_QUERY_THROW); |
| bool sat = false; |
| if (e->getNamespaceURI().equalsAsciiL( |
| RTL_CONSTASCII_STRINGPARAM(xmlNamespace)) |
| && e->getTagName().equalsAsciiL( |
| RTL_CONSTASCII_STRINGPARAM(minimalVersion))) |
| { |
| sat = satisfiesMinimalVersion( |
| e->getAttribute( |
| ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("value")))); |
| } else if (e->getNamespaceURI().equalsAsciiL( |
| RTL_CONSTASCII_STRINGPARAM(xmlNamespace)) |
| && e->getTagName().equalsAsciiL( |
| RTL_CONSTASCII_STRINGPARAM( |
| "OpenOffice.org-maximal-version"))) |
| { |
| ::rtl::OUString v( |
| RTL_CONSTASCII_USTRINGPARAM( |
| "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("version") |
| ":Version:OOOBaseVersion}")); |
| ::rtl::Bootstrap::expandMacros(v); |
| sat = |
| ::dp_misc::compareVersions( |
| v, |
| e->getAttribute( |
| ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("value")))) |
| != ::dp_misc::GREATER; |
| } else if (e->hasAttributeNS( |
| ::rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM(xmlNamespace)), |
| ::rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM(minimalVersion)))) |
| { |
| sat = satisfiesMinimalVersion( |
| e->getAttributeNS( |
| ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(xmlNamespace)), |
| ::rtl::OUString( |
| RTL_CONSTASCII_USTRINGPARAM(minimalVersion)))); |
| } |
| if (!sat) { |
| unsatisfied[unsat++] = e; |
| } |
| } |
| unsatisfied.realloc(unsat); |
| return unsatisfied; |
| } |
| |
| ::rtl::OUString getErrorText( css::uno::Reference< css::xml::dom::XElement > const & dependency ) |
| { |
| ::rtl::OUString sReason; |
| ::rtl::OUString sValue; |
| ::rtl::OUString sVersion(RTL_CONSTASCII_USTRINGPARAM("%VERSION")); |
| |
| if ( dependency->getNamespaceURI().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( xmlNamespace ) ) |
| && dependency->getTagName().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OpenOffice.org-minimal-version" ) ) ) |
| { |
| sValue = dependency->getAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "value" ) ) ); |
| sReason = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_MIN)) ); |
| } |
| else if ( dependency->getNamespaceURI().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( xmlNamespace ) ) |
| && dependency->getTagName().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OpenOffice.org-maximal-version" ) ) ) |
| { |
| sValue = dependency->getAttribute( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("value") ) ); |
| sReason = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_MAX)) ); |
| } |
| else if ( dependency->hasAttributeNS( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( xmlNamespace ) ), |
| ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenOffice.org-minimal-version" )))) |
| { |
| sValue = dependency->getAttributeNS( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( xmlNamespace ) ), |
| ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenOffice.org-minimal-version" ) ) ); |
| sReason = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_MIN)) ); |
| } |
| else |
| return ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_UNKNOWN)) ); |
| |
| if ( sValue.getLength() == 0 ) |
| sValue = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_UNKNOWN)) ); |
| |
| sal_Int32 nPos = sReason.indexOf( sVersion ); |
| if ( nPos >= 0 ) |
| sReason = sReason.replaceAt( nPos, sVersion.getLength(), sValue ); |
| return sReason; |
| } |
| |
| } |
| |
| } |