X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=AFBClient.cpp;h=497b746034adda6c7a1bbee79a3b3c28f5f1620e;hb=d53c8301bf1d51d4001a93acdb54adf40c78e207;hp=99f22bdf19e44484104b96aafd7d53ffc78280c6;hpb=267c89a270b79b4bb45043c700ca65f2917b241c;p=staging%2Fwindowmanager.git diff --git a/AFBClient.cpp b/AFBClient.cpp index 99f22bd..497b746 100644 --- a/AFBClient.cpp +++ b/AFBClient.cpp @@ -44,7 +44,7 @@ class AFBClient::Impl { int deactivateSurface(const char *label); int endDraw(const char *label); - void set_event_handler(enum EventType et, handler_fun f); + void set_event_handler(enum EventType et, handler_fun func); Impl(); ~Impl(); @@ -79,7 +79,7 @@ constexpr const char *const wmAPI = "winman"; struct ScopeTrace { thread_local static int indent; char const *f{}; - ScopeTrace(char const *func) : f(func) { + explicit ScopeTrace(char const *func) : f(func) { fprintf(stderr, "%*s%s -->\n", 2 * indent++, "", this->f); } ~ScopeTrace() { fprintf(stderr, "%*s%s <--\n", 2 * --indent, "", this->f); } @@ -115,7 +115,7 @@ void onHangup(void *closure, afb_wsj1 *wsj1) { exit(0); } -constexpr static struct afb_wsj1_itf itf = { +constexpr struct afb_wsj1_itf itf = { onHangup, onCall, onEvent, }; @@ -131,7 +131,7 @@ void dispatch_internal(struct sd_event *loop) { /// object will be json_object_put int api_call(struct sd_event *loop, struct afb_wsj1 *wsj1, const char *verb, json_object *object, - std::function onReply) { + const std::function &onReply) { TRACE(); // We need to wrap the actual onReply call once in order to @@ -140,7 +140,7 @@ int api_call(struct sd_event *loop, struct afb_wsj1 *wsj1, const char *verb, // Alternatively we could setup a local struct and use it as // closure, but I think it is cleaner this way. int call_rc = 0; - std::atomic returned; + std::atomic returned{}; returned.store(false, std::memory_order_relaxed); std::function wrappedOnReply = [&returned, &call_rc, &onReply](bool ok, json_object *j) { @@ -163,7 +163,7 @@ int api_call(struct sd_event *loop, struct afb_wsj1 *wsj1, const char *verb, auto *onReply = reinterpret_cast *>( closure); - (*onReply)(!!afb_wsj1_msg_is_reply_ok(msg), + (*onReply)(!(afb_wsj1_msg_is_reply_ok(msg) == 0), afb_wsj1_msg_object_j(msg)); }, &wrappedOnReply); @@ -206,7 +206,6 @@ AFBClient::Impl::~Impl() { TRACE(); afb_wsj1_unref(wsj1); sd_event_unref(loop); - loop = nullptr; } int AFBClient::Impl::init(int port, char const *token) { @@ -214,14 +213,20 @@ int AFBClient::Impl::init(int port, char const *token) { char *uribuf = nullptr; int rc = -1; - if (!token || strlen(token) > token_maxlen) { + if (this->loop != nullptr && this->wsj1 != nullptr) { + fputs("AFBClient instance is already initialized!\n", stderr); + rc = -EALREADY; + goto fail; + } + + if ((token == nullptr) || strlen(token) > token_maxlen) { fprintf(stderr, "Token is invalid\n"); rc = -EINVAL; goto fail; } - for (char const *p = token; *p; p++) { - if (!isalnum(*p)) { + for (char const *p = token; *p != 0; p++) { + if (isalnum(*p) == 0) { fprintf(stderr, "Token is invalid\n"); rc = -EINVAL; goto fail; @@ -248,7 +253,8 @@ int AFBClient::Impl::init(int port, char const *token) { wsj1 = afb_ws_client_connect_wsj1( loop, uribuf, const_cast(&itf), this); if (wsj1 == nullptr) { - sd_event_unref(loop); + sd_event_unref(this->loop); + this->loop = nullptr; fprintf(stderr, "Connection to %s failed: %m\n", uribuf); rc = -errno; goto fail; @@ -294,15 +300,16 @@ int AFBClient::Impl::requestSurface(const char *label) { } } else { fprintf(stderr, "Could not get surface ID from WM: %s\n", - j ? json_object_to_json_string_ext( - j, JSON_C_TO_STRING_PRETTY) - : "no-info"); + j != nullptr ? json_object_to_json_string_ext( + j, JSON_C_TO_STRING_PRETTY) + : "no-info"); rc = -EINVAL; } }); - if (rc2 < 0) + if (rc2 < 0) { rc = rc2; + } if (rc >= 0) { this->labels.insert(this->labels.end(), label); @@ -315,30 +322,30 @@ int AFBClient::Impl::activateSurface(const char *label) { TRACE(); json_object *j = json_object_new_object(); json_object_object_add(j, "drawing_name", json_object_new_string(label)); - return api_call(loop, wsj1, "activate_surface", j, [](bool ok, - json_object *j) { - if (!ok) { - fprintf( - stderr, "API Call activate_surface() failed: %s\n", - j ? json_object_to_json_string_ext(j, JSON_C_TO_STRING_PRETTY) - : "no-info"); - } - }); + return api_call( + loop, wsj1, "activate_surface", j, [](bool ok, json_object *j) { + if (!ok) { + fprintf(stderr, "API Call activate_surface() failed: %s\n", + j != nullptr ? json_object_to_json_string_ext( + j, JSON_C_TO_STRING_PRETTY) + : "no-info"); + } + }); } int AFBClient::Impl::deactivateSurface(const char *label) { TRACE(); json_object *j = json_object_new_object(); json_object_object_add(j, "drawing_name", json_object_new_string(label)); - return api_call(loop, wsj1, "deactivate_surface", j, [](bool ok, - json_object *j) { - if (!ok) { - fprintf( - stderr, "API Call deactivate_surface() failed: %s\n", - j ? json_object_to_json_string_ext(j, JSON_C_TO_STRING_PRETTY) - : "no-info"); - } - }); + return api_call( + loop, wsj1, "deactivate_surface", j, [](bool ok, json_object *j) { + if (!ok) { + fprintf(stderr, "API Call deactivate_surface() failed: %s\n", + j != nullptr ? json_object_to_json_string_ext( + j, JSON_C_TO_STRING_PRETTY) + : "no-info"); + } + }); } int AFBClient::Impl::endDraw(const char *label) { @@ -347,10 +354,10 @@ int AFBClient::Impl::endDraw(const char *label) { json_object_object_add(j, "drawing_name", json_object_new_string(label)); return api_call(loop, wsj1, "enddraw", j, [](bool ok, json_object *j) { if (!ok) { - fprintf( - stderr, "API Call endDraw() failed: %s\n", - j ? json_object_to_json_string_ext(j, JSON_C_TO_STRING_PRETTY) - : "no-info"); + fprintf(stderr, "API Call endDraw() failed: %s\n", + j != nullptr ? json_object_to_json_string_ext( + j, JSON_C_TO_STRING_PRETTY) + : "no-info"); } }); } @@ -369,16 +376,16 @@ std::pair make_event_type(char const *et) { // Event have the form "$API/$EVENT", just try to find the first / and // get on with it. char const *et2 = strchr(et, '/'); - if (et2) { + if (et2 != nullptr) { et = et2 + 1; } -#define ET(N, A) \ - do { \ - if (strcasecmp(et, N) == 0) \ - return std::make_pair( \ - true, CONCAT(AFBClient::Event_, A)); \ - } while (0) +#define ET(N, A) \ + do { \ + if (strcasecmp(et, N) == 0) \ + return std::pair( \ + true, CONCAT(AFBClient::Event_, A)); \ + } while (false) ET("activated", Active); ET("deactivated", Inactive); @@ -388,8 +395,8 @@ std::pair make_event_type(char const *et) { ET("flushdraw", FlushDraw); #undef ET - return std::make_pair(false, - AFBClient::Event_Active); + return std::pair(false, + AFBClient::Event_Active); } } // namespace @@ -403,7 +410,9 @@ void AFBClient::Impl::event(char const *et, char const *label) { auto i = this->handlers.find(oet.second); if (i != this->handlers.end()) { - i->second(label); + if (this->labels.find(label) != this->labels.end()) { + i->second(label); + } } }