1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "drm_error_code.h"
17 #include "drm_error_code_napi.h"
18 #include "common_napi.h"
19
20 namespace OHOS {
21 namespace DrmStandard {
22
23 const std::string DRM_NAPI_INVALID_PARAM_INFO = "input parameter value error";
24 const std::string DRM_NAPI_SERVICE_FATAL_ERRO_INFO = "service error";
25 const std::string DRM_NAPI_UNKNOWN_ERROR_INFO = "unknow error";
26 const std::string DRM_NAPI_MAX_SYSTEM_NUM_REACHED_INFO = "mediaKeySystem number limited";
27 const std::string DRM_NAPI_MAX_SESSION_NUM_REACHED_INFO = "mediaKeySession number limited";
28
29 const std::unordered_map<DrmInnerErrCode, DrmNapiErrCode> INNERCODE_TO_NAPICODE = {
30 {DRM_INNER_ERR_OK, DRM_NAPI_ERR_OK},
31 {DRM_INNER_ERR_BASE, DRM_NAPI_ERR_BASE},
32 {DRM_INNER_ERR_UNKNOWN, DRM_NAPI_ERR_UNKNOWN},
33 {DRM_INNER_ERR_MAX_SYSTEM_NUM_REACHED, DRM_NAPI_ERR_MAX_SYSTEM_NUM_REACHED},
34 {DRM_INNER_ERR_MAX_SESSION_NUM_REACHED, DRM_NAPI_ERR_MAX_SESSION_NUM_REACHED},
35 {DRM_INNER_ERR_INVALID_VAL, DRM_NAPI_ERR_INVALID_VAL},
36 {DRM_INNER_ERR_SERVICE_DIED, DRM_NAPI_ERR_SERVICE_FATAL},
37 {DRM_INNER_ERR_INVALID_KEY_SESSION, DRM_NAPI_ERR_INVALID_VAL},
38 {DRM_INNER_ERR_INVALID_MEDIA_KEY_SYSTEM, DRM_NAPI_ERR_INVALID_VAL},
39 {DRM_INNER_ERR_NOT_PROVISIONED, DRM_NAPI_ERR_NOT_PROVISIONED},
40 {DRM_INNER_ERR_DEVICE_TIME_ERROR, DRM_NAPI_ERR_DEVICE_TIME_ERROR},
41 {DRM_INNER_ERR_PROVISIONING_NO_DEVICE_CERT, DRM_NAPI_ERR_NO_DEVICE_CERT},
42 {DRM_INNER_ERR_KEY_REQUEST_NOT_ALLOWED, DRM_NAPI_ERR_INVALID_VAL},
43 {DRM_INNER_ERR_KEY_REQUEST_INVALID_MEDIA_KEY_TYPE, DRM_NAPI_ERR_INVALID_VAL},
44 {DRM_INNER_ERR_KEY_REQUEST_INVALID_MIMETYPE, DRM_NAPI_ERR_INVALID_VAL},
45 {DRM_INNER_ERR_KEY_REQUEST_INVALID_INITDATA, DRM_NAPI_ERR_INVALID_VAL},
46 {DRM_INNER_ERR_KEY_REQUEST_INVALID_DRM_CERTIFICATES, DRM_NAPI_ERR_INVALID_VAL},
47 {DRM_INNER_ERR_KEY_REQUEST_DRM_CERTIFICATES_REVOKED, DRM_NAPI_ERR_DRM_CERTIFICATES_REVOKED},
48 {DRM_INNER_ERR_DECRYPT_NO_LICENSE, DRM_NAPI_ERR_NO_LICENSE},
49 {DRM_INNER_ERR_DECRYPT_NO_KEY, DRM_NAPI_ERR_NO_KEY},
50 {DRM_INNER_ERR_POLICY_CONTENT_PROTECTION_LEVEL_NOT_ALLOWED, DRM_NAPI_ERR_INVALID_VAL},
51 {DRM_INNER_ERR_SERVICE_FATAL_ERROR, DRM_NAPI_ERR_SERVICE_FATAL},
52 {DRM_INNER_ERR_PLUGIN_ERROR, DRM_NAPI_ERR_UNKNOWN},
53 };
54
55 const std::unordered_map<DrmInnerErrCode, DrmNapiErrCode> INNERCODE_TO_API12_NAPICODE = {
56 {DRM_INNER_ERR_OK, DRM_NAPI_ERR_OK},
57 {DRM_INNER_ERR_UNKNOWN, DRM_NAPI_ERR_UNKNOWN},
58 {DRM_INNER_ERR_MAX_SYSTEM_NUM_REACHED, DRM_NAPI_ERR_MAX_SYSTEM_NUM_REACHED},
59 {DRM_INNER_ERR_MAX_SESSION_NUM_REACHED, DRM_NAPI_ERR_MAX_SESSION_NUM_REACHED},
60 {DRM_INNER_ERR_INVALID_VAL, DRM_NAPI_ERR_INVALID_VAL},
61 {DRM_INNER_ERR_SERVICE_DIED, DRM_NAPI_ERR_SERVICE_FATAL},
62 {DRM_INNER_ERR_SERVICE_FATAL_ERROR, DRM_NAPI_ERR_SERVICE_FATAL},
63 };
64
DrmInnerErrToNapiErr(DrmInnerErrCode errCode)65 DrmNapiErrCode DrmInnerErrToNapiErr(DrmInnerErrCode errCode)
66 {
67 if (INNERCODE_TO_NAPICODE.find(errCode) != INNERCODE_TO_NAPICODE.end()) {
68 return INNERCODE_TO_NAPICODE.at(errCode);
69 }
70 return DRM_NAPI_ERR_UNKNOWN;
71 }
72
DrmInnerErrToNapiErrAPI12(DrmInnerErrCode errCode)73 DrmNapiErrCode DrmInnerErrToNapiErrAPI12(DrmInnerErrCode errCode)
74 {
75 if (INNERCODE_TO_API12_NAPICODE.find(errCode) != INNERCODE_TO_API12_NAPICODE.end()) {
76 return INNERCODE_TO_API12_NAPICODE.at(errCode);
77 }
78 return DRM_NAPI_ERR_UNKNOWN;
79 }
80
ThrowError(napi_env env,const char * napiMessage,int32_t napiCode)81 napi_status NapiDrmError::ThrowError(napi_env env, const char *napiMessage, int32_t napiCode)
82 {
83 napi_value message = nullptr;
84 napi_value code = nullptr;
85 napi_value result = nullptr;
86 napi_create_string_utf8(env, napiMessage, NAPI_AUTO_LENGTH, &message);
87 napi_create_error(env, nullptr, message, &result);
88 napi_create_int32(env, napiCode, &code);
89 napi_set_named_property(env, result, "code", code);
90 napi_throw(env, result);
91 return napi_ok;
92 }
93
ThrowError(napi_env env,int32_t code)94 void NapiDrmError::ThrowError(napi_env env, int32_t code)
95 {
96 std::string messageValue = GetMessageByCode(code);
97 napi_throw_error(env, (std::to_string(code)).c_str(), messageValue.c_str());
98 }
99
GetMessageByCode(int32_t & code)100 std::string NapiDrmError::GetMessageByCode(int32_t &code)
101 {
102 std::string errMessage;
103 switch (code) {
104 case DRM_NAPI_ERR_INVALID_VAL:
105 errMessage = DRM_NAPI_INVALID_PARAM_INFO;
106 break;
107 case DRM_NAPI_ERR_SERVICE_FATAL:
108 errMessage = DRM_NAPI_SERVICE_FATAL_ERRO_INFO;
109 break;
110 case DRM_NAPI_ERR_UNKNOWN:
111 errMessage = DRM_NAPI_UNKNOWN_ERROR_INFO;
112 break;
113 case DRM_NAPI_ERR_MAX_SYSTEM_NUM_REACHED:
114 errMessage = DRM_NAPI_MAX_SYSTEM_NUM_REACHED_INFO;
115 break;
116 case DRM_NAPI_ERR_MAX_SESSION_NUM_REACHED:
117 errMessage = DRM_NAPI_MAX_SESSION_NUM_REACHED_INFO;
118 break;
119 default:
120 errMessage = DRM_NAPI_UNKNOWN_ERROR_INFO;
121 code = DRM_NAPI_ERR_UNKNOWN;
122 break;
123 }
124 return errMessage;
125 }
126 } // namespace DrmStandard
127 } // namespace OHOS