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 #if ! defined INCLUDED_DP_REGISTRY_H
25*b1cdbd2cSJim Jagielski #define INCLUDED_DP_REGISTRY_H
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "dp_misc.h"
28*b1cdbd2cSJim Jagielski #include "dp_resource.h"
29*b1cdbd2cSJim Jagielski #include "dp_interact.h"
30*b1cdbd2cSJim Jagielski #include "rtl/ref.hxx"
31*b1cdbd2cSJim Jagielski #include "cppuhelper/weakref.hxx"
32*b1cdbd2cSJim Jagielski #include "cppuhelper/implbase1.hxx"
33*b1cdbd2cSJim Jagielski #include "cppuhelper/compbase1.hxx"
34*b1cdbd2cSJim Jagielski #include "cppuhelper/compbase2.hxx"
35*b1cdbd2cSJim Jagielski #include "tools/inetmime.hxx"
36*b1cdbd2cSJim Jagielski #include "com/sun/star/lang/XEventListener.hpp"
37*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/XPackageRegistry.hpp"
38*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/XPackageManager.hpp"
39*b1cdbd2cSJim Jagielski #include "com/sun/star/deployment/InvalidRemovedParameterException.hpp"
40*b1cdbd2cSJim Jagielski #include <memory>
41*b1cdbd2cSJim Jagielski #include <hash_map>
42*b1cdbd2cSJim Jagielski #include <list>
43*b1cdbd2cSJim Jagielski #include "dp_registry.hrc"
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski namespace dp_registry
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski namespace backend
48*b1cdbd2cSJim Jagielski {
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski class PackageRegistryBackend;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski char const* const BACKEND_SERVICE_NAME =
55*b1cdbd2cSJim Jagielski "com.sun.star.deployment.PackageRegistryBackend";
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski typedef ::cppu::WeakComponentImplHelper1<
58*b1cdbd2cSJim Jagielski     css::deployment::XPackage > t_PackageBase;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski //==============================================================================
61*b1cdbd2cSJim Jagielski class Package : protected ::dp_misc::MutexHolder, public t_PackageBase
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski     PackageRegistryBackend * getMyBackend() const;
64*b1cdbd2cSJim Jagielski     void processPackage_impl(
65*b1cdbd2cSJim Jagielski         bool registerPackage,
66*b1cdbd2cSJim Jagielski         bool startup,
67*b1cdbd2cSJim Jagielski         css::uno::Reference<css::task::XAbortChannel> const & xAbortChannel,
68*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv );
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski protected:
71*b1cdbd2cSJim Jagielski     ::rtl::Reference<PackageRegistryBackend> m_myBackend;
72*b1cdbd2cSJim Jagielski     const ::rtl::OUString m_url;
73*b1cdbd2cSJim Jagielski     ::rtl::OUString m_name;
74*b1cdbd2cSJim Jagielski     ::rtl::OUString m_displayName;
75*b1cdbd2cSJim Jagielski     const css::uno::Reference<css::deployment::XPackageTypeInfo> m_xPackageType;
76*b1cdbd2cSJim Jagielski     const bool m_bRemoved;
77*b1cdbd2cSJim Jagielski     //Only set if m_bRemoved = true;
78*b1cdbd2cSJim Jagielski     const ::rtl::OUString m_identifier;
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski     void check() const;
81*b1cdbd2cSJim Jagielski     void fireModified();
82*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing();
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     void checkAborted(
85*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::dp_misc::AbortChannel > const & abortChannel );
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     // @@@ to be implemented by specific backend:
88*b1cdbd2cSJim Jagielski     virtual css::beans::Optional< css::beans::Ambiguous<sal_Bool> >
89*b1cdbd2cSJim Jagielski     isRegistered_(
90*b1cdbd2cSJim Jagielski         ::osl::ResettableMutexGuard & guard,
91*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::dp_misc::AbortChannel > const & abortChannel,
92*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
93*b1cdbd2cSJim Jagielski         = 0;
94*b1cdbd2cSJim Jagielski     virtual void processPackage_(
95*b1cdbd2cSJim Jagielski         ::osl::ResettableMutexGuard & guard,
96*b1cdbd2cSJim Jagielski         bool registerPackage,
97*b1cdbd2cSJim Jagielski         bool startup,
98*b1cdbd2cSJim Jagielski         ::rtl::Reference< ::dp_misc::AbortChannel > const & abortChannel,
99*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
100*b1cdbd2cSJim Jagielski         = 0;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     virtual ~Package();
103*b1cdbd2cSJim Jagielski     Package( ::rtl::Reference<PackageRegistryBackend> const & myBackend,
104*b1cdbd2cSJim Jagielski              ::rtl::OUString const & url,
105*b1cdbd2cSJim Jagielski              ::rtl::OUString const & name,
106*b1cdbd2cSJim Jagielski              ::rtl::OUString const & displayName,
107*b1cdbd2cSJim Jagielski              css::uno::Reference<css::deployment::XPackageTypeInfo> const &
108*b1cdbd2cSJim Jagielski              xPackageType,
109*b1cdbd2cSJim Jagielski              bool bRemoved,
110*b1cdbd2cSJim Jagielski              ::rtl::OUString const & identifier);
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski public:
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     class TypeInfo :
115*b1cdbd2cSJim Jagielski         public ::cppu::WeakImplHelper1<css::deployment::XPackageTypeInfo>
116*b1cdbd2cSJim Jagielski     {
117*b1cdbd2cSJim Jagielski         const ::rtl::OUString m_mediaType;
118*b1cdbd2cSJim Jagielski         const ::rtl::OUString m_fileFilter;
119*b1cdbd2cSJim Jagielski         const ::rtl::OUString m_shortDescr;
120*b1cdbd2cSJim Jagielski         const sal_uInt16 m_smallIcon, m_smallIcon_HC;
121*b1cdbd2cSJim Jagielski     public:
122*b1cdbd2cSJim Jagielski         virtual ~TypeInfo();
TypeInfo(::rtl::OUString const & mediaType,::rtl::OUString const & fileFilter,::rtl::OUString const & shortDescr,sal_uInt16 smallIcon,sal_uInt16 smallIcon_HC)123*b1cdbd2cSJim Jagielski         TypeInfo( ::rtl::OUString const & mediaType,
124*b1cdbd2cSJim Jagielski                   ::rtl::OUString const & fileFilter,
125*b1cdbd2cSJim Jagielski                   ::rtl::OUString const & shortDescr,
126*b1cdbd2cSJim Jagielski                   sal_uInt16 smallIcon, sal_uInt16 smallIcon_HC )
127*b1cdbd2cSJim Jagielski             : m_mediaType(mediaType), m_fileFilter(fileFilter),
128*b1cdbd2cSJim Jagielski               m_shortDescr(shortDescr),
129*b1cdbd2cSJim Jagielski               m_smallIcon(smallIcon), m_smallIcon_HC(smallIcon_HC)
130*b1cdbd2cSJim Jagielski             {}
131*b1cdbd2cSJim Jagielski         // XPackageTypeInfo
132*b1cdbd2cSJim Jagielski         virtual ::rtl::OUString SAL_CALL getMediaType()
133*b1cdbd2cSJim Jagielski             throw (css::uno::RuntimeException);
134*b1cdbd2cSJim Jagielski         virtual ::rtl::OUString SAL_CALL getDescription()
135*b1cdbd2cSJim Jagielski             throw (css::deployment::ExtensionRemovedException,
136*b1cdbd2cSJim Jagielski                    css::uno::RuntimeException);
137*b1cdbd2cSJim Jagielski         virtual ::rtl::OUString SAL_CALL getShortDescription()
138*b1cdbd2cSJim Jagielski             throw (css::deployment::ExtensionRemovedException,
139*b1cdbd2cSJim Jagielski                    css::uno::RuntimeException);
140*b1cdbd2cSJim Jagielski         virtual ::rtl::OUString SAL_CALL getFileFilter()
141*b1cdbd2cSJim Jagielski             throw (css::uno::RuntimeException);
142*b1cdbd2cSJim Jagielski         virtual css::uno::Any SAL_CALL getIcon( sal_Bool highContrast,
143*b1cdbd2cSJim Jagielski                                                 sal_Bool smallIcon )
144*b1cdbd2cSJim Jagielski             throw (css::uno::RuntimeException);
145*b1cdbd2cSJim Jagielski     };
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski     // XComponent
148*b1cdbd2cSJim Jagielski     virtual void SAL_CALL dispose() throw (css::uno::RuntimeException);
149*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addEventListener(
150*b1cdbd2cSJim Jagielski         css::uno::Reference<css::lang::XEventListener> const & xListener )
151*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
152*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeEventListener(
153*b1cdbd2cSJim Jagielski         css::uno::Reference<css::lang::XEventListener> const & xListener )
154*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     // XModifyBroadcaster
157*b1cdbd2cSJim Jagielski     virtual void SAL_CALL addModifyListener(
158*b1cdbd2cSJim Jagielski         css::uno::Reference<css::util::XModifyListener> const & xListener )
159*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
160*b1cdbd2cSJim Jagielski     virtual void SAL_CALL removeModifyListener(
161*b1cdbd2cSJim Jagielski         css::uno::Reference<css::util::XModifyListener> const & xListener )
162*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     // XPackage
165*b1cdbd2cSJim Jagielski     virtual css::uno::Reference<css::task::XAbortChannel> SAL_CALL
166*b1cdbd2cSJim Jagielski     createAbortChannel() throw (css::uno::RuntimeException);
167*b1cdbd2cSJim Jagielski     virtual css::beans::Optional< css::beans::Ambiguous<sal_Bool> >
168*b1cdbd2cSJim Jagielski     SAL_CALL isRegistered(
169*b1cdbd2cSJim Jagielski         css::uno::Reference<css::task::XAbortChannel> const & xAbortChannel,
170*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
171*b1cdbd2cSJim Jagielski         throw (css::deployment::DeploymentException,
172*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
173*b1cdbd2cSJim Jagielski                css::ucb::CommandAbortedException,
174*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski     virtual ::sal_Int32 SAL_CALL checkPrerequisites(
177*b1cdbd2cSJim Jagielski 		const css::uno::Reference< css::task::XAbortChannel >& xAbortChannel,
178*b1cdbd2cSJim Jagielski 		const css::uno::Reference< css::ucb::XCommandEnvironment >& xCmdEnv,
179*b1cdbd2cSJim Jagielski         sal_Bool noLicenseChecking)
180*b1cdbd2cSJim Jagielski 		throw (css::deployment::DeploymentException,
181*b1cdbd2cSJim Jagielski                css::deployment::ExtensionRemovedException,
182*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
183*b1cdbd2cSJim Jagielski                css::ucb::CommandAbortedException,
184*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL checkDependencies(
187*b1cdbd2cSJim Jagielski 		const css::uno::Reference< css::ucb::XCommandEnvironment >& xCmdEnv )
188*b1cdbd2cSJim Jagielski 		throw (css::deployment::DeploymentException,
189*b1cdbd2cSJim Jagielski                css::deployment::ExtensionRemovedException,
190*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
191*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski     virtual void SAL_CALL registerPackage(
194*b1cdbd2cSJim Jagielski         sal_Bool startup,
195*b1cdbd2cSJim Jagielski         css::uno::Reference<css::task::XAbortChannel> const & xAbortChannel,
196*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
197*b1cdbd2cSJim Jagielski         throw (css::deployment::DeploymentException,
198*b1cdbd2cSJim Jagielski                css::deployment::ExtensionRemovedException,
199*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
200*b1cdbd2cSJim Jagielski                css::ucb::CommandAbortedException,
201*b1cdbd2cSJim Jagielski                css::lang::IllegalArgumentException, css::uno::RuntimeException);
202*b1cdbd2cSJim Jagielski     virtual void SAL_CALL revokePackage(
203*b1cdbd2cSJim Jagielski         css::uno::Reference<css::task::XAbortChannel> const & xAbortChannel,
204*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
205*b1cdbd2cSJim Jagielski         throw (css::deployment::DeploymentException,
206*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
207*b1cdbd2cSJim Jagielski                css::ucb::CommandAbortedException,
208*b1cdbd2cSJim Jagielski                css::lang::IllegalArgumentException,
209*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
210*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL isBundle()
211*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
212*b1cdbd2cSJim Jagielski     virtual css::uno::Sequence< css::uno::Reference<css::deployment::XPackage> >
213*b1cdbd2cSJim Jagielski     SAL_CALL getBundle(
214*b1cdbd2cSJim Jagielski         css::uno::Reference<css::task::XAbortChannel> const & xAbortChannel,
215*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
216*b1cdbd2cSJim Jagielski         throw (css::deployment::DeploymentException,
217*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
218*b1cdbd2cSJim Jagielski                css::ucb::CommandAbortedException,
219*b1cdbd2cSJim Jagielski                css::lang::IllegalArgumentException,
220*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
221*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getName()
222*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
223*b1cdbd2cSJim Jagielski     virtual css::beans::Optional< ::rtl::OUString > SAL_CALL getIdentifier()
224*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
225*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getVersion()
226*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
227*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
228*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getURL()
229*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
230*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getDisplayName()
231*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
232*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
233*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getDescription()
234*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
235*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
236*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getLicenseText()
237*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
238*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
239*b1cdbd2cSJim Jagielski     virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL
240*b1cdbd2cSJim Jagielski     getUpdateInformationURLs()
241*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
242*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
243*b1cdbd2cSJim Jagielski     virtual css::beans::StringPair SAL_CALL getPublisherInfo()
244*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
245*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
246*b1cdbd2cSJim Jagielski     virtual css::uno::Reference< css::graphic::XGraphic > SAL_CALL
247*b1cdbd2cSJim Jagielski     getIcon( sal_Bool bHighContrast )
248*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
249*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
250*b1cdbd2cSJim Jagielski     virtual css::uno::Reference<css::deployment::XPackageTypeInfo> SAL_CALL
251*b1cdbd2cSJim Jagielski     getPackageType() throw (css::uno::RuntimeException);
252*b1cdbd2cSJim Jagielski     virtual void SAL_CALL exportTo(
253*b1cdbd2cSJim Jagielski         ::rtl::OUString const & destFolderURL,
254*b1cdbd2cSJim Jagielski         ::rtl::OUString const & newTitle,
255*b1cdbd2cSJim Jagielski         sal_Int32 nameClashAction,
256*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
257*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
258*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
259*b1cdbd2cSJim Jagielski                css::ucb::CommandAbortedException, css::uno::RuntimeException);
260*b1cdbd2cSJim Jagielski     virtual ::rtl::OUString SAL_CALL getRepositoryName()
261*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
262*b1cdbd2cSJim Jagielski     virtual css::beans::Optional< ::rtl::OUString > SAL_CALL getRegistrationDataURL()
263*b1cdbd2cSJim Jagielski         throw (css::deployment::ExtensionRemovedException,
264*b1cdbd2cSJim Jagielski                css::uno::RuntimeException);
265*b1cdbd2cSJim Jagielski     virtual sal_Bool SAL_CALL isRemoved()
266*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski };
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski typedef ::cppu::WeakComponentImplHelper2<
271*b1cdbd2cSJim Jagielski     css::lang::XEventListener,
272*b1cdbd2cSJim Jagielski     css::deployment::XPackageRegistry > t_BackendBase;
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski //==============================================================================
275*b1cdbd2cSJim Jagielski class PackageRegistryBackend
276*b1cdbd2cSJim Jagielski     : protected ::dp_misc::MutexHolder, public t_BackendBase
277*b1cdbd2cSJim Jagielski {
278*b1cdbd2cSJim Jagielski     //The map held originally WeakReferences. The map entries are removed in the disposing
279*b1cdbd2cSJim Jagielski     //function, which is called when the XPackages are destructed or they are
280*b1cdbd2cSJim Jagielski     //explicitely disposed. The latter happens, for example, when a extension is
281*b1cdbd2cSJim Jagielski     //removed (see dp_manager.cxx). However, because of how the help systems work, now
282*b1cdbd2cSJim Jagielski     // XPackageManager::getDeployedPackages is called often. This results in a lot
283*b1cdbd2cSJim Jagielski     //of bindPackage calls which are costly. Therefore we keep hard references in
284*b1cdbd2cSJim Jagielski     //the map now.
285*b1cdbd2cSJim Jagielski     typedef ::std::hash_map<
286*b1cdbd2cSJim Jagielski         ::rtl::OUString, css::uno::Reference<css::deployment::XPackage>,
287*b1cdbd2cSJim Jagielski         ::rtl::OUStringHash > t_string2ref;
288*b1cdbd2cSJim Jagielski     t_string2ref m_bound;
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski protected:
291*b1cdbd2cSJim Jagielski     ::rtl::OUString m_cachePath;
292*b1cdbd2cSJim Jagielski     css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski     ::rtl::OUString m_context;
295*b1cdbd2cSJim Jagielski     // currently only for library containers:
296*b1cdbd2cSJim Jagielski     enum {
297*b1cdbd2cSJim Jagielski         CONTEXT_UNKNOWN,
298*b1cdbd2cSJim Jagielski         CONTEXT_USER, CONTEXT_SHARED,CONTEXT_BUNDLED, CONTEXT_TMP, CONTEXT_BUNDLED_PREREG,
299*b1cdbd2cSJim Jagielski         CONTEXT_DOCUMENT
300*b1cdbd2cSJim Jagielski     } m_eContext;
301*b1cdbd2cSJim Jagielski     bool m_readOnly;
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski     struct StrCannotDetectMediaType : public ::dp_misc::StaticResourceString<
304*b1cdbd2cSJim Jagielski         StrCannotDetectMediaType, RID_STR_CANNOT_DETECT_MEDIA_TYPE> {};
305*b1cdbd2cSJim Jagielski     struct StrUnsupportedMediaType : public ::dp_misc::StaticResourceString<
306*b1cdbd2cSJim Jagielski         StrUnsupportedMediaType, RID_STR_UNSUPPORTED_MEDIA_TYPE> {};
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski     // @@@ to be implemented by specific backend:
309*b1cdbd2cSJim Jagielski     virtual css::uno::Reference<css::deployment::XPackage> bindPackage_(
310*b1cdbd2cSJim Jagielski         ::rtl::OUString const & url, ::rtl::OUString const & mediaType,
311*b1cdbd2cSJim Jagielski         sal_Bool bRemoved, ::rtl::OUString const & identifier,
312*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
313*b1cdbd2cSJim Jagielski         = 0;
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski     void check();
316*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing();
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski     virtual ~PackageRegistryBackend();
319*b1cdbd2cSJim Jagielski     PackageRegistryBackend(
320*b1cdbd2cSJim Jagielski         css::uno::Sequence<css::uno::Any> const & args,
321*b1cdbd2cSJim Jagielski         css::uno::Reference<css::uno::XComponentContext> const & xContext );
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski     /* creates a folder with a unique name.
324*b1cdbd2cSJim Jagielski        If url is empty then it is created in the the backend folder, otherwise
325*b1cdbd2cSJim Jagielski        at a location relative to that folder specified by url.
326*b1cdbd2cSJim Jagielski     */
327*b1cdbd2cSJim Jagielski     ::rtl::OUString createFolder(
328*b1cdbd2cSJim Jagielski         ::rtl::OUString const & relUrl,
329*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv);
330*b1cdbd2cSJim Jagielski     /* deletes folders and files.
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski        All folder all files which end with ".tmp" or ".tmp_" and which are
333*b1cdbd2cSJim Jagielski        not used are deleted.
334*b1cdbd2cSJim Jagielski      */
335*b1cdbd2cSJim Jagielski     void deleteUnusedFolders(
336*b1cdbd2cSJim Jagielski         ::rtl::OUString const & relUrl,
337*b1cdbd2cSJim Jagielski         ::std::list< ::rtl::OUString> const & usedFolders);
338*b1cdbd2cSJim Jagielski     /* deletes one folder with a "temporary" name and the corresponding
339*b1cdbd2cSJim Jagielski        tmp file, which was used to derive the folder name.
340*b1cdbd2cSJim Jagielski     */
341*b1cdbd2cSJim Jagielski     static void deleteTempFolder(
342*b1cdbd2cSJim Jagielski         ::rtl::OUString const & folderUrl);
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski     ::rtl::OUString getSharedRegistrationDataURL(
345*b1cdbd2cSJim Jagielski         css::uno::Reference<css::deployment::XPackage> const & extension,
346*b1cdbd2cSJim Jagielski         css::uno::Reference<css::deployment::XPackage> const & item);
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     /* The backends must implement this function, which is called
349*b1cdbd2cSJim Jagielski        from XPackageRegistry::packageRemoved (also implemented here).
350*b1cdbd2cSJim Jagielski        This ensure that the backends clean up their registration data
351*b1cdbd2cSJim Jagielski        when an extension was removed.
352*b1cdbd2cSJim Jagielski     */
353*b1cdbd2cSJim Jagielski //    virtual void deleteDbEntry( ::rtl::OUString const & url) = 0;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski public:
358*b1cdbd2cSJim Jagielski     struct StrRegisteringPackage : public ::dp_misc::StaticResourceString<
359*b1cdbd2cSJim Jagielski         StrRegisteringPackage, RID_STR_REGISTERING_PACKAGE> {};
360*b1cdbd2cSJim Jagielski     struct StrRevokingPackage : public ::dp_misc::StaticResourceString<
361*b1cdbd2cSJim Jagielski         StrRevokingPackage, RID_STR_REVOKING_PACKAGE> {};
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     inline css::uno::Reference<css::uno::XComponentContext> const &
getComponentContext() const364*b1cdbd2cSJim Jagielski     getComponentContext() const { return m_xComponentContext; }
365*b1cdbd2cSJim Jagielski 
getCachePath() const366*b1cdbd2cSJim Jagielski     inline ::rtl::OUString const & getCachePath() const { return m_cachePath; }
transientMode() const367*b1cdbd2cSJim Jagielski     inline bool transientMode() const { return m_cachePath.getLength() == 0; }
368*b1cdbd2cSJim Jagielski 
getContext() const369*b1cdbd2cSJim Jagielski     inline ::rtl::OUString getContext() const {return m_context; }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski     // XEventListener
372*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing( css::lang::EventObject const & evt )
373*b1cdbd2cSJim Jagielski         throw (css::uno::RuntimeException);
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski     // XPackageRegistry
376*b1cdbd2cSJim Jagielski     virtual css::uno::Reference<css::deployment::XPackage> SAL_CALL bindPackage(
377*b1cdbd2cSJim Jagielski         ::rtl::OUString const & url, ::rtl::OUString const & mediaType,
378*b1cdbd2cSJim Jagielski         sal_Bool bRemoved, ::rtl::OUString const & identifier,
379*b1cdbd2cSJim Jagielski         css::uno::Reference<css::ucb::XCommandEnvironment> const & xCmdEnv )
380*b1cdbd2cSJim Jagielski         throw (css::deployment::DeploymentException,
381*b1cdbd2cSJim Jagielski                css::deployment::InvalidRemovedParameterException,
382*b1cdbd2cSJim Jagielski                css::ucb::CommandFailedException,
383*b1cdbd2cSJim Jagielski                css::lang::IllegalArgumentException, css::uno::RuntimeException);
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski //     virtual void SAL_CALL packageRemoved(
386*b1cdbd2cSJim Jagielski //         ::rtl::OUString const & url, ::rtl::OUString const & mediaType)
387*b1cdbd2cSJim Jagielski //         throw (css::deployment::DeploymentException,
388*b1cdbd2cSJim Jagielski //                css::uno::RuntimeException);
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski };
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski }
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski #endif
396*b1cdbd2cSJim Jagielski 
397