Commit 084e06d2d89b8094b481de12aa7110a0fca5766c

Authored by Moritz W
1 parent ee78d8b4

Make usage of refactored HttpHandler, cleanup code

hueplusplus/HttpHandler.cpp
... ... @@ -18,18 +18,19 @@
18 18 **/
19 19  
20 20 #include "include/HttpHandler.h"
  21 +
  22 +#include <chrono>
  23 +#include <netinet/in.h> // struct sockaddr_in, struct sockaddr
  24 +#include <arpa/inet.h>
21 25 #include <iostream>
22 26 #include <memory>
23   -#include <stdexcept>
24   -#include <stdio.h> // printf, sprintf
25   -#include <stdlib.h> // exit
26   -#include <unistd.h> // read, write, close
  27 +#include <netdb.h> // struct hostent, gethostbyname
27 28 #include <sys/socket.h> // socket, connect
28   -#include <netinet/in.h> // struct sockaddr_in, struct sockaddr
29   -#include <arpa/inet.h>
30   -#include <netdb.h> // struct hostent, gethostbyname
31   -#include <string.h>
32   -#include <chrono>
  29 +#include <stdexcept>
  30 +#include <stdio.h> // printf, sprintf
  31 +#include <stdlib.h> // exit
  32 +#include <string.h> // functions for C style null-terminated strings
  33 +#include <unistd.h> // read, write, close
