* Copyright (c) 2021 Huawei Device Co., Ltd.
* 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 "dev_attribute_serialize.h"
#include "hdf_base.h"
#include "hdf_log.h"
#include "osal_mem.h"
#include "securec.h"
#define HDF_LOG_TAG dev_attr_serialze
#define ATTRIBUTE_PRIVATE_DATA_LENGTH_NULL 0
#define ATTRIBUTE_PRIVATE_DATA_LENGTH_NORMAL 1
bool DeviceAttributeSerialize(const struct HdfDeviceInfo *attribute, struct HdfSBuf *sbuf)
{
if (attribute == NULL || sbuf == NULL) {
return false;
}
uint8_t ret = 1;
if (!HdfSbufWriteUint32(sbuf, attribute->deviceId) ||
!HdfSbufWriteUint16(sbuf, attribute->policy) ||
!HdfSbufWriteString(sbuf, attribute->svcName) ||
!HdfSbufWriteString(sbuf, attribute->moduleName)) {
return false;
}
if (attribute->deviceMatchAttr != NULL) {
ret &= HdfSbufWriteUint32(sbuf, ATTRIBUTE_PRIVATE_DATA_LENGTH_NORMAL);
ret &= HdfSbufWriteString(sbuf, attribute->deviceMatchAttr);
} else {
ret &= HdfSbufWriteUint32(sbuf, ATTRIBUTE_PRIVATE_DATA_LENGTH_NULL);
}
if (ret == 0) {
HDF_LOGE("failed to serialize device attribute");
return false;
}
return true;
}
struct HdfDeviceInfo *DeviceAttributeDeserialize(struct HdfSBuf *sbuf)
{
if (sbuf == NULL) {
return NULL;
}
struct HdfDeviceInfo *attribute = HdfDeviceInfoNewInstance();
if (attribute == NULL) {
HDF_LOGE("OsalMemCalloc failed, attribute is null");
return NULL;
}
if (!HdfSbufReadUint32(sbuf, &attribute->deviceId) ||
!HdfSbufReadUint16(sbuf, &attribute->policy)) {
HDF_LOGE("invalid deviceId or policy");
DeviceSerializedAttributeRelease(attribute);
return NULL;
}
do {
const char *svcName = HdfSbufReadString(sbuf);
if (svcName == NULL) {
HDF_LOGE("Read from parcel failed, svcName is null");
break;
}
attribute->svcName = strdup(svcName);
if (attribute->svcName == NULL) {
HDF_LOGE("Read from parcel failed, strdup svcName fail");
break;
}
const char *moduleName = HdfSbufReadString(sbuf);
if (moduleName == NULL) {
HDF_LOGE("Read from parcel failed, driverPath is null");
break;
}
attribute->moduleName = strdup(moduleName);
if (attribute->moduleName == NULL) {
HDF_LOGE("Read from parcel failed, strdup moduleName fail");
break;
}
uint32_t length;
if (!HdfSbufReadUint32(sbuf, &length)) {
HDF_LOGE("Device attribute readDeviceMatchAttr length failed");
break;
}
if (length == ATTRIBUTE_PRIVATE_DATA_LENGTH_NORMAL) {
const char *deviceMatchAttr = HdfSbufReadString(sbuf);
if (deviceMatchAttr == NULL) {
HDF_LOGE("%s: Read from parcel failed, deviceMatchAttr is null", __func__);
break;
}
attribute->deviceMatchAttr = strdup(deviceMatchAttr);
}
return attribute;
} while (0);
DeviceSerializedAttributeRelease(attribute);
return NULL;
}
void DeviceSerializedAttributeRelease(struct HdfDeviceInfo *attribute)
{
if (attribute == NULL) {
return;
}
if (attribute->moduleName != NULL) {
OsalMemFree((void *)attribute->moduleName);
}
if (attribute->svcName != NULL) {
OsalMemFree((void *)attribute->svcName);
}
if (attribute->deviceMatchAttr != NULL) {
OsalMemFree((void *)attribute->deviceMatchAttr);
}
OsalMemFree(attribute);
}