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 _UCBHELPER_RESULTSETHELPER_HXX 25 #define _UCBHELPER_RESULTSETHELPER_HXX 26 27 #include <osl/mutex.hxx> 28 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 29 #include <com/sun/star/lang/XTypeProvider.hpp> 30 #include <com/sun/star/lang/XServiceInfo.hpp> 31 #include <com/sun/star/ucb/XDynamicResultSet.hpp> 32 #include <com/sun/star/ucb/XCommandEnvironment.hpp> 33 #include <com/sun/star/ucb/OpenCommandArgument2.hpp> 34 #include <cppuhelper/weak.hxx> 35 #include <ucbhelper/macros.hxx> 36 #include <ucbhelper/contenthelper.hxx> 37 #include "ucbhelper/ucbhelperdllapi.h" 38 39 namespace cppu { 40 class OInterfaceContainerHelper; 41 } 42 43 namespace ucbhelper { 44 45 //========================================================================= 46 47 #define DYNAMICRESULTSET_SERVICE_NAME "com.sun.star.ucb.DynamicResultSet" 48 49 //========================================================================= 50 51 /** 52 * This is an abstract base class for implementations of the service 53 * com.sun.star.ucb.DynamicResultSet, which is the result of the command 54 * "open" executed at a UCB folder content. 55 * 56 * Features of the base class implementation: 57 * - standard interfaces ( XInterface, XTypeProvider, XServiceInfo ) 58 * - all required interfaces for service com::sun::star::ucb::DynamicResultSet 59 */ 60 class UCBHELPER_DLLPUBLIC ResultSetImplHelper : 61 public cppu::OWeakObject, 62 public com::sun::star::lang::XTypeProvider, 63 public com::sun::star::lang::XServiceInfo, 64 public com::sun::star::ucb::XDynamicResultSet 65 { 66 cppu::OInterfaceContainerHelper* m_pDisposeEventListeners; 67 sal_Bool m_bStatic; 68 sal_Bool m_bInitDone; 69 70 protected: 71 osl::Mutex m_aMutex; 72 com::sun::star::ucb::OpenCommandArgument2 m_aCommand; 73 com::sun::star::uno::Reference< 74 com::sun::star::lang::XMultiServiceFactory > m_xSMgr; 75 // Resultset #1 76 com::sun::star::uno::Reference< 77 com::sun::star::sdbc::XResultSet > m_xResultSet1; 78 // Resultset #2 79 com::sun::star::uno::Reference< 80 com::sun::star::sdbc::XResultSet > m_xResultSet2; 81 // Resultset changes listener. 82 com::sun::star::uno::Reference< 83 com::sun::star::ucb::XDynamicResultSetListener > m_xListener; 84 85 private: 86 UCBHELPER_DLLPRIVATE void init( sal_Bool bStatic ); 87 88 /** 89 * Your implementation of this method has to fill the protected member 90 * m_xResultSet1. This resultset must implement a complete static 91 * resultset ( service com.sun.star.ucb.ContentResultSet ). This method 92 * will be called at most once in the life of your implementation object. 93 * After this method was called, the type of this resultset will be 94 * "static". There is no way to change the type afterwards. 95 * If this method gets called the client wants to use your resultset 96 * exclusively statically. You may deploy this factum to optimize your 97 * implementation (i.e. "switch off" all changes detection code in 98 * your implementation). 99 * Note that you may use the class ucb::ResultSet to implement the 100 * static resultset, that is required here. 101 */ 102 UCBHELPER_DLLPRIVATE virtual void initStatic() = 0; 103 104 /** 105 * Your implementation of this method has to fill the protected members 106 * m_xResultSet1 and m_xResultSet2 of this base class. Each of these 107 * resultsets must implement a complete static resultset 108 * ( service com.sun.star.ucb.ContentResultSet ). This method will be 109 * called at most once in the life of your implementation object. 110 * After this method was called, the type of this resultset will be 111 * "dynamic". There is no way to change the type afterwards. 112 * If this method gets called the client wants to use your resultset 113 * exclusively dynamically. This means, it is interested in getting 114 * notifications on changes of data of the resultset contents. ( These 115 * changes are to propagate by your implementation throw the member 116 * m_xListener of this base class ). 117 * If your implementation cannot detect changes of relevant data, you 118 * may fill m_xResultSet1 and m_xResultSet2 with the same static resultset 119 * implementation object. This normally will be the same instance you put 120 * into m_xResultSet1 when initStatic() is called. 121 */ 122 UCBHELPER_DLLPRIVATE virtual void initDynamic() = 0; 123 124 public: 125 /** 126 * Constructor. 127 * 128 * @param rxSMgr is a Service Manager. 129 */ 130 ResultSetImplHelper( 131 const com::sun::star::uno::Reference< 132 com::sun::star::lang::XMultiServiceFactory >& rxSMgr ); 133 134 /** 135 * Constructor. 136 * 137 * @param rxSMgr is a Service Manager. 138 * @param rCommand is the parameter for the open command that produces 139 * this resultset. 140 */ 141 ResultSetImplHelper( 142 const com::sun::star::uno::Reference< 143 com::sun::star::lang::XMultiServiceFactory >& rxSMgr, 144 const com::sun::star::ucb::OpenCommandArgument2& rCommand ); 145 146 /** 147 * Destructor. 148 */ 149 virtual ~ResultSetImplHelper(); 150 151 // XInterface 152 XINTERFACE_DECL() 153 154 // XTypeProvider 155 XTYPEPROVIDER_DECL() 156 157 // XServiceInfo 158 XSERVICEINFO_NOFACTORY_DECL() 159 160 // XComponent ( base class of XDynamicResultSet ) 161 virtual void SAL_CALL 162 dispose(); 163 virtual void SAL_CALL 164 addEventListener( const com::sun::star::uno::Reference< 165 com::sun::star::lang::XEventListener >& Listener ); 166 virtual void SAL_CALL 167 removeEventListener( const com::sun::star::uno::Reference< 168 com::sun::star::lang::XEventListener >& Listener ); 169 170 // XDynamicResultSet 171 virtual com::sun::star::uno::Reference< 172 com::sun::star::sdbc::XResultSet > SAL_CALL 173 getStaticResultSet(); 174 virtual void SAL_CALL 175 setListener( const com::sun::star::uno::Reference< 176 com::sun::star::ucb::XDynamicResultSetListener >& Listener ); 177 virtual void SAL_CALL 178 connectToCache( const com::sun::star::uno::Reference< 179 com::sun::star::ucb::XDynamicResultSet > & xCache ); 180 181 /** 182 * The implementation of this method always returns 0. Override this 183 * method, if necessary. 184 */ 185 virtual sal_Int16 SAL_CALL 186 getCapabilities(); 187 188 ////////////////////////////////////////////////////////////////////// 189 // Non-interface methods. 190 ////////////////////////////////////////////////////////////////////// 191 192 /** 193 * This method returns, whether the resultset is static or dynamic. 194 * If neither getStatic() nor getDynamic() was called, the type 195 * of the resultset is "dynamic". 196 * 197 * @return true, if the resultset type is "static". False, otherwise. 198 */ isStatic() const199 sal_Bool isStatic() const { return m_bStatic; } 200 }; 201 202 } 203 204 #endif /* !_UCBHELPER_RESULTSETHELPER_HXX */ 205