1fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera/*
2fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Copyright (C) 2010 The Android Open Source Project
3fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera *
4fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Licensed under the Apache License, Version 2.0 (the "License");
5fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * you may not use this file except in compliance with the License.
6fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * You may obtain a copy of the License at
7fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera *
8fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera *      http://www.apache.org/licenses/LICENSE-2.0
9fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera *
10fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Unless required by applicable law or agreed to in writing, software
11fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * distributed under the License is distributed on an "AS IS" BASIS,
12fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * See the License for the specific language governing permissions and
14fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * limitations under the License.
15fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera */
16fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#ifndef __SESSIONMAP_H__
17fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#define __SESSIONMAP_H__
18fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
19fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#include <utils/KeyedVector.h>
2090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson#include <utils/threads.h>
21fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
22fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeheranamespace android {
23fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
24fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera/**
2590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * A thread safe wrapper template class for session handlings for Drm Engines. It wraps a
2690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * pointer type over KeyedVector. It keeps pointer as data in the vector and free up memory
2790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * allocated pointer can be of any type of structure/class meant for keeping session data.
2890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * so session object here means pointer to the session data.
29fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera */
3090855078eb989944bca1824058d7231cd68e5021Henrik B Anderssontemplate <typename TValue>
31fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeheraclass SessionMap {
32fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
33fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherapublic:
34fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera    SessionMap() {}
35fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
36fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera    virtual ~SessionMap() {
3790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
38fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera        destroyMap();
39fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera    }
40fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
4190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    /**
4290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * Adds a new value in the session map table. It expects memory to be allocated already
4390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * for the session object
4490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
4590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @param key - key or Session ID
4690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @param value - session object to add
4790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
4890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @return boolean result of adding value. returns false if key is already exist.
4990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     */
5090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    bool addValue(int key, TValue value) {
5190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
5290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        if (!isCreatedInternal(key)) {
5390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson            map.add(key, value);
5490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson            return true;
5590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        }
5690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return false;
57fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera    }
58fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
5990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    /**
6090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * returns the session object by the key
6190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
6290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @param key - key or Session ID
6390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
6490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @return session object as per the key
6590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     */
6690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    TValue getValue(int key) {
6790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
6890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return getValueInternal(key);
69fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera    }
70fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
7190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    /**
7290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * returns the number of objects in the session map table
7390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
7490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @return count of number of session objects.
7590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     */
7690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    int getSize() {
7790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
7890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return map.size();
7990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    }
80fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
8190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    /**
8290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * returns the session object by the index in the session map table
8390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
8490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @param index - index of the value required
8590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
8690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @return session object as per the index
8790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     */
8890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    TValue getValueAt(unsigned int index) {
8990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        TValue value = NULL;
9090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
9190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson
9290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        if (map.size() > index) {
9390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson            value = map.valueAt(index);
9490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        }
9590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return value;
96fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera    }
97fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
9890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    /**
9990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * deletes the object from session map. It also frees up memory for the session object.
10090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
10190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @param key - key of the value to be deleted
10290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
10390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     */
10490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    void removeValue(int key) {
10590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
10690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        deleteValue(getValueInternal(key));
10790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        map.removeItem(key);
10890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    }
109fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
11090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    /**
11190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * decides if session is already created.
11290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
11390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @param key - key of the value for the session
11490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     *
11590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     * @return boolean result of whether session is created
11690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson     */
11790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    bool isCreated(int key) {
11890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
11990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return isCreatedInternal(key);
12090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    }
121fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
12290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    SessionMap<TValue> & operator=(const SessionMap<TValue> & objectCopy) {
12390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        Mutex::Autolock lock(mLock);
124fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
12590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        destroyMap();
12690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        map = objectCopy.map;
12790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return *this;
12890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    }
129fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
13090855078eb989944bca1824058d7231cd68e5021Henrik B Anderssonprivate:
13190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    KeyedVector<int, TValue> map;
13290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    Mutex mLock;
13390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson
13490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson   /**
13590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * free up the memory for the session object.
13690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * Make sure if any reference to the session object anywhere, otherwise it will be a
13790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * dangle pointer after this call.
13890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    *
13990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * @param value - session object to free
14090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    *
14190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    */
14290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    void deleteValue(TValue value) {
14390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        delete value;
144fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera    }
145fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
14690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson   /**
14790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * free up the memory for the entire map.
14890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * free up any resources in the sessions before calling this funtion.
14990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    *
15090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    */
15190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    void destroyMap() {
15290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        int size = map.size();
15390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson
15490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        for (int i = 0; i < size; i++) {
15590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson            deleteValue(map.valueAt(i));
15690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        }
15790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        map.clear();
15890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    }
159fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
16090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson   /**
16190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * decides if session is already created.
16290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    *
16390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * @param key - key of the value for the session
16490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    *
16590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * @return boolean result of whether session is created
16690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    */
16790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    bool isCreatedInternal(int key) {
16890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return(0 <= map.indexOfKey(key));
16990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    }
170fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
17190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson   /**
17290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * returns the session object by the key
17390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    *
17490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * @param key - key or Session ID
17590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    *
17690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    * @return session object as per the key
17790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    */
17890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    TValue getValueInternal(int key) {
17990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        TValue value = NULL;
18090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        if (isCreatedInternal(key)) {
18190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson            value = (TValue) map.valueFor(key);
18290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        }
18390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson        return value;
18490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson    }
185fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera};
186fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
187fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera};
188fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera
189fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#endif /* __SESSIONMAP_H__ */
190