TDME2  1.9.200
ServerClientRequestHandlerHub.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <string>
4 #include <unordered_map>
5 
6 #include <tdme/tdme.h>
9 
10 using std::string;
11 using std::unordered_map;
12 
15 
16 namespace tdme {
17 namespace network {
18 namespace udpserver {
19 
20 /**
21  * @brief Network server client request handler hub
22  * @author Andreas Drewke
23  */
24 template <class CLIENT, class REQUEST>
26 public:
27  // forbid class copy
29 
30  /**
31  * @brief Public constructor
32  */
34  }
35 
36  /**
37  * @brief Public destructor
38  */
40  // delete handler
41  for (const auto& [handlerId, handler]: requestHandlerMap) {
42  // delete reference
43  delete handler;
44  }
45  }
46 
47  /**
48  * @brief Adds a client request handler
49  * @param handler request handler
50  * @throws TCPServerClientRequestHandlerHubException
51  */
53  auto it = requestHandlerMap.find(handler->getCommand());
54  if (it == requestHandlerMap.end()) {
55  requestHandlerMap[handler->getCommand()] = handler;
56  } else {
57  throw ServerClientRequestHandlerHubException("Handler for given command already exists");
58  }
59  }
60 
61  /**
62  * @brief Sets the client request default handler, will be used if command not found in request handler map
63  * @param handler request handler
64  */
66  defaultHandler = handler;
67  }
68 
69  /**
70  * Handles a client request
71  * @param client client
72  * @param command command
73  * @param request request
74  * @param messageId message id (udp server only)
75  * @param retries retries (udp server only)
76  */
77  void handleRequest(CLIENT* client, const string& command, REQUEST& request, const uint32_t messageId, const uint8_t retries) {
78  auto it = requestHandlerMap.find(command);
79  // handler not identified?
80  if (it == requestHandlerMap.end()) {
81  // use default / fall back if exists
82  if (defaultHandler != nullptr) {
83  defaultHandler->handleRequest(client, request, messageId, retries);
84  } else {
85  // otherwise report an exception
86  throw ServerClientRequestHandlerHubException("Handler for given command not found");
87  }
88  } else {
89  // found handler
90  auto handler = it->second;
91  handler->handleRequest(client, request, messageId, retries);
92  }
93  }
94 private:
95  typedef unordered_map<string, ServerClientRequestHandler<CLIENT,REQUEST>*> RequestHandlerMap;
98 };
99 
100 };
101 };
102 };
unordered_map< string, ServerClientRequestHandler< CLIENT, REQUEST > * > RequestHandlerMap
ServerClientRequestHandler< CLIENT, REQUEST > * defaultHandler
void addHandler(ServerClientRequestHandler< CLIENT, REQUEST > *handler)
Adds a client request handler.
void handleRequest(CLIENT *client, const string &command, REQUEST &request, const uint32_t messageId, const uint8_t retries)
Handles a client request.
void setDefaultHandler(ServerClientRequestHandler< CLIENT, REQUEST > *handler)
Sets the client request default handler, will be used if command not found in request handler map.
const string & getCommand()
Returns this requests handler command name.
Definition: fwd-tdme.h:4
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6