33 34  
34 35 class SocketCloser {
35 36 public: SocketCloser(int sockFd) :s(sockFd) {}
... ...
hueplusplus/Hue.cpp
... ... @@ -18,28 +18,28 @@
18 18 **/
19 19  
20 20 #include "include/Hue.h"
21   -#include "include/HueLight.h"
22   -#include "include/SimpleBrightnessStrategy.h"
23   -#include "include/SimpleColorHueStrategy.h"
24   -#include "include/ExtendedColorHueStrategy.h"
25   -#include "include/SimpleColorTemperatureStrategy.h"
26   -#include "include/ExtendedColorTemperatureStrategy.h"
27   -
28   -#include "include/HttpHandler.h"
29   -#include "include/UPnP.h"
30 21  
31 22 #include <chrono>
32 23 #include <iostream>
33   -#include <memory>
34 24 #include <regex>
35 25 #include <stdexcept>
36 26 #include <thread>
37 27  
  28 +#include "include/ExtendedColorHueStrategy.h"
  29 +#include "include/ExtendedColorTemperatureStrategy.h"
  30 +#include "include/SimpleBrightnessStrategy.h"
  31 +#include "include/SimpleColorHueStrategy.h"
  32 +#include "include/SimpleColorTemperatureStrategy.h"
  33 +
  34 +#include "include/UPnP.h"
  35 +
  36 +HueFinder::HueFinder(std::shared_ptr<const IHttpHandler> handler) : http_handler(std::move(handler))
  37 +{}
38 38  
39 39 std::vector<HueFinder::HueIdentification> HueFinder::FindBridges() const
40 40 {
41 41 UPnP uplug;
42   - std::vector<std::pair<std::string, std::string>> foundDevices = uplug.getDevices();
  42 + std::vector<std::pair<std::string, std::string>> foundDevices = uplug.getDevices(http_handler);
43 43  
44 44 //Does not work
45 45 std::regex manufRegex("<manufacturer>Royal Philips Electronics</manufacturer>");
... ... @@ -56,7 +56,7 @@ std::vector&lt;HueFinder::HueIdentification&gt; HueFinder::FindBridges() const
56 56 unsigned int start = p.first.find("//") + 2;
57 57 unsigned int length = p.first.find(":", start) - start;
58 58 bridge.ip = p.first.substr(start, length);
59   - std::string desc = HttpHandler().GETString("/description.xml", "application/xml", "", bridge.ip);
  59 + std::string desc = http_handler->GETString("/description.xml", "application/xml", "", bridge.ip);
60 60 std::smatch matchResult;
61 61 if (std::regex_search(desc, manufRegex) && std::regex_search(desc, manURLRegex) && std::regex_search(desc, modelRegex) && std::regex_search(desc, matchResult, serialRegex))
62 62 {
... ... @@ -93,7 +93,7 @@ Hue HueFinder::GetBridge(const HueIdentification&amp; identification)
93 93 AddUsername(identification.mac, username);
94 94 }
95 95 }
96   - return Hue(identification.ip, username);
  96 + return Hue(identification.ip, username, http_handler);
97 97 }
98 98  
99 99 void HueFinder::AddUsername(const std::string& mac, const std::string& username)
... ... @@ -122,7 +122,7 @@ std::string HueFinder::RequestUsername(const std::string &amp; ip) const
122 122 if (std::chrono::steady_clock::now() - lastCheck > std::chrono::seconds(1))
123 123 {
124 124 lastCheck = std::chrono::steady_clock::now();
125   - answer = HttpHandler().GETJson("/api", request, ip);
  125 + answer = http_handler->GETJson("/api", request, ip);
126 126  
127 127 if (answer[0]["success"] != Json::nullValue)
128 128 {
... ... @@ -141,9 +141,10 @@ std::string HueFinder::RequestUsername(const std::string &amp; ip) const
141 141 }
142 142  
143 143  
144   -Hue::Hue(const std::string& ip, const std::string& username) :
  144 +Hue::Hue(const std::string& ip, const std::string& username, std::shared_ptr<const IHttpHandler> handler) :
145 145 ip(ip),
146   -username(username)
  146 +username(username),
  147 +http_handler(std::move(handler))
147 148 {
148 149 simpleBrightnessStrategy = std::make_shared<SimpleBrightnessStrategy>();
149 150 simpleColorHueStrategy = std::make_shared<SimpleColorHueStrategy>();
... ... @@ -172,7 +173,8 @@ void Hue::requestUsername(const std::string&amp; ip)
172 173 if (std::chrono::steady_clock::now() - lastCheck > std::chrono::seconds(1))
173 174 {
174 175 lastCheck = std::chrono::steady_clock::now();
175   - answer = HttpHandler().GETJson("/api", request, ip);
  176 + answer = http_handler->GETJson("/api", request, ip);
  177 +
176 178 if (answer[0]["success"] != Json::nullValue)
177 179 {
178 180 // [{"success":{"username": "<username>"}}]
... ... @@ -218,7 +220,7 @@ HueLight&amp; Hue::getLight(int id)
218 220 if (type == "LCT001" || type == "LCT002" || type == "LCT003" || type == "LCT007" || type == "LLM001")
219 221 {
220 222 // HueExtendedColorLight Gamut B
221   - HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, extendedColorTemperatureStrategy, extendedColorHueStrategy);
  223 + HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, extendedColorTemperatureStrategy, extendedColorHueStrategy, http_handler);
222 224 light.colorType = ColorType::GAMUT_B;
223 225 lights.emplace(id, light);
224 226 return lights.find(id)->second;
... ... @@ -226,7 +228,7 @@ HueLight&amp; Hue::getLight(int id)
226 228 else if (type == "LCT010" || type == "LCT011" || type == "LCT014" || type == "LLC020" || type == "LST002")
227 229 {
228 230 // HueExtendedColorLight Gamut C
229   - HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, extendedColorTemperatureStrategy, extendedColorHueStrategy);
  231 + HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, extendedColorTemperatureStrategy, extendedColorHueStrategy, http_handler);
230 232 light.colorType = ColorType::GAMUT_C;
231 233 lights.emplace(id, light);
232 234 return lights.find(id)->second;
... ... @@ -234,7 +236,7 @@ HueLight&amp; Hue::getLight(int id)
234 236 else if (type == "LST001" || type == "LLC006" || type == "LLC007" || type == "LLC010" || type == "LLC011" || type == "LLC012" || type == "LLC013")
235 237 {
236 238 // HueColorLight Gamut A
237   - HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, simpleColorTemperatureStrategy, simpleColorHueStrategy);
  239 + HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, simpleColorTemperatureStrategy, simpleColorHueStrategy, http_handler);
238 240 light.colorType = ColorType::GAMUT_A;
239 241 lights.emplace(id, light);
240 242 return lights.find(id)->second;
... ... @@ -242,7 +244,7 @@ HueLight&amp; Hue::getLight(int id)
242 244 else if (type == "LWB004" || type == "LWB006" || type == "LWB007" || type == "LWB010" || type == "LWB014")
243 245 {
244 246 // HueDimmableLight No Color Type
245   - HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, nullptr, nullptr);
  247 + HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, nullptr, nullptr, http_handler);
