IMediaHTTPConnection.cpp revision c9c7e25a4b1c34439fb365f6cfbef063884566cc
11b86fe063badb5f28c467ade39be0f4008688947Andreas Huber/* 21b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * Copyright (C) 2013 The Android Open Source Project 31b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * 41b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 51b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * you may not use this file except in compliance with the License. 61b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * You may obtain a copy of the License at 71b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * 81b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 91b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * 101b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * Unless required by applicable law or agreed to in writing, software 111b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 121b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * See the License for the specific language governing permissions and 141b86fe063badb5f28c467ade39be0f4008688947Andreas Huber * limitations under the License. 151b86fe063badb5f28c467ade39be0f4008688947Andreas Huber */ 161b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 171b86fe063badb5f28c467ade39be0f4008688947Andreas Huber//#define LOG_NDEBUG 0 181b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#define LOG_TAG "IMediaHTTPConnection" 191b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <utils/Log.h> 201b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPConnection.h> 221b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 231b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <binder/IMemory.h> 241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <binder/Parcel.h> 251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <utils/String8.h> 261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/stagefright/foundation/ADebug.h> 271b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 281b86fe063badb5f28c467ade39be0f4008688947Andreas Hubernamespace android { 291b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 301b86fe063badb5f28c467ade39be0f4008688947Andreas Huberenum { 311b86fe063badb5f28c467ade39be0f4008688947Andreas Huber CONNECT = IBinder::FIRST_CALL_TRANSACTION, 321b86fe063badb5f28c467ade39be0f4008688947Andreas Huber DISCONNECT, 331b86fe063badb5f28c467ade39be0f4008688947Andreas Huber READ_AT, 341b86fe063badb5f28c467ade39be0f4008688947Andreas Huber GET_SIZE, 351b86fe063badb5f28c467ade39be0f4008688947Andreas Huber GET_MIME_TYPE, 36c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen GET_URI 371b86fe063badb5f28c467ade39be0f4008688947Andreas Huber}; 381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 391b86fe063badb5f28c467ade39be0f4008688947Andreas Huberstruct BpMediaHTTPConnection : public BpInterface<IMediaHTTPConnection> { 401b86fe063badb5f28c467ade39be0f4008688947Andreas Huber BpMediaHTTPConnection(const sp<IBinder> &impl) 411b86fe063badb5f28c467ade39be0f4008688947Andreas Huber : BpInterface<IMediaHTTPConnection>(impl) { 421b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 431b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 441b86fe063badb5f28c467ade39be0f4008688947Andreas Huber virtual bool connect( 451b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *uri, const KeyedVector<String8, String8> *headers) { 461b86fe063badb5f28c467ade39be0f4008688947Andreas Huber Parcel data, reply; 471b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeInterfaceToken( 481b86fe063badb5f28c467ade39be0f4008688947Andreas Huber IMediaHTTPConnection::getInterfaceDescriptor()); 491b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 501b86fe063badb5f28c467ade39be0f4008688947Andreas Huber String16 tmp(uri); 511b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeString16(tmp); 521b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 531b86fe063badb5f28c467ade39be0f4008688947Andreas Huber tmp = String16(""); 541b86fe063badb5f28c467ade39be0f4008688947Andreas Huber if (headers != NULL) { 551b86fe063badb5f28c467ade39be0f4008688947Andreas Huber for (size_t i = 0; i < headers->size(); ++i) { 561b86fe063badb5f28c467ade39be0f4008688947Andreas Huber String16 key(headers->keyAt(i).string()); 571b86fe063badb5f28c467ade39be0f4008688947Andreas Huber String16 val(headers->valueAt(i).string()); 581b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 591b86fe063badb5f28c467ade39be0f4008688947Andreas Huber tmp.append(key); 601b86fe063badb5f28c467ade39be0f4008688947Andreas Huber tmp.append(String16(": ")); 611b86fe063badb5f28c467ade39be0f4008688947Andreas Huber tmp.append(val); 621b86fe063badb5f28c467ade39be0f4008688947Andreas Huber tmp.append(String16("\r\n")); 631b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 641b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 651b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeString16(tmp); 661b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 671b86fe063badb5f28c467ade39be0f4008688947Andreas Huber remote()->transact(CONNECT, data, &reply); 681b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 691b86fe063badb5f28c467ade39be0f4008688947Andreas Huber int32_t exceptionCode = reply.readExceptionCode(); 701b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 711b86fe063badb5f28c467ade39be0f4008688947Andreas Huber if (exceptionCode) { 721b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return UNKNOWN_ERROR; 731b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 741b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 751b86fe063badb5f28c467ade39be0f4008688947Andreas Huber sp<IBinder> binder = reply.readStrongBinder(); 761b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mMemory = interface_cast<IMemory>(binder); 771b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 781b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return mMemory != NULL; 791b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 801b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 811b86fe063badb5f28c467ade39be0f4008688947Andreas Huber virtual void disconnect() { 821b86fe063badb5f28c467ade39be0f4008688947Andreas Huber Parcel data, reply; 831b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeInterfaceToken( 841b86fe063badb5f28c467ade39be0f4008688947Andreas Huber IMediaHTTPConnection::getInterfaceDescriptor()); 851b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 861b86fe063badb5f28c467ade39be0f4008688947Andreas Huber remote()->transact(DISCONNECT, data, &reply); 871b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 881b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 891b86fe063badb5f28c467ade39be0f4008688947Andreas Huber virtual ssize_t readAt(off64_t offset, void *buffer, size_t size) { 901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber Parcel data, reply; 911b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeInterfaceToken( 921b86fe063badb5f28c467ade39be0f4008688947Andreas Huber IMediaHTTPConnection::getInterfaceDescriptor()); 931b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 941b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeInt64(offset); 951b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeInt32(size); 961b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 971b86fe063badb5f28c467ade39be0f4008688947Andreas Huber status_t err = remote()->transact(READ_AT, data, &reply); 981b86fe063badb5f28c467ade39be0f4008688947Andreas Huber CHECK_EQ(err, (status_t)OK); 991b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1001b86fe063badb5f28c467ade39be0f4008688947Andreas Huber int32_t exceptionCode = reply.readExceptionCode(); 1011b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1021b86fe063badb5f28c467ade39be0f4008688947Andreas Huber if (exceptionCode) { 1031b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return UNKNOWN_ERROR; 1041b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 1051b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1061b86fe063badb5f28c467ade39be0f4008688947Andreas Huber int32_t len = reply.readInt32(); 1071b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1081b86fe063badb5f28c467ade39be0f4008688947Andreas Huber if (len > 0) { 1091b86fe063badb5f28c467ade39be0f4008688947Andreas Huber memcpy(buffer, mMemory->pointer(), len); 1101b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 1111b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1121b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return len; 1131b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 1141b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1151b86fe063badb5f28c467ade39be0f4008688947Andreas Huber virtual off64_t getSize() { 1161b86fe063badb5f28c467ade39be0f4008688947Andreas Huber Parcel data, reply; 1171b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeInterfaceToken( 1181b86fe063badb5f28c467ade39be0f4008688947Andreas Huber IMediaHTTPConnection::getInterfaceDescriptor()); 1191b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1201b86fe063badb5f28c467ade39be0f4008688947Andreas Huber remote()->transact(GET_SIZE, data, &reply); 1211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1221b86fe063badb5f28c467ade39be0f4008688947Andreas Huber int32_t exceptionCode = reply.readExceptionCode(); 1231b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber if (exceptionCode) { 1251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return UNKNOWN_ERROR; 1261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 1271b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1281b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return reply.readInt64(); 1291b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 1301b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1311b86fe063badb5f28c467ade39be0f4008688947Andreas Huber virtual status_t getMIMEType(String8 *mimeType) { 1321b86fe063badb5f28c467ade39be0f4008688947Andreas Huber *mimeType = String8(""); 1331b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1341b86fe063badb5f28c467ade39be0f4008688947Andreas Huber Parcel data, reply; 1351b86fe063badb5f28c467ade39be0f4008688947Andreas Huber data.writeInterfaceToken( 1361b86fe063badb5f28c467ade39be0f4008688947Andreas Huber IMediaHTTPConnection::getInterfaceDescriptor()); 1371b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber remote()->transact(GET_MIME_TYPE, data, &reply); 1391b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1401b86fe063badb5f28c467ade39be0f4008688947Andreas Huber int32_t exceptionCode = reply.readExceptionCode(); 1411b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1421b86fe063badb5f28c467ade39be0f4008688947Andreas Huber if (exceptionCode) { 1431b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return UNKNOWN_ERROR; 1441b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 1451b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1461b86fe063badb5f28c467ade39be0f4008688947Andreas Huber *mimeType = String8(reply.readString16()); 1471b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1481b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return OK; 1491b86fe063badb5f28c467ade39be0f4008688947Andreas Huber } 1501b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 151c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen virtual status_t getUri(String8 *uri) { 152c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen *uri = String8(""); 153c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen 154c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen Parcel data, reply; 155c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen data.writeInterfaceToken( 156c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen IMediaHTTPConnection::getInterfaceDescriptor()); 157c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen 158c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen remote()->transact(GET_URI, data, &reply); 159c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen 160c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen int32_t exceptionCode = reply.readExceptionCode(); 161c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen 162c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen if (exceptionCode) { 163c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen return UNKNOWN_ERROR; 164c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen } 165c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen 166c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen *uri = String8(reply.readString16()); 167c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen 168c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen return OK; 169c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen } 170c9c7e25a4b1c34439fb365f6cfbef063884566ccMarco Nelissen 1711b86fe063badb5f28c467ade39be0f4008688947Andreas Huberprivate: 1721b86fe063badb5f28c467ade39be0f4008688947Andreas Huber sp<IMemory> mMemory; 1731b86fe063badb5f28c467ade39be0f4008688947Andreas Huber}; 1741b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1751b86fe063badb5f28c467ade39be0f4008688947Andreas HuberIMPLEMENT_META_INTERFACE( 1761b86fe063badb5f28c467ade39be0f4008688947Andreas Huber MediaHTTPConnection, "android.media.IMediaHTTPConnection"); 1771b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1781b86fe063badb5f28c467ade39be0f4008688947Andreas Huber} // namespace android 1791b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 180