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
16 #include "media_asset_manager_capi.h"
17
18 #include <cstring>
19 #include <securec.h>
20
21 #include "media_log.h"
22 #include "media_asset_base_capi.h"
23 #include "media_asset_data_handler_capi.h"
24 #include "media_asset_magic.h"
25
26 using namespace OHOS::Media;
27
28 const std::string ERROR_REQUEST_ID = "00000000-0000-0000-0000-000000000000";
29
30 struct MediaAssetMangerObject : public OH_MediaAssetManager {
MediaAssetMangerObjectMediaAssetMangerObject31 explicit MediaAssetMangerObject(const std::shared_ptr<MediaAssetManager> &manager)
32 : manager_(manager) {}
33 ~MediaAssetMangerObject() = default;
34
35 const std::shared_ptr<MediaAssetManager> manager_ = nullptr;
36 };
37
OH_MediaAssetManager_Convert(const MediaLibrary_RequestOptions & srcRequestOption,NativeRequestOptions & dstRequestOption)38 void OH_MediaAssetManager_Convert(const MediaLibrary_RequestOptions &srcRequestOption,
39 NativeRequestOptions &dstRequestOption)
40 {
41 dstRequestOption.deliveryMode = static_cast<NativeDeliveryMode>(srcRequestOption.deliveryMode);
42 }
43
OH_MediaAssetManager_Create(void)44 OH_MediaAssetManager *OH_MediaAssetManager_Create(void)
45 {
46 std::shared_ptr<MediaAssetManager> manager = MediaAssetManagerFactory::CreateMediaAssetManager();
47 CHECK_AND_PRINT_LOG(manager != nullptr, "failed to MediaAssetManagerFactory::CreateMediaAssetManager");
48 MediaAssetMangerObject *object = new(std::nothrow) MediaAssetMangerObject(manager);
49 CHECK_AND_PRINT_LOG(object != nullptr, "failed to new MediaAssetMangerObject");
50 return object;
51 }
52
OH_MediaAssetManager_RequestImageForPath(OH_MediaAssetManager * manager,const char * uri,MediaLibrary_RequestOptions requestOptions,const char * destPath,OH_MediaLibrary_OnDataPrepared callback)53 MediaLibrary_RequestId OH_MediaAssetManager_RequestImageForPath(OH_MediaAssetManager* manager, const char* uri,
54 MediaLibrary_RequestOptions requestOptions, const char* destPath, OH_MediaLibrary_OnDataPrepared callback)
55 {
56 MediaLibrary_RequestId requestId;
57 strncpy_s(requestId.requestId, UUID_STR_LENGTH, ERROR_REQUEST_ID.c_str(), UUID_STR_LENGTH);
58
59 CHECK_AND_RETURN_RET_LOG(manager != nullptr, requestId, "input manager is nullptr!");
60 struct MediaAssetMangerObject *managerObj = reinterpret_cast<MediaAssetMangerObject *>(manager);
61 CHECK_AND_RETURN_RET_LOG(managerObj != nullptr, requestId, "managerObj is null");
62 CHECK_AND_RETURN_RET_LOG(managerObj->manager_ != nullptr, requestId, "manager_ is null");
63 CHECK_AND_RETURN_RET_LOG(uri != nullptr, requestId, "uri is null");
64 CHECK_AND_RETURN_RET_LOG(destPath != nullptr, requestId, "destPath is null");
65 CHECK_AND_RETURN_RET_LOG(callback != nullptr, requestId, "callback is null");
66 NativeRequestOptions nativeRequestOptions;
67 OH_MediaAssetManager_Convert(requestOptions, nativeRequestOptions);
68 NativeOnDataPrepared nativeCallback = reinterpret_cast<NativeOnDataPrepared>(callback);
69 CHECK_AND_RETURN_RET_LOG(nativeCallback != nullptr, requestId, "nativeCallback is null");
70
71 std::string requestIdStr = managerObj->manager_->NativeRequestImage(uri, nativeRequestOptions, destPath,
72 nativeCallback);
73 strncpy_s(requestId.requestId, UUID_STR_LENGTH, requestIdStr.c_str(), UUID_STR_LENGTH);
74 return requestId;
75 }
76
OH_MediaAssetManager_RequestVideoForPath(OH_MediaAssetManager * manager,const char * uri,MediaLibrary_RequestOptions requestOptions,const char * destPath,OH_MediaLibrary_OnDataPrepared callback)77 MediaLibrary_RequestId OH_MediaAssetManager_RequestVideoForPath(OH_MediaAssetManager* manager, const char* uri,
78 MediaLibrary_RequestOptions requestOptions, const char* destPath, OH_MediaLibrary_OnDataPrepared callback)
79 {
80 MediaLibrary_RequestId requestId;
81 strncpy_s(requestId.requestId, UUID_STR_LENGTH, ERROR_REQUEST_ID.c_str(), UUID_STR_LENGTH);
82
83 CHECK_AND_RETURN_RET_LOG(manager != nullptr, requestId, "input manager is nullptr!");
84 struct MediaAssetMangerObject *managerObj = reinterpret_cast<MediaAssetMangerObject *>(manager);
85 CHECK_AND_RETURN_RET_LOG(managerObj != nullptr, requestId, "imanagerObj is nullptr!");
86 CHECK_AND_RETURN_RET_LOG(managerObj->manager_ != nullptr, requestId, "manager_ is null");
87 CHECK_AND_RETURN_RET_LOG(uri != nullptr, requestId, "uri is null");
88 CHECK_AND_RETURN_RET_LOG(destPath != nullptr, requestId, "destPath is null");
89 CHECK_AND_RETURN_RET_LOG(callback != nullptr, requestId, "callback is null");
90 NativeRequestOptions nativeRequestOptions;
91 OH_MediaAssetManager_Convert(requestOptions, nativeRequestOptions);
92 NativeOnDataPrepared nativeCallback = reinterpret_cast<NativeOnDataPrepared>(callback);
93 CHECK_AND_RETURN_RET_LOG(nativeCallback != nullptr, requestId, "nativeCallback is null");
94
95 std::string requestIdStr = managerObj->manager_->NativeRequestVideo(uri, nativeRequestOptions, destPath,
96 nativeCallback);
97 strncpy_s(requestId.requestId, UUID_STR_LENGTH, requestIdStr.c_str(), UUID_STR_LENGTH);
98 return requestId;
99 }
100
OH_MediaAssetManager_CancelRequest(OH_MediaAssetManager * manager,const MediaLibrary_RequestId requestId)101 bool OH_MediaAssetManager_CancelRequest(OH_MediaAssetManager* manager, const MediaLibrary_RequestId requestId)
102 {
103 CHECK_AND_RETURN_RET_LOG(manager != nullptr, false, "input manager is nullptr!");
104 struct MediaAssetMangerObject *managerObj = reinterpret_cast<MediaAssetMangerObject *>(manager);
105 CHECK_AND_RETURN_RET_LOG(managerObj != nullptr, false, "managerObj is nullptr!");
106 CHECK_AND_RETURN_RET_LOG(managerObj->manager_ != nullptr, false, "manager_ is null");
107 CHECK_AND_RETURN_RET_LOG(strlen(requestId.requestId) > 0, false, "requestId is empty");
108 return managerObj->manager_->NativeCancelRequest(requestId.requestId);
109 }
110
OH_MediaAssetManager_RequestImage(OH_MediaAssetManager * manager,OH_MediaAsset * mediaAsset,MediaLibrary_RequestOptions requestOptions,MediaLibrary_RequestId * requestId,OH_MediaLibrary_OnImageDataPrepared callback)111 MediaLibrary_ErrorCode OH_MediaAssetManager_RequestImage(OH_MediaAssetManager* manager, OH_MediaAsset* mediaAsset,
112 MediaLibrary_RequestOptions requestOptions, MediaLibrary_RequestId* requestId,
113 OH_MediaLibrary_OnImageDataPrepared callback)
114 {
115 CHECK_AND_RETURN_RET_LOG(manager != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "input manager is nullptr!");
116 struct MediaAssetMangerObject *managerObj = reinterpret_cast<MediaAssetMangerObject *>(manager);
117 CHECK_AND_RETURN_RET_LOG(managerObj != nullptr, MEDIA_LIBRARY_INTERNAL_SYSTEM_ERROR, "managerObj is null");
118 CHECK_AND_RETURN_RET_LOG(managerObj->manager_ != nullptr, MEDIA_LIBRARY_OPERATION_NOT_SUPPORTED,
119 "manager_ is null");
120 CHECK_AND_RETURN_RET_LOG(mediaAsset != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "mediaAsset is nullptr!");
121 CHECK_AND_RETURN_RET_LOG(requestId != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "requestId is nullptr!");
122 CHECK_AND_RETURN_RET_LOG(callback != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "callback is nullptr!");
123
124 NativeRequestOptions nativeRequestOptions;
125 OH_MediaAssetManager_Convert(requestOptions, nativeRequestOptions);
126 return managerObj->manager_->NativeRequestImageSource(mediaAsset, nativeRequestOptions, requestId, callback);
127 }
128
OH_MediaAssetManager_RequestMovingPhoto(OH_MediaAssetManager * manager,OH_MediaAsset * mediaAsset,MediaLibrary_RequestOptions requestOptions,MediaLibrary_RequestId * requestId,OH_MediaLibrary_OnMovingPhotoDataPrepared callback)129 MediaLibrary_ErrorCode OH_MediaAssetManager_RequestMovingPhoto(OH_MediaAssetManager* manager, OH_MediaAsset* mediaAsset,
130 MediaLibrary_RequestOptions requestOptions, MediaLibrary_RequestId* requestId,
131 OH_MediaLibrary_OnMovingPhotoDataPrepared callback)
132 {
133 CHECK_AND_RETURN_RET_LOG(manager != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "input manager is nullptr!");
134 struct MediaAssetMangerObject *managerObj = reinterpret_cast<MediaAssetMangerObject *>(manager);
135 CHECK_AND_RETURN_RET_LOG(managerObj != nullptr, MEDIA_LIBRARY_INTERNAL_SYSTEM_ERROR, "managerObj is null");
136 CHECK_AND_RETURN_RET_LOG(managerObj->manager_ != nullptr, MEDIA_LIBRARY_OPERATION_NOT_SUPPORTED,
137 "manager_ is null");
138 CHECK_AND_RETURN_RET_LOG(mediaAsset != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "mediaAsset is nullptr!");
139 CHECK_AND_RETURN_RET_LOG(requestId != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "requestId is nullptr!");
140 CHECK_AND_RETURN_RET_LOG(callback != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "callback is nullptr!");
141
142 NativeRequestOptions nativeRequestOptions;
143 OH_MediaAssetManager_Convert(requestOptions, nativeRequestOptions);
144 return managerObj->manager_->NativeRequestMovingPhoto(mediaAsset, nativeRequestOptions, requestId, callback);
145 }
146
OH_MediaAssetManager_Release(OH_MediaAssetManager * manager)147 MediaLibrary_ErrorCode OH_MediaAssetManager_Release(OH_MediaAssetManager* manager)
148 {
149 CHECK_AND_RETURN_RET_LOG(manager != nullptr, MEDIA_LIBRARY_PARAMETER_ERROR, "input manager is nullptr!");
150
151 delete manager;
152 manager = nullptr;
153 return MEDIA_LIBRARY_OK;
154 }