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 }