1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <nos/NuggetClient.h>
18
19#include <limits>
20
21#include <nos/transport.h>
22
23#include <application.h>
24
25namespace nos {
26
27NuggetClient::NuggetClient()
28    : NuggetClient("") {
29}
30
31NuggetClient::NuggetClient(const std::string& device_name)
32    : device_name_(device_name), open_(false) {
33}
34
35NuggetClient::~NuggetClient() {
36  Close();
37}
38
39void NuggetClient::Open() {
40  if (!open_) {
41    open_ = nos_device_open(
42        device_name_.empty() ? nullptr : device_name_.c_str(), &device_) == 0;
43  }
44}
45
46void NuggetClient::Close() {
47  if (open_) {
48    device_.ops.close(device_.ctx);
49    open_ = false;
50  }
51}
52
53bool NuggetClient::IsOpen() const {
54  return open_;
55}
56
57uint32_t NuggetClient::CallApp(uint32_t appId, uint16_t arg,
58                               const std::vector<uint8_t>& request,
59                               std::vector<uint8_t>* response) {
60  if (!open_) {
61    return APP_ERROR_IO;
62  }
63
64  if (request.size() > std::numeric_limits<uint32_t>::max()) {
65    return APP_ERROR_TOO_MUCH;
66  }
67
68  const uint32_t requestSize = request.size();
69  uint32_t replySize = 0;
70  uint8_t* replyData = nullptr;
71
72  if (response != nullptr) {
73    response->resize(response->capacity());
74    replySize = response->size();
75    replyData = response->data();
76  }
77
78  uint32_t status_code = nos_call_application(&device_, appId, arg,
79                                              request.data(), requestSize,
80                                              replyData, &replySize);
81
82  if (response != nullptr) {
83    response->resize(replySize);
84  }
85
86  return status_code;
87}
88
89nos_device* NuggetClient::Device() {
90  return open_ ? &device_ : nullptr;
91}
92
93const nos_device* NuggetClient::Device() const {
94  return open_ ? &device_ : nullptr;
95}
96
97const std::string& NuggetClient::DeviceName() const {
98  return device_name_;
99}
100
101}  // namespace nos
102