1a69729dc76b97c44387088d351480d5d0701517eJeff Tinker/*
2a69729dc76b97c44387088d351480d5d0701517eJeff Tinker**
3a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** Copyright 2015, The Android Open Source Project
4a69729dc76b97c44387088d351480d5d0701517eJeff Tinker**
5a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** Licensed under the Apache License, Version 2.0 (the "License");
6a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** you may not use this file except in compliance with the License.
7a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** You may obtain a copy of the License at
8a69729dc76b97c44387088d351480d5d0701517eJeff Tinker**
9a69729dc76b97c44387088d351480d5d0701517eJeff Tinker**     http://www.apache.org/licenses/LICENSE-2.0
10a69729dc76b97c44387088d351480d5d0701517eJeff Tinker**
11a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** Unless required by applicable law or agreed to in writing, software
12a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** distributed under the License is distributed on an "AS IS" BASIS,
13a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** See the License for the specific language governing permissions and
15a69729dc76b97c44387088d351480d5d0701517eJeff Tinker** limitations under the License.
16a69729dc76b97c44387088d351480d5d0701517eJeff Tinker*/
17a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
18a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <stdint.h>
19a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <sys/types.h>
20a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
21a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <binder/Parcel.h>
22a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <binder/IMemory.h>
23a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <media/ICrypto.h>
24a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <media/IDrm.h>
25a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <media/IMediaDrmService.h>
26a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
27a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <utils/Errors.h>  // for status_t
28a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <utils/String8.h>
29a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
30a69729dc76b97c44387088d351480d5d0701517eJeff Tinkernamespace android {
31a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
32a69729dc76b97c44387088d351480d5d0701517eJeff Tinkerenum {
33a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    MAKE_CRYPTO = IBinder::FIRST_CALL_TRANSACTION,
34a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    MAKE_DRM,
35a69729dc76b97c44387088d351480d5d0701517eJeff Tinker};
36a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
37a69729dc76b97c44387088d351480d5d0701517eJeff Tinkerclass BpMediaDrmService: public BpInterface<IMediaDrmService>
38a69729dc76b97c44387088d351480d5d0701517eJeff Tinker{
39a69729dc76b97c44387088d351480d5d0701517eJeff Tinkerpublic:
40a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    BpMediaDrmService(const sp<IBinder>& impl)
41a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        : BpInterface<IMediaDrmService>(impl)
42a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    {
43a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    }
44a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
45a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    virtual sp<ICrypto> makeCrypto() {
46a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        Parcel data, reply;
47a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        data.writeInterfaceToken(IMediaDrmService::getInterfaceDescriptor());
48a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        remote()->transact(MAKE_CRYPTO, data, &reply);
49a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        return interface_cast<ICrypto>(reply.readStrongBinder());
50a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    }
51a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
52a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    virtual sp<IDrm> makeDrm() {
53a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        Parcel data, reply;
54a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        data.writeInterfaceToken(IMediaDrmService::getInterfaceDescriptor());
55a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        remote()->transact(MAKE_DRM, data, &reply);
56a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        return interface_cast<IDrm>(reply.readStrongBinder());
57a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    }
58a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
59a69729dc76b97c44387088d351480d5d0701517eJeff Tinker};
60a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
61a69729dc76b97c44387088d351480d5d0701517eJeff TinkerIMPLEMENT_META_INTERFACE(MediaDrmService, "android.media.IMediaDrmService");
62a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
63a69729dc76b97c44387088d351480d5d0701517eJeff Tinker// ----------------------------------------------------------------------
64a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
65a69729dc76b97c44387088d351480d5d0701517eJeff Tinkerstatus_t BnMediaDrmService::onTransact(
66a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
67a69729dc76b97c44387088d351480d5d0701517eJeff Tinker{
68a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    switch (code) {
69a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        case MAKE_CRYPTO: {
70a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            CHECK_INTERFACE(IMediaDrmService, data, reply);
71a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            sp<ICrypto> crypto = makeCrypto();
72a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            reply->writeStrongBinder(IInterface::asBinder(crypto));
73a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            return NO_ERROR;
74a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        } break;
75a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        case MAKE_DRM: {
76a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            CHECK_INTERFACE(IMediaDrmService, data, reply);
77a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            sp<IDrm> drm = makeDrm();
78a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            reply->writeStrongBinder(IInterface::asBinder(drm));
79a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            return NO_ERROR;
80a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        } break;
81a69729dc76b97c44387088d351480d5d0701517eJeff Tinker        default:
82a69729dc76b97c44387088d351480d5d0701517eJeff Tinker            return BBinder::onTransact(code, data, reply, flags);
83a69729dc76b97c44387088d351480d5d0701517eJeff Tinker    }
84a69729dc76b97c44387088d351480d5d0701517eJeff Tinker}
85a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
86a69729dc76b97c44387088d351480d5d0701517eJeff Tinker// ----------------------------------------------------------------------------
87a69729dc76b97c44387088d351480d5d0701517eJeff Tinker
88a69729dc76b97c44387088d351480d5d0701517eJeff Tinker} // namespace android
89