mirror of
https://github.com/openharmony/multimedia_drm_framework.git
synced 2026-07-01 02:07:09 -04:00
+3
-3
@@ -55,13 +55,13 @@ DRM框架组件提供以下功能:
|
||||
~~~js
|
||||
import drm from '@ohos.multimedia.drm';
|
||||
~~~
|
||||
2.判断DRM框架是否支持指定的DRM方案, 示例以'com.drm.clearplay'为例。
|
||||
2.判断DRM框架是否支持指定的DRM方案, 示例以'com.clearplay.drm'为例。
|
||||
~~~js
|
||||
var isSupported = drm.isMediaKeySystemSupported('com.drm.clearplay');
|
||||
var isSupported = drm.isMediaKeySystemSupported('com.clearplay.drm');
|
||||
~~~
|
||||
3.创建MediaKeySystem实例,
|
||||
~~~js
|
||||
var keySystem = drm.createMediaKeySystem('com.drm.clearplay');
|
||||
var keySystem = drm.createMediaKeySystem('com.clearplay.drm');
|
||||
~~~
|
||||
4.如无本地DRM证书,需完成证书下载。
|
||||
~~~js
|
||||
|
||||
+3
-2
@@ -20,6 +20,8 @@
|
||||
"hisysevent_config": [ ],
|
||||
"deps": {
|
||||
"components": [
|
||||
"ability_base",
|
||||
"ability_runtime",
|
||||
"safwk",
|
||||
"napi",
|
||||
"samgr",
|
||||
@@ -33,8 +35,7 @@
|
||||
"hdf_core",
|
||||
"eventhandler",
|
||||
"bundle_framework",
|
||||
"drivers_interface_drm",
|
||||
"ability_base"
|
||||
"drivers_interface_drm"
|
||||
]
|
||||
},
|
||||
"build": {
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <refbase.h>
|
||||
#include <securec.h>
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "native_drm_base.h"
|
||||
#include "native_drm_object.h"
|
||||
#include "key_session_impl.h"
|
||||
@@ -68,7 +67,7 @@ Drm_ErrCode OH_MediaKeySession_GenerateMediaKeyRequest(MediaKeySession *mediaKey
|
||||
}
|
||||
MediaKeySessionObject *sessionObject = reinterpret_cast<MediaKeySessionObject *>(mediaKeySession);
|
||||
int ret = sessionObject->sessionImpl_->GenerateMediaKeyRequest(licenseRequestInfo, licenseRequest);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), DRM_ERR_INVALID_VAL,
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_ERR_OK), DRM_ERR_INVALID_VAL,
|
||||
"OH_MediaKeySession_GenerateMediaKeyRequest call Failed!");
|
||||
Drm_ErrCode result = DealMediaKeyRequest(licenseRequest, mediaKeyRequest);
|
||||
DRM_INFO_LOG("OH_MediaKeySession_GenerateMediaKeyRequest exit");
|
||||
@@ -79,7 +78,7 @@ Drm_ErrCode OH_MediaKeySession_ProcessMediaKeyResponse(MediaKeySession *mediaKey
|
||||
int32_t responseLen, uint8_t *offlineMediaKeyId, int32_t *offlineMediaKeyIdLen)
|
||||
{
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(
|
||||
((mediaKeySession != nullptr) && (response != nullptr) && (responseLen != 0) &&
|
||||
((mediaKeySession != nullptr) && (response != nullptr) && (responseLen > 0) &&
|
||||
(offlineMediaKeyId != nullptr) && (offlineMediaKeyIdLen != nullptr)), DRM_ERR_INVALID_VAL,
|
||||
"params is nullptr!");
|
||||
MediaKeySessionObject *sessionObject = reinterpret_cast<MediaKeySessionObject *>(mediaKeySession);
|
||||
@@ -160,7 +159,7 @@ Drm_ErrCode OH_MediaKeySession_GenerateOfflineReleaseRequest(MediaKeySession *me
|
||||
{
|
||||
DRM_INFO_LOG("OH_MediaKeySession_GenerateOfflineReleaseRequest enter");
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySessoin != nullptr) && (offlineMediaKeyId != nullptr) &&
|
||||
(offlineMediaKeyIdLen != 0) && (releaseRequest != nullptr) && (releaseRequestLen != nullptr)),
|
||||
(offlineMediaKeyIdLen > 0) && (releaseRequest != nullptr) && (releaseRequestLen != nullptr)),
|
||||
DRM_ERR_INVALID_VAL, "OH_MediaKeySession_GenerateOfflineReleaseRequest keySession is nullptr!");
|
||||
std::vector<uint8_t> ReleaseRequest;
|
||||
std::vector<uint8_t> licenseIdVec(offlineMediaKeyId, offlineMediaKeyId + offlineMediaKeyIdLen);
|
||||
@@ -189,7 +188,7 @@ Drm_ErrCode OH_MediaKeySession_ProcessOfflineReleaseResponse(MediaKeySession *me
|
||||
{
|
||||
DRM_INFO_LOG("OH_MediaKeySession_ProcessOfflineReleaseResponse enter.");
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySessoin != nullptr) && (offlineMediaKeyId != nullptr) &&
|
||||
(offlineMediaKeyIdLen != 0) && (releaseReponse != nullptr) && (releaseReponseLen != 0)),
|
||||
(offlineMediaKeyIdLen > 0) && (releaseReponse != nullptr) && (releaseReponseLen > 0)),
|
||||
DRM_ERR_INVALID_VAL, "OH_MediaKeySession_ClearMediaKeys keySession is nullptr!");
|
||||
std::vector<uint8_t> licenseIdVec(offlineMediaKeyId, offlineMediaKeyId + offlineMediaKeyIdLen);
|
||||
std::vector<uint8_t> responseVec(releaseReponse, releaseReponse + releaseReponseLen);
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <refbase.h>
|
||||
#include <securec.h>
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "native_drm_common.h"
|
||||
#include "native_drm_base.h"
|
||||
#include "native_drm_object.h"
|
||||
@@ -73,7 +72,7 @@ bool OH_MediaKeySystem_IsSupported3(const char *uuid, const char *mimeType,
|
||||
|
||||
IMediaKeySessionService::ContentProtectionLevel securityLevel =
|
||||
(IMediaKeySessionService::ContentProtectionLevel)ContentProtectionLevel;
|
||||
if ((securityLevel < IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_UNKNOWN) ||
|
||||
if ((securityLevel <= IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_UNKNOWN) ||
|
||||
(securityLevel >= IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_MAX)) {
|
||||
DRM_ERR_LOG("ContentProtectionLevel is invalid");
|
||||
return false;
|
||||
@@ -138,7 +137,7 @@ Drm_ErrCode OH_MediaKeySystem_GetConfigurationString(MediaKeySystem *mediaKeySys
|
||||
{
|
||||
DRM_INFO_LOG("OH_GetConfigurationString enter");
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(
|
||||
((mediaKeySystem != nullptr) && (configName != nullptr) && (value != nullptr) && (valueLen != 0)),
|
||||
((mediaKeySystem != nullptr) && (configName != nullptr) && (value != nullptr) && (valueLen > 0)),
|
||||
DRM_ERR_INVALID_VAL, "OH_GetConfigurationString params is error!");
|
||||
|
||||
std::string valuePtr;
|
||||
@@ -287,7 +286,7 @@ Drm_ErrCode OH_MediaKeySystem_GenerateKeySystemRequest(MediaKeySystem *mediaKeyS
|
||||
{
|
||||
DRM_INFO_LOG("OH_MediaKeySystem_GenerateKeySystemRequest enter");
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySystem != nullptr) && (request != nullptr) && (requestLen != nullptr) &&
|
||||
(defaultUrl != nullptr) && (defaultUrlLen != 0)),
|
||||
(defaultUrl != nullptr) && (defaultUrlLen > 0)),
|
||||
DRM_ERR_INVALID_VAL, "OH_MediaKeySystem_GenerateKeySystemRequest mediaKeySystem is nullptr!");
|
||||
std::vector<uint8_t> requestData;
|
||||
std::string defaultUrlData;
|
||||
@@ -316,7 +315,7 @@ Drm_ErrCode OH_MediaKeySystem_ProcessKeySystemResponse(MediaKeySystem *mediaKeyS
|
||||
uint8_t *response, int32_t responseLen)
|
||||
{
|
||||
DRM_INFO_LOG("OH_ProcessKeySystemResponse enter.");
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySystem != nullptr) && (response != nullptr) && (responseLen != 0)),
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySystem != nullptr) && (response != nullptr) && (responseLen > 0)),
|
||||
DRM_ERR_INVALID_VAL, "OH_ProcessKeySystemResponse mediaKeySystem is nullptr!");
|
||||
int32_t result = DRM_ERR_OK;
|
||||
std::vector<uint8_t> keySystemResponse(response, response + responseLen);
|
||||
@@ -366,7 +365,7 @@ Drm_ErrCode OH_MediaKeySystem_CreateMediaKeySession(MediaKeySystem *mediaKeySyst
|
||||
MediaKeySession **mediaKeySession)
|
||||
{
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySystem != nullptr) && (level != nullptr) && (mediaKeySession != nullptr) &&
|
||||
(*level > CONTENT_PROTECTION_LEVEL_UNKNOWN) && (*level <= CONTENT_PROTECTION_LEVEL_MAX)),
|
||||
(*level > CONTENT_PROTECTION_LEVEL_UNKNOWN) && (*level < CONTENT_PROTECTION_LEVEL_MAX)),
|
||||
DRM_ERR_INVALID_VAL, "mediaKeySystem is nullptr!");
|
||||
struct MediaKeySystemObject *systemObject = reinterpret_cast<MediaKeySystemObject *>(mediaKeySystem);
|
||||
|
||||
@@ -442,7 +441,7 @@ Drm_ErrCode OH_MediaKeySystem_GetOfflineMediaKeyStatus(MediaKeySystem *mediaKeyS
|
||||
{
|
||||
DRM_INFO_LOG("OH_MediaKeySystem_GetOfflineMediaKeyStatus enter");
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySystem != nullptr) && (offlineMediaKeyId != nullptr) &&
|
||||
(offlineMediaKeyIdLen != 0) && (status != nullptr)),
|
||||
(offlineMediaKeyIdLen > 0) && (status != nullptr)),
|
||||
DRM_ERR_INVALID_VAL, "OH_MediaKeySystem_GetOfflineMediaKeyStatus mediaKeySystem is nullptr!");
|
||||
int32_t result = OFFLINE_MEDIA_KEY_STATUS_UNKNOWN;
|
||||
|
||||
@@ -472,7 +471,7 @@ Drm_ErrCode OH_MediaKeySystem_ClearOfflineMediaKeys(MediaKeySystem *mediaKeySyst
|
||||
{
|
||||
DRM_INFO_LOG("OH_RemoveOfflineLMediaKey enter.");
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(((mediaKeySystem != nullptr) && (offlineMediaKeyId != nullptr) &&
|
||||
(offlineMediaKeyIdLen != 0)),
|
||||
(offlineMediaKeyIdLen > 0)),
|
||||
DRM_ERR_INVALID_VAL, "OH_GetOfflineMediaKeyStatus mediaKeySystem is nullptr!");
|
||||
int32_t result = DRM_ERR_OK;
|
||||
std::vector<uint8_t> licenseIdVec(offlineMediaKeyId, offlineMediaKeyId + offlineMediaKeyIdLen);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include "drm_napi_utils.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "drm_enum_napi.h"
|
||||
|
||||
namespace OHOS {
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2023 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 "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
napi_status NapiDrmError::ThrowError(napi_env env, const char *napiMessage, int32_t napiCode)
|
||||
{
|
||||
napi_value message = nullptr;
|
||||
napi_value code = nullptr;
|
||||
napi_value result = nullptr;
|
||||
napi_create_string_utf8(env, napiMessage, NAPI_AUTO_LENGTH, &message);
|
||||
napi_create_error(env, nullptr, message, &result);
|
||||
napi_create_int32(env, napiCode, &code);
|
||||
napi_set_named_property(env, result, "code", code);
|
||||
napi_throw(env, result);
|
||||
return napi_ok;
|
||||
}
|
||||
|
||||
void NapiDrmError::ThrowError(napi_env env, int32_t code)
|
||||
{
|
||||
std::string messageValue = GetMessageByCode(code);
|
||||
napi_throw_error(env, (std::to_string(code)).c_str(), messageValue.c_str());
|
||||
}
|
||||
|
||||
std::string NapiDrmError::GetMessageByCode(int32_t &code)
|
||||
{
|
||||
std::string errMessage;
|
||||
switch (code) {
|
||||
case DRM_INVALID_PARAM:
|
||||
errMessage = DRM_INVALID_PARAM_INFO;
|
||||
break;
|
||||
case DRM_SERVICE_FATAL_ERROR:
|
||||
errMessage = DRM_SERVICE_FATAL_ERRO_INFO;
|
||||
break;
|
||||
case DRM_UNKNOWN_ERROR:
|
||||
errMessage = DRM_UNKNOWN_ERROR_INFO;
|
||||
break;
|
||||
case DRM_MAX_SYSTEM_NUM_REACHED:
|
||||
errMessage = DRM_MAX_SYSTEM_NUM_REACHED_INFO;
|
||||
break;
|
||||
case DRM_MAX_SESSION_NUM_REACHED:
|
||||
errMessage = DRM_MAX_SESSION_NUM_REACHED_INFO;
|
||||
break;
|
||||
default:
|
||||
errMessage = DRM_UNKNOWN_ERROR_INFO;
|
||||
code = DRM_UNKNOWN_ERROR;
|
||||
break;
|
||||
}
|
||||
return errMessage;
|
||||
}
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
#include "ipc_skeleton.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "drm_napi.h"
|
||||
|
||||
namespace OHOS {
|
||||
|
||||
@@ -14,16 +14,19 @@
|
||||
*/
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "key_session_callback_napi.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
MediaKeySessionCallbackNapi::MediaKeySessionCallbackNapi() {}
|
||||
MediaKeySessionCallbackNapi::MediaKeySessionCallbackNapi(napi_env env)
|
||||
{
|
||||
env_ = env;
|
||||
}
|
||||
|
||||
MediaKeySessionCallbackNapi::~MediaKeySessionCallbackNapi() {}
|
||||
|
||||
void MediaKeySessionCallbackNapi::SetCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair)
|
||||
void MediaKeySessionCallbackNapi::SetCallbackReference(const std::string eventType,
|
||||
std::shared_ptr<AutoRef> callbackPair)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionCallbackNapi SetCallbackReference");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
@@ -37,118 +40,111 @@ void MediaKeySessionCallbackNapi::ClearCallbackReference(const std::string event
|
||||
callbackMap_.erase(eventType);
|
||||
}
|
||||
|
||||
void MediaKeySessionCallbackNapi::SendEvent(const std::string event, int32_t extra, const std::vector<uint8_t> data)
|
||||
void MediaKeySessionCallbackNapi::WorkCallbackInterruptDone(uv_work_t *work, int status)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionCallbackNapi SendEvent %{public}s", event.c_str());
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(!event.empty(), "Service event code error");
|
||||
// Js Thread
|
||||
std::shared_ptr<MediaKeySessionJsCallback> context(static_cast<MediaKeySessionJsCallback *>(work->data),
|
||||
[work](MediaKeySessionJsCallback *ptr) {
|
||||
delete ptr;
|
||||
delete work;
|
||||
});
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(work != nullptr, "work is nullptr");
|
||||
MediaKeySessionJsCallback *event = reinterpret_cast<MediaKeySessionJsCallback *>(work->data);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(event != nullptr, "event is nullptr");
|
||||
std::string request = event->callbackName;
|
||||
|
||||
napi_value result;
|
||||
napi_value jsCallback = nullptr;
|
||||
napi_value retVal;
|
||||
napi_status state;
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(event->callback != nullptr, "event is nullptr");
|
||||
napi_env env = event->callback->env_;
|
||||
napi_ref callback = event->callback->cb_;
|
||||
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(callbackMap_.find(event) != callbackMap_.end(), "Not register this callback yet");
|
||||
sptr<CallBackPair> item = callbackMap_[event];
|
||||
napi_handle_scope scope = nullptr;
|
||||
napi_open_handle_scope(env, &scope);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(scope != nullptr, "scope is nullptr");
|
||||
DRM_DEBUG_LOG("JsCallBack %{public}s, uv_queue_work_with_qos start", request.c_str());
|
||||
do {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(status != UV_ECANCELED, "%{public}s cancelled", request.c_str());
|
||||
napi_value jsCallback = nullptr;
|
||||
napi_status nstatus = napi_get_reference_value(env, callback, &jsCallback);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok && jsCallback != nullptr,
|
||||
"%{public}s get reference value fail", request.c_str());
|
||||
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(item != nullptr, "sptr callbackPair is nullptr");
|
||||
napi_env env = item->GetEnv();
|
||||
napi_ref callbackRef = item->GetCallback();
|
||||
// Call back function
|
||||
if (event->callbackName == "keysChange") {
|
||||
napi_value statusTable;
|
||||
napi_value hasNewGoodLicense;
|
||||
nstatus = NapiParamUtils::SetDrmKeysChangeEventInfo(env, event->keysChangeParame,
|
||||
statusTable, hasNewGoodLicense);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok,
|
||||
"%{public}s fail to create keysession keyschange callback", request.c_str());
|
||||
napi_value args[ARGS_TWO] = { statusTable, hasNewGoodLicense };
|
||||
napi_value result = nullptr;
|
||||
nstatus = napi_call_function(env, nullptr, jsCallback, ARGS_TWO, args, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok, "%{public}s fail to call Interrupt callback",
|
||||
request.c_str());
|
||||
} else {
|
||||
napi_value args[ARGS_ONE] = { nullptr };
|
||||
nstatus = NapiParamUtils::SetDrmEventInfo(env, event->eventParame, args[PARAM0]);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok && args[PARAM0] != nullptr,
|
||||
"%{public}s fail to create keysession callback", request.c_str());
|
||||
napi_value result = nullptr;
|
||||
nstatus = napi_call_function(env, nullptr, jsCallback, ARGS_ONE, args, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok, "%{public}s fail to call Interrupt callback",
|
||||
request.c_str());
|
||||
}
|
||||
} while (0);
|
||||
napi_close_handle_scope(env, scope);
|
||||
}
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
napi_create_object(env, &result);
|
||||
napi_value extraValue;
|
||||
napi_value array = nullptr;
|
||||
std::string extraData = std::to_string(extra);
|
||||
napi_create_string_utf8(env, extraData.c_str(), NAPI_AUTO_LENGTH, &extraValue);
|
||||
state = napi_create_array_with_length(env, data.size(), &array);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(state == napi_ok, "%{public}s failed to napi_create_array_with_length",
|
||||
event.c_str());
|
||||
for (uint32_t i = 0; i < data.size(); i++) {
|
||||
napi_value number = nullptr;
|
||||
(void)napi_create_uint32(env, data[i], &number);
|
||||
(void)napi_set_element(env, array, i, number);
|
||||
void MediaKeySessionCallbackNapi::SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
std::unique_ptr<MediaKeySessionJsCallback> cb = std::make_unique<MediaKeySessionJsCallback>();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(cb != nullptr, "No memory");
|
||||
cb->callback = callbackMap_[event];
|
||||
cb->callbackName = event;
|
||||
cb->eventParame.extra = extra;
|
||||
cb->eventParame.data.assign(data.begin(), data.end());
|
||||
return OnJsCallbackInterrupt(cb);
|
||||
}
|
||||
|
||||
void MediaKeySessionCallbackNapi::OnJsCallbackInterrupt(std::unique_ptr<MediaKeySessionJsCallback> &jsCb)
|
||||
{
|
||||
uv_loop_s *loop = nullptr;
|
||||
napi_get_uv_event_loop(env_, &loop);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(loop != nullptr, "loop nullptr, No memory");
|
||||
|
||||
uv_work_t *work = new (std::nothrow) uv_work_t;
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(work != nullptr, "work nullptr, No memory");
|
||||
|
||||
if (jsCb.get() == nullptr) {
|
||||
DRM_DEBUG_LOG("OnJsCallBackInterrupt: jsCb.get() is null");
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
work->data = reinterpret_cast<void *>(jsCb.get());
|
||||
|
||||
int ret = uv_queue_work_with_qos(
|
||||
loop, work, [](uv_work_t *work) {}, WorkCallbackInterruptDone, uv_qos_default);
|
||||
if (ret != 0) {
|
||||
DRM_DEBUG_LOG("Failed to execute libuv work queue");
|
||||
delete work;
|
||||
} else {
|
||||
jsCb.release();
|
||||
}
|
||||
napi_value args[1] = { nullptr };
|
||||
napi_create_object(env, &args[0]);
|
||||
napi_set_named_property(env, args[0], "info", array);
|
||||
napi_set_named_property(env, args[0], "extraInfo", extraValue);
|
||||
napi_get_reference_value(env, callbackRef, &jsCallback);
|
||||
state = napi_call_function(env, nullptr, jsCallback, ARGS_ONE, args, &retVal);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(state == napi_ok, "%{public}s failed to napi_call_function", event.c_str());
|
||||
}
|
||||
|
||||
void MediaKeySessionCallbackNapi::SendEventKeyChanged(
|
||||
std::map<std::vector<uint8_t>, MediaKeySessionKeyStatus> statusTable, bool hasNewGoodLicense)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionCallbackNapi SendEventKeyChanged");
|
||||
napi_value result;
|
||||
napi_value jsCallback = nullptr;
|
||||
napi_value retVal;
|
||||
napi_status state;
|
||||
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(callbackMap_.find("keysChange") != callbackMap_.end(),
|
||||
"Not register this callback yet");
|
||||
sptr<CallBackPair> item = callbackMap_["keysChange"];
|
||||
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(item != nullptr, "sptr callbackPair is nullptr");
|
||||
napi_env env = item->GetEnv();
|
||||
napi_ref callbackRef = item->GetCallback();
|
||||
napi_get_undefined(env, &result);
|
||||
napi_create_object(env, &result);
|
||||
|
||||
uint32_t index = 0;
|
||||
napi_value map;
|
||||
napi_create_array_with_length(env, statusTable.size(), &map);
|
||||
for (auto itemTmp : statusTable) {
|
||||
napi_value jsObject;
|
||||
napi_value jsKeyId;
|
||||
napi_value jsKeyStatus;
|
||||
napi_create_object(env, &jsObject);
|
||||
state = napi_create_array_with_length(env, itemTmp.first.size(), &jsKeyId);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(state == napi_ok, "failed to call napi_create_array_with_length");
|
||||
for (uint32_t i = 0; i < itemTmp.first.size(); i++) {
|
||||
napi_value number = nullptr;
|
||||
(void)napi_create_uint32(env, itemTmp.first[i], &number);
|
||||
(void)napi_set_element(env, jsKeyId, i, number);
|
||||
}
|
||||
napi_set_named_property(env, jsObject, "keyId", jsKeyId);
|
||||
std::string value;
|
||||
switch (itemTmp.second) {
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_USABLE:
|
||||
value = "USABLE";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_EXPIRED:
|
||||
value = "EXPIRED";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_OUTPUT_NOT_ALLOWED:
|
||||
value = "OUTPUT_NOT_ALLOWED";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_PENDING:
|
||||
value = "PENDING";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_INTERNAL_ERROR:
|
||||
value = "INTERNAL_ERROR";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_USABLE_IN_FUTURE:
|
||||
value = "USABLE_IN_FUTURE";
|
||||
break;
|
||||
default:
|
||||
value = "Fault Status";
|
||||
break;
|
||||
}
|
||||
napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &jsKeyStatus);
|
||||
napi_set_named_property(env, jsObject, "value", jsKeyStatus);
|
||||
napi_set_element(env, map, index, jsObject);
|
||||
index++;
|
||||
}
|
||||
|
||||
napi_value hasNewGoodLicenseValue;
|
||||
napi_get_boolean(env, hasNewGoodLicense, &hasNewGoodLicenseValue);
|
||||
|
||||
napi_value args[ARGS_TWO] = {map, hasNewGoodLicenseValue};
|
||||
napi_get_reference_value(env, callbackRef, &jsCallback);
|
||||
state = napi_call_function(env, nullptr, jsCallback, ARGS_TWO, args, &retVal);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(state == napi_ok, "failed to napi_call_function keysChange");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
std::unique_ptr<MediaKeySessionJsCallback> cb = std::make_unique<MediaKeySessionJsCallback>();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(cb != nullptr, "No memory");
|
||||
const std::string event = "keysChange";
|
||||
cb->callback = callbackMap_[event];
|
||||
cb->callbackName = event;
|
||||
cb->keysChangeParame.hasNewGoodLicense = hasNewGoodLicense;
|
||||
cb->keysChangeParame.statusTable = statusTable;
|
||||
return OnJsCallbackInterrupt(cb);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // DrmStandardr
|
||||
} // OHOS
|
||||
@@ -13,7 +13,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "ipc_skeleton.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "key_session_impl.h"
|
||||
#include "media_key_system_impl.h"
|
||||
#include "key_session_napi.h"
|
||||
@@ -100,17 +100,19 @@ napi_value MediaKeySessionNapi::MediaKeySessionNapiConstructor(napi_env env, nap
|
||||
return result;
|
||||
}
|
||||
obj->keySessionImpl_ = sMediaKeySessionImpl_;
|
||||
obj->keySessionCallbackNapi_ = new MediaKeySessionCallbackNapi();
|
||||
obj->keySessionCallbackNapi_ = new MediaKeySessionCallbackNapi(env);
|
||||
obj->keySessionImpl_->SetCallback(obj->keySessionCallbackNapi_);
|
||||
|
||||
status = napi_wrap(env, thisVar, reinterpret_cast<void *>(obj.get()),
|
||||
MediaKeySessionNapi::MediaKeySessionNapiDestructor, nullptr, nullptr);
|
||||
if (status == napi_ok) {
|
||||
ObjectRefMap<MediaKeySessionNapi>::Insert(obj.get());
|
||||
obj.release();
|
||||
const std::string propertyName = "MediaKeySessionNative";
|
||||
SetMediaKeySessionNativeProperty(env, thisVar, propertyName, sMediaKeySessionImpl_);
|
||||
return thisVar;
|
||||
} else {
|
||||
ObjectRefMap<MediaKeySessionNapi>::Erase(obj.get());
|
||||
DRM_ERR_LOG("MediaKeySessionNapi Failure wrapping js to native napi");
|
||||
}
|
||||
}
|
||||
@@ -123,10 +125,7 @@ void MediaKeySessionNapi::MediaKeySessionNapiDestructor(napi_env env, void *nati
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::MediaKeySessionNapiDestructor enter.");
|
||||
MediaKeySessionNapi *keySessionNapiObj = reinterpret_cast<MediaKeySessionNapi *>(nativeObject);
|
||||
if (keySessionNapiObj != nullptr) {
|
||||
keySessionNapiObj->~MediaKeySessionNapi();
|
||||
keySessionNapiObj = nullptr;
|
||||
}
|
||||
ObjectRefMap<MediaKeySessionNapi>::DecreaseRef(keySessionNapiObj);
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::MediaKeySessionNapiDestructor exit.");
|
||||
}
|
||||
|
||||
@@ -200,312 +199,200 @@ napi_value MediaKeySessionNapi::Destroy(napi_env env, napi_callback_info info)
|
||||
napi_get_undefined(env, &result);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr) {
|
||||
keySessionNapi->keySessionImpl_->Release();
|
||||
keySessionNapi->~MediaKeySessionNapi();
|
||||
keySessionNapi = nullptr;
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->Release();
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("keySessionImpl_ Release call Failed!");
|
||||
NapiDrmError::ThrowError(env, "Release failed.", DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi Release call Failed!");
|
||||
NapiDrmError::ThrowError(env, "Release failed.", DRM_UNKNOWN_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::Release exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
static napi_value DealMediaKeyRequest(napi_env env, IMediaKeySessionService::MediaKeyRequest &licenseRequest)
|
||||
bool MediaKeySessionNapi::CheckMediaKeySessionStatus(MediaKeySessionNapi *napi,
|
||||
std::shared_ptr<MediaKeySessionAsyncContext> context)
|
||||
{
|
||||
const char *requestTypeEnum;
|
||||
napi_value requestType;
|
||||
napi_value mData;
|
||||
napi_value mDefaultURL;
|
||||
napi_value result = nullptr;
|
||||
|
||||
if (licenseRequest.requestType == IMediaKeySessionService::REQUEST_TYPE_UNKNOWN) {
|
||||
requestTypeEnum = "MEDIA_KEY_REQUEST_TYPE_UNKNOWN";
|
||||
} else if (licenseRequest.requestType == IMediaKeySessionService::REQUEST_TYPE_INITIAL) {
|
||||
requestTypeEnum = "MEDIA_KEY_REQUEST_TYPE_INITIAL";
|
||||
} else if (licenseRequest.requestType == IMediaKeySessionService::REQUEST_TYPE_RENEWAL) {
|
||||
requestTypeEnum = "MEDIA_KEY_REQUEST_TYPE_RENEWAL";
|
||||
} else if (licenseRequest.requestType == IMediaKeySessionService::REQUEST_TYPE_RELEASE) {
|
||||
requestTypeEnum = "MEDIA_KEY_REQUEST_TYPE_RELEASE";
|
||||
} else if (licenseRequest.requestType == IMediaKeySessionService::REQUEST_TYPE_NONE) {
|
||||
requestTypeEnum = "MEDIA_KEY_REQUEST_TYPE_NONE";
|
||||
} else if (licenseRequest.requestType == IMediaKeySessionService::REQUEST_TYPE_UPDATE) {
|
||||
requestTypeEnum = "MEDIA_KEY_REQUEST_TYPE_UPDATE";
|
||||
} else if (licenseRequest.requestType < IMediaKeySessionService::REQUEST_TYPE_UNKNOWN ||
|
||||
licenseRequest.requestType > IMediaKeySessionService::REQUEST_TYPE_UPDATE) {
|
||||
DRM_ERR_LOG("Do not understand licenseRequest.requestType enum!");
|
||||
return result;
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(napi != nullptr, false, "napi object is nullptr.");
|
||||
if (napi->keySessionImpl_ == nullptr) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
napi_status status = napi_create_string_utf8(env, requestTypeEnum, NAPI_AUTO_LENGTH, &requestType);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("requestType error!");
|
||||
return result;
|
||||
}
|
||||
napi_create_object(env, &result);
|
||||
napi_set_named_property(env, result, "mediaKeyRequestType", requestType);
|
||||
|
||||
size_t mDataLen = licenseRequest.mData.size();
|
||||
NAPI_CALL(env, napi_create_array(env, &mData));
|
||||
for (size_t i = 0; i < mDataLen; i++) {
|
||||
napi_value item;
|
||||
napi_create_int32(env, licenseRequest.mData[i], &item);
|
||||
napi_set_element(env, mData, i, item);
|
||||
}
|
||||
napi_set_named_property(env, result, "data", mData);
|
||||
|
||||
status = napi_create_string_utf8(env, licenseRequest.mDefaultURL.c_str(), NAPI_AUTO_LENGTH, &mDefaultURL);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("mDefaultURL error!");
|
||||
return result;
|
||||
}
|
||||
napi_set_named_property(env, result, "defaultURL", mDefaultURL);
|
||||
return result;
|
||||
return true;
|
||||
}
|
||||
|
||||
static napi_status FillTmpOptionalData(napi_env env, napi_value *argv, uint32_t optionalDataCount,
|
||||
std::map<std::string, std::string> &tmpOptionalData)
|
||||
bool MediaKeySessionNapi::CheckContextStatus(std::shared_ptr<MediaKeySessionAsyncContext> context)
|
||||
{
|
||||
napi_status status = napi_ok;
|
||||
if (optionalDataCount > 0) {
|
||||
for (size_t i = 0; i < optionalDataCount; i++) {
|
||||
napi_value tmpData;
|
||||
napi_value tmpName;
|
||||
napi_value tmpValue;
|
||||
size_t nameLength = 0;
|
||||
size_t valueLength = 0;
|
||||
status = napi_get_element(env, argv[PARAM3], i, &tmpData);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "Could not able to read optionalData element!");
|
||||
status = napi_get_named_property(env, tmpData, "name", &tmpName);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "Could not able to read optionalData property!");
|
||||
status = napi_get_named_property(env, tmpData, "value", &tmpValue);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "Could not able to read optionalData property!");
|
||||
status = napi_get_value_string_utf8(env, tmpName, nullptr, 0, &nameLength);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
status = napi_get_value_string_utf8(env, tmpValue, nullptr, 0, &valueLength);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
std::string name(nameLength, 0);
|
||||
status = napi_get_value_string_utf8(env, tmpName, &name[0], nameLength + 1, &nameLength);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
std::string value(valueLength, 0);
|
||||
status = napi_get_value_string_utf8(env, tmpValue, &value[0], valueLength + 1, &valueLength);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
DRM_INFO_LOG("%{public}s: name : %{public}s", __func__, name.c_str());
|
||||
DRM_INFO_LOG("%{public}s: value : %{public}s", __func__, value.c_str());
|
||||
tmpOptionalData.insert(std::make_pair(name, value));
|
||||
}
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(context != nullptr, false, "context object is nullptr.");
|
||||
if (context->native == nullptr) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
return false;
|
||||
}
|
||||
return status;
|
||||
return true;
|
||||
}
|
||||
|
||||
napi_value MediaKeySessionNapi::GenerateMediaKeyRequest(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::GenerateMediaKeyRequest enter");
|
||||
auto context = std::make_shared<MediaKeySessionAsyncContext>();
|
||||
if (context == nullptr) {
|
||||
DRM_ERR_LOG("GenerateMediaKeyRequest failed.");
|
||||
NapiDrmError::ThrowError(env, "GenerateMediaKeyRequest failed.", DRM_UNKNOWN_ERROR);
|
||||
return NapiParamUtils::GetUndefinedValue(env);
|
||||
}
|
||||
|
||||
size_t argc = ARGS_FOUR;
|
||||
napi_value argv[ARGS_FOUR] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
char buffer[PATH_MAX];
|
||||
size_t length = 0;
|
||||
bool isTypeArray;
|
||||
void *initData = nullptr;
|
||||
size_t initDataLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
auto inputParser = [env, context](size_t argc, napi_value *argv) {
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(context, argc <= ARGS_FOUR, "invalid arguments", DRM_INVALID_PARAM);
|
||||
context->mediaKeyRequestInfo.mimeType = NapiParamUtils::GetStringArgument(env, argv[PARAM0]);
|
||||
context->status = NapiParamUtils::GetValueUint8Array(env, context->mediaKeyRequestInfo.initData, argv[PARAM1]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "generateMediaKeyRequest failed!", DRM_INVALID_PARAM);
|
||||
int32_t mediaKeyType = 0;
|
||||
context->status = NapiParamUtils::GetValueInt32(env, mediaKeyType, argv[PARAM2]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "generateMediaKeyRequest failed!", DRM_INVALID_PARAM);
|
||||
context->mediaKeyRequestInfo.mediaKeyType = (IMediaKeySessionService::MediaKeyType)mediaKeyType;
|
||||
context->status =
|
||||
NapiParamUtils::GetValueOptionsData(env, context->mediaKeyRequestInfo.optionalData, argv[PARAM3]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "generateMediaKeyRequest failed!", DRM_INVALID_PARAM);
|
||||
};
|
||||
context->GetCbInfo(env, info, inputParser);
|
||||
|
||||
IMediaKeySessionService::MediaKeyRequestInfo licenseRequestInfo;
|
||||
IMediaKeySessionService::MediaKeyRequest licenseRequest;
|
||||
MediaKeySessionNapi *keySessionNapi = nullptr;
|
||||
auto executor = [context]() {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckContextStatus(context), "context object state is error.");
|
||||
auto obj = reinterpret_cast<MediaKeySessionNapi *>(context->native);
|
||||
ObjectRefMap objectGuard(obj);
|
||||
auto *napiMediaKeySession = objectGuard.GetPtr();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckMediaKeySessionStatus(napiMediaKeySession, context),
|
||||
"MediaKeySession state is error.");
|
||||
context->intValue = napiMediaKeySession->keySessionImpl_->GenerateMediaKeyRequest(context->mediaKeyRequestInfo,
|
||||
context->mediaKeyRequest);
|
||||
if (context->intValue != DRM_OK) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
}
|
||||
};
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_FOUR, "requires 4 parameters maximum");
|
||||
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(napi_get_value_string_utf8(env, argv[PARAM0], buffer, PATH_MAX, &length) == napi_ok,
|
||||
nullptr, "Could not able to read mimeType argument!");
|
||||
napi_is_typedarray(env, argv[PARAM1], &isTypeArray);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(isTypeArray, nullptr, "argv[PARAM1] is not array!");
|
||||
napi_get_typedarray_info(env, argv[PARAM1], &type, &initDataLen, &initData, &arraybuffer, &offset);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(initData != nullptr, nullptr, "napi_get_typedarray_info faild!");
|
||||
uint8_t *initDataPtr = reinterpret_cast<uint8_t *>(initData);
|
||||
std::vector<uint8_t> initDataStr(initDataPtr, initDataPtr + initDataLen);
|
||||
int32_t licenseType = 0;
|
||||
status = napi_get_value_int32(env, argv[PARAM2], &licenseType);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Could not able to read licenseType argument!");
|
||||
// optional data
|
||||
std::map<std::string, std::string> tmpOptionalData;
|
||||
uint32_t optionalDataCount = 0;
|
||||
status = napi_get_array_length(env, argv[PARAM3], &optionalDataCount);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Could not able to read optionalData argument!");
|
||||
status = FillTmpOptionalData(env, argv, optionalDataCount, tmpOptionalData);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "FillTmpOptionalData faild!");
|
||||
licenseRequestInfo.mediaKeyType = (IMediaKeySessionService::MediaKeyType)licenseType;
|
||||
licenseRequestInfo.mimeType = std::string(buffer);
|
||||
licenseRequestInfo.initData = initDataStr;
|
||||
licenseRequestInfo.optionalData = tmpOptionalData;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr), nullptr,
|
||||
"MediaKeySessionNapi get keySessionNapi fail!");
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->GenerateMediaKeyRequest(licenseRequestInfo, licenseRequest);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr, "MediaKeySessionNapi GenerateMediaKeyRequest call Failed!");
|
||||
napi_value result = DealMediaKeyRequest(env, licenseRequest);
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::GenerateMediaKeyRequest exit");
|
||||
return result;
|
||||
auto complete = [env, context](napi_value &output) {
|
||||
NapiParamUtils::SetMediaKeyRequest(env, context->mediaKeyRequest, output);
|
||||
};
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::GenerateMediaKeyRequest exit.");
|
||||
return NapiAsyncWork::Enqueue(env, context, "GenerateMediaKeyRequest", executor, complete);
|
||||
}
|
||||
|
||||
napi_value MediaKeySessionNapi::ProcessMediaKeyResponse(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::ProcessMediaKeyResponse enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
bool isTypeArray;
|
||||
void *reponseData = nullptr;
|
||||
size_t reponseDataLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
std::vector<uint8_t> licenseId;
|
||||
MediaKeySessionNapi *keySessionNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("reponse is not array! ");
|
||||
return nullptr;
|
||||
auto context = std::make_shared<MediaKeySessionAsyncContext>();
|
||||
if (context == nullptr) {
|
||||
DRM_ERR_LOG("ProcessMediaKeyResponse failed.");
|
||||
NapiDrmError::ThrowError(env, "ProcessMediaKeyResponse failed.", DRM_UNKNOWN_ERROR);
|
||||
return NapiParamUtils::GetUndefinedValue(env);
|
||||
}
|
||||
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &reponseDataLen, &reponseData, &arraybuffer, &offset);
|
||||
if (reponseData == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild! Could not able to read reponseData argument!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t *reponseDataPtr = reinterpret_cast<uint8_t *>(reponseData);
|
||||
std::vector<uint8_t> licenseResponse(reponseDataPtr, reponseDataPtr + reponseDataLen);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr) {
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->ProcessMediaKeyResponse(licenseId, licenseResponse);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr,
|
||||
"MediaKeySessionNapi ProcessMediaKeyResponse call Failed!");
|
||||
size_t licenseIdLen = licenseId.size();
|
||||
NAPI_CALL(env, napi_create_array(env, &result));
|
||||
for (size_t i = 0; i < licenseIdLen; i++) {
|
||||
napi_value item;
|
||||
napi_create_int32(env, licenseId[i], &item);
|
||||
napi_set_element(env, result, i, item);
|
||||
auto inputParser = [env, context](size_t argc, napi_value *argv) {
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(context, argc == ARGS_ONE, "invalid arguments", DRM_INVALID_PARAM);
|
||||
context->status = NapiParamUtils::GetValueUint8Array(env, context->response, argv[PARAM0]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "ProcessMediaKeyResponse failed!", DRM_INVALID_PARAM);
|
||||
};
|
||||
context->GetCbInfo(env, info, inputParser);
|
||||
|
||||
auto executor = [context]() {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckContextStatus(context), "context object state is error.");
|
||||
auto obj = reinterpret_cast<MediaKeySessionNapi *>(context->native);
|
||||
ObjectRefMap objectGuard(obj);
|
||||
auto *napiMediaKeySession = objectGuard.GetPtr();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckMediaKeySessionStatus(napiMediaKeySession, context),
|
||||
"MediaKeySession state is error.");
|
||||
context->intValue =
|
||||
napiMediaKeySession->keySessionImpl_->ProcessMediaKeyResponse(context->licenseId, context->response);
|
||||
if (context->intValue != DRM_OK) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi ProcessMediaKeyResponse call Failed!");
|
||||
}
|
||||
};
|
||||
|
||||
auto complete = [env, context](napi_value &output) {
|
||||
NapiParamUtils::SetValueUint8Array(env, context->licenseId, output);
|
||||
};
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::ProcessMediaKeyResponse exit.");
|
||||
return result;
|
||||
return NapiAsyncWork::Enqueue(env, context, "ProcessMediaKeyResponse", executor, complete);
|
||||
}
|
||||
|
||||
napi_value MediaKeySessionNapi::GenerateOfflineReleaseRequest(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::GenerateOfflineReleaseRequest enter");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
bool isTypeArray;
|
||||
void *licenseId = nullptr;
|
||||
size_t licenseIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
std::vector<uint8_t> releaseRequest;
|
||||
MediaKeySessionNapi *keySessionNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("licenseId is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &licenseIdLen, &licenseId, &arraybuffer, &offset);
|
||||
if (licenseId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild! Could not able to read licenseId argument!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t *licenseIdPtr = reinterpret_cast<uint8_t *>(licenseId);
|
||||
std::vector<uint8_t> licenseIdVec(licenseIdPtr, licenseIdPtr + licenseIdLen);
|
||||
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr) {
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->GenerateOfflineReleaseRequest(licenseIdVec, releaseRequest);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr,
|
||||
"MediaKeySessionNapi GenerateOfflineReleaseRequest call Failed!");
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi ProcessMediaKeyResponse call Failed!");
|
||||
return nullptr;
|
||||
auto context = std::make_shared<MediaKeySessionAsyncContext>();
|
||||
if (context == nullptr) {
|
||||
DRM_ERR_LOG("GenerateOfflineReleaseRequest failed.");
|
||||
NapiDrmError::ThrowError(env, "GenerateOfflineReleaseRequest failed.", DRM_UNKNOWN_ERROR);
|
||||
return NapiParamUtils::GetUndefinedValue(env);
|
||||
}
|
||||
|
||||
size_t releaseRequestLen = releaseRequest.size();
|
||||
NAPI_CALL(env, napi_create_array(env, &result));
|
||||
for (size_t i = 0; i < releaseRequestLen; i++) {
|
||||
napi_value item;
|
||||
napi_create_int32(env, releaseRequest[i], &item);
|
||||
napi_set_element(env, result, i, item);
|
||||
}
|
||||
auto inputParser = [env, context](size_t argc, napi_value *argv) {
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(context, argc == ARGS_ONE, "invalid arguments", DRM_INVALID_PARAM);
|
||||
context->status = NapiParamUtils::GetValueUint8Array(env, context->releaseLicenseId, argv[PARAM0]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "GenerateOfflineReleaseRequest failed", DRM_INVALID_PARAM);
|
||||
};
|
||||
context->GetCbInfo(env, info, inputParser);
|
||||
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::GenerateOfflineReleaseRequest exit");
|
||||
return result;
|
||||
auto executor = [context]() {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckContextStatus(context), "context object state is error.");
|
||||
auto obj = reinterpret_cast<MediaKeySessionNapi *>(context->native);
|
||||
ObjectRefMap objectGuard(obj);
|
||||
auto *napiMediaKeySession = objectGuard.GetPtr();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckMediaKeySessionStatus(napiMediaKeySession, context),
|
||||
"MediaKeySession state is error.");
|
||||
context->intValue = napiMediaKeySession->keySessionImpl_->GenerateOfflineReleaseRequest(
|
||||
context->releaseLicenseId, context->releaseRequest);
|
||||
if (context->intValue != DRM_OK) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
}
|
||||
};
|
||||
|
||||
auto complete = [env, context](napi_value &output) {
|
||||
NapiParamUtils::SetValueUint8Array(env, context->releaseRequest, output);
|
||||
};
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::GenerateOfflineReleaseRequest exit.");
|
||||
return NapiAsyncWork::Enqueue(env, context, "GenerateOfflineReleaseRequest", executor, complete);
|
||||
}
|
||||
|
||||
napi_value MediaKeySessionNapi::ProcessOfflineReleaseResponse(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::ProcessOfflineReleaseResponse enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_TWO;
|
||||
napi_value argv[ARGS_TWO] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
bool isTypeArray;
|
||||
void *licenseId = nullptr;
|
||||
size_t licenseIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
void *response = nullptr;
|
||||
size_t responseLen;
|
||||
auto context = std::make_shared<MediaKeySessionAsyncContext>();
|
||||
if (context == nullptr) {
|
||||
DRM_ERR_LOG("ProcessOfflineReleaseResponse failed.");
|
||||
NapiDrmError::ThrowError(env, "ProcessOfflineReleaseResponse failed.", DRM_UNKNOWN_ERROR);
|
||||
return NapiParamUtils::GetUndefinedValue(env);
|
||||
}
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_TWO, "requires 2 parameters maximum");
|
||||
auto inputParser = [env, context](size_t argc, napi_value *argv) {
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(context, argc == ARGS_TWO, "invalid arguments", DRM_INVALID_PARAM);
|
||||
context->status = NapiParamUtils::GetValueUint8Array(env, context->releaseResponseLicenseId, argv[PARAM0]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "GetValueUint8Array failed", DRM_INVALID_PARAM);
|
||||
context->status = NapiParamUtils::GetValueUint8Array(env, context->releaseResponse, argv[PARAM1]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "ProcessOfflineReleaseResponse failed", DRM_INVALID_PARAM);
|
||||
};
|
||||
context->GetCbInfo(env, info, inputParser);
|
||||
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(isTypeArray, nullptr, "argv[PARAM0] is not array!");
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &licenseIdLen, &licenseId, &arraybuffer, &offset);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(licenseId != nullptr, nullptr, "napi_get_typedarray_info faild!");
|
||||
uint8_t *licenseIdPtr = reinterpret_cast<uint8_t *>(licenseId);
|
||||
std::vector<uint8_t> licenseIdVec(licenseIdPtr, licenseIdPtr + licenseIdLen);
|
||||
napi_is_typedarray(env, argv[PARAM1], &isTypeArray);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(isTypeArray, nullptr, "argv[PARAM1] is not array!");
|
||||
napi_get_typedarray_info(env, argv[PARAM1], &type, &responseLen, &response, &arraybuffer, &offset);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(response != nullptr, nullptr, "napi_get_typedarray_info faild!");
|
||||
uint8_t *responsePtr = reinterpret_cast<uint8_t *>(response);
|
||||
std::vector<uint8_t> responseVec(responsePtr, responsePtr + responseLen);
|
||||
|
||||
MediaKeySessionNapi *keySessionNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr), nullptr,
|
||||
"MediaKeySessionNapi get keySessionNapi fail!");
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->ProcessOfflineReleaseResponse(licenseIdVec, responseVec);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr,
|
||||
"MediaKeySessionNapi ProcessOfflineReleaseResponse call Failed!");
|
||||
auto executor = [context]() {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckContextStatus(context), "context object state is error.");
|
||||
auto obj = reinterpret_cast<MediaKeySessionNapi *>(context->native);
|
||||
ObjectRefMap objectGuard(obj);
|
||||
auto *napiMediaKeySession = objectGuard.GetPtr();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckMediaKeySessionStatus(napiMediaKeySession, context),
|
||||
"MediaKeySession state is error.");
|
||||
context->intValue = napiMediaKeySession->keySessionImpl_->ProcessOfflineReleaseResponse(
|
||||
context->releaseResponseLicenseId, context->releaseResponse);
|
||||
if (context->intValue != DRM_OK) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
}
|
||||
};
|
||||
|
||||
auto complete = [env, context](napi_value &output) { output = NapiParamUtils::GetUndefinedValue(env); };
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::ProcessOfflineReleaseResponse exit.");
|
||||
return result;
|
||||
return NapiAsyncWork::Enqueue(env, context, "ProcessOfflineReleaseResponse", executor, complete);
|
||||
}
|
||||
|
||||
static napi_value vectorToJsArray(napi_env env, std::map<std::string, std::string> &licenseStatus)
|
||||
@@ -550,10 +437,14 @@ napi_value MediaKeySessionNapi::CheckMediaKeyStatus(napi_env env, napi_callback_
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr, "MediaKeySessionNapi CheckMediaKeyStatus call Failed!");
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi CheckMediaKeyStatus call Failed!");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi CheckMediaKeyStatus call Failed!", DRM_UNKNOWN_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (licenseStatus.size() == 0) {
|
||||
DRM_ERR_LOG("Licence not exist.");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi CheckMediaKeyStatus call Failed!",
|
||||
DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
result = vectorToJsArray(env, licenseStatus);
|
||||
@@ -564,45 +455,36 @@ napi_value MediaKeySessionNapi::CheckMediaKeyStatus(napi_env env, napi_callback_
|
||||
napi_value MediaKeySessionNapi::RestoreOfflineMediaKeys(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::RestoreOfflineMediaKeys enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
bool isTypeArray;
|
||||
void *licenseId = nullptr;
|
||||
size_t licenseIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
MediaKeySessionNapi *keySessionNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("licenseId is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &licenseIdLen, &licenseId, &arraybuffer, &offset);
|
||||
if (licenseId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild! Could not able to read licenseId argument!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t *licenseIdPtr = reinterpret_cast<uint8_t *>(licenseId);
|
||||
std::vector<uint8_t> licenseIdVec(licenseIdPtr, licenseIdPtr + licenseIdLen);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr) {
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->RestoreOfflineMediaKeys(licenseIdVec);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr,
|
||||
"MediaKeySessionNapi RestoreOfflineMediaKeys call Failed!");
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi RestoreOfflineMediaKeys call Failed!");
|
||||
auto context = std::make_shared<MediaKeySessionAsyncContext>();
|
||||
if (context == nullptr) {
|
||||
DRM_ERR_LOG("RestoreOfflineMediaKeys failed.");
|
||||
NapiDrmError::ThrowError(env, "RestoreOfflineMediaKeys failed.", DRM_UNKNOWN_ERROR);
|
||||
return NapiParamUtils::GetUndefinedValue(env);
|
||||
}
|
||||
|
||||
auto inputParser = [env, context](size_t argc, napi_value *argv) {
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(context, argc == ARGS_ONE, "invalid arguments", DRM_INVALID_PARAM);
|
||||
context->status = NapiParamUtils::GetValueUint8Array(env, context->restoreLicenseId, argv[PARAM0]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "RestoreOfflineMediaKeys failed", DRM_INVALID_PARAM);
|
||||
};
|
||||
context->GetCbInfo(env, info, inputParser);
|
||||
|
||||
auto executor = [context]() {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckContextStatus(context), "context object state is error.");
|
||||
auto obj = reinterpret_cast<MediaKeySessionNapi *>(context->native);
|
||||
ObjectRefMap objectGuard(obj);
|
||||
auto *napiMediaKeySession = objectGuard.GetPtr();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckMediaKeySessionStatus(napiMediaKeySession, context),
|
||||
"MediaKeySession state is error.");
|
||||
context->intValue = napiMediaKeySession->keySessionImpl_->RestoreOfflineMediaKeys(context->restoreLicenseId);
|
||||
if (context->intValue != DRM_OK) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
}
|
||||
};
|
||||
|
||||
auto complete = [env, context](napi_value &output) { output = NapiParamUtils::GetUndefinedValue(env); };
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::RestoreOfflineMediaKeys exit.");
|
||||
return result;
|
||||
return NapiAsyncWork::Enqueue(env, context, "RestoreOfflineMediaKeys", executor, complete);
|
||||
}
|
||||
|
||||
napi_value MediaKeySessionNapi::ClearMediaKeys(napi_env env, napi_callback_info info)
|
||||
@@ -622,9 +504,17 @@ napi_value MediaKeySessionNapi::ClearMediaKeys(napi_env env, napi_callback_info
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr) {
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->ClearMediaKeys();
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr, "MediaKeySessionNapi ClearMediaKeys call Failed!");
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi ClearMediaKeys call Failed!");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi ClearMediaKeys call Failed!",
|
||||
DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi ClearMediaKeys call Failed!");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi ClearMediaKeys call Failed!",
|
||||
DRM_UNKNOWN_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::ClearMediaKeys exit.");
|
||||
@@ -641,7 +531,11 @@ napi_value MediaKeySessionNapi::RequireSecureDecoderModule(napi_env env, napi_ca
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
napi_get_undefined(env, &result);
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
if (argc != ARGS_ONE) {
|
||||
NapiDrmError::ThrowError(env, "RequireSecureDecoderModule faild", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("invalid arguments.");
|
||||
return nullptr;
|
||||
}
|
||||
char mimeTypeBuf[PATH_MAX];
|
||||
size_t length = 0;
|
||||
|
||||
@@ -653,12 +547,19 @@ napi_value MediaKeySessionNapi::RequireSecureDecoderModule(napi_env env, napi_ca
|
||||
bool statusValue;
|
||||
MediaKeySessionNapi *keySessionNapi = nullptr;
|
||||
napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((keySessionNapi != nullptr), nullptr, "MediaKeySessionNapi get keySessionNapi fail!");
|
||||
if (keySessionNapi == nullptr) {
|
||||
DRM_ERR_LOG("napi_unwrapcall Failed!");
|
||||
NapiDrmError::ThrowError(env, "napi_unwrapcall failed.", DRM_UNKNOWN_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((keySessionNapi->keySessionImpl_ != nullptr), nullptr, "keySessionImpl_ == nullptr.");
|
||||
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->RequireSecureDecoderModule(mimeType, &statusValue);
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr,
|
||||
"MediaKeySessionNapi RequireSecureDecoderModule call Failed!");
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("keySessionImpl_ RequireSecureDecoderModule call Failed!");
|
||||
NapiDrmError::ThrowError(env, "RequireSecureDecoderModule failed.", DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
status = napi_get_boolean(env, statusValue, &result);
|
||||
DRM_INFO_LOG("napi_get_boolean call success!,statusValue:%{public}d.", statusValue);
|
||||
|
||||
@@ -677,15 +578,20 @@ napi_value MediaKeySessionNapi::GetContentProtectionLevel(napi_env env, napi_cal
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
IMediaKeySessionService::ContentProtectionLevel level = (IMediaKeySessionService::ContentProtectionLevel)0;
|
||||
napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr && keySessionNapi->keySessionImpl_ != nullptr) {
|
||||
int32_t ret = keySessionNapi->keySessionImpl_->GetContentProtectionLevel(&level);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("keySessionImpl_ GetContentProtectionLevel call Failed!");
|
||||
NapiDrmError::ThrowError(env, "GetContentProtectionLevel failed.", DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
DRM_CHECK_AND_RETURN_RET_LOG((ret == DRM_OK), nullptr,
|
||||
"MediaKeySessionNapi GetContentProtectionLevel call Failed!");
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi GetContentProtectionLevel call Failed!");
|
||||
NapiDrmError::ThrowError(env, "GetContentProtectionLevel failed.", DRM_UNKNOWN_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -694,7 +600,7 @@ napi_value MediaKeySessionNapi::GetContentProtectionLevel(napi_env env, napi_cal
|
||||
return result;
|
||||
}
|
||||
|
||||
void MediaKeySessionNapi::SetEventCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair)
|
||||
void MediaKeySessionNapi::SetEventCallbackReference(const std::string eventType, std::shared_ptr<AutoRef> callbackPair)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::SetEventCallbackReference");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
@@ -728,11 +634,13 @@ napi_value MediaKeySessionNapi::SetEventCallback(napi_env env, napi_callback_inf
|
||||
NAPI_ASSERT(env, argc == ARGS_TWO, "only requires 2 parameters");
|
||||
if (thisVar == nullptr || argv[PARAM0] == nullptr || argv[PARAM1] == nullptr) {
|
||||
DRM_ERR_LOG("Failed to retrieve arguments in SetEventCallback!");
|
||||
NapiDrmError::ThrowError(env, "SetEventCallback faild", DRM_INVALID_PARAM);
|
||||
return result;
|
||||
}
|
||||
napi_valuetype valueType = napi_undefined;
|
||||
if (napi_typeof(env, argv[PARAM0], &valueType) != napi_ok || valueType != napi_string ||
|
||||
napi_typeof(env, argv[PARAM1], &valueType) != napi_ok || valueType != napi_function) {
|
||||
NapiDrmError::ThrowError(env, "SetEventCallback faild", DRM_INVALID_PARAM);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -746,11 +654,12 @@ napi_value MediaKeySessionNapi::SetEventCallback(napi_env env, napi_callback_inf
|
||||
napi_create_reference(env, argv[PARAM1], 1, &callbackRef);
|
||||
DRM_INFO_LOG("SetEventCallback event is %{public}s", eventType.c_str());
|
||||
|
||||
sptr<CallBackPair> callbackPair = new CallBackPair(env, callbackRef);
|
||||
std::shared_ptr<AutoRef> callbackPair = std::make_shared<AutoRef>(env, callbackRef);
|
||||
keySessionNapi->SetEventCallbackReference(eventType, callbackPair);
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::SetEventCallback out");
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi SetEventCallback failed!");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi SetEventCallback failed!", DRM_UNKNOWN_ERROR);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -767,11 +676,13 @@ napi_value MediaKeySessionNapi::UnsetEventCallback(napi_env env, napi_callback_i
|
||||
NAPI_ASSERT(env, argc == ARGS_ONE, "only requires 1 parameters");
|
||||
if (thisVar == nullptr || argv[PARAM0] == nullptr) {
|
||||
DRM_ERR_LOG("Failed to retrieve arguments in UnsetEventCallback!");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi UnsetEventCallback failed!", DRM_INVALID_PARAM);
|
||||
return result;
|
||||
}
|
||||
napi_valuetype valueType = napi_undefined;
|
||||
if (napi_typeof(env, argv[PARAM0], &valueType) != napi_ok || valueType != napi_string) {
|
||||
DRM_ERR_LOG("Failed to retrieve reasonable arguments in UnsetEventCallback!");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi UnsetEventCallback failed!", DRM_INVALID_PARAM);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -786,6 +697,7 @@ napi_value MediaKeySessionNapi::UnsetEventCallback(napi_env env, napi_callback_i
|
||||
DRM_INFO_LOG("MediaKeySessionNapi::UnsetEventCallback out");
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySessionNapi UnsetEventCallback failed!");
|
||||
NapiDrmError::ThrowError(env, "MediaKeySessionNapi UnsetEventCallback failed!", DRM_UNKNOWN_ERROR);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -14,16 +14,19 @@
|
||||
*/
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "media_key_system_callback_napi.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
MediaKeySystemCallbackNapi::MediaKeySystemCallbackNapi() {}
|
||||
MediaKeySystemCallbackNapi::MediaKeySystemCallbackNapi(napi_env env)
|
||||
{
|
||||
env_ = env;
|
||||
}
|
||||
|
||||
MediaKeySystemCallbackNapi::~MediaKeySystemCallbackNapi() {}
|
||||
|
||||
void MediaKeySystemCallbackNapi::SetCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair)
|
||||
void MediaKeySystemCallbackNapi::SetCallbackReference(const std::string eventType,
|
||||
std::shared_ptr<AutoRef> callbackPair)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemCallbackNapi SetCallbackReference");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
@@ -37,47 +40,86 @@ void MediaKeySystemCallbackNapi::ClearCallbackReference(const std::string eventT
|
||||
callbackMap_.erase(eventType);
|
||||
}
|
||||
|
||||
void MediaKeySystemCallbackNapi::SendEvent(const std::string event, int32_t extra,
|
||||
const std::vector<uint8_t> data)
|
||||
void MediaKeySystemCallbackNapi::WorkCallbackInterruptDone(uv_work_t *work, int status)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemCallbackNapi SendEvent %{public}s", event.c_str());
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(!event.empty(), "Service event code error");
|
||||
// Js Thread
|
||||
std::shared_ptr<MediaKeySystemJsCallback> context(static_cast<MediaKeySystemJsCallback *>(work->data),
|
||||
[work](MediaKeySystemJsCallback *ptr) {
|
||||
delete ptr;
|
||||
delete work;
|
||||
});
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(work != nullptr, "work is nullptr");
|
||||
MediaKeySystemJsCallback *event = reinterpret_cast<MediaKeySystemJsCallback *>(work->data);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(event != nullptr, "event is nullptr");
|
||||
std::string request = event->callbackName;
|
||||
|
||||
napi_value result;
|
||||
napi_value jsCallback = nullptr;
|
||||
napi_value retVal;
|
||||
napi_status state;
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(event->callback != nullptr, "event is nullptr");
|
||||
napi_env env = event->callback->env_;
|
||||
napi_ref callback = event->callback->cb_;
|
||||
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(callbackMap_.find(event) != callbackMap_.end(), "Not register this callback yet");
|
||||
sptr<CallBackPair> item = callbackMap_[event];
|
||||
napi_handle_scope scope = nullptr;
|
||||
napi_open_handle_scope(env, &scope);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(scope != nullptr, "scope is nullptr");
|
||||
DRM_DEBUG_LOG("JsCallBack %{public}s, uv_queue_work_with_qos start", request.c_str());
|
||||
do {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(status != UV_ECANCELED, "%{public}s cancelled", request.c_str());
|
||||
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(item != nullptr, "sptr callbackPair is nullptr");
|
||||
napi_env env = item->GetEnv();
|
||||
napi_ref callbackRef = item->GetCallback();
|
||||
napi_value jsCallback = nullptr;
|
||||
napi_status nstatus = napi_get_reference_value(env, callback, &jsCallback);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok && jsCallback != nullptr,
|
||||
"%{public}s get reference value fail", request.c_str());
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
napi_create_object(env, &result);
|
||||
// Call back function
|
||||
napi_value args[ARGS_ONE] = { nullptr };
|
||||
nstatus = NapiParamUtils::SetDrmEventInfo(env, event->eventParame, args[PARAM0]);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok && args[PARAM0] != nullptr,
|
||||
"%{public}s fail to create keysystem callback", request.c_str());
|
||||
|
||||
napi_value extraValue;
|
||||
std::string extraData = std::to_string(extra);
|
||||
napi_create_string_utf8(env, extraData.c_str(), NAPI_AUTO_LENGTH, &extraValue);
|
||||
napi_value array = nullptr;
|
||||
state = napi_create_array_with_length(env, data.size(), &array);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(state == napi_ok,
|
||||
"%{public}s failed to napi_create_array_with_length", event.c_str());
|
||||
for (uint32_t i = 0; i < data.size(); i++) {
|
||||
napi_value number = nullptr;
|
||||
(void)napi_create_uint32(env, data[i], &number);
|
||||
(void)napi_set_element(env, array, i, number);
|
||||
const size_t argCount = ARGS_ONE;
|
||||
napi_value result = nullptr;
|
||||
nstatus = napi_call_function(env, nullptr, jsCallback, argCount, args, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(nstatus == napi_ok, "%{public}s fail to call Interrupt callback",
|
||||
request.c_str());
|
||||
} while (0);
|
||||
napi_close_handle_scope(env, scope);
|
||||
}
|
||||
|
||||
void MediaKeySystemCallbackNapi::SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
std::unique_ptr<MediaKeySystemJsCallback> cb = std::make_unique<MediaKeySystemJsCallback>();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(cb != nullptr, "No memory");
|
||||
cb->callback = callbackMap_[event];
|
||||
cb->callbackName = event;
|
||||
cb->eventParame.extra = extra;
|
||||
cb->eventParame.data.assign(data.begin(), data.end());
|
||||
return OnJsCallbackInterrupt(cb);
|
||||
}
|
||||
|
||||
void MediaKeySystemCallbackNapi::OnJsCallbackInterrupt(std::unique_ptr<MediaKeySystemJsCallback> &jsCb)
|
||||
{
|
||||
uv_loop_s *loop = nullptr;
|
||||
napi_get_uv_event_loop(env_, &loop);
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(loop != nullptr, "loop nullptr, No memory");
|
||||
|
||||
uv_work_t *work = new (std::nothrow) uv_work_t;
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(work != nullptr, "work nullptr, No memory");
|
||||
|
||||
if (jsCb.get() == nullptr) {
|
||||
DRM_DEBUG_LOG("OnJsCallBackInterrupt: jsCb.get() is null");
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
work->data = reinterpret_cast<void *>(jsCb.get());
|
||||
|
||||
int ret = uv_queue_work_with_qos(
|
||||
loop, work, [](uv_work_t *work) {}, WorkCallbackInterruptDone, uv_qos_default);
|
||||
if (ret != 0) {
|
||||
DRM_DEBUG_LOG("Failed to execute libuv work queue");
|
||||
delete work;
|
||||
} else {
|
||||
jsCb.release();
|
||||
}
|
||||
napi_value args[1] = { nullptr };
|
||||
napi_create_object(env, &args[0]);
|
||||
napi_set_named_property(env, args[0], "info", array);
|
||||
napi_set_named_property(env, args[0], "extraInfo", extraValue);
|
||||
napi_get_reference_value(env, callbackRef, &jsCallback);
|
||||
state = napi_call_function(env, nullptr, jsCallback, ARGS_ONE, args, &retVal);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(state == napi_ok,
|
||||
"%{public}s failed to napi_call_function", event.c_str());
|
||||
}
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -12,9 +12,10 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "drm_napi_utils.h"
|
||||
#include "key_session_napi.h"
|
||||
#include "media_key_system_napi.h"
|
||||
#include "napi_param_utils.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
thread_local napi_ref MediaKeySystemNapi::sConstructor_ = nullptr;
|
||||
@@ -100,15 +101,16 @@ napi_value MediaKeySystemNapi::MediaKeySystemNapiConstructor(napi_env env, napi_
|
||||
return result;
|
||||
}
|
||||
obj->mediaKeySystemImpl_ = MediaKeySystemNapi::sMediaKeySystemImpl_;
|
||||
obj->mediaKeySystemCallbackNapi_ = new (std::nothrow) MediaKeySystemCallbackNapi();
|
||||
obj->mediaKeySystemCallbackNapi_ = new (std::nothrow) MediaKeySystemCallbackNapi(env);
|
||||
obj->mediaKeySystemImpl_->SetCallback(obj->mediaKeySystemCallbackNapi_);
|
||||
|
||||
status = napi_wrap(env, jsThis, reinterpret_cast<void *>(obj.get()),
|
||||
MediaKeySystemNapi::MediaKeySystemNapiDestructor, nullptr, nullptr);
|
||||
if (status == napi_ok) {
|
||||
ObjectRefMap<MediaKeySystemNapi>::Insert(obj.get());
|
||||
obj.release();
|
||||
return jsThis;
|
||||
} else {
|
||||
ObjectRefMap<MediaKeySystemNapi>::Erase(obj.get());
|
||||
DRM_ERR_LOG("Failure wrapping js to native napi");
|
||||
}
|
||||
DRM_ERR_LOG("will call IsMediaKeySystemSupported");
|
||||
@@ -140,25 +142,28 @@ napi_value MediaKeySystemNapi::CreateMediaKeySystemInstance(napi_env env, napi_c
|
||||
size_t uuidBufferLen = 0;
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM0], uuidBuffer, PATH_MAX, &uuidBufferLen);
|
||||
if (status != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "CreateMediaKeySystemInstance faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("Could not able to read uuid argument!");
|
||||
return nullptr;
|
||||
}
|
||||
uuid = std::string(uuidBuffer);
|
||||
int32_t retCode = MediaKeySystemFactoryImpl::GetInstance()->CreateMediaKeySystem(uuid,
|
||||
int32_t ret = MediaKeySystemFactoryImpl::GetInstance()->CreateMediaKeySystem(uuid,
|
||||
&MediaKeySystemNapi::sMediaKeySystemImpl_);
|
||||
if (retCode != DRM_OK || MediaKeySystemNapi::sMediaKeySystemImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemNapi sMediaKeySystemImpl_ get failed!!!");
|
||||
if (ret != DRM_OK) {
|
||||
NapiDrmError::ThrowError(env, "CreateMediaKeySystemInstance faild.", ret);
|
||||
DRM_ERR_LOG("CreateMediaKeySystem failed!");
|
||||
return nullptr;
|
||||
}
|
||||
status = napi_new_instance(env, ctor, 0, nullptr, &result);
|
||||
MediaKeySystemNapi::sMediaKeySystemImpl_ = nullptr;
|
||||
if (status == napi_ok) {
|
||||
DRM_ERR_LOG("CreateMediaKeySystemInstance 164");
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::CreateMediaKeySystemInstance exit.");
|
||||
return result;
|
||||
} else {
|
||||
DRM_ERR_LOG("New instance could not be obtained");
|
||||
}
|
||||
}
|
||||
NapiDrmError::ThrowError(env, "CreateMediaKeySystem faild.", DRM_UNKNOWN_ERROR);
|
||||
napi_get_undefined(env, &result);
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::CreateMediaKeySystemInstance exit.");
|
||||
return result;
|
||||
@@ -168,9 +173,7 @@ void MediaKeySystemNapi::MediaKeySystemNapiDestructor(napi_env env, void *native
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::MediaKeySystemNapiDestructor enter.");
|
||||
MediaKeySystemNapi *mediaKeySystemNapi = reinterpret_cast<MediaKeySystemNapi *>(nativeObject);
|
||||
if (mediaKeySystemNapi != nullptr) {
|
||||
mediaKeySystemNapi->~MediaKeySystemNapi();
|
||||
}
|
||||
ObjectRefMap<MediaKeySystemNapi>::DecreaseRef(mediaKeySystemNapi);
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::MediaKeySystemNapiDestructor exit.");
|
||||
}
|
||||
|
||||
@@ -191,9 +194,14 @@ napi_value MediaKeySystemNapi::IsMediaKeySystemSupported(napi_env env, napi_call
|
||||
}
|
||||
std::string uuid = std::string(buffer);
|
||||
if (uuid.length() == 0 || uuid.length() > MAX_STRING_SIZE) {
|
||||
NapiDrmError::ThrowError(env, "IsMediaKeySystemSupported faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("uuid lenth is not able to zero or more 256!");
|
||||
return nullptr;
|
||||
}
|
||||
if (MediaKeySystemFactoryImpl::GetInstance() == nullptr) {
|
||||
NapiDrmError::ThrowError(env, "IsMediaKeySystemSupported faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
if (argc == ARGS_ONE) {
|
||||
bool isSurpportted = MediaKeySystemFactoryImpl::GetInstance()->IsMediaKeySystemSupported(uuid);
|
||||
napi_get_boolean(env, isSurpportted, &result);
|
||||
@@ -201,6 +209,7 @@ napi_value MediaKeySystemNapi::IsMediaKeySystemSupported(napi_env env, napi_call
|
||||
}
|
||||
buffer[0] = '\0';
|
||||
if (napi_get_value_string_utf8(env, argv[PARAM1], buffer, PATH_MAX, &length) != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "IsMediaKeySystemSupported faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("Could not able to read mimeType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -212,15 +221,16 @@ napi_value MediaKeySystemNapi::IsMediaKeySystemSupported(napi_env env, napi_call
|
||||
}
|
||||
buffer[0] = '\0';
|
||||
|
||||
int32_t jsContentProtectionLevel = -1;
|
||||
int32_t jsContentProtectionLevel = DRM_ERROR;
|
||||
if (napi_get_value_int32(env, argv[PARAM2], &jsContentProtectionLevel) != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read securityLevel argument!");
|
||||
return nullptr;
|
||||
}
|
||||
IMediaKeySessionService::ContentProtectionLevel securityLevel =
|
||||
(IMediaKeySessionService::ContentProtectionLevel)jsContentProtectionLevel;
|
||||
if ((securityLevel < IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_UNKNOWN) ||
|
||||
if ((securityLevel <= IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_UNKNOWN) ||
|
||||
(securityLevel >= IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_MAX)) {
|
||||
NapiDrmError::ThrowError(env, "IsMediaKeySystemSupported faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("jsContentProtectionLevel is invalid");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -232,6 +242,7 @@ napi_value MediaKeySystemNapi::IsMediaKeySystemSupported(napi_env env, napi_call
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::IsMediaKeySystemSupported exit.");
|
||||
return result;
|
||||
}
|
||||
NapiDrmError::ThrowError(env, "IsMediaKeySystemSupported faild.", DRM_INVALID_PARAM);
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::IsMediaKeySystemSupported exit.");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -254,19 +265,13 @@ napi_value MediaKeySystemNapi::CreateMediaKeySession(napi_env env, napi_callback
|
||||
} else {
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(napi_get_value_int32(env, argv[PARAM0], &jsContentProtectionLevel) == napi_ok,
|
||||
nullptr, "MediaKeySystemNapi napi get jsContentProtectionLevel failure!");
|
||||
IMediaKeySessionService::ContentProtectionLevel securityLevel =
|
||||
(IMediaKeySessionService::ContentProtectionLevel)jsContentProtectionLevel;
|
||||
if ((securityLevel < IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_UNKNOWN) ||
|
||||
(securityLevel > IMediaKeySessionService::CONTENT_PROTECTION_LEVEL_MAX)) {
|
||||
DRM_ERR_LOG("ContentProtectionLevel is invalid");
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
napi_get_undefined(env, &result);
|
||||
IMediaKeySessionService::ContentProtectionLevel securityLevel =
|
||||
static_cast<IMediaKeySessionService::ContentProtectionLevel>(jsContentProtectionLevel);
|
||||
if (securityLevel < IMediaKeySessionService::ContentProtectionLevel::CONTENT_PROTECTION_LEVEL_UNKNOWN ||
|
||||
securityLevel > IMediaKeySessionService::ContentProtectionLevel::CONTENT_PROTECTION_LEVEL_MAX) {
|
||||
if (securityLevel <= IMediaKeySessionService::ContentProtectionLevel::CONTENT_PROTECTION_LEVEL_UNKNOWN ||
|
||||
securityLevel >= IMediaKeySessionService::ContentProtectionLevel::CONTENT_PROTECTION_LEVEL_MAX) {
|
||||
NapiDrmError::ThrowError(env, "CreateMediaKeySession faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("securityLevel is error!!!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -274,7 +279,8 @@ napi_value MediaKeySystemNapi::CreateMediaKeySession(napi_env env, napi_callback
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->CreateMediaKeySession(
|
||||
(IMediaKeySessionService::ContentProtectionLevel)securityLevel, &keySessionImpl);
|
||||
if (ret != DRM_OK || keySessionImpl == nullptr) {
|
||||
if (ret != DRM_OK) {
|
||||
NapiDrmError::ThrowError(env, "CreateMediaKeySession failed", ret);
|
||||
DRM_ERR_LOG("MediaKeySystemNapi::CreateMediaKeySession get failed!!!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -308,6 +314,7 @@ napi_value MediaKeySystemNapi::SetConfigurationString(napi_env env, napi_callbac
|
||||
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM0], nameBuffer, PATH_MAX, &nameBufferLen);
|
||||
if (status != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationString faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("Could not able to read name argument!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -315,11 +322,13 @@ napi_value MediaKeySystemNapi::SetConfigurationString(napi_env env, napi_callbac
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM1], valueBuffer, PATH_MAX, &valueBufferLen);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read value argument!");
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationString faild.", DRM_INVALID_PARAM);
|
||||
return nullptr;
|
||||
}
|
||||
value = std::string(valueBuffer);
|
||||
if (value.length() == 0) {
|
||||
DRM_ERR_LOG("String Parameter length cannot be zero!");
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationString faild.", DRM_INVALID_PARAM);
|
||||
return nullptr;
|
||||
}
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&mediaKeySystemNapi));
|
||||
@@ -327,10 +336,12 @@ napi_value MediaKeySystemNapi::SetConfigurationString(napi_env env, napi_callbac
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->SetConfigurationString(name, value);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi SetConfiguration faild!");
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationString faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi SetConfiguration call Failed!");
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationString faild.", DRM_UNKNOWN_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -354,16 +365,22 @@ napi_value MediaKeySystemNapi::GetConfigurationString(napi_env env, napi_callbac
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_TWO, "requires 2 parameters maximum");
|
||||
|
||||
napi_get_value_string_utf8(env, argv[PARAM0], nameStr, PATH_MAX, &nameStrLength);
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM0], nameStr, PATH_MAX, &nameStrLength);
|
||||
if (status != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetConfigurationString faild.", DRM_INVALID_PARAM);
|
||||
return nullptr;
|
||||
}
|
||||
std::string name = std::string(nameStr);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetConfigurationString(name, value);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetConfigurationString faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("napi GetConfiguration faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "GetConfigurationString faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemNapi GetConfigurationString Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -398,17 +415,20 @@ napi_value MediaKeySystemNapi::SetConfigurationByteArray(napi_env env, napi_call
|
||||
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM0], nameBuffer, PATH_MAX, &nameBufferLen);
|
||||
if (status != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationByteArray faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("Could not able to read name argument!");
|
||||
return nullptr;
|
||||
}
|
||||
name = std::string(nameBuffer);
|
||||
napi_is_typedarray(env, argv[PARAM1], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationByteArray faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("argv[PARAM1] value is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM1], &type, &valueDataLen, &valueData, &arraybuffer, &offset);
|
||||
if (valueData == nullptr) {
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationByteArray faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -418,10 +438,12 @@ napi_value MediaKeySystemNapi::SetConfigurationByteArray(napi_env env, napi_call
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->SetConfigurationByteArray(name, value);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationByteArray faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("napi SetConfigurationByteArray faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "SetConfigurationByteArray faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemNapi SetConfigurationByteArray call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -446,16 +468,23 @@ napi_value MediaKeySystemNapi::GetConfigurationByteArray(napi_env env, napi_call
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_TWO, "requires 2 parameters maximum");
|
||||
|
||||
napi_get_value_string_utf8(env, argv[PARAM0], nameStr, PATH_MAX, &nameStrLength);
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM0], nameStr, PATH_MAX, &nameStrLength);
|
||||
if (status != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetConfigurationByteArray faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("Could not able to read name argument!");
|
||||
return nullptr;
|
||||
}
|
||||
std::string name = std::string(nameStr);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetConfigurationByteArray(name, value);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetConfigurationByteArray faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("napi GetConfiguration faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "GetConfigurationByteArray faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemNapi GetConfigurationByteArray Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -489,10 +518,12 @@ napi_value MediaKeySystemNapi::GetMaxContentProtectionLevel(napi_env env, napi_c
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetMaxContentProtectionLevel(&level);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetMaxContentProtectionLevel faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemImpl_->GetCertificateStatus faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "GetMaxContentProtectionLevel faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("MediaKeySystemNapi GetMaxContentProtectionLevel call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -502,93 +533,94 @@ napi_value MediaKeySystemNapi::GetMaxContentProtectionLevel(napi_env env, napi_c
|
||||
return result;
|
||||
}
|
||||
|
||||
bool MediaKeySystemNapi::CheckMediaKeySystemStatus(MediaKeySystemNapi *napi,
|
||||
std::shared_ptr<MediaKeySystemAsyncContext> context)
|
||||
{
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(napi != nullptr, false, "napi object is nullptr.");
|
||||
if (napi->mediaKeySystemImpl_ == nullptr) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MediaKeySystemNapi::CheckContextStatus(std::shared_ptr<MediaKeySystemAsyncContext> context)
|
||||
{
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(context != nullptr, false, "context object is nullptr.");
|
||||
if (context->native == nullptr) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::GenerateKeySystemRequest(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GenerateKeySystemRequest enter");
|
||||
napi_value result = nullptr;
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
std::vector<uint8_t> request;
|
||||
std::string defaultUrl;
|
||||
napi_value mDefaultURL;
|
||||
napi_value mData;
|
||||
auto context = std::make_shared<MediaKeySystemAsyncContext>();
|
||||
if (context == nullptr) {
|
||||
DRM_ERR_LOG("GenerateKeySystemRequest failed.");
|
||||
NapiDrmError::ThrowError(env, "GenerateKeySystemRequest failed.", DRM_UNKNOWN_ERROR);
|
||||
return NapiParamUtils::GetUndefinedValue(env);
|
||||
}
|
||||
|
||||
MediaKeySystemNapi *mediaKeySystemNapi = nullptr;
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->GenerateKeySystemRequest(request, defaultUrl);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi GenerateKeySystemRequest faild!");
|
||||
return nullptr;
|
||||
context->GetCbInfo(env, info);
|
||||
|
||||
auto executor = [context]() {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckContextStatus(context), "context object state is error.");
|
||||
auto obj = reinterpret_cast<MediaKeySystemNapi *>(context->native);
|
||||
ObjectRefMap objectGuard(obj);
|
||||
auto *napiMediaKeySystem = objectGuard.GetPtr();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckMediaKeySystemStatus(napiMediaKeySystem, context),
|
||||
"context object state is error.");
|
||||
context->intValue = napiMediaKeySystem->mediaKeySystemImpl_->GenerateKeySystemRequest(
|
||||
context->provisionRequest.data, context->provisionRequest.defaultURL);
|
||||
if (context->intValue != 0) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi GenerateKeySystemRequest call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NAPI_CALL(env, napi_create_object(env, &result));
|
||||
size_t requestLen = request.size();
|
||||
NAPI_CALL(env, napi_create_array(env, &mData));
|
||||
for (size_t i = 0; i < requestLen; i++) {
|
||||
napi_value item;
|
||||
napi_create_int32(env, request[i], &item);
|
||||
napi_set_element(env, mData, i, item);
|
||||
}
|
||||
NAPI_CALL(env, napi_create_string_utf8(env, defaultUrl.c_str(), NAPI_AUTO_LENGTH, &mDefaultURL));
|
||||
NAPI_CALL(env, napi_set_named_property(env, result, "defaultURL", mDefaultURL));
|
||||
NAPI_CALL(env, napi_set_named_property(env, result, "data", mData));
|
||||
};
|
||||
|
||||
auto complete = [env, context](napi_value &output) {
|
||||
NapiParamUtils::SetProvisionRequest(env, context->provisionRequest, output);
|
||||
};
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GenerateKeySystemRequest exit");
|
||||
return result;
|
||||
return NapiAsyncWork::Enqueue(env, context, "GenerateKeySystemRequest", executor, complete);
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::ProcessKeySystemResponse(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::ProcessKeySystemResponse enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_TWO;
|
||||
napi_value argv[ARGS_TWO] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
bool isTypeArray;
|
||||
void *reponseData = nullptr;
|
||||
size_t reponseDataLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
MediaKeySystemNapi *mediaKeySystemNapi = nullptr;
|
||||
auto context = std::make_shared<MediaKeySystemAsyncContext>();
|
||||
if (context == nullptr) {
|
||||
DRM_ERR_LOG("ProcessKeySystemResponse failed.");
|
||||
NapiDrmError::ThrowError(env, "ProcessKeySystemResponse failed.", DRM_UNKNOWN_ERROR);
|
||||
return NapiParamUtils::GetUndefinedValue(env);
|
||||
}
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM0] reponse is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &reponseDataLen, &reponseData, &arraybuffer, &offset);
|
||||
if (reponseData == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t *reponseDataPtr = reinterpret_cast<uint8_t *>(reponseData);
|
||||
std::vector<uint8_t> keySystemResponse(reponseDataPtr, reponseDataPtr + reponseDataLen);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->ProcessKeySystemResponse(keySystemResponse);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi ProcessKeySystemResponse faild!");
|
||||
return nullptr;
|
||||
auto inputParser = [env, context](size_t argc, napi_value *argv) {
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(context, argc == ARGS_ONE, "invalid arguments", DRM_INVALID_PARAM);
|
||||
context->status = NapiParamUtils::GetValueUint8Array(env, context->response, argv[PARAM0]);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(context, "ProcessKeySystemResponse failed", DRM_INVALID_PARAM);
|
||||
};
|
||||
|
||||
context->GetCbInfo(env, info, inputParser);
|
||||
|
||||
auto executor = [context]() {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckContextStatus(context), "context object state is error.");
|
||||
auto obj = reinterpret_cast<MediaKeySystemNapi *>(context->native);
|
||||
ObjectRefMap objectGuard(obj);
|
||||
auto *napiMediaKeySystem = objectGuard.GetPtr();
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(CheckMediaKeySystemStatus(napiMediaKeySystem, context),
|
||||
"context object state is error.");
|
||||
context->intValue = napiMediaKeySystem->mediaKeySystemImpl_->ProcessKeySystemResponse(context->response);
|
||||
if (context->intValue != DRM_OK) {
|
||||
context->SignError(DRM_SERVICE_FATAL_ERROR);
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi ProcessKeySystemResponse call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
auto complete = [env](napi_value &output) { output = NapiParamUtils::GetUndefinedValue(env); };
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::ProcessKeySystemResponse exit.");
|
||||
return result;
|
||||
return NapiAsyncWork::Enqueue(env, context, "ProcessKeySystemResponse", executor, complete);
|
||||
}
|
||||
|
||||
static napi_value vectorToJsArray(napi_env env, std::vector<IMediaKeySystemService::MetircKeyValue> &metrics)
|
||||
@@ -628,10 +660,12 @@ napi_value MediaKeySystemNapi::GetStatistics(napi_env env, napi_callback_info in
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetStatistics(metrics);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetStatistics faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemImpl_->GetStatistics faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "GetStatistics faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemNapi GetStatistics Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -656,10 +690,12 @@ napi_value MediaKeySystemNapi::GetCertificateStatus(napi_env env, napi_callback_
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetCertificateStatus(&certStatus);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetCertificateStatus faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemImpl_->GetCertificateStatus faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "GetCertificateStatus faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemNapi GetCertificateStatus Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -726,11 +762,14 @@ napi_value MediaKeySystemNapi::GetOfflineMediaKeyIds(napi_env env, napi_callback
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetOfflineMediaKeyIds(licenseIds);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetOfflineMediaKeyIds faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("napi GetOfflineMediaKeyIds faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "GetOfflineMediaKeyIds faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("MediaKeySystemNapi GetOfflineMediaKeyIds call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
result = vectorToJs2DArray(env, licenseIds);
|
||||
@@ -758,11 +797,13 @@ napi_value MediaKeySystemNapi::GetOfflineMediaKeyStatus(napi_env env, napi_callb
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
NapiDrmError::ThrowError(env, "GetOfflineMediaKeyStatus faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("argv[PARAM0] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &licenseIdLen, &licenseId, &arraybuffer, &offset);
|
||||
if (licenseId == nullptr) {
|
||||
NapiDrmError::ThrowError(env, "GetOfflineMediaKeyStatus faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -775,10 +816,12 @@ napi_value MediaKeySystemNapi::GetOfflineMediaKeyStatus(napi_env env, napi_callb
|
||||
int32_t ret =
|
||||
mediaKeySystemNapi->mediaKeySystemImpl_->GetOfflineMediaKeyStatus(licenseIdVec, offlineMediaKeyStatus);
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "GetOfflineMediaKeyStatus faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("napi GetOfflineMediaKeyStatus faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "GetOfflineMediaKeyStatus faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("MediaKeySystemNapi GetOfflineMediaKeyStatus call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -808,6 +851,7 @@ napi_value MediaKeySystemNapi::ClearOfflineMediaKeys(napi_env env, napi_callback
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 2 parameters maximum");
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
NapiDrmError::ThrowError(env, "ClearOfflineMediaKeys faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("argv[PARAM0] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
@@ -823,10 +867,13 @@ napi_value MediaKeySystemNapi::ClearOfflineMediaKeys(napi_env env, napi_callback
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->ClearOfflineMediaKeys(licenseIdVec);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi ClearOfflineMediaKeys faild!");
|
||||
NapiDrmError::ThrowError(env, "ClearOfflineMediaKeys faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySystemNapi ClearOfflineMediaKeys call Failed!");
|
||||
NapiDrmError::ThrowError(env, "ClearOfflineMediaKeys faild.", DRM_UNKNOWN_ERROR);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::ClearOfflineMediaKeys exit.");
|
||||
@@ -852,19 +899,21 @@ napi_value MediaKeySystemNapi::Destroy(napi_env env, napi_callback_info info)
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr && mediaKeySystemNapi->mediaKeySystemImpl_ != nullptr) {
|
||||
int32_t ret = mediaKeySystemNapi->mediaKeySystemImpl_->Release();
|
||||
if (ret != napi_ok) {
|
||||
NapiDrmError::ThrowError(env, "Destroy faild.", DRM_SERVICE_FATAL_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemImpl_->GetCertificateStatus faild!");
|
||||
return nullptr;
|
||||
}
|
||||
mediaKeySystemNapi->~MediaKeySystemNapi();
|
||||
mediaKeySystemNapi = nullptr;
|
||||
MediaKeySystemFactoryImpl::GetInstance()->keySystemNumber--;
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "Destroy faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemNapi Destroy Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::Release exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
void MediaKeySystemNapi::SaveEventCallbackReferrence(const std::string eventType, sptr<CallBackPair> callbackPair)
|
||||
void MediaKeySystemNapi::SaveEventCallbackReferrence(const std::string eventType, std::shared_ptr<AutoRef> callbackPair)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::SaveEventCallbackReferrence");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
@@ -897,12 +946,14 @@ napi_value MediaKeySystemNapi::SetEventCallback(napi_env env, napi_callback_info
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc == ARGS_TWO, "only requires 2 parameters");
|
||||
if (thisVar == nullptr || argv[PARAM0] == nullptr || argv[PARAM1] == nullptr) {
|
||||
NapiDrmError::ThrowError(env, "SetEventCallback faild.", DRM_INVALID_PARAM);
|
||||
DRM_ERR_LOG("Failed to retrieve arguments in SetEventCallback!");
|
||||
return result;
|
||||
}
|
||||
napi_valuetype valueType = napi_undefined;
|
||||
if (napi_typeof(env, argv[PARAM0], &valueType) != napi_ok || valueType != napi_string ||
|
||||
napi_typeof(env, argv[PARAM1], &valueType) != napi_ok || valueType != napi_function) {
|
||||
NapiDrmError::ThrowError(env, "SetEventCallback faild.", DRM_INVALID_PARAM);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -916,10 +967,11 @@ napi_value MediaKeySystemNapi::SetEventCallback(napi_env env, napi_callback_info
|
||||
napi_create_reference(env, argv[PARAM1], 1, &callbackRef);
|
||||
DRM_INFO_LOG("SetEventCallback event is %{public}s", eventType.c_str());
|
||||
|
||||
sptr<CallBackPair> callbackPair = new CallBackPair(env, callbackRef);
|
||||
std::shared_ptr<AutoRef> callbackPair = std::make_shared<AutoRef>(env, callbackRef);
|
||||
mediaKeySystemNapi->SaveEventCallbackReferrence(eventType, callbackPair);
|
||||
DRM_INFO_LOG("mediaKeySystemNapi::SetEventCallback out");
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "SetEventCallback faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("mediaKeySystemNapi SetEventCallback failed!");
|
||||
}
|
||||
return result;
|
||||
@@ -937,11 +989,13 @@ napi_value MediaKeySystemNapi::UnsetEventCallback(napi_env env, napi_callback_in
|
||||
NAPI_ASSERT(env, argc == ARGS_ONE, "only requires 1 parameters");
|
||||
if (thisVar == nullptr || argv[PARAM0] == nullptr) {
|
||||
DRM_ERR_LOG("Failed to retrieve arguments in UnsetEventCallback!");
|
||||
NapiDrmError::ThrowError(env, "UnsetEventCallback faild.", DRM_INVALID_PARAM);
|
||||
return result;
|
||||
}
|
||||
napi_valuetype valueType = napi_undefined;
|
||||
if (napi_typeof(env, argv[PARAM0], &valueType) != napi_ok || valueType != napi_string) {
|
||||
DRM_ERR_LOG("Failed to retrieve reasonable arguments in UnsetEventCallback!");
|
||||
NapiDrmError::ThrowError(env, "UnsetEventCallback faild.", DRM_INVALID_PARAM);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -955,6 +1009,7 @@ napi_value MediaKeySystemNapi::UnsetEventCallback(napi_env env, napi_callback_in
|
||||
mediaKeySystemNapi->ClearEventCallbackReferrence(eventType);
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::UnsetEventCallback out");
|
||||
} else {
|
||||
NapiDrmError::ThrowError(env, "UnsetEventCallback faild.", DRM_UNKNOWN_ERROR);
|
||||
DRM_ERR_LOG("MediaKeySystemNapi UnsetEventCallback failed!");
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* Copyright (c) 2023 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 "napi_async_work.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
ContextBase::~ContextBase()
|
||||
{
|
||||
DRM_DEBUG_LOG("no memory leak after callback or promise[resolved/rejected]");
|
||||
if (env != nullptr) {
|
||||
if (work != nullptr) {
|
||||
napi_delete_async_work(env, work);
|
||||
}
|
||||
if (callbackRef != nullptr) {
|
||||
napi_delete_reference(env, callbackRef);
|
||||
}
|
||||
napi_delete_reference(env, selfRef);
|
||||
env = nullptr;
|
||||
callbackRef = nullptr;
|
||||
selfRef = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void ContextBase::GetCbInfo(napi_env envi, napi_callback_info info, NapiCbInfoParser parser, bool sync)
|
||||
{
|
||||
env = envi;
|
||||
size_t argc = ARGC_MAX;
|
||||
napi_value argv[ARGC_MAX] = {nullptr};
|
||||
status = napi_get_cb_info(env, info, &argc, argv, &self, nullptr);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(this, "napi_get_cb_info failed!", DRM_INVALID_PARAM);
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(this, argc <= ARGC_MAX, "too many arguments!", DRM_INVALID_PARAM);
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(this, self != nullptr, "no JavaScript this argument!", DRM_INVALID_PARAM);
|
||||
napi_create_reference(env, self, 1, &selfRef);
|
||||
status = napi_unwrap(env, self, &native);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(this, "self unwrap failed!", DRM_INVALID_PARAM);
|
||||
|
||||
if (!sync && (argc > 0)) {
|
||||
// get the last arguments :: <callback>
|
||||
size_t index = argc - 1;
|
||||
napi_valuetype type = napi_undefined;
|
||||
napi_status tyst = napi_typeof(env, argv[index], &type);
|
||||
if ((tyst == napi_ok) && (type == napi_function)) {
|
||||
status = napi_create_reference(env, argv[index], 1, &callbackRef);
|
||||
NAPI_CHECK_STATUS_RETURN_VOID(this, "ref callback failed!", DRM_INVALID_PARAM);
|
||||
argc = index;
|
||||
DRM_DEBUG_LOG("async callback, no promise");
|
||||
} else {
|
||||
DRM_DEBUG_LOG("no callback, async promise");
|
||||
}
|
||||
}
|
||||
|
||||
if (parser) {
|
||||
parser(argc, argv);
|
||||
} else {
|
||||
NAPI_CHECK_ARGS_RETURN_VOID(this, argc == 0, "required no arguments!", DRM_INVALID_PARAM);
|
||||
}
|
||||
}
|
||||
|
||||
void ContextBase::SignError(int32_t code)
|
||||
{
|
||||
status = napi_generic_failure;
|
||||
errCode = code;
|
||||
errMessage = NapiDrmError::GetMessageByCode(errCode);
|
||||
}
|
||||
|
||||
napi_value NapiAsyncWork::Enqueue(napi_env env, std::shared_ptr<ContextBase> ctxt, const std::string &name,
|
||||
NapiAsyncExecute execute, NapiAsyncComplete complete)
|
||||
{
|
||||
DRM_DEBUG_LOG("name=%{public}s", name.c_str());
|
||||
ctxt->execute = std::move(execute);
|
||||
ctxt->complete = std::move(complete);
|
||||
ctxt->taskName = name;
|
||||
napi_value promise = nullptr;
|
||||
if (ctxt->callbackRef == nullptr) {
|
||||
napi_create_promise(ctxt->env, &ctxt->deferred, &promise);
|
||||
DRM_DEBUG_LOG("create deferred promise");
|
||||
} else {
|
||||
napi_get_undefined(ctxt->env, &promise);
|
||||
}
|
||||
|
||||
napi_value resource = nullptr;
|
||||
napi_create_string_utf8(ctxt->env, name.c_str(), NAPI_AUTO_LENGTH, &resource);
|
||||
napi_create_async_work(
|
||||
ctxt->env, nullptr, resource,
|
||||
[](napi_env env, void* data) {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(data != nullptr, "napi_async_execute_callback nullptr");
|
||||
auto ctxt = reinterpret_cast<ContextBase*>(data);
|
||||
DRM_DEBUG_LOG("napi_async_execute_callback ctxt->status=%{public}d", ctxt->status);
|
||||
if (ctxt->execute && ctxt->status == napi_ok) {
|
||||
ctxt->execute();
|
||||
}
|
||||
},
|
||||
[](napi_env env, napi_status status, void* data) {
|
||||
DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(data != nullptr, "napi_async_complete_callback nullptr");
|
||||
auto ctxt = reinterpret_cast<ContextBase*>(data);
|
||||
DRM_DEBUG_LOG("napi_async_complete_callback status=%{public}d, ctxt->status=%{public}d",
|
||||
status, ctxt->status);
|
||||
if ((status != napi_ok) && (ctxt->status == napi_ok)) {
|
||||
ctxt->status = status;
|
||||
}
|
||||
if ((ctxt->complete) && (status == napi_ok) && (ctxt->status == napi_ok)) {
|
||||
ctxt->complete(ctxt->output);
|
||||
}
|
||||
CommonCallbackRoutine(ctxt);
|
||||
},
|
||||
reinterpret_cast<void*>(ctxt.get()), &ctxt->work);
|
||||
napi_queue_async_work_with_qos(ctxt->env, ctxt->work, napi_qos_user_initiated);
|
||||
ctxt->hold = ctxt; // save crossing-thread ctxt.
|
||||
return promise;
|
||||
}
|
||||
|
||||
void NapiAsyncWork::CommonCallbackRoutine(ContextBase *ctxt)
|
||||
{
|
||||
napi_value result[RESULT_ALL] = {nullptr};
|
||||
if (ctxt->status == napi_ok) {
|
||||
napi_get_undefined(ctxt->env, &result[RESULT_ERROR]);
|
||||
if (ctxt->output == nullptr) {
|
||||
napi_get_undefined(ctxt->env, &ctxt->output);
|
||||
}
|
||||
result[RESULT_DATA] = ctxt->output;
|
||||
} else {
|
||||
napi_value message = nullptr;
|
||||
napi_value code = nullptr;
|
||||
napi_create_string_utf8(ctxt->env, ctxt->errMessage.c_str(), NAPI_AUTO_LENGTH, &message);
|
||||
napi_create_error(ctxt->env, nullptr, message, &result[RESULT_ERROR]);
|
||||
napi_create_int32(ctxt->env, ctxt->errCode, &code);
|
||||
napi_set_named_property(ctxt->env, result[RESULT_ERROR], "code", code);
|
||||
napi_get_undefined(ctxt->env, &result[RESULT_DATA]);
|
||||
}
|
||||
if (ctxt->deferred != nullptr) {
|
||||
if (ctxt->status == napi_ok) {
|
||||
DRM_DEBUG_LOG("deferred promise resolved");
|
||||
napi_resolve_deferred(ctxt->env, ctxt->deferred, result[RESULT_DATA]);
|
||||
} else {
|
||||
DRM_DEBUG_LOG("deferred promise rejected");
|
||||
napi_reject_deferred(ctxt->env, ctxt->deferred, result[RESULT_ERROR]);
|
||||
}
|
||||
} else {
|
||||
napi_value callback = nullptr;
|
||||
napi_get_reference_value(ctxt->env, ctxt->callbackRef, &callback);
|
||||
napi_value callbackResult = nullptr;
|
||||
DRM_DEBUG_LOG("call callback function");
|
||||
napi_call_function(ctxt->env, nullptr, callback, RESULT_ALL, result, &callbackResult);
|
||||
}
|
||||
ctxt->hold->execute = nullptr;
|
||||
ctxt->hold->complete = nullptr;
|
||||
ctxt->hold.reset(); // release ctxt.
|
||||
}
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,282 @@
|
||||
/*
|
||||
* Copyright (c) 2023 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 "napi_param_utils.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
napi_value NapiParamUtils::GetUndefinedValue(napi_env env)
|
||||
{
|
||||
napi_value result {};
|
||||
napi_get_undefined(env, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::GetValueInt32(const napi_env &env, int32_t &value, napi_value in)
|
||||
{
|
||||
napi_status status = napi_get_value_int32(env, in, &value);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "GetValueInt32 napi_get_value_int32 failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueInt32(const napi_env &env, const int32_t &value, napi_value &result)
|
||||
{
|
||||
napi_status status = napi_create_int32(env, value, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueInt32 napi_create_int32 failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::GetValueInt32(const napi_env &env, const std::string &fieldStr, int32_t &value,
|
||||
napi_value in)
|
||||
{
|
||||
napi_value jsValue = nullptr;
|
||||
napi_status status = napi_get_named_property(env, in, fieldStr.c_str(), &jsValue);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "GetValueInt32 napi_get_named_property failed");
|
||||
status = GetValueInt32(env, value, jsValue);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "GetValueInt32 napi_get_value_int32 failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueInt32(const napi_env &env, const std::string &fieldStr, const int32_t value,
|
||||
napi_value &result)
|
||||
{
|
||||
napi_value jsValue = nullptr;
|
||||
napi_status status = SetValueInt32(env, value, jsValue);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueInt32 napi_create_int32 failed");
|
||||
status = napi_set_named_property(env, result, fieldStr.c_str(), jsValue);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueInt32 napi_create_int32 failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
std::string NapiParamUtils::GetStringArgument(napi_env env, napi_value value)
|
||||
{
|
||||
std::string strValue = "";
|
||||
size_t bufLength = 0;
|
||||
napi_status status = napi_get_value_string_utf8(env, value, nullptr, 0, &bufLength);
|
||||
if (status == napi_ok && bufLength > 0 && bufLength < PATH_MAX) {
|
||||
strValue.reserve(bufLength + 1);
|
||||
strValue.resize(bufLength);
|
||||
status = napi_get_value_string_utf8(env, value, strValue.data(), bufLength + 1, &bufLength);
|
||||
if (status == napi_ok) {
|
||||
DRM_DEBUG_LOG("argument = %{public}s", strValue.c_str());
|
||||
}
|
||||
}
|
||||
return strValue;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueString(const napi_env &env, const std::string &stringValue, napi_value &result)
|
||||
{
|
||||
napi_status status = napi_create_string_utf8(env, stringValue.c_str(), NAPI_AUTO_LENGTH, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueString napi_create_string_utf8 failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueString(const napi_env &env, const std::string &fieldStr,
|
||||
const std::string &stringValue, napi_value &result)
|
||||
{
|
||||
napi_value value = nullptr;
|
||||
napi_status status = SetValueString(env, stringValue.c_str(), value);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueString failed");
|
||||
status = napi_set_named_property(env, result, fieldStr.c_str(), value);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueString napi_set_named_property failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueUint8Array(const napi_env &env, const std::vector<uint8_t> &value,
|
||||
napi_value &result)
|
||||
{
|
||||
napi_status status = napi_create_array(env, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueUint8Array napi_create_array failed");
|
||||
for (size_t i = 0; i < value.size(); i++) {
|
||||
napi_value item;
|
||||
napi_create_int32(env, value[i], &item);
|
||||
napi_set_element(env, result, i, item);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueUint8Array(const napi_env &env, const std::string &fieldStr,
|
||||
const std::vector<uint8_t> &value, napi_value &result)
|
||||
{
|
||||
napi_value jsValue = nullptr;
|
||||
napi_status status = SetValueUint8Array(env, value, jsValue);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueUint8Array failed");
|
||||
status = napi_set_named_property(env, result, fieldStr.c_str(), jsValue);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "napi_set_named_property failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::GetValueUint8Array(const napi_env &env, std::vector<uint8_t> &value, napi_value in)
|
||||
{
|
||||
void *reponseData = nullptr;
|
||||
size_t reponseDataLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
napi_status status = napi_get_typedarray_info(env, in, &type, &reponseDataLen, &reponseData, &arraybuffer, &offset);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "napi_get_typedarray_info failed");
|
||||
uint8_t *reponseDataPtr = reinterpret_cast<uint8_t *>(reponseData);
|
||||
std::vector<uint8_t> initDataStr(reponseDataPtr, reponseDataPtr + reponseDataLen);
|
||||
value.assign(initDataStr.begin(), initDataStr.end());
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueBoolean(const napi_env &env, const bool boolValue, napi_value &result)
|
||||
{
|
||||
napi_status status = napi_get_boolean(env, boolValue, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueBoolean napi_get_boolean failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetValueMap(const napi_env &env,
|
||||
std::map<std::vector<uint8_t>, MediaKeySessionKeyStatus> statusTable, napi_value &statusTableMap)
|
||||
{
|
||||
uint32_t index = 0;
|
||||
napi_status status;
|
||||
napi_create_array_with_length(env, statusTable.size(), &statusTableMap);
|
||||
for (auto itemTmp : statusTable) {
|
||||
napi_value jsObject;
|
||||
napi_value jsKeyId;
|
||||
napi_value jsKeyStatus;
|
||||
napi_create_object(env, &jsObject);
|
||||
status = napi_create_array_with_length(env, itemTmp.first.size(), &jsKeyId);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_create_array_with_length");
|
||||
for (uint32_t i = 0; i < itemTmp.first.size(); i++) {
|
||||
napi_value number = nullptr;
|
||||
(void)napi_create_uint32(env, itemTmp.first[i], &number);
|
||||
(void)napi_set_element(env, jsKeyId, i, number);
|
||||
}
|
||||
status = napi_set_named_property(env, jsObject, "keyId", jsKeyId);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_set_named_property");
|
||||
std::string value;
|
||||
switch (itemTmp.second) {
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_USABLE:
|
||||
value = "USABLE";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_EXPIRED:
|
||||
value = "EXPIRED";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_OUTPUT_NOT_ALLOWED:
|
||||
value = "OUTPUT_NOT_ALLOWED";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_PENDING:
|
||||
value = "PENDING";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_INTERNAL_ERROR:
|
||||
value = "INTERNAL_ERROR";
|
||||
break;
|
||||
case MEDIA_KEY_SESSION_KEY_STATUS_USABLE_IN_FUTURE:
|
||||
value = "USABLE_IN_FUTURE";
|
||||
break;
|
||||
default:
|
||||
value = "Fault Status";
|
||||
break;
|
||||
}
|
||||
status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &jsKeyStatus);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_create_string_utf8");
|
||||
status = napi_set_named_property(env, jsObject, "value", jsKeyStatus);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_set_named_property");
|
||||
status = napi_set_element(env, statusTableMap, index, jsObject);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_set_element");
|
||||
index++;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::GetValueOptionsData(const napi_env &env, std::map<std::string, std::string> &valueMap,
|
||||
napi_value in)
|
||||
{
|
||||
uint32_t optionalDataCount = 0;
|
||||
napi_status status = napi_get_array_length(env, in, &optionalDataCount);
|
||||
if (optionalDataCount > 0) {
|
||||
for (size_t i = 0; i < optionalDataCount; i++) {
|
||||
napi_value tmpData;
|
||||
napi_value tmpName;
|
||||
napi_value tmpValue;
|
||||
size_t nameLength = 0;
|
||||
size_t valueLength = 0;
|
||||
status = napi_get_element(env, in, i, &tmpData);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "Could not able to read optionalData element!");
|
||||
status = napi_get_named_property(env, tmpData, "name", &tmpName);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "Could not able to read optionalData property!");
|
||||
status = napi_get_named_property(env, tmpData, "value", &tmpValue);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "Could not able to read optionalData property!");
|
||||
status = napi_get_value_string_utf8(env, tmpName, nullptr, 0, &nameLength);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
status = napi_get_value_string_utf8(env, tmpValue, nullptr, 0, &valueLength);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
std::string name(nameLength, 0);
|
||||
status = napi_get_value_string_utf8(env, tmpName, &name[0], nameLength + 1, &nameLength);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
std::string value(valueLength, 0);
|
||||
status = napi_get_value_string_utf8(env, tmpValue, &value[0], valueLength + 1, &valueLength);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status,
|
||||
"Could not able to transfer optionalData buffer info!");
|
||||
valueMap.insert(std::make_pair(name, value));
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetProvisionRequest(const napi_env &env, const NapiProvisionRequest &provisionRequest,
|
||||
napi_value &result)
|
||||
{
|
||||
napi_status status = napi_create_object(env, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetProvisionRequest napi_create_object failed");
|
||||
status = SetValueString(env, "defaultURL", provisionRequest.defaultURL, result);
|
||||
status = SetValueUint8Array(env, "data", provisionRequest.data, result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetProvisionRequest SetValueUint8Array failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetMediaKeyRequest(const napi_env &env,
|
||||
const IMediaKeySessionService::MediaKeyRequest &mediaKeyRequest, napi_value &result)
|
||||
{
|
||||
napi_status status = napi_create_object(env, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest napi_create_object failed");
|
||||
status = SetValueInt32(env, "mediaKeyRequestType", mediaKeyRequest.requestType, result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest SetValueInt32 failed");
|
||||
status = SetValueUint8Array(env, "data", mediaKeyRequest.mData, result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest SetValueUint8Array failed");
|
||||
status = SetValueString(env, "defaultURL", mediaKeyRequest.mDefaultURL, result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest SetValueString failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetDrmEventInfo(const napi_env &env, DrmEventParame &eventParame, napi_value &result)
|
||||
{
|
||||
napi_status status = napi_create_object(env, &result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmEventInfo napi_create_object failed");
|
||||
status = SetValueUint8Array(env, "info", eventParame.data, result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmEventInfo SetValueUint8Array failed");
|
||||
status = SetValueString(env, "extraInfo", std::to_string(eventParame.extra), result);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmEventInfo SetValueString failed");
|
||||
return status;
|
||||
}
|
||||
|
||||
napi_status NapiParamUtils::SetDrmKeysChangeEventInfo(const napi_env &env, DrmKeysChangeEventParame &eventParame,
|
||||
napi_value &statusTable, napi_value &hasNewGoodLicense)
|
||||
{
|
||||
napi_status status = SetValueMap(env, eventParame.statusTable, statusTable);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmKeysChangeEventInfo SetValueMap failed");
|
||||
status = SetValueBoolean(env, eventParame.hasNewGoodLicense, hasNewGoodLicense);
|
||||
DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmKeysChangeEventInfo SetValueBoolean failed");
|
||||
return napi_ok;
|
||||
}
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -79,6 +79,8 @@ ohos_shared_library("drm_framework") {
|
||||
deps = []
|
||||
|
||||
external_deps = [
|
||||
"ability_runtime:abilitykit_native",
|
||||
"ability_runtime:napi_base_context",
|
||||
"c_utils:utils",
|
||||
"hilog:libhilog",
|
||||
"hisysevent:libhisysevent",
|
||||
|
||||
@@ -97,7 +97,6 @@ int32_t MediaKeySessionImpl::GenerateOfflineReleaseRequest(std::vector<uint8_t>
|
||||
DRM_INFO_LOG("MediaKeySessionImpl::GenerateOfflineReleaseRequest enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySessionImpl::GenerateOfflineReleaseRequest keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
#include "media_key_system_factory_impl.h"
|
||||
#include "i_mediakeysystem_service.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "napi_param_utils.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
@@ -95,15 +97,15 @@ bool MediaKeySystemFactoryImpl::IsMediaKeySystemSupported(std::string &uuid)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
bool isSurpported = false;
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported serviceProxy_ is null");
|
||||
return isSurpported;
|
||||
}
|
||||
retCode = serviceProxy_->IsMediaKeySystemSupported(uuid, &isSurpported);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->IsMediaKeySystemSupported(uuid, &isSurpported);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported failed, ret: %{public}d", ret);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported exit.");
|
||||
|
||||
@@ -114,16 +116,16 @@ bool MediaKeySystemFactoryImpl::IsMediaKeySystemSupported(std::string &uuid, std
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
bool isSurpported = false;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported serviceProxy_ is null");
|
||||
return isSurpported;
|
||||
}
|
||||
retCode = serviceProxy_->IsMediaKeySystemSupported(uuid, mimeType, &isSurpported);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->IsMediaKeySystemSupported(uuid, mimeType, &isSurpported);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported failed, ret: %{public}d", ret);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported exit.");
|
||||
|
||||
@@ -135,16 +137,16 @@ bool MediaKeySystemFactoryImpl::IsMediaKeySystemSupported(std::string &uuid, std
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
bool isSurpported = false;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported serviceProxy_ is null");
|
||||
return isSurpported;
|
||||
}
|
||||
retCode = serviceProxy_->IsMediaKeySystemSupported(uuid, mimeType, securityLevel, &isSurpported);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->IsMediaKeySystemSupported(uuid, mimeType, securityLevel, &isSurpported);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported failed, ret: %{public}d", ret);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported exit.");
|
||||
|
||||
@@ -156,31 +158,37 @@ int32_t MediaKeySystemFactoryImpl::CreateMediaKeySystem(std::string &uuid, sptr<
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl:: CreateMediaKeySystem enter.");
|
||||
sptr<IMediaKeySystemService> mediaKeySystemProxy = nullptr;
|
||||
sptr<MediaKeySystemImpl> localMediaKeySystemImpl = nullptr;
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
if (mediaKeySystemImpl == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl:: mediaKeySystemImpl is nullptr");
|
||||
return DRM_INVALID_ARG;
|
||||
return DRM_INVALID_PARAM;
|
||||
}
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl:: serviceProxy_ == nullptr");
|
||||
return DRM_SERVICE_ERROR;
|
||||
return DRM_SERVICE_FATAL_ERROR;
|
||||
}
|
||||
|
||||
retCode = serviceProxy_->CreateMediaKeySystem(uuid, mediaKeySystemProxy);
|
||||
if (retCode == DRM_OK) {
|
||||
ret = serviceProxy_->CreateMediaKeySystem(uuid, mediaKeySystemProxy);
|
||||
if (ret == DRM_OK) {
|
||||
if (mediaKeySystemProxy != nullptr) {
|
||||
localMediaKeySystemImpl = new (std::nothrow) MediaKeySystemImpl(mediaKeySystemProxy);
|
||||
if (localMediaKeySystemImpl == nullptr) {
|
||||
DRM_ERR_LOG("Failed to new MediaKeySystemImpl");
|
||||
return DRM_ALLOC_ERROR;
|
||||
return DRM_SERVICE_FATAL_ERROR;
|
||||
}
|
||||
keySystemNumber++;
|
||||
if (keySystemNumber > KEY_SYSTEM_MAX_NUMBER) {
|
||||
keySystemNumber--;
|
||||
DRM_ERR_LOG("The number of MediaKeySystem is greater than 64");
|
||||
return DRM_MAX_SYSTEM_NUM_REACHED;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemProxy is nullptr");
|
||||
return DRM_UNKNOWN_ERROR;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to get session object from mediakeysystem service!, %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
DRM_ERR_LOG("Failed to get session object from mediakeysystem service!, %{public}d", ret);
|
||||
return DRM_SERVICE_FATAL_ERROR;
|
||||
}
|
||||
*mediaKeySystemImpl = localMediaKeySystemImpl;
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl:: CreateMediaKeySystem exit.");
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
#include "media_key_system_impl.h"
|
||||
#include "i_mediakeysystem_service.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "napi_param_utils.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
@@ -52,15 +54,15 @@ int32_t MediaKeySystemImpl::GenerateKeySystemRequest(std::vector<uint8_t> &reque
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GenerateKeySystemRequest enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GenerateKeySystemRequest serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GenerateKeySystemRequest(request, defaultUrl);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GenerateKeySystemRequest failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->GenerateKeySystemRequest(request, defaultUrl);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GenerateKeySystemRequest failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GenerateKeySystemRequest exit.");
|
||||
@@ -71,15 +73,15 @@ int32_t MediaKeySystemImpl::ProcessKeySystemResponse(const std::vector<uint8_t>
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::ProcessKeySystemResponse enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ProcessKeySystemResponse serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->ProcessKeySystemResponse(response);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ProcessKeySystemResponse failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->ProcessKeySystemResponse(response);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ProcessKeySystemResponse failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::ProcessKeySystemResponse exit.");
|
||||
@@ -91,15 +93,15 @@ int32_t MediaKeySystemImpl::SetConfigurationString(std::string &configName, std:
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::SetConfiguration enter, configName:%{public}s, value:%{public}s.",
|
||||
configName.c_str(), value.c_str());
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->SetConfigurationString(configName, value);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->SetConfigurationString(configName, value);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::SetConfiguration exit.");
|
||||
@@ -110,15 +112,15 @@ int32_t MediaKeySystemImpl::GetConfigurationString(std::string &configName, std:
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetConfiguration enter, configName:%{public}s.", configName.c_str());
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetConfigurationString(configName, value);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->GetConfigurationString(configName, value);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
@@ -130,15 +132,15 @@ int32_t MediaKeySystemImpl::SetConfigurationByteArray(std::string &configName, s
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::SetConfiguration enter, configName:%{public}s.", configName.c_str());
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->SetConfigurationByteArray(configName, value);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->SetConfigurationByteArray(configName, value);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::SetConfiguration exit.");
|
||||
@@ -149,15 +151,15 @@ int32_t MediaKeySystemImpl::GetConfigurationByteArray(std::string &configName, s
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetConfiguration enter, configName:%{public}s.", configName.c_str());
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetConfigurationByteArray(configName, value);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->GetConfigurationByteArray(configName, value);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
@@ -170,30 +172,47 @@ int32_t MediaKeySystemImpl::CreateMediaKeySession(IMediaKeySessionService::Conte
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::CreateMediaKeySession enter.");
|
||||
sptr<IMediaKeySessionService> keySessionProxy = nullptr;
|
||||
sptr<MediaKeySessionImpl> localMediaKeySessionImpl = nullptr;
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
int32_t ret = DRM_OK;
|
||||
/* To determine if any members in the keySession list have been destroyed,
|
||||
* the keySessionNumber needs to be reduced by one
|
||||
*/
|
||||
for (size_t i = 0; i < keySessionVec.size(); i++) {
|
||||
/* In the case of initial and complete destruction,
|
||||
* all members of the keySession list are null pointers
|
||||
*/
|
||||
if (keySessionNumber > 0 && keySessionVec[i] == nullptr) {
|
||||
keySessionNumber--;
|
||||
keySessionVec.erase(keySessionVec.begin() + i);
|
||||
}
|
||||
}
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl:: serviceProxy_ == nullptr");
|
||||
return DRM_SERVICE_ERROR;
|
||||
return DRM_SERVICE_FATAL_ERROR;
|
||||
}
|
||||
|
||||
retCode = serviceProxy_->CreateMediaKeySession(securityLevel, keySessionProxy);
|
||||
if (retCode == DRM_OK) {
|
||||
ret = serviceProxy_->CreateMediaKeySession(securityLevel, keySessionProxy);
|
||||
if (ret == DRM_OK) {
|
||||
if (keySessionProxy != nullptr) {
|
||||
localMediaKeySessionImpl = new (std::nothrow) MediaKeySessionImpl(keySessionProxy);
|
||||
if (localMediaKeySessionImpl == nullptr) {
|
||||
DRM_ERR_LOG("Failed to new MediaKeySessionImpl");
|
||||
return DRM_ALLOC_ERROR;
|
||||
return DRM_SERVICE_FATAL_ERROR;
|
||||
}
|
||||
if (keySessionNumber > KEY_SESSION_MAX_NUMBER) {
|
||||
DRM_ERR_LOG("The number of MediaKeySession is greater than 64");
|
||||
return DRM_MAX_SESSION_NUM_REACHED;
|
||||
}
|
||||
keySessionNumber++;
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to CreateMediaKeySessionImpl with session is null");
|
||||
return DRM_UNKNOWN_ERROR;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to get session object from mediakeysystem service!, %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
DRM_ERR_LOG("Failed to get session object from mediakeysystem service!, %{public}d", ret);
|
||||
return DRM_SERVICE_FATAL_ERROR;
|
||||
}
|
||||
*keySessionImpl = localMediaKeySessionImpl;
|
||||
keySessionVec.push_back(localMediaKeySessionImpl);
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::CreateMediaKeySession exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
@@ -202,15 +221,15 @@ int32_t MediaKeySystemImpl::GetStatistics(std::vector<IMediaKeySystemService::Me
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetStatistics enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetStatistics serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetStatistics(metrics);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetStatistics failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->GetStatistics(metrics);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetStatistics failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetStatistics exit.");
|
||||
@@ -221,17 +240,17 @@ int32_t MediaKeySystemImpl::GetMaxContentProtectionLevel(IMediaKeySessionService
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetMaxContentProtectionLevel enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetMaxContentProtectionLevel serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode =
|
||||
ret =
|
||||
serviceProxy_->GetMaxContentProtectionLevel((IMediaKeySessionService::ContentProtectionLevel *)securityLevel);
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetMaxContentProtectionLevel 277");
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetMaxContentProtectionLevel failed, retCode: %{public}d", retCode);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetMaxContentProtectionLevel failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetMaxContentProtectionLevel exit.");
|
||||
@@ -242,15 +261,15 @@ int32_t MediaKeySystemImpl::GetOfflineMediaKeyIds(std::vector<std::vector<uint8_
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetOfflineMediaKeyIds enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetOfflineMediaKeyIds serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetOfflineMediaKeyIds(licenseIds);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetOfflineMediaKeyIds failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->GetOfflineMediaKeyIds(licenseIds);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetOfflineMediaKeyIds failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetOfflineMediaKeyIds exit");
|
||||
@@ -262,15 +281,15 @@ int32_t MediaKeySystemImpl::GetOfflineMediaKeyStatus(std::vector<uint8_t> &licen
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetOfflineMediaKeyStatus enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetOfflineMediaKeyStatus serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetOfflineMediaKeyStatus(licenseId, status);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetOfflineMediaKeyStatus failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->GetOfflineMediaKeyStatus(licenseId, status);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetOfflineMediaKeyStatus failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetOfflineMediaKeyStatus exit.");
|
||||
@@ -281,14 +300,14 @@ int32_t MediaKeySystemImpl::ClearOfflineMediaKeys(std::vector<uint8_t> &licenseI
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::ClearOfflineMediaKeys enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ClearOfflineMediaKeys serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->ClearOfflineMediaKeys(licenseId);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ClearOfflineMediaKeys failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->ClearOfflineMediaKeys(licenseId);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ClearOfflineMediaKeys failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::ClearOfflineMediaKeys exit");
|
||||
@@ -299,16 +318,16 @@ int32_t MediaKeySystemImpl::GetCertificateStatus(IMediaKeySystemService::Certifi
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetCertificateStatus enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
int32_t ret = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetCertificateStatus serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetCertificateStatus((IMediaKeySystemService::CertificateStatus *)certStatus);
|
||||
ret = serviceProxy_->GetCertificateStatus((IMediaKeySystemService::CertificateStatus *)certStatus);
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetCertificateStatus 277");
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetCertificateStatus failed, retCode: %{public}d", retCode);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetCertificateStatus failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetCertificateStatus exit.");
|
||||
@@ -321,11 +340,11 @@ int32_t MediaKeySystemImpl::SetCallback(const sptr<MediaKeySystemImplCallback> &
|
||||
DRM_CHECK_AND_RETURN_RET_LOG(callback != nullptr, DRM_INVALID_ARG, "callback is nullptr");
|
||||
mediaKeySystemApplicationCallback_ = callback;
|
||||
|
||||
int32_t retCode = DRM_ERROR;
|
||||
int32_t ret = DRM_ERROR;
|
||||
serviceCallback_ = new (std::nothrow) MediaKeySystemCallback(this);
|
||||
if (serviceCallback_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl:: MediaKeySystemCallback alloc failed");
|
||||
return retCode;
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
@@ -333,13 +352,13 @@ int32_t MediaKeySystemImpl::SetCallback(const sptr<MediaKeySystemImplCallback> &
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetCallback serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->SetCallback(serviceCallback_);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetCallback failed, retCode: %{public}d", retCode);
|
||||
ret = serviceProxy_->SetCallback(serviceCallback_);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetCallback failed, ret: %{public}d", ret);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::SetCallback exit.");
|
||||
return retCode;
|
||||
return ret;
|
||||
}
|
||||
|
||||
sptr<MediaKeySystemImplCallback> MediaKeySystemImpl::GetApplicationCallback()
|
||||
|
||||
@@ -55,6 +55,7 @@ ohos_unittest("drm_framework_capi_unittest_v1_0") {
|
||||
deps = [
|
||||
"../../../../frameworks/native:drm_framework",
|
||||
"../../../../interfaces/kits/c/drm_capi:native_drm",
|
||||
"../../../../interfaces/kits/js/drm_napi:drm_napi",
|
||||
"../../../../services/drm_service:drm_service",
|
||||
"//third_party/googletest:gmock_main",
|
||||
]
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <refbase.h>
|
||||
#include <securec.h>
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "native_drm_base.h"
|
||||
#include "native_drm_object.h"
|
||||
#include "key_session_impl.h"
|
||||
@@ -29,7 +28,6 @@
|
||||
#include "native_drm_common.h"
|
||||
#include "native_drm_err.h"
|
||||
#include "gmock/gmock.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "native_drm_base.h"
|
||||
#include "native_drm_object.h"
|
||||
#include "key_session_impl.h"
|
||||
@@ -49,7 +47,6 @@
|
||||
#include "drm_types.h"
|
||||
#include "drm_framework_unittest.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
#define DRM_SAMPLE_CHECK_AND_RETURN_RET_LOG(cond, ret, fmt, ...) \
|
||||
do { \
|
||||
|
||||
@@ -39,7 +39,7 @@ class MediaKeySessionImplCallback : public RefBase {
|
||||
public:
|
||||
MediaKeySessionImplCallback() = default;
|
||||
virtual ~MediaKeySessionImplCallback() = default;
|
||||
virtual void SendEvent(const std::string event, int32_t extra, const std::vector<uint8_t> data) = 0;
|
||||
virtual void SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data) = 0;
|
||||
virtual void SendEventKeyChanged(std::map<std::vector<uint8_t>, MediaKeySessionKeyStatus> statusTable,
|
||||
bool hasNewGoodLicense) = 0;
|
||||
};
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "i_mediakeysystemfactory_service.h"
|
||||
#include "drm_death_recipient.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
@@ -39,6 +38,7 @@ public:
|
||||
bool IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType,
|
||||
IMediaKeySessionService::ContentProtectionLevel securityLevel);
|
||||
int32_t CreateMediaKeySystem(std::string &uuid, sptr<MediaKeySystemImpl> *mediaKeySystemImpl);
|
||||
int32_t keySystemNumber = 0;
|
||||
|
||||
private:
|
||||
void MediaKeySystemServerDied(pid_t pid);
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include "nocopyable.h"
|
||||
#include "system_ability_definition.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_death_recipient.h"
|
||||
#include "key_session_impl.h"
|
||||
#include "i_mediakeysystem_service.h"
|
||||
@@ -36,7 +35,7 @@ class MediaKeySystemImplCallback : public RefBase {
|
||||
public:
|
||||
MediaKeySystemImplCallback() = default;
|
||||
virtual ~MediaKeySystemImplCallback() = default;
|
||||
virtual void SendEvent(const std::string event, int32_t extra, const std::vector<uint8_t> data) = 0;
|
||||
virtual void SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data) = 0;
|
||||
};
|
||||
|
||||
class MediaKeySystemImpl : public RefBase {
|
||||
@@ -71,6 +70,8 @@ private:
|
||||
sptr<IMediaKeySystemService> serviceProxy_;
|
||||
sptr<MediaKeySystemImplCallback> mediaKeySystemApplicationCallback_;
|
||||
sptr<IMeidaKeySystemServiceCallback> serviceCallback_;
|
||||
std::vector<sptr<MediaKeySessionImpl>> keySessionVec;
|
||||
uint32_t keySessionNumber = 0;
|
||||
};
|
||||
|
||||
class MediaKeySystemCallback : public MeidaKeySystemServiceCallbackStub {
|
||||
|
||||
@@ -83,7 +83,7 @@ public:
|
||||
callback_ = nullptr;
|
||||
}
|
||||
|
||||
void SendEvent(const std::string event, int32_t extra, const std::vector<uint8_t> data) override
|
||||
void SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data) override
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemCallbackCapi SendEvent.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
@@ -150,7 +150,7 @@ public:
|
||||
callback_ = {};
|
||||
}
|
||||
|
||||
void SendEvent(const std::string event, int32_t extra, const std::vector<uint8_t> data) override
|
||||
void SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data) override
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionCallbackCapi SendEvent.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
|
||||
@@ -30,7 +30,6 @@ ohos_copy("drm_declaration") {
|
||||
|
||||
ohos_shared_library("drm_napi") {
|
||||
include_dirs = [
|
||||
"./../../../../frameworks/js/common",
|
||||
"./../../../../frameworks/js/drm_napi",
|
||||
"./../../../../frameworks/native/drm",
|
||||
"./../../../../frameworks/native/common",
|
||||
@@ -45,15 +44,20 @@ ohos_shared_library("drm_napi") {
|
||||
]
|
||||
sources = [
|
||||
"./../../../../frameworks/js/drm_napi/drm_enum_napi.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/drm_error_code.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/drm_napi.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/key_session_callback_napi.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/key_session_napi.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/media_key_system_callback_napi.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/media_key_system_napi.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/napi_async_work.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/napi_param_utils.cpp",
|
||||
"./../../../../frameworks/js/drm_napi/native_module_ohos_drm.cpp",
|
||||
]
|
||||
deps = [ "./../../../../frameworks/native:drm_framework" ]
|
||||
external_deps = [
|
||||
"ability_runtime:abilitykit_native",
|
||||
"ability_runtime:napi_base_context",
|
||||
"access_token:libtokenid_sdk",
|
||||
"c_utils:utils",
|
||||
"hilog:libhilog",
|
||||
|
||||
@@ -21,22 +21,37 @@
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_node_api.h"
|
||||
#include "common_napi.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "napi_async_work.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class MediaKeySessionCallbackNapi : public MediaKeySessionImplCallback {
|
||||
public:
|
||||
explicit MediaKeySessionCallbackNapi();
|
||||
explicit MediaKeySessionCallbackNapi(napi_env env);
|
||||
virtual ~MediaKeySessionCallbackNapi();
|
||||
void SetCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair);
|
||||
void SetCallbackReference(const std::string eventType, std::shared_ptr<AutoRef> callbackPair);
|
||||
void ClearCallbackReference(const std::string eventType);
|
||||
void SendEvent(const std::string event, int32_t extra, const std::vector<uint8_t> data) override;
|
||||
void SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data) override;
|
||||
void SendEventKeyChanged(std::map<std::vector<uint8_t>, MediaKeySessionKeyStatus> statusTable,
|
||||
bool hasNewGoodLicense) override;
|
||||
|
||||
private:
|
||||
struct MediaKeySessionJsCallback {
|
||||
std::shared_ptr<AutoRef> callback = nullptr;
|
||||
std::string callbackName = "unknown";
|
||||
DrmEventParame eventParame;
|
||||
DrmKeysChangeEventParame keysChangeParame;
|
||||
};
|
||||
|
||||
static void WorkCallbackStateChangeDone(uv_work_t *work, int status);
|
||||
static void WorkCallbackInterruptDone(uv_work_t *work, int status);
|
||||
void OnJsCallbackInterrupt(std::unique_ptr<MediaKeySessionJsCallback> &jsCb);
|
||||
void OnJsCallbackStateChange(std::unique_ptr<MediaKeySessionJsCallback> &jsCb);
|
||||
|
||||
napi_env env_ = nullptr;
|
||||
std::mutex mutex_;
|
||||
std::map<std::string, sptr<CallBackPair>> callbackMap_;
|
||||
std::map<std::string, std::shared_ptr<AutoRef>> callbackMap_;
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
|
||||
@@ -22,10 +22,27 @@
|
||||
#include "drm_error_code.h"
|
||||
#include "key_session_callback_napi.h"
|
||||
#include "key_session_impl.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "napi_async_work.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
static const char KEY_SESSION_NAPI_CLASS_NAME[] = "MediaKeySession";
|
||||
|
||||
struct MediaKeySessionAsyncContext : public ContextBase {
|
||||
int32_t intValue;
|
||||
std::vector<uint8_t> response;
|
||||
std::vector<uint8_t> licenseId;
|
||||
std::vector<uint8_t> releaseRequest;
|
||||
std::vector<uint8_t> releaseLicenseId;
|
||||
std::vector<uint8_t> restoreLicenseId;
|
||||
std::vector<uint8_t> releaseResponse;
|
||||
std::vector<uint8_t> releaseResponseLicenseId;
|
||||
IMediaKeySessionService::MediaKeyRequestInfo mediaKeyRequestInfo;
|
||||
IMediaKeySessionService::MediaKeyRequest mediaKeyRequest;
|
||||
};
|
||||
|
||||
class MediaKeySessionNapi {
|
||||
public:
|
||||
MediaKeySessionNapi();
|
||||
@@ -48,9 +65,12 @@ public:
|
||||
static napi_value UnsetEventCallback(napi_env env, napi_callback_info info);
|
||||
static bool SetMediaKeySessionNativeProperty(napi_env env, napi_value obj, const std::string &name,
|
||||
sptr<MediaKeySessionImpl> keySessionImpl);
|
||||
void SetEventCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair);
|
||||
void SetEventCallbackReference(const std::string eventType, std::shared_ptr<AutoRef> callbackPair);
|
||||
void ClearEventCallbackReference(const std::string eventType);
|
||||
static napi_value Destroy(napi_env env, napi_callback_info info);
|
||||
static bool CheckMediaKeySessionStatus(MediaKeySessionNapi *napi,
|
||||
std::shared_ptr<MediaKeySessionAsyncContext> context);
|
||||
static bool CheckContextStatus(std::shared_ptr<MediaKeySessionAsyncContext> context);
|
||||
|
||||
private:
|
||||
static napi_value MediaKeySessionNapiConstructor(napi_env env, napi_callback_info info);
|
||||
|
||||
@@ -19,20 +19,33 @@
|
||||
#include "napi/native_node_api.h"
|
||||
#include "common_napi.h"
|
||||
#include "media_key_system_impl.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "napi_async_work.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class MediaKeySystemCallbackNapi : public MediaKeySystemImplCallback {
|
||||
public:
|
||||
explicit MediaKeySystemCallbackNapi();
|
||||
explicit MediaKeySystemCallbackNapi(napi_env env);
|
||||
virtual ~MediaKeySystemCallbackNapi();
|
||||
void SetCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair);
|
||||
void SetCallbackReference(const std::string eventType, std::shared_ptr<AutoRef> callbackPair);
|
||||
void ClearCallbackReference(const std::string eventType);
|
||||
void SendEvent(const std::string event, int32_t extra, const std::vector<uint8_t> data) override;
|
||||
void SendEvent(const std::string &event, int32_t extra, const std::vector<uint8_t> &data) override;
|
||||
|
||||
private:
|
||||
struct MediaKeySystemJsCallback {
|
||||
std::shared_ptr<AutoRef> callback = nullptr;
|
||||
std::string callbackName = "unknown";
|
||||
DrmEventParame eventParame;
|
||||
};
|
||||
|
||||
static void WorkCallbackStateChangeDone(uv_work_t *work, int status);
|
||||
static void WorkCallbackInterruptDone(uv_work_t *work, int status);
|
||||
void OnJsCallbackInterrupt(std::unique_ptr<MediaKeySystemJsCallback> &jsCb);
|
||||
void OnJsCallbackStateChange(std::unique_ptr<MediaKeySystemJsCallback> &jsCb);
|
||||
napi_env env_ = nullptr;
|
||||
std::mutex mutex_;
|
||||
std::map<std::string, sptr<CallBackPair>> callbackMap_;
|
||||
std::map<std::string, std::shared_ptr<AutoRef>> callbackMap_;
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
|
||||
@@ -33,11 +33,20 @@
|
||||
#include "media_key_system_impl.h"
|
||||
#include "media_key_system_factory_impl.h"
|
||||
#include "media_key_system_callback_napi.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "napi_async_work.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
static const char MEDIA_KEY_SYSTEM_NAPI_CLASS_NAME[] = "MediaKeySystem";
|
||||
|
||||
struct MediaKeySystemAsyncContext : public ContextBase {
|
||||
int32_t intValue;
|
||||
NapiProvisionRequest provisionRequest;
|
||||
std::vector<uint8_t> response;
|
||||
};
|
||||
|
||||
class MediaKeySystemNapi {
|
||||
public:
|
||||
static napi_value Init(napi_env env, napi_value exports);
|
||||
@@ -64,8 +73,11 @@ public:
|
||||
|
||||
static napi_value SetEventCallback(napi_env env, napi_callback_info info);
|
||||
static napi_value UnsetEventCallback(napi_env env, napi_callback_info info);
|
||||
void SaveEventCallbackReferrence(const std::string eventType, sptr<CallBackPair> callbackPair);
|
||||
void SaveEventCallbackReferrence(const std::string eventType, std::shared_ptr<AutoRef> callbackPair);
|
||||
void ClearEventCallbackReferrence(const std::string eventType);
|
||||
static bool CheckMediaKeySystemStatus(MediaKeySystemNapi *napi,
|
||||
std::shared_ptr<MediaKeySystemAsyncContext> context);
|
||||
static bool CheckContextStatus(std::shared_ptr<MediaKeySystemAsyncContext> context);
|
||||
|
||||
private:
|
||||
static napi_value MediaKeySystemNapiConstructor(napi_env env, napi_callback_info info);
|
||||
|
||||
@@ -42,6 +42,8 @@ ohos_shared_library("drm_service") {
|
||||
|
||||
external_deps = [
|
||||
"ability_base:want",
|
||||
"ability_runtime:abilitykit_native",
|
||||
"ability_runtime:napi_base_context",
|
||||
"access_token:libaccesstoken_sdk",
|
||||
"access_token:libprivacy_sdk",
|
||||
"bundle_framework:appexecfwk_base",
|
||||
|
||||
@@ -48,10 +48,10 @@ public:
|
||||
|
||||
enum CertificateStatus {
|
||||
CERT_STATUS_PROVISIONED = 0,
|
||||
CERT_STATUS_NOT_PROVISIONED = 1,
|
||||
CERT_STATUS_EXPIRED = 3,
|
||||
CERT_STATUS_INVALID = 4,
|
||||
CERT_STATUS_UNAVAILABLE = 5,
|
||||
CERT_STATUS_NOT_PROVISIONED,
|
||||
CERT_STATUS_EXPIRED,
|
||||
CERT_STATUS_INVALID,
|
||||
CERT_STATUS_UNAVAILABLE,
|
||||
};
|
||||
|
||||
struct MetircKeyValue {
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "servmgr_hdi.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "napi_param_utils.h"
|
||||
#include "drm_host_manager.h"
|
||||
|
||||
namespace OHOS {
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace DrmStandard {
|
||||
int32_t MediaKeySessionServiceCallbackStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
|
||||
MessageOption &option)
|
||||
{
|
||||
int32_t errCode = -1;
|
||||
int32_t errCode = DRM_ERROR;
|
||||
if (data.ReadInterfaceToken() != GetDescriptor()) {
|
||||
return errCode;
|
||||
}
|
||||
|
||||
@@ -366,7 +366,7 @@ int32_t MediaKeySessionServiceStub::OnRemoteRequest(uint32_t code, MessageParcel
|
||||
MessageOption &option)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySessionServiceStub::OnRemoteRequest enter.");
|
||||
int32_t errCode = -1;
|
||||
int32_t errCode = DRM_ERROR;
|
||||
DRM_DEBUG_LOG("OnRemoteRequest, cmd = %{public}u", code);
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " is keySessionServiceStub", FAKE_POINTER(this));
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace DrmStandard {
|
||||
int32_t MeidaKeySystemServiceCallbackStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
|
||||
MessageOption &option)
|
||||
{
|
||||
int32_t errCode = -1;
|
||||
int32_t errCode = DRM_ERROR;
|
||||
|
||||
if (data.ReadInterfaceToken() != GetDescriptor()) {
|
||||
return errCode;
|
||||
|
||||
@@ -15,29 +15,39 @@
|
||||
|
||||
#ifndef DRM_ERROR_CODE_H
|
||||
#define DRM_ERROR_CODE_H
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_common.h"
|
||||
#include "napi/native_node_api.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
/**
|
||||
* @brief drm remote request code for IPC.
|
||||
*
|
||||
* @since 1.0
|
||||
* @version 1.0
|
||||
*/
|
||||
enum DrmErrorCode {
|
||||
DRM_ERROR = -1,
|
||||
DRM_OK = 0,
|
||||
DRM_ALLOC_ERROR,
|
||||
DRM_INVALID_ARG,
|
||||
DRM_UNSUPPORTED,
|
||||
DRM_INVALID_SESSION_CFG,
|
||||
DRM_INVALID_STATE,
|
||||
DRM_UNKNOWN_ERROR,
|
||||
DRM_OPERATION_NOT_ALLOWED,
|
||||
DRM_HOST_ERROR,
|
||||
DRM_SERVICE_ERROR,
|
||||
DRM_MEMORY_ERROR,
|
||||
class NapiDrmError {
|
||||
public:
|
||||
static napi_status ThrowError(napi_env env, const char *napiMessage, int32_t napiCode);
|
||||
static void ThrowError(napi_env env, int32_t code);
|
||||
static std::string GetMessageByCode(int32_t &code);
|
||||
};
|
||||
|
||||
const int32_t DRM_ERROR = -1;
|
||||
const int32_t DRM_OK = 0;
|
||||
const int32_t DRM_ALLOC_ERROR = 1;
|
||||
const int32_t DRM_INVALID_ARG = 2;
|
||||
const int32_t DRM_INVALID_STATE = 3;
|
||||
const int32_t DRM_OPERATION_NOT_ALLOWED = 5;
|
||||
const int32_t DRM_HOST_ERROR = 6;
|
||||
const int32_t DRM_SERVICE_ERROR = 7;
|
||||
const int32_t DRM_MEMORY_ERROR = 8;
|
||||
const int32_t DRM_UNKNOWN_ERROR = 24700101;
|
||||
const int32_t DRM_MAX_SYSTEM_NUM_REACHED = 24700103;
|
||||
const int32_t DRM_MAX_SESSION_NUM_REACHED = 24700104;
|
||||
const int32_t DRM_SERVICE_FATAL_ERROR = 24700201;
|
||||
const int32_t DRM_INVALID_PARAM = 401;
|
||||
|
||||
const std::string DRM_INVALID_PARAM_INFO = "input parameter value error";
|
||||
const std::string DRM_SERVICE_FATAL_ERRO_INFO = "service error";
|
||||
const std::string DRM_UNKNOWN_ERROR_INFO = "unknow error";
|
||||
const std::string DRM_MAX_SYSTEM_NUM_REACHED_INFO = "mediaKeySystem number limited";
|
||||
const std::string DRM_MAX_SESSION_NUM_REACHED_INFO = "mediaKeySession number limited";
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
#endif // DRM_ERROR_CODE_H
|
||||
@@ -1,139 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2023 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.
|
||||
*/
|
||||
|
||||
#ifndef DRM_NAPI_UTILS_H
|
||||
#define DRM_NAPI_UTILS_H
|
||||
|
||||
#include <vector>
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_node_api.h"
|
||||
|
||||
#define DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar) \
|
||||
do { \
|
||||
void *data; \
|
||||
napi_get_cb_info(env, info, &(argc), argv, &(thisVar), &data); \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar) \
|
||||
do { \
|
||||
void *data; \
|
||||
status = napi_get_cb_info(env, info, nullptr, nullptr, &(thisVar), &data); \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_GET_JS_ASYNC_CB_REF(env, arg, count, cbRef) \
|
||||
do { \
|
||||
napi_valuetype valueType = napi_undefined; \
|
||||
napi_typeof(env, arg, &valueType); \
|
||||
if (valueType == napi_function) { \
|
||||
napi_create_reference(env, arg, count, &(cbRef)); \
|
||||
} else { \
|
||||
NAPI_ASSERT(env, false, "type mismatch"); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_ASSERT_NULLPTR_CHECK(env, result) \
|
||||
do { \
|
||||
if ((result) == nullptr) { \
|
||||
napi_get_undefined(env, &(result)); \
|
||||
return result; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CREATE_PROMISE(env, callbackRef, deferred, result) \
|
||||
do { \
|
||||
if ((callbackRef) == nullptr) { \
|
||||
napi_create_promise(env, &(deferred), &(result)); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CREATE_RESOURCE_NAME(env, resource, resourceName) \
|
||||
do { \
|
||||
napi_create_string_utf8(env, resourceName, NAPI_AUTO_LENGTH, &(resource)); \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CHECK_NULL_PTR_RETURN_UNDEFINED(env, ptr, ret, message) \
|
||||
do { \
|
||||
if ((ptr) == nullptr) { \
|
||||
HiLog::Error(LABEL, message); \
|
||||
napi_get_undefined(env, &(ret)); \
|
||||
return ret; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CHECK_NULL_PTR_RETURN_VOID(ptr, message) \
|
||||
do { \
|
||||
if ((ptr) == nullptr) { \
|
||||
HiLog::Error(LABEL, message); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_ASSERT_EQUAL(condition, errMsg) \
|
||||
do { \
|
||||
if (!(condition)) { \
|
||||
HiLog::Error(LABEL, errMsg); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CHECK_AND_BREAK_LOG(cond, fmt, ...) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
DRM_ERR_LOG(fmt, ##__VA_ARGS__); \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CHECK_AND_RETURN_LOG(cond, fmt, ...) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
DRM_ERR_LOG(fmt, ##__VA_ARGS__); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
/* Constants for array index */
|
||||
const int32_t PARAM0 = 0;
|
||||
const int32_t PARAM1 = 1;
|
||||
const int32_t PARAM2 = 2;
|
||||
const int32_t PARAM3 = 3;
|
||||
|
||||
/* Constants for array size */
|
||||
const int32_t ARGS_ZERO = 0;
|
||||
const int32_t ARGS_ONE = 1;
|
||||
const int32_t ARGS_TWO = 2;
|
||||
const int32_t ARGS_THREE = 3;
|
||||
const int32_t ARGS_FOUR = 4;
|
||||
|
||||
|
||||
struct AsyncContext {
|
||||
napi_env env;
|
||||
napi_async_work work;
|
||||
napi_deferred deferred;
|
||||
napi_ref callbackRef;
|
||||
bool status;
|
||||
int32_t taskId;
|
||||
int32_t errorCode;
|
||||
std::string errorMsg;
|
||||
std::string funcName;
|
||||
bool isInvalidArgument;
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
#endif /* DRM_NAPI_UTILS_H_ */
|
||||
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (c) 2023 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.
|
||||
*/
|
||||
#ifndef NAPI_ASYNC_WORK_H
|
||||
#define NAPI_ASYNC_WORK_H
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <uv.h>
|
||||
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_common.h"
|
||||
#include "napi/native_node_api.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "napi_param_utils.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
using NapiCbInfoParser = std::function<void(size_t argc, napi_value *argv)>;
|
||||
using NapiAsyncExecute = std::function<void(void)>;
|
||||
using NapiAsyncComplete = std::function<void(napi_value&)>;
|
||||
|
||||
struct ContextBase {
|
||||
virtual ~ContextBase();
|
||||
void GetCbInfo(napi_env env, napi_callback_info info, NapiCbInfoParser parse = NapiCbInfoParser(),
|
||||
bool sync = false);
|
||||
void SignError(int32_t code);
|
||||
napi_env env = nullptr;
|
||||
napi_value output = nullptr;
|
||||
napi_status status = napi_invalid_arg;
|
||||
std::string errMessage;
|
||||
int32_t errCode;
|
||||
napi_value self = nullptr;
|
||||
void* native = nullptr;
|
||||
std::string taskName;
|
||||
|
||||
private:
|
||||
napi_deferred deferred = nullptr;
|
||||
napi_async_work work = nullptr;
|
||||
napi_ref callbackRef = nullptr;
|
||||
napi_ref selfRef = nullptr;
|
||||
|
||||
NapiAsyncExecute execute = nullptr;
|
||||
NapiAsyncComplete complete = nullptr;
|
||||
std::shared_ptr<ContextBase> hold; /* cross thread data */
|
||||
|
||||
static constexpr size_t ARGC_MAX = 6;
|
||||
|
||||
friend class NapiAsyncWork;
|
||||
};
|
||||
|
||||
struct NapiWorkData {
|
||||
napi_env env_;
|
||||
napi_ref cb_;
|
||||
};
|
||||
|
||||
struct AutoRef {
|
||||
AutoRef(napi_env env, napi_ref cb)
|
||||
: env_(env), cb_(cb)
|
||||
{
|
||||
}
|
||||
~AutoRef()
|
||||
{
|
||||
uv_loop_s *loop = nullptr;
|
||||
napi_get_uv_event_loop(env_, &loop);
|
||||
if (loop == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
NapiWorkData *workData = new (std::nothrow) NapiWorkData();
|
||||
if (workData == nullptr) {
|
||||
return;
|
||||
}
|
||||
workData->env_ = env_;
|
||||
workData->cb_ = cb_;
|
||||
|
||||
uv_work_t *work = new(std::nothrow) uv_work_t;
|
||||
if (work == nullptr) {
|
||||
delete workData;
|
||||
workData = nullptr;
|
||||
return;
|
||||
}
|
||||
work->data = (void *)workData;
|
||||
|
||||
int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
|
||||
// Js thread
|
||||
NapiWorkData *workData = reinterpret_cast<NapiWorkData *>(work->data);
|
||||
napi_env env = workData->env_;
|
||||
napi_ref cb = workData->cb_;
|
||||
if (env != nullptr && cb != nullptr) {
|
||||
(void)napi_delete_reference(env, cb);
|
||||
}
|
||||
delete workData;
|
||||
delete work;
|
||||
}, uv_qos_default);
|
||||
if (ret != 0) {
|
||||
delete work;
|
||||
work = nullptr;
|
||||
delete workData;
|
||||
workData = nullptr;
|
||||
}
|
||||
}
|
||||
napi_env env_;
|
||||
napi_ref cb_;
|
||||
};
|
||||
|
||||
class NapiAsyncWork {
|
||||
public:
|
||||
static napi_value Enqueue(napi_env env, std::shared_ptr<ContextBase> ctxt, const std::string &name,
|
||||
NapiAsyncExecute execute = NapiAsyncExecute(),
|
||||
NapiAsyncComplete complete = NapiAsyncComplete());
|
||||
|
||||
private:
|
||||
enum {
|
||||
/* AsyncCallback / Promise output result index */
|
||||
RESULT_ERROR = 0,
|
||||
RESULT_DATA = 1,
|
||||
RESULT_ALL = 2
|
||||
};
|
||||
static void CommonCallbackRoutine(ContextBase *ctxt);
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
#endif // NAPI_ASYNC_WORK_H
|
||||
@@ -0,0 +1,249 @@
|
||||
/*
|
||||
* Copyright (c) 2023 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.
|
||||
*/
|
||||
#ifndef NAPI_PARAM_UTILS_H
|
||||
#define NAPI_PARAM_UTILS_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_common.h"
|
||||
#include "napi/native_node_api.h"
|
||||
#include "napi_base_context.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "i_keysession_service.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
/* Constants for array index */
|
||||
const int32_t PARAM0 = 0;
|
||||
const int32_t PARAM1 = 1;
|
||||
const int32_t PARAM2 = 2;
|
||||
const int32_t PARAM3 = 3;
|
||||
|
||||
/* Constants for array size */
|
||||
const int32_t ARGS_ZERO = 0;
|
||||
const int32_t ARGS_ONE = 1;
|
||||
const int32_t ARGS_TWO = 2;
|
||||
const int32_t ARGS_THREE = 3;
|
||||
const int32_t ARGS_FOUR = 4;
|
||||
|
||||
const int32_t KEY_SYSTEM_MAX_NUMBER = 64;
|
||||
const int32_t KEY_SESSION_MAX_NUMBER = 64;
|
||||
|
||||
enum NapiMediaKeyRequestType {
|
||||
MEDIA_KEY_REQUEST_TYPE_UNKNOWN = 0,
|
||||
MEDIA_KEY_REQUEST_TYPE_INITIAL,
|
||||
MEDIA_KEY_REQUEST_TYPE_RENEWAL,
|
||||
MEDIA_KEY_REQUEST_TYPE_RELEASE,
|
||||
MEDIA_KEY_REQUEST_TYPE_NONE,
|
||||
MEDIA_KEY_REQUEST_TYPE_UPDATE,
|
||||
};
|
||||
|
||||
struct NapiProvisionRequest {
|
||||
std::vector<uint8_t> data;
|
||||
std::string defaultURL;
|
||||
};
|
||||
|
||||
struct DrmEventParame {
|
||||
int32_t extra;
|
||||
std::vector<uint8_t> data;
|
||||
};
|
||||
|
||||
struct DrmKeysChangeEventParame {
|
||||
std::map<std::vector<uint8_t>, MediaKeySessionKeyStatus> statusTable;
|
||||
bool hasNewGoodLicense;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class ObjectRefMap {
|
||||
public:
|
||||
static std::mutex allObjLock;
|
||||
static std::map<T*, uint32_t> refMap;
|
||||
static void Insert(T *obj);
|
||||
static void Erase(T *obj);
|
||||
static T *IncreaseRef(T *obj);
|
||||
static void DecreaseRef(T *obj);
|
||||
|
||||
ObjectRefMap(T *obj);
|
||||
~ObjectRefMap();
|
||||
T *GetPtr();
|
||||
|
||||
private:
|
||||
T *obj_ = nullptr;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
std::mutex ObjectRefMap<T>::allObjLock;
|
||||
|
||||
template <typename T>
|
||||
std::map<T *, uint32_t> ObjectRefMap<T>::refMap;
|
||||
|
||||
template <typename T>
|
||||
void ObjectRefMap<T>::Insert(T *obj)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(allObjLock);
|
||||
refMap[obj] = 1;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void ObjectRefMap<T>::Erase(T *obj)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(allObjLock);
|
||||
auto it = refMap.find(obj);
|
||||
if (it != refMap.end()) {
|
||||
refMap.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T *ObjectRefMap<T>::IncreaseRef(T *obj)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(allObjLock);
|
||||
if (refMap.count(obj)) {
|
||||
refMap[obj]++;
|
||||
return obj;
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void ObjectRefMap<T>::DecreaseRef(T *obj)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(allObjLock);
|
||||
if (refMap.count(obj) && --refMap[obj] == 0) {
|
||||
refMap.erase(obj);
|
||||
delete obj;
|
||||
obj = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
ObjectRefMap<T>::ObjectRefMap(T *obj)
|
||||
{
|
||||
if (obj != nullptr) {
|
||||
obj_ = ObjectRefMap::IncreaseRef(obj);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
ObjectRefMap<T>::~ObjectRefMap()
|
||||
{
|
||||
if (obj_ != nullptr) {
|
||||
ObjectRefMap::DecreaseRef(obj_);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T *ObjectRefMap<T>::GetPtr()
|
||||
{
|
||||
return obj_;
|
||||
}
|
||||
|
||||
#define DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar) \
|
||||
do { \
|
||||
void *data; \
|
||||
napi_get_cb_info(env, info, &(argc), argv, &(thisVar), &data); \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar) \
|
||||
do { \
|
||||
void *data; \
|
||||
status = napi_get_cb_info(env, info, nullptr, nullptr, &(thisVar), &data); \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CHECK_AND_RETURN_VOID_LOG(cond, fmt, ...) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
DRM_ERR_LOG(fmt, ##__VA_ARGS__); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DRM_NAPI_CHECK_AND_RETURN_LOG(cond, status, fmt, ...) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
DRM_ERR_LOG(fmt, ##__VA_ARGS__); \
|
||||
return status; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* check condition related to argc/argv, return and logging. */
|
||||
#define NAPI_CHECK_ARGS_RETURN_VOID(context, condition, message, code) \
|
||||
do { \
|
||||
if (!(condition)) { \
|
||||
(context)->status = napi_invalid_arg; \
|
||||
(context)->errMessage = std::string(message); \
|
||||
(context)->errCode = code; \
|
||||
DRM_ERR_LOG("test (" #condition ") failed: " message); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define NAPI_CHECK_STATUS_RETURN_VOID(context, message, code) \
|
||||
do { \
|
||||
if ((context)->status != napi_ok) { \
|
||||
(context)->errMessage = std::string(message); \
|
||||
(context)->errCode = code; \
|
||||
DRM_ERR_LOG("test (context->status == napi_ok) failed: " message); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
class NapiParamUtils {
|
||||
public:
|
||||
static napi_status GetValueInt32(const napi_env &env, int32_t &value, napi_value in);
|
||||
static napi_status SetValueInt32(const napi_env &env, const int32_t &value, napi_value &result);
|
||||
static napi_status GetValueInt32(const napi_env &env, const std::string &fieldStr, int32_t &value, napi_value in);
|
||||
static napi_status SetValueInt32(const napi_env &env, const std::string &fieldStr,
|
||||
const int32_t value, napi_value &result);
|
||||
|
||||
static std::string GetStringArgument(napi_env env, napi_value value);
|
||||
static napi_status SetValueString(const napi_env &env, const std::string &stringValue, napi_value &result);
|
||||
static napi_status SetValueString(const napi_env &env, const std::string &fieldStr, const std::string &stringValue,
|
||||
napi_value &result);
|
||||
|
||||
static napi_value GetUndefinedValue(napi_env env);
|
||||
|
||||
static napi_status SetValueUint8Array(const napi_env &env, const std::vector<uint8_t> &value,
|
||||
napi_value &result);
|
||||
static napi_status SetValueUint8Array(const napi_env &env, const std::string &fieldStr,
|
||||
const std::vector<uint8_t> &value, napi_value &result);
|
||||
static napi_status GetValueUint8Array(const napi_env &env, std::vector<uint8_t> &value,
|
||||
napi_value in);
|
||||
static napi_status SetValueBoolean(const napi_env &env, const bool boolValue, napi_value &result);
|
||||
static napi_status SetValueMap(const napi_env &env,
|
||||
std::map<std::vector<uint8_t>, MediaKeySessionKeyStatus> statusTable, napi_value &result);
|
||||
|
||||
static napi_status GetValueOptionsData(const napi_env &env, std::map<std::string, std::string> &valueMap,
|
||||
napi_value in);
|
||||
static napi_status SetProvisionRequest(const napi_env &env, const NapiProvisionRequest &provisionRequest,
|
||||
napi_value &result);
|
||||
static napi_status SetMediaKeyRequest(const napi_env &env,
|
||||
const IMediaKeySessionService::MediaKeyRequest &mediaKeyRequest, napi_value &result);
|
||||
static napi_status SetDrmEventInfo(const napi_env &env, DrmEventParame &eventParame,
|
||||
napi_value &result);
|
||||
static napi_status SetDrmKeysChangeEventInfo(const napi_env &env, DrmKeysChangeEventParame &eventParame,
|
||||
napi_value &statusTable, napi_value &hasNewGoodLicense);
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
#endif // NAPI_PARAM_UTILS_H
|
||||
Reference in New Issue
Block a user