// Copyright 2013 Google Inc. All Rights Reserved. #ifndef CDM_BASE_CDM_ENGINE_H_ #define CDM_BASE_CDM_ENGINE_H_ #include "timer.h" #include "wv_cdm_types.h" namespace wvcdm { class CdmSession; class WvCdmEventListener; typedef std::map CdmSessionMap; class CdmEngine : public TimerHandler { public: CdmEngine() {} ~CdmEngine(); // Session related methods CdmResponseType OpenSession(const CdmKeySystem& key_system, CdmSessionId* session_id); CdmResponseType CloseSession(CdmSessionId& session_id); // License related methods // Construct a valid license request CdmResponseType GenerateKeyRequest(const CdmSessionId& session_id, bool is_key_system_present, const CdmKeySystem& key_system, const CdmInitData& init_data, const CdmLicenseType license_type, CdmAppParameterMap& app_parameters, CdmKeyMessage* key_request); // Accept license response and extract key info. CdmResponseType AddKey(const CdmSessionId& session_id, bool is_key_system_init_data_present, const CdmKeySystem& key_system, const CdmInitData& init_data, const CdmKeyResponse& key_data); // Cancel session and unload keys. CdmResponseType CancelKeyRequest(const CdmSessionId& session_id, bool is_key_system_present, const CdmKeySystem& key_system); // Construct valid renewal request for the current session keys. CdmResponseType GenerateRenewalRequest(const CdmSessionId& session_id, bool is_key_system_init_data_present, const CdmKeySystem& key_system, const CdmInitData& init_data, CdmKeyMessage* key_request); // Accept renewal response and update key info. CdmResponseType RenewKey(const CdmSessionId& session_id, bool is_key_system_init_data_present, const CdmKeySystem& key_system, const CdmInitData& init_data, const CdmKeyResponse& key_data); // Query system information CdmResponseType QueryStatus(CdmQueryMap* info); // Query license information CdmResponseType QueryKeyStatus(const CdmSessionId& session_id, CdmQueryMap* key_info); // Provisioning related methods CdmResponseType GetProvisioningRequest(CdmProvisioningRequest* request, std::string* default_url); CdmResponseType HandleProvisioningResponse(CdmProvisioningResponse& response); // Secure stop related methods CdmResponseType GetSecureStops(CdmSecureStops* secure_stops); CdmResponseType ReleaseSecureStops(const CdmSecureStopReleaseMessage& message); // Decryption and key related methods // Accept encrypted buffer and return decrypted data. CdmResponseType Decrypt(const CdmSessionId& session_id, bool is_encrypted, const KeyId& key_id, const uint8_t* encrypt_buffer, size_t encrypt_length, const std::vector& iv, size_t block_offset, void* decrypt_buffer, bool is_video); // Is the key known to any session? bool IsKeyValid(const KeyId& key_id); // Event listener related methods bool AttachEventListener(CdmSessionId& session_id, WvCdmEventListener* listener); bool DetachEventListener(CdmSessionId& session_id, WvCdmEventListener* listener); private: // private methods bool ValidateKeySystem(const CdmKeySystem& key_system); // Cancel all sessions bool CancelSessions(); // Parse a blob of multiple concatenated PSSH atoms to extract the first // widevine pssh // TODO(gmorgan): This should be done by the user of this class. bool ExtractWidevinePssh(const CdmInitData& init_data, CdmInitData* output); // timer related methods to drive policy decisions void EnablePolicyTimer(); void DisablePolicyTimer(); virtual void OnTimerEvent(); // instance variables CdmSessionMap sessions_; // policy timer Timer policy_timer_; CORE_DISALLOW_COPY_AND_ASSIGN(CdmEngine); }; } // namespace wvcdm #endif // CDM_BASE_CDM_ENGINE_H_