246 248 light.colorType = ColorType::NONE;
247 249 lights.emplace(id, light);
248 250 return lights.find(id)->second;
... ... @@ -250,7 +252,7 @@ HueLight&amp; Hue::getLight(int id)
250 252 else if (type == "LLM010" || type == "LLM011" || type == "LLM012" || type == "LTW001" || type == "LTW004" || type == "LTW013" || type == "LTW014")
251 253 {
252 254 // HueTemperatureLight
253   - HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, simpleColorTemperatureStrategy, nullptr);
  255 + HueLight light = HueLight(ip, username, id, simpleBrightnessStrategy, simpleColorTemperatureStrategy, nullptr, http_handler);
254 256 light.colorType = ColorType::TEMPERATURE;
255 257 lights.emplace(id, light);
256 258 return lights.find(id)->second;
... ... @@ -284,13 +286,13 @@ void Hue::refreshState()
284 286 {
285 287 return;
286 288 }
287   - Json::Value answer = HttpHandler().GETJson("/api/"+username, Json::objectValue, ip);
  289 + Json::Value answer = http_handler->GETJson("/api/"+username, Json::objectValue, ip);
288 290 if (answer.isObject() && answer.isMember("lights"))
289 291 {
290 292 state = answer;
291 293 }
292 294 else
293 295 {
294   - std::cout << "Answer in Hue::refreshState of HttpHandler().GETJson(...) is not expected!\n";
  296 + std::cout << "Answer in Hue::refreshState of http_handler->GETJson(...) is not expected!\n";
295 297 }
296 298 }
... ...
hueplusplus/HueLight.cpp
... ... @@ -19,13 +19,12 @@
19 19  
20 20 #include "include/HueLight.h"
21 21  
22   -#include "include/HttpHandler.h"
23   -#include "include/json/json.h"
24   -
25 22 #include <cmath>
26 23 #include <iostream>
27 24 #include <thread>
28 25  
  26 +#include "include/json/json.h"
  27 +
29 28 bool HueLight::On(uint8_t transition)
30 29 {
31 30 std::cout << "Turning lamp with id: " << id << " on\n";
... ... @@ -78,17 +77,18 @@ bool HueLight::alert()
78 77 return false;
79 78 }
80 79  
81   -HueLight::HueLight(const std::string& ip, const std::string& username, int id)
82   - : HueLight(ip, username, id, nullptr, nullptr, nullptr)
  80 +HueLight::HueLight(const std::string& ip, const std::string& username, int id, std::shared_ptr<const IHttpHandler> handler)
  81 + : HueLight(ip, username, id, nullptr, nullptr, nullptr, handler)
83 82 {}
84 83  
85   -HueLight::HueLight(const std::string& ip, const std::string& username, int id, std::shared_ptr<const BrightnessStrategy> brightnessStrategy, std::shared_ptr<const ColorTemperatureStrategy> colorTempStrategy, std::shared_ptr<const ColorHueStrategy> colorHueStrategy)
  84 +HueLight::HueLight(const std::string& ip, const std::string& username, int id, std::shared_ptr<const BrightnessStrategy> brightnessStrategy, std::shared_ptr<const ColorTemperatureStrategy> colorTempStrategy, std::shared_ptr<const ColorHueStrategy> colorHueStrategy, std::shared_ptr<const IHttpHandler> handler)
