1*0a1e2f0eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*0a1e2f0eSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*0a1e2f0eSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*0a1e2f0eSAndrew Rist  * distributed with this work for additional information
6*0a1e2f0eSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*0a1e2f0eSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*0a1e2f0eSAndrew Rist  * "License"); you may not use this file except in compliance
9*0a1e2f0eSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*0a1e2f0eSAndrew Rist  *
11*0a1e2f0eSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*0a1e2f0eSAndrew Rist  *
13*0a1e2f0eSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*0a1e2f0eSAndrew Rist  * software distributed under the License is distributed on an
15*0a1e2f0eSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*0a1e2f0eSAndrew Rist  * KIND, either express or implied.  See the License for the
17*0a1e2f0eSAndrew Rist  * specific language governing permissions and limitations
18*0a1e2f0eSAndrew Rist  * under the License.
19*0a1e2f0eSAndrew Rist  *
20*0a1e2f0eSAndrew Rist  *************************************************************/
21*0a1e2f0eSAndrew Rist 
22*0a1e2f0eSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef INCLUDED_DESKTOP_SOURCE_DEPLOYMENT_INC_DP_DESCRIPTIONINFOSET_HXX
25cdf0e10cSrcweir #define INCLUDED_DESKTOP_SOURCE_DEPLOYMENT_INC_DP_DESCRIPTIONINFOSET_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "sal/config.h"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "boost/optional.hpp"
30cdf0e10cSrcweir #include "com/sun/star/uno/Reference.hxx"
31cdf0e10cSrcweir #include "com/sun/star/uno/Sequence.hxx"
32cdf0e10cSrcweir #include "sal/types.h"
33cdf0e10cSrcweir #include "dp_misc_api.hxx"
34cdf0e10cSrcweir 
35cdf0e10cSrcweir /// @HTML
36cdf0e10cSrcweir 
37cdf0e10cSrcweir namespace com { namespace sun { namespace star {
38cdf0e10cSrcweir     namespace lang { struct Locale; }
39cdf0e10cSrcweir     namespace uno { class XComponentContext; }
40cdf0e10cSrcweir     namespace xml {
41cdf0e10cSrcweir         namespace dom {
42cdf0e10cSrcweir             class XNode;
43cdf0e10cSrcweir             class XNodeList;
44cdf0e10cSrcweir         }
45cdf0e10cSrcweir         namespace xpath { class XXPathAPI; }
46cdf0e10cSrcweir     }
47cdf0e10cSrcweir } } }
48cdf0e10cSrcweir namespace rtl { class OUString; }
49cdf0e10cSrcweir 
50cdf0e10cSrcweir namespace dp_misc {
51cdf0e10cSrcweir 
52cdf0e10cSrcweir struct DESKTOP_DEPLOYMENTMISC_DLLPUBLIC SimpleLicenseAttributes
53cdf0e10cSrcweir {
54cdf0e10cSrcweir     ::rtl::OUString acceptBy;
55cdf0e10cSrcweir     //Attribute suppress-on-update. Default is false.
56cdf0e10cSrcweir     bool suppressOnUpdate;
57cdf0e10cSrcweir     //Attribute suppress-if-required. Default is false.
58cdf0e10cSrcweir     bool suppressIfRequired;
59cdf0e10cSrcweir };
60cdf0e10cSrcweir 
61cdf0e10cSrcweir 
62cdf0e10cSrcweir /**
63cdf0e10cSrcweir    Access to the content of an XML <code>description</code> element.
64cdf0e10cSrcweir 
65cdf0e10cSrcweir    <p>This works for <code>description</code> elements in both the
66cdf0e10cSrcweir    <code>description.xml</code> file and online update information formats.</p>
67cdf0e10cSrcweir */
68cdf0e10cSrcweir class DESKTOP_DEPLOYMENTMISC_DLLPUBLIC DescriptionInfoset {
69cdf0e10cSrcweir public:
70cdf0e10cSrcweir     /**
71cdf0e10cSrcweir        Create an instance.
72cdf0e10cSrcweir 
73cdf0e10cSrcweir        @param context
74cdf0e10cSrcweir        a non-null component context
75cdf0e10cSrcweir 
76cdf0e10cSrcweir        @param element
77cdf0e10cSrcweir        a <code>description</code> element; may be null (equivalent to an element
78cdf0e10cSrcweir        with no content)
79cdf0e10cSrcweir     */
80cdf0e10cSrcweir     DescriptionInfoset(
81cdf0e10cSrcweir         ::com::sun::star::uno::Reference<
82cdf0e10cSrcweir             ::com::sun::star::uno::XComponentContext > const & context,
83cdf0e10cSrcweir         ::com::sun::star::uno::Reference<
84cdf0e10cSrcweir             ::com::sun::star::xml::dom::XNode > const & element);
85cdf0e10cSrcweir 
86cdf0e10cSrcweir     ~DescriptionInfoset();
87cdf0e10cSrcweir 
88cdf0e10cSrcweir     /**
89cdf0e10cSrcweir        Return the identifier.
90cdf0e10cSrcweir 
91cdf0e10cSrcweir        @return
92cdf0e10cSrcweir        the identifier, or an empty <code>optional</code> if none is specified
93cdf0e10cSrcweir     */
94cdf0e10cSrcweir     ::boost::optional< ::rtl::OUString > getIdentifier() const;
95cdf0e10cSrcweir 
96cdf0e10cSrcweir     /**
97cdf0e10cSrcweir        Return the textual version representation.
98cdf0e10cSrcweir 
99cdf0e10cSrcweir        @return
100cdf0e10cSrcweir        textual version representation
101cdf0e10cSrcweir     */
102cdf0e10cSrcweir     ::rtl::OUString getVersion() const;
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     /**
105cdf0e10cSrcweir         Returns a list of supported platforms.
106cdf0e10cSrcweir 
107cdf0e10cSrcweir         If the extension does not specify a platform by leaving out the platform element
108cdf0e10cSrcweir         then we assume that the extension supports all platforms. In this case the returned
109cdf0e10cSrcweir         sequence will have one element, which is &quot;all&quot;.
110cdf0e10cSrcweir         If the platform element is present but does not specify a platform then an empty
111cdf0e10cSrcweir         sequence is returned. Examples for invalid platform elements:
112cdf0e10cSrcweir         <pre>
113cdf0e10cSrcweir             <platform />, <platform value="" />, <platfrom value=",">
114cdf0e10cSrcweir         </pre>
115cdf0e10cSrcweir 
116cdf0e10cSrcweir         The value attribute can contain various platform tokens. They must be separated by
117cdf0e10cSrcweir         commas.Each token will be stripped from leading and trailing white space (trim()).
118cdf0e10cSrcweir     */
119cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedPlaforms() const;
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     /**
122cdf0e10cSrcweir         Returns the localized publisher name and the corresponding URL.
123cdf0e10cSrcweir 
124cdf0e10cSrcweir         In case there is no publisher element then a pair of two empty strings is returned.
125cdf0e10cSrcweir     */
126cdf0e10cSrcweir     ::std::pair< ::rtl::OUString, ::rtl::OUString > getLocalizedPublisherNameAndURL() const;
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     /**
129cdf0e10cSrcweir         Returns the URL for the release notes corresponding to the office's locale.
130cdf0e10cSrcweir 
131cdf0e10cSrcweir         In case there is no release-notes element then an empty string is returned.
132cdf0e10cSrcweir     */
133cdf0e10cSrcweir     ::rtl::OUString getLocalizedReleaseNotesURL() const;
134cdf0e10cSrcweir 
135cdf0e10cSrcweir     /** returns the relative path to the license file.
136cdf0e10cSrcweir 
137cdf0e10cSrcweir         In case there is no simple-license element then an empty string is returned.
138cdf0e10cSrcweir     */
139cdf0e10cSrcweir     ::rtl::OUString getLocalizedLicenseURL() const;
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     /** returns the attributes of the simple-license element
142cdf0e10cSrcweir 
143cdf0e10cSrcweir         As long as there is a simple-license element, the function will return
144cdf0e10cSrcweir         the structure. If it does not exist, then the optional object is uninitialized.
145cdf0e10cSrcweir     */
146cdf0e10cSrcweir     ::boost::optional<SimpleLicenseAttributes> getSimpleLicenseAttributes() const;
147cdf0e10cSrcweir 
148cdf0e10cSrcweir     /** returns the localized display name of the extensions.
149cdf0e10cSrcweir 
150cdf0e10cSrcweir         In case there is no localized display-name then an empty string is returned.
151cdf0e10cSrcweir     */
152cdf0e10cSrcweir     ::rtl::OUString getLocalizedDisplayName() const;
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     /**
155cdf0e10cSrcweir         returns the download website URL from the update information.
156cdf0e10cSrcweir 
157cdf0e10cSrcweir         There can be multiple URLs where each is assigned to a particular locale.
158cdf0e10cSrcweir         The function returs the URL which locale matches best the one used in the office.
159cdf0e10cSrcweir 
160cdf0e10cSrcweir         The return value is an optional because it may be necessary to find out if there
161cdf0e10cSrcweir         was a value provided or not. This is necessary to flag the extension in the update dialog
162cdf0e10cSrcweir         properly as "browser based update". The return value will only then not be initialized
163cdf0e10cSrcweir         if there is no <code>&lt;update-website&gt;</code>. If the element exists, then it must
164cdf0e10cSrcweir         have at least one child element containing an URL.
165cdf0e10cSrcweir 
166cdf0e10cSrcweir         The <code>&lt;update-website&gt;</code> and <code>&lt;update-download&gt;</code>
167cdf0e10cSrcweir         elements are mutually exclusiv.
168cdf0e10cSrcweir 
169cdf0e10cSrcweir         @return
170cdf0e10cSrcweir         the download website URL, or an empty <code>optional</code> if none is
171cdf0e10cSrcweir         specified
172cdf0e10cSrcweir     */
173cdf0e10cSrcweir     ::boost::optional< ::rtl::OUString > getLocalizedUpdateWebsiteURL() const;
174cdf0e10cSrcweir 
175cdf0e10cSrcweir     /** returns the relative URL to the description.
176cdf0e10cSrcweir 
177cdf0e10cSrcweir        The URL is relative to the root directory of the extensions.
178cdf0e10cSrcweir     */
179cdf0e10cSrcweir     ::rtl::OUString getLocalizedDescriptionURL() const;
180cdf0e10cSrcweir     /**
181cdf0e10cSrcweir        Return the dependencies.
182cdf0e10cSrcweir 
183cdf0e10cSrcweir        @return
184cdf0e10cSrcweir        dependencies; will never be null
185cdf0e10cSrcweir     */
186cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNodeList >
187cdf0e10cSrcweir     getDependencies() const;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir     /**
190cdf0e10cSrcweir        Return the update information URLs.
191cdf0e10cSrcweir 
192cdf0e10cSrcweir        @return
193cdf0e10cSrcweir        update information URLs
194cdf0e10cSrcweir     */
195cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::rtl::OUString >
196cdf0e10cSrcweir     getUpdateInformationUrls() const;
197cdf0e10cSrcweir 
198cdf0e10cSrcweir      /**
199cdf0e10cSrcweir         Return the download URLs from the update information.
200cdf0e10cSrcweir 
201cdf0e10cSrcweir         Because the <code>&lt;update-download&gt;</code> and the <code>&lt;update-website&gt;</code>
202cdf0e10cSrcweir         elements are mutually exclusive one may need to determine exacty if the element
203cdf0e10cSrcweir         was provided.
204cdf0e10cSrcweir 
205cdf0e10cSrcweir         @return
206cdf0e10cSrcweir         download URLs
207cdf0e10cSrcweir      */
208cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::rtl::OUString >
209cdf0e10cSrcweir     getUpdateDownloadUrls() const;
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     /**
212cdf0e10cSrcweir         Returns the URL for the icon image.
213cdf0e10cSrcweir     */
214cdf0e10cSrcweir     ::rtl::OUString getIconURL( sal_Bool bHighContrast ) const;
215cdf0e10cSrcweir 
216cdf0e10cSrcweir     bool hasDescription() const;
217cdf0e10cSrcweir 
218cdf0e10cSrcweir private:
219cdf0e10cSrcweir     SAL_DLLPRIVATE ::boost::optional< ::rtl::OUString > getOptionalValue(
220cdf0e10cSrcweir         ::rtl::OUString const & expression) const;
221cdf0e10cSrcweir 
222cdf0e10cSrcweir     SAL_DLLPRIVATE ::com::sun::star::uno::Sequence< ::rtl::OUString > getUrls(
223cdf0e10cSrcweir         ::rtl::OUString const & expression) const;
224cdf0e10cSrcweir 
225cdf0e10cSrcweir     /** Retrieves a child element which as lang attribute which matches the office locale.
226cdf0e10cSrcweir 
227cdf0e10cSrcweir         Only top-level children are taken into account. It is also assumed that they are all
228cdf0e10cSrcweir         of the same element type and have a lang attribute. The matching algoritm is according
229cdf0e10cSrcweir         to RFC 3066, with the exception that only one variant is allowed.
230cdf0e10cSrcweir         @param parent
231cdf0e10cSrcweir         the expression used to obtain the parent of the localized children. It can be null.
232cdf0e10cSrcweir         Then a null reference is returned.
233cdf0e10cSrcweir     */
234cdf0e10cSrcweir     SAL_DLLPRIVATE ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNode >
235cdf0e10cSrcweir         getLocalizedChild( ::rtl::OUString const & sParent) const;
236cdf0e10cSrcweir     SAL_DLLPRIVATE  ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNode>
237cdf0e10cSrcweir         matchFullLocale(::com::sun::star::uno::Reference<
238cdf0e10cSrcweir         ::com::sun::star::xml::dom::XNode > const & xParent, ::rtl::OUString const & sLocale) const;
239cdf0e10cSrcweir     SAL_DLLPRIVATE  ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNode>
240cdf0e10cSrcweir         matchCountryAndLanguage(::com::sun::star::uno::Reference<
241cdf0e10cSrcweir         ::com::sun::star::xml::dom::XNode > const & xParent,
242cdf0e10cSrcweir         ::com::sun::star::lang::Locale const & officeLocale) const;
243cdf0e10cSrcweir     SAL_DLLPRIVATE  ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNode>
244cdf0e10cSrcweir         matchLanguage(
245cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNode > const & xParent,
246cdf0e10cSrcweir         ::com::sun::star::lang::Locale const & officeLocale) const;
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     /** If there is no child element with a locale matching the office locale, then we use
249cdf0e10cSrcweir         the first child. In the case of the simple-license we also use the former default locale, which
250cdf0e10cSrcweir         was determined by the default-license-id (/description/registration/simple-license/@default-license-id)
251cdf0e10cSrcweir         and the license-id attributes (/description/registration/simple-license/license-text/@license-id).
252cdf0e10cSrcweir         However, since OOo 2.4 we use also the first child as default for the license
253cdf0e10cSrcweir         unless the two attributes are present.
254cdf0e10cSrcweir     */
255cdf0e10cSrcweir     SAL_DLLPRIVATE  ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNode>
256cdf0e10cSrcweir         getChildWithDefaultLocale(
257cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::xml::dom::XNode > const & xParent) const;
258cdf0e10cSrcweir     /**
259cdf0e10cSrcweir         @param out_bParentExists
260cdf0e10cSrcweir             indicates if the element node specified in sXPathParent exists.
261cdf0e10cSrcweir     */
262cdf0e10cSrcweir     SAL_DLLPRIVATE ::rtl::OUString getLocalizedHREFAttrFromChild(
263cdf0e10cSrcweir         ::rtl::OUString const & sXPathParent, bool * out_bParentExists) const;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     static SAL_DLLPRIVATE ::rtl::OUString
266cdf0e10cSrcweir         localeToString(::com::sun::star::lang::Locale const & locale);
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     /** Gets the node value for a given expression. The expression is used in
269cdf0e10cSrcweir         m_xpath-selectSingleNode. The value of the returned node is return value
270cdf0e10cSrcweir         of this function.
271cdf0e10cSrcweir     */
272cdf0e10cSrcweir     SAL_DLLPRIVATE ::rtl::OUString
273cdf0e10cSrcweir         getNodeValueFromExpression(::rtl::OUString const & expression) const;
274cdf0e10cSrcweir 
2759e813386SMichael Stahl     /** Check the extensions blacklist if additional extension meta data (e.g. dependencies)
2769e813386SMichael Stahl         are defined for this extension and have to be taken into account.
2779e813386SMichael Stahl     */
2789e813386SMichael Stahl     SAL_DLLPRIVATE void
2799e813386SMichael Stahl         checkBlacklist() const;
2809e813386SMichael Stahl 
2819e813386SMichael Stahl     /** Helper method to compare the versions with the current version
2829e813386SMichael Stahl      */
2839e813386SMichael Stahl     SAL_DLLPRIVATE bool
2849e813386SMichael Stahl         checkBlacklistVersion(::rtl::OUString currentversion,
2859e813386SMichael Stahl                               ::com::sun::star::uno::Sequence< ::rtl::OUString > const & versions) const;
2869e813386SMichael Stahl 
2879e813386SMichael Stahl     ::com::sun::star::uno::Reference<
2889e813386SMichael Stahl         ::com::sun::star::uno::XComponentContext > m_context;
289cdf0e10cSrcweir     ::com::sun::star::uno::Reference<
290cdf0e10cSrcweir         ::com::sun::star::xml::dom::XNode > m_element;
291cdf0e10cSrcweir     ::com::sun::star::uno::Reference<
292cdf0e10cSrcweir         ::com::sun::star::xml::xpath::XXPathAPI > m_xpath;
293cdf0e10cSrcweir };
294cdf0e10cSrcweir 
hasDescription() const295cdf0e10cSrcweir inline  bool DescriptionInfoset::hasDescription() const
296cdf0e10cSrcweir {
297cdf0e10cSrcweir     return m_element.is();
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
300cdf0e10cSrcweir /** creates a DescriptionInfoset object.
301cdf0e10cSrcweir 
302cdf0e10cSrcweir     The argument sExtensionFolderURL is a file URL to extension folder containing
303cdf0e10cSrcweir     the description.xml.
304cdf0e10cSrcweir  */
305cdf0e10cSrcweir DESKTOP_DEPLOYMENTMISC_DLLPUBLIC
306cdf0e10cSrcweir DescriptionInfoset getDescriptionInfoset(::rtl::OUString const & sExtensionFolderURL);
307cdf0e10cSrcweir }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir #endif
310