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