diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index 26267110..5e71f747 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -54,6 +54,12 @@ CdmSession::CdmSession(FileSystem* file_system, } CdmSession::~CdmSession() { + if (usage_support_type_ == kUsageEntrySupport && + has_provider_session_token() && + usage_table_header_ != NULL) { + UpdateUsageEntryInformation(); + } + if (!key_set_id_.empty()) { // Unreserve the license ID. file_handle_->UnreserveLicenseId(key_set_id_); diff --git a/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp b/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp index cc9ac0d1..487ee7fc 100644 --- a/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp +++ b/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp @@ -15,6 +15,8 @@ namespace { +const std::string kKeyBuildInfo = "build_info"; + // URL for Google Provisioning Server. // The provisioning server supplies the certificate that is needed // to communicate with the License Server. @@ -235,6 +237,15 @@ CdmResponseType CertificateProvisioning::GetProvisioningRequest( return CLIENT_IDENTIFICATION_TOKEN_ERROR_2; } client_id->set_token(token); + + std::string value; + if (Properties::GetBuildInfo(&value)) { + ClientIdentification_NameValue* client_info; + + client_info = client_id->add_client_info(); + client_info->set_name(kKeyBuildInfo); + client_info->set_value(value); + } } uint32_t nonce; diff --git a/libwvdrmengine/cdm/core/src/client_identification.cpp b/libwvdrmengine/cdm/core/src/client_identification.cpp index 32d234b6..16755b69 100644 --- a/libwvdrmengine/cdm/core/src/client_identification.cpp +++ b/libwvdrmengine/cdm/core/src/client_identification.cpp @@ -133,15 +133,6 @@ CdmResponseType ClientIdentification::Prepare( client_info->set_name(kKeyBuildInfo); client_info->set_value(value); } - if (!device_id_.empty()) { - client_info = client_id->add_client_info(); - client_info->set_name(kKeyDeviceId); - client_info->set_value(b2a_hex(device_id_)); - } else if (crypto_session_->GetInternalDeviceUniqueId(&value)) { - client_info = client_id->add_client_info(); - client_info->set_name(kKeyDeviceId); - client_info->set_value(value); - } if (Properties::GetWVCdmVersion(&value)) { client_info = client_id->add_client_info(); client_info->set_name(kKeyWvCdmVersion); diff --git a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp index ab28491c..04f215e3 100644 --- a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp @@ -338,11 +338,12 @@ TEST_F(CdmSessionTest, UpdateUsageEntry) { // Set up mocks and expectations for the UpdateUsageEntryInformation call. EXPECT_CALL(*crypto_session_, GetUsageSupportType(_)) - .WillOnce(DoAll(SetArgPointee<0>(kUsageEntrySupport), Return(NO_ERROR))); + .WillRepeatedly(DoAll( + SetArgPointee<0>(kUsageEntrySupport), Return(NO_ERROR))); EXPECT_CALL(*license_parser_, provider_session_token()) - .WillOnce(Return("Mock provider session token")); + .WillRepeatedly(Return("Mock provider session token")); EXPECT_CALL(usage_table_header_, UpdateEntry(NotNull(), NotNull())) - .WillOnce(Return(NO_ERROR)); + .WillRepeatedly(Return(NO_ERROR)); EXPECT_EQ(NO_ERROR, cdm_session_->Init(NULL)); EXPECT_EQ(kUsageEntrySupport, cdm_session_->get_usage_support_type()) diff --git a/libwvdrmengine/docs/Widevine_Level1_Provisioning_Models.pdf b/libwvdrmengine/docs/Widevine_Level1_Provisioning_Models.pdf index 637c3388..1b9e0117 100644 Binary files a/libwvdrmengine/docs/Widevine_Level1_Provisioning_Models.pdf and b/libwvdrmengine/docs/Widevine_Level1_Provisioning_Models.pdf differ