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 #ifndef __FRAMEWORK_INTERACTION_PREVENTDUPLICATEINTERACTION_HXX_ 25 #define __FRAMEWORK_INTERACTION_PREVENTDUPLICATEINTERACTION_HXX_ 26 27 #include <framework/fwedllapi.h> 28 //_________________________________________________________________________________________________________________ 29 // my own includes 30 //_________________________________________________________________________________________________________________ 31 32 #include <vector> 33 34 //_________________________________________________________________________________________________________________ 35 // interface includes 36 //_________________________________________________________________________________________________________________ 37 #include <com/sun/star/task/XInteractionHandler2.hpp> 38 #include <com/sun/star/task/XInteractionRequest.hpp> 39 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 40 41 //_________________________________________________________________________________________________________________ 42 // other includes 43 //_________________________________________________________________________________________________________________ 44 #include <cppuhelper/implbase1.hxx> 45 46 //_________________________________________________________________________________________________________________ 47 // namespace 48 //_________________________________________________________________________________________________________________ 49 50 namespace framework{ 51 52 #ifdef css 53 #error "Conflict during define of namespace alias ..." 54 #else 55 #define css ::com::sun::star 56 #endif 57 58 //_________________________________________________________________________________________________________________ 59 // exported const 60 //_________________________________________________________________________________________________________________ 61 62 //_________________________________________________________________________________________________________________ 63 // exported definitions 64 //_________________________________________________________________________________________________________________ 65 66 /** 67 @short Prevent us from showing the same interaction more then once during 68 the same transaction. 69 70 @descr Every interaction provided to this helper will be safed ... handled by the internal 71 used UUIInteractionHandler (!) and never be handled a second time! 72 73 On the other side there exists some interactions, which allow a retry. 74 So this helper allow to set a list of interactions combined with a retry value. 75 */ 76 struct ThreadHelpBase2 77 { 78 public: 79 mutable ::osl::Mutex m_aLock; 80 }; 81 82 class FWE_DLLPUBLIC PreventDuplicateInteraction : private ThreadHelpBase2 83 ,public ::cppu::WeakImplHelper1< css::task::XInteractionHandler2 > 84 { 85 //_____________________________________ 86 // structs, types etcp. 87 public: 88 89 struct InteractionInfo 90 { 91 public: 92 /// describe the interaction. 93 css::uno::Type m_aInteraction; 94 /// after max count was reached this interaction will be blocked. 95 sal_Int32 m_nMaxCount; 96 /// count how often this interaction was called. 97 sal_Int32 m_nCallCount; 98 /** hold the last intercepted request (matching the set interaction type) alive 99 so it can be used for further checks */ 100 css::uno::Reference< css::task::XInteractionRequest > m_xRequest; 101 102 public: 103 InteractionInfoframework::PreventDuplicateInteraction::InteractionInfo104 InteractionInfo(const css::uno::Type& aInteraction, 105 sal_Int32 nMaxCount ) 106 : m_aInteraction(aInteraction) 107 , m_nMaxCount (nMaxCount ) 108 , m_nCallCount (0 ) 109 {} 110 InteractionInfoframework::PreventDuplicateInteraction::InteractionInfo111 InteractionInfo(const InteractionInfo& aCopy) 112 : m_aInteraction(aCopy.m_aInteraction) 113 , m_nMaxCount (aCopy.m_nMaxCount ) 114 , m_nCallCount (aCopy.m_nCallCount ) 115 , m_xRequest (aCopy.m_xRequest ) 116 {} 117 }; 118 119 typedef ::std::vector< InteractionInfo > InteractionList; 120 121 //_____________________________________ 122 // member 123 private: 124 125 /// Used to create needed uno services at runtime. 126 css::uno::Reference< css::lang::XMultiServiceFactory > m_xSMGR; 127 128 /** The outside interaction handler, which is used to handle every incoming interaction, 129 if it's not blocked. */ 130 css::uno::Reference< css::task::XInteractionHandler > m_xHandler; 131 132 /** This list describe which and how incoming interactions must be handled. 133 Further it contains all collected informations after this interaction 134 object was used.*/ 135 InteractionList m_lInteractionRules; 136 137 //_____________________________________ 138 // uno interface 139 public: 140 141 //_________________________________ 142 /** 143 @interface XInteractionHandler 144 @short called from outside to handle a problem 145 @descr We filter the incoming interactions. some of them 146 will be forwarded to the generic UI interaction handler. 147 So we must not implement it twice. Some other ones 148 will be aborted only. 149 150 @threadsafe yes 151 */ 152 virtual void SAL_CALL handle(const css::uno::Reference< css::task::XInteractionRequest >& xRequest) 153 throw(css::uno::RuntimeException); 154 155 //_________________________________ 156 /** 157 @interface XInteractionHandler2 158 @short called from outside to handle a problem 159 @descr We filter the incoming interactions. some of them 160 will be forwarded to the generic UI interaction handler. 161 So we must not implement it twice. Some other ones 162 will be aborted only. 163 164 @threadsafe yes 165 */ 166 virtual ::sal_Bool SAL_CALL handleInteractionRequest( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionRequest >& xRequest ) 167 throw (::com::sun::star::uno::RuntimeException); 168 169 //_________________________________ 170 /** 171 @interface XInterface 172 @short called to query another interface of the component 173 @descr Will allow to query for XInteractionHandler2 if and only if m_xHandler supports this interface, too. 174 175 @threadsafe yes 176 */ 177 virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) 178 throw (::com::sun::star::uno::RuntimeException); 179 //_____________________________________ 180 // c++ interface 181 public: 182 183 //_________________________________ 184 /** 185 @short ctor to guarantee right initialized instances of this class 186 @descr It uses the given uno service manager to create the global 187 generic UI interaction handler for later internal using. 188 189 @param xSMGR 190 uno service manager for creating services internally 191 192 @threadsafe not necessary 193 */ 194 PreventDuplicateInteraction(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR); 195 196 //_________________________________ 197 /** 198 @short dtor to free used memory. 199 */ 200 virtual ~PreventDuplicateInteraction(); 201 202 //_________________________________ 203 /** 204 @short set the outside interaction handler, which must be used internally 205 if the interaction will not be blocked by the set list of rules. 206 207 @note This overwrites the settings of e.g. useDefaultUUIHandler()! 208 209 @param xHandler 210 the new interaction handler 211 */ 212 virtual void setHandler(const css::uno::Reference< css::task::XInteractionHandler >& xHandler); 213 214 //_________________________________ 215 /** 216 @short instead of setting an outside interaction handler, this method 217 make sure the default UUI interaction handler of the office is used. 218 219 @note This overwrites the settings of e.g. setHandler()! 220 */ 221 virtual void useDefaultUUIHandler(); 222 223 //_________________________________ 224 /** 225 @short add a new interaction to the list of interactions, which 226 must be handled by this helper. 227 228 @descr This method must be called immediately after a new instance of this helper was 229 created. Without such list of InteractionRules, this instances does nothing! 230 On the other side there is no possibility to remove rules. 231 So the same instance can't be used within different transactions. 232 It's a OneWay-object .-) 233 234 @param aInteractionInfo 235 describe the type of interaction, hos often it can be called etcpp. 236 237 @threadsafe yes 238 */ 239 virtual void addInteractionRule(const PreventDuplicateInteraction::InteractionInfo& aInteractionInfo); 240 241 //_________________________________ 242 /** 243 @short return the info struct for the specified interaction. 244 245 @param aInteraction 246 specify the interaction. 247 248 @param pReturn 249 provides informations about: 250 - the count how often this interaction was handled during the 251 lifetime of this helper. 252 - the interaction itself, so it can be analyzed further 253 254 @return [boolean] 255 sal_True if the queried interaction could be found. 256 sal_False otherwise. 257 258 @threadsafe yes 259 */ 260 virtual sal_Bool getInteractionInfo(const css::uno::Type& aInteraction, 261 PreventDuplicateInteraction::InteractionInfo* pReturn ) const; 262 }; 263 264 #undef css 265 266 } // namespace framework 267 268 #endif // #ifndef __FRAMEWORK_INTERACTION_PREVENTDUPLICATEINTERACTION_HXX_ 269