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 "napi_param_utils.h" 17 18 namespace OHOS { 19 namespace DrmStandard { GetUndefinedValue(napi_env env)20 napi_value NapiParamUtils::GetUndefinedValue(napi_env env) 21 { 22 napi_value result {}; 23 napi_get_undefined(env, &result); 24 return result; 25 } 26 GetValueInt32(const napi_env & env,int32_t & value,napi_value in)27 napi_status NapiParamUtils::GetValueInt32(const napi_env &env, int32_t &value, napi_value in) 28 { 29 napi_status status = napi_get_value_int32(env, in, &value); 30 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "GetValueInt32 napi_get_value_int32 failed."); 31 return status; 32 } 33 SetValueInt32(const napi_env & env,const int32_t & value,napi_value & result)34 napi_status NapiParamUtils::SetValueInt32(const napi_env &env, const int32_t &value, napi_value &result) 35 { 36 napi_status status = napi_create_int32(env, value, &result); 37 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueInt32 napi_create_int32 failed."); 38 return status; 39 } 40 GetValueInt32(const napi_env & env,const std::string & fieldStr,int32_t & value,napi_value in)41 napi_status NapiParamUtils::GetValueInt32(const napi_env &env, const std::string &fieldStr, int32_t &value, 42 napi_value in) 43 { 44 napi_value jsValue = nullptr; 45 napi_status status = napi_get_named_property(env, in, fieldStr.c_str(), &jsValue); 46 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "GetValueInt32 napi_get_named_property failed."); 47 status = GetValueInt32(env, value, jsValue); 48 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "GetValueInt32 napi_get_value_int32 failed."); 49 return status; 50 } 51 SetValueInt32(const napi_env & env,const std::string & fieldStr,const int32_t value,napi_value & result)52 napi_status NapiParamUtils::SetValueInt32(const napi_env &env, const std::string &fieldStr, const int32_t value, 53 napi_value &result) 54 { 55 napi_value jsValue = nullptr; 56 napi_status status = SetValueInt32(env, value, jsValue); 57 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueInt32 napi_create_int32 failed."); 58 status = napi_set_named_property(env, result, fieldStr.c_str(), jsValue); 59 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueInt32 napi_create_int32 failed."); 60 return status; 61 } 62 GetStringArgument(napi_env env,napi_value value)63 std::string NapiParamUtils::GetStringArgument(napi_env env, napi_value value) 64 { 65 std::string strValue = ""; 66 size_t bufLength = 0; 67 napi_status status = napi_get_value_string_utf8(env, value, nullptr, 0, &bufLength); 68 if (status == napi_ok && bufLength > 0 && bufLength < PATH_MAX) { 69 strValue.reserve(bufLength + 1); 70 strValue.resize(bufLength); 71 status = napi_get_value_string_utf8(env, value, strValue.data(), bufLength + 1, &bufLength); 72 if (status == napi_ok) { 73 DRM_DEBUG_LOG("argument = %{public}s", strValue.c_str()); 74 } 75 } 76 return strValue; 77 } 78 SetValueString(const napi_env & env,const std::string & stringValue,napi_value & result)79 napi_status NapiParamUtils::SetValueString(const napi_env &env, const std::string &stringValue, napi_value &result) 80 { 81 napi_status status = napi_create_string_utf8(env, stringValue.c_str(), NAPI_AUTO_LENGTH, &result); 82 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueString napi_create_string_utf8 failed."); 83 return status; 84 } 85 SetValueString(const napi_env & env,const std::string & fieldStr,const std::string & stringValue,napi_value & result)86 napi_status NapiParamUtils::SetValueString(const napi_env &env, const std::string &fieldStr, 87 const std::string &stringValue, napi_value &result) 88 { 89 napi_value value = nullptr; 90 napi_status status = SetValueString(env, stringValue.c_str(), value); 91 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueString failed."); 92 status = napi_set_named_property(env, result, fieldStr.c_str(), value); 93 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueString napi_set_named_property failed."); 94 return status; 95 } 96 SetValueUint8Array(const napi_env & env,const std::vector<uint8_t> & value,napi_value & result)97 napi_status NapiParamUtils::SetValueUint8Array(const napi_env &env, const std::vector<uint8_t> &value, 98 napi_value &result) 99 { 100 napi_status status = napi_create_array(env, &result); 101 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueUint8Array napi_create_array failed."); 102 for (size_t i = 0; i < value.size(); i++) { 103 napi_value item; 104 status = napi_create_int32(env, value[i], &item); 105 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "napi_create_int32 failed."); 106 status = napi_set_element(env, result, i, item); 107 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "napi_set_element failed."); 108 } 109 return status; 110 } 111 SetValueUint8Array(const napi_env & env,const std::string & fieldStr,const std::vector<uint8_t> & value,napi_value & result)112 napi_status NapiParamUtils::SetValueUint8Array(const napi_env &env, const std::string &fieldStr, 113 const std::vector<uint8_t> &value, napi_value &result) 114 { 115 napi_value jsValue = nullptr; 116 napi_status status = SetValueUint8Array(env, value, jsValue); 117 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueUint8Array failed."); 118 status = napi_set_named_property(env, result, fieldStr.c_str(), jsValue); 119 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "napi_set_named_property failed."); 120 return status; 121 } 122 GetValueUint8Array(const napi_env & env,std::vector<uint8_t> & value,napi_value in)123 napi_status NapiParamUtils::GetValueUint8Array(const napi_env &env, std::vector<uint8_t> &value, napi_value in) 124 { 125 void *reponseData = nullptr; 126 size_t reponseDataLen; 127 size_t offset; 128 napi_value arraybuffer = nullptr; 129 napi_typedarray_type type; 130 napi_status status = napi_get_typedarray_info(env, in, &type, &reponseDataLen, &reponseData, &arraybuffer, &offset); 131 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "napi_get_typedarray_info failed."); 132 uint8_t *reponseDataPtr = reinterpret_cast<uint8_t *>(reponseData); 133 std::vector<uint8_t> initDataStr(reponseDataPtr, reponseDataPtr + reponseDataLen); 134 value.assign(initDataStr.begin(), initDataStr.end()); 135 return status; 136 } 137 SetValueBoolean(const napi_env & env,const bool boolValue,napi_value & result)138 napi_status NapiParamUtils::SetValueBoolean(const napi_env &env, const bool boolValue, napi_value &result) 139 { 140 napi_status status = napi_get_boolean(env, boolValue, &result); 141 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetValueBoolean napi_get_boolean failed."); 142 return status; 143 } 144 SetValueMap(const napi_env & env,std::map<std::vector<uint8_t>,MediaKeySessionKeyStatus> statusTable,napi_value & statusTableMap)145 napi_status NapiParamUtils::SetValueMap(const napi_env &env, 146 std::map<std::vector<uint8_t>, MediaKeySessionKeyStatus> statusTable, napi_value &statusTableMap) 147 { 148 uint32_t index = 0; 149 napi_status status; 150 napi_create_array_with_length(env, statusTable.size(), &statusTableMap); 151 for (auto itemTmp : statusTable) { 152 napi_value jsObject; 153 napi_value jsKeyId; 154 napi_value jsKeyStatus; 155 napi_create_object(env, &jsObject); 156 status = napi_create_array_with_length(env, itemTmp.first.size(), &jsKeyId); 157 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_create_array_with_length"); 158 for (uint32_t i = 0; i < itemTmp.first.size(); i++) { 159 napi_value number = nullptr; 160 (void)napi_create_uint32(env, itemTmp.first[i], &number); 161 (void)napi_set_element(env, jsKeyId, i, number); 162 } 163 status = napi_set_named_property(env, jsObject, "keyId", jsKeyId); 164 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_set_named_property"); 165 std::string value; 166 switch (itemTmp.second) { 167 case MEDIA_KEY_SESSION_KEY_STATUS_USABLE: 168 value = "USABLE"; 169 break; 170 case MEDIA_KEY_SESSION_KEY_STATUS_EXPIRED: 171 value = "EXPIRED"; 172 break; 173 case MEDIA_KEY_SESSION_KEY_STATUS_OUTPUT_NOT_ALLOWED: 174 value = "OUTPUT_NOT_ALLOWED"; 175 break; 176 case MEDIA_KEY_SESSION_KEY_STATUS_PENDING: 177 value = "PENDING"; 178 break; 179 case MEDIA_KEY_SESSION_KEY_STATUS_INTERNAL_ERROR: 180 value = "INTERNAL_ERROR"; 181 break; 182 case MEDIA_KEY_SESSION_KEY_STATUS_USABLE_IN_FUTURE: 183 value = "USABLE_IN_FUTURE"; 184 break; 185 default: 186 value = "Fault Status"; 187 break; 188 } 189 status = napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &jsKeyStatus); 190 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_create_string_utf8"); 191 status = napi_set_named_property(env, jsObject, "value", jsKeyStatus); 192 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_set_named_property"); 193 status = napi_set_element(env, statusTableMap, index, jsObject); 194 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "failed to call napi_set_element"); 195 index++; 196 } 197 return status; 198 } 199 GetValueOptionsData(const napi_env & env,std::map<std::string,std::string> & valueMap,napi_value in)200 napi_status NapiParamUtils::GetValueOptionsData(const napi_env &env, std::map<std::string, std::string> &valueMap, 201 napi_value in) 202 { 203 uint32_t optionalDataCount = 0; 204 napi_status status = napi_get_array_length(env, in, &optionalDataCount); 205 if (optionalDataCount > 0) { 206 for (size_t i = 0; i < optionalDataCount; i++) { 207 napi_value tmpData; 208 napi_value tmpName; 209 napi_value tmpValue; 210 size_t nameLength = 0; 211 size_t valueLength = 0; 212 status = napi_get_element(env, in, i, &tmpData); 213 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "Could not able to read optionalData element!"); 214 status = napi_get_named_property(env, tmpData, "name", &tmpName); 215 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "Could not able to read optionalData property!"); 216 status = napi_get_named_property(env, tmpData, "value", &tmpValue); 217 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "Could not able to read optionalData property!"); 218 status = napi_get_value_string_utf8(env, tmpName, nullptr, 0, &nameLength); 219 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, 220 "Could not able to transfer optionalData buffer info!"); 221 status = napi_get_value_string_utf8(env, tmpValue, nullptr, 0, &valueLength); 222 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, 223 "Could not able to transfer optionalData buffer info!"); 224 std::string name(nameLength, 0); 225 status = napi_get_value_string_utf8(env, tmpName, &name[0], nameLength + 1, &nameLength); 226 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, 227 "Could not able to transfer optionalData buffer info!"); 228 std::string value(valueLength, 0); 229 status = napi_get_value_string_utf8(env, tmpValue, &value[0], valueLength + 1, &valueLength); 230 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, 231 "Could not able to transfer optionalData buffer info!"); 232 valueMap.insert(std::make_pair(name, value)); 233 } 234 } 235 return status; 236 } 237 SetProvisionRequest(const napi_env & env,const NapiProvisionRequest & provisionRequest,napi_value & result)238 napi_status NapiParamUtils::SetProvisionRequest(const napi_env &env, const NapiProvisionRequest &provisionRequest, 239 napi_value &result) 240 { 241 napi_status status = napi_create_object(env, &result); 242 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetProvisionRequest napi_create_object failed."); 243 status = SetValueString(env, "defaultURL", provisionRequest.defaultURL, result); 244 status = SetValueUint8Array(env, "data", provisionRequest.data, result); 245 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetProvisionRequest SetValueUint8Array failed."); 246 return status; 247 } 248 SetMediaKeyRequest(const napi_env & env,const IMediaKeySessionService::MediaKeyRequest & mediaKeyRequest,napi_value & result)249 napi_status NapiParamUtils::SetMediaKeyRequest(const napi_env &env, 250 const IMediaKeySessionService::MediaKeyRequest &mediaKeyRequest, napi_value &result) 251 { 252 napi_status status = napi_create_object(env, &result); 253 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest napi_create_object failed."); 254 status = SetValueInt32(env, "mediaKeyRequestType", mediaKeyRequest.requestType, result); 255 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest SetValueInt32 failed."); 256 status = SetValueUint8Array(env, "data", mediaKeyRequest.mData, result); 257 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest SetValueUint8Array failed."); 258 status = SetValueString(env, "defaultURL", mediaKeyRequest.mDefaultURL, result); 259 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetMediaKeyRequest SetValueString failed."); 260 return status; 261 } 262 SetDrmEventInfo(const napi_env & env,DrmEventParame & eventParame,napi_value & result)263 napi_status NapiParamUtils::SetDrmEventInfo(const napi_env &env, DrmEventParame &eventParame, napi_value &result) 264 { 265 napi_status status = napi_create_object(env, &result); 266 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmEventInfo napi_create_object failed."); 267 status = SetValueUint8Array(env, "info", eventParame.data, result); 268 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmEventInfo SetValueUint8Array failed."); 269 status = SetValueString(env, "extraInfo", std::to_string(eventParame.extra), result); 270 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmEventInfo SetValueString failed."); 271 return status; 272 } 273 SetDrmKeysChangeEventInfo(const napi_env & env,DrmKeysChangeEventParame & eventParame,napi_value & statusTable,napi_value & hasNewGoodLicense)274 napi_status NapiParamUtils::SetDrmKeysChangeEventInfo(const napi_env &env, DrmKeysChangeEventParame &eventParame, 275 napi_value &statusTable, napi_value &hasNewGoodLicense) 276 { 277 napi_status status = SetValueMap(env, eventParame.statusTable, statusTable); 278 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmKeysChangeEventInfo SetValueMap failed."); 279 status = SetValueBoolean(env, eventParame.hasNewGoodLicense, hasNewGoodLicense); 280 DRM_NAPI_CHECK_AND_RETURN_LOG(status == napi_ok, status, "SetDrmKeysChangeEventInfo SetValueBoolean failed."); 281 return napi_ok; 282 } 283 } // namespace DrmStandard 284 } // namespace OHOS