1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_desktop.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielski #include "dp_update.hxx"
29*b1cdbd2cSJim Jagielski #include "dp_version.hxx"
30*b1cdbd2cSJim Jagielski #include "dp_identifier.hxx"
31*b1cdbd2cSJim Jagielski #include "dp_descriptioninfoset.hxx"
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski #include "rtl/bootstrap.hxx"
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
36*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
37*b1cdbd2cSJim Jagielski using ::rtl::OUString;
38*b1cdbd2cSJim Jagielski using ::rtl::OString;
39*b1cdbd2cSJim Jagielski
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski namespace dp_misc {
42*b1cdbd2cSJim Jagielski namespace {
43*b1cdbd2cSJim Jagielski
determineHighestVersion(::rtl::OUString const & userVersion,::rtl::OUString const & sharedVersion,::rtl::OUString const & bundledVersion,::rtl::OUString const & onlineVersion)44*b1cdbd2cSJim Jagielski int determineHighestVersion(
45*b1cdbd2cSJim Jagielski ::rtl::OUString const & userVersion,
46*b1cdbd2cSJim Jagielski ::rtl::OUString const & sharedVersion,
47*b1cdbd2cSJim Jagielski ::rtl::OUString const & bundledVersion,
48*b1cdbd2cSJim Jagielski ::rtl::OUString const & onlineVersion)
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski int index = 0;
51*b1cdbd2cSJim Jagielski OUString greatest = userVersion;
52*b1cdbd2cSJim Jagielski if (dp_misc::compareVersions(sharedVersion, greatest) == dp_misc::GREATER)
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski index = 1;
55*b1cdbd2cSJim Jagielski greatest = sharedVersion;
56*b1cdbd2cSJim Jagielski }
57*b1cdbd2cSJim Jagielski if (dp_misc::compareVersions(bundledVersion, greatest) == dp_misc::GREATER)
58*b1cdbd2cSJim Jagielski {
59*b1cdbd2cSJim Jagielski index = 2;
60*b1cdbd2cSJim Jagielski greatest = bundledVersion;
61*b1cdbd2cSJim Jagielski }
62*b1cdbd2cSJim Jagielski if (dp_misc::compareVersions(onlineVersion, greatest) == dp_misc::GREATER)
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski index = 3;
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski return index;
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski
69*b1cdbd2cSJim Jagielski Sequence< Reference< xml::dom::XElement > >
getUpdateInformation(Reference<deployment::XUpdateInformationProvider> const & updateInformation,Sequence<OUString> const & urls,OUString const & identifier,uno::Any & out_error)70*b1cdbd2cSJim Jagielski getUpdateInformation( Reference<deployment::XUpdateInformationProvider > const & updateInformation,
71*b1cdbd2cSJim Jagielski Sequence< OUString > const & urls,
72*b1cdbd2cSJim Jagielski OUString const & identifier,
73*b1cdbd2cSJim Jagielski uno::Any & out_error)
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski try {
76*b1cdbd2cSJim Jagielski return updateInformation->getUpdateInformation(urls, identifier);
77*b1cdbd2cSJim Jagielski } catch (uno::RuntimeException &) {
78*b1cdbd2cSJim Jagielski throw;
79*b1cdbd2cSJim Jagielski } catch (ucb::CommandFailedException & e) {
80*b1cdbd2cSJim Jagielski out_error = e.Reason;
81*b1cdbd2cSJim Jagielski } catch (ucb::CommandAbortedException &) {
82*b1cdbd2cSJim Jagielski } catch (uno::Exception & e) {
83*b1cdbd2cSJim Jagielski out_error = uno::makeAny(e);
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski return
86*b1cdbd2cSJim Jagielski Sequence<Reference< xml::dom::XElement > >();
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski
getOwnUpdateInfos(Reference<uno::XComponentContext> const & xContext,Reference<deployment::XUpdateInformationProvider> const & updateInformation,UpdateInfoMap & inout_map,std::vector<std::pair<Reference<deployment::XPackage>,uno::Any>> & out_errors,bool & out_allFound)89*b1cdbd2cSJim Jagielski void getOwnUpdateInfos(
90*b1cdbd2cSJim Jagielski Reference<uno::XComponentContext> const & xContext,
91*b1cdbd2cSJim Jagielski Reference<deployment::XUpdateInformationProvider > const & updateInformation,
92*b1cdbd2cSJim Jagielski UpdateInfoMap& inout_map, std::vector<std::pair<Reference<deployment::XPackage>, uno::Any> > & out_errors,
93*b1cdbd2cSJim Jagielski bool & out_allFound)
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski bool allHaveOwnUpdateInformation = true;
96*b1cdbd2cSJim Jagielski for (UpdateInfoMap::iterator i = inout_map.begin(); i != inout_map.end(); i++)
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski OSL_ASSERT(i->second.extension.is());
99*b1cdbd2cSJim Jagielski Sequence<OUString> urls(i->second.extension->getUpdateInformationURLs());
100*b1cdbd2cSJim Jagielski if (urls.getLength())
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski const OUString id = dp_misc::getIdentifier(i->second.extension);
103*b1cdbd2cSJim Jagielski uno::Any anyError;
104*b1cdbd2cSJim Jagielski //It is unclear from the idl if there can be a null reference returned.
105*b1cdbd2cSJim Jagielski //However all valid information should be the same
106*b1cdbd2cSJim Jagielski Sequence<Reference< xml::dom::XElement > >
107*b1cdbd2cSJim Jagielski infos(getUpdateInformation(updateInformation, urls, id, anyError));
108*b1cdbd2cSJim Jagielski if (anyError.hasValue())
109*b1cdbd2cSJim Jagielski out_errors.push_back(std::make_pair(i->second.extension, anyError));
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski for (sal_Int32 j = 0; j < infos.getLength(); ++j)
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski dp_misc::DescriptionInfoset infoset(
114*b1cdbd2cSJim Jagielski xContext,
115*b1cdbd2cSJim Jagielski Reference< xml::dom::XNode >(infos[j], UNO_QUERY_THROW));
116*b1cdbd2cSJim Jagielski if (!infoset.hasDescription())
117*b1cdbd2cSJim Jagielski continue;
118*b1cdbd2cSJim Jagielski boost::optional< OUString > id2(infoset.getIdentifier());
119*b1cdbd2cSJim Jagielski if (!id2)
120*b1cdbd2cSJim Jagielski continue;
121*b1cdbd2cSJim Jagielski OSL_ASSERT(*id2 == id);
122*b1cdbd2cSJim Jagielski if (*id2 == id)
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski i->second.version = infoset.getVersion();
125*b1cdbd2cSJim Jagielski i->second.info = Reference< xml::dom::XNode >(
126*b1cdbd2cSJim Jagielski infos[j], UNO_QUERY_THROW);
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski break;
129*b1cdbd2cSJim Jagielski }
130*b1cdbd2cSJim Jagielski }
131*b1cdbd2cSJim Jagielski else
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski allHaveOwnUpdateInformation &= false;
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski out_allFound = allHaveOwnUpdateInformation;
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski
getDefaultUpdateInfos(Reference<uno::XComponentContext> const & xContext,Reference<deployment::XUpdateInformationProvider> const & updateInformation,UpdateInfoMap & inout_map,std::vector<std::pair<Reference<deployment::XPackage>,uno::Any>> & out_errors)139*b1cdbd2cSJim Jagielski void getDefaultUpdateInfos(
140*b1cdbd2cSJim Jagielski Reference<uno::XComponentContext> const & xContext,
141*b1cdbd2cSJim Jagielski Reference<deployment::XUpdateInformationProvider > const & updateInformation,
142*b1cdbd2cSJim Jagielski UpdateInfoMap& inout_map,
143*b1cdbd2cSJim Jagielski std::vector<std::pair<Reference<deployment::XPackage>, uno::Any> > & out_errors)
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski const rtl::OUString sDefaultURL(dp_misc::getExtensionDefaultUpdateURL());
146*b1cdbd2cSJim Jagielski OSL_ASSERT(sDefaultURL.getLength());
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski Any anyError;
149*b1cdbd2cSJim Jagielski Sequence< Reference< xml::dom::XElement > >
150*b1cdbd2cSJim Jagielski infos(
151*b1cdbd2cSJim Jagielski getUpdateInformation(
152*b1cdbd2cSJim Jagielski updateInformation,
153*b1cdbd2cSJim Jagielski Sequence< OUString >(&sDefaultURL, 1), OUString(), anyError));
154*b1cdbd2cSJim Jagielski if (anyError.hasValue())
155*b1cdbd2cSJim Jagielski out_errors.push_back(std::make_pair(Reference<deployment::XPackage>(), anyError));
156*b1cdbd2cSJim Jagielski for (sal_Int32 i = 0; i < infos.getLength(); ++i)
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski Reference< xml::dom::XNode > node(infos[i], UNO_QUERY_THROW);
159*b1cdbd2cSJim Jagielski dp_misc::DescriptionInfoset infoset(xContext, node);
160*b1cdbd2cSJim Jagielski boost::optional< OUString > id(infoset.getIdentifier());
161*b1cdbd2cSJim Jagielski if (!id) {
162*b1cdbd2cSJim Jagielski continue;
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski UpdateInfoMap::iterator j = inout_map.find(*id);
165*b1cdbd2cSJim Jagielski if (j != inout_map.end())
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski //skip those extension which provide its own update urls
168*b1cdbd2cSJim Jagielski if (j->second.extension->getUpdateInformationURLs().getLength())
169*b1cdbd2cSJim Jagielski continue;
170*b1cdbd2cSJim Jagielski OUString v(infoset.getVersion());
171*b1cdbd2cSJim Jagielski //look for the highest version in the online repository
172*b1cdbd2cSJim Jagielski if (dp_misc::compareVersions(v, j->second.version) ==
173*b1cdbd2cSJim Jagielski dp_misc::GREATER)
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski j->second.version = v;
176*b1cdbd2cSJim Jagielski j->second.info = node;
177*b1cdbd2cSJim Jagielski }
178*b1cdbd2cSJim Jagielski }
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski
containsBundledOnly(Sequence<Reference<deployment::XPackage>> const & sameIdExtensions)182*b1cdbd2cSJim Jagielski bool containsBundledOnly(Sequence<Reference<deployment::XPackage> > const & sameIdExtensions)
183*b1cdbd2cSJim Jagielski {
184*b1cdbd2cSJim Jagielski OSL_ASSERT(sameIdExtensions.getLength() == 3);
185*b1cdbd2cSJim Jagielski if (!sameIdExtensions[0].is() && !sameIdExtensions[1].is() && sameIdExtensions[2].is())
186*b1cdbd2cSJim Jagielski return true;
187*b1cdbd2cSJim Jagielski else
188*b1cdbd2cSJim Jagielski return false;
189*b1cdbd2cSJim Jagielski }
190*b1cdbd2cSJim Jagielski /** Returns true if the list of extensions are bundled extensions and there are no
191*b1cdbd2cSJim Jagielski other extensions with the same identifier in the shared or user repository.
192*b1cdbd2cSJim Jagielski If extensionList is NULL, then it is checked if there are only bundled extensions.
193*b1cdbd2cSJim Jagielski */
onlyBundledExtensions(Reference<deployment::XExtensionManager> const & xExtMgr,std::vector<Reference<deployment::XPackage>> const * extensionList)194*b1cdbd2cSJim Jagielski bool onlyBundledExtensions(
195*b1cdbd2cSJim Jagielski Reference<deployment::XExtensionManager> const & xExtMgr,
196*b1cdbd2cSJim Jagielski std::vector< Reference<deployment::XPackage > > const * extensionList)
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski OSL_ASSERT(xExtMgr.is());
199*b1cdbd2cSJim Jagielski bool onlyBundled = true;
200*b1cdbd2cSJim Jagielski if (extensionList)
201*b1cdbd2cSJim Jagielski {
202*b1cdbd2cSJim Jagielski typedef std::vector<Reference<deployment::XPackage > >::const_iterator CIT;
203*b1cdbd2cSJim Jagielski for (CIT i = extensionList->begin(); i != extensionList->end(); i++)
204*b1cdbd2cSJim Jagielski {
205*b1cdbd2cSJim Jagielski Sequence<Reference<deployment::XPackage> > seqExt = xExtMgr->getExtensionsWithSameIdentifier(
206*b1cdbd2cSJim Jagielski dp_misc::getIdentifier(*i), (*i)->getName(), Reference<ucb::XCommandEnvironment>());
207*b1cdbd2cSJim Jagielski
208*b1cdbd2cSJim Jagielski if (!containsBundledOnly(seqExt))
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski onlyBundled = false;
211*b1cdbd2cSJim Jagielski break;
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski else
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski const uno::Sequence< uno::Sequence< Reference<deployment::XPackage > > > seqAllExt =
219*b1cdbd2cSJim Jagielski xExtMgr->getAllExtensions(Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>());
220*b1cdbd2cSJim Jagielski
221*b1cdbd2cSJim Jagielski for (int pos = seqAllExt.getLength(); pos --; )
222*b1cdbd2cSJim Jagielski {
223*b1cdbd2cSJim Jagielski if (!containsBundledOnly(seqAllExt[pos]))
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski onlyBundled = false;
226*b1cdbd2cSJim Jagielski break;
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski }
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski return onlyBundled;
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski
233*b1cdbd2cSJim Jagielski } // anon namespace
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski
getExtensionDefaultUpdateURL()236*b1cdbd2cSJim Jagielski OUString getExtensionDefaultUpdateURL()
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski ::rtl::OUString sUrl(
239*b1cdbd2cSJim Jagielski RTL_CONSTASCII_USTRINGPARAM(
240*b1cdbd2cSJim Jagielski "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("version")
241*b1cdbd2cSJim Jagielski ":Version:ExtensionUpdateURL}"));
242*b1cdbd2cSJim Jagielski ::rtl::Bootstrap::expandMacros(sUrl);
243*b1cdbd2cSJim Jagielski return sUrl;
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski /* returns the index of the greatest version, starting with 0
247*b1cdbd2cSJim Jagielski
248*b1cdbd2cSJim Jagielski */
isUpdateUserExtension(bool bReadOnlyShared,::rtl::OUString const & userVersion,::rtl::OUString const & sharedVersion,::rtl::OUString const & bundledVersion,::rtl::OUString const & onlineVersion)249*b1cdbd2cSJim Jagielski UPDATE_SOURCE isUpdateUserExtension(
250*b1cdbd2cSJim Jagielski bool bReadOnlyShared,
251*b1cdbd2cSJim Jagielski ::rtl::OUString const & userVersion,
252*b1cdbd2cSJim Jagielski ::rtl::OUString const & sharedVersion,
253*b1cdbd2cSJim Jagielski ::rtl::OUString const & bundledVersion,
254*b1cdbd2cSJim Jagielski ::rtl::OUString const & onlineVersion)
255*b1cdbd2cSJim Jagielski {
256*b1cdbd2cSJim Jagielski UPDATE_SOURCE retVal = UPDATE_SOURCE_NONE;
257*b1cdbd2cSJim Jagielski if (bReadOnlyShared)
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski if (userVersion.getLength())
260*b1cdbd2cSJim Jagielski {
261*b1cdbd2cSJim Jagielski int index = determineHighestVersion(
262*b1cdbd2cSJim Jagielski userVersion, sharedVersion, bundledVersion, onlineVersion);
263*b1cdbd2cSJim Jagielski if (index == 1)
264*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_SHARED;
265*b1cdbd2cSJim Jagielski else if (index == 2)
266*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_BUNDLED;
267*b1cdbd2cSJim Jagielski else if (index == 3)
268*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_ONLINE;
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski else if (sharedVersion.getLength())
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski int index = determineHighestVersion(
273*b1cdbd2cSJim Jagielski OUString(), sharedVersion, bundledVersion, onlineVersion);
274*b1cdbd2cSJim Jagielski if (index == 2)
275*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_BUNDLED;
276*b1cdbd2cSJim Jagielski else if (index == 3)
277*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_ONLINE;
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski //No update for bundled extensions, they are updated only by the setup
281*b1cdbd2cSJim Jagielski //else if (bundledVersion.getLength())
282*b1cdbd2cSJim Jagielski //{
283*b1cdbd2cSJim Jagielski // int index = determineHighestVersion(
284*b1cdbd2cSJim Jagielski // OUString(), OUString(), bundledVersion, onlineVersion);
285*b1cdbd2cSJim Jagielski // if (index == 3)
286*b1cdbd2cSJim Jagielski // retVal = UPDATE_SOURCE_ONLINE;
287*b1cdbd2cSJim Jagielski //}
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski else
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski if (userVersion.getLength())
292*b1cdbd2cSJim Jagielski {
293*b1cdbd2cSJim Jagielski int index = determineHighestVersion(
294*b1cdbd2cSJim Jagielski userVersion, sharedVersion, bundledVersion, onlineVersion);
295*b1cdbd2cSJim Jagielski if (index == 1)
296*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_SHARED;
297*b1cdbd2cSJim Jagielski else if (index == 2)
298*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_BUNDLED;
299*b1cdbd2cSJim Jagielski else if (index == 3)
300*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_ONLINE;
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski
304*b1cdbd2cSJim Jagielski return retVal;
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski
isUpdateSharedExtension(bool bReadOnlyShared,::rtl::OUString const & sharedVersion,::rtl::OUString const & bundledVersion,::rtl::OUString const & onlineVersion)307*b1cdbd2cSJim Jagielski UPDATE_SOURCE isUpdateSharedExtension(
308*b1cdbd2cSJim Jagielski bool bReadOnlyShared,
309*b1cdbd2cSJim Jagielski ::rtl::OUString const & sharedVersion,
310*b1cdbd2cSJim Jagielski ::rtl::OUString const & bundledVersion,
311*b1cdbd2cSJim Jagielski ::rtl::OUString const & onlineVersion)
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski if (bReadOnlyShared)
314*b1cdbd2cSJim Jagielski return UPDATE_SOURCE_NONE;
315*b1cdbd2cSJim Jagielski UPDATE_SOURCE retVal = UPDATE_SOURCE_NONE;
316*b1cdbd2cSJim Jagielski
317*b1cdbd2cSJim Jagielski if (sharedVersion.getLength())
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski int index = determineHighestVersion(
320*b1cdbd2cSJim Jagielski OUString(), sharedVersion, bundledVersion, onlineVersion);
321*b1cdbd2cSJim Jagielski if (index == 2)
322*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_BUNDLED;
323*b1cdbd2cSJim Jagielski else if (index == 3)
324*b1cdbd2cSJim Jagielski retVal = UPDATE_SOURCE_ONLINE;
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski //No update for bundled extensions, they are updated only by the setup
327*b1cdbd2cSJim Jagielski //else if (bundledVersion.getLength())
328*b1cdbd2cSJim Jagielski //{
329*b1cdbd2cSJim Jagielski // int index = determineHighestVersion(
330*b1cdbd2cSJim Jagielski // OUString(), OUString(), bundledVersion, onlineVersion);
331*b1cdbd2cSJim Jagielski // if (index == 3)
332*b1cdbd2cSJim Jagielski // retVal = UPDATE_SOURCE_ONLINE;
333*b1cdbd2cSJim Jagielski //}
334*b1cdbd2cSJim Jagielski return retVal;
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski
337*b1cdbd2cSJim Jagielski Reference<deployment::XPackage>
getExtensionWithHighestVersion(Sequence<Reference<deployment::XPackage>> const & seqExt)338*b1cdbd2cSJim Jagielski getExtensionWithHighestVersion(
339*b1cdbd2cSJim Jagielski Sequence<Reference<deployment::XPackage> > const & seqExt)
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski if (seqExt.getLength() == 0)
342*b1cdbd2cSJim Jagielski return Reference<deployment::XPackage>();
343*b1cdbd2cSJim Jagielski
344*b1cdbd2cSJim Jagielski Reference<deployment::XPackage> greatest;
345*b1cdbd2cSJim Jagielski sal_Int32 len = seqExt.getLength();
346*b1cdbd2cSJim Jagielski
347*b1cdbd2cSJim Jagielski for (sal_Int32 i = 0; i < len; i++)
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski if (!greatest.is())
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski greatest = seqExt[i];
352*b1cdbd2cSJim Jagielski continue;
353*b1cdbd2cSJim Jagielski }
354*b1cdbd2cSJim Jagielski Reference<deployment::XPackage> const & current = seqExt[i];
355*b1cdbd2cSJim Jagielski //greatest has a value
356*b1cdbd2cSJim Jagielski if (! current.is())
357*b1cdbd2cSJim Jagielski continue;
358*b1cdbd2cSJim Jagielski
359*b1cdbd2cSJim Jagielski if (dp_misc::compareVersions(current->getVersion(), greatest->getVersion()) == dp_misc::GREATER)
360*b1cdbd2cSJim Jagielski greatest = current;
361*b1cdbd2cSJim Jagielski }
362*b1cdbd2cSJim Jagielski return greatest;
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski
UpdateInfo(Reference<deployment::XPackage> const & ext)365*b1cdbd2cSJim Jagielski UpdateInfo::UpdateInfo( Reference< deployment::XPackage> const & ext):
366*b1cdbd2cSJim Jagielski extension(ext)
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski
370*b1cdbd2cSJim Jagielski
371*b1cdbd2cSJim Jagielski
getOnlineUpdateInfos(Reference<uno::XComponentContext> const & xContext,Reference<deployment::XExtensionManager> const & xExtMgr,Reference<deployment::XUpdateInformationProvider> const & updateInformation,std::vector<Reference<deployment::XPackage>> const * extensionList,std::vector<std::pair<Reference<deployment::XPackage>,uno::Any>> & out_errors)372*b1cdbd2cSJim Jagielski UpdateInfoMap getOnlineUpdateInfos(
373*b1cdbd2cSJim Jagielski Reference<uno::XComponentContext> const &xContext,
374*b1cdbd2cSJim Jagielski Reference<deployment::XExtensionManager> const & xExtMgr,
375*b1cdbd2cSJim Jagielski Reference<deployment::XUpdateInformationProvider > const & updateInformation,
376*b1cdbd2cSJim Jagielski std::vector<Reference<deployment::XPackage > > const * extensionList,
377*b1cdbd2cSJim Jagielski std::vector<std::pair< Reference<deployment::XPackage>, uno::Any> > & out_errors)
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski OSL_ASSERT(xExtMgr.is());
380*b1cdbd2cSJim Jagielski UpdateInfoMap infoMap;
381*b1cdbd2cSJim Jagielski if (!xExtMgr.is() || onlyBundledExtensions(xExtMgr, extensionList))
382*b1cdbd2cSJim Jagielski return infoMap;
383*b1cdbd2cSJim Jagielski
384*b1cdbd2cSJim Jagielski if (!extensionList)
385*b1cdbd2cSJim Jagielski {
386*b1cdbd2cSJim Jagielski const uno::Sequence< uno::Sequence< Reference<deployment::XPackage > > > seqAllExt = xExtMgr->getAllExtensions(
387*b1cdbd2cSJim Jagielski Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>());
388*b1cdbd2cSJim Jagielski
389*b1cdbd2cSJim Jagielski //fill the UpdateInfoMap. key = extension identifier, value = UpdateInfo
390*b1cdbd2cSJim Jagielski for (int pos = seqAllExt.getLength(); pos --; )
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski uno::Sequence<Reference<deployment::XPackage> > const & seqExt = seqAllExt[pos];
393*b1cdbd2cSJim Jagielski
394*b1cdbd2cSJim Jagielski Reference<deployment::XPackage> extension = getExtensionWithHighestVersion(seqExt);
395*b1cdbd2cSJim Jagielski OSL_ASSERT(extension.is());
396*b1cdbd2cSJim Jagielski
397*b1cdbd2cSJim Jagielski std::pair<UpdateInfoMap::iterator, bool> insertRet = infoMap.insert(
398*b1cdbd2cSJim Jagielski UpdateInfoMap::value_type(
399*b1cdbd2cSJim Jagielski dp_misc::getIdentifier(extension), UpdateInfo(extension)));
400*b1cdbd2cSJim Jagielski OSL_ASSERT(insertRet.second == true);
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski else
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski typedef std::vector<Reference<deployment::XPackage > >::const_iterator CIT;
406*b1cdbd2cSJim Jagielski for (CIT i = extensionList->begin(); i != extensionList->end(); i++)
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski OSL_ASSERT(i->is());
409*b1cdbd2cSJim Jagielski std::pair<UpdateInfoMap::iterator, bool> insertRet = infoMap.insert(
410*b1cdbd2cSJim Jagielski UpdateInfoMap::value_type(
411*b1cdbd2cSJim Jagielski dp_misc::getIdentifier(*i), UpdateInfo(*i)));
412*b1cdbd2cSJim Jagielski OSL_ASSERT(insertRet.second == true);
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski }
415*b1cdbd2cSJim Jagielski
416*b1cdbd2cSJim Jagielski //Now find the update information for the extensions which provide their own
417*b1cdbd2cSJim Jagielski //URLs to update information.
418*b1cdbd2cSJim Jagielski bool allInfosObtained = false;
419*b1cdbd2cSJim Jagielski getOwnUpdateInfos(xContext, updateInformation, infoMap, out_errors, allInfosObtained);
420*b1cdbd2cSJim Jagielski
421*b1cdbd2cSJim Jagielski if (!allInfosObtained)
422*b1cdbd2cSJim Jagielski getDefaultUpdateInfos(xContext, updateInformation, infoMap, out_errors);
423*b1cdbd2cSJim Jagielski return infoMap;
424*b1cdbd2cSJim Jagielski }
getHighestVersion(::rtl::OUString const & userVersion,::rtl::OUString const & sharedVersion,::rtl::OUString const & bundledVersion,::rtl::OUString const & onlineVersion)425*b1cdbd2cSJim Jagielski OUString getHighestVersion(
426*b1cdbd2cSJim Jagielski ::rtl::OUString const & userVersion,
427*b1cdbd2cSJim Jagielski ::rtl::OUString const & sharedVersion,
428*b1cdbd2cSJim Jagielski ::rtl::OUString const & bundledVersion,
429*b1cdbd2cSJim Jagielski ::rtl::OUString const & onlineVersion)
430*b1cdbd2cSJim Jagielski {
431*b1cdbd2cSJim Jagielski int index = determineHighestVersion(userVersion, sharedVersion, bundledVersion, onlineVersion);
432*b1cdbd2cSJim Jagielski switch (index)
433*b1cdbd2cSJim Jagielski {
434*b1cdbd2cSJim Jagielski case 0: return userVersion;
435*b1cdbd2cSJim Jagielski case 1: return sharedVersion;
436*b1cdbd2cSJim Jagielski case 2: return bundledVersion;
437*b1cdbd2cSJim Jagielski case 3: return onlineVersion;
438*b1cdbd2cSJim Jagielski default: OSL_ASSERT(0);
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski
441*b1cdbd2cSJim Jagielski return OUString();
442*b1cdbd2cSJim Jagielski }
443*b1cdbd2cSJim Jagielski } //namespace dp_misc
444