diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 63a3c611..bcd11f21 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -1101,24 +1101,7 @@ CdmResponseType CdmEngine::DeleteUsageRecord(const std::string& app_id, return DELETE_USAGE_ERROR_2; } - // Got provider token. Remove from OEMCrypto. - std::unique_ptr crypto_session( - CryptoSession::MakeCryptoSession(metrics_->GetCryptoMetrics())); - CdmResponseType status = crypto_session->Open( - security_level == kSecurityLevelL3 ? kLevel3 : kLevelDefault); - if (status == NO_ERROR) { - status = crypto_session->DeleteUsageInformation(provider_session_token); - } - if (status != NO_ERROR) { - LOGE("CdmEngine::DeleteUsageRecord: OEMCrypto failure"); - } - - // Remove from file system. - if (!handle.DeleteUsageInfo(app_id, provider_session_token)) { - LOGE("CdmEngine::DeleteUsageRecord: file system failure"); - return DELETE_USAGE_ERROR_3; - } - return status; + return RemoveUsageInfo(app_id, provider_session_token); } CdmResponseType CdmEngine::GetOfflineLicenseState( @@ -1392,129 +1375,98 @@ CdmResponseType CdmEngine::GetUsageInfo(const std::string& app_id, } CdmResponseType CdmEngine::RemoveAllUsageInfo( - const std::string& app_id, CdmSecurityLevel security_level) { + const std::string& app_id, CdmSecurityLevel cdm_security_level) { LOGI("CdmEngine::RemoveAllUsageInfo: %s, security level: %d", - app_id.c_str(), security_level); - DeviceFiles handle(file_system_); - if (!handle.Init(security_level)) { - LOGE("CdmEngine::RemoveAllUsageInfo: unable to initialize device files"); - return REMOVE_ALL_USAGE_INFO_ERROR_6; - } - std::vector provider_session_tokens; - if (!handle.DeleteAllUsageInfoForApp(app_id, &provider_session_tokens)) { - LOGE("CdmEngine::RemoveAllUsageInfo: failed to delete usage records"); - return REMOVE_ALL_USAGE_INFO_ERROR_7; - } - - if (provider_session_tokens.size() == 0UL) { - return NO_ERROR; - } - - // Got at least one provider token. Remove from OEMCrypto. - std::unique_ptr crypto_session( - CryptoSession::MakeCryptoSession(metrics_->GetCryptoMetrics())); - CdmResponseType status = crypto_session->Open( - security_level == kSecurityLevelL3 ? kLevel3 : kLevelDefault); - if (status == NO_ERROR) { - status = crypto_session-> - DeleteMultipleUsageInformation(provider_session_tokens); - } - if (status != NO_ERROR) { - LOGE("CdmEngine::RemoveAllUsageInfo: CryptoSession failure"); - } - return status; -} - -CdmResponseType CdmEngine::RemoveAllUsageInfo(const std::string& app_id) { - LOGI("CdmEngine::RemoveAllUsageInfo: %s", app_id.c_str()); - if (NULL == usage_property_set_.get()) { + app_id.c_str(), cdm_security_level); + if (usage_property_set_.get() == nullptr) { usage_property_set_.reset(new UsagePropertySet()); } usage_property_set_->set_app_id(app_id); CdmResponseType status = NO_ERROR; - for (int j = kSecurityLevelL1; j < kSecurityLevelUnknown; ++j) { - DeviceFiles handle(file_system_); - if (handle.Init(static_cast(j))) { - SecurityLevel security_level = - static_cast(j) == kSecurityLevelL3 - ? kLevel3 - : kLevelDefault; - usage_property_set_->set_security_level(security_level); - usage_session_.reset(new CdmSession(file_system_, metrics_->AddSession())); - usage_session_->Init(usage_property_set_.get()); + DeviceFiles handle(file_system_); + if (handle.Init(cdm_security_level)) { + SecurityLevel security_level = + cdm_security_level == kSecurityLevelL3 ? kLevel3 : kLevelDefault; + usage_property_set_->set_security_level(security_level); + usage_session_.reset(new CdmSession(file_system_, metrics_->AddSession())); + usage_session_->Init(usage_property_set_.get()); - switch (usage_session_->get_usage_support_type()) { - case kUsageEntrySupport: { - std::vector usage_data; - // Retrieve all usage information but delete only one before - // refetching. This is because deleting the usage entry - // might cause other entries to be shifted and information updated. - do { - if (!handle.RetrieveUsageInfo( - DeviceFiles::GetUsageInfoFileName(app_id), - &usage_data)) { - LOGW("CdmEngine::RemoveAllUsageInfo: failed to retrieve usage info"); - break; - } - - if (usage_data.empty()) break; - - CdmResponseType res = usage_session_->DeleteUsageEntry( - usage_data[0].usage_entry_number); - - if (res != NO_ERROR) { - LOGW("CdmEngine::RemoveAllUsageInfo: failed to delete usage " - "entry: error: %d", res); - break; - } - - if (!handle.DeleteUsageInfo( - DeviceFiles::GetUsageInfoFileName(app_id), - usage_data[0].provider_session_token)) { - LOGW("CdmEngine::RemoveAllUsageInfo: failed to delete usage " - "info"); - break; - } - } while (!usage_data.empty()); - - std::vector provider_session_tokens; - if (!handle.DeleteAllUsageInfoForApp( + switch (usage_session_->get_usage_support_type()) { + case kUsageEntrySupport: { + std::vector usage_data; + // Retrieve all usage information but delete only one before + // refetching. This is because deleting the usage entry + // might cause other entries to be shifted and information updated. + do { + if (!handle.RetrieveUsageInfo( DeviceFiles::GetUsageInfoFileName(app_id), - &provider_session_tokens)) { - status = REMOVE_ALL_USAGE_INFO_ERROR_5; + &usage_data)) { + LOGW("CdmEngine::RemoveAllUsageInfo: failed to retrieve usage info"); + break; } - break; - } - case kUsageTableSupport: { - std::vector provider_session_tokens; - if (!handle.DeleteAllUsageInfoForApp( + + if (usage_data.empty()) break; + + CdmResponseType res = usage_session_->DeleteUsageEntry( + usage_data[0].usage_entry_number); + + if (res != NO_ERROR) { + LOGW("CdmEngine::RemoveAllUsageInfo: failed to delete usage " + "entry: error: %d", res); + break; + } + + if (!handle.DeleteUsageInfo( DeviceFiles::GetUsageInfoFileName(app_id), - &provider_session_tokens)) { - LOGE("CdmEngine::RemoveAllUsageInfo: failed to delete %d secure" - "stops", j); - status = REMOVE_ALL_USAGE_INFO_ERROR_1; - } else { - CdmResponseType status2 = usage_session_-> - DeleteMultipleUsageInformation(provider_session_tokens); - if (status2 != NO_ERROR) status = status2; + usage_data[0].provider_session_token)) { + LOGW("CdmEngine::RemoveAllUsageInfo: failed to delete usage " + "info"); + break; } - break; + } while (!usage_data.empty()); + + std::vector provider_session_tokens; + if (!handle.DeleteAllUsageInfoForApp( + DeviceFiles::GetUsageInfoFileName(app_id), + &provider_session_tokens)) { + status = REMOVE_ALL_USAGE_INFO_ERROR_5; } - default: - // Ignore - break; + break; } - } else { - LOGE("CdmEngine::RemoveAllUsageInfo: failed to initialize L%d device" - "files", j); - status = REMOVE_ALL_USAGE_INFO_ERROR_2; + case kUsageTableSupport: { + std::vector provider_session_tokens; + if (!handle.DeleteAllUsageInfoForApp( + DeviceFiles::GetUsageInfoFileName(app_id), + &provider_session_tokens)) { + LOGE("CdmEngine::RemoveAllUsageInfo: failed to delete %d secure" + "stops", cdm_security_level); + status = REMOVE_ALL_USAGE_INFO_ERROR_1; + } else { + CdmResponseType status2 = usage_session_-> + DeleteMultipleUsageInformation(provider_session_tokens); + if (status2 != NO_ERROR) status = status2; + } + break; + } + default: + // Ignore + break; } } usage_session_.reset(NULL); return status; } +CdmResponseType CdmEngine::RemoveAllUsageInfo(const std::string& app_id) { + LOGI("CdmEngine::RemoveAllUsageInfo: %s", app_id.c_str()); + CdmResponseType status_l1, status_l3; + status_l1 = status_l3 = NO_ERROR; + status_l1 = RemoveAllUsageInfo(app_id, kSecurityLevelL1); + status_l3 = RemoveAllUsageInfo(app_id, kSecurityLevelL3); + return (status_l3 == NO_ERROR) ? status_l3 : status_l1; +} + CdmResponseType CdmEngine::RemoveUsageInfo( const std::string& app_id, const CdmSecureStopId& provider_session_token) { @@ -1656,6 +1608,7 @@ CdmResponseType CdmEngine::LoadUsageSession(const CdmKeySetId& key_set_id, } int error_detail = NO_ERROR; + usage_data.key_set_id = key_set_id; CdmResponseType status = session->RestoreUsageSession(usage_data, &error_detail); session->GetMetrics()->cdm_session_restore_usage_session_.Increment(