86 85 : ip(ip),
87 86 username(username),
88 87 id(id),
89 88 brightnessStrategy(std::move(brightnessStrategy)),
90 89 colorTemperatureStrategy(std::move(colorTempStrategy)),
91   - colorHueStrategy(std::move(colorHueStrategy))
  90 + colorHueStrategy(std::move(colorHueStrategy)),
  91 + http_handler(std::move(handler))
92 92 {
93 93 refreshState();
94 94 }
... ... @@ -173,7 +173,7 @@ bool HueLight::OffNoRefresh(uint8_t transition)
173 173  
174 174 Json::Value HueLight::SendPutRequest(const Json::Value& request)
175 175 {
176   - return HttpHandler().PUTJson("/api/"+username+"/lights/"+std::to_string(id)+"/state", request, ip);
  176 + return http_handler->PUTJson("/api/"+username+"/lights/"+std::to_string(id)+"/state", request, ip);
177 177 }
178 178  
179 179 void HueLight::refreshState()
... ... @@ -181,7 +181,7 @@ void HueLight::refreshState()
181 181 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
182 182 std::cout << "\tRefreshing lampstate of lamp with id: " << id << ", ip: " << ip << "\n";
183 183  
184   - state = HttpHandler().GETJson("/api/"+username+"/lights/"+std::to_string(id), Json::objectValue, ip);
  184 + state = http_handler->GETJson("/api/"+username+"/lights/"+std::to_string(id), Json::objectValue, ip);
185 185 //! \todo check whether getAnswer is containing right information
186 186  
187 187 std::cout << "\tRefresh state took: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count() << "ms" << std::endl;
... ...
hueplusplus/UPnP.cpp
... ... @@ -18,14 +18,14 @@
18 18 **/
19 19  
20 20 #include "include/UPnP.h"
21   -#include "include/HttpHandler.h"
  21 +
22 22 #include <algorithm>
23 23 #include <iostream>
24 24  
25   -std::vector<std::pair<std::string, std::string>> UPnP::getDevices()
  25 +std::vector<std::pair<std::string, std::string>> UPnP::getDevices(std::shared_ptr<const IHttpHandler> handler)
