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