xref: /trunk/main/desktop/source/deployment/manager/dp_commandenvironments.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_desktop.hxx"
26 
27 #include "com/sun/star/deployment/VersionException.hpp"
28 #include "com/sun/star/deployment/LicenseException.hpp"
29 #include "com/sun/star/deployment/InstallException.hpp"
30 #include "com/sun/star/deployment/DependencyException.hpp"
31 #include "com/sun/star/deployment/PlatformException.hpp"
32 #include "com/sun/star/task/XInteractionApprove.hpp"
33 #include "com/sun/star/task/XInteractionAbort.hpp"
34 #include "com/sun/star/task/XInteractionHandler.hpp"
35 #include "com/sun/star/ucb/XCommandEnvironment.hpp"
36 #include "com/sun/star/uno/XComponentContext.hpp"
37 #include "dp_commandenvironments.hxx"
38 
39 namespace deployment = com::sun::star::deployment;
40 namespace lang  = com::sun::star::lang;
41 namespace task = com::sun::star::task;
42 namespace ucb = com::sun::star::ucb;
43 namespace uno = com::sun::star::uno;
44 namespace css = com::sun::star;
45 
46 #define OUSTR(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
47 
48 using ::com::sun::star::uno::Reference;
49 using ::rtl::OUString;
50 
51 namespace dp_manager {
52 
BaseCommandEnv()53 BaseCommandEnv::BaseCommandEnv()
54 {
55 }
56 
BaseCommandEnv(Reference<task::XInteractionHandler> const & handler)57 BaseCommandEnv::BaseCommandEnv(
58     Reference< task::XInteractionHandler> const & handler)
59     : m_forwardHandler(handler)
60 {
61 }
62 
~BaseCommandEnv()63 BaseCommandEnv::~BaseCommandEnv()
64 {
65 }
66 // XCommandEnvironment
67 //______________________________________________________________________________
getInteractionHandler()68 Reference<task::XInteractionHandler> BaseCommandEnv::getInteractionHandler()
69 {
70     return this;
71 }
72 
73 //______________________________________________________________________________
getProgressHandler()74 Reference<ucb::XProgressHandler> BaseCommandEnv::getProgressHandler()
75 {
76     return this;
77 }
78 
handle(Reference<task::XInteractionRequest> const &)79 void BaseCommandEnv::handle(
80     Reference< task::XInteractionRequest> const & /*xRequest*/ )
81 {
82 }
83 
handle_(bool approve,bool abort,Reference<task::XInteractionRequest> const & xRequest)84 void BaseCommandEnv::handle_(bool approve, bool abort,
85                              Reference< task::XInteractionRequest> const & xRequest )
86 {
87     if (approve == false && abort == false)
88     {
89         //not handled so far -> forwarding
90         if (m_forwardHandler.is())
91             m_forwardHandler->handle(xRequest);
92         else
93             return; //cannot handle
94     }
95     else
96     {
97         // select:
98         uno::Sequence< Reference< task::XInteractionContinuation > > conts(
99             xRequest->getContinuations() );
100         Reference< task::XInteractionContinuation > const * pConts =
101             conts.getConstArray();
102         sal_Int32 len = conts.getLength();
103         for ( sal_Int32 pos = 0; pos < len; ++pos )
104         {
105             if (approve) {
106                 Reference< task::XInteractionApprove > xInteractionApprove(
107                     pConts[ pos ], uno::UNO_QUERY );
108                 if (xInteractionApprove.is()) {
109                     xInteractionApprove->select();
110                     // don't query again for ongoing continuations:
111                     approve = false;
112                 }
113             }
114             else if (abort) {
115                 Reference< task::XInteractionAbort > xInteractionAbort(
116                     pConts[ pos ], uno::UNO_QUERY );
117                 if (xInteractionAbort.is()) {
118                     xInteractionAbort->select();
119                     // don't query again for ongoing continuations:
120                     abort = false;
121                 }
122             }
123         }
124     }
125 
126 }
127 
128 // XProgressHandler
push(uno::Any const &)129 void BaseCommandEnv::push( uno::Any const & /*Status*/ )
130 {
131 }
132 
133 
update(uno::Any const &)134 void BaseCommandEnv::update( uno::Any const & /*Status */)
135 {
136 }
137 
pop()138 void BaseCommandEnv::pop()
139 {
140 }
141 //==============================================================================
142 
TmpRepositoryCommandEnv()143 TmpRepositoryCommandEnv::TmpRepositoryCommandEnv()
144 {
145 }
146 
TmpRepositoryCommandEnv(css::uno::Reference<css::task::XInteractionHandler> const & handler)147 TmpRepositoryCommandEnv::TmpRepositoryCommandEnv(
148     css::uno::Reference< css::task::XInteractionHandler> const & handler):
149     BaseCommandEnv(handler)
150 {
151 }
152 // XInteractionHandler
handle(Reference<task::XInteractionRequest> const & xRequest)153 void TmpRepositoryCommandEnv::handle(
154     Reference< task::XInteractionRequest> const & xRequest )
155 {
156     uno::Any request( xRequest->getRequest() );
157     OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION );
158 
159     deployment::VersionException verExc;
160     deployment::LicenseException licExc;
161     deployment::InstallException instExc;
162 
163     bool approve = false;
164     bool abort = false;
165 
166     if ((request >>= verExc)
167         || (request >>= licExc)
168         || (request >>= instExc))
169     {
170         approve = true;
171     }
172 
173     handle_(approve, abort, xRequest);
174 }
175 //================================================================================
176 
LicenseCommandEnv(css::uno::Reference<css::task::XInteractionHandler> const & handler,bool bSuppressLicense,OUString const & repository)177 LicenseCommandEnv::LicenseCommandEnv(
178     css::uno::Reference< css::task::XInteractionHandler> const & handler,
179     bool bSuppressLicense,
180     OUString const & repository):
181     BaseCommandEnv(handler), m_repository(repository),
182     m_bSuppressLicense(bSuppressLicense)
183 {
184 }
185 // XInteractionHandler
handle(Reference<task::XInteractionRequest> const & xRequest)186 void LicenseCommandEnv::handle(
187     Reference< task::XInteractionRequest> const & xRequest )
188 {
189     uno::Any request( xRequest->getRequest() );
190     OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION );
191 
192 
193     deployment::LicenseException licExc;
194 
195     bool approve = false;
196     bool abort = false;
197 
198     if (request >>= licExc)
199     {
200         if (m_bSuppressLicense
201             || m_repository.equals(OUSTR("bundled"))
202             || licExc.AcceptBy.equals(OUSTR("admin")))
203         {
204             //always approve in bundled case, because we do not support
205             //showing licenses anyway.
206             //The "admin" already accepted the license when installing the
207             // shared extension
208             approve = true;
209         }
210     }
211 
212     handle_(approve, abort, xRequest);
213 }
214 
215 //================================================================================
216 //================================================================================
217 
NoLicenseCommandEnv(css::uno::Reference<css::task::XInteractionHandler> const & handler)218 NoLicenseCommandEnv::NoLicenseCommandEnv(
219     css::uno::Reference< css::task::XInteractionHandler> const & handler):
220     BaseCommandEnv(handler)
221 {
222 }
223 // XInteractionHandler
handle(Reference<task::XInteractionRequest> const & xRequest)224 void NoLicenseCommandEnv::handle(
225     Reference< task::XInteractionRequest> const & xRequest )
226 {
227     uno::Any request( xRequest->getRequest() );
228     OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION );
229 
230 
231     deployment::LicenseException licExc;
232 
233     bool approve = false;
234     bool abort = false;
235 
236     if (request >>= licExc)
237     {
238         approve = true;
239     }
240     handle_(approve, abort, xRequest);
241 }
242 
243 // SilentCheckPrerequisitesCommandEnv::SilentCheckPrerequisitesCommandEnv(
244 //     css::uno::Reference< css::task::XInteractionHandler> const & handler):
245 //     BaseCommandEnv(handler)
246 // {
247 // }
SilentCheckPrerequisitesCommandEnv()248 SilentCheckPrerequisitesCommandEnv::SilentCheckPrerequisitesCommandEnv()
249 {
250 }
251 
handle(Reference<task::XInteractionRequest> const & xRequest)252 void SilentCheckPrerequisitesCommandEnv::handle(
253        Reference< task::XInteractionRequest> const & xRequest )
254 {
255     uno::Any request( xRequest->getRequest() );
256     OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION );
257 
258     deployment::LicenseException licExc;
259     deployment::PlatformException platformExc;
260     deployment::DependencyException depExc;
261     bool approve = false;
262     bool abort = false;
263 
264     if (request >>= licExc)
265     {
266         approve = true;
267         handle_(approve, abort, xRequest);
268     }
269     else if ((request >>= platformExc)
270              || (request >>= depExc))
271     {
272         m_Exception = request;
273     }
274     else
275     {
276         m_UnknownException = request;
277     }
278 }
279 // NoExceptionCommandEnv::NoExceptionCommandEnv(
280 //     css::uno::Reference< css::task::XInteractionHandler> const & handler,
281 //     css::uno::Type const & type):
282 //     BaseCommandEnv(handler),
283 //     m_type(type)
284 // {
285 // }
286 // // XInteractionHandler
287 // void NoExceptionCommandEnv::handle(
288 //     Reference< task::XInteractionRequest> const & xRequest )
289 //     throw (uno::RuntimeException)
290 // {
291 //     uno::Any request( xRequest->getRequest() );
292 //     OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION );
293 
294 
295 //  deployment::LicenseException licExc;
296 
297 //     bool approve = false;
298 //     bool abort = false;
299 
300 //     if (request.getValueType() == m_type)
301 //     {
302 //         approve = true;
303 //     }
304 //     handle_(approve, abort, xRequest);
305 // }
306 
307 
308 
309 } // namespace dp_manager
310