diff options
Diffstat (limited to 'libnos/NuggetClientDebuggable.cpp')
-rw-r--r-- | libnos/NuggetClientDebuggable.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/libnos/NuggetClientDebuggable.cpp b/libnos/NuggetClientDebuggable.cpp new file mode 100644 index 0000000..e4a087d --- /dev/null +++ b/libnos/NuggetClientDebuggable.cpp @@ -0,0 +1,69 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <nos/NuggetClientDebuggable.h> +#include <limits> +#include <nos/transport.h> +#include <application.h> + +namespace nos { + +NuggetClientDebuggable::NuggetClientDebuggable( + const char* name, uint32_t config, + request_cb_t req_fn, response_cb_t resp_fn) + : NuggetClient(name, config), + request_cb_(req_fn), response_cb_(resp_fn) {} + +uint32_t NuggetClientDebuggable::CallApp(uint32_t appId, uint16_t arg, + const std::vector<uint8_t>& request, + std::vector<uint8_t>* response) { + if (!open_) { + return APP_ERROR_IO; + } + + if (request.size() > std::numeric_limits<uint32_t>::max()) { + return APP_ERROR_TOO_MUCH; + } + + const uint32_t requestSize = request.size(); + uint32_t replySize = 0; + uint8_t* replyData = nullptr; + + if (response != nullptr) { + response->resize(response->capacity()); + replySize = response->size(); + replyData = response->data(); + } + + if (request_cb_) { + (request_cb_)(request); + } + + uint32_t status_code = nos_call_application(&device_, appId, arg, + request.data(), requestSize, + replyData, &replySize); + + if (response != nullptr) { + response->resize(replySize); + if (response_cb_) { + (response_cb_)(status_code, *response); + } + } + + return status_code; +} + +} // namespace nos |