1231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu/*
2231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu**
3231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** Copyright 2015, The Android Open Source Project
4231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu**
5231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** Licensed under the Apache License, Version 2.0 (the "License");
6231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** you may not use this file except in compliance with the License.
7231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** You may obtain a copy of the License at
8231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu**
9231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu**     http://www.apache.org/licenses/LICENSE-2.0
10231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu**
11231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** Unless required by applicable law or agreed to in writing, software
12231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** distributed under the License is distributed on an "AS IS" BASIS,
13231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** See the License for the specific language governing permissions and
15231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu** limitations under the License.
16231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu*/
17231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
18231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu//#define LOG_NDEBUG 0
19231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#define LOG_TAG "IResourceManagerService"
20231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <utils/Log.h>
21231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
22231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include "media/IResourceManagerService.h"
23231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
24231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <binder/Parcel.h>
25231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
26231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <stdint.h>
27231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu#include <sys/types.h>
28231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
29231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wunamespace android {
30231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
31231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuenum {
32231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    CONFIG = IBinder::FIRST_CALL_TRANSACTION,
33231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    ADD_RESOURCE,
34231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    REMOVE_RESOURCE,
35231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    RECLAIM_RESOURCE,
36231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu};
37231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
38231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wutemplate <typename T>
39231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic void writeToParcel(Parcel *data, const Vector<T> &items) {
40231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    size_t size = items.size();
41231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    // truncates size, but should be okay for this usecase
42231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    data->writeUint32(static_cast<uint32_t>(size));
43231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    for (size_t i = 0; i < size; i++) {
44231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        items[i].writeToParcel(data);
45231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
46231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
47231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
48231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wutemplate <typename T>
49231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatic void readFromParcel(const Parcel &data, Vector<T> *items) {
50231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    size_t size = (size_t)data.readUint32();
51d66ef45e09272b85a79c8d3c87666f26269bfa68Ronghua Wu    for (size_t i = 0; i < size && data.dataAvail() > 0; i++) {
52231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        T item;
53231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        item.readFromParcel(data);
54231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        items->add(item);
55231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
56231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
57231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
58231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wuclass BpResourceManagerService : public BpInterface<IResourceManagerService>
59231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu{
60231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wupublic:
61231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    BpResourceManagerService(const sp<IBinder> &impl)
62231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        : BpInterface<IResourceManagerService>(impl)
63231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    {
64231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
65231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
66231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    virtual void config(const Vector<MediaResourcePolicy> &policies) {
67231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Parcel data, reply;
68231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInterfaceToken(IResourceManagerService::getInterfaceDescriptor());
69231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        writeToParcel(&data, policies);
70231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        remote()->transact(CONFIG, data, &reply);
71231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
72231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
73231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    virtual void addResource(
74231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            int pid,
75231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            int64_t clientId,
76231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            const sp<IResourceManagerClient> client,
77231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            const Vector<MediaResource> &resources) {
78231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Parcel data, reply;
79231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInterfaceToken(IResourceManagerService::getInterfaceDescriptor());
80231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInt32(pid);
81231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInt64(clientId);
82231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeStrongBinder(IInterface::asBinder(client));
83231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        writeToParcel(&data, resources);
84231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
85231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        remote()->transact(ADD_RESOURCE, data, &reply);
86231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
87231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
8837c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu    virtual void removeResource(int pid, int64_t clientId) {
89231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Parcel data, reply;
90231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInterfaceToken(IResourceManagerService::getInterfaceDescriptor());
9137c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        data.writeInt32(pid);
92231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInt64(clientId);
93231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
94231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        remote()->transact(REMOVE_RESOURCE, data, &reply);
95231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
96231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
97231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    virtual bool reclaimResource(int callingPid, const Vector<MediaResource> &resources) {
98231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        Parcel data, reply;
99231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInterfaceToken(IResourceManagerService::getInterfaceDescriptor());
100231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        data.writeInt32(callingPid);
101231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        writeToParcel(&data, resources);
102231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
103231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        bool ret = false;
104231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        status_t status = remote()->transact(RECLAIM_RESOURCE, data, &reply);
105231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        if (status == NO_ERROR) {
106231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            ret = (bool)reply.readInt32();
107231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        }
108231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        return ret;
109231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
110231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu};
111231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
112231c3d169ad029689f9d688b68179af7e96b8d78Ronghua WuIMPLEMENT_META_INTERFACE(ResourceManagerService, "android.media.IResourceManagerService");
113231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
114231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu// ----------------------------------------------------------------------
115231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
116231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
117231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wustatus_t BnResourceManagerService::onTransact(
118231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
119231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu{
120231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    switch (code) {
121231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        case CONFIG: {
122231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            CHECK_INTERFACE(IResourceManagerService, data, reply);
123231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            Vector<MediaResourcePolicy> policies;
124231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            readFromParcel(data, &policies);
125231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            config(policies);
126231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            return NO_ERROR;
127231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        } break;
128231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
129231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        case ADD_RESOURCE: {
130231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            CHECK_INTERFACE(IResourceManagerService, data, reply);
131231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            int pid = data.readInt32();
132231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            int64_t clientId = data.readInt64();
133231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            sp<IResourceManagerClient> client(
134231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu                    interface_cast<IResourceManagerClient>(data.readStrongBinder()));
1352afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (client == NULL) {
1362afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                return NO_ERROR;
1372afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
138231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            Vector<MediaResource> resources;
139231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            readFromParcel(data, &resources);
140231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            addResource(pid, clientId, client, resources);
141231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            return NO_ERROR;
142231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        } break;
143231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
144231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        case REMOVE_RESOURCE: {
145231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            CHECK_INTERFACE(IResourceManagerService, data, reply);
14637c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu            int pid = data.readInt32();
147231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            int64_t clientId = data.readInt64();
14837c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu            removeResource(pid, clientId);
149231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            return NO_ERROR;
150231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        } break;
151231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
152231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        case RECLAIM_RESOURCE: {
153231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            CHECK_INTERFACE(IResourceManagerService, data, reply);
154231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            int callingPid = data.readInt32();
155231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            Vector<MediaResource> resources;
156231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            readFromParcel(data, &resources);
157231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            bool ret = reclaimResource(callingPid, resources);
158231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            reply->writeInt32(ret);
159231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            return NO_ERROR;
160231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        } break;
161231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
162231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu        default:
163231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu            return BBinder::onTransact(code, data, reply, flags);
164231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu    }
165231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}
166231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
167231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu// ----------------------------------------------------------------------------
168231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu
169231c3d169ad029689f9d688b68179af7e96b8d78Ronghua Wu}; // namespace android
170