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