/** * Check a parcel containing metadata is well formed. The header * is checked as well as the individual records format. However, the * data inside the record is not checked because we do lazy access * (we check/unmarshall only data the user asks for.) * * Format of a metadata parcel: <pre> 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | metadata total size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 'M' | 'E' | 'T' | 'A' | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | .... metadata records .... | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre> * * @param parcel With the serialized data. Metadata keeps a * reference on it to access it later on. The caller * should not modify the parcel after this call (and * not call recycle on it.) * @return false if an error occurred. */ bool CedarMetadata::parse(Parcel& parcel) { if (parcel.dataAvail() < (size_t)kMetaHeaderSize) { ALOGE("Not enough data %d", parcel.dataAvail()); return false; } const int pin = parcel.dataPosition(); // to roll back in case of errors. const int size = parcel.readInt32(); // The extra kInt32Size below is to account for the int32 'size' just read. if (parcel.dataAvail() + kInt32Size < (size_t)size || size < kMetaHeaderSize) { ALOGE("Bad size %d avail %d position %d", size, parcel.dataAvail(), pin); parcel.setDataPosition(pin); return false; } // Checks if the 'M' 'E' 'T' 'A' marker is present. const int kShouldBeMetaMarker = parcel.readInt32(); if (kShouldBeMetaMarker != kMetaMarker ) { ALOGE("Marker missing"); parcel.setDataPosition(pin); return false; } // Scan the records to collect metadata ids and offsets. if (!scanAllRecords(parcel, size - kMetaHeaderSize)) { parcel.setDataPosition(pin); return false; } mParcel = &parcel; return true; }
status_t BnHDCPObserver::onTransact( uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { switch (code) { case OBSERVER_NOTIFY: { CHECK_INTERFACE(IHDCPObserver, data, reply); int msg = data.readInt32(); int ext1 = data.readInt32(); int ext2 = data.readInt32(); Parcel obj; if (data.dataAvail() > 0) { obj.appendFrom( const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail()); } notify(msg, ext1, ext2, &obj); return OK; } default: return BBinder::onTransact(code, data, reply, flags); } }
status_t BBinder::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t /*flags*/) { switch (code) { case INTERFACE_TRANSACTION: reply->writeString16(getInterfaceDescriptor()); return NO_ERROR; case DUMP_TRANSACTION: { int fd = data.readFileDescriptor(); int argc = data.readInt32(); Vector<String16> args; for (int i = 0; i < argc && data.dataAvail() > 0; i++) { args.add(data.readString16()); } return dump(fd, args); } case SHELL_COMMAND_TRANSACTION: { int in = data.readFileDescriptor(); int out = data.readFileDescriptor(); int err = data.readFileDescriptor(); int argc = data.readInt32(); Vector<String16> args; for (int i = 0; i < argc && data.dataAvail() > 0; i++) { args.add(data.readString16()); } sp<IShellCallback> shellCallback = IShellCallback::asInterface( data.readStrongBinder()); sp<IResultReceiver> resultReceiver = IResultReceiver::asInterface( data.readStrongBinder()); // XXX can't add virtuals until binaries are updated. //return shellCommand(in, out, err, args, resultReceiver); (void)in; (void)out; (void)err; if (resultReceiver != NULL) { resultReceiver->send(INVALID_OPERATION); } return NO_ERROR; } case SYSPROPS_TRANSACTION: { report_sysprop_change(); return NO_ERROR; } default: return UNKNOWN_TRANSACTION; } }
static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jclass clazz, jlong nativePtr) { jbyteArray ret = NULL; Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { int32_t len = parcel->readInt32(); // sanity check the stored length against the true data size if (len >= 0 && len <= (int32_t)parcel->dataAvail()) { ret = env->NewByteArray(len); if (ret != NULL) { jbyte* a2 = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); if (a2) { const void* data = parcel->readInplace(len); memcpy(a2, data, len); env->ReleasePrimitiveArrayCritical(ret, a2, 0); } } } } return ret; }
status_t BBinder::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch (code) { case INTERFACE_TRANSACTION: reply->writeString16(getInterfaceDescriptor()); return NO_ERROR; case DUMP_TRANSACTION: { int fd = data.readFileDescriptor(); int argc = data.readInt32(); Vector<String16> args; for (int i = 0; i < argc && data.dataAvail() > 0; i++) { args.add(data.readString16()); } return dump(fd, args); } case SYSPROPS_TRANSACTION: { report_sysprop_change(); return NO_ERROR; } default: return UNKNOWN_TRANSACTION; } }
static void readFromParcel(const Parcel &data, Vector<T> *items) { size_t size = (size_t)data.readUint32(); for (size_t i = 0; i < size && data.dataAvail() > 0; i++) { T item; item.readFromParcel(data); items->add(item); } }
status_t BnMcuService::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { ALOGI("BnMcuService::onTransact, code[%d]", code); switch (code) { case GET_TEST: { CHECK_INTERFACE(IMcuService, data, reply); int result = getTest(); reply->writeInt32(result); return NO_ERROR; } break; case obtain_info: { CHECK_INTERFACE(IMcuService, data, reply); int domain = data.readInt32(); int cmd = data.readInt32(); Parcel out; bool res = obtainInfo(domain, cmd, out); reply->appendFrom(&out, 0, out.dataSize()); reply->writeInt32(res?1:0); out.freeData(); return NO_ERROR; } break; case send_info: { CHECK_INTERFACE(IMcuService, data, reply); int domain = data.readInt32(); int cmd = data.readInt32(); Parcel in; if(data.dataAvail() >0) { in.appendFrom(&data, data.dataPosition(), data.dataSize()-data.dataPosition()); in.setDataPosition(0); } bool res = sendInfo(domain, cmd, in); reply->writeInt32(res?1:0); in.freeData(); return NO_ERROR; } break; case regist_data_changed_listener: { CHECK_INTERFACE(IMcuService, data, reply); int domain = data.readInt32(); sp<IDataChangedListener> client = interface_cast<IDataChangedListener>(data.readStrongBinder()); bool res = registDataChanagedListener(domain, client); reply->writeInt32((res?1:0)); return NO_ERROR; } break; case unregist_data_changed_listener: { CHECK_INTERFACE(IMcuService, data, reply); int domain = data.readInt32(); sp<IDataChangedListener> client = interface_cast<IDataChangedListener>(data.readStrongBinder()); bool res = unregistDataChanagedListener(domain, client); reply->writeInt32((res?1:0)); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } }
status_t BnDrmClient::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch (code) { case NOTIFY: { CHECK_INTERFACE(IDrmClient, data, reply); int eventType = data.readInt32(); int extra = data.readInt32(); Parcel obj; if (data.dataAvail() > 0) { obj.appendFrom(const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail()); } notify((DrmPlugin::EventType)eventType, extra, &obj); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } }
status_t BnMediaPlayerClient::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch (code) { case NOTIFY: { CHECK_INTERFACE(IMediaPlayerClient, data, reply); int msg = data.readInt32(); int ext1 = data.readInt32(); int ext2 = data.readInt32(); Parcel obj; if (data.dataAvail() > 0) { obj.appendFrom(const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail()); } notify(msg, ext1, ext2, &obj); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } }
status_t BnListenReceiver::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch (code) { case NOTIFY: { ALOGI("BnListenReceiver::onTransact received NOTIFY"); CHECK_INTERFACE(IListenReceiver, data, reply); int msg = data.readInt32(); Parcel obj; if (data.dataAvail() > 0) { ALOGI("append %d bytes available at pos %d", data.dataAvail(), data.dataPosition()); obj.appendFrom(const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail()); } notify(msg, &obj); return NO_ERROR; } break; default: ALOGI("BnListenReceiver::onTransact received unknown msg %d", code); return BBinder::onTransact(code, data, reply, flags); } }
status_t BnCameraClient::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case NOTIFY_CALLBACK: { ALOGV("NOTIFY_CALLBACK"); CHECK_INTERFACE(ICameraClient, data, reply); int32_t msgType = data.readInt32(); int32_t ext1 = data.readInt32(); int32_t ext2 = 0; if ((msgType == CAMERA_MSG_PREVIEW_FRAME) && (ext1 == CAMERA_FRAME_DATA_FD)) { ext2 = data.readFileDescriptor(); ALOGD("onTransact: CAMERA_MSG_PREVIEW_FRAME fd = %d", ext2); } else { ext2 = data.readInt32(); } notifyCallback(msgType, ext1, ext2); return NO_ERROR; } break; case DATA_CALLBACK: { ALOGV("DATA_CALLBACK"); CHECK_INTERFACE(ICameraClient, data, reply); int32_t msgType = data.readInt32(); sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); camera_frame_metadata_t *metadata = NULL; if (data.dataAvail() > 0) { metadata = new camera_frame_metadata_t; metadata->number_of_faces = data.readInt32(); metadata->faces = (camera_face_t *) data.readInplace( sizeof(camera_face_t) * metadata->number_of_faces); } dataCallback(msgType, imageData, metadata); if (metadata) delete metadata; return NO_ERROR; } break; case DATA_CALLBACK_TIMESTAMP: { ALOGV("DATA_CALLBACK_TIMESTAMP"); CHECK_INTERFACE(ICameraClient, data, reply); nsecs_t timestamp = data.readInt64(); int32_t msgType = data.readInt32(); sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); dataCallbackTimestamp(timestamp, msgType, imageData); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } }
status_t BnDrmManagerService::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { LOGV("Entering BnDrmManagerService::onTransact with code %d", code); switch (code) { case ADD_UNIQUEID: { LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); CHECK_INTERFACE(IDrmManagerService, data, reply); int uniqueId = addUniqueId(data.readInt32()); reply->writeInt32(uniqueId); return DRM_NO_ERROR; } case REMOVE_UNIQUEID: { LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); CHECK_INTERFACE(IDrmManagerService, data, reply); removeUniqueId(data.readInt32()); return DRM_NO_ERROR; } case LOAD_PLUGINS: { LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS"); CHECK_INTERFACE(IDrmManagerService, data, reply); status_t status = loadPlugIns(data.readInt32()); reply->writeInt32(status); return DRM_NO_ERROR; } case LOAD_PLUGINS_FROM_PATH: { LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS_FROM_PATH"); CHECK_INTERFACE(IDrmManagerService, data, reply); status_t status = loadPlugIns(data.readInt32(), data.readString8()); reply->writeInt32(status); return DRM_NO_ERROR; } case SET_DRM_SERVICE_LISTENER: { LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); const sp<IDrmServiceListener> drmServiceListener = interface_cast<IDrmServiceListener> (data.readStrongBinder()); status_t status = setDrmServiceListener(uniqueId, drmServiceListener); reply->writeInt32(status); return DRM_NO_ERROR; } case UNLOAD_PLUGINS: { LOGV("BnDrmManagerService::onTransact :UNLOAD_PLUGINS"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); status_t status = unloadPlugIns(uniqueId); reply->writeInt32(status); return DRM_NO_ERROR; } case INSTALL_DRM_ENGINE: { LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); CHECK_INTERFACE(IDrmManagerService, data, reply); status_t status = installDrmEngine(data.readInt32(), data.readString8()); reply->writeInt32(status); return DRM_NO_ERROR; } case GET_CONSTRAINTS_FROM_CONTENT: { LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); const String8 path = data.readString8(); DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32()); if (NULL != drmConstraints) { //Filling DRM Constraints contents reply->writeInt32(drmConstraints->getCount()); DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); while (keyIt.hasNext()) { const String8 key = keyIt.next(); reply->writeString8(key); const char* value = drmConstraints->getAsByteArray(&key); int bufferSize = 0; if (NULL != value) { bufferSize = strlen(value); } reply->writeInt32(bufferSize + 1); reply->write(value, bufferSize + 1); } } delete drmConstraints; drmConstraints = NULL; return DRM_NO_ERROR; } case CAN_HANDLE: { LOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); const String8 path = data.readString8(); const String8 mimeType = data.readString8(); bool result = canHandle(uniqueId, path, mimeType); reply->writeInt32(result); return DRM_NO_ERROR; } case PROCESS_DRM_INFO: { LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); //Filling DRM info const int infoType = data.readInt32(); const int bufferSize = data.readInt32(); char* buffer = NULL; if (0 < bufferSize) { buffer = (char *)data.readInplace(bufferSize); } const DrmBuffer drmBuffer(buffer, bufferSize); DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); const int size = data.readInt32(); for (int index = 0; index < size; ++index) { const String8 key(data.readString8()); const String8 value(data.readString8()); drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); } DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); if (NULL != drmInfoStatus) { //Filling DRM Info Status contents reply->writeInt32(drmInfoStatus->statusCode); reply->writeString8(drmInfoStatus->mimeType); if (NULL != drmInfoStatus->drmBuffer) { const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; const int bufferSize = drmBuffer->length; reply->writeInt32(bufferSize); if (0 < bufferSize) { reply->write(drmBuffer->data, bufferSize); } delete [] drmBuffer->data; delete drmBuffer; drmBuffer = NULL; } } delete drmInfo; drmInfo = NULL; delete drmInfoStatus; drmInfoStatus = NULL; return DRM_NO_ERROR; } case ACQUIRE_DRM_INFO: { LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); //Filling DRM info Request DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8()); const int size = data.readInt32(); for (int index = 0; index < size; ++index) { const String8 key(data.readString8()); const String8 value(data.readString8()); drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); } DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); if (NULL != drmInfo) { //Filling DRM Info const DrmBuffer drmBuffer = drmInfo->getData(); reply->writeInt32(drmInfo->getInfoType()); const int bufferSize = drmBuffer.length; reply->writeInt32(bufferSize); if (0 < bufferSize) { reply->write(drmBuffer.data, bufferSize); } reply->writeString8(drmInfo->getMimeType()); reply->writeInt32(drmInfo->getCount()); DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); while (keyIt.hasNext()) { const String8 key = keyIt.next(); reply->writeString8(key); const String8 value = drmInfo->get(key); reply->writeString8((value == String8("")) ? String8("NULL") : value); } delete [] drmBuffer.data; } delete drmInfoRequest; drmInfoRequest = NULL; delete drmInfo; drmInfo = NULL; return DRM_NO_ERROR; } case SAVE_RIGHTS: { LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); //Filling DRM Rights const int bufferSize = data.readInt32(); const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); const String8 mimeType(data.readString8()); const String8 accountId(data.readString8()); const String8 subscriptionId(data.readString8()); const String8 rightsPath(data.readString8()); const String8 contentPath(data.readString8()); DrmRights drmRights(drmBuffer, ((mimeType == String8("NULL")) ? String8("") : mimeType), ((accountId == String8("NULL")) ? String8("") : accountId), ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); const status_t status = saveRights(uniqueId, drmRights, ((rightsPath == String8("NULL")) ? String8("") : rightsPath), ((contentPath == String8("NULL")) ? String8("") : contentPath)); reply->writeInt32(status); return DRM_NO_ERROR; } case GET_ORIGINAL_MIMETYPE: { LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); CHECK_INTERFACE(IDrmManagerService, data, reply); const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8()); reply->writeString8(originalMimeType); return DRM_NO_ERROR; } case GET_DRM_OBJECT_TYPE: { LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int drmObjectType = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8()); reply->writeInt32(drmObjectType); return DRM_NO_ERROR; } case CHECK_RIGHTS_STATUS: { LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int result = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32()); reply->writeInt32(result); return DRM_NO_ERROR; } case CONSUME_RIGHTS: { LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); DecryptHandle handle; handle.decryptId = data.readInt32(); handle.mimeType = data.readString8(); handle.decryptApiType = data.readInt32(); handle.status = data.readInt32(); handle.decryptInfo = NULL; const int bufferLength = data.readInt32(); if (INVALID_BUFFER_LENGTH != bufferLength) { handle.decryptInfo = new DecryptInfo(); handle.decryptInfo->decryptBufferLength = bufferLength; } const status_t status = consumeRights(uniqueId, &handle, data.readInt32(), static_cast<bool>(data.readInt32())); reply->writeInt32(status); delete handle.decryptInfo; handle.decryptInfo = NULL; return DRM_NO_ERROR; } case SET_PLAYBACK_STATUS: { LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); DecryptHandle handle; handle.decryptId = data.readInt32(); handle.mimeType = data.readString8(); handle.decryptApiType = data.readInt32(); handle.status = data.readInt32(); handle.decryptInfo = NULL; const int bufferLength = data.readInt32(); if (INVALID_BUFFER_LENGTH != bufferLength) { handle.decryptInfo = new DecryptInfo(); handle.decryptInfo->decryptBufferLength = bufferLength; } const status_t status = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt32()); reply->writeInt32(status); delete handle.decryptInfo; handle.decryptInfo = NULL; return DRM_NO_ERROR; } case VALIDATE_ACTION: { LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); CHECK_INTERFACE(IDrmManagerService, data, reply); bool result = validateAction( data.readInt32(), data.readString8(), data.readInt32(), ActionDescription(data.readInt32(), data.readInt32())); reply->writeInt32(result); return DRM_NO_ERROR; } case REMOVE_RIGHTS: { LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); CHECK_INTERFACE(IDrmManagerService, data, reply); const status_t status = removeRights(data.readInt32(), data.readString8()); reply->writeInt32(status); return DRM_NO_ERROR; } case REMOVE_ALL_RIGHTS: { LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); CHECK_INTERFACE(IDrmManagerService, data, reply); const status_t status = removeAllRights(data.readInt32()); reply->writeInt32(status); return DRM_NO_ERROR; } case OPEN_CONVERT_SESSION: { LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int convertId = openConvertSession(data.readInt32(), data.readString8()); reply->writeInt32(convertId); return DRM_NO_ERROR; } case CONVERT_DATA: { LOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); const int convertId = data.readInt32(); //Filling input data const int bufferSize = data.readInt32(); DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); if (NULL != drmConvertedStatus) { //Filling Drm Converted Ststus reply->writeInt32(drmConvertedStatus->statusCode); reply->writeInt32(drmConvertedStatus->offset); if (NULL != drmConvertedStatus->convertedData) { const DrmBuffer* convertedData = drmConvertedStatus->convertedData; const int bufferSize = convertedData->length; reply->writeInt32(bufferSize); if (0 < bufferSize) { reply->write(convertedData->data, bufferSize); } delete [] convertedData->data; delete convertedData; convertedData = NULL; } } delete inputData; inputData = NULL; delete drmConvertedStatus; drmConvertedStatus = NULL; return DRM_NO_ERROR; } case CLOSE_CONVERT_SESSION: { LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); CHECK_INTERFACE(IDrmManagerService, data, reply); DrmConvertedStatus* drmConvertedStatus = closeConvertSession(data.readInt32(), data.readInt32()); if (NULL != drmConvertedStatus) { //Filling Drm Converted Ststus reply->writeInt32(drmConvertedStatus->statusCode); reply->writeInt32(drmConvertedStatus->offset); if (NULL != drmConvertedStatus->convertedData) { const DrmBuffer* convertedData = drmConvertedStatus->convertedData; const int bufferSize = convertedData->length; reply->writeInt32(bufferSize); if (0 < bufferSize) { reply->write(convertedData->data, bufferSize); } delete [] convertedData->data; delete convertedData; convertedData = NULL; } } delete drmConvertedStatus; drmConvertedStatus = NULL; return DRM_NO_ERROR; } case GET_ALL_SUPPORT_INFO: { LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); int length = 0; DrmSupportInfo* drmSupportInfoArray = NULL; status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); reply->writeInt32(length); for (int i = 0; i < length; ++i) { DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; reply->writeInt32(drmSupportInfo.getFileSuffixCount()); DrmSupportInfo::FileSuffixIterator fileSuffixIt = drmSupportInfo.getFileSuffixIterator(); while (fileSuffixIt.hasNext()) { reply->writeString8(fileSuffixIt.next()); } reply->writeInt32(drmSupportInfo.getMimeTypeCount()); DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); while (mimeTypeIt.hasNext()) { reply->writeString8(mimeTypeIt.next()); } reply->writeString8(drmSupportInfo.getDescription()); } delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; reply->writeInt32(status); return DRM_NO_ERROR; } case OPEN_DECRYPT_SESSION: { LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); const int fd = data.readFileDescriptor(); DecryptHandle* handle = openDecryptSession(uniqueId, fd, data.readInt32(), data.readInt32()); if (NULL != handle) { reply->writeInt32(handle->decryptId); reply->writeString8(handle->mimeType); reply->writeInt32(handle->decryptApiType); reply->writeInt32(handle->status); if (NULL != handle->decryptInfo) { reply->writeInt32(handle->decryptInfo->decryptBufferLength); delete handle->decryptInfo; handle->decryptInfo = NULL; } } else { LOGE("NULL decryptHandle is returned"); } delete handle; handle = NULL; return DRM_NO_ERROR; } case CLOSE_DECRYPT_SESSION: { LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); DecryptHandle* handle = new DecryptHandle(); handle->decryptId = data.readInt32(); handle->mimeType = data.readString8(); handle->decryptApiType = data.readInt32(); handle->status = data.readInt32(); handle->decryptInfo = NULL; const int bufferLength = data.readInt32(); if (INVALID_BUFFER_LENGTH != bufferLength) { handle->decryptInfo = new DecryptInfo(); handle->decryptInfo->decryptBufferLength = bufferLength; } const status_t status = closeDecryptSession(uniqueId, handle); reply->writeInt32(status); return DRM_NO_ERROR; } case INITIALIZE_DECRYPT_UNIT: { LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); DecryptHandle handle; handle.decryptId = data.readInt32(); handle.mimeType = data.readString8(); handle.decryptApiType = data.readInt32(); handle.status = data.readInt32(); handle.decryptInfo = NULL; const int bufferLength = data.readInt32(); if (INVALID_BUFFER_LENGTH != bufferLength) { handle.decryptInfo = new DecryptInfo(); handle.decryptInfo->decryptBufferLength = bufferLength; } const int decryptUnitId = data.readInt32(); //Filling Header info const int bufferSize = data.readInt32(); DrmBuffer* headerInfo = NULL; headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); const status_t status = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); reply->writeInt32(status); delete handle.decryptInfo; handle.decryptInfo = NULL; delete headerInfo; headerInfo = NULL; return DRM_NO_ERROR; } case DECRYPT: { LOGV("BnDrmManagerService::onTransact :DECRYPT"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); DecryptHandle handle; handle.decryptId = data.readInt32(); handle.mimeType = data.readString8(); handle.decryptApiType = data.readInt32(); handle.status = data.readInt32(); handle.decryptInfo = NULL; const int bufferLength = data.readInt32(); if (INVALID_BUFFER_LENGTH != bufferLength) { handle.decryptInfo = new DecryptInfo(); handle.decryptInfo->decryptBufferLength = bufferLength; } const int decryptUnitId = data.readInt32(); const int decBufferSize = data.readInt32(); const int encBufferSize = data.readInt32(); DrmBuffer* encBuffer = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); char* buffer = NULL; buffer = new char[decBufferSize]; DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); DrmBuffer* IV = NULL; if (0 != data.dataAvail()) { const int ivBufferlength = data.readInt32(); IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); } const status_t status = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); reply->writeInt32(status); const int size = decBuffer->length; reply->writeInt32(size); reply->write(decBuffer->data, size); delete handle.decryptInfo; handle.decryptInfo = NULL; delete encBuffer; encBuffer = NULL; delete decBuffer; decBuffer = NULL; delete [] buffer; buffer = NULL; delete IV; IV = NULL; return DRM_NO_ERROR; } case FINALIZE_DECRYPT_UNIT: { LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); DecryptHandle handle; handle.decryptId = data.readInt32(); handle.mimeType = data.readString8(); handle.decryptApiType = data.readInt32(); handle.status = data.readInt32(); handle.decryptInfo = NULL; const int bufferLength = data.readInt32(); if (INVALID_BUFFER_LENGTH != bufferLength) { handle.decryptInfo = new DecryptInfo(); handle.decryptInfo->decryptBufferLength = bufferLength; } const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); reply->writeInt32(status); delete handle.decryptInfo; handle.decryptInfo = NULL; return DRM_NO_ERROR; } case PREAD: { LOGV("BnDrmManagerService::onTransact :READ"); CHECK_INTERFACE(IDrmManagerService, data, reply); const int uniqueId = data.readInt32(); DecryptHandle handle; handle.decryptId = data.readInt32(); handle.mimeType = data.readString8(); handle.decryptApiType = data.readInt32(); handle.status = data.readInt32(); handle.decryptInfo = NULL; const int bufferLength = data.readInt32(); if (INVALID_BUFFER_LENGTH != bufferLength) { handle.decryptInfo = new DecryptInfo(); handle.decryptInfo->decryptBufferLength = bufferLength; } const int numBytes = data.readInt32(); char* buffer = new char[numBytes]; const off_t offset = data.readInt32(); ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); reply->writeInt32(result); if (0 < result) { reply->write(buffer, result); } delete handle.decryptInfo; handle.decryptInfo = NULL; delete [] buffer, buffer = NULL; return DRM_NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } }
static jint android_os_Parcel_dataAvail(JNIEnv* env, jclass clazz, jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); return parcel ? parcel->dataAvail() : 0; }
status_t BnMediaPlayer::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case DISCONNECT: { CHECK_INTERFACE(IMediaPlayer, data, reply); disconnect(); return NO_ERROR; } break; case SET_DATA_SOURCE_URL: { CHECK_INTERFACE(IMediaPlayer, data, reply); const char* url = data.readCString(); KeyedVector<String8, String8> headers; int32_t numHeaders = data.readInt32(); for (int i = 0; i < numHeaders; ++i) { String8 key = data.readString8(); String8 value = data.readString8(); headers.add(key, value); } reply->writeInt32(setDataSource(url, numHeaders > 0 ? &headers : NULL)); return NO_ERROR; } break; case SET_DATA_SOURCE_FD: { CHECK_INTERFACE(IMediaPlayer, data, reply); int fd = data.readFileDescriptor(); int64_t offset = data.readInt64(); int64_t length = data.readInt64(); reply->writeInt32(setDataSource(fd, offset, length)); return NO_ERROR; } case SET_DATA_SOURCE_STREAM: { CHECK_INTERFACE(IMediaPlayer, data, reply); sp<IStreamSource> source = interface_cast<IStreamSource>(data.readStrongBinder()); reply->writeInt32(setDataSource(source)); return NO_ERROR; } case SET_VIDEO_SURFACETEXTURE: { CHECK_INTERFACE(IMediaPlayer, data, reply); sp<ISurfaceTexture> surfaceTexture = interface_cast<ISurfaceTexture>(data.readStrongBinder()); reply->writeInt32(setVideoSurfaceTexture(surfaceTexture)); return NO_ERROR; } break; case PREPARE_ASYNC: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(prepareAsync()); return NO_ERROR; } break; case START: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(start()); return NO_ERROR; } break; case STOP: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(stop()); return NO_ERROR; } break; case IS_PLAYING: { CHECK_INTERFACE(IMediaPlayer, data, reply); bool state; status_t ret = isPlaying(&state); reply->writeInt32(state); reply->writeInt32(ret); return NO_ERROR; } break; case PAUSE: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(pause()); return NO_ERROR; } break; case SEEK_TO: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(seekTo(data.readInt32())); return NO_ERROR; } break; case GET_CURRENT_POSITION: { CHECK_INTERFACE(IMediaPlayer, data, reply); int msec; status_t ret = getCurrentPosition(&msec); reply->writeInt32(msec); reply->writeInt32(ret); return NO_ERROR; } break; case GET_DURATION: { CHECK_INTERFACE(IMediaPlayer, data, reply); int msec; status_t ret = getDuration(&msec); reply->writeInt32(msec); reply->writeInt32(ret); return NO_ERROR; } break; case RESET: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(reset()); return NO_ERROR; } break; case SET_AUDIO_STREAM_TYPE: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(setAudioStreamType(data.readInt32())); return NO_ERROR; } break; case SET_LOOPING: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(setLooping(data.readInt32())); return NO_ERROR; } break; case SET_VOLUME: { CHECK_INTERFACE(IMediaPlayer, data, reply); float leftVolume = data.readFloat(); float rightVolume = data.readFloat(); reply->writeInt32(setVolume(leftVolume, rightVolume)); return NO_ERROR; } break; case INVOKE: { CHECK_INTERFACE(IMediaPlayer, data, reply); status_t result = invoke(data, reply); return result; } break; case SET_METADATA_FILTER: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(setMetadataFilter(data)); return NO_ERROR; } break; case GET_METADATA: { CHECK_INTERFACE(IMediaPlayer, data, reply); bool update_only = static_cast<bool>(data.readInt32()); bool apply_filter = static_cast<bool>(data.readInt32()); const status_t retcode = getMetadata(update_only, apply_filter, reply); reply->setDataPosition(0); reply->writeInt32(retcode); reply->setDataPosition(0); return NO_ERROR; } break; case SET_AUX_EFFECT_SEND_LEVEL: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(setAuxEffectSendLevel(data.readFloat())); return NO_ERROR; } break; case ATTACH_AUX_EFFECT: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(attachAuxEffect(data.readInt32())); return NO_ERROR; } break; case SET_PARAMETER: { CHECK_INTERFACE(IMediaPlayer, data, reply); int key = data.readInt32(); Parcel request; if (data.dataAvail() > 0) { request.appendFrom( const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail()); } request.setDataPosition(0); reply->writeInt32(setParameter(key, request)); return NO_ERROR; } break; case GET_PARAMETER: { CHECK_INTERFACE(IMediaPlayer, data, reply); return getParameter(data.readInt32(), reply); } break; default: return BBinder::onTransact(code, data, reply, flags); } }