11917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker/*
21917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * Copyright (C) 2018 The Android Open Source Project
31917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker *
41917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * Licensed under the Apache License, Version 2.0 (the "License");
51917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * you may not use this file except in compliance with the License.
61917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * You may obtain a copy of the License at
71917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker *
81917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker *      http://www.apache.org/licenses/LICENSE-2.0
91917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker *
101917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * Unless required by applicable law or agreed to in writing, software
111917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * distributed under the License is distributed on an "AS IS" BASIS,
121917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * See the License for the specific language governing permissions and
141917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker * limitations under the License.
151917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker */
161917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
171917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker//#define LOG_NDEBUG 0
181917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker#define LOG_TAG "hidl_ClearKeySessionLibrary"
191917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker#include <utils/Log.h>
201917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
211917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker#include "SessionLibrary.h"
221917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker#include "Utils.h"
231917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
241917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkernamespace android {
251917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkernamespace hardware {
261917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkernamespace drm {
271917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkernamespace V1_1 {
281917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkernamespace clearkey {
291917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
301917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkerusing ::android::hardware::hidl_string;
311917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkerusing ::android::hardware::hidl_vec;
321917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkerusing ::android::sp;
331917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
341917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff TinkerMutex SessionLibrary::sSingletonLock;
351917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff TinkerSessionLibrary* SessionLibrary::sSingleton = NULL;
361917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
371917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff TinkerSessionLibrary* SessionLibrary::get() {
381917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    Mutex::Autolock lock(sSingletonLock);
391917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
401917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    if (sSingleton == NULL) {
411917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker        ALOGD("Instantiating Session Library Singleton.");
421917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker        sSingleton = new SessionLibrary();
431917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    }
441917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
451917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    return sSingleton;
461917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker}
471917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
481917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkersp<Session> SessionLibrary::createSession() {
491917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    Mutex::Autolock lock(mSessionsLock);
501917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
511917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    char sessionIdRaw[16];
521917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    snprintf(sessionIdRaw, sizeof(sessionIdRaw), "%u", mNextSessionId);
531917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
541917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    mNextSessionId += 1;
551917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
561917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    std::vector<uint8_t> sessionId;
571917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    sessionId.insert(sessionId.end(), sessionIdRaw,
581917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker            sessionIdRaw + sizeof(sessionIdRaw) / sizeof(uint8_t));
591917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
601917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    mSessions.insert(std::pair<std::vector<uint8_t>,
611917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker            sp<Session> >(sessionId, new Session(sessionId)));
621917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    std::map<std::vector<uint8_t>, sp<Session> >::iterator itr = mSessions.find(sessionId);
631917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    if (itr != mSessions.end()) {
641917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker        return itr->second;
651917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    } else {
661917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker        return nullptr;
671917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    }
681917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker}
691917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
701917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkersp<Session> SessionLibrary::findSession(
711917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker        const std::vector<uint8_t>& sessionId) {
721917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    Mutex::Autolock lock(mSessionsLock);
731917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    std::map<std::vector<uint8_t>, sp<Session> >::iterator itr = mSessions.find(sessionId);
741917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    if (itr != mSessions.end()) {
751917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker        return itr->second;
761917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    } else {
771917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker        return nullptr;
781917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    }
791917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker}
801917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
811917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinkervoid SessionLibrary::destroySession(const sp<Session>& session) {
821917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    Mutex::Autolock lock(mSessionsLock);
831917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker    mSessions.erase(session->sessionId());
841917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker}
851917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker
861917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker} // namespace clearkey
871917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker} // namespace V1_1
881917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker} // namespace drm
891917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker} // namespace hardware
901917fac1e41f57e547df7dcdebf57dd8483e7f61Jeff Tinker} // namespace android
91