Corrections when releasing usage information
[ Merge of http://go/wvgerrit/32940 ] Releasing usage entries may cause other entries to be moved or information updated. Instead of retrieving all entries once and trying to release them, refetch them after each release. Test: WV Unit/Integration tests Test: GTS tests (failures seen, but no additional failures due to this CL) Test: Playback testing using play movies and netflix. Bug: 65372189 Change-Id: I700e60834c7f711c9146dfd720f9cac014981311
This commit is contained in:
@@ -312,6 +312,7 @@ enum CdmResponseType {
|
||||
PARSE_RESPONSE_ERROR_2,
|
||||
PARSE_RESPONSE_ERROR_3, /* 270 */
|
||||
PARSE_RESPONSE_ERROR_4,
|
||||
RELEASE_ALL_USAGE_INFO_ERROR_6,
|
||||
};
|
||||
|
||||
enum CdmKeyStatus {
|
||||
|
||||
@@ -1135,19 +1135,32 @@ CdmResponseType CdmEngine::ReleaseAllUsageInfo(const std::string& app_id) {
|
||||
|
||||
if (usage_session_->get_usage_support_type() == kUsageEntrySupport) {
|
||||
std::vector<DeviceFiles::CdmUsageData> usage_data;
|
||||
if (!handle.RetrieveUsageInfo(
|
||||
DeviceFiles::GetUsageInfoFileName(app_id),
|
||||
&usage_data)) {
|
||||
status = RELEASE_ALL_USAGE_INFO_ERROR_4;
|
||||
} else {
|
||||
for (size_t k = 0; k < usage_data.size(); ++k) {
|
||||
CdmResponseType status2 =
|
||||
usage_session_->DeleteUsageEntry(
|
||||
usage_data[k].usage_entry_number);
|
||||
if (status == NO_ERROR && status2 != NO_ERROR)
|
||||
status = status2;
|
||||
// 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)) {
|
||||
status = RELEASE_ALL_USAGE_INFO_ERROR_4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (usage_data.empty()) break;
|
||||
|
||||
status = usage_session_->DeleteUsageEntry(
|
||||
usage_data[0].usage_entry_number);
|
||||
|
||||
if (status != NO_ERROR) break;
|
||||
|
||||
if (!handle.DeleteUsageInfo(
|
||||
DeviceFiles::GetUsageInfoFileName(app_id),
|
||||
usage_data[0].provider_session_token)) {
|
||||
status = RELEASE_ALL_USAGE_INFO_ERROR_6;
|
||||
break;
|
||||
}
|
||||
} while (status == NO_ERROR && !usage_data.empty());
|
||||
|
||||
std::vector<std::string> provider_session_tokens;
|
||||
if (!handle.DeleteAllUsageInfoForApp(
|
||||
DeviceFiles::GetUsageInfoFileName(app_id),
|
||||
|
||||
@@ -685,8 +685,7 @@ CdmResponseType CdmSession::ReleaseKey(const CdmKeyResponse& key_response) {
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::DeleteUsageEntry(uint32_t usage_entry_number) {
|
||||
if (usage_support_type_ != kUsageEntrySupport ||
|
||||
!has_provider_session_token()) {
|
||||
if (usage_support_type_ != kUsageEntrySupport) {
|
||||
LOGE("CdmSession::DeleteUsageEntry: Unexpected usage type supported: %d",
|
||||
usage_support_type_);
|
||||
return INCORRECT_USAGE_SUPPORT_TYPE_1;
|
||||
@@ -885,8 +884,8 @@ CdmResponseType CdmSession::UpdateUsageTableInformation() {
|
||||
|
||||
CdmResponseType CdmSession::UpdateUsageEntryInformation() {
|
||||
if (usage_support_type_ != kUsageEntrySupport ||
|
||||
!has_provider_session_token() &&
|
||||
usage_table_header_ != nullptr) {
|
||||
!has_provider_session_token() ||
|
||||
usage_table_header_ == nullptr) {
|
||||
LOGE("CdmSession::UpdateUsageEntryInformation: Unexpected usage type "
|
||||
"supported: %d", usage_support_type_);
|
||||
return INCORRECT_USAGE_SUPPORT_TYPE_2;
|
||||
|
||||
@@ -560,6 +560,9 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_5:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_5";
|
||||
break;
|
||||
case RELEASE_ALL_USAGE_INFO_ERROR_6:
|
||||
*os << "RELEASE_ALL_USAGE_INFO_ERROR_6";
|
||||
break;
|
||||
case RELEASE_USAGE_INFO_FAILED: *os << "RELEASE_USAGE_INFO_FAILED";
|
||||
break;
|
||||
case INCORRECT_USAGE_SUPPORT_TYPE_1:
|
||||
|
||||
@@ -274,10 +274,11 @@ enum {
|
||||
kParseResponseError2 = ERROR_DRM_VENDOR_MIN + 261,
|
||||
kParseResponseError3 = ERROR_DRM_VENDOR_MIN + 262,
|
||||
kParseResponseError4 = ERROR_DRM_VENDOR_MIN + 263,
|
||||
kReleaseAllUsageInfoError6 = ERROR_DRM_VENDOR_MIN + 264,
|
||||
|
||||
// This should always follow the last error code.
|
||||
// The offset value should be updated each time a new error code is added.
|
||||
kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 263,
|
||||
kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 264,
|
||||
|
||||
// Used by crypto test mode
|
||||
kErrorTestMode = ERROR_DRM_VENDOR_MAX,
|
||||
|
||||
@@ -499,6 +499,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) {
|
||||
return kReleaseAllUsageInfoError4;
|
||||
case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_5:
|
||||
return kReleaseAllUsageInfoError5;
|
||||
case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_6:
|
||||
return kReleaseAllUsageInfoError6;
|
||||
case wvcdm::RELEASE_USAGE_INFO_FAILED:
|
||||
return android::ERROR_DRM_TAMPER_DETECTED;
|
||||
case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_1:
|
||||
|
||||
@@ -286,6 +286,7 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) {
|
||||
case wvcdm::USAGE_INVALID_LOAD_ENTRY:
|
||||
case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_4:
|
||||
case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_5:
|
||||
case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_6:
|
||||
case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_1:
|
||||
case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_2:
|
||||
case wvcdm::NO_USAGE_ENTRIES:
|
||||
|
||||
Reference in New Issue
Block a user