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 53 BaseCommandEnv::BaseCommandEnv() 54 { 55 } 56 57 BaseCommandEnv::BaseCommandEnv( 58 Reference< task::XInteractionHandler> const & handler) 59 : m_forwardHandler(handler) 60 { 61 } 62 63 BaseCommandEnv::~BaseCommandEnv() 64 { 65 } 66 // XCommandEnvironment 67 //______________________________________________________________________________ 68 Reference<task::XInteractionHandler> BaseCommandEnv::getInteractionHandler() 69 throw (uno::RuntimeException) 70 { 71 return this; 72 } 73 74 //______________________________________________________________________________ 75 Reference<ucb::XProgressHandler> BaseCommandEnv::getProgressHandler() 76 throw (uno::RuntimeException) 77 { 78 return this; 79 } 80 81 void BaseCommandEnv::handle( 82 Reference< task::XInteractionRequest> const & /*xRequest*/ ) 83 throw (uno::RuntimeException) 84 { 85 } 86 87 void BaseCommandEnv::handle_(bool approve, bool abort, 88 Reference< task::XInteractionRequest> const & xRequest ) 89 { 90 if (approve == false && abort == false) 91 { 92 //not handled so far -> forwarding 93 if (m_forwardHandler.is()) 94 m_forwardHandler->handle(xRequest); 95 else 96 return; //cannot handle 97 } 98 else 99 { 100 // select: 101 uno::Sequence< Reference< task::XInteractionContinuation > > conts( 102 xRequest->getContinuations() ); 103 Reference< task::XInteractionContinuation > const * pConts = 104 conts.getConstArray(); 105 sal_Int32 len = conts.getLength(); 106 for ( sal_Int32 pos = 0; pos < len; ++pos ) 107 { 108 if (approve) { 109 Reference< task::XInteractionApprove > xInteractionApprove( 110 pConts[ pos ], uno::UNO_QUERY ); 111 if (xInteractionApprove.is()) { 112 xInteractionApprove->select(); 113 // don't query again for ongoing continuations: 114 approve = false; 115 } 116 } 117 else if (abort) { 118 Reference< task::XInteractionAbort > xInteractionAbort( 119 pConts[ pos ], uno::UNO_QUERY ); 120 if (xInteractionAbort.is()) { 121 xInteractionAbort->select(); 122 // don't query again for ongoing continuations: 123 abort = false; 124 } 125 } 126 } 127 } 128 129 } 130 131 // XProgressHandler 132 void BaseCommandEnv::push( uno::Any const & /*Status*/ ) 133 throw (uno::RuntimeException) 134 { 135 } 136 137 138 void BaseCommandEnv::update( uno::Any const & /*Status */) 139 throw (uno::RuntimeException) 140 { 141 } 142 143 void BaseCommandEnv::pop() throw (uno::RuntimeException) 144 { 145 } 146 //============================================================================== 147 148 TmpRepositoryCommandEnv::TmpRepositoryCommandEnv() 149 { 150 } 151 152 TmpRepositoryCommandEnv::TmpRepositoryCommandEnv( 153 css::uno::Reference< css::task::XInteractionHandler> const & handler): 154 BaseCommandEnv(handler) 155 { 156 } 157 // XInteractionHandler 158 void TmpRepositoryCommandEnv::handle( 159 Reference< task::XInteractionRequest> const & xRequest ) 160 throw (uno::RuntimeException) 161 { 162 uno::Any request( xRequest->getRequest() ); 163 OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION ); 164 165 deployment::VersionException verExc; 166 deployment::LicenseException licExc; 167 deployment::InstallException instExc; 168 169 bool approve = false; 170 bool abort = false; 171 172 if ((request >>= verExc) 173 || (request >>= licExc) 174 || (request >>= instExc)) 175 { 176 approve = true; 177 } 178 179 handle_(approve, abort, xRequest); 180 } 181 //================================================================================ 182 183 LicenseCommandEnv::LicenseCommandEnv( 184 css::uno::Reference< css::task::XInteractionHandler> const & handler, 185 bool bSuppressLicense, 186 OUString const & repository): 187 BaseCommandEnv(handler), m_repository(repository), 188 m_bSuppressLicense(bSuppressLicense) 189 { 190 } 191 // XInteractionHandler 192 void LicenseCommandEnv::handle( 193 Reference< task::XInteractionRequest> const & xRequest ) 194 throw (uno::RuntimeException) 195 { 196 uno::Any request( xRequest->getRequest() ); 197 OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION ); 198 199 200 deployment::LicenseException licExc; 201 202 bool approve = false; 203 bool abort = false; 204 205 if (request >>= licExc) 206 { 207 if (m_bSuppressLicense 208 || m_repository.equals(OUSTR("bundled")) 209 || licExc.AcceptBy.equals(OUSTR("admin"))) 210 { 211 //always approve in bundled case, because we do not support 212 //showing licenses anyway. 213 //The "admin" already accepted the license when installing the 214 // shared extension 215 approve = true; 216 } 217 } 218 219 handle_(approve, abort, xRequest); 220 } 221 222 //================================================================================ 223 //================================================================================ 224 225 NoLicenseCommandEnv::NoLicenseCommandEnv( 226 css::uno::Reference< css::task::XInteractionHandler> const & handler): 227 BaseCommandEnv(handler) 228 { 229 } 230 // XInteractionHandler 231 void NoLicenseCommandEnv::handle( 232 Reference< task::XInteractionRequest> const & xRequest ) 233 throw (uno::RuntimeException) 234 { 235 uno::Any request( xRequest->getRequest() ); 236 OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION ); 237 238 239 deployment::LicenseException licExc; 240 241 bool approve = false; 242 bool abort = false; 243 244 if (request >>= licExc) 245 { 246 approve = true; 247 } 248 handle_(approve, abort, xRequest); 249 } 250 251 // SilentCheckPrerequisitesCommandEnv::SilentCheckPrerequisitesCommandEnv( 252 // css::uno::Reference< css::task::XInteractionHandler> const & handler): 253 // BaseCommandEnv(handler) 254 // { 255 // } 256 SilentCheckPrerequisitesCommandEnv::SilentCheckPrerequisitesCommandEnv() 257 { 258 } 259 260 void SilentCheckPrerequisitesCommandEnv::handle( 261 Reference< task::XInteractionRequest> const & xRequest ) 262 throw (uno::RuntimeException) 263 { 264 uno::Any request( xRequest->getRequest() ); 265 OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION ); 266 267 deployment::LicenseException licExc; 268 deployment::PlatformException platformExc; 269 deployment::DependencyException depExc; 270 bool approve = false; 271 bool abort = false; 272 273 if (request >>= licExc) 274 { 275 approve = true; 276 handle_(approve, abort, xRequest); 277 } 278 else if ((request >>= platformExc) 279 || (request >>= depExc)) 280 { 281 m_Exception = request; 282 } 283 else 284 { 285 m_UnknownException = request; 286 } 287 } 288 // NoExceptionCommandEnv::NoExceptionCommandEnv( 289 // css::uno::Reference< css::task::XInteractionHandler> const & handler, 290 // css::uno::Type const & type): 291 // BaseCommandEnv(handler), 292 // m_type(type) 293 // { 294 // } 295 // // XInteractionHandler 296 // void NoExceptionCommandEnv::handle( 297 // Reference< task::XInteractionRequest> const & xRequest ) 298 // throw (uno::RuntimeException) 299 // { 300 // uno::Any request( xRequest->getRequest() ); 301 // OSL_ASSERT( request.getValueTypeClass() == uno::TypeClass_EXCEPTION ); 302 303 304 // deployment::LicenseException licExc; 305 306 // bool approve = false; 307 // bool abort = false; 308 309 // if (request.getValueType() == m_type) 310 // { 311 // approve = true; 312 // } 313 // handle_(approve, abort, xRequest); 314 // } 315 316 317 318 } // namespace dp_manager 319 320 321