1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright 2015 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "IDataSource"
19*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Timers.h>
21*ec779b8eSAndroid Build Coastguard Worker
22*ec779b8eSAndroid Build Coastguard Worker #include <android/IDataSource.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ADebug.h>
26*ec779b8eSAndroid Build Coastguard Worker
27*ec779b8eSAndroid Build Coastguard Worker namespace android {
28*ec779b8eSAndroid Build Coastguard Worker
29*ec779b8eSAndroid Build Coastguard Worker enum {
30*ec779b8eSAndroid Build Coastguard Worker GET_IMEMORY = IBinder::FIRST_CALL_TRANSACTION,
31*ec779b8eSAndroid Build Coastguard Worker READ_AT,
32*ec779b8eSAndroid Build Coastguard Worker GET_SIZE,
33*ec779b8eSAndroid Build Coastguard Worker CLOSE,
34*ec779b8eSAndroid Build Coastguard Worker GET_FLAGS,
35*ec779b8eSAndroid Build Coastguard Worker TO_STRING,
36*ec779b8eSAndroid Build Coastguard Worker };
37*ec779b8eSAndroid Build Coastguard Worker
38*ec779b8eSAndroid Build Coastguard Worker struct BpDataSource : public BpInterface<IDataSource> {
BpDataSourceandroid::BpDataSource39*ec779b8eSAndroid Build Coastguard Worker explicit BpDataSource(const sp<IBinder>& impl)
40*ec779b8eSAndroid Build Coastguard Worker : BpInterface<IDataSource>(impl) {}
41*ec779b8eSAndroid Build Coastguard Worker
getIMemoryandroid::BpDataSource42*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMemory> getIMemory() {
43*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
44*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
45*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_IMEMORY, data, &reply);
46*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> binder = reply.readStrongBinder();
47*ec779b8eSAndroid Build Coastguard Worker return interface_cast<IMemory>(binder);
48*ec779b8eSAndroid Build Coastguard Worker }
49*ec779b8eSAndroid Build Coastguard Worker
readAtandroid::BpDataSource50*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t readAt(off64_t offset, size_t size) {
51*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
52*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
53*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(offset);
54*ec779b8eSAndroid Build Coastguard Worker data.writeInt64(size);
55*ec779b8eSAndroid Build Coastguard Worker status_t err = remote()->transact(READ_AT, data, &reply);
56*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
57*ec779b8eSAndroid Build Coastguard Worker return err;
58*ec779b8eSAndroid Build Coastguard Worker }
59*ec779b8eSAndroid Build Coastguard Worker int64_t value = 0;
60*ec779b8eSAndroid Build Coastguard Worker err = reply.readInt64(&value);
61*ec779b8eSAndroid Build Coastguard Worker if (err != OK) {
62*ec779b8eSAndroid Build Coastguard Worker return err;
63*ec779b8eSAndroid Build Coastguard Worker }
64*ec779b8eSAndroid Build Coastguard Worker return (ssize_t)value;
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker
getSizeandroid::BpDataSource67*ec779b8eSAndroid Build Coastguard Worker virtual status_t getSize(off64_t* size) {
68*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
69*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
70*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_SIZE, data, &reply);
71*ec779b8eSAndroid Build Coastguard Worker status_t err = reply.readInt32();
72*ec779b8eSAndroid Build Coastguard Worker *size = reply.readInt64();
73*ec779b8eSAndroid Build Coastguard Worker return err;
74*ec779b8eSAndroid Build Coastguard Worker }
75*ec779b8eSAndroid Build Coastguard Worker
closeandroid::BpDataSource76*ec779b8eSAndroid Build Coastguard Worker virtual void close() {
77*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
78*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
79*ec779b8eSAndroid Build Coastguard Worker remote()->transact(CLOSE, data, &reply);
80*ec779b8eSAndroid Build Coastguard Worker }
81*ec779b8eSAndroid Build Coastguard Worker
getFlagsandroid::BpDataSource82*ec779b8eSAndroid Build Coastguard Worker virtual uint32_t getFlags() {
83*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
84*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
85*ec779b8eSAndroid Build Coastguard Worker remote()->transact(GET_FLAGS, data, &reply);
86*ec779b8eSAndroid Build Coastguard Worker return reply.readUint32();
87*ec779b8eSAndroid Build Coastguard Worker }
88*ec779b8eSAndroid Build Coastguard Worker
toStringandroid::BpDataSource89*ec779b8eSAndroid Build Coastguard Worker virtual String8 toString() {
90*ec779b8eSAndroid Build Coastguard Worker Parcel data, reply;
91*ec779b8eSAndroid Build Coastguard Worker data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
92*ec779b8eSAndroid Build Coastguard Worker remote()->transact(TO_STRING, data, &reply);
93*ec779b8eSAndroid Build Coastguard Worker return reply.readString8();
94*ec779b8eSAndroid Build Coastguard Worker }
95*ec779b8eSAndroid Build Coastguard Worker };
96*ec779b8eSAndroid Build Coastguard Worker
97*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(DataSource, "android.media.IDataSource");
98*ec779b8eSAndroid Build Coastguard Worker
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)99*ec779b8eSAndroid Build Coastguard Worker status_t BnDataSource::onTransact(
100*ec779b8eSAndroid Build Coastguard Worker uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
101*ec779b8eSAndroid Build Coastguard Worker switch (code) {
102*ec779b8eSAndroid Build Coastguard Worker case GET_IMEMORY: {
103*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IDataSource, data, reply);
104*ec779b8eSAndroid Build Coastguard Worker reply->writeStrongBinder(IInterface::asBinder(getIMemory()));
105*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
106*ec779b8eSAndroid Build Coastguard Worker } break;
107*ec779b8eSAndroid Build Coastguard Worker case READ_AT: {
108*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IDataSource, data, reply);
109*ec779b8eSAndroid Build Coastguard Worker off64_t offset = (off64_t) data.readInt64();
110*ec779b8eSAndroid Build Coastguard Worker size_t size = (size_t) data.readInt64();
111*ec779b8eSAndroid Build Coastguard Worker reply->writeInt64(readAt(offset, size));
112*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
113*ec779b8eSAndroid Build Coastguard Worker } break;
114*ec779b8eSAndroid Build Coastguard Worker case GET_SIZE: {
115*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IDataSource, data, reply);
116*ec779b8eSAndroid Build Coastguard Worker off64_t size;
117*ec779b8eSAndroid Build Coastguard Worker status_t err = getSize(&size);
118*ec779b8eSAndroid Build Coastguard Worker reply->writeInt32(err);
119*ec779b8eSAndroid Build Coastguard Worker reply->writeInt64(size);
120*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
121*ec779b8eSAndroid Build Coastguard Worker } break;
122*ec779b8eSAndroid Build Coastguard Worker case CLOSE: {
123*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IDataSource, data, reply);
124*ec779b8eSAndroid Build Coastguard Worker close();
125*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
126*ec779b8eSAndroid Build Coastguard Worker } break;
127*ec779b8eSAndroid Build Coastguard Worker case GET_FLAGS: {
128*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IDataSource, data, reply);
129*ec779b8eSAndroid Build Coastguard Worker reply->writeUint32(getFlags());
130*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
131*ec779b8eSAndroid Build Coastguard Worker } break;
132*ec779b8eSAndroid Build Coastguard Worker case TO_STRING: {
133*ec779b8eSAndroid Build Coastguard Worker CHECK_INTERFACE(IDataSource, data, reply);
134*ec779b8eSAndroid Build Coastguard Worker reply->writeString8(toString());
135*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR;
136*ec779b8eSAndroid Build Coastguard Worker } break;
137*ec779b8eSAndroid Build Coastguard Worker
138*ec779b8eSAndroid Build Coastguard Worker default:
139*ec779b8eSAndroid Build Coastguard Worker return BBinder::onTransact(code, data, reply, flags);
140*ec779b8eSAndroid Build Coastguard Worker }
141*ec779b8eSAndroid Build Coastguard Worker }
142*ec779b8eSAndroid Build Coastguard Worker
143*ec779b8eSAndroid Build Coastguard Worker } // namespace android
144