mirror of
https://github.com/openharmony/multimedia_drm_framework.git
synced 2026-07-01 22:34:02 -04:00
add drm frame work version 1
Signed-off-by: bao92 <baoxianyue@hisilicon.com>
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
#import("//build/config/ohos/rules.gni")
|
||||
import("//build/ohos.gni")
|
||||
group("drm_framework") {
|
||||
deps = [
|
||||
"//foundation/multimedia/drm_framework/frameworks/native:drm_framework",
|
||||
"//foundation/multimedia/drm_framework/interfaces/kits/js/drm_napi:drm_napi",
|
||||
"//foundation/multimedia/drm_framework/services:drm_service",
|
||||
]
|
||||
}
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
{
|
||||
"name": "@ohos/drm_framework",
|
||||
"description": "DRM standard",
|
||||
"version": "3.1",
|
||||
"license": "Apache License 2.0",
|
||||
"publishAs": "code-segment",
|
||||
"segment": {
|
||||
"destPath": "foundation/multimedia/drm_framework"
|
||||
},
|
||||
"dirs": {},
|
||||
"scripts": {},
|
||||
"component": {
|
||||
"name": "multimedia_drm_framework",
|
||||
"subsystem": "multimedia",
|
||||
"syscap": ["SystemCapability.Multimedia.Drm.Core"],
|
||||
"features": [],
|
||||
"adapted_system_type": [ "standard" ],
|
||||
"rom": "",
|
||||
"ram": "",
|
||||
"hisysevent_config": [ ],
|
||||
"deps": {
|
||||
"components": [
|
||||
"safwk",
|
||||
"window_manager",
|
||||
"napi",
|
||||
"samgr",
|
||||
"hitrace",
|
||||
"ipc",
|
||||
"graphic_2d",
|
||||
"hisysevent",
|
||||
"c_utils",
|
||||
"hilog",
|
||||
"zlib",
|
||||
"access_token",
|
||||
"libhilog",
|
||||
"ipc_core",
|
||||
"media_client",
|
||||
"system_ability_fwk",
|
||||
"samgr_proxy",
|
||||
"libaccesstoken_sdk",
|
||||
"ipc_single",
|
||||
"common",
|
||||
"hicollie",
|
||||
"hdf_core",
|
||||
"eventhandler",
|
||||
"bundle_framework",
|
||||
"ability_base"
|
||||
],
|
||||
"third_party": [
|
||||
"glib",
|
||||
"gstreamer",
|
||||
"libffi",
|
||||
"ffmpeg",
|
||||
"libxml2",
|
||||
"bounds_checking_function"
|
||||
]
|
||||
},
|
||||
"build": {
|
||||
"group_type": {
|
||||
"base_group": [
|
||||
],
|
||||
"fwk_group": [
|
||||
"//foundation/multimedia/drm_framework/frameworks/native:drm_framework",
|
||||
"//foundation/multimedia/drm_framework/interfaces/kits/js/drm_napi:drm_napi",
|
||||
"//foundation/multimedia/drm_framework/interfaces/kits/js/drm_napi:drm_js"
|
||||
],
|
||||
"service_group": [
|
||||
"//foundation/multimedia/drm_framework/sa_profile:drm_service_sa_profile",
|
||||
"//foundation/multimedia/drm_framework/services/etc:drm_service.rc",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service:drm_service"
|
||||
]
|
||||
},
|
||||
|
||||
"inner_kits": [
|
||||
{
|
||||
"type": "none",
|
||||
"name": "//foundation/multimedia/drm_framework/frameworks/native:drm_framework",
|
||||
"header": {
|
||||
"header_base": [
|
||||
"foundation/multimedia/drm_framework/interfaces/inner_api/native/drm"
|
||||
],
|
||||
"header_files": [
|
||||
"media_key_system_impl.h",
|
||||
"key_session_impl.h",
|
||||
"media_decrypt_module_impl.h"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "none",
|
||||
"name": "//foundation/multimedia/drm_framework/interfaces/kits/js/drm_napi:drm_napi",
|
||||
"header": {
|
||||
"header_base": [
|
||||
"//foundation/multimedia/drm_framework/interfaces/kits/js/drm_napi/include"
|
||||
],
|
||||
"header_files": [
|
||||
"drm_napi.h",
|
||||
"key_session_napi.h",
|
||||
"media_key_system_napi.h",
|
||||
"media_key_system_callback_napi.h",
|
||||
"native_module_ohos_drm.h"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"test": [
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,215 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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 <map>
|
||||
#include <vector>
|
||||
#include "drm_enum_napi.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
struct JsEnumInt {
|
||||
std::string_view enumName;
|
||||
int32_t enumInt;
|
||||
};
|
||||
|
||||
struct JsEnumString {
|
||||
std::string_view enumName;
|
||||
std::string_view enumString;
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_listenerType = {
|
||||
{ "LISTENER_DRM_EVENT", IKeySessionService::ListenerType::LISTENER_DRM_EVENT },
|
||||
{ "LISTENER_PROVISION_REQUIRED", IKeySessionService::ListenerType::LISTENER_PROVISION_REQUIRED },
|
||||
{ "LISTENER_KEY_NEEDED", IKeySessionService::ListenerType::LISTENER_KEY_NEEDED },
|
||||
{ "LISTENER_KEY_EXPIRED", IKeySessionService::ListenerType::LISTENER_KEY_EXPIRED },
|
||||
{ "LISTENER_VENDOR_DEFINED", IKeySessionService::ListenerType::LISTENER_VENDOR_DEFINED },
|
||||
{ "LISTENER_KEYSESSION_RECLAIMED", IKeySessionService::ListenerType::LISTENER_KEYSESSION_RECLAIMED },
|
||||
{ "LISTENER_EXPIRATION_UPDATE", IKeySessionService::ListenerType::LISTENER_EXPIRATION_UPDATE },
|
||||
{ "LISTENER_KEY_CHANGE", IKeySessionService::ListenerType::LISTENER_KEY_CHANGE },
|
||||
{ "LISTENER_KEYSESSION_LOSE", IKeySessionService::ListenerType::LISTENER_KEYSESSION_LOSE },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_hdcpLevel = {
|
||||
{ "HDCP_UNKNOWN", IMediaKeySystemService::HdcpLevel::HDCP_UNKNOWN },
|
||||
{ "HDCP_NONE", IMediaKeySystemService::HdcpLevel::HDCP_NONE },
|
||||
{ "HDCP_V1", IMediaKeySystemService::HdcpLevel::HDCP_V1 },
|
||||
{ "HDCP_V2", IMediaKeySystemService::HdcpLevel::HDCP_V2 },
|
||||
{ "HDCP_V2_1", IMediaKeySystemService::HdcpLevel::HDCP_V2_1 },
|
||||
{ "HDCP_V2_2", IMediaKeySystemService::HdcpLevel::HDCP_V2_2 },
|
||||
{ "HDCP_V2_3", IMediaKeySystemService::HdcpLevel::HDCP_V2_3 },
|
||||
{ "HDCP_NO_OUTPUT", IMediaKeySystemService::HdcpLevel::HDCP_NO_OUTPUT },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_configType = {
|
||||
{ "CONFIGTYPE_DEVICEPROPERTY", IMediaKeySystemService::ConfigType::CONFIGTYPE_DEVICEPROPERTY },
|
||||
{ "CONFIGTYPE_KEYSESSION", IMediaKeySystemService::ConfigType::CONFIGTYPE_KEYSESSION },
|
||||
{ "CONFIGTYPE_OUTPUTPROTECTTYPE", IMediaKeySystemService::ConfigType::CONFIGTYPE_OUTPUTPROTECTTYPE },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_keyType = {
|
||||
{ "KEYTYPE_OFFLINE", IKeySessionService::KeyType::KEYTYPE_OFFLINE },
|
||||
{ "KEYTYPE_ONLINE", IKeySessionService::KeyType::KEYTYPE_ONLINE },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_offlineKeyState = {
|
||||
{ "OFFLINEKEYSTATE_UNKNOWN", IKeySessionService::OfflineKeyState::OFFLINEKEYSTATE_UNKNOWN },
|
||||
{ "OFFLINEKEYSTATE_USABLE", IKeySessionService::OfflineKeyState::OFFLINEKEYSTATE_USABLE },
|
||||
{ "OFFLINEKEYSTATE_INACTIVE", IKeySessionService::OfflineKeyState::OFFLINEKEYSTATE_INACTIVE },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_requestType = {
|
||||
{ "REQUEST_TYPE_UNKNOWN", IKeySessionService::RequestType::REQUEST_TYPE_UNKNOWN },
|
||||
{ "REQUEST_TYPE_INITIAL", IKeySessionService::RequestType::REQUEST_TYPE_INITIAL },
|
||||
{ "REQUEST_TYPE_RENEWAL", IKeySessionService::RequestType::REQUEST_TYPE_RENEWAL },
|
||||
{ "REQUEST_TYPE_RELEASE", IKeySessionService::RequestType::REQUEST_TYPE_RELEASE },
|
||||
{ "REQUEST_TYPE_NONE", IKeySessionService::RequestType::REQUEST_TYPE_NONE },
|
||||
{ "REQUEST_TYPE_UPDATE", IKeySessionService::RequestType::REQUEST_TYPE_UPDATE },
|
||||
{ "REQUEST_TYPE_DOWNLOADCERT", IKeySessionService::RequestType::REQUEST_TYPE_DOWNLOADCERT },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_securityLevel = {
|
||||
{ "SECURITY_LEVEL_UNKNOWN", IKeySessionService::SecurityLevel::SECURITY_LEVEL_UNKNOWN },
|
||||
{ "SECURITY_LEVEL_SW_CRYPTO", IKeySessionService::SecurityLevel::SECURITY_LEVEL_SW_CRYPTO },
|
||||
{ "SECURITY_LEVEL_SW_DECODE", IKeySessionService::SecurityLevel::SECURITY_LEVEL_SW_DECODE },
|
||||
{ "SECURITY_LEVEL_HW_CRYPTO", IKeySessionService::SecurityLevel::SECURITY_LEVEL_HW_CRYPTO },
|
||||
{ "SECURITY_LEVEL_HW_DECODE", IKeySessionService::SecurityLevel::SECURITY_LEVEL_HW_DECODE },
|
||||
{ "SECURITY_LEVEL_HW_ALL", IKeySessionService::SecurityLevel::SECURITY_LEVEL_HW_ALL },
|
||||
{ "SECURITY_LEVEL_MAX", IKeySessionService::SecurityLevel::SECURITY_LEVEL_MAX },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumInt> g_cryptAlgorithmType = {
|
||||
{ "ALGTYPE_UNENCRYPTED", IMediaDecryptModuleService::CryptAlgorithmType::ALGTYPE_UNENCRYPTED },
|
||||
{ "ALGTYPE_AES_CTR", IMediaDecryptModuleService::CryptAlgorithmType::ALGTYPE_AES_CTR },
|
||||
{ "ALGTYPE_AES_WV", IMediaDecryptModuleService::CryptAlgorithmType::ALGTYPE_AES_WV },
|
||||
{ "ALGTYPE_AES_CBC", IMediaDecryptModuleService::CryptAlgorithmType::ALGTYPE_AES_CBC },
|
||||
{ "ALGTYPE_SM4_CBC", IMediaDecryptModuleService::CryptAlgorithmType::ALGTYPE_SM4_CBC },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumString> g_propertyName = {
|
||||
{ "PROPERTY_DEVICE_VENDOR", "vendor" },
|
||||
{ "PROPERTY_DEVICE_VERSION", "version" },
|
||||
{ "PROPERTY_DEVICE_DESCRIPTION", "description" },
|
||||
{ "PROPERTY_DEVICE_ALGORITHMS", "algorithms" },
|
||||
{ "PROPERTY_DEVICE_UNIQUE_ID", "deviceUniqueId" },
|
||||
{ "PROPERTY_SESSION_MAX", "maxSessionNum" },
|
||||
{ "PROPERTY_SESSION_CURRENT", "currentSessionNum" },
|
||||
{ "PROPERTY_OUTPUT_HDCP_MAX", "maxHDCPLevel" },
|
||||
{ "PROPERTY_OUTPUT_HDCP_CURRENT", "currentHDCPLevel" },
|
||||
};
|
||||
|
||||
static const std::vector<struct JsEnumString> g_metricsName = {
|
||||
{ "METRICS_SESSION_CURRENT", "currentSessionNum" },
|
||||
{ "METRICS_DEVICE_VERSION", "version" },
|
||||
{ "METRICS_DECRYPT_NUMBER", "decryptNumber" },
|
||||
{ "METRICS_ERRO_DECRYPT_NUMBER", "errorDecryptNumber" },
|
||||
};
|
||||
|
||||
static const std::map<std::string_view, const std::vector<struct JsEnumInt>&> g_intEnumClassMap = {
|
||||
{ "ListenerType", g_listenerType },
|
||||
{ "HdcpLevel", g_hdcpLevel },
|
||||
{ "ConfigType", g_configType },
|
||||
{ "KeyType", g_keyType },
|
||||
{ "OfflineKeyState", g_offlineKeyState },
|
||||
{ "RequestType", g_requestType },
|
||||
{ "SecurityLevel", g_securityLevel },
|
||||
{ "CryptAlgorithmType", g_cryptAlgorithmType },
|
||||
};
|
||||
|
||||
static const std::map<std::string_view, const std::vector<struct JsEnumString>&> g_stringEnumClassMap = {
|
||||
{ "PropertyName", g_propertyName },
|
||||
{ "MetricsName", g_metricsName },
|
||||
};
|
||||
|
||||
napi_value DrmEnumNapi::JsEnumIntInit(napi_env env, napi_value exports)
|
||||
{
|
||||
for (auto it = g_intEnumClassMap.begin(); it != g_intEnumClassMap.end(); it++) {
|
||||
auto &enumClassName = it->first;
|
||||
auto &enumItemVec = it->second;
|
||||
int32_t vecSize = enumItemVec.size();
|
||||
std::vector<napi_value> value;
|
||||
value.resize(vecSize);
|
||||
for (int32_t index = 0; index < vecSize; ++index) {
|
||||
napi_create_int32(env, enumItemVec[index].enumInt, &value[index]);
|
||||
}
|
||||
|
||||
std::vector<napi_property_descriptor> property;
|
||||
property.resize(vecSize);
|
||||
for (int32_t index = 0; index < vecSize; ++index) {
|
||||
property[index] = napi_property_descriptor DECLARE_NAPI_STATIC_PROPERTY(
|
||||
enumItemVec[index].enumName.data(), value[index]);
|
||||
}
|
||||
|
||||
auto constructor = [](napi_env env, napi_callback_info info) {
|
||||
napi_value jsThis = nullptr;
|
||||
napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr);
|
||||
return jsThis;
|
||||
};
|
||||
|
||||
napi_value result = nullptr;
|
||||
napi_status status = napi_define_class(env, enumClassName.data(), NAPI_AUTO_LENGTH, constructor,
|
||||
nullptr, property.size(), property.data(), &result);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to define enum");
|
||||
|
||||
status = napi_set_named_property(env, exports, enumClassName.data(), result);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to set result");
|
||||
}
|
||||
return exports;
|
||||
}
|
||||
|
||||
napi_value DrmEnumNapi::JsEnumStringInit(napi_env env, napi_value exports)
|
||||
{
|
||||
for (auto it = g_stringEnumClassMap.begin(); it != g_stringEnumClassMap.end(); it++) {
|
||||
auto &enumClassName = it->first;
|
||||
auto &enumItemVec = it->second;
|
||||
int32_t vecSize = enumItemVec.size();
|
||||
std::vector<napi_value> value;
|
||||
value.resize(vecSize);
|
||||
for (int32_t index = 0; index < vecSize; ++index) {
|
||||
napi_create_string_utf8(env, enumItemVec[index].enumString.data(), NAPI_AUTO_LENGTH, &value[index]);
|
||||
}
|
||||
|
||||
std::vector<napi_property_descriptor> property;
|
||||
property.resize(vecSize);
|
||||
for (int32_t index = 0; index < vecSize; ++index) {
|
||||
property[index] = napi_property_descriptor DECLARE_NAPI_STATIC_PROPERTY(
|
||||
enumItemVec[index].enumName.data(), value[index]);
|
||||
}
|
||||
|
||||
auto constructor = [](napi_env env, napi_callback_info info) {
|
||||
napi_value jsThis = nullptr;
|
||||
napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr);
|
||||
return jsThis;
|
||||
};
|
||||
|
||||
napi_value result = nullptr;
|
||||
napi_status status = napi_define_class(env, enumClassName.data(), NAPI_AUTO_LENGTH, constructor,
|
||||
nullptr, property.size(), property.data(), &result);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to define enum");
|
||||
|
||||
status = napi_set_named_property(env, exports, enumClassName.data(), result);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to set result");
|
||||
}
|
||||
return exports;
|
||||
}
|
||||
|
||||
napi_value DrmEnumNapi::Init(napi_env env, napi_value exports)
|
||||
{
|
||||
JsEnumIntInit(env, exports);
|
||||
JsEnumStringInit(env, exports);
|
||||
return exports;
|
||||
}
|
||||
} // namespace drm
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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_napi.h"
|
||||
#include "ipc_skeleton.h"
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
thread_local napi_ref DrmNapi::sConstructor_ = nullptr;
|
||||
|
||||
DrmNapi::DrmNapi() : env_(nullptr), wrapper_(nullptr)
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
|
||||
}
|
||||
|
||||
DrmNapi::~DrmNapi()
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
|
||||
if (wrapper_ != nullptr) {
|
||||
napi_delete_reference(env_, wrapper_);
|
||||
}
|
||||
}
|
||||
|
||||
napi_value DrmNapi::Init(napi_env env, napi_value exports)
|
||||
{
|
||||
DRM_INFO_LOG("DrmNapi Init enter.");
|
||||
napi_property_descriptor drmproperty[] = {
|
||||
DECLARE_NAPI_FUNCTION("getMediaKeySystemTest", CreateMediaKeySystemInstance),
|
||||
};
|
||||
DRM_DEBUG_LOG("DrmNapi enter properties");
|
||||
napi_property_descriptor drm_static_properties[] = {
|
||||
DECLARE_NAPI_STATIC_FUNCTION("getMediaKeySystem", CreateMediaKeySystemInstance),
|
||||
DECLARE_NAPI_STATIC_FUNCTION("isMediaKeySystemSupported", IsMediaKeySystemSupported),
|
||||
};
|
||||
DRM_DEBUG_LOG("DrmNapi enter napi_define_class");
|
||||
napi_value constructor = nullptr;
|
||||
napi_status status = napi_define_class(env, DRM_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH, DrmNapiConstructor, nullptr,
|
||||
sizeof(drmproperty) / sizeof(drmproperty[0]), drmproperty, &constructor);
|
||||
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to define DrmNapi class");
|
||||
|
||||
status = napi_create_reference(env, constructor, 1, &sConstructor_);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to create reference of DrmNapi constructor");
|
||||
|
||||
status = napi_set_named_property(env, exports, DRM_NAPI_CLASS_NAME, constructor);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to set DrmNapi constructor");
|
||||
|
||||
status = napi_define_properties(env, exports, sizeof(drm_static_properties) / sizeof(drm_static_properties[0]), drm_static_properties);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, nullptr, "Failed to define static DrmNapi function");
|
||||
|
||||
DRM_INFO_LOG("DrmNapi Init success");
|
||||
return exports;
|
||||
}
|
||||
|
||||
napi_value DrmNapi::DrmNapiConstructor(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("DrmNapi DrmNapiConstructor enter.");
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
napi_value thisVar = nullptr;
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
DRM_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
|
||||
|
||||
if (status == napi_ok && thisVar != nullptr) {
|
||||
std::unique_ptr<DrmNapi> obj = std::make_unique<DrmNapi>();
|
||||
if (obj != nullptr) {
|
||||
obj->env_ = env;
|
||||
status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
|
||||
DrmNapi::DrmNapiDestructor, nullptr, nullptr);
|
||||
if (status == napi_ok) {
|
||||
obj.release();
|
||||
return thisVar;
|
||||
} else {
|
||||
DRM_ERR_LOG("DrmNapiDestructor Failure wrapping js to native napi");
|
||||
}
|
||||
}
|
||||
}
|
||||
DRM_ERR_LOG("DrmNapiDestructor call Failed!");
|
||||
DRM_INFO_LOG("DrmNapi DrmNapiConstructor exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
void DrmNapi::DrmNapiDestructor(napi_env env, void *nativeObject, void *finalize)
|
||||
{
|
||||
DRM_INFO_LOG("DrmNapi DrmNapiDestructor enter.");
|
||||
DrmNapi* drmNapi = reinterpret_cast<DrmNapi*>(nativeObject);
|
||||
if (drmNapi != nullptr) {
|
||||
drmNapi->~DrmNapi();
|
||||
}
|
||||
DRM_INFO_LOG("DrmNapi DrmNapiDestructor exit.");
|
||||
}
|
||||
|
||||
napi_value DrmNapi::IsMediaKeySystemSupported(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("DrmNapi IsMediaKeySystemSupported enter.");
|
||||
napi_value result = nullptr;
|
||||
result = MediaKeySystemNapi::IsMediaKeySystemSupported(env, info);
|
||||
DRM_ERR_LOG("DrmNapi IsMediaKeySystemSupported exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value DrmNapi::CreateMediaKeySystemInstance(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("DrmNapi CreateMediaKeySystemInstance enter.");
|
||||
napi_value result = nullptr;
|
||||
result = MediaKeySystemNapi::CreateMediaKeySystemInstance(env,info);
|
||||
DRM_INFO_LOG("DrmNapi CreateMediaKeySystemInstance exit.");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
} //namespace OHOS
|
||||
} //namespace DrmStandard
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_callback_napi.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
KeySessionCallbackNapi::KeySessionCallbackNapi() {}
|
||||
|
||||
KeySessionCallbackNapi::~KeySessionCallbackNapi() {}
|
||||
|
||||
void KeySessionCallbackNapi::SetCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionCallbackNapi SetCallbackReference");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
callbackMap_[eventType] = callbackPair;
|
||||
}
|
||||
|
||||
void KeySessionCallbackNapi::ClearCallbackReference(const std::string eventType)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionCallbackNapi ClearCallbackReference");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (callbackMap_.find(eventType) != callbackMap_.end()) {
|
||||
callbackMap_.erase(eventType);
|
||||
DRM_INFO_LOG("KeySessionCallbackNapi ClearCallbackReference %{public}s", eventType.c_str());
|
||||
} else {
|
||||
DRM_WARNING_LOG("ClearCallbackReference failed, no this event: %{public}s", eventType.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void KeySessionCallbackNapi::OnKeySessionKeyExpired(const std::string eventType, const KeyStatus status)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionCallbackNapi OnKeySessionKeyExpired");
|
||||
napi_value result;
|
||||
napi_value jsCallback = nullptr;
|
||||
napi_value retVal;
|
||||
napi_status state;
|
||||
|
||||
CHECK_AND_RETURN_LOG(callbackMap_.find(eventType) != callbackMap_.end(),
|
||||
"Napi OnKeySessionKeyExpired, not register this callback");
|
||||
sptr<CallBackPair> item = callbackMap_[eventType];
|
||||
|
||||
CHECK_AND_RETURN_LOG(item != nullptr, "Napi OnKeySessionKeyExpired, sptr callbackPair is nullptr");
|
||||
napi_env env = item->GetEnv();
|
||||
napi_ref callbackRef = item->GetCallback();
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
napi_create_object(env, &result);
|
||||
|
||||
int32_t keyStatus = static_cast<int32_t>(status);
|
||||
napi_value args[1] = {nullptr};
|
||||
(void)napi_create_int32(env, keyStatus, &args[0]);
|
||||
DRM_INFO_LOG("Napi OnKeySessionKeyExpired, Status: %{public}d", keyStatus);
|
||||
|
||||
napi_get_reference_value(env, callbackRef, &jsCallback);
|
||||
state = napi_call_function(env, nullptr, jsCallback, ARGS_ONE, args, &retVal);
|
||||
CHECK_AND_RETURN_LOG(state == napi_ok,
|
||||
"%{public}s failed to napi_call_function", eventType.c_str());
|
||||
}
|
||||
|
||||
void KeySessionCallbackNapi::OnKeySessionReclaimed(const std::string eventType, const SessionStatus status)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionCallbackNapi OnKeySessionReclaimed");
|
||||
napi_value result;
|
||||
napi_value jsCallback = nullptr;
|
||||
napi_value retVal;
|
||||
napi_status state;
|
||||
|
||||
CHECK_AND_RETURN_LOG(callbackMap_.find(eventType) != callbackMap_.end(),
|
||||
"Napi OnKeySessionReclaimed, not register this callback");
|
||||
sptr<CallBackPair> item = callbackMap_[eventType];
|
||||
|
||||
CHECK_AND_RETURN_LOG(item != nullptr, "Napi OnKeySessionReclaimed, sptr callbackPair is nullptr");
|
||||
napi_env env = item->GetEnv();
|
||||
napi_ref callbackRef = item->GetCallback();
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
napi_create_object(env, &result);
|
||||
|
||||
int32_t sessionStatus = static_cast<int32_t>(status);
|
||||
napi_value args[1] = {nullptr};
|
||||
(void)napi_create_int32(env, sessionStatus, &args[0]);
|
||||
DRM_INFO_LOG("Napi OnKeySessionReclaimed, Status: %{public}d", sessionStatus);
|
||||
|
||||
napi_get_reference_value(env, callbackRef, &jsCallback);
|
||||
state = napi_call_function(env, nullptr, jsCallback, ARGS_ONE, args, &retVal);
|
||||
CHECK_AND_RETURN_LOG(state == napi_ok,
|
||||
"%{public}s failed to napi_call_function", eventType.c_str());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,889 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_napi.h"
|
||||
#include "media_decrypt_module_napi.h"
|
||||
#include "key_session_impl.h"
|
||||
#include "media_key_system_impl.h"
|
||||
#include "ipc_skeleton.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
thread_local napi_ref KeySessionNapi::sConstructor_ = nullptr;
|
||||
thread_local sptr<KeySessionImpl> KeySessionNapi::sKeySessionImpl_ = nullptr;
|
||||
|
||||
KeySessionNapi::KeySessionNapi() : env_(nullptr), wrapper_(nullptr)
|
||||
{
|
||||
DRM_INFO_LOG("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
|
||||
}
|
||||
|
||||
KeySessionNapi::~KeySessionNapi()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::~KeySessionNapi Init enter.");
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
|
||||
if (wrapper_ != nullptr) {
|
||||
napi_delete_reference(env_, wrapper_);
|
||||
}
|
||||
if (keySessionImpl_) {
|
||||
keySessionImpl_ = nullptr;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionNapi::~KeySessionNapi Init exit.");
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::Init(napi_env env, napi_value exports)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::KeySessionNapi Init enter.");
|
||||
napi_status status;
|
||||
napi_value ctorObj;
|
||||
int32_t refCount = 1;
|
||||
|
||||
napi_property_descriptor session_props[] = {
|
||||
DECLARE_NAPI_FUNCTION("release", Release),
|
||||
DECLARE_NAPI_FUNCTION("generateLicenseRequest", GenerateLicenseRequest),
|
||||
DECLARE_NAPI_FUNCTION("processLicenseResponse", ProcessLicenseResponse),
|
||||
DECLARE_NAPI_FUNCTION("generateOfflineReleaseRequest", GenerateOfflineReleaseRequest),
|
||||
DECLARE_NAPI_FUNCTION("processOfflineReleaseResponse", ProcessOfflineReleaseResponse),
|
||||
DECLARE_NAPI_FUNCTION("checkLicenseStatus", CheckLicenseStatus),
|
||||
DECLARE_NAPI_FUNCTION("restoreOfflineKeys", RestoreOfflineKeys),
|
||||
DECLARE_NAPI_FUNCTION("removeOfflineKeys", RemoveOfflineKeys),
|
||||
DECLARE_NAPI_FUNCTION("getOfflineKeyIds", GetOfflineKeyIds),
|
||||
DECLARE_NAPI_FUNCTION("removeLicenses", RemoveLicenses),
|
||||
DECLARE_NAPI_FUNCTION("getDecryptModule", GetDecryptModule),
|
||||
DECLARE_NAPI_FUNCTION("addEventListener", AddEventListener),
|
||||
DECLARE_NAPI_FUNCTION("deleteEventListener", DeleteEventListener),
|
||||
DECLARE_NAPI_FUNCTION("getOfflineKeyState", GetOfflineKeyState),
|
||||
DECLARE_NAPI_FUNCTION("on", SetEventCallback),
|
||||
DECLARE_NAPI_FUNCTION("off", UnsetEventCallback),
|
||||
};
|
||||
status = napi_define_class(env, KEY_SESSION_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
|
||||
KeySessionNapiConstructor, nullptr,
|
||||
sizeof(session_props) / sizeof(session_props[PARAM0]),
|
||||
session_props, &ctorObj);
|
||||
if (status == napi_ok) {
|
||||
status = napi_create_reference(env, ctorObj, refCount, &sConstructor_);
|
||||
if (status == napi_ok) {
|
||||
status = napi_set_named_property(env, exports, KEY_SESSION_NAPI_CLASS_NAME, ctorObj);
|
||||
if (status == napi_ok) {
|
||||
DRM_DEBUG_LOG("KeySessionNapi return exports");
|
||||
return exports;
|
||||
}
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionNapi::KeySessionNapi Init call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::KeySessionNapiConstructor(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::KeySessionNapiConstructor enter.");
|
||||
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
napi_value thisVar = nullptr;
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
DRM_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
|
||||
|
||||
if (status == napi_ok && thisVar != nullptr) {
|
||||
std::unique_ptr<KeySessionNapi> obj = std::make_unique<KeySessionNapi>();
|
||||
if (obj != nullptr) {
|
||||
obj->env_ = env;
|
||||
if (sKeySessionImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("sKeySessionImpl_ is null");
|
||||
return result;
|
||||
}
|
||||
obj->keySessionImpl_ = sKeySessionImpl_;
|
||||
obj->keySessionCallbackNapi_ = new KeySessionCallbackNapi();
|
||||
obj->keySessionImpl_->SetKeySessionCallback(obj->keySessionCallbackNapi_);
|
||||
status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
|
||||
KeySessionNapi::KeySessionNapiDestructor, nullptr, nullptr);
|
||||
if (status == napi_ok) {
|
||||
obj.release();
|
||||
const std::string propertyName = "KeySessionNative";
|
||||
SetKeySessionNativeProperty(env, thisVar, propertyName, sKeySessionImpl_);
|
||||
return thisVar;
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi Failure wrapping js to native napi");
|
||||
}
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionNapi::KeySessionNapiConstructor faild, exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
void KeySessionNapi::KeySessionNapiDestructor(napi_env env, void *nativeObject, void *finalize)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::KeySessionNapiDestructor enter.");
|
||||
KeySessionNapi* keySessionNapiObj = reinterpret_cast<KeySessionNapi*>(nativeObject);
|
||||
if (keySessionNapiObj != nullptr) {
|
||||
keySessionNapiObj->~KeySessionNapi();
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionNapi::KeySessionNapiDestructor exit.");
|
||||
}
|
||||
|
||||
bool KeySessionNapi::SetKeySessionNativeProperty(napi_env env, napi_value obj, const std::string &name, sptr<KeySessionImpl> keySessionImpl)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::SetKeySessionNativeProperty enter.");
|
||||
CHECK_AND_RETURN_RET_LOG(obj != nullptr, false, "obj is nullptr");
|
||||
|
||||
napi_value keySessionImplNative = nullptr;
|
||||
int64_t nativePointer = reinterpret_cast<int64_t>(keySessionImpl.GetRefPtr());
|
||||
DRM_DEBUG_LOG("SetKeySessionNativeProperty get nativePointer:%{public}lld", nativePointer);
|
||||
napi_status status = napi_create_int64(env, nativePointer, &keySessionImplNative);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, false, "create int failed");
|
||||
|
||||
napi_value nameStr = nullptr;
|
||||
status = napi_create_string_utf8(env, name.c_str(), NAPI_AUTO_LENGTH, &nameStr);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, false, "create string failed");
|
||||
|
||||
status = napi_set_property(env, obj, nameStr, keySessionImplNative);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, false, "set property failed");
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::SetKeySessionNativeProperty exit.");
|
||||
return true;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::CreateKeySession(napi_env env, sptr<KeySessionImpl> keySessionImpl)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::CreateKeySession enter.");
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
napi_value constructor;
|
||||
|
||||
status = napi_get_reference_value(env, sConstructor_, &constructor);
|
||||
|
||||
if (status == napi_ok) {
|
||||
sKeySessionImpl_ = keySessionImpl;
|
||||
if (sKeySessionImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("Failed to CreateKeySession instance");
|
||||
napi_get_undefined(env, &result);
|
||||
return result;
|
||||
}
|
||||
status = napi_new_instance(env, constructor, 0, nullptr, &result);
|
||||
sKeySessionImpl_ = nullptr;
|
||||
if (status == napi_ok && result != nullptr) {
|
||||
DRM_INFO_LOG("success to CreateKeySession napi instance");
|
||||
return result;
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to CreateKeySession napi instance");
|
||||
}
|
||||
}
|
||||
DRM_DEBUG_LOG("Failed to create CreateKeySession napi instance last");
|
||||
napi_get_undefined(env, &result);
|
||||
DRM_INFO_LOG("KeySessionNapi::CreateKeySession exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::Release(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::Release enter.");
|
||||
int32_t currentPid = IPCSkeleton::GetCallingPid();
|
||||
DRM_DEBUG_LOG("KeySessionNapi GetCallingPID: %{public}d", currentPid);
|
||||
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
keySessionNapi->keySessionImpl_->Release();
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi Release call Failed!");
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionNapi::Release exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::GenerateLicenseRequest(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::GenerateLicenseRequest enter");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_THREE;
|
||||
napi_value argv[ARGS_THREE] = {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;
|
||||
napi_value requestType;
|
||||
napi_value mData;
|
||||
napi_value mDefaultURL;
|
||||
const char *requestTypeEnum;
|
||||
IKeySessionService::DrmInfo drmInfo;
|
||||
IKeySessionService::LicenseInfo licenseInfo;
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
|
||||
napi_create_object(env, &result);
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_THREE, "requires 3 parameters maximum");
|
||||
|
||||
if (napi_get_value_string_utf8(env, argv[PARAM0], buffer, PATH_MAX, &length) != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read mimeType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_is_typedarray(env, argv[PARAM1], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM1] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM1], &type, &initDataLen, &initData, &arraybuffer, &offset);
|
||||
if (initData == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* initDataPtr = reinterpret_cast<uint8_t*>(initData);
|
||||
std::vector<uint8_t> initDataStr(initDataPtr, initDataPtr + initDataLen);
|
||||
int32_t keyType = 0;
|
||||
status = napi_get_value_int32(env, argv[PARAM2], &keyType);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("-Could not able to read keyType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
drmInfo.keyType = (IKeySessionService::KeyType)keyType;
|
||||
drmInfo.mimeType = std::string(buffer);
|
||||
drmInfo.indexInfo = initDataStr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
keySessionNapi->keySessionImpl_->GenerateLicenseRequest(drmInfo, licenseInfo);
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi GenerateLicenseRequest call Failed!");
|
||||
}
|
||||
|
||||
if (licenseInfo.requestType == 0) {
|
||||
requestTypeEnum = "ALGTYPE_UNENCRYPTED";
|
||||
} else if (licenseInfo.requestType == 1) {
|
||||
requestTypeEnum = "REQUEST_TYPE_INITIAL";
|
||||
} else if (licenseInfo.requestType == 2) {
|
||||
requestTypeEnum = "REQUEST_TYPE_RENEWAL";
|
||||
} else if (licenseInfo.requestType == 3) {
|
||||
requestTypeEnum = "REQUEST_TYPE_RELEASE";
|
||||
} else if (licenseInfo.requestType == 4) {
|
||||
requestTypeEnum = "REQUEST_TYPE_NONE";
|
||||
} else if (licenseInfo.requestType == 5) {
|
||||
requestTypeEnum = "REQUEST_TYPE_UPDATE";
|
||||
} else if (licenseInfo.requestType == 6) {
|
||||
requestTypeEnum = "REQUEST_TYPE_DOWNLOADCERT";
|
||||
}
|
||||
napi_create_string_utf8(env, requestTypeEnum, NAPI_AUTO_LENGTH, &requestType);
|
||||
napi_set_named_property(env, result, "requestType", requestType);
|
||||
|
||||
size_t mDataLen = licenseInfo.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, licenseInfo.mData[i], &item);
|
||||
napi_set_element(env, mData, i, item);
|
||||
}
|
||||
napi_set_named_property(env, result, "mData", mData);
|
||||
|
||||
napi_create_string_utf8(env, licenseInfo.mDefaultURL.c_str(), NAPI_AUTO_LENGTH, &mDefaultURL);
|
||||
napi_set_named_property(env, result, "mDefaultURL", mDefaultURL);
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::GenerateLicenseRequest exit");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::ProcessLicenseResponse(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::ProcessLicenseResponse 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> keyId;
|
||||
KeySessionNapi* 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("argv[PARAM0] 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> licenseResponse(reponseDataPtr, reponseDataPtr + reponseDataLen);
|
||||
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->ProcessLicenseResponse(keyId, licenseResponse);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi ProcessLicenseResponse faild!");
|
||||
return nullptr;
|
||||
}
|
||||
size_t keyIdLen = keyId.size();
|
||||
NAPI_CALL(env, napi_create_array(env, &result));
|
||||
for (size_t i = 0; i < keyIdLen; i++) {
|
||||
napi_value item;
|
||||
napi_create_int32(env, keyId[i], &item);
|
||||
napi_set_element(env, result, i, item);
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi ProcessLicenseResponse call Failed!");
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::ProcessLicenseResponse exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::GenerateOfflineReleaseRequest(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::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 *keyId = nullptr;
|
||||
size_t keyIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
std::vector<uint8_t> releaseRequest;
|
||||
KeySessionNapi* 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("argv[PARAM0] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &keyIdLen, &keyId, &arraybuffer, &offset);
|
||||
if (keyId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* keyIdPtr = reinterpret_cast<uint8_t*>(keyId);
|
||||
std::vector<uint8_t> keyIdVec(keyIdPtr, keyIdPtr + keyIdLen);
|
||||
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->GenerateOfflineReleaseRequest(keyIdVec, releaseRequest);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi GenerateOfflineReleaseRequest faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi ProcessLicenseResponse call Failed!");
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::GenerateOfflineReleaseRequest exit");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::ProcessOfflineReleaseResponse(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::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 *keyId = nullptr;
|
||||
size_t keyIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
void *response = nullptr;
|
||||
size_t responseLen;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_TWO, "requires 2 parameters maximum");
|
||||
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM0] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &keyIdLen, &keyId, &arraybuffer, &offset);
|
||||
if (keyId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* keyIdPtr = reinterpret_cast<uint8_t*>(keyId);
|
||||
std::vector<uint8_t> keyIdVec(keyIdPtr, keyIdPtr + keyIdLen);
|
||||
napi_is_typedarray(env, argv[PARAM1], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM1] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM1], &type, &responseLen, &response, &arraybuffer, &offset);
|
||||
if (response == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* responsePtr = reinterpret_cast<uint8_t*>(response);
|
||||
std::vector<uint8_t> responseVec(responsePtr, responsePtr + responseLen);
|
||||
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->ProcessOfflineReleaseResponse(keyIdVec, responseVec);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi ProcessOfflineReleaseResponse faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi ProcessOfflineReleaseResponse call Failed!");
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::ProcessOfflineReleaseResponse exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
static napi_value vectorToJsArray(napi_env env, std::vector<IKeySessionService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("vectorToJsArray enter.");
|
||||
napi_value jsArray;
|
||||
napi_value jsName;
|
||||
napi_value jsValue;
|
||||
napi_create_array_with_length(env, infoMap.size(), &jsArray);
|
||||
for (size_t i = 0; i < infoMap.size(); i++) {
|
||||
napi_value jsObject;
|
||||
napi_create_object(env, &jsObject);
|
||||
napi_create_string_utf8(env, infoMap[i].name.c_str(), NAPI_AUTO_LENGTH, &jsName);
|
||||
napi_set_named_property(env, jsObject, "name", jsName);
|
||||
napi_create_string_utf8(env, infoMap[i].value.c_str(), NAPI_AUTO_LENGTH, &jsValue);
|
||||
napi_set_named_property(env, jsObject, "value", jsValue);
|
||||
napi_set_element(env, jsArray, i, jsObject);
|
||||
}
|
||||
DRM_INFO_LOG("vectorToJsArray exit.");
|
||||
return jsArray;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::CheckLicenseStatus(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::CheckLicenseStatus enter");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
std::vector<IKeySessionService::KeyValue> infoMap;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->CheckLicenseStatus(infoMap);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi CheckLicenseStatus faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi CheckLicenseStatus call Failed!");
|
||||
}
|
||||
|
||||
result = vectorToJsArray(env, infoMap);
|
||||
DRM_INFO_LOG("KeySessionNapi::CheckLicenseStatus exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::RestoreOfflineKeys(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::RestoreOfflineKeys 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 *keyId = nullptr;
|
||||
size_t keyIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
KeySessionNapi* 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("argv[PARAM0] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &keyIdLen, &keyId, &arraybuffer, &offset);
|
||||
if (keyId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* keyIdPtr = reinterpret_cast<uint8_t*>(keyId);
|
||||
std::vector<uint8_t> keyIdVec(keyIdPtr, keyIdPtr + keyIdLen);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->RestoreOfflineKeys(keyIdVec);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi RestoreOfflineKeys faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi RestoreOfflineKeys call Failed!");
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::RestoreOfflineKeys exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::RemoveOfflineKeys(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::RemoveOfflineKeys 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 *keyId = nullptr;
|
||||
size_t keyIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 2 parameters maximum");
|
||||
napi_is_typedarray(env, argv[PARAM0], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM0] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &keyIdLen, &keyId, &arraybuffer, &offset);
|
||||
if (keyId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* keyIdPtr = reinterpret_cast<uint8_t*>(keyId);
|
||||
std::vector<uint8_t> keyIdVec(keyIdPtr, keyIdPtr + keyIdLen);
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->RemoveOfflineKeys(keyIdVec);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi RemoveOfflineKeys faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi RemoveOfflineKeys call Failed!");
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::RemoveOfflineKeys exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
static napi_value vectorToJs2DArray(napi_env env, std::vector<std::vector<uint8_t>> vec)
|
||||
{
|
||||
DRM_INFO_LOG("vectorToJs2DArray enter.");
|
||||
napi_value outArray;
|
||||
napi_value inArray;
|
||||
napi_status status = napi_create_array(env, &outArray);
|
||||
for (size_t i = 0; i < vec.size(); i++) {
|
||||
status = napi_create_array(env, &inArray);
|
||||
for (size_t j = 0; j < vec[i].size(); j++) {
|
||||
napi_value elem;
|
||||
status = napi_create_uint32(env, vec[i][j], &elem);
|
||||
status = napi_set_element(env, inArray, j, elem);
|
||||
}
|
||||
status = napi_set_element(env, outArray, i, inArray);
|
||||
}
|
||||
DRM_INFO_LOG("vectorToJs2DArray exit.");
|
||||
return outArray;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::GetOfflineKeyIds(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::GetOfflineKeyIds enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc >= ARGS_ZERO, "requires 0 parameters maximum");
|
||||
std::vector<std::vector<uint8_t>> keyIds;
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->GetOfflineKeyIds(keyIds);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi GetOfflineKeyIds faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi GetOfflineKeyIds call Failed!");
|
||||
}
|
||||
|
||||
result = vectorToJs2DArray(env, keyIds);
|
||||
DRM_INFO_LOG("KeySessionNapi::GetOfflineKeyIds exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::RemoveLicenses(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::RemoveLicenses enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
|
||||
int32_t currentPid = IPCSkeleton::GetCallingPid();
|
||||
DRM_DEBUG_LOG("KeySessionNapi GetCallingPID: %{public}d", currentPid);
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->RemoveLicenses();
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi RemoveLicenses faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi RemoveLicenses call Failed!");
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionNapi::RemoveLicenses exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::GetDecryptModule(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::GetDecryptModule enter.");
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
sptr<MediaDecryptModuleImpl> mediaDecryptModuleImpl = nullptr;
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
mediaDecryptModuleImpl = keySessionNapi->keySessionImpl_->GetDecryptModule();
|
||||
if (mediaDecryptModuleImpl == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionNapi mediaDecryptModuleImpl get failed!!!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi RemoveLicenses call Failed!");
|
||||
}
|
||||
|
||||
result = MediaDecryptModuleNapi::GetDecryptModule(env, mediaDecryptModuleImpl);
|
||||
DRM_INFO_LOG("KeySessionNapi::GetDecryptModule exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::GetOfflineKeyState(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::GetOfflineKeyState enter");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
void *keyId = nullptr;
|
||||
size_t keyIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
bool isTypeArray;
|
||||
|
||||
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] is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM0], &type, &keyIdLen, &keyId, &arraybuffer, &offset);
|
||||
if (keyId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* keyIdPtr = reinterpret_cast<uint8_t*>(keyId);
|
||||
std::vector<uint8_t> keyIdVec(keyIdPtr, keyIdPtr + keyIdLen);
|
||||
IKeySessionService::OfflineKeyState offlineKeyState = IKeySessionService::OFFLINEKEYSTATE_UNKNOWN;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
int ret = keySessionNapi->keySessionImpl_->GetOfflineKeyState(keyIdVec, offlineKeyState);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi GetOfflineKeyState faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi GetOfflineKeyState call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NAPI_CALL(env, napi_create_int32(env, (int)offlineKeyState, &result));
|
||||
DRM_INFO_LOG("KeySessionNapi::GetOfflineKeyState exit");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
napi_value KeySessionNapi::AddEventListener(napi_env env, napi_callback_info info)
|
||||
{
|
||||
napi_value result = nullptr;
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::DeleteEventListener(napi_env env, napi_callback_info info)
|
||||
{
|
||||
napi_value result = nullptr;
|
||||
return result;
|
||||
}
|
||||
|
||||
void KeySessionNapi::SetEventCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::SetCallbackReference");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (keySessionCallbackNapi_ != nullptr) {
|
||||
keySessionCallbackNapi_->SetCallbackReference(eventType, callbackPair);
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi::SetCallbackReference failed");
|
||||
}
|
||||
}
|
||||
|
||||
void KeySessionNapi::ClearEventCallbackReference(const std::string eventType)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::ClearEventCallbackReference");
|
||||
if (keySessionCallbackNapi_ != nullptr) {
|
||||
keySessionCallbackNapi_->ClearCallbackReference(eventType);
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi::ClearEventCallbackReference failed");
|
||||
}
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::SetEventCallback(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::SetEventCallback");
|
||||
napi_value result = nullptr;
|
||||
napi_get_undefined(env, &result);
|
||||
char buffer[PATH_MAX];
|
||||
size_t length = 0;
|
||||
size_t argc = ARGS_TWO;
|
||||
napi_value thisVar = nullptr;
|
||||
napi_value argv[ARGS_TWO] = { nullptr };
|
||||
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) {
|
||||
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) {
|
||||
return result;
|
||||
}
|
||||
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
napi_get_value_string_utf8(env, argv[PARAM0], buffer, PATH_MAX, &length);
|
||||
std::string eventType = std::string(buffer);
|
||||
napi_ref callbackRef;
|
||||
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);
|
||||
keySessionNapi->SetEventCallbackReference(eventType, callbackPair);
|
||||
DRM_INFO_LOG("KeySessionNapi::SetEventCallback out");
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi SetEventCallback failed!");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value KeySessionNapi::UnsetEventCallback(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionNapi::UnsetEventCallback");
|
||||
napi_value result = nullptr;
|
||||
napi_get_undefined(env, &result);
|
||||
napi_value thisVar = nullptr;
|
||||
napi_value argv[1] = { nullptr };
|
||||
size_t argc = 1;
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
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!");
|
||||
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!");
|
||||
return result;
|
||||
}
|
||||
|
||||
KeySessionNapi* keySessionNapi = nullptr;
|
||||
char buffer[PATH_MAX];
|
||||
size_t length = 0;
|
||||
napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&keySessionNapi));
|
||||
if (status == napi_ok && keySessionNapi != nullptr) {
|
||||
napi_get_value_string_utf8(env, argv[PARAM0], buffer, PATH_MAX, &length);
|
||||
std::string eventType = std::string(buffer);
|
||||
keySessionNapi->ClearEventCallbackReference(eventType);
|
||||
DRM_INFO_LOG("KeySessionNapi::UnsetEventCallback out");
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionNapi UnsetEventCallback failed!");
|
||||
}
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
} // DrmStandardr
|
||||
} // OHOS
|
||||
@@ -0,0 +1,352 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_decrypt_module_napi.h"
|
||||
#include "media_decrypt_module_impl.h"
|
||||
#include "key_session_impl.h"
|
||||
#include "ipc_skeleton.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
thread_local napi_ref MediaDecryptModuleNapi::sConstructor_ = nullptr;
|
||||
thread_local sptr<MediaDecryptModuleImpl> MediaDecryptModuleNapi::sMediaDecryptModuleImpl_ = nullptr;
|
||||
|
||||
MediaDecryptModuleNapi::MediaDecryptModuleNapi() : env_(nullptr), wrapper_(nullptr)
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
|
||||
}
|
||||
|
||||
MediaDecryptModuleNapi::~MediaDecryptModuleNapi()
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
|
||||
if (wrapper_ != nullptr) {
|
||||
napi_delete_reference(env_, wrapper_);
|
||||
}
|
||||
if (sMediaDecryptModuleImpl_) {
|
||||
sMediaDecryptModuleImpl_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
napi_value MediaDecryptModuleNapi::Init(napi_env env, napi_value exports)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi Init ENTER");
|
||||
|
||||
napi_status status;
|
||||
napi_value ctorObj;
|
||||
int32_t refCount = 1;
|
||||
|
||||
napi_property_descriptor decryptModule_props[] = {
|
||||
DECLARE_NAPI_FUNCTION("release", Release),
|
||||
DECLARE_NAPI_FUNCTION("requireSecureDecoderModule", RequireSecureDecoderModule),
|
||||
DECLARE_NAPI_FUNCTION("decryptData", DecryptData),
|
||||
};
|
||||
|
||||
DRM_DEBUG_LOG("MediaDecryptModuleNapi napi_define_class");
|
||||
status = napi_define_class(env, DECYPT_MODULE_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
|
||||
MediaDecryptModuleNapiConstructor, nullptr,
|
||||
sizeof(decryptModule_props) / sizeof(decryptModule_props[PARAM0]),
|
||||
decryptModule_props, &ctorObj);
|
||||
if (status == napi_ok) {
|
||||
status = napi_create_reference(env, ctorObj, refCount, &sConstructor_);
|
||||
if (status == napi_ok) {
|
||||
status = napi_set_named_property(env, exports, DECYPT_MODULE_NAPI_CLASS_NAME, ctorObj);
|
||||
if (status == napi_ok) {
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi return");
|
||||
return exports;
|
||||
}
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi Init call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
napi_value MediaDecryptModuleNapi::MediaDecryptModuleNapiConstructor(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::MediaDecryptModuleNapiConstructor enter.");
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
napi_value thisVar = nullptr;
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
DRM_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
|
||||
|
||||
if (status == napi_ok && thisVar != nullptr) {
|
||||
std::unique_ptr<MediaDecryptModuleNapi> obj = std::make_unique<MediaDecryptModuleNapi>();
|
||||
if (obj != nullptr) {
|
||||
obj->env_ = env;
|
||||
if (sMediaDecryptModuleImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("sMediaDecryptModuleImpl_ is null");
|
||||
return result;
|
||||
}
|
||||
obj->mediaDecryptModuleImpl_ = sMediaDecryptModuleImpl_;
|
||||
status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
|
||||
MediaDecryptModuleNapi::MediaDecryptModuleNapiDestructor, nullptr, nullptr);
|
||||
if (status == napi_ok) {
|
||||
obj.release();
|
||||
return thisVar;
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaDecryptModuleNapi Failure wrapping js to native napi");
|
||||
}
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::MediaDecryptModuleNapiConstructor exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
void MediaDecryptModuleNapi::MediaDecryptModuleNapiDestructor(napi_env env, void *nativeObject, void *finalize)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::MediaDecryptModuleNapiDestructor enter.");
|
||||
MediaDecryptModuleNapi* decryptModuleNapiObj = reinterpret_cast<MediaDecryptModuleNapi*>(nativeObject);
|
||||
if (decryptModuleNapiObj != nullptr) {
|
||||
decryptModuleNapiObj->~MediaDecryptModuleNapi();
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::MediaDecryptModuleNapiDestructor exit.");
|
||||
}
|
||||
|
||||
napi_value MediaDecryptModuleNapi::GetDecryptModule(napi_env env, sptr<MediaDecryptModuleImpl> decryptModuleImpl)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::GetDecryptModule enter.");
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
napi_value constructor;
|
||||
|
||||
status = napi_get_reference_value(env, sConstructor_, &constructor);
|
||||
if (status == napi_ok) {
|
||||
sMediaDecryptModuleImpl_ = decryptModuleImpl;
|
||||
if (sMediaDecryptModuleImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("Failed to GetDecryptModule instance");
|
||||
napi_get_undefined(env, &result);
|
||||
return result;
|
||||
}
|
||||
status = napi_new_instance(env, constructor, 0, nullptr, &result);
|
||||
sMediaDecryptModuleImpl_ = nullptr;
|
||||
if (status == napi_ok && result != nullptr) {
|
||||
DRM_INFO_LOG("success to GetDecryptModule napi instance");
|
||||
return result;
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to GetDecryptModule napi instance");
|
||||
}
|
||||
}
|
||||
DRM_ERR_LOG("Failed to create GetDecryptModule napi instance last");
|
||||
napi_get_undefined(env, &result);
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::GetDecryptModule exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaDecryptModuleNapi::Release(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::Release enter.");
|
||||
int32_t currentPid = IPCSkeleton::GetCallingPid();
|
||||
DRM_DEBUG_LOG("MediaDecryptModuleNapi GetCallingPID: %{public}d", currentPid);
|
||||
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
MediaDecryptModuleNapi* decryptModuleNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&decryptModuleNapi));
|
||||
if (status == napi_ok && decryptModuleNapi != nullptr) {
|
||||
decryptModuleNapi->mediaDecryptModuleImpl_->Release();
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaDecryptModuleNapi Release call Failed!");
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::Release exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaDecryptModuleNapi::RequireSecureDecoderModule(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::RequireSecureDecoderModule enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
|
||||
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");
|
||||
char mimeTypeBuf[PATH_MAX];
|
||||
size_t length = 0;
|
||||
if (napi_get_value_string_utf8(env, argv[PARAM0], mimeTypeBuf, PATH_MAX, &length) == napi_ok) {
|
||||
std::string mimeType = std::string(mimeTypeBuf);
|
||||
bool statusValue;
|
||||
MediaDecryptModuleNapi* decryptModuleNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&decryptModuleNapi));
|
||||
if (status == napi_ok && decryptModuleNapi != nullptr) {
|
||||
if (decryptModuleNapi->mediaDecryptModuleImpl_ != nullptr) {
|
||||
decryptModuleNapi->mediaDecryptModuleImpl_->RequireSecureDecoderModule(mimeType, &statusValue);
|
||||
status = napi_get_boolean(env, statusValue, &result);
|
||||
DRM_INFO_LOG("napi_get_boolean call success!,statusValue:%{public}d.", statusValue);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("napi_get_boolean call faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaDecryptModuleImpl_ == nullptr.");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaDecryptModuleNapi DecryptData call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("-Could not able to read response argument!");
|
||||
return nullptr;
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::RequireSecureDecoderModule exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaDecryptModuleNapi::DecryptData(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::DecryptData enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = 4; // 4 is argc number
|
||||
napi_value argv[4] = {0}; // 4 is argc number
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
IMediaDecryptModuleService::CryptInfo cryptInfo;
|
||||
napi_value type_property;
|
||||
napi_value keyId_property;
|
||||
napi_value iv_property;
|
||||
napi_value pattern_property;
|
||||
napi_value subSample_property;
|
||||
napi_value subSampleNumber_property;
|
||||
bool secureDecodrtState = false;
|
||||
int32_t type = 0;
|
||||
bool isTypeArray;
|
||||
void *keyId = nullptr;
|
||||
size_t keyIdLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type array_type;
|
||||
void *iv = nullptr;
|
||||
size_t ivLen;
|
||||
napi_value pattern_property_encryptBlocks;
|
||||
napi_value pattern_property_skipBlocks;
|
||||
int32_t subSampleLen = 0;
|
||||
napi_value jsClearHeaderLen;
|
||||
napi_value jsPayLoadLen;
|
||||
int32_t srcBuffer = 0;
|
||||
int32_t dstBuffer = 0;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
napi_get_undefined(env, &result);
|
||||
NAPI_ASSERT(env, argc <= 4, "requires 4 parameters maximum");
|
||||
status = napi_get_value_bool(env, argv[PARAM0], &secureDecodrtState);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read secureDecodrtState argument!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_named_property(env, argv[PARAM1], "type", &type_property);
|
||||
napi_get_value_int32(env, type_property, &type);
|
||||
if (type == 0) {
|
||||
cryptInfo.type = IMediaDecryptModuleService::ALGTYPE_UNENCRYPTED;
|
||||
DRM_DEBUG_LOG("cryptInfo.type:%{public}d.",(int)cryptInfo.type);
|
||||
} else if (type == 1) {
|
||||
cryptInfo.type = IMediaDecryptModuleService::ALGTYPE_AES_CTR;
|
||||
DRM_DEBUG_LOG("cryptInfo.type:%{public}d.",(int)cryptInfo.type);
|
||||
} else if (type == 2) {
|
||||
cryptInfo.type = IMediaDecryptModuleService::ALGTYPE_AES_WV;
|
||||
DRM_DEBUG_LOG("cryptInfo.type:%{public}d.",(int)cryptInfo.type);
|
||||
} else if (type == 3) {
|
||||
cryptInfo.type = IMediaDecryptModuleService::ALGTYPE_AES_CBC;
|
||||
DRM_DEBUG_LOG("cryptInfo.type:%{public}d.",(int)cryptInfo.type);
|
||||
} else if (type == 4) {
|
||||
cryptInfo.type = IMediaDecryptModuleService::ALGTYPE_SM4_CBC;
|
||||
DRM_DEBUG_LOG("cryptInfo.type:%{public}d.",(int)cryptInfo.type);
|
||||
}
|
||||
|
||||
napi_get_named_property(env, argv[PARAM1], "keyId", &keyId_property);
|
||||
napi_is_typedarray(env, keyId_property, &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM1] keyId is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, keyId_property, &array_type, &keyIdLen, &keyId, &arraybuffer, &offset);
|
||||
if (keyId == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* keyIdPtr = reinterpret_cast<uint8_t*>(keyId);
|
||||
std::vector<uint8_t> keyIdVec(keyIdPtr, keyIdPtr + keyIdLen);
|
||||
cryptInfo.keyId.assign(keyIdVec.begin(), keyIdVec.end());
|
||||
|
||||
napi_get_named_property(env, argv[PARAM1], "iv", &iv_property);
|
||||
napi_is_typedarray(env, iv_property, &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM1] iv is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, iv_property, &array_type, &ivLen, &iv, &arraybuffer, &offset);
|
||||
if (iv == nullptr) {
|
||||
DRM_ERR_LOG("napi_get_typedarray_info faild!");
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* ivPtr = reinterpret_cast<uint8_t*>(iv);
|
||||
std::vector<uint8_t> ivVec(ivPtr, ivPtr + ivLen);
|
||||
cryptInfo.iv.assign(ivVec.begin(), ivVec.end());
|
||||
|
||||
napi_get_named_property(env, argv[PARAM1], "pattern", &pattern_property);
|
||||
napi_get_named_property(env, pattern_property, "encryptBlocks", &pattern_property_encryptBlocks);
|
||||
napi_get_named_property(env, pattern_property, "skipBlocks", &pattern_property_skipBlocks);
|
||||
napi_get_value_int32(env, pattern_property_encryptBlocks, &cryptInfo.pattern.encryptBlocks);
|
||||
napi_get_value_int32(env, pattern_property_skipBlocks, &cryptInfo.pattern.skipBlocks);
|
||||
napi_get_named_property(env, argv[PARAM1], "subSampleNumber", &subSampleNumber_property);
|
||||
napi_get_value_int32(env, subSampleNumber_property, &subSampleLen);
|
||||
napi_get_named_property(env, argv[PARAM1], "subSample", &subSample_property);
|
||||
for (uint32_t i = 0; i < subSampleLen; i++) {
|
||||
napi_value jsSubSample;
|
||||
IMediaDecryptModuleService::SubSample subSampleTmp = {0};
|
||||
napi_get_element(env, subSample_property, i, &jsSubSample);
|
||||
napi_get_named_property(env, jsSubSample, "clearHeaderLen", &jsClearHeaderLen);
|
||||
napi_get_named_property(env, jsSubSample, "payLoadLen", &jsPayLoadLen);
|
||||
napi_get_value_int32(env, jsClearHeaderLen, &subSampleTmp.clearHeaderLen);
|
||||
napi_get_value_int32(env, jsPayLoadLen, &subSampleTmp.payLoadLen);
|
||||
cryptInfo.subSample.push_back(subSampleTmp);
|
||||
}
|
||||
status = napi_get_value_int32(env, argv[PARAM2], &srcBuffer);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read srcBuffer argument!");
|
||||
return nullptr;
|
||||
}
|
||||
status = napi_get_value_int32(env, argv[3], &dstBuffer);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read dstBuffer argument!");
|
||||
return nullptr;
|
||||
}
|
||||
MediaDecryptModuleNapi* decryptModuleNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&decryptModuleNapi));
|
||||
if (status == napi_ok && decryptModuleNapi != nullptr) {
|
||||
if (decryptModuleNapi->mediaDecryptModuleImpl_ != nullptr) {
|
||||
decryptModuleNapi->mediaDecryptModuleImpl_->DecryptData(secureDecodrtState, cryptInfo, srcBuffer, dstBuffer);
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaDecryptModuleImpl_ == nullptr.");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaDecryptModuleNapi DecryptData call Failed!");
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleNapi::DecryptData exit.");
|
||||
return result;
|
||||
}
|
||||
} // DrmStandardr
|
||||
} // OHOS
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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.
|
||||
*/
|
||||
@@ -0,0 +1,591 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_key_system_napi.h"
|
||||
#include "key_session_napi.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
thread_local napi_ref MediaKeySystemNapi::sConstructor_ = nullptr;
|
||||
thread_local sptr<MediaKeySystemImpl> MediaKeySystemNapi::sMediaKeySystemImpl_ = nullptr;
|
||||
|
||||
MediaKeySystemNapi::MediaKeySystemNapi() : env_(nullptr), wrapper_(nullptr)
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
|
||||
}
|
||||
|
||||
MediaKeySystemNapi::~MediaKeySystemNapi()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::~MediaKeySystemNapi enter.");
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
|
||||
if (wrapper_ != nullptr) {
|
||||
napi_delete_reference(env_, wrapper_);
|
||||
}
|
||||
if (mediaKeySystemImpl_) {
|
||||
mediaKeySystemImpl_ = nullptr;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::~MediaKeySystemNapi exit.");
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::Init(napi_env env, napi_value exports)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi Init enter.");
|
||||
napi_status status;
|
||||
napi_value ctorObj;
|
||||
int32_t refCount = 1;
|
||||
|
||||
napi_property_descriptor properties[] = {
|
||||
DECLARE_NAPI_FUNCTION("setConfiguration", SetConfiguration),
|
||||
DECLARE_NAPI_FUNCTION("getConfiguration", GetConfiguration),
|
||||
DECLARE_NAPI_FUNCTION("generateKeySystemRequest", GenerateKeySystemRequest),
|
||||
DECLARE_NAPI_FUNCTION("processKeySystemResponse", ProcessKeySystemResponse),
|
||||
DECLARE_NAPI_FUNCTION("createKeySession", CreateKeySession),
|
||||
DECLARE_NAPI_FUNCTION("getMetric", GetMetric),
|
||||
DECLARE_NAPI_FUNCTION("getSecurityLevel", GetSecurityLevel),
|
||||
};
|
||||
|
||||
status = napi_define_class(env, MEDIA_KEY_SYSTEM_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
|
||||
MediaKeySystemNapiConstructor, nullptr,
|
||||
sizeof(properties) / sizeof(properties[PARAM0]),
|
||||
properties, &ctorObj);
|
||||
if (status == napi_ok) {
|
||||
if (napi_create_reference(env, ctorObj, refCount, &sConstructor_) == napi_ok) {
|
||||
status = napi_set_named_property(env, exports, MEDIA_KEY_SYSTEM_NAPI_CLASS_NAME, ctorObj);
|
||||
if (status == napi_ok) {
|
||||
return exports;
|
||||
}
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemNapi Init exit.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::MediaKeySystemNapiConstructor(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::MediaKeySystemNapiConstructor enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argCount = 0;
|
||||
napi_value jsThis = nullptr;
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
|
||||
napi_status status = napi_get_cb_info(env, info, &argCount, nullptr, &jsThis, nullptr);
|
||||
CHECK_AND_RETURN_RET_LOG(status == napi_ok, result, "failed to napi_get_cb_info");
|
||||
|
||||
if (status == napi_ok && jsThis != nullptr) {
|
||||
std::unique_ptr<MediaKeySystemNapi> obj = std::make_unique<MediaKeySystemNapi>();
|
||||
obj->env_ = env;
|
||||
if (MediaKeySystemNapi::sMediaKeySystemImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("sMediaKeySystemImpl_ is null");
|
||||
return result;
|
||||
}
|
||||
obj->mediaKeySystemImpl_ = MediaKeySystemNapi::sMediaKeySystemImpl_;
|
||||
|
||||
status = napi_wrap(env, jsThis, reinterpret_cast<void*>(obj.get()),
|
||||
MediaKeySystemNapi::MediaKeySystemNapiDestructor, nullptr, nullptr);
|
||||
if (status == napi_ok) {
|
||||
obj.release();
|
||||
return jsThis;
|
||||
} else {
|
||||
DRM_ERR_LOG("Failure wrapping js to native napi");
|
||||
}
|
||||
DRM_ERR_LOG("will call IsMediaKeySystemSupported");
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::MediaKeySystemNapiConstructor exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::CreateMediaKeySystemInstance(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::CreateMediaKeySystemInstance enter.");
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
napi_value ctor;
|
||||
|
||||
status = napi_get_reference_value(env, sConstructor_, &ctor);
|
||||
if (status == napi_ok) {
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
|
||||
napi_get_undefined(env, &result);
|
||||
|
||||
std::string uuid;
|
||||
char uuidBuffer[PATH_MAX];
|
||||
size_t uuidBufferLen = 0;
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM0], uuidBuffer, PATH_MAX, &uuidBufferLen);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read uuid argument!");
|
||||
return nullptr;
|
||||
}
|
||||
uuid = std::string(uuidBuffer);
|
||||
int retCode = MediaKeySystemFactoryImpl::GetInstance()->CreateMediaKeySystem(uuid, &MediaKeySystemNapi::sMediaKeySystemImpl_);
|
||||
if (retCode != DRM_OK || MediaKeySystemNapi::sMediaKeySystemImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemNapi sMediaKeySystemImpl_ get failed!!!");
|
||||
return nullptr;
|
||||
}
|
||||
status = napi_new_instance(env, ctor, 0, nullptr, &result);
|
||||
MediaKeySystemNapi::sMediaKeySystemImpl_ = nullptr;
|
||||
if (status == napi_ok) {
|
||||
DRM_ERR_LOG("CreateMediaKeySystemInstance 164");
|
||||
return result;
|
||||
} else {
|
||||
DRM_ERR_LOG("New instance could not be obtained");
|
||||
}
|
||||
}
|
||||
napi_get_undefined(env, &result);
|
||||
DRM_INFO_LOG("CreateMediaKeySystemInstance exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
void MediaKeySystemNapi::MediaKeySystemNapiDestructor(napi_env env, void *nativeObject, void *finalize)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::MediaKeySystemNapiDestructor enter.");
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = reinterpret_cast<MediaKeySystemNapi*>(nativeObject);
|
||||
if (mediaKeySystemNapi != nullptr) {
|
||||
mediaKeySystemNapi->~MediaKeySystemNapi();
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::MediaKeySystemNapiDestructor exit.");
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::Release(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::Release enter.");
|
||||
int32_t currentPid = IPCSkeleton::GetCallingPid();
|
||||
DRM_DEBUG_LOG("MediaKeySystemNapi GetCallingPID: %{public}d", currentPid);
|
||||
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
napi_get_undefined(env, &result);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr) {
|
||||
mediaKeySystemNapi->mediaKeySystemImpl_->Release();
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi Release call Failed!");
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::Release exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::IsMediaKeySystemSupported(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::IsMediaKeySystemSupported enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_THREE;
|
||||
napi_value argv[ARGS_THREE] = {0, 0, 0};
|
||||
napi_value thisVar = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
char buffer[PATH_MAX];
|
||||
size_t length = 0;
|
||||
// get uuid
|
||||
if (napi_get_value_string_utf8(env, argv[PARAM0], buffer, PATH_MAX, &length) != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read uuid argument!");
|
||||
return nullptr;
|
||||
}
|
||||
std::string uuid = std::string(buffer);
|
||||
memset(buffer, '\0', PATH_MAX);
|
||||
// search by uuid
|
||||
if (argc == ARGS_ONE) {
|
||||
bool isSurpportted = MediaKeySystemFactoryImpl::GetInstance()->IsMediaKeySystemSupported(uuid);
|
||||
napi_get_boolean(env, isSurpportted, &result);
|
||||
return result;
|
||||
}
|
||||
// get mimeType
|
||||
if (napi_get_value_string_utf8(env, argv[PARAM1], buffer, PATH_MAX, &length) != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read mimeType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
std::string mimeType = std::string(buffer);
|
||||
memset(buffer, '\0', PATH_MAX);
|
||||
// search by uuid and mineType
|
||||
if (argc == ARGS_TWO) {
|
||||
bool isSurpportted = MediaKeySystemFactoryImpl::GetInstance()->IsMediaKeySystemSupported(uuid, mimeType);
|
||||
napi_get_boolean(env, isSurpportted, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
// get securityLevel
|
||||
int32_t jsSecurityLevel = -1;
|
||||
if (napi_get_value_int32(env, argv[PARAM2], &jsSecurityLevel) != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read securityLevel argument!");
|
||||
return nullptr;
|
||||
}
|
||||
IKeySessionService::SecurityLevel securityLevel = IKeySessionService::SECURITY_LEVEL_UNKNOWN;
|
||||
switch (jsSecurityLevel) {
|
||||
case 0:
|
||||
securityLevel = IKeySessionService::SECURITY_LEVEL_UNKNOWN;
|
||||
break;
|
||||
case 1:
|
||||
securityLevel = IKeySessionService::SECURITY_LEVEL_SW_CRYPTO;
|
||||
break;
|
||||
case 2:
|
||||
securityLevel = IKeySessionService::SECURITY_LEVEL_SW_DECODE;
|
||||
break;
|
||||
case 3:
|
||||
securityLevel = IKeySessionService::SECURITY_LEVEL_HW_CRYPTO;
|
||||
break;
|
||||
case 4:
|
||||
securityLevel = IKeySessionService::SECURITY_LEVEL_HW_DECODE;
|
||||
break;
|
||||
case 5:
|
||||
securityLevel = IKeySessionService::SECURITY_LEVEL_HW_ALL;
|
||||
break;
|
||||
case 6:
|
||||
securityLevel = IKeySessionService::SECURITY_LEVEL_MAX;
|
||||
break;
|
||||
default:
|
||||
DRM_ERR_LOG("jsSecurityLevel is invalid");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// search by uuid, mineType and securityLevel
|
||||
if (argc == ARGS_THREE) {
|
||||
bool isSurpportted = MediaKeySystemFactoryImpl::GetInstance()->IsMediaKeySystemSupported(uuid, mimeType, securityLevel);
|
||||
napi_get_boolean(env, isSurpportted, &result);
|
||||
return result;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::IsMediaKeySystemSupported exit.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::CreateKeySession(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::CreateKeySession enter.");
|
||||
napi_status status;
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
int32_t jsSecurityLevel = 0;
|
||||
sptr<KeySessionImpl> keySessionImpl = nullptr;
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
napi_get_undefined(env, &result);
|
||||
|
||||
status = napi_get_value_int32(env, argv[PARAM0], &jsSecurityLevel);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("MediaKeySystemNapi napi get jsSecurityLevel failure!");
|
||||
return nullptr;
|
||||
}
|
||||
// not check the securityLevel is valid.
|
||||
IKeySessionService::SecurityLevel securityLevel = static_cast<IKeySessionService::SecurityLevel>(jsSecurityLevel);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&mediaKeySystemNapi));
|
||||
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr) {
|
||||
int ret = mediaKeySystemNapi->mediaKeySystemImpl_->CreateKeySession((IKeySessionService::SecurityLevel)securityLevel, &keySessionImpl);
|
||||
if (ret != DRM_OK || keySessionImpl == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemNapi CreateKeySession get failed!!!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi CreateKeySession call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
result = KeySessionNapi::CreateKeySession(env, keySessionImpl);
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::CreateKeySession exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::SetConfiguration(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::SetConfiguration enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_THREE;
|
||||
napi_value argv[ARGS_THREE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
int32_t configType = 0;
|
||||
std::string name;
|
||||
std::string value;
|
||||
char nameBuffer[PATH_MAX];
|
||||
size_t nameBufferLen = 0;
|
||||
char valueBuffer[PATH_MAX];
|
||||
size_t valueBufferLen = 0;
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_THREE, "requires 3 parameters maximum");
|
||||
|
||||
status = napi_get_value_int32(env, argv[PARAM0], &configType);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read configType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM1], nameBuffer, PATH_MAX, &nameBufferLen);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read name argument!");
|
||||
return nullptr;
|
||||
}
|
||||
name = std::string(nameBuffer);
|
||||
status = napi_get_value_string_utf8(env, argv[PARAM2], valueBuffer, PATH_MAX, &valueBufferLen);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read value argument!");
|
||||
return nullptr;
|
||||
}
|
||||
value = std::string(valueBuffer);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr) {
|
||||
int ret = mediaKeySystemNapi->mediaKeySystemImpl_->SetConfiguration(IMediaKeySystemService::ConfigType(configType), name, value);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi SetConfiguration faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi SetConfiguration call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::SetConfiguration exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::GetConfiguration(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GetConfiguration enter");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_THREE;
|
||||
napi_value argv[ARGS_THREE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
int32_t configType = 0;
|
||||
char nameStr[PATH_MAX];
|
||||
size_t nameStrLength = 0;
|
||||
std::string value;
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_THREE, "requires 3 parameters maximum");
|
||||
|
||||
status = napi_get_value_int32(env, argv[PARAM0], &configType);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read requestType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
napi_get_value_string_utf8(env, argv[PARAM1], nameStr, PATH_MAX, &nameStrLength);
|
||||
std::string name = std::string(nameStr);
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr) {
|
||||
int ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetConfiguration(IMediaKeySystemService::ConfigType(configType), name, value);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi GetConfiguration faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi Release call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &result);
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GetConfiguration exit");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::GetSecurityLevel(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GetSecurityLevel enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ONE;
|
||||
napi_value argv[ARGS_ONE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
|
||||
NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
|
||||
IKeySessionService::SecurityLevel level = (IKeySessionService::SecurityLevel)0;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr) {
|
||||
mediaKeySystemNapi->mediaKeySystemImpl_->GetSecurityLevel(&level);
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySystemNapi GetSecurityLevel call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NAPI_CALL(env, napi_create_int32(env, (int)level, &result));
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GetSecurityLevel exit");
|
||||
return result;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::GenerateKeySystemRequest(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GenerateKeySystemRequest enter");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_THREE;
|
||||
napi_value argv[ARGS_THREE] = {0};
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
int32_t requestType = 0;
|
||||
std::vector<uint8_t> request;
|
||||
std::string defaultUrl;
|
||||
napi_value keyRequestType;
|
||||
napi_value mDefaultURL;
|
||||
napi_value mData;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_THREE, "requires 3 parameters maximum");
|
||||
status = napi_get_value_int32(env, argv[PARAM0], &requestType);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read requestType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = nullptr;
|
||||
status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&mediaKeySystemNapi));
|
||||
if (status == napi_ok && mediaKeySystemNapi != nullptr) {
|
||||
int ret = mediaKeySystemNapi->mediaKeySystemImpl_->GenerateKeySystemRequest(IMediaKeySystemService::RequestType(requestType), request, defaultUrl);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi GenerateKeySystemRequest faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi GenerateKeySystemRequest call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NAPI_CALL(env, napi_create_object(env, &result));
|
||||
NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(requestType), &keyRequestType));
|
||||
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, "keyRequestType", keyRequestType));
|
||||
NAPI_CALL(env, napi_set_named_property(env, result, "mDefaultURL", mDefaultURL));
|
||||
NAPI_CALL(env, napi_set_named_property(env, result, "mData", mData));
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GenerateKeySystemRequest exit");
|
||||
return result;
|
||||
}
|
||||
|
||||
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;
|
||||
int32_t requestType = 0;
|
||||
bool isTypeArray;
|
||||
void *reponseData = nullptr;
|
||||
size_t reponseDataLen;
|
||||
size_t offset;
|
||||
napi_value arraybuffer = nullptr;
|
||||
napi_typedarray_type type;
|
||||
MediaKeySystemNapi* mediaKeySystemNapi = nullptr;
|
||||
|
||||
DRM_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
|
||||
NAPI_ASSERT(env, argc <= ARGS_TWO, "requires 2 parameters maximum");
|
||||
status = napi_get_value_int32(env, argv[PARAM0], &requestType);
|
||||
if (status != napi_ok) {
|
||||
DRM_ERR_LOG("Could not able to read requestType argument!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_is_typedarray(env, argv[PARAM1], &isTypeArray);
|
||||
if (!isTypeArray) {
|
||||
DRM_ERR_LOG("argv[PARAM1] reponse is not array!");
|
||||
return nullptr;
|
||||
}
|
||||
napi_get_typedarray_info(env, argv[PARAM1], &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) {
|
||||
int ret = mediaKeySystemNapi->mediaKeySystemImpl_->ProcessKeySystemResponse(IMediaKeySystemService::RequestType(requestType), keySystemResponse);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("napi ProcessKeySystemResponse faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi ProcessKeySystemResponse call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::ProcessKeySystemResponse exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
static napi_value vectorToJsArray(napi_env env, std::vector<IMediaKeySystemService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("vectorToJsArray enter.");
|
||||
napi_value jsArray;
|
||||
napi_create_array_with_length(env, infoMap.size(), &jsArray);
|
||||
for (size_t i = 0; i < infoMap.size(); i++) {
|
||||
napi_value jsObject;
|
||||
napi_value jsName;
|
||||
napi_value jsValue;
|
||||
napi_create_object(env, &jsObject);
|
||||
napi_create_string_utf8(env, infoMap[i].name.c_str(), NAPI_AUTO_LENGTH, &jsName);
|
||||
napi_set_named_property(env, jsObject, "name", jsName);
|
||||
napi_create_string_utf8(env, infoMap[i].value.c_str(), NAPI_AUTO_LENGTH, &jsValue);
|
||||
napi_set_named_property(env, jsObject, "value", jsValue);
|
||||
|
||||
napi_set_element(env, jsArray, i, jsObject);
|
||||
}
|
||||
DRM_INFO_LOG("vectorToJsArray exit.");
|
||||
return jsArray;
|
||||
}
|
||||
|
||||
napi_value MediaKeySystemNapi::GetMetric(napi_env env, napi_callback_info info)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GetMetric enter.");
|
||||
napi_value result = nullptr;
|
||||
size_t argc = ARGS_ZERO;
|
||||
napi_value argv[ARGS_ZERO];
|
||||
napi_value thisVar = nullptr;
|
||||
napi_status status;
|
||||
std::vector<IMediaKeySystemService::KeyValue> infoMap;
|
||||
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) {
|
||||
int ret = mediaKeySystemNapi->mediaKeySystemImpl_->GetMetric(infoMap);
|
||||
if (ret != napi_ok) {
|
||||
DRM_ERR_LOG("mediaKeySystemImpl_->GetMetric faild!");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("mediaKeySystemNapi Release call Failed!");
|
||||
return nullptr;
|
||||
}
|
||||
result = vectorToJsArray(env, infoMap);
|
||||
DRM_INFO_LOG("MediaKeySystemNapi::GetMetric exit.");
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "native_module_ohos_drm.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
/*
|
||||
* Function registering all props and functions of ohos.media module
|
||||
* which involves drm
|
||||
*/
|
||||
static napi_value Export(napi_env env, napi_value exports)
|
||||
{
|
||||
DRM_ERR_LOG("Drm Export() is called");
|
||||
DRM_ERR_LOG("Drm DecryptModuleNapi::Init");
|
||||
DrmEnumNapi::Init(env, exports);
|
||||
DRM_ERR_LOG("Drm DecryptModuleNapi::Init");
|
||||
MediaDecryptModuleNapi::Init(env, exports);
|
||||
DRM_ERR_LOG("Drm KeySessionNapi::Init");
|
||||
KeySessionNapi::Init(env, exports);
|
||||
DRM_ERR_LOG("Drm MediaKeySystemNapi Init");
|
||||
MediaKeySystemNapi::Init(env, exports);
|
||||
DRM_ERR_LOG("DrmNapi::Init");
|
||||
DrmNapi::Init(env, exports);
|
||||
return exports;
|
||||
}
|
||||
|
||||
/*
|
||||
* module define
|
||||
*/
|
||||
static napi_module g_module = {
|
||||
.nm_version = 1,
|
||||
.nm_flags = 0,
|
||||
.nm_filename = nullptr,
|
||||
.nm_register_func = Export,
|
||||
.nm_modname = "multimedia.drm",
|
||||
.nm_priv = (reinterpret_cast<void*>(0)),
|
||||
.reserved = {0}
|
||||
};
|
||||
|
||||
/*
|
||||
* module register
|
||||
*/
|
||||
extern "C" __attribute__((constructor)) void RegisterModule(void)
|
||||
{
|
||||
DRM_ERR_LOG("RegisterModule() is called");
|
||||
napi_module_register(&g_module);
|
||||
}
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,88 @@
|
||||
# for ohos_shared_library("drm_framework")
|
||||
|
||||
import("//build/ohos.gni")
|
||||
|
||||
config("drm_framework_public_config") {
|
||||
include_dirs = [
|
||||
"//foundation/multimedia/drm_framework/interfaces/inner_api/native/drm",
|
||||
"//foundation/multimedia/drm_framework/services/include",
|
||||
]
|
||||
}
|
||||
|
||||
config("drm_framework_local_config") {
|
||||
include_dirs = [
|
||||
"//foundation/multimedia/drm_framework/services/drm_service",
|
||||
"//foundation/multimedia/drm_framework/services/include",
|
||||
"//foundation/multimedia/drm_framework/services/utils/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/ipc",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/include",
|
||||
"//foundation/multimedia/drm_framework/interfaces/inner_api/native/drm",
|
||||
]
|
||||
}
|
||||
|
||||
config("drm_framework_drivers_config") {
|
||||
include_dirs = [
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/ipc/",
|
||||
]
|
||||
}
|
||||
|
||||
ohos_shared_library("drm_framework") {
|
||||
install_enable = true
|
||||
sources = [
|
||||
"//foundation/multimedia/drm_framework/frameworks/native/drm/media_key_system_factory_impl.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/src/mediakeysystemfactory_service_proxy.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/native/drm/media_key_system_impl.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/src/mediakeysystem_service_proxy.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/native/drm/key_session_impl.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/src/key_session_service_proxy.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/native/drm/media_decrypt_module_impl.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/src/media_decrypt_module_service_proxy.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/key_session_service_callback_stub.cpp",
|
||||
]
|
||||
|
||||
cflags = [
|
||||
"-fPIC",
|
||||
"-Wall",
|
||||
]
|
||||
if (target_cpu == "arm") {
|
||||
cflags += [ "-DBINDER_IPC_32BIT" ]
|
||||
}
|
||||
sanitize = {
|
||||
cfi = true
|
||||
cfi_cross_dso = true
|
||||
debug = true
|
||||
}
|
||||
|
||||
public_configs = [
|
||||
":drm_framework_public_config",
|
||||
":drm_framework_local_config",
|
||||
":drm_framework_drivers_config",
|
||||
]
|
||||
|
||||
include_dirs = [
|
||||
"//foundation/multimedia/drm_framework/frameworks/native/drm",
|
||||
"//foundation/graphic/graphic_2d/frameworks/surface/include",
|
||||
"//utils/system/safwk/native/include",
|
||||
"//foundation//arkui/napi/interfaces/kits",
|
||||
]
|
||||
|
||||
deps = [
|
||||
]
|
||||
|
||||
external_deps = [
|
||||
"c_utils:utils",
|
||||
"hisysevent:libhisysevent",
|
||||
"hitrace:hitrace_meter",
|
||||
"hilog:libhilog",
|
||||
"ipc:ipc_core",
|
||||
"safwk:system_ability_fwk",
|
||||
"samgr:samgr_proxy",
|
||||
"napi:ace_napi",
|
||||
]
|
||||
|
||||
cflags_cc = cflags
|
||||
|
||||
part_name = "multimedia_drm_framework"
|
||||
subsystem_name = "multimedia"
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 <iostream>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_node_api.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
class CallBackPair : public RefBase {
|
||||
public:
|
||||
CallBackPair(napi_env env, napi_ref callback) : env_(env), callback_(callback) { }
|
||||
|
||||
~CallBackPair()
|
||||
{
|
||||
if (env_ != nullptr && callback_ != nullptr) {
|
||||
(void)napi_delete_reference(env_, callback_);
|
||||
}
|
||||
}
|
||||
|
||||
napi_env GetEnv() {
|
||||
return env_;
|
||||
}
|
||||
|
||||
napi_ref GetCallback() {
|
||||
return callback_;
|
||||
}
|
||||
|
||||
private:
|
||||
napi_env env_;
|
||||
napi_ref callback_;
|
||||
};
|
||||
|
||||
namespace DrmEvent {
|
||||
const std::string DRM_EVENT_KEY_EXPIRED = "keyExpired";
|
||||
const std::string DRM_EVENT_KEY_SESSION_RECLAIMED = "keySessionReclaimed";
|
||||
const std::string DRM_EVENT_SYSTEM_PROVISION_REQUIRED = "keySystemProvisionRequired";
|
||||
}
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,367 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_impl.h"
|
||||
#include "common_napi.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
KeySessionImpl::KeySessionImpl(sptr<IKeySessionService> &keySession)
|
||||
{
|
||||
DRM_DEBUG_LOG("KeySessionImpl::KeySessionImpl enter.");
|
||||
keySessionServiceProxy_ = keySession;
|
||||
mediaDecryptModuleImpl_ = nullptr;
|
||||
keySessionServiceCallback_ = nullptr;
|
||||
}
|
||||
|
||||
KeySessionImpl::~KeySessionImpl()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::~KeySessionImpl enter.");
|
||||
keySessionServiceProxy_ = nullptr;
|
||||
mediaDecryptModuleImpl_ = nullptr;
|
||||
keySessionServiceCallback_ = nullptr;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::Release()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl Release enter.");
|
||||
int errCode = DRM_UNKNOWN_ERROR;
|
||||
if (keySessionServiceProxy_) {
|
||||
errCode = keySessionServiceProxy_->Release();
|
||||
if (errCode != DRM_OK) {
|
||||
DRM_ERR_LOG("Failed to Release key session!, %{public}d", errCode);
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy_ == nullptr");
|
||||
}
|
||||
keySessionServiceProxy_ = nullptr;
|
||||
mediaDecryptModuleImpl_ = nullptr;
|
||||
keySessionServiceCallback_ = nullptr;
|
||||
DRM_INFO_LOG("KeySessionImpl Release exit.");
|
||||
return errCode;
|
||||
}
|
||||
|
||||
int KeySessionImpl::GenerateLicenseRequest(IKeySessionService::DrmInfo &drmInfo, IKeySessionService::LicenseInfo &licenseInfo)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::GenerateLicenseRequest enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GenerateLicenseRequest keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->GenerateLicenseRequest(drmInfo, licenseInfo);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GenerateLicenseRequest failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::GenerateLicenseRequest exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int KeySessionImpl::ProcessLicenseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &licenseResponse)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::ProcessLicenseResponse enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::ProcessLicenseResponse keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->ProcessLicenseResponse(keyId, licenseResponse);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::ProcessLicenseResponse failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::ProcessLicenseResponse exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int KeySessionImpl::GenerateOfflineReleaseRequest(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseRequest)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::GenerateOfflineReleaseRequest enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GenerateOfflineReleaseRequest keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
retCode = keySessionServiceProxy_->GenerateOfflineReleaseRequest(keyId, releaseRequest);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GenerateOfflineReleaseRequest failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionImpl::GenerateOfflineReleaseRequest exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int KeySessionImpl::ProcessOfflineReleaseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseResponse)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::ProcessOfflineReleaseResponse enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::ProcessOfflineReleaseResponse keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->ProcessOfflineReleaseResponse(keyId, releaseResponse);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::ProcessOfflineReleaseResponse failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::ProcessOfflineReleaseResponse exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
sptr<MediaDecryptModuleImpl> KeySessionImpl::GetDecryptModule()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::GetDecryptModule enter.");
|
||||
if (mediaDecryptModuleImpl_ == nullptr) {
|
||||
sptr<IMediaDecryptModuleService> decryptModuleProxy = nullptr;
|
||||
sptr<MediaDecryptModuleImpl> localDecryptModuleImpl = nullptr;
|
||||
|
||||
int retCode = DRM_OK;
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleImpl::keySessionServiceProxy_ == nullptr");
|
||||
return nullptr;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->CreateMediaDecryptModule(decryptModuleProxy);
|
||||
if (retCode == DRM_OK) {
|
||||
if (decryptModuleProxy != nullptr) {
|
||||
localDecryptModuleImpl = new(std::nothrow) MediaDecryptModuleImpl(decryptModuleProxy);
|
||||
if (localDecryptModuleImpl == nullptr) {
|
||||
DRM_ERR_LOG("Failed to alloc new MediaDecryptModuleImpl");
|
||||
return nullptr;
|
||||
} else {
|
||||
mediaDecryptModuleImpl_ = localDecryptModuleImpl;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to Create MediaDecryptModuleImpl because decryptModuleProxy nullptr");
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to keySessionServiceProxy_->CreateMediaDecryptModule!, %{public}d", retCode);
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::GetDecryptModule exit.");
|
||||
return mediaDecryptModuleImpl_;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::CheckLicenseStatus(std::vector<IKeySessionService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::CheckLicenseStatus enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::CheckLicenseStatus keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->CheckLicenseStatus(infoMap);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::CheckLicenseStatus failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::CheckLicenseStatus exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::RestoreOfflineKeys(std::vector<uint8_t> &keyId)
|
||||
{
|
||||
DRM_ERR_LOG("KeySessionImpl::RestoreOfflineKeys enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::RestoreOfflineKeys keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->RestoreOfflineKeys(keyId);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::RestoreOfflineKeys failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::RestoreOfflineKeys exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::RemoveOfflineKeys(std::vector<uint8_t> &keyId)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::RemoveOfflineKeys enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
for (auto a : keyId) {
|
||||
DRM_ERR_LOG("--keyId:%{public}u",a);
|
||||
}
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::RemoveOfflineKeys keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->RemoveOfflineKeys(keyId);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::RemoveOfflineKeys failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::RemoveOfflineKeys exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::GetOfflineKeyIds(std::vector<std::vector<uint8_t>> &keyIds)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::GetOfflineKeyIds enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GetOfflineKeyIds keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->GetOfflineKeyIds(keyIds);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GetOfflineKeyIds failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::GetOfflineKeyIds exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::RemoveLicenses()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::RemoveLicenses enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::RemoveLicenses keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->RemoveLicenses();
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::RemoveLicenses failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::RemoveLicenses exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int KeySessionImpl::GetOfflineKeyState(std::vector<uint8_t> &keyId, IKeySessionService::OfflineKeyState &state)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::GetOfflineKeyState enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GetOfflineKeyState keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->GetOfflineKeyState(keyId, state);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::GetOfflineKeyState failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::GetOfflineKeyState exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
sptr<IKeySessionService> KeySessionImpl::GetKeySessionServiceProxy()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::GetKeySessionServiceProxy enter.");
|
||||
if (keySessionServiceProxy_ != nullptr) {
|
||||
DRM_DEBUG_LOG("KeySessionImpl KeySessionServiceProxy is not nullptr");
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " is keySessionServiceProxy's native pointer in KeySessionImpl", FAKE_POINTER(keySessionServiceProxy_.GetRefPtr()));
|
||||
DRM_DEBUG_LOG("And it's count is, %{public}d", keySessionServiceProxy_->GetSptrRefCount());
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::GetKeySessionServiceProxy enter.");
|
||||
return keySessionServiceProxy_;
|
||||
}
|
||||
|
||||
sptr<KeySessionImplCallback> KeySessionImpl::GetKeySessionApplicationCallback()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::GetKeySessionApplicationCallback enter.");
|
||||
return keySessionNapiCallback_;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::SetKeySessionServiceCallback(sptr<IKeySessionServiceCallback> &callback)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionImpl::SetKeySessionServiceCallback");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
if (keySessionServiceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl::SetKeySessionServiceCallback keySessionServiceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = keySessionServiceProxy_->SetKeySessionServiceCallback(callback);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("KeySessionImpl::SetKeySessionServiceCallback failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionImpl::SetKeySessionServiceCallback exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionImpl::SetKeySessionCallback(const sptr<KeySessionImplCallback> &callback)
|
||||
{
|
||||
DRM_DEBUG_LOG("KeySessionImpl:0x%{public}06" PRIXPTR " SetKeySessionCallback in", FAKE_POINTER(this));
|
||||
CHECK_AND_RETURN_RET_LOG(callback != nullptr, INVALID_ARGUMENT, "callback is nullptr");
|
||||
keySessionNapiCallback_ = callback;
|
||||
|
||||
int32_t errCode = DRM_ERROR;
|
||||
keySessionServiceCallback_ = new(std::nothrow) KeySessionStatusCallback(this);
|
||||
if (keySessionServiceCallback_ == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionImpl:: KeySessionStatusCallback alloc failed");
|
||||
return errCode;
|
||||
}
|
||||
errCode = this->SetKeySessionServiceCallback(keySessionServiceCallback_);
|
||||
return errCode;
|
||||
}
|
||||
|
||||
int32_t KeySessionStatusCallback::OnKeySessionKeyExpired(const KeyStatus status)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionStatusCallback::OnKeySessionKeyExpired enter.");
|
||||
if (keySessionImpl_ != nullptr) {
|
||||
sptr<KeySessionImplCallback> callback = keySessionImpl_->GetKeySessionApplicationCallback();
|
||||
if (callback != nullptr) {
|
||||
callback->OnKeySessionKeyExpired(DrmEvent::DRM_EVENT_KEY_EXPIRED, status);
|
||||
return DRM_SUCCESS;
|
||||
}
|
||||
}
|
||||
DRM_ERR_LOG("KeySessionStatusCallback:: OnKeySessionKeyExpired failed");
|
||||
return DRM_ERROR;
|
||||
}
|
||||
|
||||
int32_t KeySessionStatusCallback::OnKeySessionReclaimed(const SessionStatus status)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionStatusCallback::OnKeySessionReclaimed enter.");
|
||||
if (keySessionImpl_ != nullptr) {
|
||||
sptr<KeySessionImplCallback> callback = keySessionImpl_->GetKeySessionApplicationCallback();
|
||||
if (callback != nullptr) {
|
||||
callback->OnKeySessionReclaimed(DrmEvent::DRM_EVENT_KEY_SESSION_RECLAIMED, status);
|
||||
return DRM_SUCCESS;
|
||||
}
|
||||
}
|
||||
DRM_ERR_LOG("KeySessionStatusCallback:: OnKeySessionReclaimed failed");
|
||||
return DRM_ERROR;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_decrypt_module_impl.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
MediaDecryptModuleImpl::MediaDecryptModuleImpl(sptr<IMediaDecryptModuleService> &decryptModule)
|
||||
{
|
||||
DRM_DEBUG_LOG("Enter Init MediaDecryptModuleImpl()");
|
||||
serviceProxy_ = decryptModule;
|
||||
}
|
||||
|
||||
MediaDecryptModuleImpl::~MediaDecryptModuleImpl()
|
||||
{
|
||||
DRM_DEBUG_LOG("~MediaDecryptModuleImpl");
|
||||
if (serviceProxy_ != nullptr) {
|
||||
serviceProxy_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleImpl::Release()
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleImpl::Release enter.");
|
||||
int errCode = DRM_OK;
|
||||
if (serviceProxy_ != nullptr) {
|
||||
errCode = serviceProxy_->Release();
|
||||
serviceProxy_ = nullptr;
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleImpl::Release exit.");
|
||||
return errCode;
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleImpl::DecryptData(bool secureDecodrtState, IMediaDecryptModuleService::CryptInfo &cryptInfo, uint64_t srcBuffer,
|
||||
uint64_t dstBuffer)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleImpl::DecryptData enter");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleImpl::DecryptData serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->DecryptData(secureDecodrtState, cryptInfo, srcBuffer, dstBuffer);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleImpl::DecryptData failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaDecryptModuleImpl::DecryptData exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleImpl::RequireSecureDecoderModule(std::string &mimeType, bool *status)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleImpl::RequireSecureDecoderModule enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleImpl::RequireSecureDecoderModule serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->RequireSecureDecoderModule(mimeType, status);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("status: %{public}d", *status);
|
||||
return retCode;
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleImpl::RequireSecureDecoderModule exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_key_system_factory_impl.h"
|
||||
#include "i_mediakeysystem_service.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
|
||||
sptr<MediaKeySystemFactoryImpl> MediaKeySystemFactoryImpl::mediaKeySystemFactoryImpl_;
|
||||
|
||||
MediaKeySystemFactoryImpl::MediaKeySystemFactoryImpl()
|
||||
{
|
||||
DRM_DEBUG_LOG("MediaKeySystemFactoryImpl:0x%{public}06" PRIXPTR "MediaKeySystemFactoryImpl Instances create", FAKE_POINTER(this));
|
||||
Init();
|
||||
}
|
||||
|
||||
MediaKeySystemFactoryImpl::~MediaKeySystemFactoryImpl()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::~MediaKeySystemFactoryImpl enter.");
|
||||
if (serviceProxy_ != nullptr) {
|
||||
serviceProxy_ = nullptr;
|
||||
}
|
||||
DRM_DEBUG_LOG("MediaKeySystemFactoryImpl:0x%{public}06" PRIXPTR "MediaKeySystemFactoryImpl Instances destroy", FAKE_POINTER(this));
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::~MediaKeySystemFactoryImpl exit.");
|
||||
deathRecipient_ = nullptr;
|
||||
}
|
||||
|
||||
sptr<MediaKeySystemFactoryImpl> &MediaKeySystemFactoryImpl::GetInstance()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::GetInstance enter.");
|
||||
if (MediaKeySystemFactoryImpl::mediaKeySystemFactoryImpl_ == nullptr) {
|
||||
DRM_DEBUG_LOG("Initializing MediaKeySystemFactoryImpl for first time!");
|
||||
MediaKeySystemFactoryImpl::mediaKeySystemFactoryImpl_ = new(std::nothrow) MediaKeySystemFactoryImpl();
|
||||
if (MediaKeySystemFactoryImpl::mediaKeySystemFactoryImpl_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::GetInstance failed to new MediaKeySystemFactoryImpl");
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::GetInstance exit.");
|
||||
return MediaKeySystemFactoryImpl::mediaKeySystemFactoryImpl_;
|
||||
}
|
||||
|
||||
void MediaKeySystemFactoryImpl::Init()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::Init enter.");
|
||||
sptr<IRemoteObject> object = nullptr;
|
||||
|
||||
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
|
||||
if (samgr == nullptr) {
|
||||
DRM_ERR_LOG("Failed to get System ability manager");
|
||||
return;
|
||||
}
|
||||
object = samgr->GetSystemAbility(MEDIA_KEY_SYSTEM_SERVICE_ID);
|
||||
if (object == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::GetSystemAbility() is failed");
|
||||
return;
|
||||
}
|
||||
serviceProxy_ = iface_cast<IMediaKeySystemFactoryService>(object);
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl::init serviceProxy_ is null.");
|
||||
return;
|
||||
}
|
||||
pid_t pid = 0;
|
||||
deathRecipient_ = new(std::nothrow) DrmDeathRecipient(pid);
|
||||
|
||||
deathRecipient_->SetNotifyCb(std::bind(&MediaKeySystemFactoryImpl::MediaKeySystemServerDied, this, std::placeholders::_1));
|
||||
bool result = object->AddDeathRecipient(deathRecipient_);
|
||||
if (!result) {
|
||||
DRM_ERR_LOG("failed to add deathRecipient");
|
||||
return;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::Init exit.");
|
||||
}
|
||||
|
||||
void MediaKeySystemFactoryImpl::MediaKeySystemServerDied(pid_t pid)
|
||||
{
|
||||
DRM_ERR_LOG("MediaKeySystemServer has died, pid:%{public}d!", pid);
|
||||
if (serviceProxy_ != nullptr) {
|
||||
(void)serviceProxy_->AsObject()->RemoveDeathRecipient(deathRecipient_);
|
||||
serviceProxy_ = nullptr;
|
||||
}
|
||||
deathRecipient_ = nullptr;
|
||||
}
|
||||
|
||||
bool MediaKeySystemFactoryImpl::IsMediaKeySystemSupported(std::string &uuid)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = 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);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported exit.");
|
||||
|
||||
return isSurpported;
|
||||
}
|
||||
|
||||
bool MediaKeySystemFactoryImpl::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = 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);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported exit.");
|
||||
|
||||
return isSurpported;
|
||||
}
|
||||
|
||||
bool MediaKeySystemFactoryImpl::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, IKeySessionService::SecurityLevel securityLevel)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = 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);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl::IsMediaKeySystemSupported exit.");
|
||||
|
||||
return isSurpported;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryImpl::CreateMediaKeySystem(std::string &uuid, sptr<MediaKeySystemImpl> *mediaKeySystemImpl)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl:: CreateMediaKeySystem enter.");
|
||||
sptr<MediaKeySystemImpl> localMediaKeySystemImpl = nullptr;
|
||||
int retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryImpl:: serviceProxy_ == nullptr");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
retCode = serviceProxy_->CreateMediaKeySystem(uuid);
|
||||
if (retCode == DRM_OK) {
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to get session object from mediakeysystem service!, %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
*mediaKeySystemImpl = localMediaKeySystemImpl;
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryImpl:: CreateMediaKeySystem exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_key_system_impl.h"
|
||||
#include "i_mediakeysystem_service.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
|
||||
MediaKeySystemImpl::MediaKeySystemImpl(sptr<IMediaKeySystemService> &mediaKeysystem)
|
||||
{
|
||||
DRM_DEBUG_LOG("MediaKeySystemImpl:0x%{public}06" PRIXPTR "MediaKeySystemImpl Instances create", FAKE_POINTER(this));
|
||||
serviceProxy_ = mediaKeysystem;
|
||||
}
|
||||
|
||||
MediaKeySystemImpl::~MediaKeySystemImpl()
|
||||
{
|
||||
serviceProxy_ = nullptr;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemImpl::Release()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::Release enter.");
|
||||
int errCode = DRM_UNKNOWN_ERROR;
|
||||
if (serviceProxy_ != nullptr) {
|
||||
errCode = serviceProxy_->Release();
|
||||
if (errCode != DRM_OK) {
|
||||
DRM_ERR_LOG("Failed to Release keySystem!, %{public}d", errCode);
|
||||
return errCode;
|
||||
}
|
||||
serviceProxy_ = nullptr;
|
||||
} else {
|
||||
DRM_ERR_LOG("serviceProxy_ == nullptr");
|
||||
return -1;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::Release exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int MediaKeySystemImpl::GenerateKeySystemRequest(IMediaKeySystemService::RequestType type, std::vector<uint8_t> &request, std::string &defaultUrl)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GenerateKeySystemRequest enter. type:%{public}d.", type);
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GenerateKeySystemRequest serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GenerateKeySystemRequest(type, request, defaultUrl);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GenerateKeySystemRequest failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GenerateKeySystemRequest exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int MediaKeySystemImpl::ProcessKeySystemResponse(IMediaKeySystemService::RequestType type, const std::vector<uint8_t> &response)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::ProcessKeySystemResponse enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ProcessKeySystemResponse serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->ProcessKeySystemResponse(type, response);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::ProcessKeySystemResponse failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::ProcessKeySystemResponse exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int MediaKeySystemImpl::SetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::SetConfiguration enter, configType:%{public}d, propertyName:%{public}s, value:%{public}s.", (int)type, propertyName.c_str(), value.c_str());
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->SetConfiguration(type, propertyName, value);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::SetConfiguration failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::SetConfiguration exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int MediaKeySystemImpl::GetConfiguration(IMediaKeySystemService::ConfigType configType, std::string &propertyName, std::string &value)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetConfiguration enter, configType:%{public}d, propertyName:%{public}s.", (int)configType, propertyName.c_str());
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetConfiguration(configType, propertyName, value);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetConfiguration failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetConfiguration exit, value:%{public}s.", value.c_str());
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int MediaKeySystemImpl::CreateKeySession(IKeySessionService::SecurityLevel securityLevel, sptr<KeySessionImpl> *keySessionImpl)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::CreateKeySession enter.");
|
||||
sptr<IKeySessionService> keySessionProxy = nullptr;
|
||||
sptr<KeySessionImpl> localKeySessionImpl = nullptr;
|
||||
int retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl:: serviceProxy_ == nullptr");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
|
||||
retCode = serviceProxy_->CreateKeySession(securityLevel, keySessionProxy);
|
||||
if (retCode == DRM_OK) {
|
||||
if (keySessionProxy != nullptr) {
|
||||
localKeySessionImpl = new(std::nothrow) KeySessionImpl(keySessionProxy);
|
||||
if (localKeySessionImpl == nullptr) {
|
||||
DRM_ERR_LOG("Failed to new KeySessionImpl");
|
||||
return DRM_ALLOC_ERROR;
|
||||
}
|
||||
} else {
|
||||
DRM_ERR_LOG("Failed to CreateKeySessionImpl 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;
|
||||
}
|
||||
*keySessionImpl = localKeySessionImpl;
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::CreateKeySession exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemImpl::GetMetric(std::vector<IMediaKeySystemService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetMetric enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetMetric serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetMetric(infoMap);
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetMetric failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetMetric exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int MediaKeySystemImpl::GetSecurityLevel(IKeySessionService::SecurityLevel *securityLevel)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetSecurityLevel enter.");
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
int32_t retCode = DRM_OK;
|
||||
|
||||
if (serviceProxy_ == nullptr) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetSecurityLevel serviceProxy_ is null");
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
retCode = serviceProxy_->GetSecurityLevel((IKeySessionService::SecurityLevel *)securityLevel);
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetSecurityLevel 277");
|
||||
if (retCode != DRM_OK) {
|
||||
DRM_ERR_LOG("MediaKeySystemImpl::GetSecurityLevel failed, retCode: %{public}d", retCode);
|
||||
return DRM_SERVICE_ERROR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemImpl::GetSecurityLevel exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KEY_SESSION_IMPL_H_
|
||||
#define OHOS_DRM_KEY_SESSION_IMPL_H_
|
||||
|
||||
#include "media_decrypt_module_impl.h"
|
||||
#include "i_keysession_service.h"
|
||||
#include "i_keysession_service_callback.h"
|
||||
#include "key_session_service_callback_stub.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "iservice_registry.h"
|
||||
#include "nocopyable.h"
|
||||
#include <cstring>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
class KeySessionImplCallback : public RefBase {
|
||||
public:
|
||||
KeySessionImplCallback() = default;
|
||||
virtual ~KeySessionImplCallback() = default;
|
||||
virtual void OnKeySessionKeyExpired(const std::string eventType, const KeyStatus status) = 0;
|
||||
virtual void OnKeySessionReclaimed(const std::string eventType, const SessionStatus status) = 0;
|
||||
};
|
||||
|
||||
class KeySessionImpl : public RefBase {
|
||||
public:
|
||||
explicit KeySessionImpl(sptr<IKeySessionService> &keySession);
|
||||
~KeySessionImpl();
|
||||
int32_t Release();
|
||||
int32_t Init();
|
||||
sptr<MediaDecryptModuleImpl> GetDecryptModule();
|
||||
int32_t GenerateLicenseRequest(IKeySessionService::DrmInfo &drmInfo, IKeySessionService::LicenseInfo &licenseInfo);
|
||||
int32_t ProcessLicenseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &licenseResponse);
|
||||
int32_t GenerateOfflineReleaseRequest(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseRequest);
|
||||
int32_t ProcessOfflineReleaseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseReponse);
|
||||
int32_t CheckLicenseStatus(std::vector<IKeySessionService::KeyValue> &infoMap);
|
||||
int32_t RestoreOfflineKeys(std::vector<uint8_t> &keyId);
|
||||
int32_t RemoveOfflineKeys(std::vector<uint8_t> &keyId);
|
||||
int32_t GetOfflineKeyIds(std::vector<std::vector<uint8_t>> &keyIds);
|
||||
int32_t RemoveLicenses();
|
||||
int32_t GetOfflineKeyState(std::vector<uint8_t> &keyId, IKeySessionService::OfflineKeyState &state);
|
||||
sptr<IKeySessionService> GetKeySessionServiceProxy();
|
||||
sptr<KeySessionImplCallback> GetKeySessionApplicationCallback();
|
||||
int32_t SetKeySessionCallback(const sptr<KeySessionImplCallback> &callback);
|
||||
int32_t SetKeySessionServiceCallback(sptr<IKeySessionServiceCallback> &callback);
|
||||
private:
|
||||
sptr<KeySessionImplCallback> keySessionNapiCallback_;
|
||||
sptr<IKeySessionServiceCallback> keySessionServiceCallback_;
|
||||
sptr<OHOS::DrmStandard::IKeySessionService> keySessionServiceProxy_;
|
||||
sptr<MediaDecryptModuleImpl> mediaDecryptModuleImpl_;
|
||||
std::mutex mutex_;
|
||||
};
|
||||
|
||||
class KeySessionStatusCallback : public KeySessionServiceCallbackStub {
|
||||
public:
|
||||
KeySessionStatusCallback() : keySessionImpl_(nullptr) {};
|
||||
explicit KeySessionStatusCallback(const sptr<KeySessionImpl> &KeySessionImpl)
|
||||
: keySessionImpl_(KeySessionImpl) {}
|
||||
|
||||
~KeySessionStatusCallback() {
|
||||
keySessionImpl_ = nullptr;
|
||||
}
|
||||
|
||||
int32_t OnKeySessionKeyExpired(const KeyStatus status) override;
|
||||
int32_t OnKeySessionReclaimed(const SessionStatus status) override;
|
||||
|
||||
private:
|
||||
sptr<KeySessionImpl> keySessionImpl_;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_DECRYPT_MODULE_IMPL_H_
|
||||
#define OHOS_DRM_MEDIA_DECRYPT_MODULE_IMPL_H_
|
||||
|
||||
#include "ipc_skeleton.h"
|
||||
#include "iservice_registry.h"
|
||||
#include "nocopyable.h"
|
||||
#include "i_mediadecryptmodule_service.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include <cstring>
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
|
||||
class MediaDecryptModuleImpl : public RefBase {
|
||||
public:
|
||||
explicit MediaDecryptModuleImpl(sptr<IMediaDecryptModuleService> &decryptModule);
|
||||
~MediaDecryptModuleImpl();
|
||||
int32_t Release();
|
||||
int32_t DecryptData(bool secureDecodrtState, IMediaDecryptModuleService::CryptInfo &cryptInfo, uint64_t srcBuffer, uint64_t dstBuffer);
|
||||
int32_t RequireSecureDecoderModule(std::string &mimeType, bool *status);
|
||||
private:
|
||||
std::mutex mutex_;
|
||||
sptr<OHOS::DrmStandard::IMediaDecryptModuleService> serviceProxy_;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEMP_FACTORY_IMPL_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEMP_FACTORY_IMPL_H
|
||||
|
||||
#include "media_key_system_impl.h"
|
||||
#include "system_ability_definition.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "iservice_registry.h"
|
||||
#include "nocopyable.h"
|
||||
#include "i_mediakeysystemfactory_service.h"
|
||||
#include "drm_death_recipient.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
|
||||
class MediaKeySystemFactoryImpl : public RefBase {
|
||||
public:
|
||||
MediaKeySystemFactoryImpl();
|
||||
~MediaKeySystemFactoryImpl();
|
||||
void Init();
|
||||
static sptr<MediaKeySystemFactoryImpl> &GetInstance();
|
||||
bool IsMediaKeySystemSupported(std::string &uuid);
|
||||
bool IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType);
|
||||
bool IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, IKeySessionService::SecurityLevel securityLevel);
|
||||
int32_t CreateMediaKeySystem(std::string &uuid, sptr<MediaKeySystemImpl> *mediaKeySystemImpl);
|
||||
|
||||
private:
|
||||
void MediaKeySystemServerDied(pid_t pid);
|
||||
std::mutex mutex_;
|
||||
static sptr<MediaKeySystemFactoryImpl> mediaKeySystemFactoryImpl_;
|
||||
sptr<OHOS::DrmStandard::IMediaKeySystemFactoryService> serviceProxy_;
|
||||
sptr<DrmDeathRecipient> deathRecipient_;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} //OHOS
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEMP_FACTORY_IMPL_H
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEMP_IMPL_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEMP_IMPL_H
|
||||
|
||||
#include "key_session_impl.h"
|
||||
#include "system_ability_definition.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "iservice_registry.h"
|
||||
#include "nocopyable.h"
|
||||
#include "i_mediakeysystem_service.h"
|
||||
#include "drm_death_recipient.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
|
||||
class MediaKeySystemImpl : public RefBase {
|
||||
public:
|
||||
explicit MediaKeySystemImpl(sptr<IMediaKeySystemService> &mediaKeysystem);
|
||||
~MediaKeySystemImpl();
|
||||
int32_t Release();
|
||||
int32_t GenerateKeySystemRequest(IMediaKeySystemService::RequestType type, std::vector<uint8_t> &request, std::string &defaultUrl);
|
||||
int32_t ProcessKeySystemResponse(IMediaKeySystemService::RequestType type, const std::vector<uint8_t> &response);
|
||||
int32_t SetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value);
|
||||
int32_t GetConfiguration(IMediaKeySystemService::ConfigType configType, std::string &propertyName, std::string &value);
|
||||
int32_t CreateKeySession(IKeySessionService::SecurityLevel securityLevel, sptr<KeySessionImpl> *keySessionImpl);
|
||||
int32_t GetMetric(std::vector<IMediaKeySystemService::KeyValue> &infoMap);
|
||||
int32_t GetSecurityLevel(IKeySessionService::SecurityLevel *securityLevel);
|
||||
|
||||
private:
|
||||
std::mutex mutex_;
|
||||
sptr<OHOS::DrmStandard::IMediaKeySystemService> serviceProxy_;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} //OHOS
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEMP_IMPL_H
|
||||
@@ -0,0 +1,531 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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.
|
||||
*/
|
||||
|
||||
import {ErrorCallback, AsyncCallback, Callback} from './basic';
|
||||
import { Context } from './app/context';
|
||||
|
||||
/**
|
||||
* @name drm
|
||||
* @since 8
|
||||
*/
|
||||
declare namespace drm {
|
||||
/**
|
||||
* Creates a Mediakeysystem instance.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param uuid Used to point a Digital Right Managements solution.
|
||||
* @param callback Callback used to return the Mediakeysystem instance.
|
||||
*/
|
||||
function getMediaKeySystem(uuid: string, callback: AsyncCallback<MediaKeySystem>): void;
|
||||
|
||||
/**
|
||||
* Creates a MediaKeySystem instance.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param uuid Used to point a Digital Right Managements solution.
|
||||
* @returns Promise used to return the MediaKeySystem instance.
|
||||
*/
|
||||
function getMediaKeySystem(uuid: string): Promise<MediaKeySystem>;
|
||||
|
||||
/**
|
||||
* Judge whether a system that specifies UUID, mimetype and security level is supported.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param uuid Used to point a Digital Right Managements solution.
|
||||
* @param mimeType Used to specifies the meida type.
|
||||
* @param level Used to specifies the SecurityLevel.
|
||||
* @returns Whether these conditions will be met.
|
||||
*/
|
||||
function isMediaKeySystemSupported(uuid: string, mimeType: string, level: SecurityLevel): boolean;
|
||||
|
||||
/**
|
||||
* Judge whether a system that specifies UUID, mimetype and security level is supported.
|
||||
* @param uuid Used to point a Digital Right Managements solution.
|
||||
* @param mimeType Used to specifies the meida type.
|
||||
* @returns Whether these conditions will be met.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
function isMediaKeySystemSupported(uuid: string, mimeType: string): boolean;
|
||||
|
||||
/**
|
||||
* Judge whether a system that specifies UUID, mimetype and security level is supported.
|
||||
* @param uuid Used to point a Digital Right Managements solution.
|
||||
* @returns Whether these conditions will be met.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
function isMediaKeySystemSupported(uuid: string): boolean;
|
||||
|
||||
/**
|
||||
* Manages and record key sessions. Before calling an MediaKeySystem method, we must use getMediaKeySystem
|
||||
* to get a MediaKeySystem instance, then we can call functions.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface MediaKeySystem {
|
||||
|
||||
/**
|
||||
* Get the specified configuration.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param configType Used to specify the config type.
|
||||
* @param propertyName Used to specify the property name.
|
||||
* @returns The result.
|
||||
*/
|
||||
getConfiguration(configType: ConfigType, propertyName: PropertyName): string;
|
||||
|
||||
/**
|
||||
* Set the specified configuration.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param configType Used to specify the config type.
|
||||
* @param propertyName Used to specify the property name.
|
||||
* @param value The value to be set.
|
||||
*/
|
||||
setConfiguration(configType: ConfigType, propertyName: PropertyName, value: string): void;
|
||||
|
||||
/**
|
||||
* Generate the media key system provision request.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param type Used to specify the request type.
|
||||
* @returns Promise used to return a DrmRequest
|
||||
*/
|
||||
generateKeySystemRequest(type: RequestType): Promise<DrmRequest>;
|
||||
|
||||
/**
|
||||
* Process the response corresponding the key system request obtained by the application.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param type Used to specify the request type.
|
||||
* @param response Response corresponding to the request.
|
||||
*/
|
||||
processKeySystemResponse(type: RequestType, response: Uint8Array): Promise<void>;
|
||||
|
||||
/**
|
||||
* Create a key session instance.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param level Used to specify the Security level.
|
||||
* @returns Promise used to return a KeySession instance.
|
||||
*/
|
||||
createKeySession(level: SecurityLevel): Promise<KeySession>;
|
||||
|
||||
/**
|
||||
* Get performance statistics information.That includes currentSessionNum, version, decryptNumber,
|
||||
* and errorDecryptNumber.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @returns A map that includes perfaormence index and corresponding statistics.
|
||||
*/
|
||||
getMetric(): {[key: string]: string};
|
||||
|
||||
/**
|
||||
* Get security level.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @returns Promise used to return SecurityLevel.
|
||||
*/
|
||||
getSecurityLevel(): Promise<SecurityLevel>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide functions and keep a decrypt module. Before calling an KeySession method, we must use MediaKeySystem's
|
||||
* createKeySession to get a key session instance.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface KeySession {
|
||||
|
||||
/**
|
||||
* Generate the license request.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param mimeType Media type.
|
||||
* @param initData pssh after base64.
|
||||
* @param keyType Offline or online.
|
||||
*/
|
||||
generateLicenseRequest(mimeType: string, initData: Uint8Array, keyType: number): Promise<DrmRequest>;
|
||||
|
||||
/**
|
||||
* Process the response corresponding the license request obtained by the application.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param response The response.
|
||||
* @returns Return keyID.
|
||||
*/
|
||||
processLicenseResponse(response: Uint8Array): Promise<string>;
|
||||
|
||||
/**
|
||||
* Check the license status
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @returns License status pair.
|
||||
*/
|
||||
checkLicenseStatus(): Promise<KeyValue[]>;
|
||||
|
||||
/**
|
||||
* Release the resource before the session gonna be unused.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
release(): void;
|
||||
|
||||
/**
|
||||
* Remove license.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
removeLicenses(): void;
|
||||
|
||||
/**
|
||||
* Generate offline license request.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param keyId The keyId specifies which media content's license request should be generated.
|
||||
* @returns Return the license request.
|
||||
*/
|
||||
generateOfflineReleaseRequest(keyId: Uint8Array): Promise<Uint8Array>;
|
||||
|
||||
/**
|
||||
* Process offline license response.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param keyId The keyId specifies which media content's license it is
|
||||
* @param response The offline license.
|
||||
*/
|
||||
processOfflineReleaseResponse(keyId: Uint8Array, response: Uint8Array): void;
|
||||
|
||||
/**
|
||||
* Restore offline license response.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param keyId The keyId specifies which license should be restore.
|
||||
*/
|
||||
restoreOfflineKeys(keyId: Uint8Array): void;
|
||||
|
||||
/**
|
||||
* Get the list of offline keyIds.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @returns The list of offline keyIds.
|
||||
*/
|
||||
getOfflineKeyIds(): Uint8Array[];
|
||||
|
||||
/**
|
||||
* Remove license corresponding to the keyId.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param keyId The keyId specifies which license should be remove.
|
||||
*/
|
||||
removeOfflineKeys(keyId: Uint8Array): void;
|
||||
|
||||
/**
|
||||
* Get offline license status corresponding to the keyId.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param keyId The keyId specifies license.
|
||||
* @returns OfflineKeyState.
|
||||
*/
|
||||
getOfflineKeyState(keyId: Uint8Array): Promise<OfflineKeyState>;
|
||||
|
||||
/**
|
||||
* Get decrypt module.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @returns Return the media decrypt module instance.
|
||||
*/
|
||||
getDecryptModule(): Promise<MediaDecryptModule>;
|
||||
|
||||
/**
|
||||
* Register or unregister listens for drm events.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param type Type of the drm event to listen for.
|
||||
* @param callback Callback used to listen for the key system required event.
|
||||
*/
|
||||
on(type: 'keySystemRequired', callback: Callback<number>): void;
|
||||
off(type: 'keySystemRequired'): void;
|
||||
|
||||
/**
|
||||
* Register or unregister listens for drm events.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param type Type of the drm event to listen for.
|
||||
* @param callback Callback used to listen for the key required event.
|
||||
*/
|
||||
on(type: 'keyRequired', callback: Callback<number>): void;
|
||||
off(type: 'keyRequired'): void;
|
||||
|
||||
/**
|
||||
* Register or unregister listens for drm events.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param type Type of the drm event to listen for.
|
||||
* @param callback Callback used to listen for the key required event.
|
||||
*/
|
||||
on(type: 'keyExpired', callback: Callback<number>): void;
|
||||
off(type: 'keyExpired'): void;
|
||||
|
||||
/**
|
||||
* Register or unregister listens for drm events.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param type Type of the drm event to listen for.
|
||||
* @param callback Callback used to listen for the vendor defined event.
|
||||
*/
|
||||
on(type: 'vendorDefined', callback: Callback<number>): void;
|
||||
off(type: 'vendorDefined'): void;
|
||||
|
||||
/**
|
||||
* Register or unregister listens for drm events.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param type Type of the drm event to listen for.
|
||||
* @param callback Callback used to listen for keySession reclaimed event.
|
||||
*/
|
||||
on(type: 'keySessionReclaimed', callback: Callback<number>): void;
|
||||
off(type: 'keySessionReclaimed'): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide decrypt functions. Before we gonna use a decrypt module, we shoud call getDecryptModule.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface MediaDecryptModule {
|
||||
|
||||
/**
|
||||
* When the decrypt content need a secure decoder, return true, otherwise return false.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param mimeType The media content type.
|
||||
* @returns Whether secure decoder is needed.
|
||||
*/
|
||||
requireSecureDecoderModule(mimeType: string): boolean;
|
||||
|
||||
/**
|
||||
* Decrypt content.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
* @param secureDecoderStatus Secure decoder status.
|
||||
* @param cryptInfo Crypt info.
|
||||
* @param srcBuffer Source buffer.
|
||||
* @param dstBuffer Destination buffer.
|
||||
*/
|
||||
decryptData(secureDecoderStatus: boolean, cryptInfo: CryptInfo, srcBuffer: number,
|
||||
dstBuffer: number): Promise<void>;
|
||||
|
||||
/**
|
||||
* Release the resource that a decrypt module owned. When a decrypt module will be unused,
|
||||
* we should call this function.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
release(): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates event types of listener.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum ListenerType {
|
||||
LISTENER_DRM_EVENT = 200,
|
||||
LISTENER_PROVISION_REQUIRED = 201,
|
||||
LISTENER_KEY_NEEDED = 202,
|
||||
LISTENER_KEY_EXPIRED = 203,
|
||||
LISTENER_VENDOR_DEFINED = 204,
|
||||
LISTENER_KEYSESSION_RECLAIMED = 205,
|
||||
LISTENER_EXPIRATION_UPDATE = 206,
|
||||
LISTENER_KEY_CHANGE = 207,
|
||||
LISTENER_KEYSESSION_LOSE = 208,
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates which properties we can get.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum PropertyName {
|
||||
PROPERTY_DEVICE_VENDOR = "vendor",
|
||||
PROPERTY_DEVICE_VERSION = "version",
|
||||
PROPERTY_DEVICE_DESCRIPTION = "description",
|
||||
PROPERTY_DEVICE_ALGORITHMS = "algorithms",
|
||||
PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId",
|
||||
PROPERTY_SESSION_MAX = "maxSessionNum",
|
||||
PROPERTY_SESSION_CURRENT = "currentSessionNum",
|
||||
PROPERTY_OUTPUT_HDCP_MAX = "maxHDCPLevel",
|
||||
PROPERTY_OUTPUT_HDCP_CURRENT = "currentHDCPLevel",
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates hdcp level.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum HdcpLevel {
|
||||
HDCP_UNKNOWN,
|
||||
HDCP_NONE,
|
||||
HDCP_V1,
|
||||
HDCP_V2,
|
||||
HDCP_V2_1,
|
||||
HDCP_V2_2,
|
||||
HDCP_V2_3,
|
||||
HDCP_NO_OUTPUT = 0x7fff,
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates which configurations.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum ConfigType {
|
||||
CONFIGTYPE_DEVICEPROPERTY = 0,
|
||||
CONFIGTYPE_KEYSESSION = 1,
|
||||
CONFIGTYPE_OUTPUTPROTECTTYPE = 2,
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates license type.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum KeyType {
|
||||
KEYTYPE_OFFLINE = 0,
|
||||
KEYTYPE_ONLINE,
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates offline license state.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum OfflineKeyState {
|
||||
OFFLINEKEYSTATE_UNKNOWN = 0,
|
||||
OFFLINEKEYSTATE_USABLE = 1,
|
||||
OFFLINEKEYSTATE_INACTIVE = 2,
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates license request types.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum RequestType {
|
||||
REQUEST_TYPE_UNKNOWN = 0,
|
||||
REQUEST_TYPE_INITIAL = 1,
|
||||
REQUEST_TYPE_RENEWAL = 2,
|
||||
REQUEST_TYPE_RELEASE = 3,
|
||||
REQUEST_TYPE_NONE = 4,
|
||||
REQUEST_TYPE_UPDATE = 5,
|
||||
REQUEST_TYPE_DOWNLOADCERT = 6,
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates security level.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum SecurityLevel {
|
||||
SECURITY_LEVEL_UNKNOWN = 0,
|
||||
SECURITY_LEVEL_SW_CRYPTO = 1,
|
||||
SECURITY_LEVEL_SW_DECODE = 2,
|
||||
SECURITY_LEVEL_HW_CRYPTO = 3,
|
||||
SECURITY_LEVEL_HW_DECODE = 4,
|
||||
SECURITY_LEVEL_HW_ALL = 5,
|
||||
SECURITY_LEVEL_MAX = 6,
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the drm request definations.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface DrmRequest {
|
||||
keyRequestType: RequestType;
|
||||
mData: Uint8Array;
|
||||
mDefaultURL: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to indicates the license status with a key and its value.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface KeyValue {
|
||||
name: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to indicates the length of clear bytes and decrypt length in a subsample.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface SubSample {
|
||||
clearHeaderLen: number;
|
||||
payLoadLen: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decryption pattern.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface Pattern {
|
||||
encryptBlocks: number;
|
||||
skipBlocks: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enumerates encryption Algorithm types.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
enum CryptAlgorithmType {
|
||||
ALGTYPE_UNENCRYPTED = 0,
|
||||
ALGTYPE_AES_CTR = 1,
|
||||
ALGTYPE_AES_WV = 2,
|
||||
ALGTYPE_AES_CBC = 3,
|
||||
ALGTYPE_SM4_CBC = 4,
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the defination of encryption info.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface CryptInfo {
|
||||
type: CryptAlgorithmType;
|
||||
keyId: Uint8Array;
|
||||
iv: Uint8Array;
|
||||
pattern: Pattern;
|
||||
subSample: SubSample[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the defination of decryption data buffer.
|
||||
* @since 8
|
||||
* @syscap SystemCapability.Multimedia.Drm.Core
|
||||
*/
|
||||
interface DecryptDataBuffer {
|
||||
bufferLen: number;
|
||||
buffer: ArrayBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
export default drm;
|
||||
@@ -0,0 +1,65 @@
|
||||
import("//build/ohos.gni")
|
||||
import("//build/ohos/ace/ace.gni")
|
||||
|
||||
js_declaration("drm_js") {
|
||||
part_name = "multimedia_drm_framework"
|
||||
sources = [ "./@ohos.multimedia.drm.d.ts" ]
|
||||
}
|
||||
|
||||
ohos_copy("drm_declaration") {
|
||||
sources = [ "./@ohos.multimedia.drm.d.ts" ]
|
||||
outputs = [ target_out_dir + "/$target_name/" ]
|
||||
module_source_dir = target_out_dir + "/$target_name"
|
||||
module_install_name = ""
|
||||
}
|
||||
|
||||
ohos_shared_library("drm_napi") {
|
||||
include_dirs = [
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/common",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi",
|
||||
"//foundation/multimedia/drm_framework/frameworks/native/drm",
|
||||
"//foundation/multimedia/drm_framework/frameworks/native/common",
|
||||
"//foundation/multimedia/drm_framework/interfaces/inner_api/native/drm",
|
||||
"//foundation/multimedia/drm_framework/interfaces/kits/js/drm_napi/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/ipc",
|
||||
"//foundation/multimedia/drm_framework/services/utils/include",
|
||||
"//foundation/multimedia/graphic/graphic_2d/interfaces/inner_api/surface",
|
||||
"//foundation//arkui/napi/interfaces/kits",
|
||||
]
|
||||
sources = [
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/key_session_callback_napi.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/media_key_system_callback_napi.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/drm_napi.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/drm_enum_napi.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/media_key_system_napi.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/key_session_napi.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/media_decrypt_module_napi.cpp",
|
||||
"//foundation/multimedia/drm_framework/frameworks/js/drm_napi/native_module_ohos_drm.cpp",
|
||||
]
|
||||
deps = [
|
||||
"//foundation/multimedia/drm_framework/frameworks/native:drm_framework",
|
||||
]
|
||||
external_deps = [
|
||||
"access_token:libtokenid_sdk",
|
||||
"c_utils:utils",
|
||||
"graphic_2d:surface",
|
||||
"hisysevent:libhisysevent",
|
||||
"hitrace:hitrace_meter",
|
||||
"hilog:libhilog",
|
||||
"ipc:ipc_core",
|
||||
"napi:ace_napi",
|
||||
]
|
||||
sanitize = {
|
||||
cfi = true
|
||||
cfi_cross_dso = true
|
||||
debug = true
|
||||
}
|
||||
cflags = [ "-fPIC" ]
|
||||
cflags_cc = cflags
|
||||
relative_install_dir = "module/multimedia"
|
||||
part_name = "multimedia_drm_framework"
|
||||
subsystem_name = "multimedia"
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_ENUM_NAPI_H_
|
||||
#define OHOS_DRM_ENUM_NAPI_H_
|
||||
|
||||
#include "key_session_napi.h"
|
||||
#include "media_decrypt_module_napi.h"
|
||||
#include "media_key_system_napi.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class DrmEnumNapi {
|
||||
public:
|
||||
DrmEnumNapi() = default;
|
||||
~DrmEnumNapi() = default;
|
||||
static napi_value Init(napi_env env, napi_value exports);
|
||||
|
||||
private:
|
||||
static napi_value JsEnumIntInit(napi_env env, napi_value exports);
|
||||
static napi_value JsEnumStringInit(napi_env env, napi_value exports);
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
#endif // OHOS_DRM_ENUM_NAPI_H_
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_DRM_NAPI_H_
|
||||
#define OHOS_DRM_DRM_NAPI_H_
|
||||
|
||||
#include "media_key_system_napi.h"
|
||||
#include "key_session_napi.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
static const char DRM_NAPI_CLASS_NAME[] = "drm";
|
||||
|
||||
class DrmNapi {
|
||||
public:
|
||||
DrmNapi();
|
||||
~DrmNapi();
|
||||
static napi_value Init(napi_env env, napi_value exports);
|
||||
static napi_value CreateMediaKeySystemInstance(napi_env env, napi_callback_info info);
|
||||
static napi_value IsMediaKeySystemSupported(napi_env env, napi_callback_info info);
|
||||
private:
|
||||
static napi_value DrmNapiConstructor(napi_env env, napi_callback_info info);
|
||||
static void DrmNapiDestructor(napi_env env, void *nativeObject, void *finalize);
|
||||
static thread_local napi_ref sConstructor_;
|
||||
napi_env env_;
|
||||
napi_ref wrapper_;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
#endif // OHOS_DRM_DRM_NAPI_H_
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KeySessionCallbackNapi_H_
|
||||
#define OHOS_DRM_KeySessionCallbackNapi_H_
|
||||
|
||||
#include "key_session_impl.h"
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_node_api.h"
|
||||
#include "common_napi.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
class KeySessionCallbackNapi : public KeySessionImplCallback {
|
||||
public:
|
||||
explicit KeySessionCallbackNapi();
|
||||
virtual ~KeySessionCallbackNapi();
|
||||
void SetCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair);
|
||||
void ClearCallbackReference(const std::string eventType);
|
||||
void OnKeySessionKeyExpired(const std::string eventType, const KeyStatus status) override;
|
||||
void OnKeySessionReclaimed(const std::string eventType, const SessionStatus status) override;
|
||||
|
||||
private:
|
||||
std::mutex mutex_;
|
||||
std::map<std::string, sptr<CallBackPair>> callbackMap_;
|
||||
};
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KEY_SESSION_H_
|
||||
#define OHOS_DRM_KEY_SESSION_H_
|
||||
|
||||
#include "key_session_impl.h"
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_node_api.h"
|
||||
#include "key_session_callback_napi.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
#include <map>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
static const char KEY_SESSION_NAPI_CLASS_NAME[] = "KeySession";
|
||||
class KeySessionNapi {
|
||||
public:
|
||||
KeySessionNapi();
|
||||
~KeySessionNapi();
|
||||
static napi_value Init(napi_env env, napi_value exports);
|
||||
static napi_value CreateKeySession(napi_env env, sptr<KeySessionImpl> keySessionImpl);
|
||||
static napi_value Release(napi_env env, napi_callback_info info);
|
||||
static napi_value GenerateLicenseRequest(napi_env env, napi_callback_info info);
|
||||
static napi_value ProcessLicenseResponse(napi_env env, napi_callback_info info);
|
||||
static napi_value GenerateOfflineReleaseRequest(napi_env env, napi_callback_info info);
|
||||
static napi_value ProcessOfflineReleaseResponse(napi_env env, napi_callback_info info);
|
||||
static napi_value CheckLicenseStatus(napi_env env, napi_callback_info info);
|
||||
static napi_value RestoreOfflineKeys(napi_env env, napi_callback_info info);
|
||||
static napi_value RemoveOfflineKeys(napi_env env, napi_callback_info info);
|
||||
static napi_value GetOfflineKeyIds(napi_env env, napi_callback_info info);
|
||||
static napi_value RemoveLicenses(napi_env env, napi_callback_info info);
|
||||
static napi_value GetDecryptModule(napi_env env, napi_callback_info info);
|
||||
static napi_value AddEventListener(napi_env env, napi_callback_info info);
|
||||
static napi_value DeleteEventListener(napi_env env, napi_callback_info info);
|
||||
static napi_value GetOfflineKeyState(napi_env env, napi_callback_info info);
|
||||
static napi_value SetEventCallback(napi_env env, napi_callback_info info);
|
||||
static napi_value UnsetEventCallback(napi_env env, napi_callback_info info);
|
||||
static bool SetKeySessionNativeProperty(napi_env env, napi_value obj, const std::string &name, sptr<KeySessionImpl> keySessionImpl);
|
||||
void SetEventCallbackReference(const std::string eventType, sptr<CallBackPair> callbackPair);
|
||||
void ClearEventCallbackReference(const std::string eventType);
|
||||
private:
|
||||
static napi_value KeySessionNapiConstructor(napi_env env, napi_callback_info info);
|
||||
static void KeySessionNapiDestructor(napi_env env, void *nativeObject, void *finalize);
|
||||
|
||||
napi_env env_;
|
||||
napi_ref wrapper_;
|
||||
static thread_local napi_ref sConstructor_;
|
||||
std::mutex mutex_;
|
||||
static thread_local sptr<KeySessionImpl> sKeySessionImpl_;
|
||||
sptr<KeySessionImpl> keySessionImpl_;
|
||||
sptr<KeySessionCallbackNapi> keySessionCallbackNapi_;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
|
||||
#endif // OHOS_DRM_KEY_SESSION_H_
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_DECYPT_MODULE_H_
|
||||
#define OHOS_DRM_DECYPT_MODULE_H_
|
||||
|
||||
#include "media_decrypt_module_impl.h"
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_node_api.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
static const char DECYPT_MODULE_NAPI_CLASS_NAME[] = "decryptModule";
|
||||
class MediaDecryptModuleNapi {
|
||||
public:
|
||||
MediaDecryptModuleNapi();
|
||||
~MediaDecryptModuleNapi();
|
||||
static napi_value Init(napi_env env, napi_value exports);
|
||||
static napi_value GetDecryptModule(napi_env env, sptr<MediaDecryptModuleImpl> decryptModuleImpl);
|
||||
static napi_value Release(napi_env env, napi_callback_info info);
|
||||
static napi_value RequireSecureDecoderModule(napi_env env, napi_callback_info info);
|
||||
static napi_value DecryptData(napi_env env, napi_callback_info info);
|
||||
private:
|
||||
static napi_value MediaDecryptModuleNapiConstructor(napi_env env, napi_callback_info info);
|
||||
static void MediaDecryptModuleNapiDestructor(napi_env env, void *nativeObject, void *finalize);
|
||||
|
||||
napi_env env_;
|
||||
napi_ref wrapper_;
|
||||
static thread_local napi_ref sConstructor_;
|
||||
static thread_local sptr<MediaDecryptModuleImpl> sMediaDecryptModuleImpl_;
|
||||
sptr<MediaDecryptModuleImpl> mediaDecryptModuleImpl_;
|
||||
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
|
||||
#endif // OHOS_DRM_DECYPT_MODULE_H_
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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.
|
||||
*/
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEM_NAPI_H_
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEM_NAPI_H_
|
||||
|
||||
#include "media_key_system_impl.h"
|
||||
#include "media_key_system_factory_impl.h"
|
||||
#include "key_session_impl.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_node_api.h"
|
||||
#include "hilog/log.h"
|
||||
#include <cinttypes>
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
static const char MEDIA_KEY_SYSTEM_NAPI_CLASS_NAME[] = "MediaKeySystem";
|
||||
|
||||
class MediaKeySystemNapi {
|
||||
public:
|
||||
static napi_value Init(napi_env env, napi_value exports);
|
||||
MediaKeySystemNapi();
|
||||
~MediaKeySystemNapi();
|
||||
napi_value Release(napi_env env, napi_callback_info info);
|
||||
//NOTE:static means kind of PIDs enjoy the same mediakeysystem?
|
||||
static napi_value IsMediaKeySystemSupported(napi_env env, napi_callback_info info);
|
||||
static napi_value CreateMediaKeySystemInstance(napi_env env, napi_callback_info info);
|
||||
static napi_value SetConfiguration(napi_env env, napi_callback_info info);
|
||||
static napi_value GetConfiguration(napi_env env, napi_callback_info info);
|
||||
static napi_value GenerateKeySystemRequest(napi_env env, napi_callback_info info);
|
||||
static napi_value ProcessKeySystemResponse(napi_env env, napi_callback_info info);
|
||||
static napi_value CreateKeySession(napi_env env, napi_callback_info info);
|
||||
static napi_value GetMetric(napi_env env, napi_callback_info info);
|
||||
static napi_value GetSecurityLevel(napi_env env, napi_callback_info info);
|
||||
private:
|
||||
// void ErrorCallback(MediaServiceExtErrCode errCode, std::string errMsg = "unknown");
|
||||
// void SetCallbackReference(const std::string &callbackName, std::shared_ptr<AutoRef> ref);
|
||||
// void CancelCallback();
|
||||
static napi_value MediaKeySystemNapiConstructor(napi_env env, napi_callback_info info);
|
||||
static void MediaKeySystemNapiDestructor(napi_env env, void *nativeObject, void *finalize);
|
||||
|
||||
static thread_local napi_ref sConstructor_;
|
||||
napi_env env_;
|
||||
napi_ref wrapper_;
|
||||
sptr<MediaKeySystemImpl> mediaKeySystemImpl_;
|
||||
static thread_local sptr<MediaKeySystemImpl> sMediaKeySystemImpl_;
|
||||
|
||||
//std::shared_ptr<MediaKeySystemCallback> mediaKeySystemCb_ = nullptr;
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_NAPI_H_
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 NATIVE_MODULE_OHOS_DRM_H_
|
||||
#define NATIVE_MODULE_OHOS_DRM_H_
|
||||
|
||||
#include "media_key_system_napi.h"
|
||||
#include "media_key_system_callback_napi.h"
|
||||
#include "key_session_napi.h"
|
||||
#include "media_decrypt_module_napi.h"
|
||||
#include "drm_napi.h"
|
||||
#include "drm_enum_napi.h"
|
||||
#endif /* NATIVE_MODULE_OHOS_DRM_H_*/
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"patches":[
|
||||
{
|
||||
"project":"productdefine_common",
|
||||
"path":"productdefine/common",
|
||||
"pr_url":"https://gitee.com/openharmony/productdefine_common/pulls/733"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"process": "drm_service",
|
||||
"systemability": [
|
||||
{
|
||||
"name": 3012,
|
||||
"libpath": "libdrm_service.z.so",
|
||||
"run-on-create": true,
|
||||
"distributed": false,
|
||||
"dump_level": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
# Copyright (c) 2023-2024 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.
|
||||
|
||||
import("//build/ohos/sa_profile/sa_profile.gni")
|
||||
|
||||
ohos_sa_profile("drm_service_sa_profile") {
|
||||
sources = [ "3012.json" ]
|
||||
|
||||
part_name = "multimedia_drm_framework"
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
import("//build/ohos.gni")
|
||||
|
||||
ohos_shared_library("drm_service") {
|
||||
install_enable = true
|
||||
|
||||
include_dirs = [
|
||||
"//foundation/graphic/graphic_2d/frameworks/surface/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/include",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/ipc",
|
||||
"//foundation/multimedia/drm_framework/interfaces/inner_api/native",
|
||||
"//foundation/multimedia/drm_framework/interfaces/inner_api/native/drm",
|
||||
"//foundation/multimedia/drm_framework/services/utils/include",
|
||||
"//base/security/access_token/interfaces/innerkits/accesstoken/include",
|
||||
"//third_party/glib/glibmemdfx",
|
||||
"//drivers/hdf_core/interfaces/inner_api/utils",
|
||||
"//drivers/hdf_core/adapter/khdf/uniproton/osal/include",
|
||||
"//drivers/hdf_core/adapter/uhdf2/ipc/include",
|
||||
"//drivers/hdf_core/interfaces/inner_api/ipc",
|
||||
"//drivers/hdf_core/interfaces/inner_api/hdi",
|
||||
"//foundation//arkui/napi/interfaces/kits",
|
||||
]
|
||||
include_dirs += [
|
||||
"//utils/system/safwk/native/include",
|
||||
]
|
||||
|
||||
sources = [
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/drm_host_manager.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/mediakeysystemfactory_service.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/mediakeysystemfactory_service_stub.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/mediakeysystem_service.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/mediakeysystem_service_stub.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/key_session_service.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/key_session_service_stub.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/media_decrypt_module_service.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/server/src/media_decrypt_module_service_stub.cpp",
|
||||
"//foundation/multimedia/drm_framework/services/drm_service/client/src/key_session_service_callback_proxy.cpp"
|
||||
]
|
||||
|
||||
deps = [
|
||||
]
|
||||
|
||||
external_deps = [
|
||||
"ability_base:want",
|
||||
"access_token:libaccesstoken_sdk",
|
||||
"access_token:libprivacy_sdk",
|
||||
"bundle_framework:appexecfwk_base",
|
||||
"bundle_framework:appexecfwk_core",
|
||||
"hilog:libhilog",
|
||||
"hitrace:hitrace_meter",
|
||||
"hicollie:libhicollie",
|
||||
"hisysevent:libhisysevent",
|
||||
"ipc:ipc_core",
|
||||
"ipc:ipc_single",
|
||||
"safwk:system_ability_fwk",
|
||||
"samgr:samgr_proxy",
|
||||
"c_utils:utils",
|
||||
"hdf_core:libhdi",
|
||||
"napi:ace_napi",
|
||||
]
|
||||
|
||||
cflags = [
|
||||
"-Wall",
|
||||
"-fPIC",
|
||||
]
|
||||
|
||||
if (target_cpu == "arm") {
|
||||
cflags += [ "-DBINDER_IPC_32BIT" ]
|
||||
}
|
||||
|
||||
sanitize = {
|
||||
cfi = true
|
||||
cfi_cross_dso = true
|
||||
debug = true
|
||||
}
|
||||
|
||||
if (use_musl) {
|
||||
if (use_jemalloc && use_jemalloc_dfx_intf) {
|
||||
cflags += [ "-DCONFIG_USE_JEMALLOC_DFX_INTF" ]
|
||||
}
|
||||
}
|
||||
|
||||
cflags_cc = cflags
|
||||
|
||||
subsystem_name = "multimedia"
|
||||
part_name = "multimedia_drm_framework"
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KEY_SESSION_SERVICE_CALLBACK_PROXY_H
|
||||
#define OHOS_DRM_KEY_SESSION_SERVICE_CALLBACK_PROXY_H
|
||||
|
||||
#include "i_keysession_service_callback.h"
|
||||
#include "iremote_proxy.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
class KeySessionServiceCallbackProxy : public IRemoteProxy<IKeySessionServiceCallback> {
|
||||
public:
|
||||
explicit KeySessionServiceCallbackProxy(const sptr<IRemoteObject> &impl);
|
||||
virtual ~KeySessionServiceCallbackProxy() = default;
|
||||
int32_t OnKeySessionKeyExpired(const KeyStatus status) override;
|
||||
int32_t OnKeySessionReclaimed(const SessionStatus status) override;
|
||||
private:
|
||||
static inline BrokerDelegator<KeySessionServiceCallbackProxy> delegator_;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif // OHOS_DRM_KEY_SESSION_SERVICE_CALLBACK_PROXY_H
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KEY_SESSION_PROXY_H
|
||||
#define OHOS_DRM_KEY_SESSION_PROXY_H
|
||||
|
||||
#include "i_keysession_service.h"
|
||||
#include "iremote_proxy.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class KeySessionServiceProxy : public IRemoteProxy<IKeySessionService> {
|
||||
public:
|
||||
explicit KeySessionServiceProxy(const sptr<IRemoteObject> &impl);
|
||||
virtual ~KeySessionServiceProxy() = default;
|
||||
int32_t Release() override;
|
||||
int32_t CreateMediaDecryptModule(sptr<IMediaDecryptModuleService> &decryptModule) override;
|
||||
int32_t GenerateLicenseRequest(IKeySessionService::DrmInfo &drmInfo, IKeySessionService::LicenseInfo &licenseInfo) override;
|
||||
int32_t ProcessLicenseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &licenseResponse) override;
|
||||
int32_t GenerateOfflineReleaseRequest(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseRequest) override;
|
||||
int32_t ProcessOfflineReleaseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseReponse) override;
|
||||
int32_t CheckLicenseStatus(std::vector<KeyValue> &infoMap) override;
|
||||
int32_t RestoreOfflineKeys(std::vector<uint8_t> &keyId) override;
|
||||
int32_t RemoveOfflineKeys(std::vector<uint8_t> &keyId) override;
|
||||
int32_t GetOfflineKeyIds(std::vector<std::vector<uint8_t>> &keyIds) override;
|
||||
int32_t RemoveLicenses() override;
|
||||
int32_t GetOfflineKeyState(std::vector<uint8_t> &keyId, IKeySessionService::OfflineKeyState &state) override;
|
||||
int32_t SetKeySessionServiceCallback(sptr<IKeySessionServiceCallback> &callback) override;
|
||||
private:
|
||||
static inline BrokerDelegator<KeySessionServiceProxy> delegator_;
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_DECRYPT_MODULE_SERVICE_PROXY_H
|
||||
#define OHOS_DRM_MEDIA_DECRYPT_MODULE_SERVICE_PROXY_H
|
||||
|
||||
#include "i_mediadecryptmodule_service.h"
|
||||
#include "remote_request_code.h"
|
||||
#include "iremote_proxy.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class MediaDecryptModuleServiceProxy : public IRemoteProxy<IMediaDecryptModuleService> {
|
||||
public:
|
||||
explicit MediaDecryptModuleServiceProxy(const sptr<IRemoteObject> &impl);
|
||||
virtual ~MediaDecryptModuleServiceProxy() = default;
|
||||
int32_t Release() override;
|
||||
int32_t DecryptData(bool secureDecodrtState, IMediaDecryptModuleService::CryptInfo &cryptInfo, uint64_t srcBuffer, uint64_t dstBuffer) override;
|
||||
int32_t RequireSecureDecoderModule(std::string &mimeType, bool *status) override;
|
||||
|
||||
private:
|
||||
static inline BrokerDelegator<MediaDecryptModuleServiceProxy> delegator_;
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_PROXY_H
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_PROXY_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_PROXY_H
|
||||
|
||||
#include "i_mediakeysystem_service.h"
|
||||
#include "iremote_proxy.h"
|
||||
#include <hilog/log.h>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class MediaKeySystemServiceProxy : public IRemoteProxy<IMediaKeySystemService> {
|
||||
public:
|
||||
explicit MediaKeySystemServiceProxy(const sptr<IRemoteObject> &impl);
|
||||
virtual ~MediaKeySystemServiceProxy() = default;
|
||||
int32_t Release() override;
|
||||
int32_t GenerateKeySystemRequest(IMediaKeySystemService::RequestType type, std::vector<uint8_t> &request, std::string &defaultUrl) override;
|
||||
int32_t ProcessKeySystemResponse(IMediaKeySystemService::RequestType type, const std::vector<uint8_t> &response) override;
|
||||
int32_t SetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value) override;
|
||||
int32_t GetConfiguration(IMediaKeySystemService::ConfigType configType, std::string &propertyName, std::string &value) override;
|
||||
int32_t CreateKeySession(IKeySessionService::SecurityLevel securityLevel, sptr<IKeySessionService> &keySessionProxy) override;
|
||||
int32_t GetMetric(std::vector<IMediaKeySystemService::KeyValue> &infoMap) override;
|
||||
int32_t GetSecurityLevel(IKeySessionService::SecurityLevel *securityLevel) override;
|
||||
private:
|
||||
static inline BrokerDelegator<MediaKeySystemServiceProxy> delegator_;
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_PROXY_H
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_PROXY_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_PROXY_H
|
||||
|
||||
#include "i_mediakeysystemfactory_service.h"
|
||||
#include "iremote_proxy.h"
|
||||
#include <hilog/log.h>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class MediaKeySystemFactoryServiceProxy : public IRemoteProxy<IMediaKeySystemFactoryService> {
|
||||
public:
|
||||
explicit MediaKeySystemFactoryServiceProxy(const sptr<IRemoteObject> &impl);
|
||||
virtual ~MediaKeySystemFactoryServiceProxy() = default;
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, bool *isSurpported) override;
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, bool *isSurpported) override;
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, int32_t securityLevel, bool *isSurpported) override;
|
||||
int32_t CreateMediaKeySystem(std::string &uuid) override;
|
||||
|
||||
private:
|
||||
static inline BrokerDelegator<MediaKeySystemFactoryServiceProxy> delegator_;
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_PROXY_H
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_service_callback_proxy.h"
|
||||
#include "drm_log.h"
|
||||
#include "remote_request_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
KeySessionServiceCallbackProxy::KeySessionServiceCallbackProxy(const sptr<IRemoteObject> &impl)
|
||||
: IRemoteProxy<IKeySessionServiceCallback>(impl) { };
|
||||
|
||||
int32_t KeySessionServiceCallbackProxy::OnKeySessionKeyExpired(const KeyStatus status)
|
||||
{
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
DRM_INFO_LOG("KeySessionServiceCallbackProxy OnKeySessionKeyExpired called");
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceCallbackProxy OnKeySessionKeyExpired Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(status)) {
|
||||
DRM_ERR_LOG("KeySessionServiceCallbackProxy OnKeySessionKeyExpired Write status failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
int error = Remote()->SendRequest(KEY_SESSION_SERVICE_CALLBACK_ON_KEY_EXPIRED, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceCallbackProxy OnKeySessionKeyExpired failed, error: %{public}d", error);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceCallbackProxy::OnKeySessionReclaimed(const SessionStatus status)
|
||||
{
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
DRM_INFO_LOG("KeySessionServiceCallbackProxy OnKeySessionReclaimed called");
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceCallbackProxy OnKeySessionReclaimed Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(status)) {
|
||||
DRM_ERR_LOG("KeySessionServiceCallbackProxy OnKeySessionReclaimed Write status failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
int error = Remote()->SendRequest(KEY_SESSION_SERVICE_CALLBACK_ON_KEY_SESSION_RECLAIMED, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceCallbackProxy OnKeySessionReclaimed failed, error: %{public}d", error);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,443 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_service_proxy.h"
|
||||
#include "drm_log.h"
|
||||
#include "remote_request_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
KeySessionServiceProxy::KeySessionServiceProxy(const sptr<IRemoteObject> &impl)
|
||||
: IRemoteProxy<IKeySessionService>(impl)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy Initialized.");
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::CreateMediaDecryptModule(sptr<IMediaDecryptModuleService> &decryptModule)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::CreateMediaDecryptModule enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy CreateMediaDecryptModule Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(CREATE_MEDIA_DECRYPT_MODULE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::CreateMediaDecryptModule failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
auto remoteObject = reply.ReadRemoteObject();
|
||||
if (remoteObject != nullptr) {
|
||||
decryptModule = iface_cast<IMediaDecryptModuleService>(remoteObject);
|
||||
} else {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy CreateMediaDecryptModule decryptModule is nullptr");
|
||||
error = IPC_PROXY_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::CreateMediaDecryptModule exit.");
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
int32_t KeySessionServiceProxy::Release()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::Release enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy Release Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(KEY_SESSION_RELEASE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy Release failed, error: %{public}d", error);
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::Release exit.");
|
||||
return error;
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::GenerateLicenseRequest(IKeySessionService::DrmInfo &drmInfo, IKeySessionService::LicenseInfo &licenseInfo)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GenerateLicenseRequest enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateLicenseRequest Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(drmInfo.keyType)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateLicenseRequest Write keyType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteString(drmInfo.mimeType)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateLicenseRequest Write mimeType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(drmInfo.indexInfo.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateLicenseRequest Write indexInfo.size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteBuffer(drmInfo.indexInfo.data(), drmInfo.indexInfo.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateLicenseRequest Write indexInfo.size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_GENERATE_LICENSE_REQUEST, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::GenerateLicenseRequest failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
licenseInfo.requestType = (IKeySessionService::RequestType)reply.ReadInt32();
|
||||
uint32_t dataSize = reply.ReadInt32();
|
||||
for (int i = 0; i < dataSize; i++) {
|
||||
licenseInfo.mData.push_back(reply.ReadUint8());
|
||||
}
|
||||
|
||||
licenseInfo.mDefaultURL = reply.ReadString();
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GenerateLicenseRequest exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::ProcessLicenseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &licenseResponse)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::ProcessLicenseResponse enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessLicenseResponse Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(licenseResponse.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessLicenseResponse Write licenseResponse size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (auto response : licenseResponse) {
|
||||
if (!data.WriteUint8(response)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessLicenseResponse Write licenseResponse failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_PROCESS_LICENSE_RESPONSE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::ProcessLicenseResponse failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
uint32_t keyIdSize = reply.ReadInt32();
|
||||
for (int i = 0; i < keyIdSize; i++) {
|
||||
keyId.push_back(reply.ReadUint8());
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::ProcessLicenseResponse exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::GenerateOfflineReleaseRequest(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseRequest)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GenerateOfflineReleaseRequest enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateOfflineReleaseRequest Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(keyId.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateOfflineReleaseRequest Write keyId size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (auto id : keyId) {
|
||||
if (!data.WriteUint8(id)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateOfflineReleaseRequest Write keyId failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_GENERATE_OFFLINE_RELEASE_REQUEST, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::GenerateOfflineReleaseRequest failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
uint32_t requestSize = reply.ReadInt32();
|
||||
for (int i = 0; i < requestSize; i++) {
|
||||
releaseRequest.push_back(reply.ReadUint8());
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GenerateOfflineReleaseRequest exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::ProcessOfflineReleaseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseReponse)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::ProcessOfflineReleaseResponse enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessOfflineReleaseResponse Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(keyId.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessOfflineReleaseResponse Write keyId size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (auto id : keyId) {
|
||||
if (!data.WriteUint8(id)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessOfflineReleaseResponse Write keyId failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
if (!data.WriteInt32(releaseReponse.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessOfflineReleaseResponse Write releaseReponse size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (auto response : releaseReponse) {
|
||||
if (!data.WriteUint8(response)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy ProcessOfflineReleaseResponse Write releaseReponse failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_PROCESS_OFFLINE_RELEASE_RESPONSE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::ProcessOfflineReleaseResponse failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::ProcessOfflineReleaseResponse exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::CheckLicenseStatus(std::vector<IKeySessionService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GenerateOfflineReleaseRequest enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateOfflineReleaseRequest Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_GENERATE_CHECK_LICENSE_STATUS, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::GenerateOfflineReleaseRequest failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
int infoMapSize = reply.ReadInt32();
|
||||
for (int i = 0; i < infoMapSize; i++) {
|
||||
KeyValue keyValue;
|
||||
keyValue.name = reply.ReadString();
|
||||
keyValue.value = reply.ReadString();
|
||||
infoMap.push_back(keyValue);
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GenerateOfflineReleaseRequest exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::RestoreOfflineKeys(std::vector<uint8_t> &keyId)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::RestoreOfflineKeys enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy RestoreOfflineKeys Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(keyId.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy RestoreOfflineKeys Write keyId size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (auto id : keyId) {
|
||||
if (!data.WriteUint8(id)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy RestoreOfflineKeys Write keyId failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_RESTORE_OFFLINEKEYS, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::RestoreOfflineKeys failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::RestoreOfflineKeys exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::RemoveOfflineKeys(std::vector<uint8_t> &keyId)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::RemoveOfflineKeys enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy RemoveOfflineKeys Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(keyId.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy RestoreOfflineKeys Write keyId size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (auto id : keyId) {
|
||||
if (!data.WriteUint8(id)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy RestoreOfflineKeys Write keyId failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_REMOVE_OFFLINEKEYS, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::RemoveOfflineKeys failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::RemoveOfflineKeys exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::GetOfflineKeyIds(std::vector<std::vector<uint8_t>> &keyIds)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GetOfflineKeyIds enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GetOfflineKeyIds Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
int32_t error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_GET_OFFLINEKEYIDS, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::GetOfflineKeyIds failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
int32_t keyIdsSize = reply.ReadInt32();
|
||||
for (int i = 0; i < keyIdsSize; i++) {
|
||||
int32_t keyIdSize = reply.ReadInt32();
|
||||
std::vector<uint8_t> keyId;
|
||||
const uint8_t* keyIdBuf = static_cast<const uint8_t*>(reply.ReadBuffer(keyIdSize));
|
||||
if (keyIdBuf == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::GetOfflineKeyIds ReadBuffer failed");
|
||||
return error;
|
||||
}
|
||||
keyId.assign(keyIdBuf, keyIdBuf + keyIdSize);
|
||||
keyIds.push_back(keyId);
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GetOfflineKeyIds exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::RemoveLicenses()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::RemoveLicenses enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy RemoveLicenses Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_REMOVE_LICENSE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::RemoveLicenses failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::RemoveLicenses exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::GetOfflineKeyState(std::vector<uint8_t> &keyId, IKeySessionService::OfflineKeyState &state)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GetOfflineKeyState enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(KeySessionServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GetOfflineKeyState Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(keyId.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GetOfflineKeyState Write keyId size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (auto id : keyId) {
|
||||
if (!data.WriteUint8(id)) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GetOfflineKeyState Write keyId failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
int error = KeySessionServiceProxy::Remote()->SendRequest(MEDIA_KEY_SESSION_GET_OFFLINEKEY_STATE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy::GetOfflineKeyState failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
state = (IKeySessionService::OfflineKeyState)reply.ReadInt32();
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::GetOfflineKeyState exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceProxy::SetKeySessionServiceCallback(sptr<IKeySessionServiceCallback> &callback)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceProxy::SetKeySessionServiceCallback enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (callback == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy SetCallback callback is null");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy SetCallback Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteRemoteObject(callback->AsObject())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy SetCallback write CameraServiceCallback obj failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SESSION_SET_CALLBACK, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy SetCallback failed, error: %{public}d", error);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_decrypt_module_service_proxy.h"
|
||||
#include <memory>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include "ashmem.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
MediaDecryptModuleServiceProxy::MediaDecryptModuleServiceProxy(const sptr<IRemoteObject> &impl)
|
||||
: IRemoteProxy<IMediaDecryptModuleService>(impl)
|
||||
{
|
||||
DRM_DEBUG_LOG("MediaKeySystemServiceProxy Initialized.");
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleServiceProxy::Release()
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceProxy::Release() enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy Release Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(DECRYPT_MODULE_RELEASE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy::Release failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceProxy::Release() exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleServiceProxy::DecryptData(bool secureDecodrtState, IMediaDecryptModuleService::CryptInfo &cryptInfo, uint64_t srcBuffer, uint64_t dstBuffer)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceProxy::DecryptData enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteBool(secureDecodrtState)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write secureDecodrtState failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(cryptInfo.type)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.type failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(cryptInfo.keyId.size())) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.keyId size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
for (auto keyId : cryptInfo.keyId) {
|
||||
if (!data.WriteUint8(keyId)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.keyId failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(cryptInfo.iv.size())) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.iv size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
for (auto iv : cryptInfo.iv) {
|
||||
if (!data.WriteUint8(iv)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.iv failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(cryptInfo.pattern.encryptBlocks)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.pattern.encryptBlocks failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(cryptInfo.pattern.skipBlocks)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.pattern.skipBlocks failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(cryptInfo.subSample.size())) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.subSample.size() failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
for (size_t i = 0; i < cryptInfo.subSample.size(); i++) {
|
||||
if (!data.WriteInt32(cryptInfo.subSample[i].clearHeaderLen)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.subSample.clearHeaderLen failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(cryptInfo.subSample[i].payLoadLen)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData Write cryptInfo.subSample.payLoadLen failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
(void)data.WriteFileDescriptor(srcBuffer);
|
||||
(void)data.WriteFileDescriptor(dstBuffer);
|
||||
|
||||
int error = Remote()->SendRequest(DECRYPT_MODULE_DECRYPT_DATA, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy DecryptData failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceProxy::DecryptData exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleServiceProxy::RequireSecureDecoderModule(std::string &mimeType, bool *status)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceProxy::RequireSecureDecoderModule enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy RequireSecureDecoderModule Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(mimeType)) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy RequireSecureDecoderModule Write response failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(DECRYPT_MODULE_REQUIRE_SECURE_DECODER, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceProxy RequireSecureDecoderModule failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
*status = reply.ReadBool();
|
||||
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceProxy::RequireSecureDecoderModule exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,278 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "mediakeysystem_service_proxy.h"
|
||||
#include "remote_request_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
MediaKeySystemServiceProxy::MediaKeySystemServiceProxy(const sptr<IRemoteObject> &impl)
|
||||
: IRemoteProxy<IMediaKeySystemService>(impl)
|
||||
{
|
||||
DRM_DEBUG_LOG("MediaKeySystemServiceProxy Initialized.");
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::Release()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::Release enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy Release Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
int error = MediaKeySystemServiceProxy::Remote()->SendRequest(MEDIA_KEY_SYSTEM_RELEASE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy Release failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::Release exit.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::GenerateKeySystemRequest(IMediaKeySystemService::RequestType type, std::vector<uint8_t> &request, std::string &defaultUrl)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GenerateKeySystemRequest enter. type:%{public}d.", type);
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(MediaKeySystemServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GenerateKeySystemRequest two params Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32((int)type)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GenerateKeySystemRequest two params Write RequestType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
uint32_t error = MediaKeySystemServiceProxy::Remote()->SendRequest(MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_REQUEST, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy::GenerateKeySystemRequest failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
uint32_t requestSize = reply.ReadInt32();
|
||||
for (uint32_t i = 0; i < requestSize; i++) {
|
||||
request.push_back(reply.ReadUint8());
|
||||
}
|
||||
defaultUrl = reply.ReadString();
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GenerateKeySystemRequest exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::ProcessKeySystemResponse(IMediaKeySystemService::RequestType type, const std::vector<uint8_t> &response)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::ProcessKeySystemResponse enter. type:%{public}d.", type);
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy ProcessKeySystemResponse Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32((int)type)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy ProcessKeySystemResponse Write RequestType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(response.size())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy ProcessKeySystemResponse Write response size failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
for (auto res : response) {
|
||||
if (!data.WriteUint8(res)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy ProcessKeySystemResponse Write response failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_RESPONSE, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy ProcessKeySystemResponse failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::ProcessKeySystemResponse exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::SetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::SetConfiguration enter, configType:%{public}d, propertyName:%{public}s, value:%{public}s.", (int)type, propertyName.c_str(), value.c_str());
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy SetConfiguration Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32((int32_t)type)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy SetConfiguration Write RequestType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(propertyName)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy SetConfiguration Write response failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteString(value)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy SetConfiguration Write response failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_SETCONFIGURATION, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy SetConfiguration failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::SetConfiguration exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::GetSecurityLevel(IKeySessionService::SecurityLevel *securityLevel)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GetSecurityLevel enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(MediaKeySystemServiceProxy::GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GetSecurityLevel Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = MediaKeySystemServiceProxy::Remote()->SendRequest(MEDIA_KEY_SYSTEM_GETSECURITYLEVEL, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GetSecurityLevel failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
*securityLevel = (IKeySessionService::SecurityLevel)reply.ReadInt32();
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GetSecurityLevel exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::GetConfiguration(IMediaKeySystemService::ConfigType configType, std::string &propertyName, std::string &value)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GetConfiguration enter, configType:%{public}d, propertyName:%{public}s.", (int)configType, propertyName.c_str());
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GetConfiguration Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32((int)configType)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GetConfiguration Write RequestType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(propertyName)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GetConfiguration Write response failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_GETCONFIGURATION, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GetConfiguration failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
value = reply.ReadString();
|
||||
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GetConfiguration exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::CreateKeySession(IKeySessionService::SecurityLevel securityLevel, sptr<IKeySessionService> &keySessionProxy)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::CreateKeySession enter, securityLevel:%{public}d.", securityLevel);
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy CreateKeySession Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
if (!data.WriteInt32(securityLevel)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy CreateKeySession Write format failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_CREATE_KEY_SESSION, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy::CreateKeySession failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
auto remoteObject = reply.ReadRemoteObject();
|
||||
if (remoteObject != nullptr) {
|
||||
keySessionProxy = iface_cast<IKeySessionService>(remoteObject);
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy CreateKeySession keySessionProxy is nullptr");
|
||||
error = IPC_PROXY_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::CreateKeySession exit.");
|
||||
return error;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemServiceProxy::GetMetric(std::vector<IMediaKeySystemService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GetMetric enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy GetMetric two params Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_GETMETRIC, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceProxy::GetMetric failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
int infoMapSize = reply.ReadInt32();
|
||||
for (int i = 0; i < infoMapSize; i++) {
|
||||
IMediaKeySystemService::KeyValue keyValue;
|
||||
keyValue.name = reply.ReadString();
|
||||
keyValue.value = reply.ReadString();
|
||||
infoMap.push_back(keyValue);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemServiceProxy::GetMetric exit.");
|
||||
return reply.ReadInt32();
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "mediakeysystemfactory_service_proxy.h"
|
||||
#include "remote_request_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include <codecvt>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
MediaKeySystemFactoryServiceProxy::MediaKeySystemFactoryServiceProxy(const sptr<IRemoteObject> &impl)
|
||||
: IRemoteProxy<IMediaKeySystemFactoryService>(impl)
|
||||
{
|
||||
DRM_DEBUG_LOG("MediaKeySystemFactoryServiceProxy Initialized.");
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported(std::string &uuid, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported one param called, enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported");
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported one param Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported");
|
||||
|
||||
if (!data.WriteInt32(1)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported one param Write paramNum failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported");
|
||||
|
||||
if (!data.WriteString(uuid)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported Write uuid failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported");
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_FACTORY_IS_MEDIA_KEY_SYSTEM_SURPPORTED, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported");
|
||||
|
||||
*isSurpported = reply.ReadBool();
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported one param called, exit.");
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported two param called, enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported two params Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(2)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported two params Write paramNum failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(uuid)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported two params Write uuid failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(mimeType)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported two params Write mimeType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_FACTORY_IS_MEDIA_KEY_SYSTEM_SURPPORTED, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
*isSurpported = reply.ReadBool();
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported two param called, exit.");
|
||||
return error;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, int32_t securityLevel, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported three param called, enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported three params Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(3)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported three params Write paramNum failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(uuid)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported three params Write uuid failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(mimeType)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported three params Write mimeType failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteInt32(securityLevel)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy IsMediaKeySystemSupported three params Write securityLevel failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_FACTORY_IS_MEDIA_KEY_SYSTEM_SURPPORTED, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
*isSurpported = reply.ReadBool();
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::IsMediaKeySystemSupported three param called, exit.");
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryServiceProxy::CreateMediaKeySystem(std::string &uuid)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::CreateMediaKeySystem enter.");
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> converter;
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy CreateMediaKeySystem Write interface token failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
if (!data.WriteString(uuid)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy CreateMediaKeySystem Write format failed");
|
||||
return IPC_PROXY_ERR;
|
||||
}
|
||||
|
||||
int error = Remote()->SendRequest(MEDIA_KEY_SYSTEM_FACTORY_CREATE_MEDIA_KEYSYSTEM, data, reply, option);
|
||||
if (error != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy::CreateMediaKeySystem failed, error: %{public}d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
auto remoteObject = reply.ReadRemoteObject();
|
||||
if (remoteObject != nullptr) {
|
||||
} else {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceProxy::CreateMediaKeySystem mediaKeySystemProxy is nullptr");
|
||||
error = IPC_PROXY_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceProxy::CreateMediaKeySystem exit.");
|
||||
return error;
|
||||
}
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef OHOS_DRM_DRM_DEATH_RECIPIENT_H
|
||||
#define OHOS_DRM_DRM_DEATH_RECIPIENT_H
|
||||
|
||||
#include "iremote_object.h"
|
||||
#include "nocopyable.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
class DrmDeathRecipient : public IRemoteObject::DeathRecipient, public NoCopyable {
|
||||
public:
|
||||
explicit DrmDeathRecipient(pid_t pid) : pid_(pid) {}
|
||||
virtual ~DrmDeathRecipient() = default;
|
||||
|
||||
void OnRemoteDied(const wptr<IRemoteObject> &remote) override
|
||||
{
|
||||
(void) remote;
|
||||
if (diedCb_ != nullptr) {
|
||||
diedCb_(pid_);
|
||||
}
|
||||
}
|
||||
|
||||
using NotifyCbFunc = std::function<void(pid_t)>;
|
||||
|
||||
void SetNotifyCb(NotifyCbFunc func)
|
||||
{
|
||||
diedCb_ = func;
|
||||
}
|
||||
|
||||
private:
|
||||
pid_t pid_ = 0;
|
||||
NotifyCbFunc diedCb_ = nullptr;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_IKEY_SESSION_H_
|
||||
#define OHOS_DRM_IKEY_SESSION_H_
|
||||
|
||||
#include "i_mediadecryptmodule_service.h"
|
||||
#include "i_keysession_service_callback.h"
|
||||
#include "iremote_broker.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
class IKeySessionService : public IRemoteBroker {
|
||||
public:
|
||||
enum ListenerType {
|
||||
LISTENER_DRM_EVENT = 200,
|
||||
LISTENER_PROVISION_REQUIRED = 201,
|
||||
LISTENER_KEY_NEEDED = 202,
|
||||
LISTENER_KEY_EXPIRED = 203,
|
||||
LISTENER_VENDOR_DEFINED = 204,
|
||||
LISTENER_KEYSESSION_RECLAIMED = 205,
|
||||
LISTENER_EXPIRATION_UPDATE = 206,
|
||||
LISTENER_KEY_CHANGE = 207,
|
||||
LISTENER_KEYSESSION_LOSE = 208,
|
||||
};
|
||||
|
||||
struct KeyValue {
|
||||
std::string name;
|
||||
std::string value;
|
||||
};
|
||||
|
||||
enum KeyType {
|
||||
KEYTYPE_OFFLINE = 0,
|
||||
KEYTYPE_ONLINE,
|
||||
};
|
||||
|
||||
enum OfflineKeyState {
|
||||
OFFLINEKEYSTATE_UNKNOWN = 0,
|
||||
OFFLINEKEYSTATE_USABLE = 1,
|
||||
OFFLINEKEYSTATE_INACTIVE = 2,
|
||||
};
|
||||
|
||||
enum RequestType {
|
||||
REQUEST_TYPE_UNKNOWN = 0,
|
||||
REQUEST_TYPE_INITIAL = 1,
|
||||
REQUEST_TYPE_RENEWAL = 2,
|
||||
REQUEST_TYPE_RELEASE = 3,
|
||||
REQUEST_TYPE_NONE = 4,
|
||||
REQUEST_TYPE_UPDATE = 5,
|
||||
REQUEST_TYPE_DOWNLOADCERT = 6,
|
||||
};
|
||||
|
||||
enum SecurityLevel {
|
||||
SECURITY_LEVEL_UNKNOWN = 0,
|
||||
SECURITY_LEVEL_SW_CRYPTO = 1,
|
||||
SECURITY_LEVEL_SW_DECODE = 2,
|
||||
SECURITY_LEVEL_HW_CRYPTO = 3,
|
||||
SECURITY_LEVEL_HW_DECODE = 4,
|
||||
SECURITY_LEVEL_HW_ALL = 5,
|
||||
SECURITY_LEVEL_MAX = 6,
|
||||
};
|
||||
|
||||
struct DrmInfo {
|
||||
KeyType keyType;
|
||||
std::string mimeType;
|
||||
std::vector<uint8_t> indexInfo;
|
||||
};
|
||||
|
||||
struct LicenseInfo {
|
||||
RequestType requestType;
|
||||
std::vector<uint8_t> mData;
|
||||
std::string mDefaultURL;
|
||||
};
|
||||
|
||||
virtual ~IKeySessionService() = default;
|
||||
virtual int32_t Release() = 0;
|
||||
virtual int32_t CreateMediaDecryptModule(sptr<IMediaDecryptModuleService> &decryptModule) = 0;
|
||||
virtual int32_t GenerateLicenseRequest(DrmInfo &drmInfo, LicenseInfo &licenseInfo) = 0;
|
||||
virtual int32_t ProcessLicenseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &licenseResponse) = 0;
|
||||
virtual int32_t GenerateOfflineReleaseRequest(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseRequest) = 0;
|
||||
virtual int32_t ProcessOfflineReleaseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseReponse) = 0;
|
||||
virtual int32_t CheckLicenseStatus(std::vector<KeyValue> &infoMap) = 0;
|
||||
virtual int32_t RestoreOfflineKeys(std::vector<uint8_t> &keyId) = 0;
|
||||
virtual int32_t RemoveOfflineKeys(std::vector<uint8_t> &keyId) = 0;
|
||||
virtual int32_t GetOfflineKeyIds(std::vector<std::vector<uint8_t>> &keyIds) = 0;
|
||||
virtual int32_t RemoveLicenses() = 0;
|
||||
virtual int32_t GetOfflineKeyState(std::vector<uint8_t> &keyId, IKeySessionService::OfflineKeyState &state) = 0;
|
||||
virtual int32_t SetKeySessionServiceCallback(sptr<IKeySessionServiceCallback> &callback) = 0;
|
||||
DECLARE_INTERFACE_DESCRIPTOR(u"IKeySessionService");
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
|
||||
#endif // OHOS_DRM_IKEY_SESSION_H_
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_IKEY_SESSION_SERVICE_CALLBACK_H_
|
||||
#define OHOS_DRM_IKEY_SESSION_SERVICE_CALLBACK_H_
|
||||
|
||||
#include "iremote_broker.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
enum KeyStatus {
|
||||
KEY_STATUS_NORMAL = 0,
|
||||
KEY_STATUS_EXPIRED,
|
||||
};
|
||||
|
||||
enum SessionStatus {
|
||||
SESSION_STATUS_NORMAL = 0,
|
||||
SESSION_STATUS_RECLAIMED,
|
||||
};
|
||||
|
||||
class IKeySessionServiceCallback : public IRemoteBroker {
|
||||
public:
|
||||
virtual int32_t OnKeySessionKeyExpired(const KeyStatus status) = 0;
|
||||
virtual int32_t OnKeySessionReclaimed(const SessionStatus status) = 0;
|
||||
|
||||
DECLARE_INTERFACE_DESCRIPTOR(u"IKeySessionServiceCallback");
|
||||
};
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_I_MEDIA_DECRYPT_MODULE_SERVICE_H
|
||||
#define OHOS_DRM_I_MEDIA_DECRYPT_MODULE_SERVICE_H
|
||||
|
||||
#include "i_mediadecryptmodule_service.h"
|
||||
#include "ipc_types.h"
|
||||
#include "iremote_broker.h"
|
||||
#include "iremote_proxy.h"
|
||||
#include "iremote_stub.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class IMediaDecryptModuleService : public IRemoteBroker {
|
||||
public:
|
||||
struct SubSample {
|
||||
int32_t clearHeaderLen;
|
||||
int32_t payLoadLen;
|
||||
};
|
||||
|
||||
struct Pattern {
|
||||
int32_t encryptBlocks;
|
||||
int32_t skipBlocks;
|
||||
};
|
||||
|
||||
enum CryptAlgorithmType {
|
||||
ALGTYPE_UNENCRYPTED,
|
||||
ALGTYPE_AES_CTR,
|
||||
ALGTYPE_AES_WV,
|
||||
ALGTYPE_AES_CBC,
|
||||
ALGTYPE_SM4_CBC,
|
||||
};
|
||||
|
||||
struct CryptInfo {
|
||||
CryptAlgorithmType type;
|
||||
std::vector<uint8_t> keyId;
|
||||
std::vector<uint8_t> iv;
|
||||
Pattern pattern;
|
||||
std::vector<SubSample> subSample;
|
||||
};
|
||||
|
||||
virtual ~IMediaDecryptModuleService() = default;
|
||||
virtual int32_t Release() = 0;
|
||||
virtual int32_t DecryptData(bool secureDecodrtState, IMediaDecryptModuleService::CryptInfo &cryptInfo, uint64_t srcBuffer, uint64_t dstBuffer) = 0;
|
||||
virtual int32_t RequireSecureDecoderModule(std::string &mimeType, bool *status) = 0;
|
||||
DECLARE_INTERFACE_DESCRIPTOR(u"IMediaDecryptModuleService");
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
#endif // OHOS_DRM_I_MEDIA_DECRYPT_MODULE_SERVICE_H
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_I_MEDIA_KEY_SYSTEM_SERVICE_H
|
||||
#define OHOS_DRM_I_MEDIA_KEY_SYSTEM_SERVICE_H
|
||||
|
||||
#include "i_keysession_service.h"
|
||||
#include "ipc_types.h"
|
||||
#include "iremote_broker.h"
|
||||
#include "iremote_proxy.h"
|
||||
#include "iremote_stub.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class IMediaKeySystemService : public IRemoteBroker {
|
||||
public:
|
||||
enum RequestType {
|
||||
REQUEST_TYPE_UNKNOWN = 0,
|
||||
REQUEST_TYPE_INITIAL = 1,
|
||||
REQUEST_TYPE_RENEWAL = 2,
|
||||
REQUEST_TYPE_RELEASE = 3,
|
||||
REQUEST_TYPE_NONE = 4,
|
||||
REQUEST_TYPE_UPDATE = 5,
|
||||
REQUEST_TYPE_DOWNLOADCERT = 6,
|
||||
};
|
||||
|
||||
enum HdcpLevel {
|
||||
HDCP_UNKNOWN,
|
||||
HDCP_NONE,
|
||||
HDCP_V1,
|
||||
HDCP_V2,
|
||||
HDCP_V2_1,
|
||||
HDCP_V2_2,
|
||||
HDCP_V2_3,
|
||||
HDCP_NO_OUTPUT = 0x7fff,
|
||||
};
|
||||
|
||||
enum ConfigType {
|
||||
CONFIGTYPE_DEVICEPROPERTY = 0,
|
||||
CONFIGTYPE_KEYSESSION = 1,
|
||||
CONFIGTYPE_OUTPUTPROTECTTYPE = 2,
|
||||
};
|
||||
|
||||
struct KeyValue {
|
||||
std::string name;
|
||||
std::string value;
|
||||
};
|
||||
|
||||
virtual ~IMediaKeySystemService() = default;
|
||||
virtual int32_t Release() = 0;
|
||||
virtual int32_t GenerateKeySystemRequest(RequestType type, std::vector<uint8_t> &request, std::string &defaultUrl) = 0;
|
||||
virtual int32_t ProcessKeySystemResponse(RequestType type, const std::vector<uint8_t> &response) = 0;
|
||||
virtual int32_t SetConfiguration(ConfigType type, std::string &propertyName, std::string &value) = 0;
|
||||
virtual int32_t GetConfiguration(ConfigType type, std::string &propertyName, std::string &value) = 0;
|
||||
virtual int32_t CreateKeySession(IKeySessionService::SecurityLevel securityLevel, sptr<IKeySessionService> &keySessionProxy) = 0;
|
||||
virtual int32_t GetMetric(std::vector<IMediaKeySystemService::KeyValue> &infoMap) = 0;
|
||||
virtual int32_t GetSecurityLevel(IKeySessionService::SecurityLevel *securityLevel) = 0;
|
||||
|
||||
DECLARE_INTERFACE_DESCRIPTOR(u"IMediaKeySystemSystemService");
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
#endif // OHOS_DRM_I_MEDIA_KEY_SYSTEM_SERVICE_H
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_I_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_H
|
||||
#define OHOS_DRM_I_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_H
|
||||
|
||||
#include "i_mediakeysystem_service.h"
|
||||
#include "ipc_types.h"
|
||||
#include "iremote_broker.h"
|
||||
#include "iremote_proxy.h"
|
||||
#include "iremote_stub.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class IMediaKeySystemFactoryService : public IRemoteBroker {
|
||||
public:
|
||||
virtual ~IMediaKeySystemFactoryService() = default;
|
||||
virtual int32_t IsMediaKeySystemSupported(std::string &uuid, bool *isSurpported) = 0;
|
||||
virtual int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, bool *isSurpported) = 0;
|
||||
virtual int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, int32_t securityLevel, bool *isSurpported) = 0;
|
||||
virtual int32_t CreateMediaKeySystem(std::string &uuid) = 0;
|
||||
DECLARE_INTERFACE_DESCRIPTOR(u"IMediaKeySystemSystemFactoryService");
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
#endif // OHOS_DRM_I_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_H
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_REMOTE_REQUEST_CODE_H
|
||||
#define OHOS_DRM_REMOTE_REQUEST_CODE_H
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
enum MediaKeySystemFactoryServiceRequestCode {
|
||||
MEDIA_KEY_SYSTEM_FACTORY_IS_MEDIA_KEY_SYSTEM_SURPPORTED = 0,
|
||||
MEDIA_KEY_SYSTEM_FACTORY_CREATE_MEDIA_KEYSYSTEM = 1,
|
||||
};
|
||||
|
||||
enum MediaKeySystemServiceRequestCode {
|
||||
MEDIA_KEY_SYSTEM_CREATE_KEY_SESSION = 0,
|
||||
MEDIA_KEY_SYSTEM_DESTROY_KEY_SESSION = 1,
|
||||
MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_REQUEST = 2,
|
||||
MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_RESPONSE = 3,
|
||||
MEDIA_KEY_SYSTEM_SETCONFIGURATION = 4,
|
||||
MEDIA_KEY_SYSTEM_GETCONFIGURATION = 5,
|
||||
MEDIA_KEY_SYSTEM_GETMETRIC = 6,
|
||||
MEDIA_KEY_SYSTEM_RELEASE = 7,
|
||||
MEDIA_KEY_SYSTEM_GETSECURITYLEVEL = 8,
|
||||
};
|
||||
|
||||
enum KeySessionServiceRequestCode {
|
||||
CREATE_MEDIA_DECRYPT_MODULE = 0,
|
||||
RELEASE_MEDIA_DECRYPT_MODULE = 1,
|
||||
KEY_SESSION_RELEASE = 2,
|
||||
MEDIA_KEY_SESSION_GENERATE_LICENSE_REQUEST = 3,
|
||||
MEDIA_KEY_SESSION_PROCESS_LICENSE_RESPONSE = 4,
|
||||
MEDIA_KEY_SESSION_GENERATE_OFFLINE_RELEASE_REQUEST = 5,
|
||||
MEDIA_KEY_SESSION_PROCESS_OFFLINE_RELEASE_RESPONSE = 6,
|
||||
MEDIA_KEY_SESSION_GENERATE_CHECK_LICENSE_STATUS = 7,
|
||||
MEDIA_KEY_SESSION_RESTORE_OFFLINEKEYS = 8,
|
||||
MEDIA_KEY_SESSION_REMOVE_OFFLINEKEYS = 9,
|
||||
MEDIA_KEY_SESSION_GET_OFFLINEKEYIDS = 10,
|
||||
MEDIA_KEY_SESSION_REMOVE_LICENSE = 11,
|
||||
MEDIA_KEY_SESSION_GET_OFFLINEKEY_STATE = 12,
|
||||
MEDIA_KEY_SESSION_SET_CALLBACK = 13,
|
||||
};
|
||||
|
||||
enum MediaDecryptModuleServiceRequestCode {
|
||||
DECRYPT_MODULE_DECRYPT_DATA = 0,
|
||||
DECRYPT_MODULE_REQUIRE_SECURE_DECODER = 1,
|
||||
DECRYPT_MODULE_RELEASE = 2,
|
||||
};
|
||||
|
||||
enum KeySessionServiceCallbackRequestCode {
|
||||
KEY_SESSION_SERVICE_CALLBACK_ON_KEY_EXPIRED = 0,
|
||||
KEY_SESSION_SERVICE_CALLBACK_ON_KEY_SESSION_RECLAIMED,
|
||||
};
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
|
||||
#endif // OHOS_DRM_REMOTE_REQUEST_CODE_H
|
||||
@@ -0,0 +1,49 @@
|
||||
#ifndef OHOS_DRM_DRM_HOST_MANAGER_H
|
||||
#define OHOS_DRM_DRM_HOST_MANAGER_H
|
||||
#include <refbase.h>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
// #include "drm_interface_proxy.h"
|
||||
// #include "drm_impl.h"
|
||||
// #include "drm_types.h"
|
||||
#include "i_mediakeysystem_service.h"
|
||||
#include "iservstat_listener_hdi.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
|
||||
class DrmHostManager : public virtual RefBase, public HDI::ServiceManager::V1_0::ServStatListenerStub {
|
||||
public:
|
||||
class StatusCallback{
|
||||
public:
|
||||
virtual ~StatusCallback() = default;
|
||||
};
|
||||
class DrmHostDeathRecipient : public IRemoteObject::DeathRecipient {
|
||||
public:
|
||||
explicit DrmHostDeathRecipient() {};
|
||||
virtual ~DrmHostDeathRecipient() = default;
|
||||
void OnRemoteDied(const wptr<IRemoteObject> &remote) override;
|
||||
};
|
||||
|
||||
explicit DrmHostManager(StatusCallback* statusCallback);
|
||||
~DrmHostManager() override;
|
||||
|
||||
int32_t Init(void);
|
||||
void DeInit(void);
|
||||
void OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus& status) override;
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, bool *isSurpported);
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, bool *isSurpported);
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, int32_t securityLevel, bool *isSurpported);
|
||||
int32_t CreateMediaKeySystem(std::string &uuid);
|
||||
private:
|
||||
int32_t GetSevices(std::string &uuid, bool *isSurpported);
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
|
||||
#endif //OHOS_DRM_DRM_HOST_MANAGER_H
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KEY_SESSION_SERVICE_H
|
||||
#define OHOS_DRM_KEY_SESSION_SERVICE_H
|
||||
|
||||
#include "key_session_service_stub.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "drm_host_manager.h"
|
||||
#include <refbase.h>
|
||||
#include <iostream>
|
||||
|
||||
#include "media_decrypt_module_service.h"
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class IKeySessionServiceOperatorsCallback;
|
||||
class KeySessionService : public KeySessionServiceStub {
|
||||
public:
|
||||
explicit KeySessionService();
|
||||
~KeySessionService();
|
||||
int32_t Release();
|
||||
int32_t CreateMediaDecryptModule(sptr<IMediaDecryptModuleService> &decryptModule);
|
||||
int32_t SetKeySessionServiceOperatorsCallback(wptr<IKeySessionServiceOperatorsCallback> callback);
|
||||
int32_t CloseKeySessionServiceByCallback();
|
||||
int32_t GenerateLicenseRequest(IKeySessionService::DrmInfo &drmInfo, IKeySessionService::LicenseInfo &licenseInfo);
|
||||
int32_t ProcessLicenseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &licenseResponse);
|
||||
int32_t GenerateOfflineReleaseRequest(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseRequest);
|
||||
int32_t ProcessOfflineReleaseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseResponse);
|
||||
int32_t CheckLicenseStatus(std::vector<KeyValue> &infoMap);
|
||||
int32_t RestoreOfflineKeys(std::vector<uint8_t> &keyId);
|
||||
int32_t RemoveOfflineKeys(std::vector<uint8_t> &keyId);
|
||||
int32_t GetOfflineKeyIds(std::vector<std::vector<uint8_t>> &keyIds);
|
||||
int32_t RemoveLicenses();
|
||||
int32_t GetOfflineKeyState(std::vector<uint8_t> &keyId, OfflineKeyState &state);
|
||||
int32_t SetKeySessionServiceCallback(sptr<IKeySessionServiceCallback> &callback);
|
||||
void OnKeySessionKeyExpiredStatus(const KeyStatus status);
|
||||
void OnKeySessionReclaimed(const SessionStatus status);
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
class IKeySessionServiceOperatorsCallback : public virtual RefBase {
|
||||
public:
|
||||
IKeySessionServiceOperatorsCallback() = default;
|
||||
virtual ~IKeySessionServiceOperatorsCallback() = default;
|
||||
virtual int32_t CloseKeySessionService(sptr<KeySessionService> sessionService) = 0;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif // OHOS_DRM_KEY_SESSION_SERVICE_H
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KEY_SESSION_SERVICE_CALLBACK_STUB_H
|
||||
#define OHOS_DRM_KEY_SESSION_SERVICE_CALLBACK_STUB_H
|
||||
|
||||
#include "i_keysession_service_callback.h"
|
||||
#include "iremote_stub.h"
|
||||
#include "remote_request_code.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
class KeySessionServiceCallbackStub : public IRemoteStub<IKeySessionServiceCallback> {
|
||||
public:
|
||||
KeySessionServiceCallbackStub() = default;
|
||||
~KeySessionServiceCallbackStub() = default;
|
||||
virtual int OnRemoteRequest(uint32_t code, MessageParcel &data,
|
||||
MessageParcel &reply, MessageOption &option) override;
|
||||
|
||||
private:
|
||||
int32_t HandleOnKeySessionKeyExpired(MessageParcel& data);
|
||||
int32_t HandleOnKeySessionReclaimed(MessageParcel& data);
|
||||
};
|
||||
|
||||
}//namespace DrmStandard
|
||||
}//namespace OHOS
|
||||
#endif // OHOS_DRM_KEY_SESSION_SERVICE_CALLBACK_STUB_H
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_KEY_SESSION_STUB_H
|
||||
#define OHOS_DRM_KEY_SESSION_STUB_H
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include "i_keysession_service.h"
|
||||
#include "iremote_stub.h"
|
||||
#include "remote_request_code.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
class KeySessionServiceStub : public IRemoteStub<IKeySessionService> {
|
||||
public:
|
||||
KeySessionServiceStub() = default;
|
||||
~KeySessionServiceStub() = default;
|
||||
virtual int32_t OnRemoteRequest(uint32_t code, MessageParcel &data,
|
||||
MessageParcel &reply, MessageOption &option) override;
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
}//namespace DrmStandard
|
||||
}//namespace OHOS
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_STUB_H
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MediaDecryptModuleService_H_
|
||||
#define OHOS_DRM_MediaDecryptModuleService_H_
|
||||
|
||||
#include "media_decrypt_module_service_stub.h"
|
||||
#include "drm_host_manager.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include <iostream>
|
||||
#include <refbase.h>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
class MediaDecryptModuleService : public MediaDecryptModuleServiceStub
|
||||
{
|
||||
public:
|
||||
MediaDecryptModuleService();
|
||||
~MediaDecryptModuleService();
|
||||
int32_t Release() override;
|
||||
int32_t DecryptData(bool secureDecodrtState, IMediaDecryptModuleService::CryptInfo &cryptInfo, uint64_t srcBuffer,
|
||||
uint64_t dstBuffer) override;
|
||||
int32_t RequireSecureDecoderModule(std::string &mimeType, bool *status) override;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif //OHOS_DRM_MediaDecryptModuleService_H_
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_DECRYPT_MODULE_SERVICE_STUB_H_
|
||||
#define OHOS_DRM_MEDIA_DECRYPT_MODULE_SERVICE_STUB_H_
|
||||
|
||||
#include "i_mediadecryptmodule_service.h"
|
||||
#include "remote_request_code.h"
|
||||
#include "iremote_stub.h"
|
||||
|
||||
#include <mutex>
|
||||
#include <map>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
class MediaDecryptModuleServiceStub : public IRemoteStub<IMediaDecryptModuleService> {
|
||||
public:
|
||||
MediaDecryptModuleServiceStub();
|
||||
~MediaDecryptModuleServiceStub();
|
||||
virtual int OnRemoteRequest(uint32_t code, MessageParcel &data,
|
||||
MessageParcel &reply, MessageOption &option) override;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
}//namespace DrmStandard
|
||||
}//namespace OHOS
|
||||
|
||||
#endif //OHOS_DRM_MEDIA_DECRYPT_MODULE_SERVICE_STUB_H_
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_H
|
||||
|
||||
#include "mediakeysystem_service_stub.h"
|
||||
#include "key_session_service.h"
|
||||
#include "drm_host_manager.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "iremote_stub.h"
|
||||
#include "system_ability.h"
|
||||
|
||||
#include "safe_map.h"
|
||||
#include <iostream>
|
||||
#include <refbase.h>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <unordered_set>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class IMediaKeySystemServiceOperatorsCallback;
|
||||
class MediaKeySystemService : public MediaKeySystemServiceStub, public DrmHostManager::StatusCallback,
|
||||
public IKeySessionServiceOperatorsCallback {
|
||||
public:
|
||||
explicit MediaKeySystemService();
|
||||
~MediaKeySystemService() override;
|
||||
int32_t Release() override;
|
||||
int32_t SetMediaKeySystemServiceOperatorsCallback(wptr<IMediaKeySystemServiceOperatorsCallback> callback);
|
||||
int32_t CloseMediaKeySystemServiceByCallback();
|
||||
|
||||
int32_t GenerateKeySystemRequest(IMediaKeySystemService::RequestType type, std::vector<uint8_t> &request, std::string &defaultUrl) override;
|
||||
int32_t ProcessKeySystemResponse(IMediaKeySystemService::RequestType type, const std::vector<uint8_t> &response) override;
|
||||
int32_t SetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value) override;
|
||||
int32_t GetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value) override;
|
||||
int32_t CreateKeySession(IKeySessionService::SecurityLevel securityLevel, sptr<IKeySessionService> &keySessionProxy) override;
|
||||
//IMediaKeySystemServiceOperatorsCallback
|
||||
int32_t CloseKeySessionService(sptr<KeySessionService> sessionService) override;
|
||||
int32_t GetMetric(std::vector<IMediaKeySystemService::KeyValue> &infoMap) override;
|
||||
int32_t GetSecurityLevel(IKeySessionService::SecurityLevel *securityLevel) override;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
class IMediaKeySystemServiceOperatorsCallback : public virtual RefBase {
|
||||
public:
|
||||
IMediaKeySystemServiceOperatorsCallback() = default;
|
||||
virtual ~IMediaKeySystemServiceOperatorsCallback() = default;
|
||||
virtual int32_t CloseMediaKeySystemService(sptr<MediaKeySystemService> mediaKeySystemService) = 0;
|
||||
};
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_H
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_STUB_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_STUB_H
|
||||
|
||||
#include <mutex>
|
||||
#include <map>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include "i_mediakeysystem_service.h"
|
||||
#include "iremote_stub.h"
|
||||
#include "drm_death_recipient.h"
|
||||
#include "remote_request_code.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
class MediaKeySystemServiceStub : public IRemoteStub<IMediaKeySystemService> {
|
||||
public:
|
||||
MediaKeySystemServiceStub();
|
||||
~MediaKeySystemServiceStub();
|
||||
virtual int OnRemoteRequest(uint32_t code, MessageParcel &data,
|
||||
MessageParcel &reply, MessageOption &option) override;
|
||||
|
||||
private:
|
||||
std::map<pid_t, sptr<DrmDeathRecipient>> deathRecipientMap_;
|
||||
};
|
||||
|
||||
}//namespace DrmStandard
|
||||
}//namespace OHOS
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_SERVICE_STUB_H
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_H
|
||||
|
||||
#include "mediakeysystemfactory_service_stub.h"
|
||||
#include "mediakeysystem_service.h"
|
||||
#include "drm_host_manager.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "iremote_stub.h"
|
||||
#include "system_ability.h"
|
||||
|
||||
#include "safe_map.h"
|
||||
#include <iostream>
|
||||
#include <refbase.h>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <unordered_set>
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
class MediaKeySystemFactoryService : public SystemAbility, public MediaKeySystemFactoryServiceStub, public DrmHostManager::StatusCallback,
|
||||
public IMediaKeySystemServiceOperatorsCallback {
|
||||
DECLARE_SYSTEM_ABILITY(MediaKeySystemFactoryService);
|
||||
public:
|
||||
DISALLOW_COPY_AND_MOVE(MediaKeySystemFactoryService);
|
||||
explicit MediaKeySystemFactoryService(int32_t systemAbilityId, bool runOnCreate = true);
|
||||
~MediaKeySystemFactoryService() override;
|
||||
void OnDump() override;
|
||||
void OnStart() override;
|
||||
void OnStop() override;
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, bool *isSurpported) override;
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, bool *isSurpported) override;
|
||||
int32_t IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, int32_t securityLevel, bool *isSurpported) override;
|
||||
int32_t CreateMediaKeySystem(std::string &uuid) override;
|
||||
int32_t CloseMediaKeySystemService(sptr<MediaKeySystemService> mediaKeySystemService) override;
|
||||
private:
|
||||
};
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_H
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_STUB_H
|
||||
#define OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_STUB_H
|
||||
|
||||
#include <mutex>
|
||||
#include <map>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include "i_mediakeysystemfactory_service.h"
|
||||
#include "iremote_stub.h"
|
||||
#include "drm_death_recipient.h"
|
||||
#include "remote_request_code.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
class MediaKeySystemFactoryServiceStub : public IRemoteStub<IMediaKeySystemFactoryService> {
|
||||
public:
|
||||
MediaKeySystemFactoryServiceStub();
|
||||
~MediaKeySystemFactoryServiceStub();
|
||||
virtual int OnRemoteRequest(uint32_t code, MessageParcel &data,
|
||||
MessageParcel &reply, MessageOption &option) override;
|
||||
|
||||
private:
|
||||
std::map<pid_t, sptr<DrmDeathRecipient>> deathRecipientMap_;
|
||||
};
|
||||
|
||||
}//namespace DrmStandard
|
||||
}//namespace OHOS
|
||||
#endif // OHOS_DRM_MEDIA_KEY_SYSTEM_FACTORY_SERVICE_STUB_H
|
||||
@@ -0,0 +1,74 @@
|
||||
#include "drm_host_manager.h"
|
||||
#include "hdf_device_class.h"
|
||||
#include "iremote_broker.h"
|
||||
#include "iservmgr_hdi.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "servmgr_hdi.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
using OHOS::HDI::ServiceManager::V1_0::IServiceManager;
|
||||
void DrmHostManager::DrmHostDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
|
||||
{
|
||||
DRM_DEBUG_LOG("Remote died, do clean works.");
|
||||
}
|
||||
|
||||
DrmHostManager::DrmHostManager(StatusCallback* statusCallback) {
|
||||
}
|
||||
|
||||
DrmHostManager::~DrmHostManager() {
|
||||
}
|
||||
|
||||
int32_t DrmHostManager::Init(void)
|
||||
{
|
||||
DRM_INFO_LOG("DrmHostManager::Init enter.");
|
||||
DRM_INFO_LOG("DrmHostManager::Init exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
void DrmHostManager::DeInit(void)
|
||||
{
|
||||
DRM_ERR_LOG("DrmHostManager::DeInit");
|
||||
}
|
||||
|
||||
void DrmHostManager::OnReceive(const HDI::ServiceManager::V1_0::ServiceStatus& status) {}
|
||||
|
||||
int32_t DrmHostManager::GetSevices(std::string &uuid, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("DrmHostManager::GetSevices enter, uuid:%{public}s.", uuid.c_str());
|
||||
DRM_INFO_LOG("DrmHostManager::GetSevices exit, uuid:%{public}s.", uuid.c_str());
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t DrmHostManager::IsMediaKeySystemSupported(std::string &uuid, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("DrmHostManager::IsMediaKeySystemSupported one parameters enter, uuid:%{public}s.", uuid.c_str());
|
||||
DRM_INFO_LOG("DrmHostManager::IsMediaKeySystemSupported one parameters exit, isSurpported:%{public}d.", *isSurpported);
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t DrmHostManager::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("DrmHostManager::IsMediaKeySystemSupported two parameters enter, uuid:%{public}s, mimeType:%{public}s.", uuid.c_str(), mimeType.c_str());
|
||||
DRM_INFO_LOG("DrmHostManager::IsMediaKeySystemSupported two parameters exit, isSurpported:%{public}d.", *isSurpported);
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t DrmHostManager::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, int32_t securityLevel, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("DrmHostManager::IsMediaKeySystemSupported three parameters enter, uuid:%{public}s, mimeType:%{public}s, securityLevel:%{public}d.", uuid.c_str(), mimeType.c_str(), securityLevel);
|
||||
DRM_INFO_LOG("DrmHostManager::IsMediaKeySystemSupported three parameters exit, isSurpported:%{public}d.", *isSurpported);
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t DrmHostManager::CreateMediaKeySystem(std::string &uuid)
|
||||
{
|
||||
DRM_INFO_LOG("DrmHostManager::CreateMediaKeySystem enter.");
|
||||
DRM_INFO_LOG("DrmHostManager::CreateMediaKeySystem exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_service.h"
|
||||
#include "drm_log.h"
|
||||
#include "ipc_skeleton.h"
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
static std::mutex sessionMutex_;
|
||||
KeySessionService::KeySessionService()
|
||||
{
|
||||
DRM_DEBUG_LOG("KeySessionService::KeySessionService.");
|
||||
}
|
||||
|
||||
KeySessionService::~KeySessionService()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::~KeySessionService enter.");
|
||||
DRM_INFO_LOG("KeySessionService::~KeySessionService exit.");
|
||||
}
|
||||
|
||||
int32_t KeySessionService::CloseKeySessionServiceByCallback()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::CloseKeySessionServiceByCallback enter.");
|
||||
DRM_INFO_LOG("KeySessionService::CloseKeySessionServiceByCallback exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::Release()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::Release enter.");
|
||||
DRM_INFO_LOG("KeySessionService::Release exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::SetKeySessionServiceOperatorsCallback(wptr<IKeySessionServiceOperatorsCallback> callback)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::SetKeySessionServiceOperatorsCallback enter.");
|
||||
DRM_INFO_LOG("KeySessionService::SetKeySessionServiceOperatorsCallback exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::GenerateLicenseRequest(IKeySessionService::DrmInfo &drmInfo, IKeySessionService::LicenseInfo &licenseInfo)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::GenerateLicenseRequest enter.");
|
||||
DRM_INFO_LOG("KeySessionService::GenerateLicenseRequest exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::ProcessLicenseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &licenseResponse)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::ProcessLicenseResponse enter.");
|
||||
DRM_INFO_LOG("bKeySessionService::ProcessLicenseResponse exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::GenerateOfflineReleaseRequest(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseRequest)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::GenerateOfflineReleaseRequest enter.");
|
||||
DRM_INFO_LOG("KeySessionService::GenerateOfflineReleaseRequest exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::ProcessOfflineReleaseResponse(std::vector<uint8_t> &keyId, std::vector<uint8_t> &releaseResponse)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::ProcessOfflineReleaseResponse enter.");
|
||||
DRM_INFO_LOG("KeySessionService::ProcessOfflineReleaseResponse exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::CheckLicenseStatus(std::vector<IKeySessionService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::CheckLicenseStatus enter.");
|
||||
DRM_INFO_LOG("KeySessionService::CheckLicenseStatus exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::RestoreOfflineKeys(std::vector<uint8_t> &keyId)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::RestoreOfflineKeys enter.");
|
||||
DRM_INFO_LOG("KeySessionService::RestoreOfflineKeys exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::RemoveOfflineKeys(std::vector<uint8_t> &keyId)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::RemoveOfflineKeys enter.");
|
||||
DRM_INFO_LOG("KeySessionService::RemoveOfflineKeys exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::GetOfflineKeyIds(std::vector<std::vector<uint8_t>> &keyIds)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::GetOfflineKeyIds enter.");
|
||||
DRM_INFO_LOG("KeySessionService::GetOfflineKeyIds exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::RemoveLicenses()
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::RemoveLicenses enter.");
|
||||
DRM_INFO_LOG("KeySessionService::RemoveLicenses exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::CreateMediaDecryptModule(sptr<IMediaDecryptModuleService> &decryptModule)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::CreateMediaDecryptModule enter.");
|
||||
DRM_INFO_LOG("KeySessionService::CreateMediaDecryptModule exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::GetOfflineKeyState(std::vector<uint8_t> &keyId, IKeySessionService::OfflineKeyState &state)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::GetOfflineKeyState enter.");
|
||||
DRM_ERR_LOG("KeySessionService::GetOfflineKeyState exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t KeySessionService::SetKeySessionServiceCallback(sptr<IKeySessionServiceCallback>& callback)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::SetKeySessionServiceCallback enter.");
|
||||
DRM_INFO_LOG("KeySessionService::SetKeySessionServiceCallback exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
void KeySessionService::OnKeySessionKeyExpiredStatus(const KeyStatus status)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::OnKeySessionKeyExpiredStatus status %{public}d.", status);
|
||||
}
|
||||
|
||||
void KeySessionService::OnKeySessionReclaimed(const SessionStatus status)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionService::OnKeySessionReclaimed status %{public}d.", status);
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_service_callback_stub.h"
|
||||
#include "remote_request_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_error_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
int32_t KeySessionServiceCallbackStub::OnRemoteRequest(
|
||||
uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
|
||||
{
|
||||
int32_t errCode = -1;
|
||||
|
||||
if (data.ReadInterfaceToken() != GetDescriptor()) {
|
||||
return errCode;
|
||||
}
|
||||
switch (code) {
|
||||
case KEY_SESSION_SERVICE_CALLBACK_ON_KEY_EXPIRED:
|
||||
errCode = KeySessionServiceCallbackStub::HandleOnKeySessionKeyExpired(data);
|
||||
break;
|
||||
case KEY_SESSION_SERVICE_CALLBACK_ON_KEY_SESSION_RECLAIMED:
|
||||
errCode = KeySessionServiceCallbackStub::HandleOnKeySessionReclaimed(data);
|
||||
break;
|
||||
default:
|
||||
DRM_ERR_LOG("KeySessionServiceCallbackStub request code %{public}u not handled", code);
|
||||
errCode = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
|
||||
break;
|
||||
}
|
||||
|
||||
return errCode;
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceCallbackStub::HandleOnKeySessionKeyExpired(MessageParcel& data)
|
||||
{
|
||||
int32_t status = data.ReadInt32();
|
||||
DRM_INFO_LOG("KeySessionServiceCallbackStub::HandleOnKeySessionKeyExpired called status = %{public}d", status);
|
||||
switch (status)
|
||||
{
|
||||
case KEY_STATUS_NORMAL:
|
||||
return OnKeySessionKeyExpired(KEY_STATUS_NORMAL);
|
||||
case KEY_STATUS_EXPIRED:
|
||||
return OnKeySessionKeyExpired(KEY_STATUS_EXPIRED);
|
||||
default:
|
||||
DRM_ERR_LOG("HandleOnKeySessionKeyExpired can't cast status");
|
||||
return DRM_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t KeySessionServiceCallbackStub::HandleOnKeySessionReclaimed(MessageParcel& data)
|
||||
{
|
||||
int32_t status = data.ReadInt32();
|
||||
DRM_INFO_LOG("KeySessionServiceCallbackStub::HandleOnKeySessionReclaimed called status = %{public}d", status);
|
||||
switch (status)
|
||||
{
|
||||
case SESSION_STATUS_NORMAL:
|
||||
return OnKeySessionReclaimed(SESSION_STATUS_NORMAL);
|
||||
case SESSION_STATUS_RECLAIMED:
|
||||
return OnKeySessionReclaimed(SESSION_STATUS_RECLAIMED);
|
||||
default:
|
||||
DRM_ERR_LOG("HandleOnKeySessionReclaimed can't cast status");
|
||||
return DRM_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
@@ -0,0 +1,268 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "key_session_service_stub.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "xcollie/xcollie.h"
|
||||
#include "xcollie/xcollie_define.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
int KeySessionServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data,
|
||||
MessageParcel &reply, MessageOption &option)
|
||||
{
|
||||
DRM_INFO_LOG("KeySessionServiceStub::OnRemoteRequest enter.");
|
||||
int errCode = -1;
|
||||
DRM_DEBUG_LOG("OnRemoteRequest, cmd = %{public}u", code);
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " is keySessionServiceStub", FAKE_POINTER(this));
|
||||
if (data.ReadInterfaceToken() != GetDescriptor()) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub: ReadInterfaceToken failed");
|
||||
return errCode;
|
||||
}
|
||||
|
||||
switch(code) {
|
||||
case CREATE_MEDIA_DECRYPT_MODULE: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub GET_MEDIA_DECRYPT_MODULE enter.");
|
||||
sptr<IMediaDecryptModuleService> decryptModuleServiceProxy = nullptr;
|
||||
errCode = CreateMediaDecryptModule(decryptModuleServiceProxy);
|
||||
if (errCode != ERR_NONE) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub CreateMediaDecryptModule failed : %{public}d", errCode);
|
||||
return errCode;
|
||||
}
|
||||
if (!reply.WriteRemoteObject(decryptModuleServiceProxy->AsObject())) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write MediaDecryptModule obj failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceStub GET_MEDIA_DECRYPT_MODULE exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_GENERATE_LICENSE_REQUEST: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GENERATE_LICENSE_REQUEST enter.");
|
||||
IKeySessionService::DrmInfo drmInfo;
|
||||
IKeySessionService::LicenseInfo licenseInfo;
|
||||
drmInfo.keyType = (OHOS::DrmStandard::IKeySessionService::KeyType)data.ReadInt32();
|
||||
drmInfo.mimeType = data.ReadString();
|
||||
uint32_t indexInfoSize = data.ReadInt32();
|
||||
const uint8_t* indexInfoBuf = static_cast<const uint8_t*>(data.ReadBuffer(indexInfoSize));
|
||||
if (indexInfoBuf == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub ReadBuffer failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
drmInfo.indexInfo.assign(indexInfoBuf, indexInfoBuf + indexInfoSize);
|
||||
int32_t ret = GenerateLicenseRequest(drmInfo, licenseInfo);
|
||||
if (!reply.WriteInt32(licenseInfo.requestType)) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
if (!reply.WriteInt32(licenseInfo.mData.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
|
||||
for (auto data : licenseInfo.mData) {
|
||||
if (!reply.WriteUint8(data)) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
}
|
||||
if (!reply.WriteString(licenseInfo.mDefaultURL)) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GENERATE_LICENSE_REQUEST exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_PROCESS_LICENSE_RESPONSE: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SYSTEM_PROCESS_LICENSE_RESPONSE enter.");
|
||||
std::vector<uint8_t> response;
|
||||
std::vector<uint8_t> keyId;
|
||||
uint32_t responseSize = data.ReadInt32();
|
||||
for (int i = 0; i < responseSize; i++) {
|
||||
response.push_back(data.ReadUint8());
|
||||
}
|
||||
int32_t ret = ProcessLicenseResponse(keyId, response);
|
||||
if (!reply.WriteInt32(keyId.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
for (auto id : keyId) {
|
||||
if (!reply.WriteUint8(id)) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SYSTEM_PROCESS_LICENSE_RESPONSE exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_GENERATE_OFFLINE_RELEASE_REQUEST: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GENERATE_OFFLINE_RELEASE_REQUEST enter.");
|
||||
std::vector<uint8_t> keyId;
|
||||
uint32_t keyIdSize = data.ReadInt32();
|
||||
for (int i = 0; i < keyIdSize; i++) {
|
||||
keyId.push_back(data.ReadUint8());
|
||||
}
|
||||
std::vector<uint8_t> releaseRequest;
|
||||
int32_t ret = GenerateOfflineReleaseRequest(keyId, releaseRequest);
|
||||
if (!reply.WriteInt32(releaseRequest.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
|
||||
for (auto request : releaseRequest) {
|
||||
if (!reply.WriteUint8(request)) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GenerateLicenseRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GENERATE_OFFLINE_RELEASE_REQUEST exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_PROCESS_OFFLINE_RELEASE_RESPONSE: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_PROCESS_OFFLINE_RELEASE_RESPONSE enter.");
|
||||
std::vector<uint8_t> keyId;
|
||||
uint32_t keyIdSize = data.ReadInt32();
|
||||
for (int i = 0; i < keyIdSize; i++) {
|
||||
keyId.push_back(data.ReadUint8());
|
||||
}
|
||||
std::vector<uint8_t> response;
|
||||
uint32_t responseSize = data.ReadInt32();
|
||||
for (int i = 0; i < responseSize; i++) {
|
||||
response.push_back(data.ReadUint8());
|
||||
}
|
||||
int32_t ret = ProcessOfflineReleaseResponse(keyId, response);
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_PROCESS_OFFLINE_RELEASE_RESPONSE exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_GENERATE_CHECK_LICENSE_STATUS: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GENERATE_CHECK_LICENSE_STATUS enter.");
|
||||
std::vector<IKeySessionService::KeyValue> infoMap;
|
||||
int32_t ret = CheckLicenseStatus(infoMap);
|
||||
if (ret != 0) {
|
||||
DRM_ERR_LOG("CheckLicenseStatus faild.");
|
||||
return ret;
|
||||
}
|
||||
reply.WriteInt32(infoMap.size());
|
||||
for (auto info : infoMap) {
|
||||
reply.WriteString(info.name);
|
||||
reply.WriteString(info.value);
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GENERATE_CHECK_LICENSE_STATUS exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_RESTORE_OFFLINEKEYS: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_RESTORE_OFFLINEKEYS enter.");
|
||||
std::vector<uint8_t> keyId;
|
||||
uint32_t keyIdSize = data.ReadInt32();
|
||||
for (int i = 0; i < keyIdSize; i++) {
|
||||
keyId.push_back(data.ReadUint8());
|
||||
}
|
||||
int32_t ret = RestoreOfflineKeys(keyId);
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_RESTORE_OFFLINEKEYS exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_REMOVE_OFFLINEKEYS: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_REMOVE_OFFLINEKEYS enter.");
|
||||
std::vector<uint8_t> keyId;
|
||||
uint32_t keyIdSize = data.ReadInt32();
|
||||
for (int i = 0; i < keyIdSize; i++) {
|
||||
keyId.push_back(data.ReadUint8());
|
||||
}
|
||||
int32_t ret = RemoveOfflineKeys(keyId);
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_REMOVE_OFFLINEKEYS exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_GET_OFFLINEKEYIDS: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GET_OFFLINEKEYIDS enter.");
|
||||
std::vector<std::vector<uint8_t>> keyIds;
|
||||
int32_t ret = GetOfflineKeyIds(keyIds);
|
||||
reply.WriteInt32(keyIds.size());
|
||||
for (auto keyId : keyIds) {
|
||||
int32_t keyIdSize = keyId.size();
|
||||
reply.WriteInt32(keyIdSize);
|
||||
if (!reply.WriteBuffer(keyId.data(), keyId.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceProxy GenerateLicenseRequest Write keyIds failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GET_OFFLINEKEYIDS exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_REMOVE_LICENSE: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_REMOVE_LICENSE enter.");
|
||||
int32_t ret = RemoveLicenses();
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_REMOVE_LICENSE exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_GET_OFFLINEKEY_STATE: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GET_OFFLINEKEY_STATE enter.");
|
||||
std::vector<uint8_t> keyId;
|
||||
uint32_t keyIdSize = data.ReadInt32();
|
||||
for (int i = 0; i < keyIdSize; i++) {
|
||||
keyId.push_back(data.ReadUint8());
|
||||
}
|
||||
IKeySessionService::OfflineKeyState state;
|
||||
int32_t ret = GetOfflineKeyState(keyId, state);
|
||||
if (ret != DRM_OK) {
|
||||
DRM_ERR_LOG("MEDIA_KEY_SESSION_GET_OFFLINEKEY_STATE failed");
|
||||
return ret;
|
||||
}
|
||||
if (!reply.WriteInt32((int32_t)state)) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write state failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_GET_OFFLINEKEY_STATE exit.");
|
||||
return ret;
|
||||
}
|
||||
case RELEASE_MEDIA_DECRYPT_MODULE: {
|
||||
return errCode;
|
||||
}
|
||||
case KEY_SESSION_RELEASE: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub KEY_SESSION_RELEASE enter.");
|
||||
errCode = Release();
|
||||
DRM_INFO_LOG("KeySessionServiceStub KEY_SESSION_RELEASE exit.");
|
||||
return errCode;
|
||||
}
|
||||
case MEDIA_KEY_SESSION_SET_CALLBACK: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_SET_CALLBACK enter.");
|
||||
auto remoteObject = data.ReadRemoteObject();
|
||||
if (remoteObject == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub SetCallback CameraServiceCallback is null");
|
||||
return IPC_STUB_INVALID_DATA_ERR;
|
||||
}
|
||||
auto callback = iface_cast<IKeySessionServiceCallback>(remoteObject);
|
||||
if (callback == nullptr) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub SetCallback cast nullptr");
|
||||
return IPC_STUB_INVALID_DATA_ERR;
|
||||
}
|
||||
errCode = SetKeySessionServiceCallback(callback);
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SESSION_SET_CALLBACK exit.");
|
||||
return errCode;
|
||||
}
|
||||
default: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub request code %{public}u not handled", code);
|
||||
return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
|
||||
}
|
||||
}
|
||||
|
||||
return errCode;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_decrypt_module_service.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include <memory>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include "ashmem.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
MediaDecryptModuleService::MediaDecryptModuleService()
|
||||
{
|
||||
DRM_DEBUG_LOG("MediaDecryptModuleService::MediaDecryptModuleService");
|
||||
}
|
||||
|
||||
MediaDecryptModuleService::~MediaDecryptModuleService()
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::~MediaDecryptModuleService enter.");
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::~MediaDecryptModuleService exit.");
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleService::Release()
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::Release enter.");
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::Release exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleService::DecryptData(bool secureDecodrtState, IMediaDecryptModuleService::CryptInfo &cryptInfo, uint64_t srcBuffer,
|
||||
uint64_t dstBuffer)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::DecryptData enter.");
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::DecryptData exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleService::RequireSecureDecoderModule(std::string &mimeType, bool *status)
|
||||
{
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::RequireSecureDecoderModule enter.");
|
||||
DRM_INFO_LOG("MediaDecryptModuleService::RequireSecureDecoderModule exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "media_decrypt_module_service_stub.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "xcollie/xcollie.h"
|
||||
#include "xcollie/xcollie_define.h"
|
||||
#include "remote_request_code.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DrmStandard {
|
||||
|
||||
MediaDecryptModuleServiceStub::MediaDecryptModuleServiceStub()
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances create", (POINTER_MASK & reinterpret_cast<uintptr_t>(this)));
|
||||
}
|
||||
|
||||
MediaDecryptModuleServiceStub::~MediaDecryptModuleServiceStub()
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances destroy", (POINTER_MASK & reinterpret_cast<uintptr_t>(this)));
|
||||
}
|
||||
|
||||
int32_t MediaDecryptModuleServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
|
||||
{
|
||||
DRM_INFO_LOG("OnRemoteRequest, cmd = %{public}u", code);
|
||||
if (data.ReadInterfaceToken() != GetDescriptor()) {
|
||||
DRM_ERR_LOG("MediaDecryptModuleServiceStub: ReadInterfaceToken failed");
|
||||
return -1;
|
||||
}
|
||||
switch(code) {
|
||||
case DECRYPT_MODULE_DECRYPT_DATA: {
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceStub DECRYPT_MODULE_DECRYPT_DATA enter.");
|
||||
IMediaDecryptModuleService::CryptInfo cryptInfo;
|
||||
bool secureDecodrtState = data.ReadBool();
|
||||
cryptInfo.type = (OHOS::DrmStandard::IMediaDecryptModuleService::CryptAlgorithmType)data.ReadInt32();
|
||||
uint32_t keyIdSize = data.ReadInt32();
|
||||
for (uint32_t i = 0; i < keyIdSize; i++) {
|
||||
cryptInfo.keyId.push_back(data.ReadUint8());
|
||||
}
|
||||
uint32_t ivSize = data.ReadInt32();
|
||||
for (uint32_t i = 0; i < ivSize; i++) {
|
||||
cryptInfo.iv.push_back(data.ReadUint8());
|
||||
}
|
||||
cryptInfo.pattern.encryptBlocks = data.ReadInt32();
|
||||
cryptInfo.pattern.skipBlocks = data.ReadInt32();
|
||||
uint32_t subSampleNumber = data.ReadInt32();
|
||||
cryptInfo.subSample.resize(subSampleNumber);
|
||||
for (int32_t i = 0; i < subSampleNumber; i++) {
|
||||
cryptInfo.subSample[i].clearHeaderLen = data.ReadInt32();
|
||||
cryptInfo.subSample[i].payLoadLen = data.ReadInt32();
|
||||
}
|
||||
uint64_t srcBuffer = data.ReadFileDescriptor();
|
||||
uint64_t dstBuffer = data.ReadFileDescriptor();
|
||||
int32_t ret = DecryptData(secureDecodrtState, cryptInfo, srcBuffer, dstBuffer);
|
||||
if (ret != 0) {
|
||||
DRM_ERR_LOG("DecryptData faild.");
|
||||
return ret;
|
||||
}
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceStub DECRYPT_MODULE_DECRYPT_DATA exit.");
|
||||
return ret;
|
||||
}
|
||||
case DECRYPT_MODULE_REQUIRE_SECURE_DECODER: {
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceStub DECRYPT_MODULE_REQUIRE_SECURE_DECODER enter.");
|
||||
std::string mimeType = data.ReadString();
|
||||
bool status;
|
||||
int32_t ret = RequireSecureDecoderModule(mimeType, &status);
|
||||
if (ret != 0) {
|
||||
DRM_ERR_LOG("RequireSecureDecoderModule faild.");
|
||||
return ret;
|
||||
}
|
||||
reply.WriteBool(status);
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceStub DECRYPT_MODULE_REQUIRE_SECURE_DECODER exit.");
|
||||
return ret;
|
||||
}
|
||||
case DECRYPT_MODULE_RELEASE: {
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceStub DECRYPT_MODULE_RELEASE enter.");
|
||||
int32_t ret = Release();
|
||||
DRM_INFO_LOG("MediaDecryptModuleServiceStub DECRYPT_MODULE_RELEASE exit.");
|
||||
return ret;
|
||||
}
|
||||
default: {
|
||||
DRM_ERR_LOG("default case, need check Decrypt Module");
|
||||
return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "mediakeysystem_service.h"
|
||||
#include "key_session_service.h"
|
||||
#include <securec.h>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "access_token.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "iservice_registry.h"
|
||||
#include "drm_log.h"
|
||||
#include "system_ability_definition.h"
|
||||
#include "ipc_skeleton.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
|
||||
MediaKeySystemService::MediaKeySystemService()
|
||||
{
|
||||
DRM_DEBUG_LOG("~MediaKeySystemService");
|
||||
}
|
||||
|
||||
MediaKeySystemService::~MediaKeySystemService() {
|
||||
DRM_DEBUG_LOG("~MediaKeySystemService");
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::CloseMediaKeySystemServiceByCallback()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemService::CloseMediaKeySystemServiceByCallback enter.");
|
||||
DRM_INFO_LOG("MediaKeySystemService::CloseMediaKeySystemServiceByCallback exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::Release()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemService::Release enter.");
|
||||
DRM_INFO_LOG("MediaKeySystemService::Release exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::SetMediaKeySystemServiceOperatorsCallback(wptr<IMediaKeySystemServiceOperatorsCallback> callback)
|
||||
{
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::GenerateKeySystemRequest(IMediaKeySystemService::RequestType type, std::vector<uint8_t> &request, std::string &defaultUrl) {
|
||||
DRM_INFO_LOG("MediaKeySystemService::GenerateKeySystemRequest enter, type:%{public}d.", type);
|
||||
DRM_INFO_LOG("MediaKeySystemService::GenerateKeySystemRequest exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::ProcessKeySystemResponse(IMediaKeySystemService::RequestType type, const std::vector<uint8_t> &response) {
|
||||
DRM_INFO_LOG("MediaKeySystemService::ProcessKeySystemResponse enter, type:%{public}d.", type);
|
||||
DRM_INFO_LOG("MediaKeySystemService::ProcessKeySystemResponse exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::SetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value) {
|
||||
DRM_INFO_LOG("MediaKeySystemService::SetConfiguration enter, configType:%{public}d, propertyName:%{public}s, value:%{public}s.", (int)type, propertyName.c_str(), value.c_str());
|
||||
DRM_INFO_LOG("MediaKeySystemService::SetConfiguration exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::GetConfiguration(IMediaKeySystemService::ConfigType type, std::string &propertyName, std::string &value) {
|
||||
DRM_INFO_LOG("MediaKeySystemService::GetConfiguration enter, configType:%{public}d, propertyName:%{public}s.", (int)type, propertyName.c_str());
|
||||
DRM_INFO_LOG("MediaKeySystemService::GetConfiguration exit, value:%{public}s.", value.c_str());
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::CreateKeySession(IKeySessionService::SecurityLevel securityLevel, sptr<IKeySessionService> &keySessionProxy)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemService::CreateKeySession enter, securityLevel:%{public}d.", securityLevel);
|
||||
DRM_INFO_LOG("MediaKeySystemService::CreateKeySession exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::CloseKeySessionService(sptr<KeySessionService> sessionService)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemService::CloseKeySessionService enter.");
|
||||
DRM_INFO_LOG("MediaKeySystemService::CloseKeySessionService exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::GetMetric(std::vector<IMediaKeySystemService::KeyValue> &infoMap)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemService::GetMetric enter");
|
||||
DRM_INFO_LOG("MediaKeySystemService::GetMetric exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemService::GetSecurityLevel(IKeySessionService::SecurityLevel *securityLevel) {
|
||||
DRM_INFO_LOG("MediaKeySystemService::GetSecurityLevel enter.");
|
||||
DRM_INFO_LOG("MediaKeySystemService::GetSecurityLevel exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "mediakeysystem_service_stub.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "xcollie/xcollie.h"
|
||||
#include "xcollie/xcollie_define.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard
|
||||
{
|
||||
MediaKeySystemServiceStub::MediaKeySystemServiceStub()
|
||||
{
|
||||
deathRecipientMap_.clear();
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances create", (POINTER_MASK & reinterpret_cast<uintptr_t>(this)));
|
||||
}
|
||||
|
||||
MediaKeySystemServiceStub::~MediaKeySystemServiceStub()
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances destroy", (POINTER_MASK & reinterpret_cast<uintptr_t>(this)));
|
||||
}
|
||||
|
||||
int MediaKeySystemServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
|
||||
{
|
||||
DRM_INFO_LOG("OnRemoteRequest, cmd = %{public}u", code);
|
||||
if (data.ReadInterfaceToken() != GetDescriptor()) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceStub: ReadInterfaceToken failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch(code) {
|
||||
case MEDIA_KEY_SYSTEM_CREATE_KEY_SESSION: {
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_CREATE_KEY_SESSION enter.");
|
||||
sptr<IKeySessionService> keySessionServiceProxy = nullptr;
|
||||
const int32_t securityLevel = data.ReadInt32();
|
||||
int errCode = CreateKeySession((IKeySessionService::SecurityLevel)securityLevel, keySessionServiceProxy);
|
||||
if (errCode != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceStub CreateKeySession failed : %{public}d", errCode);
|
||||
return errCode;
|
||||
}
|
||||
if (!reply.WriteRemoteObject(keySessionServiceProxy->AsObject())) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceStub CreateKeySession Write KeySession obj failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_CREATE_KEY_SESSION exit.");
|
||||
return errCode;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_REQUEST: {
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_REQUEST enter.");
|
||||
std::vector<uint8_t> request;
|
||||
std::string defaultUrl;
|
||||
int type = data.ReadInt32();
|
||||
int32_t ret = GenerateKeySystemRequest(IMediaKeySystemService::RequestType(type), request, defaultUrl);
|
||||
if (!reply.WriteInt32(request.size())) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write request size failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
for (auto req : request) {
|
||||
if (!reply.WriteUint8(req)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceStub Write request failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
}
|
||||
if (!reply.WriteString(defaultUrl)) {
|
||||
DRM_ERR_LOG("MediaKeySystemServiceStub Write GenerateKeySystemRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_REQUEST exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_RESPONSE: {
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_RESPONSE enter.");
|
||||
int type = data.ReadInt32();
|
||||
std::vector<uint8_t> response;
|
||||
uint32_t responseSize = data.ReadInt32();
|
||||
for (int i = 0; i < responseSize; i++) {
|
||||
response.push_back(data.ReadUint8());
|
||||
}
|
||||
int32_t ret = ProcessKeySystemResponse(IMediaKeySystemService::RequestType(type), response);
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GENERATE_KEYSYSTEM_RESPONSE exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_GETSECURITYLEVEL: {
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SYSTEM_GETSECURITYLEVEL enter.");
|
||||
IKeySessionService::SecurityLevel securityLevel = IKeySessionService::SECURITY_LEVEL_UNKNOWN;
|
||||
int32_t ret = GetSecurityLevel(&securityLevel);
|
||||
if (!reply.WriteInt32(securityLevel)) {
|
||||
DRM_ERR_LOG("KeySessionServiceStub Write GetSecurityLevel failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("KeySessionServiceStub MEDIA_KEY_SYSTEM_GETSECURITYLEVEL exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_SETCONFIGURATION: {
|
||||
DRM_INFO_LOG("bMediaKeySystemServiceStub MEDIA_KEY_SYSTEM_SETCONFIGURATION enter.");
|
||||
int type = data.ReadInt32();
|
||||
std::string propertyName = data.ReadString();
|
||||
std::string value = data.ReadString();
|
||||
int32_t ret = SetConfiguration(IMediaKeySystemService::ConfigType(type), propertyName, value);
|
||||
DRM_INFO_LOG("bMediaKeySystemServiceStub MEDIA_KEY_SYSTEM_SETCONFIGURATION exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_GETCONFIGURATION: {
|
||||
DRM_INFO_LOG("bMediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GETCONFIGURATION enter.");
|
||||
int type = data.ReadInt32();
|
||||
std::string propertyName = data.ReadString();
|
||||
std::string value;
|
||||
int32_t ret = GetConfiguration(IMediaKeySystemService::ConfigType(type), propertyName, value);
|
||||
if (!reply.WriteString(value)) {
|
||||
DRM_ERR_LOG("bMediaKeySystemServiceStub Write GenerateKeySystemRequest failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_INFO_LOG("bMediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GETCONFIGURATION exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_GETMETRIC: {
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GETMETRIC enter.");
|
||||
std::vector<IMediaKeySystemService::KeyValue> infoMap;
|
||||
int32_t ret = GetMetric(infoMap);
|
||||
reply.WriteInt32(infoMap.size());
|
||||
for (auto info : infoMap) {
|
||||
reply.WriteString(info.name);
|
||||
reply.WriteString(info.value);
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub MEDIA_KEY_SYSTEM_GETMETRIC exit.");
|
||||
return ret;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_RELEASE: {
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub KEY_SESSION_RELEASE enter.");
|
||||
int32_t ret = Release();
|
||||
DRM_INFO_LOG("MediaKeySystemServiceStub KEY_SESSION_RELEASE exit.");
|
||||
return ret;
|
||||
}
|
||||
default: {
|
||||
DRM_ERR_LOG("default case, need check MediaKeySystemServiceStub");
|
||||
return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}//namespace DrmStandard
|
||||
}//namespace OHOS
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "mediakeysystemfactory_service.h"
|
||||
#include "mediakeysystem_service.h"
|
||||
#include <securec.h>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "access_token.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "iservice_registry.h"
|
||||
#include "drm_log.h"
|
||||
#include "system_ability_definition.h"
|
||||
#include "ipc_skeleton.h"
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
REGISTER_SYSTEM_ABILITY_BY_ID(MediaKeySystemFactoryService, MEDIA_KEY_SYSTEM_SERVICE_ID, true)
|
||||
|
||||
MediaKeySystemFactoryService::MediaKeySystemFactoryService(int32_t systemAbilityId, bool runOnCreate)
|
||||
: SystemAbility(systemAbilityId, runOnCreate) {}
|
||||
|
||||
MediaKeySystemFactoryService::~MediaKeySystemFactoryService() {
|
||||
DRM_INFO_LOG("~MediaKeySystemFactoryService");
|
||||
}
|
||||
|
||||
void MediaKeySystemFactoryService::OnStart()
|
||||
{
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryService");
|
||||
}
|
||||
|
||||
void MediaKeySystemFactoryService::OnDump()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService::OnDump called");
|
||||
}
|
||||
|
||||
void MediaKeySystemFactoryService::OnStop()
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService::OnStop called");
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryService::CreateMediaKeySystem(std::string &uuid)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService CreateMediaKeySystem enter.");
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService CreateMediaKeySystem exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryService::CloseMediaKeySystemService(sptr<MediaKeySystemService> mediaKeySystemService)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService CloseMediaKeySystemService enter.");
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService CloseMediaKeySystemService exit.");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryService::IsMediaKeySystemSupported(std::string &uuid, bool *isSurpported) {
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService::IsMediaKeySystemSupported one parameters enter");
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService::IsMediaKeySystemSupported one parameters exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryService::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService::IsMediaKeySystemSupported two parameters enter");
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService::IsMediaKeySystemSupported two parameters exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
int32_t MediaKeySystemFactoryService::IsMediaKeySystemSupported(std::string &uuid, std::string &mimeType, int32_t securityLevel, bool *isSurpported)
|
||||
{
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService::IsMediaKeySystemSupported three parameters enter");
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryService enter IsMediaKeySystemSupported three parameters exit");
|
||||
return DRM_OK;
|
||||
}
|
||||
|
||||
} // DrmStandard
|
||||
} // OHOS
|
||||
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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 "mediakeysystemfactory_service_stub.h"
|
||||
#include "drm_error_code.h"
|
||||
#include "drm_log.h"
|
||||
#include "drm_napi_utils.h"
|
||||
#include "ipc_skeleton.h"
|
||||
#include "xcollie/xcollie.h"
|
||||
#include "xcollie/xcollie_define.h"
|
||||
#include <codecvt>
|
||||
namespace OHOS{
|
||||
namespace DrmStandard
|
||||
{
|
||||
MediaKeySystemFactoryServiceStub::MediaKeySystemFactoryServiceStub()
|
||||
{
|
||||
deathRecipientMap_.clear();
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances create", (POINTER_MASK & reinterpret_cast<uintptr_t>(this)));
|
||||
}
|
||||
|
||||
MediaKeySystemFactoryServiceStub::~MediaKeySystemFactoryServiceStub()
|
||||
{
|
||||
DRM_DEBUG_LOG("0x%{public}06" PRIXPTR " Instances destroy", (POINTER_MASK & reinterpret_cast<uintptr_t>(this)));
|
||||
}
|
||||
|
||||
int MediaKeySystemFactoryServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
|
||||
{
|
||||
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> converter;
|
||||
if (data.ReadInterfaceToken() != GetDescriptor()) {
|
||||
DRM_DEBUG_LOG("MediaKeySystemFactoryServiceStub: ReadInterfaceToken failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch(code) {
|
||||
case MEDIA_KEY_SYSTEM_FACTORY_IS_MEDIA_KEY_SYSTEM_SURPPORTED: {
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceStub MEDIA_KEY_SYSTEM_FACTORY_IS_MEDIA_KEY_SYSTEM_SURPPORTED enter.");
|
||||
int paramNum = data.ReadInt32();
|
||||
bool isSurpported = false;
|
||||
if (paramNum > 3 || paramNum < 0) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub paramNum is invalid");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub ");
|
||||
|
||||
// get uuid
|
||||
std::string uuid = data.ReadString();
|
||||
// search by uuid
|
||||
if (paramNum == 1) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub ");
|
||||
int32_t ret = IsMediaKeySystemSupported(uuid, &isSurpported);
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub ");
|
||||
if (!reply.WriteBool(isSurpported)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub Write isSurpported failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub ");
|
||||
return ret;
|
||||
}
|
||||
|
||||
// get mimeType
|
||||
std::string mimeType = data.ReadString();
|
||||
// search by uuid and mimeType
|
||||
if (paramNum == 2) {
|
||||
int32_t ret = IsMediaKeySystemSupported(uuid, mimeType, &isSurpported);
|
||||
if (!reply.WriteBool(isSurpported)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub Write isSurpported failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// get securityLevel
|
||||
int32_t securityLevel = data.ReadInt32();
|
||||
// search by uuid, mineType and securityLevel
|
||||
if (paramNum == 3) {
|
||||
int32_t ret = IsMediaKeySystemSupported(uuid, mimeType, securityLevel, &isSurpported);
|
||||
if (!reply.WriteBool(isSurpported)) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub Write isSurpported failed");
|
||||
return IPC_STUB_WRITE_PARCEL_ERR;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceStub MEDIA_KEY_SYSTEM_FACTORY_IS_MEDIA_KEY_SYSTEM_SURPPORTED exit.");
|
||||
return -1;
|
||||
}
|
||||
case MEDIA_KEY_SYSTEM_FACTORY_CREATE_MEDIA_KEYSYSTEM: {
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceStub MEDIA_KEY_SYSTEM_FACTORY_CREATE_MEDIA_KEYSYSTEM enter.");
|
||||
std::string uuid = data.ReadString();
|
||||
int errCode = CreateMediaKeySystem(uuid);
|
||||
if (errCode != ERR_NONE) {
|
||||
DRM_ERR_LOG("MediaKeySystemFactoryServiceStub CreateMediaKeySystem failed : %{public}d", errCode);
|
||||
return errCode;
|
||||
}
|
||||
DRM_INFO_LOG("MediaKeySystemFactoryServiceStub MEDIA_KEY_SYSTEM_FACTORY_CREATE_MEDIA_KEYSYSTEM exit.");
|
||||
return errCode;
|
||||
}
|
||||
}
|
||||
return DRM_OK;
|
||||
}
|
||||
}//namespace DrmStandard
|
||||
}//namespace OHOS
|
||||
@@ -0,0 +1,8 @@
|
||||
import("//build/ohos.gni")
|
||||
|
||||
ohos_prebuilt_etc("drm_service.rc") {
|
||||
source = "drm_service.cfg"
|
||||
relative_install_dir = "init"
|
||||
part_name = "multimedia_drm_framework"
|
||||
subsystem_name = "multimedia"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"services" : [{
|
||||
"name" : "drm_service",
|
||||
"path" : ["/system/bin/sa_main", "/system/profile/drm_service.json"],
|
||||
"uid" : "drmserver",
|
||||
"gid" : ["system", "shell"],
|
||||
"secon" : "u:r:drm_service:s0",
|
||||
"permission" : ["ohos.permission.GET_SENSITIVE_PERMISSIONS", "ohos.permission.PERMISSION_USED_STATS"],
|
||||
"permission_acls" : ["ohos.permission.GET_SENSITIVE_PERMISSIONS"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# Copyright (c) 2023-2024 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.
|
||||
|
||||
service drm_service /system/bin/sa_main /system/profile/drm_service.json
|
||||
class z_core
|
||||
user drmserver
|
||||
group system shell
|
||||
seclabel u:r:audiodistributedservice:s0
|
||||
|
||||
on boot
|
||||
start drm_service
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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_ERROR_CODE_H
|
||||
#define DRM_ERROR_CODE_H
|
||||
|
||||
namespace OHOS{
|
||||
namespace DrmStandard{
|
||||
/**
|
||||
* @brief drm remote request code for IPC.
|
||||
*
|
||||
* @since 1.0
|
||||
* @version 1.0
|
||||
*/
|
||||
enum DrmErrorCode{
|
||||
DRM_ERROR = -1,
|
||||
DRM_SUCCESS = 0,
|
||||
NO_SYSTEMP_APP_PERMISSION = 202,
|
||||
INVALID_ARGUMENT = 7400101,
|
||||
OPERATION_NOT_ALLOWED = 7400102,
|
||||
SESSION_NOT_CONFIG = 7400103,
|
||||
SESSION_NOT_RUNNING = 7400104,
|
||||
SESSION_CONFIG_LOCKED = 7400105,
|
||||
DEVICE_SETTING_LOCKED = 7400106,
|
||||
DEVICE_DISABLED = 7400108,
|
||||
SERVICE_FATAL_ERROR = 7400201
|
||||
};
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
#endif // DRM_ERROR_CODE_H
|
||||
@@ -0,0 +1,55 @@
|
||||
#ifndef OHOS_DRM_LOG_H
|
||||
#define OHOS_DRM_LOG_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "hilog/log.h"
|
||||
#include "hisysevent.h"
|
||||
#include "hitrace_meter.h"
|
||||
#include <cinttypes>
|
||||
|
||||
#undef LOG_DOMAIN
|
||||
#undef LOG_TAG
|
||||
#define LOG_DOMAIN 0xD002B00
|
||||
#define LOG_TAG "DRM"
|
||||
#define MAX_STRING_SIZE 256
|
||||
|
||||
#define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
|
||||
|
||||
#define POINTER_MASK 0x00FFFFFF
|
||||
#define FAKE_POINTER(addr) (POINTER_MASK & reinterpret_cast<uintptr_t>(addr))
|
||||
|
||||
#define DECORATOR_HILOG(op, fmt, args...) \
|
||||
do{ \
|
||||
op(LOG_CORE, "{%{public}s()-%{public}s:%{public}d}" fmt, __FUNCTION__, __FILENAME__, __LINE__, ##args); \
|
||||
} while(0) \
|
||||
|
||||
#define DRM_DEBUG_LOG(fmt, ...) DECORATOR_HILOG(HILOG_DEBUG, fmt, ##__VA_ARGS__)
|
||||
#define DRM_ERR_LOG(fmt, ...) DECORATOR_HILOG(HILOG_ERROR, fmt, ##__VA_ARGS__)
|
||||
#define DRM_WARNING_LOG(fmt, ...) DECORATOR_HILOG(HILOG_WARN, fmt, ##__VA_ARGS__)
|
||||
#define DRM_INFO_LOG(fmt, ...) DECORATOR_HILOG(HILOG_INFO, fmt, ##__VA_ARGS__)
|
||||
#define DRM_FATAL_LOG(fmt, ...) DECORATOR_HILOG(HILOG_FATAL, fmt, ##__VA_ARGS__)
|
||||
|
||||
#ifndef CHECK_AND_RETURN_RET_LOG
|
||||
#define CHECK_AND_RETURN_RET_LOG(cond, ret, fmt, ...) \
|
||||
do{ \
|
||||
if (!(cond)) { \
|
||||
DRM_ERR_LOG(fmt, ##__VA_ARGS__); \
|
||||
return ret; \
|
||||
} \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_AND_RETURN_LOG
|
||||
#define CHECK_AND_RETURN_LOG(cond, fmt, ...) \
|
||||
do{ \
|
||||
if (!(cond)) { \
|
||||
DRM_ERR_LOG(fmt, ##__VA_ARGS__); \
|
||||
return; \
|
||||
} \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
#define POINTER_MASK 0x00FFFFFF
|
||||
|
||||
#endif //OHOS_DRM_LOG_H
|
||||
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (c) 2023-2024 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;
|
||||
|
||||
/* 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 SIZE = 100;
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
enum DrmServiceError {
|
||||
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,
|
||||
};
|
||||
|
||||
// static bool CheckError(napi_env env, int32_t retCode)
|
||||
// {
|
||||
// if ((retCode != 0)) {
|
||||
// std::string errorCode = std::to_string(retCode);
|
||||
// napi_throw_error(env, errorCode.c_str(), "");
|
||||
// return false;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
} // namespace DrmStandard
|
||||
} // namespace OHOS
|
||||
#endif /* DRM_NAPI_UTILS_H_ */
|
||||
Reference in New Issue
Block a user