| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_ | 
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_ | 
| 7 | 7 | 
| 8 #include <string> | 8 #include <string> | 
| 9 #include <utility> | 9 #include <utility> | 
| 10 | 10 | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 66   using ContextTraits = BindingSetContextTraits<ContextType>; | 66   using ContextTraits = BindingSetContextTraits<ContextType>; | 
| 67   using Context = typename ContextTraits::Type; | 67   using Context = typename ContextTraits::Type; | 
| 68   using PreDispatchCallback = base::Callback<void(const Context&)>; | 68   using PreDispatchCallback = base::Callback<void(const Context&)>; | 
| 69   using Traits = BindingSetTraits<BindingType>; | 69   using Traits = BindingSetTraits<BindingType>; | 
| 70   using ProxyType = typename Traits::ProxyType; | 70   using ProxyType = typename Traits::ProxyType; | 
| 71   using RequestType = typename Traits::RequestType; | 71   using RequestType = typename Traits::RequestType; | 
| 72   using ImplPointerType = typename Traits::ImplPointerType; | 72   using ImplPointerType = typename Traits::ImplPointerType; | 
| 73 | 73 | 
| 74   BindingSetBase() {} | 74   BindingSetBase() {} | 
| 75 | 75 | 
| 76   void set_connection_error_handler(const base::Closure& error_handler) { | 76   void set_connection_error_handler(base::RepeatingClosure error_handler) { | 
| 77     error_handler_ = error_handler; | 77     error_handler_ = std::move(error_handler); | 
| 78     error_with_reason_handler_.Reset(); | 78     error_with_reason_handler_.Reset(); | 
| 79   } | 79   } | 
| 80 | 80 | 
| 81   void set_connection_error_with_reason_handler( | 81   void set_connection_error_with_reason_handler( | 
| 82       const ConnectionErrorWithReasonCallback& error_handler) { | 82       RepeatingConnectionErrorWithReasonCallback error_handler) { | 
| 83     error_with_reason_handler_ = error_handler; | 83     error_with_reason_handler_ = std::move(error_handler); | 
| 84     error_handler_.Reset(); | 84     error_handler_.Reset(); | 
| 85   } | 85   } | 
| 86 | 86 | 
| 87   // Sets a callback to be invoked immediately before dispatching any message or | 87   // Sets a callback to be invoked immediately before dispatching any message or | 
| 88   // error received by any of the bindings in the set. This may only be used | 88   // error received by any of the bindings in the set. This may only be used | 
| 89   // with a non-void |ContextType|. | 89   // with a non-void |ContextType|. | 
| 90   void set_pre_dispatch_handler(const PreDispatchCallback& handler) { | 90   void set_pre_dispatch_handler(const PreDispatchCallback& handler) { | 
| 91     static_assert(ContextTraits::SupportsContext(), | 91     static_assert(ContextTraits::SupportsContext(), | 
| 92                   "Pre-dispatch handler usage requires non-void context type."); | 92                   "Pre-dispatch handler usage requires non-void context type."); | 
| 93     pre_dispatch_handler_ = handler; | 93     pre_dispatch_handler_ = handler; | 
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 175           BindingSetBase* binding_set, | 175           BindingSetBase* binding_set, | 
| 176           BindingId binding_id, | 176           BindingId binding_id, | 
| 177           Context context) | 177           Context context) | 
| 178         : binding_(std::move(impl), std::move(request)), | 178         : binding_(std::move(impl), std::move(request)), | 
| 179           binding_set_(binding_set), | 179           binding_set_(binding_set), | 
| 180           binding_id_(binding_id), | 180           binding_id_(binding_id), | 
| 181           context_(std::move(context)) { | 181           context_(std::move(context)) { | 
| 182       if (ContextTraits::SupportsContext()) | 182       if (ContextTraits::SupportsContext()) | 
| 183         binding_.AddFilter(base::MakeUnique<DispatchFilter>(this)); | 183         binding_.AddFilter(base::MakeUnique<DispatchFilter>(this)); | 
| 184       binding_.set_connection_error_with_reason_handler( | 184       binding_.set_connection_error_with_reason_handler( | 
| 185           base::Bind(&Entry::OnConnectionError, base::Unretained(this))); | 185           base::BindOnce(&Entry::OnConnectionError, base::Unretained(this))); | 
| 186     } | 186     } | 
| 187 | 187 | 
| 188     void FlushForTesting() { binding_.FlushForTesting(); } | 188     void FlushForTesting() { binding_.FlushForTesting(); } | 
| 189 | 189 | 
| 190    private: | 190    private: | 
| 191     class DispatchFilter : public MessageReceiver { | 191     class DispatchFilter : public MessageReceiver { | 
| 192      public: | 192      public: | 
| 193       explicit DispatchFilter(Entry* entry) : entry_(entry) {} | 193       explicit DispatchFilter(Entry* entry) : entry_(entry) {} | 
| 194       ~DispatchFilter() override {} | 194       ~DispatchFilter() override {} | 
| 195 | 195 | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 247                          uint32_t custom_reason, | 247                          uint32_t custom_reason, | 
| 248                          const std::string& description) { | 248                          const std::string& description) { | 
| 249     auto it = bindings_.find(id); | 249     auto it = bindings_.find(id); | 
| 250     DCHECK(it != bindings_.end()); | 250     DCHECK(it != bindings_.end()); | 
| 251 | 251 | 
| 252     // We keep the Entry alive throughout error dispatch. | 252     // We keep the Entry alive throughout error dispatch. | 
| 253     std::unique_ptr<Entry> entry = std::move(it->second); | 253     std::unique_ptr<Entry> entry = std::move(it->second); | 
| 254     if (!is_flushing_) | 254     if (!is_flushing_) | 
| 255       bindings_.erase(it); | 255       bindings_.erase(it); | 
| 256 | 256 | 
| 257     if (!error_handler_.is_null()) | 257     if (error_handler_) { | 
| 258       error_handler_.Run(); | 258       error_handler_.Run(); | 
| 259     else if (!error_with_reason_handler_.is_null()) | 259     } else if (error_with_reason_handler_) { | 
| 260       error_with_reason_handler_.Run(custom_reason, description); | 260       error_with_reason_handler_.Run(custom_reason, description); | 
|  | 261     } | 
| 261   } | 262   } | 
| 262 | 263 | 
| 263   base::Closure error_handler_; | 264   base::RepeatingClosure error_handler_; | 
| 264   ConnectionErrorWithReasonCallback error_with_reason_handler_; | 265   RepeatingConnectionErrorWithReasonCallback error_with_reason_handler_; | 
| 265   PreDispatchCallback pre_dispatch_handler_; | 266   PreDispatchCallback pre_dispatch_handler_; | 
| 266   BindingId next_binding_id_ = 0; | 267   BindingId next_binding_id_ = 0; | 
| 267   std::map<BindingId, std::unique_ptr<Entry>> bindings_; | 268   std::map<BindingId, std::unique_ptr<Entry>> bindings_; | 
| 268   bool is_flushing_ = false; | 269   bool is_flushing_ = false; | 
| 269   const Context* dispatch_context_ = nullptr; | 270   const Context* dispatch_context_ = nullptr; | 
| 270 | 271 | 
| 271   DISALLOW_COPY_AND_ASSIGN(BindingSetBase); | 272   DISALLOW_COPY_AND_ASSIGN(BindingSetBase); | 
| 272 }; | 273 }; | 
| 273 | 274 | 
| 274 template <typename Interface, typename ContextType = void> | 275 template <typename Interface, typename ContextType = void> | 
| 275 using BindingSet = BindingSetBase<Interface, Binding<Interface>, ContextType>; | 276 using BindingSet = BindingSetBase<Interface, Binding<Interface>, ContextType>; | 
| 276 | 277 | 
| 277 }  // namespace mojo | 278 }  // namespace mojo | 
| 278 | 279 | 
| 279 #endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_ | 280 #endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_ | 
| OLD | NEW | 
|---|