• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "IMediaHTTPConnection"
19 #include <utils/Log.h>
20 
21 #include <media/IMediaHTTPConnection.h>
22 
23 #include <binder/IMemory.h>
24 #include <binder/Parcel.h>
25 #include <utils/String8.h>
26 #include <media/stagefright/foundation/ADebug.h>
27 
28 namespace android {
29 
30 enum {
31     CONNECT = IBinder::FIRST_CALL_TRANSACTION,
32     DISCONNECT,
33     READ_AT,
34     GET_SIZE,
35     GET_MIME_TYPE,
36     GET_URI
37 };
38 
39 struct BpMediaHTTPConnection : public BpInterface<IMediaHTTPConnection> {
BpMediaHTTPConnectionandroid::BpMediaHTTPConnection40     BpMediaHTTPConnection(const sp<IBinder> &impl)
41         : BpInterface<IMediaHTTPConnection>(impl) {
42     }
43 
connectandroid::BpMediaHTTPConnection44     virtual bool connect(
45             const char *uri, const KeyedVector<String8, String8> *headers) {
46         Parcel data, reply;
47         data.writeInterfaceToken(
48                 IMediaHTTPConnection::getInterfaceDescriptor());
49 
50         String16 tmp(uri);
51         data.writeString16(tmp);
52 
53         tmp = String16("");
54         if (headers != NULL) {
55             for (size_t i = 0; i < headers->size(); ++i) {
56                 String16 key(headers->keyAt(i).string());
57                 String16 val(headers->valueAt(i).string());
58 
59                 tmp.append(key);
60                 tmp.append(String16(": "));
61                 tmp.append(val);
62                 tmp.append(String16("\r\n"));
63             }
64         }
65         data.writeString16(tmp);
66 
67         remote()->transact(CONNECT, data, &reply);
68 
69         int32_t exceptionCode = reply.readExceptionCode();
70 
71         if (exceptionCode) {
72             return UNKNOWN_ERROR;
73         }
74 
75         sp<IBinder> binder = reply.readStrongBinder();
76         mMemory = interface_cast<IMemory>(binder);
77 
78         return mMemory != NULL;
79     }
80 
disconnectandroid::BpMediaHTTPConnection81     virtual void disconnect() {
82         Parcel data, reply;
83         data.writeInterfaceToken(
84                 IMediaHTTPConnection::getInterfaceDescriptor());
85 
86         remote()->transact(DISCONNECT, data, &reply);
87     }
88 
readAtandroid::BpMediaHTTPConnection89     virtual ssize_t readAt(off64_t offset, void *buffer, size_t size) {
90         Parcel data, reply;
91         data.writeInterfaceToken(
92                 IMediaHTTPConnection::getInterfaceDescriptor());
93 
94         data.writeInt64(offset);
95         data.writeInt32(size);
96 
97         status_t err = remote()->transact(READ_AT, data, &reply);
98         if (err != OK) {
99             ALOGE("remote readAt failed");
100             return UNKNOWN_ERROR;
101         }
102 
103         int32_t exceptionCode = reply.readExceptionCode();
104 
105         if (exceptionCode) {
106             return UNKNOWN_ERROR;
107         }
108 
109         int32_t len = reply.readInt32();
110 
111         if (len > 0) {
112             memcpy(buffer, mMemory->pointer(), len);
113         }
114 
115         return len;
116     }
117 
getSizeandroid::BpMediaHTTPConnection118     virtual off64_t getSize() {
119         Parcel data, reply;
120         data.writeInterfaceToken(
121                 IMediaHTTPConnection::getInterfaceDescriptor());
122 
123         remote()->transact(GET_SIZE, data, &reply);
124 
125         int32_t exceptionCode = reply.readExceptionCode();
126 
127         if (exceptionCode) {
128             return UNKNOWN_ERROR;
129         }
130 
131         return reply.readInt64();
132     }
133 
getMIMETypeandroid::BpMediaHTTPConnection134     virtual status_t getMIMEType(String8 *mimeType) {
135         *mimeType = String8("");
136 
137         Parcel data, reply;
138         data.writeInterfaceToken(
139                 IMediaHTTPConnection::getInterfaceDescriptor());
140 
141         remote()->transact(GET_MIME_TYPE, data, &reply);
142 
143         int32_t exceptionCode = reply.readExceptionCode();
144 
145         if (exceptionCode) {
146             return UNKNOWN_ERROR;
147         }
148 
149         *mimeType = String8(reply.readString16());
150 
151         return OK;
152     }
153 
getUriandroid::BpMediaHTTPConnection154     virtual status_t getUri(String8 *uri) {
155         *uri = String8("");
156 
157         Parcel data, reply;
158         data.writeInterfaceToken(
159                 IMediaHTTPConnection::getInterfaceDescriptor());
160 
161         remote()->transact(GET_URI, data, &reply);
162 
163         int32_t exceptionCode = reply.readExceptionCode();
164 
165         if (exceptionCode) {
166             return UNKNOWN_ERROR;
167         }
168 
169         *uri = String8(reply.readString16());
170 
171         return OK;
172     }
173 
174 private:
175     sp<IMemory> mMemory;
176 };
177 
178 IMPLEMENT_META_INTERFACE(
179         MediaHTTPConnection, "android.media.IMediaHTTPConnection");
180 
181 }  // namespace android
182 
183