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 "dp_interact.h" 28 #include "cppuhelper/exc_hlp.hxx" 29 #include "cppuhelper/implbase1.hxx" 30 #include "com/sun/star/task/XInteractionAbort.hpp" 31 32 33 using namespace ::com::sun::star; 34 using namespace ::com::sun::star::uno; 35 using namespace ::com::sun::star::ucb; 36 using ::rtl::OUString; 37 38 namespace dp_misc { 39 namespace { 40 41 //============================================================================== 42 class InteractionContinuationImpl : public ::cppu::OWeakObject, 43 public task::XInteractionContinuation 44 { 45 const Type m_type; 46 bool * m_pselect; 47 48 public: 49 inline InteractionContinuationImpl( Type const & type, bool * pselect ) 50 : m_type( type ), 51 m_pselect( pselect ) 52 { OSL_ASSERT( 53 ::getCppuType( 54 static_cast< Reference<task::XInteractionContinuation> 55 const *>(0) ).isAssignableFrom(m_type) ); } 56 57 // XInterface 58 virtual void SAL_CALL acquire() throw (); 59 virtual void SAL_CALL release() throw (); 60 virtual Any SAL_CALL queryInterface( Type const & type ) 61 throw (RuntimeException); 62 63 // XInteractionContinuation 64 virtual void SAL_CALL select() throw (RuntimeException); 65 }; 66 67 // XInterface 68 //______________________________________________________________________________ 69 void InteractionContinuationImpl::acquire() throw () 70 { 71 OWeakObject::acquire(); 72 } 73 74 //______________________________________________________________________________ 75 void InteractionContinuationImpl::release() throw () 76 { 77 OWeakObject::release(); 78 } 79 80 //______________________________________________________________________________ 81 Any InteractionContinuationImpl::queryInterface( Type const & type ) 82 throw (RuntimeException) 83 { 84 if (type.isAssignableFrom( m_type )) { 85 Reference<task::XInteractionContinuation> xThis(this); 86 return Any( &xThis, type ); 87 } 88 else 89 return OWeakObject::queryInterface(type); 90 } 91 92 // XInteractionContinuation 93 //______________________________________________________________________________ 94 void InteractionContinuationImpl::select() throw (RuntimeException) 95 { 96 *m_pselect = true; 97 } 98 99 //============================================================================== 100 class InteractionRequest : 101 public ::cppu::WeakImplHelper1<task::XInteractionRequest> 102 { 103 Any m_request; 104 Sequence< Reference<task::XInteractionContinuation> > m_conts; 105 106 public: 107 inline InteractionRequest( 108 Any const & request, 109 Sequence< Reference<task::XInteractionContinuation> > const & conts ) 110 : m_request( request ), 111 m_conts( conts ) 112 {} 113 114 // XInteractionRequest 115 virtual Any SAL_CALL getRequest() 116 throw (RuntimeException); 117 virtual Sequence< Reference<task::XInteractionContinuation> > 118 SAL_CALL getContinuations() throw (RuntimeException); 119 }; 120 121 // XInteractionRequest 122 //______________________________________________________________________________ 123 Any InteractionRequest::getRequest() throw (RuntimeException) 124 { 125 return m_request; 126 } 127 128 //______________________________________________________________________________ 129 Sequence< Reference< task::XInteractionContinuation > > 130 InteractionRequest::getContinuations() throw (RuntimeException) 131 { 132 return m_conts; 133 } 134 135 } // anon namespace 136 137 //============================================================================== 138 bool interactContinuation( Any const & request, 139 Type const & continuation, 140 Reference<XCommandEnvironment> const & xCmdEnv, 141 bool * pcont, bool * pabort ) 142 { 143 OSL_ASSERT( 144 task::XInteractionContinuation::static_type().isAssignableFrom( 145 continuation ) ); 146 if (xCmdEnv.is()) { 147 Reference<task::XInteractionHandler> xInteractionHandler( 148 xCmdEnv->getInteractionHandler() ); 149 if (xInteractionHandler.is()) { 150 bool cont = false; 151 bool abort = false; 152 Sequence< Reference<task::XInteractionContinuation> > conts( 2 ); 153 conts[ 0 ] = new InteractionContinuationImpl( 154 continuation, &cont ); 155 conts[ 1 ] = new InteractionContinuationImpl( 156 task::XInteractionAbort::static_type(), &abort ); 157 xInteractionHandler->handle( 158 new InteractionRequest( request, conts ) ); 159 if (cont || abort) { 160 if (pcont != 0) 161 *pcont = cont; 162 if (pabort != 0) 163 *pabort = abort; 164 return true; 165 } 166 } 167 } 168 return false; 169 } 170 171 // XAbortChannel 172 //______________________________________________________________________________ 173 void AbortChannel::sendAbort() throw (RuntimeException) 174 { 175 m_aborted = true; 176 if (m_xNext.is()) 177 m_xNext->sendAbort(); 178 } 179 180 } // dp_misc 181 182