110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu/*
210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * Copyright (C) 2015 The Android Open Source Project
310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *
410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * Licensed under the Apache License, Version 2.0 (the "License");
510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * you may not use this file except in compliance with the License.
610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * You may obtain a copy of the License at
710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *
810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *      http://www.apache.org/licenses/LICENSE-2.0
910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu *
1010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * Unless required by applicable law or agreed to in writing, software
1110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * distributed under the License is distributed on an "AS IS" BASIS,
1210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * See the License for the specific language governing permissions and
1410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu * limitations under the License.
1510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu */
1610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
1710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#ifndef DRM_SESSION_MANAGER_H_
1810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
1910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#define DRM_SESSION_MANAGER_H_
2010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
2110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <media/stagefright/foundation/ABase.h>
2210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <utils/RefBase.h>
2310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <utils/KeyedVector.h>
2410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <utils/threads.h>
2510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#include <utils/Vector.h>
2610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
2710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wunamespace android {
2810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
2910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wuclass DrmSessionManagerTest;
3010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustruct DrmSessionClientInterface;
3110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustruct ProcessInfoInterface;
3210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
3310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wubool isEqualSessionId(const Vector<uint8_t> &sessionId1, const Vector<uint8_t> &sessionId2);
3410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
3510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustruct SessionInfo {
3610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    sp<DrmSessionClientInterface> drm;
3710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    Vector<uint8_t> sessionId;
3810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    int64_t timeStamp;
3910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu};
4010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
4110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wutypedef Vector<SessionInfo > SessionInfos;
4210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wutypedef KeyedVector<int, SessionInfos > PidSessionInfosMap;
4310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
4410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wustruct DrmSessionManager : public RefBase {
455c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu    static sp<DrmSessionManager> Instance();
465c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu
4710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    DrmSessionManager();
4810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    DrmSessionManager(sp<ProcessInfoInterface> processInfo);
4910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
5010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    void addSession(int pid, sp<DrmSessionClientInterface> drm, const Vector<uint8_t>& sessionId);
5110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    void useSession(const Vector<uint8_t>& sessionId);
5210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    void removeSession(const Vector<uint8_t>& sessionId);
5310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    void removeDrm(sp<DrmSessionClientInterface> drm);
5410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    bool reclaimSession(int callingPid);
5510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
5610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wuprotected:
5710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    virtual ~DrmSessionManager();
5810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
5910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wuprivate:
6010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    friend class DrmSessionManagerTest;
6110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
6210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    int64_t getTime_l();
6310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    bool getLowestPriority_l(int* lowestPriorityPid, int* lowestPriority);
6410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    bool getLeastUsedSession_l(
6510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu            int pid, sp<DrmSessionClientInterface>* drm, Vector<uint8_t>* sessionId);
6610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
6710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    sp<ProcessInfoInterface> mProcessInfo;
6810305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    mutable Mutex mLock;
6910305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    PidSessionInfosMap mSessionMap;
7010305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    int64_t mTime;
7110305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
7210305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu    DISALLOW_EVIL_CONSTRUCTORS(DrmSessionManager);
7310305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu};
7410305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
7510305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu}  // namespace android
7610305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu
7710305cc672dcb39b7cc7dc03eeafffb2fea150ecRonghua Wu#endif  // DRM_SESSION_MANAGER_H_
78