// Copyright 2013 Google Inc. All Rights Reserved. #ifndef WVCDM_CORE_CDM_ENGINE_H_ #define WVCDM_CORE_CDM_ENGINE_H_ #include "certificate_provisioning.h" #include "oemcrypto_adapter.h" #include "wv_cdm_types.h" namespace wvcdm { class CdmClientPropertySet; class CdmSession; class CryptoEngine; class WvCdmEventListener; typedef std::map CdmSessionMap; typedef std::map CdmReleaseKeySetMap; class CdmEngine { public: CdmEngine(); virtual ~CdmEngine(); // Session related methods CdmResponseType OpenSession(const CdmKeySystem& key_system, const CdmClientPropertySet* property_set, CdmSessionId* session_id); CdmResponseType CloseSession(const CdmSessionId& session_id); CdmResponseType OpenKeySetSession(const CdmKeySetId& key_set_id); CdmResponseType CloseKeySetSession(const CdmKeySetId& key_set_id); // License related methods // Construct a valid license request CdmResponseType GenerateKeyRequest(const CdmSessionId& session_id, const CdmKeySetId& key_set_id, const CdmInitData& init_data, const CdmLicenseType license_type, CdmAppParameterMap& app_parameters, CdmKeyMessage* key_request, std::string* server_url); // Accept license response and extract key info. CdmResponseType AddKey(const CdmSessionId& session_id, const CdmKeyResponse& key_data, CdmKeySetId* key_set_id); CdmResponseType RestoreKey(const CdmSessionId& session_id, const CdmKeySetId& key_set_id); CdmResponseType CancelKeyRequest(const CdmSessionId& session_id); // Construct valid renewal request for the current session keys. CdmResponseType GenerateRenewalRequest(const CdmSessionId& session_id, CdmKeyMessage* key_request, std::string* server_url); // Accept renewal response and update key info. CdmResponseType RenewKey(const CdmSessionId& session_id, const CdmKeyResponse& key_data); // Query system information CdmResponseType QueryStatus(CdmQueryMap* info); // Query session information virtual CdmResponseType QuerySessionStatus(const CdmSessionId& session_id, CdmQueryMap* key_info); // Query license information CdmResponseType QueryKeyStatus(const CdmSessionId& session_id, CdmQueryMap* key_info); // Query seesion control information CdmResponseType QueryKeyControlInfo(const CdmSessionId& session_id, CdmQueryMap* key_info); // Provisioning related methods CdmResponseType GetProvisioningRequest(CdmProvisioningRequest* request, std::string* default_url); CdmResponseType HandleProvisioningResponse(CdmProvisioningResponse& response); // Decryption and key related methods // Accept encrypted buffer and return decrypted data. CdmResponseType Decrypt(const CdmSessionId& session_id, const CdmDecryptionParameters& parameters); // Is the key known to any session? bool IsKeyLoaded(const KeyId& key_id); bool FindSessionForKey(const KeyId& key_id, CdmSessionId* sessionId); // Event listener related methods bool AttachEventListener(const CdmSessionId& session_id, WvCdmEventListener* listener); bool DetachEventListener(const CdmSessionId& session_id, WvCdmEventListener* listener); // Parse a blob of multiple concatenated PSSH atoms to extract the first // widevine pssh static bool ExtractWidevinePssh(const CdmInitData& init_data, CdmInitData* output); // Timer expiration method void OnTimerEvent(); private: // private methods bool ValidateKeySystem(const CdmKeySystem& key_system); void OnKeyReleaseEvent(const CdmKeySetId& key_set_id); // instance variables CdmSessionMap sessions_; CdmReleaseKeySetMap release_key_sets_; CertificateProvisioning cert_provisioning_; SecurityLevel cert_provisioning_requested_security_level_; CORE_DISALLOW_COPY_AND_ASSIGN(CdmEngine); }; } // namespace wvcdm #endif // WVCDM_CORE_CDM_ENGINE_H_