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