142103316Sopenharmony_ci/* 242103316Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 342103316Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 442103316Sopenharmony_ci * you may not use this file except in compliance with the License. 542103316Sopenharmony_ci * You may obtain a copy of the License at 642103316Sopenharmony_ci * 742103316Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 842103316Sopenharmony_ci * 942103316Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1042103316Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1142103316Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1242103316Sopenharmony_ci * See the License for the specific language governing permissions and 1342103316Sopenharmony_ci * limitations under the License. 1442103316Sopenharmony_ci */ 1542103316Sopenharmony_ci 1642103316Sopenharmony_ci#ifndef USB_INTERFACE_H 1742103316Sopenharmony_ci#define USB_INTERFACE_H 1842103316Sopenharmony_ci 1942103316Sopenharmony_ci#include <iostream> 2042103316Sopenharmony_ci#include <sstream> 2142103316Sopenharmony_ci#include <string> 2242103316Sopenharmony_ci#include <vector> 2342103316Sopenharmony_ci#include <optional> 2442103316Sopenharmony_ci#include "usb_endpoint.h" 2542103316Sopenharmony_ci 2642103316Sopenharmony_cinamespace OHOS { 2742103316Sopenharmony_cinamespace USB { 2842103316Sopenharmony_ciclass UsbInterface { 2942103316Sopenharmony_cipublic: 3042103316Sopenharmony_ci UsbInterface(int32_t id, 3142103316Sopenharmony_ci int32_t protocol, 3242103316Sopenharmony_ci int32_t interfaceClass, 3342103316Sopenharmony_ci int32_t subClass, 3442103316Sopenharmony_ci int32_t alternateSetting, 3542103316Sopenharmony_ci std::string name, 3642103316Sopenharmony_ci std::vector<USBEndpoint> endpoints) 3742103316Sopenharmony_ci { 3842103316Sopenharmony_ci this->id_ = id; 3942103316Sopenharmony_ci this->protocol_ = protocol; 4042103316Sopenharmony_ci this->klass_ = interfaceClass; 4142103316Sopenharmony_ci this->subClass_ = subClass; 4242103316Sopenharmony_ci this->alternateSetting_ = alternateSetting; 4342103316Sopenharmony_ci this->endpoints_ = endpoints; 4442103316Sopenharmony_ci } 4542103316Sopenharmony_ci 4642103316Sopenharmony_ci explicit UsbInterface(const cJSON *interface) 4742103316Sopenharmony_ci { 4842103316Sopenharmony_ci if (interface == nullptr) { 4942103316Sopenharmony_ci USB_HILOGE(MODULE_USB_SERVICE, "interface pointer is nullptr"); 5042103316Sopenharmony_ci } 5142103316Sopenharmony_ci id_ = GetIntValue(interface, "id"); 5242103316Sopenharmony_ci protocol_ = GetIntValue(interface, "protocol"); 5342103316Sopenharmony_ci klass_ = GetIntValue(interface, "clazz"); 5442103316Sopenharmony_ci subClass_ = GetIntValue(interface, "subClass"); 5542103316Sopenharmony_ci alternateSetting_ = GetIntValue(interface, "alternateSetting"); 5642103316Sopenharmony_ci name_ = GetStringValue(interface, "name"); 5742103316Sopenharmony_ci 5842103316Sopenharmony_ci cJSON *endpoints = cJSON_GetObjectItem(interface, "endpoints"); 5942103316Sopenharmony_ci for (int i = 0; i < cJSON_GetArraySize(endpoints); i++) { 6042103316Sopenharmony_ci cJSON *jsonEp = cJSON_GetArrayItem(endpoints, i); 6142103316Sopenharmony_ci if (jsonEp == nullptr) { 6242103316Sopenharmony_ci USB_HILOGE(MODULE_USB_SERVICE, "get item nullptr"); 6342103316Sopenharmony_ci continue; 6442103316Sopenharmony_ci } 6542103316Sopenharmony_ci USBEndpoint ep(jsonEp); 6642103316Sopenharmony_ci endpoints_.emplace_back(ep); 6742103316Sopenharmony_ci } 6842103316Sopenharmony_ci } 6942103316Sopenharmony_ci 7042103316Sopenharmony_ci UsbInterface() {} 7142103316Sopenharmony_ci 7242103316Sopenharmony_ci static int GetIntValue(const cJSON *jsonObject, const char *key) 7342103316Sopenharmony_ci { 7442103316Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(jsonObject, key); 7542103316Sopenharmony_ci if (item != nullptr && cJSON_IsNumber(item)) { 7642103316Sopenharmony_ci return item->valueint; 7742103316Sopenharmony_ci } else { 7842103316Sopenharmony_ci USB_HILOGE(MODULE_USB_SERVICE, "Invalid or missing %s field", key); 7942103316Sopenharmony_ci return 0; 8042103316Sopenharmony_ci } 8142103316Sopenharmony_ci } 8242103316Sopenharmony_ci 8342103316Sopenharmony_ci static std::string GetStringValue(const cJSON *jsonObject, const char *key) 8442103316Sopenharmony_ci { 8542103316Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(jsonObject, key); 8642103316Sopenharmony_ci if (item != nullptr && cJSON_IsString(item)) { 8742103316Sopenharmony_ci return item->valuestring; 8842103316Sopenharmony_ci } else { 8942103316Sopenharmony_ci USB_HILOGE(MODULE_USB_SERVICE, "Invalid or missing %s field", key); 9042103316Sopenharmony_ci return ""; 9142103316Sopenharmony_ci } 9242103316Sopenharmony_ci } 9342103316Sopenharmony_ci 9442103316Sopenharmony_ci const std::string &GetName() const 9542103316Sopenharmony_ci { 9642103316Sopenharmony_ci return name_; 9742103316Sopenharmony_ci } 9842103316Sopenharmony_ci 9942103316Sopenharmony_ci int32_t GetId() const 10042103316Sopenharmony_ci { 10142103316Sopenharmony_ci return id_; 10242103316Sopenharmony_ci } 10342103316Sopenharmony_ci 10442103316Sopenharmony_ci int32_t GetClass() const 10542103316Sopenharmony_ci { 10642103316Sopenharmony_ci return klass_; 10742103316Sopenharmony_ci } 10842103316Sopenharmony_ci 10942103316Sopenharmony_ci int32_t GetSubClass() const 11042103316Sopenharmony_ci { 11142103316Sopenharmony_ci return subClass_; 11242103316Sopenharmony_ci } 11342103316Sopenharmony_ci 11442103316Sopenharmony_ci int32_t GetAlternateSetting() const 11542103316Sopenharmony_ci { 11642103316Sopenharmony_ci return alternateSetting_; 11742103316Sopenharmony_ci } 11842103316Sopenharmony_ci 11942103316Sopenharmony_ci int32_t GetProtocol() const 12042103316Sopenharmony_ci { 12142103316Sopenharmony_ci return protocol_; 12242103316Sopenharmony_ci } 12342103316Sopenharmony_ci 12442103316Sopenharmony_ci int32_t GetEndpointCount() const 12542103316Sopenharmony_ci { 12642103316Sopenharmony_ci return endpoints_.size(); 12742103316Sopenharmony_ci } 12842103316Sopenharmony_ci 12942103316Sopenharmony_ci std::optional<USBEndpoint> GetEndpoint(uint32_t index) const 13042103316Sopenharmony_ci { 13142103316Sopenharmony_ci if (index >= endpoints_.size()) { 13242103316Sopenharmony_ci USB_HILOGE(MODULE_USB_INNERKIT, "invalid index=%{public}u !", index); 13342103316Sopenharmony_ci return std::nullopt; 13442103316Sopenharmony_ci } 13542103316Sopenharmony_ci 13642103316Sopenharmony_ci return endpoints_[index]; 13742103316Sopenharmony_ci } 13842103316Sopenharmony_ci 13942103316Sopenharmony_ci std::vector<USBEndpoint> &GetEndpoints() 14042103316Sopenharmony_ci { 14142103316Sopenharmony_ci return endpoints_; 14242103316Sopenharmony_ci } 14342103316Sopenharmony_ci 14442103316Sopenharmony_ci void SetEndpoints(const std::vector<USBEndpoint> &eps) 14542103316Sopenharmony_ci { 14642103316Sopenharmony_ci endpoints_ = eps; 14742103316Sopenharmony_ci } 14842103316Sopenharmony_ci 14942103316Sopenharmony_ci void SetId(int32_t id) 15042103316Sopenharmony_ci { 15142103316Sopenharmony_ci id_ = id; 15242103316Sopenharmony_ci } 15342103316Sopenharmony_ci 15442103316Sopenharmony_ci void SetProtocol(int32_t protocol) 15542103316Sopenharmony_ci { 15642103316Sopenharmony_ci protocol_ = protocol; 15742103316Sopenharmony_ci } 15842103316Sopenharmony_ci 15942103316Sopenharmony_ci void SetClass(int32_t klass) 16042103316Sopenharmony_ci { 16142103316Sopenharmony_ci klass_ = klass; 16242103316Sopenharmony_ci } 16342103316Sopenharmony_ci 16442103316Sopenharmony_ci void SetSubClass(int32_t subClass) 16542103316Sopenharmony_ci { 16642103316Sopenharmony_ci subClass_ = subClass; 16742103316Sopenharmony_ci } 16842103316Sopenharmony_ci 16942103316Sopenharmony_ci void SetAlternateSetting(int32_t alternateSetting) 17042103316Sopenharmony_ci { 17142103316Sopenharmony_ci alternateSetting_ = alternateSetting; 17242103316Sopenharmony_ci } 17342103316Sopenharmony_ci 17442103316Sopenharmony_ci void SetName(const std::string &name) 17542103316Sopenharmony_ci { 17642103316Sopenharmony_ci name_ = name; 17742103316Sopenharmony_ci } 17842103316Sopenharmony_ci 17942103316Sopenharmony_ci ~UsbInterface() {} 18042103316Sopenharmony_ci 18142103316Sopenharmony_ci std::string ToString() const 18242103316Sopenharmony_ci { 18342103316Sopenharmony_ci std::ostringstream ss; 18442103316Sopenharmony_ci ss << "id=" << id_ << "," 18542103316Sopenharmony_ci << "name_=" << name_ << "," 18642103316Sopenharmony_ci << "iInterface_=" << (int32_t)iInterface_ << "," 18742103316Sopenharmony_ci << "klass_=" << klass_ << "," 18842103316Sopenharmony_ci << "subClass_=" << subClass_ << "," 18942103316Sopenharmony_ci << "protocol_=" << protocol_ << "," 19042103316Sopenharmony_ci << "alternateSetting_=" << alternateSetting_ << ""; 19142103316Sopenharmony_ci std::string str = "UsbInterface[" + ss.str() + "]; "; 19242103316Sopenharmony_ci ss.str(""); 19342103316Sopenharmony_ci for (size_t i = 0; i < endpoints_.size(); ++i) { 19442103316Sopenharmony_ci const USBEndpoint &endpoint = endpoints_[i]; 19542103316Sopenharmony_ci str += endpoint.ToString(); 19642103316Sopenharmony_ci } 19742103316Sopenharmony_ci return str; 19842103316Sopenharmony_ci } 19942103316Sopenharmony_ci 20042103316Sopenharmony_ci void SetiInterface(uint8_t idx) 20142103316Sopenharmony_ci { 20242103316Sopenharmony_ci this->iInterface_ = idx; 20342103316Sopenharmony_ci } 20442103316Sopenharmony_ci 20542103316Sopenharmony_ci uint8_t GetiInterface() 20642103316Sopenharmony_ci { 20742103316Sopenharmony_ci return this->iInterface_; 20842103316Sopenharmony_ci } 20942103316Sopenharmony_ci 21042103316Sopenharmony_ci const std::string getJsonString() const 21142103316Sopenharmony_ci { 21242103316Sopenharmony_ci cJSON* interface = cJSON_CreateObject(); 21342103316Sopenharmony_ci if (!interface) { 21442103316Sopenharmony_ci USB_HILOGE(MODULE_USB_SERVICE, "Create interface error"); 21542103316Sopenharmony_ci return ""; 21642103316Sopenharmony_ci } 21742103316Sopenharmony_ci cJSON_AddNumberToObject(interface, "id", static_cast<double>(id_)); 21842103316Sopenharmony_ci cJSON_AddNumberToObject(interface, "protocol", static_cast<double>(protocol_)); 21942103316Sopenharmony_ci cJSON_AddNumberToObject(interface, "clazz", static_cast<double>(klass_)); 22042103316Sopenharmony_ci cJSON_AddNumberToObject(interface, "subClass", static_cast<double>(subClass_)); 22142103316Sopenharmony_ci cJSON_AddNumberToObject(interface, "alternateSetting", alternateSetting_); 22242103316Sopenharmony_ci cJSON_AddStringToObject(interface, "name", name_.c_str()); 22342103316Sopenharmony_ci cJSON* endpoints = cJSON_CreateArray(); 22442103316Sopenharmony_ci if (!endpoints) { 22542103316Sopenharmony_ci USB_HILOGE(MODULE_USB_SERVICE, "Create endpoints error"); 22642103316Sopenharmony_ci cJSON_Delete(interface); 22742103316Sopenharmony_ci return ""; 22842103316Sopenharmony_ci } 22942103316Sopenharmony_ci for (size_t i = 0; i < endpoints_.size(); ++i) { 23042103316Sopenharmony_ci const USBEndpoint &ep = endpoints_[i]; 23142103316Sopenharmony_ci cJSON* pEp = cJSON_Parse(ep.getJsonString().c_str()); 23242103316Sopenharmony_ci cJSON_AddItemToArray(endpoints, pEp); 23342103316Sopenharmony_ci } 23442103316Sopenharmony_ci cJSON_AddItemToObject(interface, "endpoints", endpoints); 23542103316Sopenharmony_ci char *pInterface = cJSON_PrintUnformatted(interface); 23642103316Sopenharmony_ci cJSON_Delete(interface); 23742103316Sopenharmony_ci if (!pInterface) { 23842103316Sopenharmony_ci USB_HILOGE(MODULE_USB_SERVICE, "Print interface error"); 23942103316Sopenharmony_ci return ""; 24042103316Sopenharmony_ci } 24142103316Sopenharmony_ci std::string interfaceJsonStr(pInterface); 24242103316Sopenharmony_ci cJSON_free(pInterface); 24342103316Sopenharmony_ci return interfaceJsonStr; 24442103316Sopenharmony_ci } 24542103316Sopenharmony_ci 24642103316Sopenharmony_ciprivate: 24742103316Sopenharmony_ci int32_t id_ = INT32_MAX; 24842103316Sopenharmony_ci int32_t protocol_ = INT32_MAX; 24942103316Sopenharmony_ci int32_t klass_ = INT32_MAX; 25042103316Sopenharmony_ci int32_t subClass_ = INT32_MAX; 25142103316Sopenharmony_ci int32_t alternateSetting_ = INT32_MAX; 25242103316Sopenharmony_ci std::string name_; 25342103316Sopenharmony_ci std::vector<USBEndpoint> endpoints_; 25442103316Sopenharmony_ci uint8_t iInterface_ = UINT8_MAX; 25542103316Sopenharmony_ci}; 25642103316Sopenharmony_ci} // namespace USB 25742103316Sopenharmony_ci} // namespace OHOS 25842103316Sopenharmony_ci 25942103316Sopenharmony_ci#endif // USB_INTERFACE_H 260