OSVR-Core
MessageHandler.h
Go to the documentation of this file.
1 
11 // Copyright 2015 Sensics, Inc.
12 //
13 // Licensed under the Apache License, Version 2.0 (the "License");
14 // you may not use this file except in compliance with the License.
15 // You may obtain a copy of the License at
16 //
17 // http://www.apache.org/licenses/LICENSE-2.0
18 //
19 // Unless required by applicable law or agreed to in writing, software
20 // distributed under the License is distributed on an "AS IS" BASIS,
21 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 // See the License for the specific language governing permissions and
23 // limitations under the License.
24 
25 #ifndef INCLUDED_MessageHandler_h_GUID_A7A258A7_A369_46BA_C44F_6FFE56DB464A
26 #define INCLUDED_MessageHandler_h_GUID_A7A258A7_A369_46BA_C44F_6FFE56DB464A
27 
28 // Internal Includes
31 #include <osvr/Util/SharedPtr.h>
32 
33 // Library/third-party includes
34 #include <boost/optional.hpp>
35 #include <boost/noncopyable.hpp>
36 
37 // Standard includes
38 #include <vector>
39 
40 namespace osvr {
41 namespace common {
42  class MessageHandlerBase : boost::noncopyable {
43  public:
44  virtual ~MessageHandlerBase();
45 
46  protected:
48  };
49 
54  template <typename Handler, typename Registrar>
56  public:
57  typedef Handler handler_type;
59  public:
60  registration_type(Registrar *reg) : m_reg(reg) {}
61 
62  void registerHandler(handler_type handler, void *userdata,
63  RawSenderType const &,
64  RawMessageType const &msgType) {
65  m_reg->registerHandler(handler, userdata, msgType);
66  }
67  void unregisterHandler(handler_type handler, void *userdata,
68  RawSenderType const &,
69  RawMessageType const &msgType) {
70  m_reg->unregisterHandler(handler, userdata, msgType);
71  }
72 
73  private:
74  Registrar *m_reg;
75  };
76  };
84  template <typename MessageTraits>
86  public:
87  typedef typename MessageTraits::handler_type handler_type;
88  typedef typename MessageTraits::registration_type registration_type;
89 
92  MessageHandler(handler_type handler, void *userdata = nullptr,
93  RawSenderType sender = RawSenderType(),
94  RawMessageType msgType = RawMessageType())
95  : m_handler(handler), m_data(userdata), m_sender(sender),
96  m_msgType(msgType) {}
97 
103  MessageHandler(handler_type handler, void *userdata,
104  RawMessageType msgType)
105  : m_handler(handler), m_data(userdata), m_msgType(msgType) {}
106 
112  if (m_reg.is_initialized()) {
113  m_reg->unregisterHandler(m_handler, m_data, m_sender,
114  m_msgType);
115  m_reg.reset();
116  }
117  }
118 
120  void registerHandler(registration_type reg) {
121  unregisterHandler();
122  m_reg = reg;
123  m_reg->registerHandler(m_handler, m_data, m_sender, m_msgType);
124  }
125 
127  ~MessageHandler() { unregisterHandler(); }
128 
129  private:
130  handler_type m_handler;
131  void *m_data;
132  RawSenderType m_sender;
133  RawMessageType m_msgType;
134  boost::optional<registration_type> m_reg;
135  };
136 
137  template <typename MessageTraits>
138  using MessageHandlerPtr = shared_ptr<MessageHandler<MessageTraits> >;
139 
140  template <typename MessageTraits>
141  using MessageHandlerList = std::vector<MessageHandlerPtr<MessageTraits> >;
142 
143  typedef std::vector<shared_ptr<MessageHandlerBase> >
144  GenericMessageHandlerList;
145 } // namespace common
146 } // namespace osvr
147 #endif // INCLUDED_MessageHandler_h_GUID_A7A258A7_A369_46BA_C44F_6FFE56DB464A
Handles spatial transformations.
Definition: SerializationTraitExample_Complicated.h:40
RAII class template managing a message handler callback.
Definition: MessageHandler.h:85
The main namespace for all C++ elements of the framework, internal and external.
Definition: namespace_osvr.dox:3
Header to bring shared_ptr into the osvr namespace.
Definition: MessageHandler.h:42
MessageHandler(handler_type handler, void *userdata=nullptr, RawSenderType sender=RawSenderType(), RawMessageType msgType=RawMessageType())
Constructor taking your handler&#39;s basic info, and optionally a sender, and optionally a message type...
Definition: MessageHandler.h:92
void registerHandler(registration_type reg)
Register handler on the given registration policy value.
Definition: MessageHandler.h:120
~MessageHandler()
destructor: automatically unregisters handler.
Definition: MessageHandler.h:127
MessageHandler(handler_type handler, void *userdata, RawMessageType msgType)
Constructor taking your handler&#39;s basic info and a message type.
Definition: MessageHandler.h:103
A class template for the common message traits where the registrar is passed by pointer, has registerHandler and unregisterHandler methods, and doesn&#39;t take a RawSenderType because it&#39;s implied.
Definition: MessageHandler.h:55
Type-safe wrapper with built-in default for a VRPN "message type" integer.
Definition: RawMessageType.h:45
Type-safe wrapper with built-in default for a VRPN "sender type" integer.
Definition: RawSenderType.h:45
void unregisterHandler()
Method if you want to manually unregister your handler.
Definition: MessageHandler.h:111