1791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang/*
2791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * Copyright (C) 2017 The Android Open Source Project
3791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang *
4791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * you may not use this file except in compliance with the License.
6791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * You may obtain a copy of the License at
7791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang *
8791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang *
10791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * Unless required by applicable law or agreed to in writing, software
11791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * See the License for the specific language governing permissions and
14791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * limitations under the License.
15791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang */
16791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
17791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang//#define LOG_NDEBUG 0
18791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#define LOG_TAG "ClearKeySessionLibrary"
19791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <utils/Log.h>
20791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
21791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <media/stagefright/foundation/ABuffer.h>
22791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <media/stagefright/foundation/ADebug.h>
23791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
24791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include "ClearKeySessionLibrary.h"
25791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
26791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangnamespace android {
27791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangnamespace clearkeycas {
28791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
29791a1a206b56be8601a6fffd2614926e67d64790Chong ZhangMutex ClearKeySessionLibrary::sSingletonLock;
30791a1a206b56be8601a6fffd2614926e67d64790Chong ZhangClearKeySessionLibrary* ClearKeySessionLibrary::sSingleton = NULL;
31791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
32a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong ZhangClearKeyCasSession::ClearKeyCasSession(CasPlugin *plugin)
33a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang    : mPlugin(plugin) {
34791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    mKeyInfo[0].valid = mKeyInfo[1].valid = false;
35791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}
36791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
37791a1a206b56be8601a6fffd2614926e67d64790Chong ZhangClearKeyCasSession::~ClearKeyCasSession() {
38791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}
39791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
40791a1a206b56be8601a6fffd2614926e67d64790Chong ZhangClearKeySessionLibrary* ClearKeySessionLibrary::get() {
41791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    Mutex::Autolock lock(sSingletonLock);
42791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
43791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    if (sSingleton == NULL) {
44791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang        ALOGV("Instantiating Session Library Singleton.");
45791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang        sSingleton = new ClearKeySessionLibrary();
46791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    }
47791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
48791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    return sSingleton;
49791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}
50791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
51791a1a206b56be8601a6fffd2614926e67d64790Chong ZhangClearKeySessionLibrary::ClearKeySessionLibrary() : mNextSessionId(1) {}
52791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
53791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangstatus_t ClearKeySessionLibrary::addSession(
54a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang        CasPlugin *plugin, CasSessionId *sessionId) {
55791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    CHECK(sessionId);
56791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
57791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    Mutex::Autolock lock(mSessionsLock);
58791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
59a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang    sp<ClearKeyCasSession> session = new ClearKeyCasSession(plugin);
60791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
61791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    uint8_t *byteArray = (uint8_t *) &mNextSessionId;
62791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    sessionId->push_back(byteArray[3]);
63791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    sessionId->push_back(byteArray[2]);
64791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    sessionId->push_back(byteArray[1]);
65791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    sessionId->push_back(byteArray[0]);
66791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    mNextSessionId++;
67791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
68791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    mIDToSessionMap.add(*sessionId, session);
69791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    return OK;
70791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}
71791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
72791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangsp<ClearKeyCasSession> ClearKeySessionLibrary::findSession(
73791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang        const CasSessionId& sessionId) {
74791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    Mutex::Autolock lock(mSessionsLock);
75791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
76791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    ssize_t index = mIDToSessionMap.indexOfKey(sessionId);
77791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    if (index < 0) {
78791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang        return NULL;
79791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    }
80791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    return mIDToSessionMap.valueFor(sessionId);
81791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}
82791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
83791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangvoid ClearKeySessionLibrary::destroySession(const CasSessionId& sessionId) {
84791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    Mutex::Autolock lock(mSessionsLock);
85791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
86791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    ssize_t index = mIDToSessionMap.indexOfKey(sessionId);
87791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    if (index < 0) {
88791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang        return;
89791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    }
90791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
91791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    sp<ClearKeyCasSession> session = mIDToSessionMap.valueAt(index);
92791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    mIDToSessionMap.removeItemsAt(index);
93791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}
94791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
95791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangvoid ClearKeySessionLibrary::destroyPlugin(CasPlugin *plugin) {
96791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    Mutex::Autolock lock(mSessionsLock);
97791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
98a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang    for (ssize_t index = mIDToSessionMap.size() - 1; index >= 0; index--) {
99a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang        sp<ClearKeyCasSession> session = mIDToSessionMap.valueAt(index);
100a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang        if (session->getPlugin() == plugin) {
101a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang            mIDToSessionMap.removeItemsAt(index);
102791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang        }
103791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang    }
104791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}
105791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang
106791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang} // namespace clearkeycas
107791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang} // namespace android
108