Add more CdmResponseType to help with debugging in the field.
The errors in the range ERROR_DRM_VENDOR_MIN to ERROR_DRM_VENDOR_MAX are reflected in the message that is reported to the app, which is MediaDrmStateException.getDiagnosticInfo(). Many errors map to kErrorCDMGeneric, especially KEY_ERROR is used as a generic error in CDM. This fix defines more specific error codes in the CDM for places where KEY_ERROR is returned. Merge from http://go/wvgerrit/14071 bug: 19244061 Change-Id: I688bf32828f997000fea041dd29567dde18ac677
This commit is contained in:
@@ -222,7 +222,7 @@ TEST_F(CdmSessionTest, ReInitFail) {
|
||||
Properties::set_use_certificates_as_identification(true);
|
||||
|
||||
ASSERT_EQ(NO_ERROR, cdm_session_->Init());
|
||||
ASSERT_EQ(UNKNOWN_ERROR, cdm_session_->Init());
|
||||
ASSERT_NE(NO_ERROR, cdm_session_->Init());
|
||||
}
|
||||
|
||||
TEST_F(CdmSessionTest, InitFailCryptoError) {
|
||||
|
||||
@@ -8,72 +8,333 @@ namespace wvcdm {
|
||||
|
||||
void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
switch (value) {
|
||||
case NO_ERROR: *os << "NO_ERROR";
|
||||
case NO_ERROR: *os << "NO_ERROR";
|
||||
break;
|
||||
case UNKNOWN_ERROR: *os << "UNKNOWN_ERROR";
|
||||
case UNKNOWN_ERROR: *os << "UNKNOWN_ERROR";
|
||||
break;
|
||||
case KEY_ADDED: *os << "KEY_ADDED";
|
||||
case KEY_ADDED: *os << "KEY_ADDED";
|
||||
break;
|
||||
case KEY_ERROR: *os << "KEY_ERROR";
|
||||
case KEY_ERROR: *os << "KEY_ERROR";
|
||||
break;
|
||||
case KEY_MESSAGE: *os << "KEY_MESSAGE";
|
||||
case KEY_MESSAGE: *os << "KEY_MESSAGE";
|
||||
break;
|
||||
case NEED_KEY: *os << "NEED_KEY";
|
||||
case NEED_KEY: *os << "NEED_KEY";
|
||||
break;
|
||||
case KEY_CANCELED: *os << "KEY_CANCELED";
|
||||
case KEY_CANCELED: *os << "KEY_CANCELED";
|
||||
break;
|
||||
case NEED_PROVISIONING: *os << "NEED_PROVISIONING";
|
||||
case NEED_PROVISIONING: *os << "NEED_PROVISIONING";
|
||||
break;
|
||||
case DEVICE_REVOKED: *os << "DEVICE_REVOKED";
|
||||
case DEVICE_REVOKED: *os << "DEVICE_REVOKED";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES: *os << "INSUFFICIENT_CRYPTO_RESOURCES";
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES: *os << "INSUFFICIENT_CRYPTO_RESOURCES";
|
||||
break;
|
||||
case ADD_KEY_ERROR: *os << "ADD_KEY_ERROR";
|
||||
break;
|
||||
case CERT_PROVISIONING_GET_KEYBOX_ERROR_1: *os << "CERT_PROVISIONING_GET_KEYBOX_ERROR_1";
|
||||
break;
|
||||
case CERT_PROVISIONING_GET_KEYBOX_ERROR_2: *os << "CERT_PROVISIONING_GET_KEYBOX_ERROR_2";
|
||||
break;
|
||||
case CERT_PROVISIONING_INVALID_CERT_TYPE: *os << "CERT_PROVISIONING_INVALID_CERT_TYPE";
|
||||
break;
|
||||
case CERT_PROVISIONING_REQUEST_ERROR_1: *os << "CERT_PROVISIONING_REQUEST_ERROR_1";
|
||||
break;
|
||||
case CERT_PROVISIONING_REQUEST_ERROR_2: *os << "CERT_PROVISIONING_REQUEST_ERROR_2";
|
||||
break;
|
||||
case CERT_PROVISIONING_REQUEST_ERROR_3: *os << "CERT_PROVISIONING_REQUEST_ERROR_3";
|
||||
break;
|
||||
case CERT_PROVISIONING_REQUEST_ERROR_4: *os << "CERT_PROVISIONING_REQUEST_ERROR_4";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_1: *os << "CERT_PROVISIONING_RESPONSE_ERROR_1";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_2: *os << "CERT_PROVISIONING_RESPONSE_ERROR_2";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_3: *os << "CERT_PROVISIONING_RESPONSE_ERROR_3";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_4: *os << "CERT_PROVISIONING_RESPONSE_ERROR_4";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_5: *os << "CERT_PROVISIONING_RESPONSE_ERROR_5";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_6: *os << "CERT_PROVISIONING_RESPONSE_ERROR_6";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_7: *os << "CERT_PROVISIONING_RESPONSE_ERROR_7";
|
||||
break;
|
||||
case CERT_PROVISIONING_RESPONSE_ERROR_8: *os << "CERT_PROVISIONING_RESPONSE_ERROR_8";
|
||||
break;
|
||||
case CRYPTO_SESSION_OPEN_ERROR_1: *os << "CRYPTO_SESSION_OPEN_ERROR_1";
|
||||
break;
|
||||
case CRYPTO_SESSION_OPEN_ERROR_2: *os << "CRYPTO_SESSION_OPEN_ERROR_2";
|
||||
break;
|
||||
case CRYPTO_SESSION_OPEN_ERROR_3: *os << "CRYPTO_SESSION_OPEN_ERROR_3";
|
||||
break;
|
||||
case CRYPTO_SESSION_OPEN_ERROR_4: *os << "CRYPTO_SESSION_OPEN_ERROR_4";
|
||||
break;
|
||||
case CRYPTO_SESSION_OPEN_ERROR_5: *os << "CRYPTO_SESSION_OPEN_ERROR_5";
|
||||
break;
|
||||
case DECRYPT_NOT_READY: *os << "DECRYPT_NOT_READY";
|
||||
break;
|
||||
case DEVICE_CERTIFICATE_ERROR_1: *os << "DEVICE_CERTIFICATE_ERROR_1";
|
||||
break;
|
||||
case DEVICE_CERTIFICATE_ERROR_2: *os << "DEVICE_CERTIFICATE_ERROR_2";
|
||||
break;
|
||||
case DEVICE_CERTIFICATE_ERROR_3: *os << "DEVICE_CERTIFICATE_ERROR_3";
|
||||
break;
|
||||
case DEVICE_CERTIFICATE_ERROR_4: *os << "DEVICE_CERTIFICATE_ERROR_4";
|
||||
break;
|
||||
case EMPTY_KEY_DATA_1: *os << "EMPTY_KEY_DATA_1";
|
||||
break;
|
||||
case EMPTY_KEY_DATA_2: *os << "EMPTY_KEY_DATA_2";
|
||||
break;
|
||||
case EMPTY_KEYSET_ID: *os << "EMPTY_KEYSET_ID";
|
||||
break;
|
||||
case EMPTY_KEYSET_ID_ENG_1: *os << "EMPTY_KEYSET_ID_ENG_1";
|
||||
break;
|
||||
case EMPTY_KEYSET_ID_ENG_2: *os << "EMPTY_KEYSET_ID_ENG_2";
|
||||
break;
|
||||
case EMPTY_KEYSET_ID_ENG_3: *os << "EMPTY_KEYSET_ID_ENG_3";
|
||||
break;
|
||||
case EMPTY_KEYSET_ID_ENG_4: *os << "EMPTY_KEYSET_ID_ENG_4";
|
||||
break;
|
||||
case EMPTY_LICENSE_REQUEST: *os << "EMPTY_LICENSE_REQUEST";
|
||||
break;
|
||||
case EMPTY_LICENSE_RESPONSE_1: *os << "EMPTY_LICENSE_RESPONSE_1";
|
||||
break;
|
||||
case EMPTY_LICENSE_RESPONSE_2: *os << "EMPTY_LICENSE_RESPONSE_2";
|
||||
break;
|
||||
case EMPTY_PROVISIONING_CERTIFICATE: *os << "EMPTY_PROVISIONING_CERTIFICATE";
|
||||
break;
|
||||
case EMPTY_PROVISIONING_RESPONSE: *os << "EMPTY_PROVISIONING_RESPONSE";
|
||||
break;
|
||||
case EMPTY_SESSION_ID: *os << "EMPTY_SESSION_ID";
|
||||
break;
|
||||
case GENERATE_DERIVED_KEYS_ERROR: *os << "GENERATE_DERIVED_KEYS_ERROR";
|
||||
break;
|
||||
case GENERATE_NONCE_ERROR: *os << "GENERATE_NONCE_ERROR";
|
||||
break;
|
||||
case GENERATE_USAGE_REPORT_ERROR: *os << "GENERATE_USAGE_REPORT_ERROR";
|
||||
break;
|
||||
case GET_LICENSE_ERROR: *os << "GET_LICENSE_ERROR";
|
||||
break;
|
||||
case GET_RELEASED_LICENSE_ERROR: *os << "GET_RELEASED_LICENSE_ERROR";
|
||||
break;
|
||||
case GET_USAGE_INFO_ERROR_1: *os << "GET_USAGE_INFO_ERROR_1";
|
||||
break;
|
||||
case GET_USAGE_INFO_ERROR_2: *os << "GET_USAGE_INFO_ERROR_2";
|
||||
break;
|
||||
case GET_USAGE_INFO_ERROR_3: *os << "GET_USAGE_INFO_ERROR_3";
|
||||
break;
|
||||
case GET_USAGE_INFO_ERROR_4: *os << "GET_USAGE_INFO_ERROR_4";
|
||||
break;
|
||||
case INIT_DATA_NOT_FOUND: *os << "INIT_DATA_NOT_FOUND";
|
||||
break;
|
||||
case INVALID_CRYPTO_SESSION_1: *os << "INVALID_CRYPTO_SESSION_1";
|
||||
break;
|
||||
case INVALID_CRYPTO_SESSION_2: *os << "INVALID_CRYPTO_SESSION_2";
|
||||
break;
|
||||
case INVALID_CRYPTO_SESSION_3: *os << "INVALID_CRYPTO_SESSION_3";
|
||||
break;
|
||||
case INVALID_CRYPTO_SESSION_4: *os << "INVALID_CRYPTO_SESSION_4";
|
||||
break;
|
||||
case INVALID_CRYPTO_SESSION_5: *os << "INVALID_CRYPTO_SESSION_5";
|
||||
break;
|
||||
case INVALID_DECRYPT_PARAMETERS_ENG_1: *os << "INVALID_DECRYPT_PARAMETERS_ENG_1";
|
||||
break;
|
||||
case INVALID_DECRYPT_PARAMETERS_ENG_2: *os << "INVALID_DECRYPT_PARAMETERS_ENG_2";
|
||||
break;
|
||||
case INVALID_DECRYPT_PARAMETERS_ENG_3: *os << "INVALID_DECRYPT_PARAMETERS_ENG_3";
|
||||
break;
|
||||
case INVALID_DECRYPT_PARAMETERS_ENG_4: *os << "INVALID_DECRYPT_PARAMETERS_ENG_4";
|
||||
break;
|
||||
case INVALID_DEVICE_CERTIFICATE_TYPE: *os << "INVALID_DEVICE_CERTIFICATE_TYPE";
|
||||
break;
|
||||
case INVALID_KEY_SYSTEM: *os << "INVALID_KEY_SYSTEM";
|
||||
break;
|
||||
case INVALID_LICENSE_RESPONSE: *os << "INVALID_LICENSE_RESPONSE";
|
||||
break;
|
||||
case INVALID_LICENSE_TYPE: *os << "INVALID_LICENSE_TYPE";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_1: *os << "INVALID_PARAMETERS_ENG_1";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_2: *os << "INVALID_PARAMETERS_ENG_2";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_3: *os << "INVALID_PARAMETERS_ENG_3";
|
||||
break;
|
||||
case INVALID_PARAMETERS_ENG_4: *os << "INVALID_PARAMETERS_ENG_4";
|
||||
break;
|
||||
case INVALID_PARAMETERS_LIC_1: *os << "INVALID_PARAMETERS_LIC_1";
|
||||
break;
|
||||
case INVALID_PARAMETERS_LIC_2: *os << "INVALID_PARAMETERS_LIC_2";
|
||||
break;
|
||||
case INVALID_PROVISIONING_PARAMETERS_1: *os << "INVALID_PROVISIONING_PARAMETERS_1";
|
||||
break;
|
||||
case INVALID_PROVISIONING_PARAMETERS_2: *os << "INVALID_PROVISIONING_PARAMETERS_2";
|
||||
break;
|
||||
case INVALID_PROVISIONING_REQUEST_PARAM_1: *os << "INVALID_PROVISIONING_REQUEST_PARAM_1";
|
||||
break;
|
||||
case INVALID_PROVISIONING_REQUEST_PARAM_2: *os << "INVALID_PROVISIONING_REQUEST_PARAM_2";
|
||||
break;
|
||||
case INVALID_QUERY_KEY: *os << "INVALID_QUERY_KEY";
|
||||
break;
|
||||
case INVALID_SESSION_ID: *os << "INVALID_SESSION_ID";
|
||||
break;
|
||||
case KEY_REQUEST_ERROR_1: *os << "KEY_REQUEST_ERROR_1";
|
||||
break;
|
||||
case KEY_REQUEST_ERROR_2: *os << "KEY_REQUEST_ERROR_2";
|
||||
break;
|
||||
case KEY_SIZE_ERROR: *os << "KEY_SIZE_ERROR";
|
||||
break;
|
||||
case KEYSET_ID_NOT_FOUND_1: *os << "KEYSET_ID_NOT_FOUND_1";
|
||||
break;
|
||||
case KEYSET_ID_NOT_FOUND_2: *os << "KEYSET_ID_NOT_FOUND_2";
|
||||
break;
|
||||
case KEYSET_ID_NOT_FOUND_3: *os << "KEYSET_ID_NOT_FOUND_3";
|
||||
break;
|
||||
case LICENSE_ID_NOT_FOUND: *os << "LICENSE_ID_NOT_FOUND";
|
||||
break;
|
||||
case LICENSE_PARSER_INIT_ERROR: *os << "LICENSE_PARSER_INIT_ERROR";
|
||||
break;
|
||||
case LICENSE_PARSER_NOT_INITIALIZED_1: *os << "LICENSE_PARSER_NOT_INITIALIZED_1";
|
||||
break;
|
||||
case LICENSE_PARSER_NOT_INITIALIZED_2: *os << "LICENSE_PARSER_NOT_INITIALIZED_2";
|
||||
break;
|
||||
case LICENSE_PARSER_NOT_INITIALIZED_3: *os << "LICENSE_PARSER_NOT_INITIALIZED_3";
|
||||
break;
|
||||
case LICENSE_RESPONSE_NOT_SIGNED: *os << "LICENSE_RESPONSE_NOT_SIGNED";
|
||||
break;
|
||||
break;
|
||||
case LICENSE_RESPONSE_PARSE_ERROR_1: *os << "LICENSE_RESPONSE_PARSE_ERROR_1";
|
||||
break;
|
||||
case LICENSE_RESPONSE_PARSE_ERROR_2: *os << "LICENSE_RESPONSE_PARSE_ERROR_2";
|
||||
break;
|
||||
case LICENSE_RESPONSE_PARSE_ERROR_3: *os << "LICENSE_RESPONSE_PARSE_ERROR_3";
|
||||
break;
|
||||
case LOAD_KEY_ERROR: *os << "LOAD_KEY_ERROR";
|
||||
break;
|
||||
case NO_CONTENT_KEY: *os << "NO_CONTENT_KEY";
|
||||
break;
|
||||
case REFRESH_KEYS_ERROR: *os << "REFRESH_KEYS_ERROR";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_1: *os << "RELEASE_ALL_USAGE_INFO_ERROR_1";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_2: *os << "RELEASE_ALL_USAGE_INFO_ERROR_2";
|
||||
break;
|
||||
case RELEASE_KEY_ERROR: *os << "RELEASE_KEY_ERROR";
|
||||
break;
|
||||
case RELEASE_KEY_REQUEST_ERROR: *os << "RELEASE_KEY_REQUEST_ERROR";
|
||||
break;
|
||||
case RELEASE_LICENSE_ERROR_1: *os << "RELEASE_LICENSE_ERROR_1";
|
||||
break;
|
||||
case RELEASE_LICENSE_ERROR_2: *os << "RELEASE_LICENSE_ERROR_2";
|
||||
break;
|
||||
case RELEASE_USAGE_INFO_ERROR: *os << "RELEASE_USAGE_INFO_ERROR";
|
||||
break;
|
||||
case RENEW_KEY_ERROR_1: *os << "RENEW_KEY_ERROR_1";
|
||||
break;
|
||||
case RENEW_KEY_ERROR_2: *os << "RENEW_KEY_ERROR_2";
|
||||
break;
|
||||
case RENEWAL_REQUEST_ERROR: *os << "RENEWAL_REQUEST_ERROR";
|
||||
break;
|
||||
case RESTORE_OFFLINE_LICENSE_ERROR_1: *os << "RESTORE_OFFLINE_LICENSE_ERROR_1";
|
||||
break;
|
||||
case RESTORE_OFFLINE_LICENSE_ERROR_2: *os << "RESTORE_OFFLINE_LICENSE_ERROR_2";
|
||||
break;
|
||||
case SESSION_INIT_ERROR_1: *os << "SESSION_INIT_ERROR_1";
|
||||
break;
|
||||
case SESSION_INIT_ERROR_2: *os << "SESSION_INIT_ERROR_2";
|
||||
break;
|
||||
case SESSION_INIT_GET_KEYBOX_ERROR: *os << "SESSION_INIT_GET_KEYBOX_ERROR";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_1: *os << "SESSION_NOT_FOUND_1";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_2: *os << "SESSION_NOT_FOUND_2";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_3: *os << "SESSION_NOT_FOUND_3";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_4: *os << "SESSION_NOT_FOUND_4";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_5: *os << "SESSION_NOT_FOUND_5";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_6: *os << "SESSION_NOT_FOUND_6";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_7: *os << "SESSION_NOT_FOUND_7";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_8: *os << "SESSION_NOT_FOUND_8";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_9: *os << "SESSION_NOT_FOUND_9";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_10: *os << "SESSION_NOT_FOUND_10";
|
||||
break;
|
||||
case SESSION_NOT_FOUND_FOR_DECRYPT: *os << "SESSION_NOT_FOUND_FOR_DECRYPT";
|
||||
break;
|
||||
case SESSION_KEYS_NOT_FOUND: *os << "SESSION_KEYS_NOT_FOUND";
|
||||
break;
|
||||
case SIGNATURE_NOT_FOUND: *os << "SIGNATURE_NOT_FOUND";
|
||||
break;
|
||||
case STORE_LICENSE_ERROR_1: *os << "STORE_LICENSE_ERROR_1";
|
||||
break;
|
||||
case STORE_LICENSE_ERROR_2: *os << "STORE_LICENSE_ERROR_2";
|
||||
break;
|
||||
case STORE_LICENSE_ERROR_3: *os << "STORE_LICENSE_ERROR_3";
|
||||
break;
|
||||
case STORE_USAGE_INFO_ERROR: *os << "STORE_USAGE_INFO_ERROR";
|
||||
break;
|
||||
case UNPROVISION_ERROR_1: *os << "UNPROVISION_ERROR_1";
|
||||
break;
|
||||
case UNPROVISION_ERROR_2: *os << "UNPROVISION_ERROR_2";
|
||||
break;
|
||||
case UNPROVISION_ERROR_3: *os << "UNPROVISION_ERROR_3";
|
||||
break;
|
||||
case UNPROVISION_ERROR_4: *os << "UNPROVISION_ERROR_4";
|
||||
break;
|
||||
case UNSUPPORTED_INIT_DATA: *os << "UNSUPPORTED_INIT_DATA";
|
||||
break;
|
||||
case USAGE_INFO_NOT_FOUND: *os << "USAGE_INFO_NOT_FOUND";
|
||||
break;
|
||||
default:
|
||||
*os << "Unknown CdmResponseType";
|
||||
*os << "Unknown CdmResponseType";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PrintTo(const enum CdmLicenseType& value, ::std::ostream* os) {
|
||||
switch (value) {
|
||||
case kLicenseTypeOffline: *os << "kLicenseTypeOffline";
|
||||
case kLicenseTypeOffline: *os << "kLicenseTypeOffline";
|
||||
break;
|
||||
case kLicenseTypeStreaming: *os << "kLicenseTypeStreaming";
|
||||
case kLicenseTypeStreaming: *os << "kLicenseTypeStreaming";
|
||||
break;
|
||||
case kLicenseTypeRelease: *os << "kLicenseTypeRelease";
|
||||
case kLicenseTypeRelease: *os << "kLicenseTypeRelease";
|
||||
break;
|
||||
default:
|
||||
*os << "Unknown CdmLicenseType";
|
||||
*os << "Unknown CdmLicenseType";
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
void PrintTo(const enum CdmSecurityLevel& value, ::std::ostream* os) {
|
||||
switch (value) {
|
||||
case kSecurityLevelUninitialized: *os << "kSecurityLevelUninitialized";
|
||||
case kSecurityLevelUninitialized: *os << "kSecurityLevelUninitialized";
|
||||
break;
|
||||
case kSecurityLevelL1: *os << "kSecurityLevelL1";
|
||||
case kSecurityLevelL1: *os << "kSecurityLevelL1";
|
||||
break;
|
||||
case kSecurityLevelL2: *os << "kSecurityLevelL2";
|
||||
case kSecurityLevelL2: *os << "kSecurityLevelL2";
|
||||
break;
|
||||
case kSecurityLevelL3: *os << "kSecurityLevelL3";
|
||||
case kSecurityLevelL3: *os << "kSecurityLevelL3";
|
||||
break;
|
||||
case kSecurityLevelUnknown: *os << "kSecurityLevelUnknown";
|
||||
case kSecurityLevelUnknown: *os << "kSecurityLevelUnknown";
|
||||
break;
|
||||
default:
|
||||
*os << "Unknown CdmSecurityLevel";
|
||||
*os << "Unknown CdmSecurityLevel";
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
void PrintTo(const enum CdmCertificateType& value, ::std::ostream* os) {
|
||||
switch (value) {
|
||||
case kCertificateWidevine: *os << "kCertificateWidevine";
|
||||
case kCertificateWidevine: *os << "kCertificateWidevine";
|
||||
break;
|
||||
case kCertificateX509: *os << "kCertificateX509";
|
||||
case kCertificateX509: *os << "kCertificateX509";
|
||||
break;
|
||||
default:
|
||||
*os << "Unknown CdmCertificateType";
|
||||
*os << "Unknown CdmCertificateType";
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user