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 #include <cppuhelper/implbase3.hxx>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "comphelper/servicedecl.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/UpdateInformationProvider.hpp"
32*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/XPackage.hpp"
33*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/XPackageInformationProvider.hpp"
34*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/ExtensionManager.hpp"
35*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/XUpdateInformationProvider.hpp"
36*b1cdbd2cSJim Jagielski #include "com/sun/star/lang/XServiceInfo.hpp"
37*b1cdbd2cSJim Jagielski #include "com/sun/star/registry/XRegistryKey.hpp"
38*b1cdbd2cSJim Jagielski #include "com/sun/star/task/XAbortChannel.hpp"
39*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/XComponentContext.hpp"
40*b1cdbd2cSJim Jagielski #include "com/sun/star/ucb/XCommandEnvironment.hpp"
41*b1cdbd2cSJim Jagielski #include "com/sun/star/xml/dom/XElement.hpp"
42*b1cdbd2cSJim Jagielski #include "com/sun/star/xml/dom/XNode.hpp"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/Reference.hxx"
45*b1cdbd2cSJim Jagielski #include "rtl/ustring.hxx"
46*b1cdbd2cSJim Jagielski #include "ucbhelper/content.hxx"
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include "dp_dependencies.hxx"
49*b1cdbd2cSJim Jagielski #include "dp_descriptioninfoset.hxx"
50*b1cdbd2cSJim Jagielski #include "dp_identifier.hxx"
51*b1cdbd2cSJim Jagielski #include "dp_version.hxx"
52*b1cdbd2cSJim Jagielski #include "dp_misc.h"
53*b1cdbd2cSJim Jagielski #include "dp_update.hxx"
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski namespace beans      = com::sun::star::beans ;
56*b1cdbd2cSJim Jagielski namespace deployment = com::sun::star::deployment ;
57*b1cdbd2cSJim Jagielski namespace lang       = com::sun::star::lang ;
58*b1cdbd2cSJim Jagielski namespace registry   = com::sun::star::registry ;
59*b1cdbd2cSJim Jagielski namespace task       = com::sun::star::task ;
60*b1cdbd2cSJim Jagielski namespace css_ucb    = com::sun::star::ucb ;
61*b1cdbd2cSJim Jagielski namespace uno        = com::sun::star::uno ;
62*b1cdbd2cSJim Jagielski namespace xml = com::sun::star::xml ;
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #define UNISTRING(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski namespace dp_info {
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski class PackageInformationProvider :
69*b1cdbd2cSJim Jagielski         public ::cppu::WeakImplHelper1< deployment::XPackageInformationProvider >
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski {
72*b1cdbd2cSJim Jagielski     public:
73*b1cdbd2cSJim Jagielski                  PackageInformationProvider( uno::Reference< uno::XComponentContext >const& xContext);
74*b1cdbd2cSJim Jagielski     virtual     ~PackageInformationProvider();
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     static uno::Sequence< rtl::OUString > getServiceNames();
77*b1cdbd2cSJim Jagielski     static rtl::OUString getImplName();
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski     // XPackageInformationProvider
80*b1cdbd2cSJim Jagielski     virtual rtl::OUString SAL_CALL getPackageLocation( const rtl::OUString& extensionId )
81*b1cdbd2cSJim Jagielski         throw ( uno::RuntimeException );
82*b1cdbd2cSJim Jagielski     virtual uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL isUpdateAvailable( const rtl::OUString& extensionId )
83*b1cdbd2cSJim Jagielski         throw ( uno::RuntimeException );
84*b1cdbd2cSJim Jagielski     virtual uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL getExtensionList()
85*b1cdbd2cSJim Jagielski         throw ( uno::RuntimeException );
86*b1cdbd2cSJim Jagielski //---------
87*b1cdbd2cSJim Jagielski private:
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski     uno::Reference< uno::XComponentContext> mxContext;
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski     rtl::OUString getPackageLocation( const rtl::OUString& repository,
92*b1cdbd2cSJim Jagielski                                       const rtl::OUString& _sExtensionId );
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski     uno::Reference< deployment::XUpdateInformationProvider > mxUpdateInformation;
95*b1cdbd2cSJim Jagielski };
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
98*b1cdbd2cSJim Jagielski 
PackageInformationProvider(uno::Reference<uno::XComponentContext> const & xContext)99*b1cdbd2cSJim Jagielski PackageInformationProvider::PackageInformationProvider( uno::Reference< uno::XComponentContext > const& xContext) :
100*b1cdbd2cSJim Jagielski     mxContext( xContext ),
101*b1cdbd2cSJim Jagielski     mxUpdateInformation( deployment::UpdateInformationProvider::create( xContext ) )
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
106*b1cdbd2cSJim Jagielski 
~PackageInformationProvider()107*b1cdbd2cSJim Jagielski PackageInformationProvider::~PackageInformationProvider()
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getPackageLocation(const rtl::OUString & repository,const rtl::OUString & _rExtensionId)112*b1cdbd2cSJim Jagielski rtl::OUString PackageInformationProvider::getPackageLocation(
113*b1cdbd2cSJim Jagielski     const rtl::OUString & repository,
114*b1cdbd2cSJim Jagielski     const rtl::OUString& _rExtensionId )
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski     rtl::OUString aLocationURL;
117*b1cdbd2cSJim Jagielski     uno::Reference<deployment::XExtensionManager> xManager =
118*b1cdbd2cSJim Jagielski         deployment::ExtensionManager::get(mxContext);
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     if ( xManager.is() )
121*b1cdbd2cSJim Jagielski     {
122*b1cdbd2cSJim Jagielski         const uno::Sequence< uno::Reference< deployment::XPackage > > packages(
123*b1cdbd2cSJim Jagielski                 xManager->getDeployedExtensions(
124*b1cdbd2cSJim Jagielski                     repository,
125*b1cdbd2cSJim Jagielski                     uno::Reference< task::XAbortChannel >(),
126*b1cdbd2cSJim Jagielski                     uno::Reference< css_ucb::XCommandEnvironment > () ) );
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski         for ( int pos = packages.getLength(); pos--; )
129*b1cdbd2cSJim Jagielski         {
130*b1cdbd2cSJim Jagielski             try
131*b1cdbd2cSJim Jagielski             {
132*b1cdbd2cSJim Jagielski                 const rtl::OUString aName = packages[ pos ]->getName();
133*b1cdbd2cSJim Jagielski                 const beans::Optional< rtl::OUString > aID = packages[ pos ]->getIdentifier();
134*b1cdbd2cSJim Jagielski                 if ( aID.IsPresent && aID.Value.compareTo( _rExtensionId ) == 0 )
135*b1cdbd2cSJim Jagielski                 {
136*b1cdbd2cSJim Jagielski                     aLocationURL = packages[ pos ]->getURL();
137*b1cdbd2cSJim Jagielski                     break;
138*b1cdbd2cSJim Jagielski                 }
139*b1cdbd2cSJim Jagielski             }
140*b1cdbd2cSJim Jagielski             catch ( uno::RuntimeException & ) {}
141*b1cdbd2cSJim Jagielski         }
142*b1cdbd2cSJim Jagielski     }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski     return aLocationURL;
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
148*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
149*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL
getPackageLocation(const rtl::OUString & _sExtensionId)152*b1cdbd2cSJim Jagielski PackageInformationProvider::getPackageLocation( const rtl::OUString& _sExtensionId )
153*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
154*b1cdbd2cSJim Jagielski {
155*b1cdbd2cSJim Jagielski     rtl::OUString aLocationURL = getPackageLocation( UNISTRING("user"), _sExtensionId );
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski     if ( aLocationURL.getLength() == 0 )
158*b1cdbd2cSJim Jagielski     {
159*b1cdbd2cSJim Jagielski         aLocationURL = getPackageLocation( UNISTRING("shared"), _sExtensionId );
160*b1cdbd2cSJim Jagielski     }
161*b1cdbd2cSJim Jagielski     if ( aLocationURL.getLength() == 0 )
162*b1cdbd2cSJim Jagielski     {
163*b1cdbd2cSJim Jagielski         aLocationURL = getPackageLocation( UNISTRING("bundled"), _sExtensionId );
164*b1cdbd2cSJim Jagielski     }
165*b1cdbd2cSJim Jagielski     if ( aLocationURL.getLength() == 0 )
166*b1cdbd2cSJim Jagielski     {
167*b1cdbd2cSJim Jagielski         aLocationURL = getPackageLocation( UNISTRING("bundled_prereg"), _sExtensionId );
168*b1cdbd2cSJim Jagielski     }
169*b1cdbd2cSJim Jagielski     if ( aLocationURL.getLength() )
170*b1cdbd2cSJim Jagielski     {
171*b1cdbd2cSJim Jagielski         ::ucbhelper::Content aContent( aLocationURL, NULL );
172*b1cdbd2cSJim Jagielski         aLocationURL = aContent.getURL();
173*b1cdbd2cSJim Jagielski     }
174*b1cdbd2cSJim Jagielski     return aLocationURL;
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL
isUpdateAvailable(const rtl::OUString & _sExtensionId)180*b1cdbd2cSJim Jagielski PackageInformationProvider::isUpdateAvailable( const rtl::OUString& _sExtensionId )
181*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Sequence< rtl::OUString > > aList;
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     uno::Reference<deployment::XExtensionManager> extMgr =
186*b1cdbd2cSJim Jagielski         deployment::ExtensionManager::get(mxContext);
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski     if (!extMgr.is())
189*b1cdbd2cSJim Jagielski     {
190*b1cdbd2cSJim Jagielski         OSL_ASSERT(0);
191*b1cdbd2cSJim Jagielski         return aList;
192*b1cdbd2cSJim Jagielski     }
193*b1cdbd2cSJim Jagielski     std::vector<std::pair<uno::Reference<deployment::XPackage>, uno::Any > > errors;
194*b1cdbd2cSJim Jagielski     dp_misc::UpdateInfoMap updateInfoMap;
195*b1cdbd2cSJim Jagielski     if (_sExtensionId.getLength())
196*b1cdbd2cSJim Jagielski     {
197*b1cdbd2cSJim Jagielski         std::vector<uno::Reference<deployment::XPackage> > vecExtensions;
198*b1cdbd2cSJim Jagielski         uno::Reference<deployment::XPackage> extension;
199*b1cdbd2cSJim Jagielski         try
200*b1cdbd2cSJim Jagielski         {
201*b1cdbd2cSJim Jagielski             extension = dp_misc::getExtensionWithHighestVersion(
202*b1cdbd2cSJim Jagielski                 extMgr->getExtensionsWithSameIdentifier(
203*b1cdbd2cSJim Jagielski                     _sExtensionId, _sExtensionId, uno::Reference<css_ucb::XCommandEnvironment>()));
204*b1cdbd2cSJim Jagielski             vecExtensions.push_back(extension);
205*b1cdbd2cSJim Jagielski         }
206*b1cdbd2cSJim Jagielski         catch (lang::IllegalArgumentException &)
207*b1cdbd2cSJim Jagielski         {
208*b1cdbd2cSJim Jagielski             OSL_ASSERT(0);
209*b1cdbd2cSJim Jagielski         }
210*b1cdbd2cSJim Jagielski         updateInfoMap = dp_misc::getOnlineUpdateInfos(
211*b1cdbd2cSJim Jagielski             mxContext, extMgr, mxUpdateInformation, &vecExtensions, errors);
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski     else
214*b1cdbd2cSJim Jagielski     {
215*b1cdbd2cSJim Jagielski         updateInfoMap = dp_misc::getOnlineUpdateInfos(
216*b1cdbd2cSJim Jagielski             mxContext, extMgr, mxUpdateInformation, NULL, errors);
217*b1cdbd2cSJim Jagielski     }
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski     int nCount = 0;
220*b1cdbd2cSJim Jagielski     for (dp_misc::UpdateInfoMap::iterator i(updateInfoMap.begin()); i != updateInfoMap.end(); i++)
221*b1cdbd2cSJim Jagielski     {
222*b1cdbd2cSJim Jagielski         dp_misc::UpdateInfo const & info = i->second;
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski         rtl::OUString sOnlineVersion;
225*b1cdbd2cSJim Jagielski         if (info.info.is())
226*b1cdbd2cSJim Jagielski         {
227*b1cdbd2cSJim Jagielski             // check, if there are unsatisfied dependencies and ignore this online update
228*b1cdbd2cSJim Jagielski             dp_misc::DescriptionInfoset infoset(mxContext, info.info);
229*b1cdbd2cSJim Jagielski             uno::Sequence< uno::Reference< xml::dom::XElement > >
230*b1cdbd2cSJim Jagielski                 ds( dp_misc::Dependencies::check( infoset ) );
231*b1cdbd2cSJim Jagielski             if ( ! ds.getLength() )
232*b1cdbd2cSJim Jagielski                 sOnlineVersion = info.version;
233*b1cdbd2cSJim Jagielski         }
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski         rtl::OUString sVersionUser;
236*b1cdbd2cSJim Jagielski         rtl::OUString sVersionShared;
237*b1cdbd2cSJim Jagielski         rtl::OUString sVersionBundled;
238*b1cdbd2cSJim Jagielski         uno::Sequence< uno::Reference< deployment::XPackage> > extensions;
239*b1cdbd2cSJim Jagielski         try {
240*b1cdbd2cSJim Jagielski             extensions = extMgr->getExtensionsWithSameIdentifier(
241*b1cdbd2cSJim Jagielski                 dp_misc::getIdentifier(info.extension), info.extension->getName(),
242*b1cdbd2cSJim Jagielski                 uno::Reference<css_ucb::XCommandEnvironment>());
243*b1cdbd2cSJim Jagielski         } catch (lang::IllegalArgumentException& ) {
244*b1cdbd2cSJim Jagielski             OSL_ASSERT(0);
245*b1cdbd2cSJim Jagielski         }
246*b1cdbd2cSJim Jagielski         OSL_ASSERT(extensions.getLength() == 3);
247*b1cdbd2cSJim Jagielski         if (extensions[0].is() )
248*b1cdbd2cSJim Jagielski             sVersionUser = extensions[0]->getVersion();
249*b1cdbd2cSJim Jagielski         if (extensions[1].is() )
250*b1cdbd2cSJim Jagielski             sVersionShared = extensions[1]->getVersion();
251*b1cdbd2cSJim Jagielski         if (extensions[2].is() )
252*b1cdbd2cSJim Jagielski             sVersionBundled = extensions[2]->getVersion();
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski         bool bSharedReadOnly = extMgr->isReadOnlyRepository(OUSTR("shared"));
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski         dp_misc::UPDATE_SOURCE sourceUser = dp_misc::isUpdateUserExtension(
257*b1cdbd2cSJim Jagielski             bSharedReadOnly, sVersionUser, sVersionShared, sVersionBundled, sOnlineVersion);
258*b1cdbd2cSJim Jagielski         dp_misc::UPDATE_SOURCE sourceShared = dp_misc::isUpdateSharedExtension(
259*b1cdbd2cSJim Jagielski             bSharedReadOnly, sVersionShared, sVersionBundled, sOnlineVersion);
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski         rtl::OUString updateVersionUser;
262*b1cdbd2cSJim Jagielski         rtl::OUString updateVersionShared;
263*b1cdbd2cSJim Jagielski         if (sourceUser != dp_misc::UPDATE_SOURCE_NONE)
264*b1cdbd2cSJim Jagielski             updateVersionUser = dp_misc::getHighestVersion(
265*b1cdbd2cSJim Jagielski                 rtl::OUString(), sVersionShared, sVersionBundled, sOnlineVersion);
266*b1cdbd2cSJim Jagielski         if (sourceShared  != dp_misc::UPDATE_SOURCE_NONE)
267*b1cdbd2cSJim Jagielski             updateVersionShared = dp_misc::getHighestVersion(
268*b1cdbd2cSJim Jagielski                 rtl::OUString(), rtl::OUString(), sVersionBundled, sOnlineVersion);
269*b1cdbd2cSJim Jagielski         rtl::OUString updateVersion;
270*b1cdbd2cSJim Jagielski         if (dp_misc::compareVersions(updateVersionUser, updateVersionShared) == dp_misc::GREATER)
271*b1cdbd2cSJim Jagielski             updateVersion = updateVersionUser;
272*b1cdbd2cSJim Jagielski         else
273*b1cdbd2cSJim Jagielski             updateVersion = updateVersionShared;
274*b1cdbd2cSJim Jagielski         if (updateVersion.getLength())
275*b1cdbd2cSJim Jagielski         {
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski             rtl::OUString aNewEntry[2];
278*b1cdbd2cSJim Jagielski             aNewEntry[0] = i->first;
279*b1cdbd2cSJim Jagielski             aNewEntry[1] = updateVersion;
280*b1cdbd2cSJim Jagielski             aList.realloc( ++nCount );
281*b1cdbd2cSJim Jagielski             aList[ nCount-1 ] = ::uno::Sequence< rtl::OUString >( aNewEntry, 2 );
282*b1cdbd2cSJim Jagielski         }
283*b1cdbd2cSJim Jagielski     }
284*b1cdbd2cSJim Jagielski     return aList;
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getExtensionList()288*b1cdbd2cSJim Jagielski uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL PackageInformationProvider::getExtensionList()
289*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski     const uno::Reference<deployment::XExtensionManager> mgr =
292*b1cdbd2cSJim Jagielski         deployment::ExtensionManager::get(mxContext);
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski     if (!mgr.is())
295*b1cdbd2cSJim Jagielski         return uno::Sequence< uno::Sequence< rtl::OUString > >();
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski     const uno::Sequence< uno::Sequence< uno::Reference<deployment::XPackage > > >
298*b1cdbd2cSJim Jagielski         allExt =  mgr->getAllExtensions(
299*b1cdbd2cSJim Jagielski             uno::Reference< task::XAbortChannel >(),
300*b1cdbd2cSJim Jagielski             uno::Reference< css_ucb::XCommandEnvironment > () );
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Sequence< rtl::OUString > > retList;
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski     sal_Int32 cAllIds = allExt.getLength();
305*b1cdbd2cSJim Jagielski     retList.realloc(cAllIds);
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski     for (sal_Int32 i = 0; i < cAllIds; i++)
308*b1cdbd2cSJim Jagielski     {
309*b1cdbd2cSJim Jagielski         //The inner sequence contains extensions with the same identifier from
310*b1cdbd2cSJim Jagielski         //all the different repositories, that is user, share, bundled.
311*b1cdbd2cSJim Jagielski         const uno::Sequence< uno::Reference< deployment::XPackage > > &
312*b1cdbd2cSJim Jagielski             seqExtension = allExt[i];
313*b1cdbd2cSJim Jagielski         sal_Int32 cExt = seqExtension.getLength();
314*b1cdbd2cSJim Jagielski         OSL_ASSERT(cExt == 3);
315*b1cdbd2cSJim Jagielski         for (sal_Int32 j = 0; j < cExt; j++)
316*b1cdbd2cSJim Jagielski         {
317*b1cdbd2cSJim Jagielski             //ToDo according to the old code the first found extenions is used
318*b1cdbd2cSJim Jagielski             //even if another one with the same id has a better version.
319*b1cdbd2cSJim Jagielski             uno::Reference< deployment::XPackage > const & xExtension( seqExtension[j] );
320*b1cdbd2cSJim Jagielski             if (xExtension.is())
321*b1cdbd2cSJim Jagielski             {
322*b1cdbd2cSJim Jagielski                 rtl::OUString aNewEntry[2];
323*b1cdbd2cSJim Jagielski                 aNewEntry[0] = dp_misc::getIdentifier(xExtension);
324*b1cdbd2cSJim Jagielski                 aNewEntry[1] = xExtension->getVersion();
325*b1cdbd2cSJim Jagielski                 retList[i] = ::uno::Sequence< rtl::OUString >( aNewEntry, 2 );
326*b1cdbd2cSJim Jagielski                 break;
327*b1cdbd2cSJim Jagielski             }
328*b1cdbd2cSJim Jagielski         }
329*b1cdbd2cSJim Jagielski     }
330*b1cdbd2cSJim Jagielski     return retList;
331*b1cdbd2cSJim Jagielski }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
335*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
336*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski namespace sdecl = comphelper::service_decl;
339*b1cdbd2cSJim Jagielski sdecl::class_<PackageInformationProvider> servicePIP;
340*b1cdbd2cSJim Jagielski extern sdecl::ServiceDecl const serviceDecl(
341*b1cdbd2cSJim Jagielski     servicePIP,
342*b1cdbd2cSJim Jagielski     // a private one:
343*b1cdbd2cSJim Jagielski     "com.sun.star.comp.deployment.PackageInformationProvider",
344*b1cdbd2cSJim Jagielski     "com.sun.star.comp.deployment.PackageInformationProvider" );
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
singleton_entries(uno::Reference<registry::XRegistryKey> const & xRegistryKey)347*b1cdbd2cSJim Jagielski bool singleton_entries(
348*b1cdbd2cSJim Jagielski     uno::Reference< registry::XRegistryKey > const & xRegistryKey )
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski     try {
351*b1cdbd2cSJim Jagielski         uno::Reference< registry::XRegistryKey > xKey(
352*b1cdbd2cSJim Jagielski             xRegistryKey->createKey(
353*b1cdbd2cSJim Jagielski                 serviceDecl.getImplementationName() +
354*b1cdbd2cSJim Jagielski                 // xxx todo: use future generated function to get singleton name
355*b1cdbd2cSJim Jagielski                 UNISTRING("/UNO/SINGLETONS/"
356*b1cdbd2cSJim Jagielski                       "com.sun.star.deployment.PackageInformationProvider") ) );
357*b1cdbd2cSJim Jagielski         xKey->setStringValue( serviceDecl.getSupportedServiceNames()[0] );
358*b1cdbd2cSJim Jagielski         return true;
359*b1cdbd2cSJim Jagielski     }
360*b1cdbd2cSJim Jagielski     catch (registry::InvalidRegistryException & exc) {
361*b1cdbd2cSJim Jagielski         (void) exc; // avoid warnings
362*b1cdbd2cSJim Jagielski         OSL_ENSURE( 0, ::rtl::OUStringToOString(
363*b1cdbd2cSJim Jagielski                         exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
364*b1cdbd2cSJim Jagielski         return false;
365*b1cdbd2cSJim Jagielski     }
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski } // namespace dp_info
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 
371