• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_BASE_MESSAGEHANDLER_H_
12 #define WEBRTC_BASE_MESSAGEHANDLER_H_
13 
14 #include <utility>
15 
16 #include "webrtc/base/constructormagic.h"
17 #include "webrtc/base/scoped_ptr.h"
18 
19 namespace rtc {
20 
21 struct Message;
22 
23 // Messages get dispatched to a MessageHandler
24 
25 class MessageHandler {
26  public:
27   virtual ~MessageHandler();
28   virtual void OnMessage(Message* msg) = 0;
29 
30  protected:
MessageHandler()31   MessageHandler() {}
32 
33  private:
34   RTC_DISALLOW_COPY_AND_ASSIGN(MessageHandler);
35 };
36 
37 // Helper class to facilitate executing a functor on a thread.
38 template <class ReturnT, class FunctorT>
39 class FunctorMessageHandler : public MessageHandler {
40  public:
FunctorMessageHandler(const FunctorT & functor)41   explicit FunctorMessageHandler(const FunctorT& functor)
42       : functor_(functor) {}
OnMessage(Message * msg)43   virtual void OnMessage(Message* msg) {
44     result_ = functor_();
45   }
result()46   const ReturnT& result() const { return result_; }
47 
48  private:
49   FunctorT functor_;
50   ReturnT result_;
51 };
52 
53 // Specialization for rtc::scoped_ptr<ReturnT>.
54 template <class ReturnT, class FunctorT>
55 class FunctorMessageHandler<class rtc::scoped_ptr<ReturnT>, FunctorT>
56     : public MessageHandler {
57  public:
FunctorMessageHandler(const FunctorT & functor)58   explicit FunctorMessageHandler(const FunctorT& functor) : functor_(functor) {}
OnMessage(Message * msg)59   virtual void OnMessage(Message* msg) { result_ = std::move(functor_()); }
result()60   rtc::scoped_ptr<ReturnT> result() { return std::move(result_); }
61 
62  private:
63   FunctorT functor_;
64   rtc::scoped_ptr<ReturnT> result_;
65 };
66 
67 // Specialization for ReturnT of void.
68 template <class FunctorT>
69 class FunctorMessageHandler<void, FunctorT> : public MessageHandler {
70  public:
FunctorMessageHandler(const FunctorT & functor)71   explicit FunctorMessageHandler(const FunctorT& functor)
72       : functor_(functor) {}
OnMessage(Message * msg)73   virtual void OnMessage(Message* msg) {
74     functor_();
75   }
result()76   void result() const {}
77 
78  private:
79   FunctorT functor_;
80 };
81 
82 } // namespace rtc
83 
84 #endif // WEBRTC_BASE_MESSAGEHANDLER_H_
85