From 64bc6bf1376842bf7818811981287de34a2cc81f Mon Sep 17 00:00:00 2001 From: "michal.szwaj" Date: Wed, 4 Apr 2018 20:02:36 +0200 Subject: [PATCH 1/4] Handle ping request/response --- .../Channel/Control/ControlServiceChannel.hpp | 2 ++ .../Control/IControlServiceChannel.hpp | 2 ++ .../IControlServiceChannelEventHandler.hpp | 2 ++ src/Channel/Control/ControlServiceChannel.cpp | 25 +++++++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/include/f1x/aasdk/Channel/Control/ControlServiceChannel.hpp b/include/f1x/aasdk/Channel/Control/ControlServiceChannel.hpp index 4a239a3..fbe7db2 100644 --- a/include/f1x/aasdk/Channel/Control/ControlServiceChannel.hpp +++ b/include/f1x/aasdk/Channel/Control/ControlServiceChannel.hpp @@ -47,6 +47,7 @@ public: void sendShutdownRequest(const proto::messages::ShutdownRequest& request, SendPromise::Pointer promise) override; void sendShutdownResponse(const proto::messages::ShutdownResponse& response, SendPromise::Pointer promise) override; void sendNavigationFocusResponse(const proto::messages::NavigationFocusResponse& respons, SendPromise::Pointer promisee) override; + void sendPingRequest(const proto::messages::PingRequest& request, SendPromise::Pointer promise) override; private: using std::enable_shared_from_this::shared_from_this; @@ -58,6 +59,7 @@ private: void handleShutdownRequest(const common::DataConstBuffer& payload, IControlServiceChannelEventHandler::Pointer eventHandler); void handleShutdownResponse(const common::DataConstBuffer& payload, IControlServiceChannelEventHandler::Pointer eventHandler); void handleNavigationFocusRequest(const common::DataConstBuffer& payload, IControlServiceChannelEventHandler::Pointer eventHandler); + void handlePingResponse(const common::DataConstBuffer& payload, IControlServiceChannelEventHandler::Pointer eventHandler); }; } diff --git a/include/f1x/aasdk/Channel/Control/IControlServiceChannel.hpp b/include/f1x/aasdk/Channel/Control/IControlServiceChannel.hpp index 5abcbcd..518533b 100644 --- a/include/f1x/aasdk/Channel/Control/IControlServiceChannel.hpp +++ b/include/f1x/aasdk/Channel/Control/IControlServiceChannel.hpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -56,6 +57,7 @@ public: virtual void sendShutdownRequest(const proto::messages::ShutdownRequest& request, SendPromise::Pointer promise) = 0; virtual void sendShutdownResponse(const proto::messages::ShutdownResponse& response, SendPromise::Pointer promise) = 0; virtual void sendNavigationFocusResponse(const proto::messages::NavigationFocusResponse& response, SendPromise::Pointer promise) = 0; + virtual void sendPingRequest(const proto::messages::PingRequest& request, SendPromise::Pointer promise) = 0; }; } diff --git a/include/f1x/aasdk/Channel/Control/IControlServiceChannelEventHandler.hpp b/include/f1x/aasdk/Channel/Control/IControlServiceChannelEventHandler.hpp index dddf605..f8b82cc 100644 --- a/include/f1x/aasdk/Channel/Control/IControlServiceChannelEventHandler.hpp +++ b/include/f1x/aasdk/Channel/Control/IControlServiceChannelEventHandler.hpp @@ -26,6 +26,7 @@ #include #include #include +#include namespace f1x { @@ -51,6 +52,7 @@ public: virtual void onShutdownRequest(const proto::messages::ShutdownRequest& request) = 0; virtual void onShutdownResponse(const proto::messages::ShutdownResponse& response) = 0; virtual void onNavigationFocusRequest(const proto::messages::NavigationFocusRequest& request) = 0; + virtual void onPingResponse(const proto::messages::PingResponse& response) = 0; virtual void onChannelError(const error::Error& e) = 0; }; diff --git a/src/Channel/Control/ControlServiceChannel.cpp b/src/Channel/Control/ControlServiceChannel.cpp index 00b1ef3..88816e8 100644 --- a/src/Channel/Control/ControlServiceChannel.cpp +++ b/src/Channel/Control/ControlServiceChannel.cpp @@ -115,6 +115,15 @@ void ControlServiceChannel::sendNavigationFocusResponse(const proto::messages::N this->send(std::move(message), std::move(promise)); } +void ControlServiceChannel::sendPingRequest(const proto::messages::PingRequest& request, SendPromise::Pointer promise) +{ + auto message(std::make_shared(channelId_, messenger::EncryptionType::ENCRYPTED, messenger::MessageType::SPECIFIC)); + message->insertPayload(messenger::MessageId(proto::ids::ControlMessage::PING_REQUEST).getData()); + message->insertPayload(request); + + this->send(std::move(message), std::move(promise)); +} + void ControlServiceChannel::receive(IControlServiceChannelEventHandler::Pointer eventHandler) { auto receivePromise = messenger::ReceivePromise::defer(strand_); @@ -152,6 +161,9 @@ void ControlServiceChannel::messageHandler(messenger::Message::Pointer message, case proto::ids::ControlMessage::NAVIGATION_FOCUS_REQUEST: this->handleNavigationFocusRequest(payload, std::move(eventHandler)); break; + case proto::ids::ControlMessage::PING_RESPONSE: + this->handlePingResponse(payload, std::move(eventHandler)); + break; default: AASDK_LOG(error) << "[ControlServiceChannel] message not handled: " << messageId.getId(); this->receive(std::move(eventHandler)); @@ -236,6 +248,19 @@ void ControlServiceChannel::handleNavigationFocusRequest(const common::DataConst } } +void ControlServiceChannel::handlePingResponse(const common::DataConstBuffer& payload, IControlServiceChannelEventHandler::Pointer eventHandler) +{ + proto::messages::PingResponse response; + if(response.ParseFromArray(payload.cdata, payload.size)) + { + eventHandler->onPingResponse(response); + } + else + { + eventHandler->onChannelError(error::Error(error::ErrorCode::PARSE_PAYLOAD)); + } +} + } } } From f7f286f0ddb1bd99274ae19997343d275da67d69 Mon Sep 17 00:00:00 2001 From: "michal.szwaj" Date: Fri, 6 Apr 2018 00:49:04 +0200 Subject: [PATCH 2/4] Ping message can be unencrypted. --- src/Channel/Control/ControlServiceChannel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Channel/Control/ControlServiceChannel.cpp b/src/Channel/Control/ControlServiceChannel.cpp index 88816e8..773ef23 100644 --- a/src/Channel/Control/ControlServiceChannel.cpp +++ b/src/Channel/Control/ControlServiceChannel.cpp @@ -117,7 +117,7 @@ void ControlServiceChannel::sendNavigationFocusResponse(const proto::messages::N void ControlServiceChannel::sendPingRequest(const proto::messages::PingRequest& request, SendPromise::Pointer promise) { - auto message(std::make_shared(channelId_, messenger::EncryptionType::ENCRYPTED, messenger::MessageType::SPECIFIC)); + auto message(std::make_shared(channelId_, messenger::EncryptionType::PLAIN, messenger::MessageType::SPECIFIC)); message->insertPayload(messenger::MessageId(proto::ids::ControlMessage::PING_REQUEST).getData()); message->insertPayload(request); From f32998d8719a734b33ac4fd0ec78b8e17592a815 Mon Sep 17 00:00:00 2001 From: "michal.szwaj" Date: Sat, 7 Apr 2018 13:28:42 +0200 Subject: [PATCH 3/4] Fix hanging resources when accessories enumeration is cancelled --- src/USB/ConnectedAccessoriesEnumerator.cpp | 6 ++++- src/USB/ConnectedAccessoriesEnumerator.ut.cpp | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/USB/ConnectedAccessoriesEnumerator.cpp b/src/USB/ConnectedAccessoriesEnumerator.cpp index 75758fa..1d0dc5c 100644 --- a/src/USB/ConnectedAccessoriesEnumerator.cpp +++ b/src/USB/ConnectedAccessoriesEnumerator.cpp @@ -69,7 +69,6 @@ void ConnectedAccessoriesEnumerator::cancel() if(queryChain_ != nullptr) { queryChain_->cancel(); - queryChain_.reset(); } }); } @@ -92,6 +91,11 @@ void ConnectedAccessoriesEnumerator::queryNextDevice() { this->queryNextDevice(); } + else + { + promise_->reject(e); + this->reset(); + } }); queryChain_->start(std::move(deviceHandle), std::move(queryChainPromise)); diff --git a/src/USB/ConnectedAccessoriesEnumerator.ut.cpp b/src/USB/ConnectedAccessoriesEnumerator.ut.cpp index 297b4d4..d89bb20 100644 --- a/src/USB/ConnectedAccessoriesEnumerator.ut.cpp +++ b/src/USB/ConnectedAccessoriesEnumerator.ut.cpp @@ -205,6 +205,32 @@ BOOST_FIXTURE_TEST_CASE(ConnectedAccessoriesEnumerator_OpenDeviceFailed, Connect ioService_.run(); } +BOOST_FIXTURE_TEST_CASE(ConnectedAccessoriesEnumerator_CancelEnumeration, ConnectedAccessoriesEnumeratorUnitTest) +{ + deviceList_.push_back(reinterpret_cast(1)); + EXPECT_CALL(queryChainFactoryMock_, create()).WillOnce(Return(queryChain_)); + auto connectedAccessoriesEnumerator(std::make_shared(usbWrapperMock_, ioService_, queryChainFactoryMock_)); + + EXPECT_CALL(usbWrapperMock_, getDeviceList(_)).WillOnce(DoAll(SetArgReferee<0>(deviceListHandle_), Return(0))); + connectedAccessoriesEnumerator->enumerate(std::move(promise_)); + + EXPECT_CALL(usbWrapperMock_, open(*deviceList_.begin(), _)).WillOnce(DoAll(SetArgReferee<1>(deviceHandle_), Return(0))); + + IAccessoryModeQueryChain::Promise::Pointer queryChainPromise; + EXPECT_CALL(queryChainMock_, start(deviceHandle_, _)).WillOnce(SaveArg<1>(&queryChainPromise)); + ioService_.run(); + ioService_.reset(); + + EXPECT_CALL(queryChainMock_, cancel()); + connectedAccessoriesEnumerator->cancel(); + + error::Error e(error::ErrorCode::OPERATION_ABORTED); + EXPECT_CALL(promiseHandlerMock_, onResolve(_)).Times(0); + EXPECT_CALL(promiseHandlerMock_, onReject(e)); + queryChainPromise->reject(e); + ioService_.run(); +} + } } }