1*2722ceddSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*2722ceddSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*2722ceddSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*2722ceddSAndrew Rist * distributed with this work for additional information
6*2722ceddSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*2722ceddSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*2722ceddSAndrew Rist * "License"); you may not use this file except in compliance
9*2722ceddSAndrew Rist * with the License. You may obtain a copy of the License at
10*2722ceddSAndrew Rist *
11*2722ceddSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*2722ceddSAndrew Rist *
13*2722ceddSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*2722ceddSAndrew Rist * software distributed under the License is distributed on an
15*2722ceddSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2722ceddSAndrew Rist * KIND, either express or implied. See the License for the
17*2722ceddSAndrew Rist * specific language governing permissions and limitations
18*2722ceddSAndrew Rist * under the License.
19*2722ceddSAndrew Rist *
20*2722ceddSAndrew Rist *************************************************************/
21*2722ceddSAndrew Rist
22*2722ceddSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_desktop.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "sal/config.h"
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include "com/sun/star/uno/Reference.hxx"
30cdf0e10cSrcweir #include "com/sun/star/uno/Sequence.hxx"
31cdf0e10cSrcweir #include "com/sun/star/xml/dom/XElement.hpp"
32cdf0e10cSrcweir #include "com/sun/star/xml/dom/XNode.hpp"
33cdf0e10cSrcweir #include "com/sun/star/xml/dom/XNodeList.hpp"
34cdf0e10cSrcweir #include "rtl/bootstrap.hxx"
35cdf0e10cSrcweir #include "rtl/string.h"
36cdf0e10cSrcweir #include "rtl/ustring.h"
37cdf0e10cSrcweir #include "rtl/ustring.hxx"
38cdf0e10cSrcweir #include "sal/types.h"
39cdf0e10cSrcweir #include "tools/string.hxx"
40cdf0e10cSrcweir
41cdf0e10cSrcweir #include "deployment.hrc"
42cdf0e10cSrcweir #include "dp_resource.h"
43cdf0e10cSrcweir
44cdf0e10cSrcweir #include "dp_dependencies.hxx"
45cdf0e10cSrcweir #include "dp_descriptioninfoset.hxx"
46cdf0e10cSrcweir #include "dp_version.hxx"
47cdf0e10cSrcweir
48cdf0e10cSrcweir namespace {
49cdf0e10cSrcweir
50cdf0e10cSrcweir namespace css = ::com::sun::star;
51cdf0e10cSrcweir
52cdf0e10cSrcweir static char const xmlNamespace[] =
53cdf0e10cSrcweir "http://openoffice.org/extensions/description/2006";
54cdf0e10cSrcweir
satisfiesMinimalVersion(::rtl::OUString const & version)55cdf0e10cSrcweir bool satisfiesMinimalVersion(::rtl::OUString const & version) {
56cdf0e10cSrcweir ::rtl::OUString v(
57cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(
58cdf0e10cSrcweir "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("version")
59cdf0e10cSrcweir ":Version:OOOPackageVersion}"));
60cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros(v);
61cdf0e10cSrcweir return ::dp_misc::compareVersions(v, version) != ::dp_misc::LESS;
62cdf0e10cSrcweir }
63cdf0e10cSrcweir
64cdf0e10cSrcweir }
65cdf0e10cSrcweir
66cdf0e10cSrcweir namespace dp_misc {
67cdf0e10cSrcweir
68cdf0e10cSrcweir namespace Dependencies {
69cdf0e10cSrcweir
70cdf0e10cSrcweir css::uno::Sequence< css::uno::Reference< css::xml::dom::XElement > >
check(::dp_misc::DescriptionInfoset const & infoset)71cdf0e10cSrcweir check(::dp_misc::DescriptionInfoset const & infoset) {
72cdf0e10cSrcweir css::uno::Reference< css::xml::dom::XNodeList > deps(
73cdf0e10cSrcweir infoset.getDependencies());
74cdf0e10cSrcweir ::sal_Int32 n = deps->getLength();
75cdf0e10cSrcweir css::uno::Sequence< css::uno::Reference< css::xml::dom::XElement > >
76cdf0e10cSrcweir unsatisfied(n);
77cdf0e10cSrcweir ::sal_Int32 unsat = 0;
78cdf0e10cSrcweir for (::sal_Int32 i = 0; i < n; ++i) {
79cdf0e10cSrcweir static char const minimalVersion[] = "OpenOffice.org-minimal-version";
80cdf0e10cSrcweir css::uno::Reference< css::xml::dom::XElement > e(
81cdf0e10cSrcweir deps->item(i), css::uno::UNO_QUERY_THROW);
82cdf0e10cSrcweir bool sat = false;
83cdf0e10cSrcweir if (e->getNamespaceURI().equalsAsciiL(
84cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM(xmlNamespace))
85cdf0e10cSrcweir && e->getTagName().equalsAsciiL(
86cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM(minimalVersion)))
87cdf0e10cSrcweir {
88cdf0e10cSrcweir sat = satisfiesMinimalVersion(
89cdf0e10cSrcweir e->getAttribute(
90cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("value"))));
91cdf0e10cSrcweir } else if (e->getNamespaceURI().equalsAsciiL(
92cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM(xmlNamespace))
93cdf0e10cSrcweir && e->getTagName().equalsAsciiL(
94cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM(
95cdf0e10cSrcweir "OpenOffice.org-maximal-version")))
96cdf0e10cSrcweir {
97cdf0e10cSrcweir ::rtl::OUString v(
98cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(
99cdf0e10cSrcweir "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("version")
100cdf0e10cSrcweir ":Version:OOOBaseVersion}"));
101cdf0e10cSrcweir ::rtl::Bootstrap::expandMacros(v);
102cdf0e10cSrcweir sat =
103cdf0e10cSrcweir ::dp_misc::compareVersions(
104cdf0e10cSrcweir v,
105cdf0e10cSrcweir e->getAttribute(
106cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("value"))))
107cdf0e10cSrcweir != ::dp_misc::GREATER;
108cdf0e10cSrcweir } else if (e->hasAttributeNS(
109cdf0e10cSrcweir ::rtl::OUString(
110cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(xmlNamespace)),
111cdf0e10cSrcweir ::rtl::OUString(
112cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(minimalVersion))))
113cdf0e10cSrcweir {
114cdf0e10cSrcweir sat = satisfiesMinimalVersion(
115cdf0e10cSrcweir e->getAttributeNS(
116cdf0e10cSrcweir ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(xmlNamespace)),
117cdf0e10cSrcweir ::rtl::OUString(
118cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(minimalVersion))));
119cdf0e10cSrcweir }
120cdf0e10cSrcweir if (!sat) {
121cdf0e10cSrcweir unsatisfied[unsat++] = e;
122cdf0e10cSrcweir }
123cdf0e10cSrcweir }
124cdf0e10cSrcweir unsatisfied.realloc(unsat);
125cdf0e10cSrcweir return unsatisfied;
126cdf0e10cSrcweir }
127cdf0e10cSrcweir
getErrorText(css::uno::Reference<css::xml::dom::XElement> const & dependency)128cdf0e10cSrcweir ::rtl::OUString getErrorText( css::uno::Reference< css::xml::dom::XElement > const & dependency )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir ::rtl::OUString sReason;
131cdf0e10cSrcweir ::rtl::OUString sValue;
132cdf0e10cSrcweir ::rtl::OUString sVersion(RTL_CONSTASCII_USTRINGPARAM("%VERSION"));
133cdf0e10cSrcweir
134cdf0e10cSrcweir if ( dependency->getNamespaceURI().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( xmlNamespace ) )
135cdf0e10cSrcweir && dependency->getTagName().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OpenOffice.org-minimal-version" ) ) )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir sValue = dependency->getAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "value" ) ) );
138cdf0e10cSrcweir sReason = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_MIN)) );
139cdf0e10cSrcweir }
140cdf0e10cSrcweir else if ( dependency->getNamespaceURI().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( xmlNamespace ) )
141cdf0e10cSrcweir && dependency->getTagName().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OpenOffice.org-maximal-version" ) ) )
142cdf0e10cSrcweir {
143cdf0e10cSrcweir sValue = dependency->getAttribute( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("value") ) );
144cdf0e10cSrcweir sReason = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_MAX)) );
145cdf0e10cSrcweir }
146cdf0e10cSrcweir else if ( dependency->hasAttributeNS( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( xmlNamespace ) ),
147cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenOffice.org-minimal-version" ))))
148cdf0e10cSrcweir {
149cdf0e10cSrcweir sValue = dependency->getAttributeNS( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( xmlNamespace ) ),
150cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenOffice.org-minimal-version" ) ) );
151cdf0e10cSrcweir sReason = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_MIN)) );
152cdf0e10cSrcweir }
153cdf0e10cSrcweir else
154cdf0e10cSrcweir return ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_UNKNOWN)) );
155cdf0e10cSrcweir
156cdf0e10cSrcweir if ( sValue.getLength() == 0 )
157cdf0e10cSrcweir sValue = ::rtl::OUString( ::String(::dp_misc::getResId(RID_DEPLYOMENT_DEPENDENCIES_UNKNOWN)) );
158cdf0e10cSrcweir
159cdf0e10cSrcweir sal_Int32 nPos = sReason.indexOf( sVersion );
160cdf0e10cSrcweir if ( nPos >= 0 )
161cdf0e10cSrcweir sReason = sReason.replaceAt( nPos, sVersion.getLength(), sValue );
162cdf0e10cSrcweir return sReason;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
165cdf0e10cSrcweir }
166cdf0e10cSrcweir
167cdf0e10cSrcweir }
168