1 /*
2 * Copyright (C) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "image_common.h"
16 #include "image_common_impl.h"
17 #include "image_utils.h"
18 #include "exif_metadata.h"
19 #include "image_type.h"
20 #include "fragment_metadata.h"
21 #include "securec.h"
22 #include "common_utils.h"
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26
27 MIDK_EXPORT
OH_PictureMetadata_Create(Image_MetadataType metadataType,OH_PictureMetadata ** metadata)28 Image_ErrorCode OH_PictureMetadata_Create(Image_MetadataType metadataType, OH_PictureMetadata **metadata)
29 {
30 if (metadata == nullptr) {
31 return IMAGE_BAD_PARAMETER;
32 }
33 std::shared_ptr<OHOS::Media::ImageMetadata> metadataPtr = nullptr;
34 if (metadataType == EXIF_METADATA) {
35 metadataPtr = std::make_shared<OHOS::Media::ExifMetadata>();
36 auto exifMetadata = static_cast<OHOS::Media::ExifMetadata *>(metadataPtr.get());
37 exifMetadata->CreateExifdata();
38 } else if (metadataType == FRAGMENT_METADATA) {
39 metadataPtr = std::make_shared<OHOS::Media::FragmentMetadata>();
40 } else {
41 return IMAGE_BAD_PARAMETER;
42 }
43
44 if (!metadataPtr) {
45 return IMAGE_ALLOC_FAILED;
46 }
47 *metadata = new OH_PictureMetadata(metadataPtr);
48 return IMAGE_SUCCESS;
49 }
50
51 MIDK_EXPORT
OH_PictureMetadata_GetProperty(OH_PictureMetadata * metadata,Image_String * key,Image_String * value)52 Image_ErrorCode OH_PictureMetadata_GetProperty(OH_PictureMetadata *metadata, Image_String *key, Image_String *value)
53 {
54 if (metadata == nullptr || key == nullptr || key->data == nullptr || key->size == 0 || value == nullptr) {
55 return IMAGE_BAD_PARAMETER;
56 }
57 if (!metadata->GetInnerAuxiliaryMetadata()) {
58 return IMAGE_BAD_PARAMETER;
59 }
60 std::string keyString(key->data, key->size);
61 std::string val;
62 uint32_t errorCode = static_cast<uint32_t>(metadata->GetInnerAuxiliaryMetadata()->GetValue(keyString, val));
63 if (errorCode != IMAGE_SUCCESS || val.empty()) {
64 return IMAGE_UNSUPPORTED_METADATA;
65 }
66 if (value->size != 0 && value->size < val.size()) {
67 return IMAGE_BAD_PARAMETER;
68 }
69 value->size = (value->size == 0) ? val.size() : value->size;
70 auto uniptrTmp = std::make_unique<char[]>(value->size);
71 if (uniptrTmp == nullptr) {
72 return IMAGE_ALLOC_FAILED;
73 }
74 if (EOK != memcpy_s(uniptrTmp.get(), value->size, val.c_str(), val.size())) {
75 return IMAGE_COPY_FAILED;
76 }
77 value->data = uniptrTmp.release();
78 return IMAGE_SUCCESS;
79 }
80
81 MIDK_EXPORT
OH_PictureMetadata_SetProperty(OH_PictureMetadata * metadata,Image_String * key,Image_String * value)82 Image_ErrorCode OH_PictureMetadata_SetProperty(OH_PictureMetadata *metadata, Image_String *key, Image_String *value)
83 {
84 if (metadata == nullptr || key == nullptr || key->data == nullptr || key->size == 0 ||
85 value == nullptr || value->data == nullptr || value->size == 0) {
86 return IMAGE_BAD_PARAMETER;
87 }
88 if (!metadata->GetInnerAuxiliaryMetadata()) {
89 return IMAGE_BAD_PARAMETER;
90 }
91 std::string keyString(key->data, key->size);
92 std::string valueString(value->data, value->size);
93 if (keyString.empty() || valueString.empty()) {
94 return IMAGE_BAD_PARAMETER;
95 }
96
97 if (metadata->GetInnerAuxiliaryMetadata()->GetType() == OHOS::Media::MetadataType::FRAGMENT) {
98 uint32_t casted;
99 if (!OHOS::Media::ImageUtils::StrToUint32(valueString, casted)) {
100 return IMAGE_BAD_PARAMETER;
101 }
102 }
103
104 bool isSucc = metadata->GetInnerAuxiliaryMetadata()->SetValue(keyString, valueString);
105 if (isSucc != true) {
106 return IMAGE_UNSUPPORTED_METADATA;
107 }
108 return IMAGE_SUCCESS;
109 }
110
111 MIDK_EXPORT
OH_PictureMetadata_Release(OH_PictureMetadata * metadata)112 Image_ErrorCode OH_PictureMetadata_Release(OH_PictureMetadata *metadata)
113 {
114 if (metadata == nullptr) {
115 return IMAGE_BAD_PARAMETER;
116 }
117 delete metadata;
118 metadata = nullptr;
119 return IMAGE_SUCCESS;
120 }
121
OH_PictureMetadata_Clone(OH_PictureMetadata * oldMetadata,OH_PictureMetadata ** newMetadata)122 Image_ErrorCode OH_PictureMetadata_Clone(OH_PictureMetadata *oldMetadata, OH_PictureMetadata **newMetadata)
123 {
124 if (oldMetadata == nullptr || newMetadata == nullptr || !oldMetadata->GetInnerAuxiliaryMetadata()) {
125 return IMAGE_BAD_PARAMETER;
126 }
127 auto cloneMetadataInner = oldMetadata->GetInnerAuxiliaryMetadata()->CloneMetadata();
128 if (!cloneMetadataInner) {
129 return IMAGE_COPY_FAILED;
130 }
131 auto cloneMetadataNative = std::make_unique<OH_PictureMetadata>(cloneMetadataInner);
132 if (!cloneMetadataNative) {
133 return IMAGE_ALLOC_FAILED;
134 }
135 *newMetadata = cloneMetadataNative.release();
136 return IMAGE_SUCCESS;
137 }
138
139 #ifdef __cplusplus
140 };
141 #endif