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 INCLUDED_BINARYURP_SOURCE_BRIDGE_HXX 25 #define INCLUDED_BINARYURP_SOURCE_BRIDGE_HXX 26 27 #include "sal/config.h" 28 29 #include <cstddef> 30 #include <list> 31 #include <map> 32 #include <vector> 33 34 #include "boost/noncopyable.hpp" 35 #include "com/sun/star/bridge/XBridge.hpp" 36 #include "com/sun/star/lang/XComponent.hpp" 37 #include "com/sun/star/uno/Reference.hxx" 38 #include "com/sun/star/uno/RuntimeException.hpp" 39 #include "cppuhelper/implbase2.hxx" 40 #include "osl/conditn.hxx" 41 #include "osl/mutex.hxx" 42 #include "rtl/ref.hxx" 43 #include "rtl/ustring.hxx" 44 #include "sal/types.h" 45 #include "uno/environment.hxx" 46 #include "uno/mapping.hxx" 47 #include "uno/threadpool.h" 48 49 #include "outgoingrequest.hxx" 50 #include "outgoingrequests.hxx" 51 #include "writer.hxx" 52 53 namespace binaryurp { 54 class BinaryAny; 55 class BridgeFactory; 56 class Proxy; 57 class Reader; 58 } 59 namespace com { namespace sun { namespace star { 60 namespace bridge { class XInstanceProvider; } 61 namespace connection { class XConnection; } 62 namespace lang { class XEventListener; } 63 namespace uno { 64 class Any; 65 class TypeDescription; 66 class UnoInterfaceReference; 67 class XInterface; 68 } 69 } } } 70 namespace rtl { class ByteSequence; } 71 72 namespace binaryurp { 73 74 class Bridge: 75 public cppu::WeakImplHelper2< 76 com::sun::star::bridge::XBridge, com::sun::star::lang::XComponent >, 77 private boost::noncopyable 78 { 79 public: 80 Bridge( 81 rtl::Reference< BridgeFactory > const & factory, 82 rtl::OUString const & name, 83 com::sun::star::uno::Reference< 84 com::sun::star::connection::XConnection > const & connection, 85 com::sun::star::uno::Reference< 86 com::sun::star::bridge::XInstanceProvider > const & provider); 87 88 void start(); 89 90 // Internally waits for all incoming and outgoing remote calls to terminate, 91 // so must not be called from within such a call: 92 void terminate(); 93 94 com::sun::star::uno::Reference< com::sun::star::connection::XConnection > 95 getConnection() const; 96 97 com::sun::star::uno::Reference< com::sun::star::bridge::XInstanceProvider > 98 getProvider() const; 99 100 com::sun::star::uno::Mapping & getCppToBinaryMapping(); 101 102 BinaryAny mapCppToBinaryAny(com::sun::star::uno::Any const & cppAny); 103 104 uno_ThreadPool getThreadPool() const; 105 106 rtl::Reference< Writer > getWriter(); 107 108 com::sun::star::uno::UnoInterfaceReference registerIncomingInterface( 109 rtl::OUString const & oid, 110 com::sun::star::uno::TypeDescription const & type); 111 112 rtl::OUString registerOutgoingInterface( 113 com::sun::star::uno::UnoInterfaceReference const & object, 114 com::sun::star::uno::TypeDescription const & type); 115 116 com::sun::star::uno::UnoInterfaceReference findStub( 117 rtl::OUString const & oid, 118 com::sun::star::uno::TypeDescription const & type); 119 120 void releaseStub( 121 rtl::OUString const & oid, 122 com::sun::star::uno::TypeDescription const & type); 123 124 void resurrectProxy(Proxy & proxy); 125 126 void revokeProxy(Proxy & proxy); 127 128 void freeProxy(Proxy & proxy); 129 130 void incrementCalls(bool normalCall) throw (); 131 132 void decrementCalls(); 133 134 void incrementActiveCalls() throw (); 135 136 void decrementActiveCalls() throw (); 137 138 bool makeCall( 139 rtl::OUString const & oid, 140 com::sun::star::uno::TypeDescription const & member, bool setter, 141 std::vector< BinaryAny > const & inArguments, BinaryAny * returnValue, 142 std::vector< BinaryAny > * outArguments); 143 144 // Only called from reader_ thread: 145 void sendRequestChangeRequest(); 146 147 // Only called from reader_ thread: 148 void handleRequestChangeReply( 149 bool exception, BinaryAny const & returnValue); 150 151 // Only called from reader_ thread: 152 void handleCommitChangeReply(bool exception, BinaryAny const & returnValue); 153 154 // Only called from reader_ thread: 155 void handleRequestChangeRequest( 156 rtl::ByteSequence const & tid, 157 std::vector< BinaryAny > const & inArguments); 158 159 // Only called from reader_ thread: 160 void handleCommitChangeRequest( 161 rtl::ByteSequence const & tid, 162 std::vector< BinaryAny > const & inArguments); 163 164 OutgoingRequest lastOutgoingRequest(rtl::ByteSequence const & tid); 165 166 bool isProtocolPropertiesRequest( 167 rtl::OUString const & oid, 168 com::sun::star::uno::TypeDescription const & type) const; 169 170 void setCurrentContextMode(); 171 172 bool isCurrentContextMode(); 173 174 private: 175 virtual ~Bridge(); 176 177 virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > 178 SAL_CALL getInstance(rtl::OUString const & sInstanceName) 179 throw (com::sun::star::uno::RuntimeException); 180 181 virtual rtl::OUString SAL_CALL getName() 182 throw (com::sun::star::uno::RuntimeException); 183 184 virtual rtl::OUString SAL_CALL getDescription() 185 throw (com::sun::star::uno::RuntimeException); 186 187 virtual void SAL_CALL dispose() 188 throw (com::sun::star::uno::RuntimeException); 189 190 virtual void SAL_CALL addEventListener( 191 com::sun::star::uno::Reference< com::sun::star::lang::XEventListener > 192 const & xListener) 193 throw (com::sun::star::uno::RuntimeException); 194 195 virtual void SAL_CALL removeEventListener( 196 com::sun::star::uno::Reference< com::sun::star::lang::XEventListener > 197 const & aListener) 198 throw (com::sun::star::uno::RuntimeException); 199 200 // Only called from reader_ thread: 201 void sendCommitChangeRequest(); 202 203 // Only called from reader_ thread: 204 void sendProtPropRequest( 205 OutgoingRequest::Kind kind, 206 std::vector< BinaryAny > const & inArguments); 207 208 void makeReleaseCall( 209 rtl::OUString const & oid, 210 com::sun::star::uno::TypeDescription const & type); 211 212 void sendRequest( 213 rtl::ByteSequence const & tid, rtl::OUString const & oid, 214 com::sun::star::uno::TypeDescription const & type, 215 com::sun::star::uno::TypeDescription const & member, 216 std::vector< BinaryAny > const & inArguments); 217 218 void throwException(bool exception, BinaryAny const & value); 219 220 com::sun::star::uno::Any mapBinaryToCppAny(BinaryAny const & binaryAny); 221 222 bool becameUnused() const; 223 224 void terminateWhenUnused(bool unused); 225 226 typedef 227 std::list< 228 com::sun::star::uno::Reference< 229 com::sun::star::lang::XEventListener > > 230 Listeners; 231 232 struct SubStub { 233 com::sun::star::uno::UnoInterfaceReference object; 234 sal_uInt32 references; 235 }; 236 237 typedef std::map< com::sun::star::uno::TypeDescription, SubStub > Stub; 238 239 typedef std::map< rtl::OUString, Stub > Stubs; 240 241 enum Mode { 242 MODE_REQUESTED, MODE_REPLY_MINUS1, MODE_REPLY_0, MODE_REPLY_1, 243 MODE_WAIT, MODE_NORMAL, MODE_NORMAL_WAIT }; 244 245 rtl::Reference< BridgeFactory > factory_; 246 rtl::OUString name_; 247 com::sun::star::uno::Reference< com::sun::star::connection::XConnection > 248 connection_; 249 com::sun::star::uno::Reference< com::sun::star::bridge::XInstanceProvider > 250 provider_; 251 com::sun::star::uno::Environment binaryUno_; 252 com::sun::star::uno::Mapping cppToBinaryMapping_; 253 com::sun::star::uno::Mapping binaryToCppMapping_; 254 rtl::ByteSequence protPropTid_; 255 rtl::OUString protPropOid_; 256 com::sun::star::uno::TypeDescription protPropType_; 257 com::sun::star::uno::TypeDescription protPropRequest_; 258 com::sun::star::uno::TypeDescription protPropCommit_; 259 uno_ThreadPool threadPool_; 260 OutgoingRequests outgoingRequests_; 261 262 osl::Mutex mutex_; 263 Listeners listeners_; 264 rtl::Reference< Writer > writer_; 265 rtl::Reference< Reader > reader_; 266 bool currentContextMode_; 267 Stubs stubs_; 268 std::size_t proxies_; 269 std::size_t calls_; 270 bool normalCall_; 271 std::size_t activeCalls_; 272 osl::Condition passive_; 273 // to guarantee that passive_ is eventually set (to avoid deadlock, see 274 // dispose), activeCalls_ only counts those calls for which it can be 275 // guaranteed that incrementActiveCalls is indeed followed by 276 // decrementActiveCalls, without an intervening exception 277 bool terminated_; 278 279 // Only accessed from reader_ thread: 280 Mode mode_; 281 sal_Int32 random_; 282 }; 283 284 } 285 286 #endif 287