26 26 {
27 27 // send UPnP M-Search request
28   - std::vector<std::string> foundDevices = HttpHandler().sendMulticast("M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 5\r\nST: ssdp:all\r\n\r\n", "239.255.255.250", 1900, 5);
  28 + std::vector<std::string> foundDevices = handler->sendMulticast("M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 5\r\nST: ssdp:all\r\n\r\n", "239.255.255.250", 1900, 5);
29 29  
30 30 std::vector<std::pair<std::string, std::string>> devices;
31 31  
... ...
hueplusplus/include/HttpHandler.h
... ... @@ -23,9 +23,10 @@
23 23 #include <string>
24 24 #include <vector>
25 25  
26   -#include "json/json.h"
27 26 #include "IHttpHandler.h"
28 27  
  28 +#include "json/json.h"
  29 +
29 30 //! Class to handle http requests and multicast requests
30 31 class HttpHandler : public IHttpHandler
31 32 {
... ...
hueplusplus/include/Hue.h
... ... @@ -20,19 +20,20 @@
20 20 #ifndef _HUE_H
21 21 #define _HUE_H
22 22  
23   -#include "HueLight.h"
24   -#include "BrightnessStrategy.h"
25   -#include "ColorHueStrategy.h"
26   -#include "ColorTemperatureStrategy.h"
27   -
28   -#include "json/json.h"
29   -
30 23 #include <map>
31 24 #include <memory>
32 25 #include <string>
33 26 #include <utility>
34 27 #include <vector>
35 28  
  29 +#include "BrightnessStrategy.h"
  30 +#include "ColorHueStrategy.h"
  31 +#include "ColorTemperatureStrategy.h"
  32 +#include "HueLight.h"
  33 +#include "IHttpHandler.h"
  34 +
  35 +#include "json/json.h"
  36 +
36 37 // forward declarations
37 38 class Hue;
38 39  
... ... @@ -47,7 +48,14 @@ public:
47 48 std::string ip;
48 49 std::string mac;
49 50 };
  51 +
50 52 public:
  53 +
  54 + //! \brief Constructor of HueFinder class
  55 + //!
  56 + //! \param handler HttpHandler of type \ref IHttpHandler for communication with the bridge
  57 + HueFinder(std::shared_ptr<const IHttpHandler> handler);
  58 +
51 59 //! \brief Function that finds all bridges in the network and returns them.
52 60 //!
53 61 //! The user should be given the opportunity to select the correct one based on the mac address.
... ... @@ -68,9 +76,10 @@ public:
68 76  
69 77 //! \brief Function that returns a map of mac addresses and usernames.
70 78 //!
71   - //! These should be saved at the end and re-loaded next time, so only one username is generated per bridge.
  79 + //! Note these should be saved at the end and re-loaded with \ref AddUsername next time, so only one username is generated per bridge.
72 80 //! \returns A map mapping mac address to username for every bridge
73 81 const std::map<std::string, std::string>& GetAllUsernames() const;
  82 +
74 83 private:
75 84 //! \brief Function that sends a username request to the Hue bridge.
76 85 //!
... ... @@ -82,6 +91,7 @@ private:
82 91  
83 92 private:
84 93 std::map<std::string, std::string> usernames; //!< Maps all macs to usernames added by \ref HueFinder::AddUsername
  94 + std::shared_ptr<const IHttpHandler> http_handler;
85 95 };
86 96  
87 97 //! Hue class
... ... @@ -92,7 +102,8 @@ public:
92 102 //!
93 103 //! \param ip String that specifies the ip address of the Hue bridge in dotted decimal notation like "192.168.2.1"
94 104 //! \param username String that specifies the username that is used to control the bridge. This needs to be acquired in \ref requestUsername
95   - Hue(const std::string& ip, const std::string& username);
  105 + //! \param handler HttpHandler of type \ref IHttpHandler for communication with the bridge
  106 + Hue(const std::string& ip, const std::string& username, std::shared_ptr<const IHttpHandler> handler);
96 107  
97 108 //! \brief Function to get the ip address of the hue bridge
98 109 //!
... ... @@ -149,6 +160,7 @@ private:
149 160 std::shared_ptr<ColorHueStrategy> extendedColorHueStrategy; //!< Strategy that is used for controlling the color of lights
150 161 std::shared_ptr<ColorTemperatureStrategy> simpleColorTemperatureStrategy; //!< Strategy that is used for controlling the color temperature of lights
151 162 std::shared_ptr<ColorTemperatureStrategy> extendedColorTemperatureStrategy; //!< Strategy that is used for controlling the color temperature of lights
  163 + std::shared_ptr<const IHttpHandler> http_handler;
152 164 };
153 165  
154 166 #endif
... ...
hueplusplus/include/HueLight.h
... ... @@ -22,10 +22,12 @@
22 22  
23 23 #include <memory>
24 24  
25   -#include "json/json.h"
26 25 #include "BrightnessStrategy.h"
27 26 #include "ColorHueStrategy.h"
28 27 #include "ColorTemperatureStrategy.h"
  28 +#include "IHttpHandler.h"
  29 +
  30 +#include "json/json.h"
