Int32 CDrmRawContent::NativeReadContent( /* [in] */ ArrayOf<Byte>* buf, /* [in] */ Int32 bufOff, /* [in] */ Int32 len, /* [in] */ Int32 mediaOff) { DrmData* p; if (NULL == buf) { return CDrmRawContent::JNI_DRM_FAILURE; } if (len < 0 || bufOff < 0 || len + bufOff > buf->GetLength()) { return CDrmRawContent::JNI_DRM_FAILURE; } if (mediaOff < 0 || len == 0) return CDrmRawContent::JNI_DRM_FAILURE; p = GetItem(mId); if (NULL == p) return CDrmRawContent::JNI_DRM_FAILURE; p->pInData = mInData; len = SVC_drm_getContent(mId, mediaOff, (uint8_t *)buf->GetPayload() + bufOff, len); if (DRM_MEDIA_EOF == len){ return CDrmRawContent::JNI_DRM_EOF; } if (len <= 0){ return CDrmRawContent::JNI_DRM_FAILURE; } return len; }
/* native interface */ JNIEXPORT jint JNICALL Java_android_drm_mobile1_DrmRawContent_nativeReadContent (JNIEnv * env, jobject rawContent, jbyteArray buf, jint bufOff, jint len, jint mediaOff) { jint id; jbyte *nativeBuf; jclass cls; jmethodID mid; DrmData* p; jobject inputStream; jfieldID field; if (NULL == buf) { jclass newExcCls = (*env)->FindClass(env, "java/lang/NullPointerException"); if (newExcCls == NULL) /* Unable to find the exception class, give up. */ return JNI_DRM_FAILURE; (*env)->ThrowNew(env, newExcCls, "b is null"); } if (len < 0 || bufOff < 0 || len + bufOff > (*env)->GetArrayLength(env, buf)) { jclass newExcCls = (*env)->FindClass(env, "java/lang/IndexOutOfBoundsException"); if (newExcCls == NULL) /* Unable to find the exception class, give up. */ return JNI_DRM_FAILURE; (*env)->ThrowNew(env, newExcCls, NULL); } if (mediaOff < 0 || len == 0) return JNI_DRM_FAILURE; if (JNI_DRM_FAILURE == getObjectIntField(env, rawContent, "id", &id)) return JNI_DRM_FAILURE; p = getItem(id); if (NULL == p) return JNI_DRM_FAILURE; cls = (*env)->GetObjectClass(env, rawContent); if (NULL == cls) return JNI_DRM_FAILURE; field = (*env)->GetFieldID(env, cls, "inData", "Ljava/io/BufferedInputStream;"); (*env)->DeleteLocalRef(env, cls); if (NULL == field) return JNI_DRM_FAILURE; inputStream = (*env)->GetObjectField(env, rawContent, field); p->env = env; p->pInData = &inputStream; nativeBuf = (*env)->GetByteArrayElements(env, buf, NULL); len = SVC_drm_getContent(id, mediaOff, (uint8_t *)nativeBuf + bufOff, len); (*env)->ReleaseByteArrayElements(env, buf, nativeBuf, 0); if (DRM_MEDIA_EOF == len) return JNI_DRM_EOF; if (len <= 0) return JNI_DRM_FAILURE; return len; }