1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/*
2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2015 The Android Open Source Project
3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License");
5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License.
6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at
7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *      http://www.apache.org/licenses/LICENSE-2.0
9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software
11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS,
12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and
14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License.
15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */
16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef DRM_SESSION_MANAGER_H_
18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define DRM_SESSION_MANAGER_H_
20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/stagefright/foundation/ABase.h>
22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/RefBase.h>
23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/KeyedVector.h>
24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/threads.h>
25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/Vector.h>
26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android {
28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass DrmSessionManagerTest;
30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct DrmSessionClientInterface;
31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ProcessInfoInterface;
32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanbool isEqualSessionId(const Vector<uint8_t> &sessionId1, const Vector<uint8_t> &sessionId2);
34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct SessionInfo {
36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<DrmSessionClientInterface> drm;
37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    Vector<uint8_t> sessionId;
38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int64_t timeStamp;
39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantypedef Vector<SessionInfo > SessionInfos;
42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantypedef KeyedVector<int, SessionInfos > PidSessionInfosMap;
43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct DrmSessionManager : public RefBase {
45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    static sp<DrmSessionManager> Instance();
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    DrmSessionManager();
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    explicit DrmSessionManager(sp<ProcessInfoInterface> processInfo);
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void addSession(int pid, const sp<DrmSessionClientInterface>& drm, const Vector<uint8_t>& sessionId);
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void useSession(const Vector<uint8_t>& sessionId);
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void removeSession(const Vector<uint8_t>& sessionId);
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void removeDrm(const sp<DrmSessionClientInterface>& drm);
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool reclaimSession(int callingPid);
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprotected:
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual ~DrmSessionManager();
58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend class DrmSessionManagerTest;
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int64_t getTime_l();
63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool getLowestPriority_l(int* lowestPriorityPid, int* lowestPriority);
64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool getLeastUsedSession_l(
65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            int pid, sp<DrmSessionClientInterface>* drm, Vector<uint8_t>* sessionId);
66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    sp<ProcessInfoInterface> mProcessInfo;
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    mutable Mutex mLock;
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    PidSessionInfosMap mSessionMap;
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int64_t mTime;
71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    DISALLOW_EVIL_CONSTRUCTORS(DrmSessionManager);
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}  // namespace android
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif  // DRM_SESSION_MANAGER_H_
78