29 31  
30 32 /*enum ModelType
31 33 {
... ... @@ -341,9 +343,10 @@ protected:
341 343 //! \param ip String that specifies the ip of the Hue bridge
342 344 //! \param username String that specifies the username used to control the bridge
343 345 //! \param id Integer that specifies the id of this light
  346 + //! \param handler HttpHandler of type \ref IHttpHandler for communication with the bridge
344 347 //!
345 348 //! leaves strategies unset
346   - HueLight(const std::string& ip, const std::string& username, int id);
  349 + HueLight(const std::string& ip, const std::string& username, int id, std::shared_ptr<const IHttpHandler> handler);
347 350  
348 351 //! \brief Protected ctor that is used by \ref Hue class, also sets strategies.
349 352 //!
... ... @@ -353,7 +356,8 @@ protected:
353 356 //! \param brightnessStrategy Strategy for brightness. May be nullptr.
354 357 //! \param colorTempStrategy Strategy for color temperature. May be nullptr.
355 358 //! \param colorHueStrategy Strategy for color hue/saturation. May be nullptr.
356   - HueLight(const std::string& ip, const std::string& username, int id, std::shared_ptr<const BrightnessStrategy> brightnessStrategy, std::shared_ptr<const ColorTemperatureStrategy> colorTempStrategy, std::shared_ptr<const ColorHueStrategy> colorHueStrategy);
  359 + //! \param handler HttpHandler of type \ref IHttpHandler for communication with the bridge
  360 + HueLight(const std::string& ip, const std::string& username, int id, std::shared_ptr<const BrightnessStrategy> brightnessStrategy, std::shared_ptr<const ColorTemperatureStrategy> colorTempStrategy, std::shared_ptr<const ColorHueStrategy> colorHueStrategy, std::shared_ptr<const IHttpHandler> handler);
357 361  
358 362 //! \brief Protected function that sets the brightness strategy.
359 363 //!
... ... @@ -373,6 +377,12 @@ protected:
373 377 //! \param strat a strategy of type \ref ColorHueStrategy
374 378 void setColorHueStrategy(std::shared_ptr<const ColorHueStrategy> strat) { colorHueStrategy = std::move(strat); };
375 379  
  380 + //! \brief Protected function that sets the HttpHandler.
  381 + //!
  382 + //! The HttpHandler defines how specific commands that deal with bridge communication are executed
  383 + //! \param handler a HttpHandler of type \ref IHttpHandler
  384 + void setHttpHandler(std::shared_ptr<const IHttpHandler> handler) { http_handler = std::move(handler); };
  385 +
376 386 //! \brief Function that turns the light on without refreshing its state.
377 387 //!
378 388 //! \param transition Optional parameter to set the transition from current state to new standard is 4 = 400ms
... ... @@ -404,6 +414,7 @@ protected:
404 414 std::shared_ptr<const BrightnessStrategy> brightnessStrategy; //!< holds a reference to the strategy that handles brightness commands
405 415 std::shared_ptr<const ColorTemperatureStrategy> colorTemperatureStrategy; //!< holds a reference to the strategy that handles colortemperature commands
406 416 std::shared_ptr<const ColorHueStrategy> colorHueStrategy; //!< holds a reference to the strategy that handles all color commands
  417 + std::shared_ptr<const IHttpHandler> http_handler;
407 418 };
408 419  
409 420 #endif
... ...
hueplusplus/include/UPnP.h
... ... @@ -20,9 +20,12 @@
20 20 #ifndef _UPNP_H
21 21 #define _UPNP_H
22 22  
  23 +#include <memory>
23 24 #include <string>
24 25 #include <vector>
25 26  
  27 +#include "IHttpHandler.h"
  28 +
26 29 //! Class that looks for UPnP devices using an m-search package
27 30 class UPnP
28 31 {
... ... @@ -31,8 +34,9 @@ public:
31 34 //!
32 35 //! It does it by sending an m-search packet and waits for all responses.
33 36 //! Since responses can be received multiple times this function conveniently removes all duplicates.
  37 + //! \param handler HttpHandler of type \ref IHttpHandler for communication with the bridge
34 38 //! \return A vector containing pairs of address and name of all found devices
35   - std::vector<std::pair<std::string, std::string>> getDevices();
  39 + std::vector<std::pair<std::string, std::string>> getDevices(std::shared_ptr<const IHttpHandler> handler);
36 40 };
37 41  
38 42 #endif
... ...