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