blob: 6a6bd1f8bba56060030a70e4c001ae25b3dc3d23 [file] [log] [blame]
/*
* Copyright (C) 2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#if ENABLE(ENCRYPTED_MEDIA) && HAVE(AVCONTENTKEYSESSION)
#include "CDMInstance.h"
#include "CDMInstanceSession.h"
#include <wtf/Function.h>
#include <wtf/HashMap.h>
#include <wtf/RetainPtr.h>
#include <wtf/text/WTFString.h>
OBJC_CLASS AVContentKeyRequest;
OBJC_CLASS AVContentKeySession;
OBJC_CLASS NSData;
OBJC_CLASS NSError;
OBJC_CLASS NSURL;
OBJC_CLASS WebCoreFPSContentKeySessionDelegate;
namespace WebCore {
class CDMInstanceSessionFairPlayStreamingAVFObjC;
struct CDMMediaCapability;
class CDMInstanceFairPlayStreamingAVFObjC final : public CDMInstance, public CanMakeWeakPtr<CDMInstanceFairPlayStreamingAVFObjC> {
public:
virtual ~CDMInstanceFairPlayStreamingAVFObjC() = default;
static bool supportsPersistableState();
static bool supportsPersistentKeys();
static bool supportsMediaCapability(const CDMMediaCapability&);
static bool mimeTypeIsPlayable(const String&);
ImplementationType implementationType() const final { return ImplementationType::FairPlayStreaming; }
SuccessValue initializeWithConfiguration(const CDMKeySystemConfiguration&) final;
SuccessValue setDistinctiveIdentifiersAllowed(bool) final;
SuccessValue setPersistentStateAllowed(bool) final;
SuccessValue setServerCertificate(Ref<SharedBuffer>&&) final;
SuccessValue setStorageDirectory(const String&) final;
RefPtr<CDMInstanceSession> createSession() final;
RefPtr<ProxyCDM> proxyCDM() const final { return nullptr; }
const String& keySystem() const final;
NSURL *storageURL() const { return m_storageURL.get(); }
bool persistentStateAllowed() const { return m_persistentStateAllowed; }
SharedBuffer* serverCertificate() const { return m_serverCertificate.get(); }
void outputObscuredDueToInsufficientExternalProtectionChanged(bool);
using Keys = Vector<Ref<SharedBuffer>>;
CDMInstanceSessionFairPlayStreamingAVFObjC* sessionForKeyIDs(const Keys&) const;
private:
RefPtr<SharedBuffer> m_serverCertificate;
bool m_persistentStateAllowed { true };
RetainPtr<NSURL> m_storageURL;
Vector<WeakPtr<CDMInstanceSessionFairPlayStreamingAVFObjC>> m_sessions;
};
class CDMInstanceSessionFairPlayStreamingAVFObjC final : public CDMInstanceSession, public CanMakeWeakPtr<CDMInstanceSessionFairPlayStreamingAVFObjC> {
public:
CDMInstanceSessionFairPlayStreamingAVFObjC(Ref<CDMInstanceFairPlayStreamingAVFObjC>&&);
virtual ~CDMInstanceSessionFairPlayStreamingAVFObjC();
// CDMInstanceSession
void requestLicense(LicenseType, const AtomString& initDataType, Ref<SharedBuffer>&& initData, LicenseCallback&&) final;
void updateLicense(const String&, LicenseType, const SharedBuffer&, LicenseUpdateCallback&&) final;
void loadSession(LicenseType, const String&, const String&, LoadSessionCallback&&) final;
void closeSession(const String&, CloseSessionCallback&&) final;
void removeSessionData(const String&, LicenseType, RemoveSessionDataCallback&&) final;
void storeRecordOfKeyUsage(const String&) final;
void setClient(WeakPtr<CDMInstanceSessionClient>&&) final;
void clearClient() final;
void didProvideRequest(AVContentKeyRequest*);
void didProvideRequests(Vector<RetainPtr<AVContentKeyRequest>>&&);
void didProvideRenewingRequest(AVContentKeyRequest*);
void didProvidePersistableRequest(AVContentKeyRequest*);
void didFailToProvideRequest(AVContentKeyRequest*, NSError*);
void requestDidSucceed(AVContentKeyRequest*);
bool shouldRetryRequestForReason(AVContentKeyRequest*, NSString*);
void sessionIdentifierChanged(NSData*);
void outputObscuredDueToInsufficientExternalProtectionChanged(bool);
using Keys = CDMInstanceFairPlayStreamingAVFObjC::Keys;
Keys keyIDs();
AVContentKeySession* contentKeySession() { return m_session.get(); }
using Request = Vector<RetainPtr<AVContentKeyRequest>>;
private:
AVContentKeySession* ensureSession();
bool isLicenseTypeSupported(LicenseType) const;
KeyStatusVector keyStatuses() const;
void nextRequest();
AVContentKeyRequest* lastKeyRequest() const;
Ref<CDMInstanceFairPlayStreamingAVFObjC> m_instance;
RetainPtr<AVContentKeySession> m_session;
Request m_currentRequest;
RetainPtr<WebCoreFPSContentKeySessionDelegate> m_delegate;
Vector<RetainPtr<NSData>> m_expiredSessions;
WeakPtr<CDMInstanceSessionClient> m_client;
String m_sessionId;
bool m_outputObscured { false };
class UpdateResponseCollector;
std::unique_ptr<UpdateResponseCollector> m_updateResponseCollector;
Vector<Request> m_pendingRequests;
Vector<Request> m_requests;
LicenseCallback m_requestLicenseCallback;
LicenseUpdateCallback m_updateLicenseCallback;
CloseSessionCallback m_closeSessionCallback;
RemoveSessionDataCallback m_removeSessionDataCallback;
};
}
SPECIALIZE_TYPE_TRAITS_CDM_INSTANCE(WebCore::CDMInstanceFairPlayStreamingAVFObjC, WebCore::CDMInstance::ImplementationType::FairPlayStreaming)
#endif // ENABLE(ENCRYPTED_MEDIA) && HAVE(AVCONTENTKEYSESSION)