• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "Weaver.h"
18 
19 #include <android-base/logging.h>
20 
21 #include <Weaver.h>
22 #include <Weaver.client.h>
23 
24 namespace android {
25 namespace hardware {
26 namespace weaver {
27 
28 // libhidl
29 using ::android::hardware::Void;
30 
31 // HAL
32 using ::android::hardware::weaver::V1_0::WeaverConfig;
33 using ::android::hardware::weaver::V1_0::WeaverReadResponse;
34 using ::android::hardware::weaver::V1_0::WeaverReadStatus;
35 
36 // Weaver app
37 using ::nugget::app::weaver::GetConfigRequest;
38 using ::nugget::app::weaver::GetConfigResponse;
39 using ::nugget::app::weaver::ReadRequest;
40 using ::nugget::app::weaver::ReadResponse;
41 using ::nugget::app::weaver::WriteRequest;
42 using ::nugget::app::weaver::WriteResponse;
43 
44 // Methods from ::android::hardware::weaver::V1_0::IWeaver follow.
getConfig(getConfig_cb _hidl_cb)45 Return<void> Weaver::getConfig(getConfig_cb _hidl_cb) {
46     LOG(VERBOSE) << "Running Weaver::getNumSlots";
47 
48     GetConfigRequest request;
49     GetConfigResponse response;
50     const uint32_t appStatus = _weaver.GetConfig(request, &response);
51 
52     if (appStatus != APP_SUCCESS) {
53         LOG(ERROR) << "App GetConfig request failed with status " << appStatus;
54         _hidl_cb(WeaverStatus::FAILED, WeaverConfig{});
55         return Void();
56     }
57 
58     _hidl_cb(WeaverStatus::OK,
59              WeaverConfig{response.number_of_slots(), response.key_size(), response.value_size()});
60     return Void();
61 }
62 
write(uint32_t slotId,const hidl_vec<uint8_t> & key,const hidl_vec<uint8_t> & value)63 Return<WeaverStatus> Weaver::write(uint32_t slotId, const hidl_vec<uint8_t>& key,
64                            const hidl_vec<uint8_t>& value) {
65     LOG(INFO) << "Running Weaver::write on slot " << slotId;
66 
67     WriteRequest request;
68     request.set_slot(slotId);
69     request.set_key(key.data(), key.size());
70     request.set_value(value.data(), value.size());
71     WriteResponse response;
72     const uint32_t appStatus = _weaver.Write(request, &response);
73 
74     if (appStatus != APP_SUCCESS) {
75         LOG(ERROR) << "App Write request failed with status " << appStatus;
76         return WeaverStatus::FAILED;
77     }
78 
79     return WeaverStatus::OK;
80 }
81 
read(uint32_t slotId,const hidl_vec<uint8_t> & key,read_cb _hidl_cb)82 Return<void> Weaver::read(uint32_t slotId, const hidl_vec<uint8_t>& key, read_cb _hidl_cb) {
83     LOG(VERBOSE) << "Running Weaver::read on slot " << slotId;
84 
85     ReadRequest request;
86     request.set_slot(slotId);
87     request.set_key(key.data(), key.size());
88     ReadResponse response;
89     const uint32_t appStatus = _weaver.Read(request, &response);
90 
91     if (appStatus != APP_SUCCESS) {
92         LOG(ERROR) << "App Read request failed with status " << appStatus;
93         _hidl_cb(WeaverReadStatus::FAILED, WeaverReadResponse{});
94         return Void();
95     }
96 
97     WeaverReadStatus status;
98     hidl_vec<uint8_t> value;
99     uint32_t timeout = 0;
100     switch (response.error()) {
101     case ReadResponse::NONE:
102         status = WeaverReadStatus::OK;
103         value.setToExternal(reinterpret_cast<uint8_t*>(const_cast<char*>(response.value().data())),
104                             response.value().size(), false);
105         break;
106     case ReadResponse::WRONG_KEY:
107         status = WeaverReadStatus::INCORRECT_KEY;
108         timeout = response.throttle_msec();
109         LOG(WARNING) << "Wrong key used when reading slot " << slotId
110                      << ", throttling for " << timeout << " ms";
111         break;
112     case ReadResponse::THROTTLE:
113         status = WeaverReadStatus::THROTTLE;
114         timeout = response.throttle_msec();
115         LOG(WARNING) << "Attempted to read slot " << slotId << " when throttling is active for "
116                      << timeout << " ms more";
117         break;
118     default:
119         LOG(ERROR) << "Unexpected error code from app (" << response.error() << ")";
120         status = WeaverReadStatus::FAILED;
121         break;
122     }
123 
124     _hidl_cb(status, WeaverReadResponse{timeout, value});
125     return Void();
126 }
127 
128 } // namespace weaver
129 } // namespace hardware
130 } // namespace android
131