diff options
| author | Jeff Hamilton <jham@android.com> | 2010-10-21 16:38:47 -0500 |
|---|---|---|
| committer | Jeff Hamilton <jham@android.com> | 2010-10-21 22:39:41 -0500 |
| commit | 389a440ad13f7b16e8f7c7f1670bdd55f1e2112a (patch) | |
| tree | def02e1a495f57e433c457e34339333855351faa | |
| parent | 1bd8a8c8acdb7c3aa875ea62ccf0b9111f1c9410 (diff) | |
| download | frameworks_base-389a440ad13f7b16e8f7c7f1670bdd55f1e2112a.zip frameworks_base-389a440ad13f7b16e8f7c7f1670bdd55f1e2112a.tar.gz frameworks_base-389a440ad13f7b16e8f7c7f1670bdd55f1e2112a.tar.bz2 | |
Backport ParcelFileDescriptor.createPipe() from master.
This allows content providers to expose arbitraty data
through the ContentResolver open* APIs.
Change-Id: I408a0b7cee9cdba5654a962098386c012d6b3549
| -rw-r--r-- | api/current.xml | 13 | ||||
| -rw-r--r-- | core/java/android/os/ParcelFileDescriptor.java | 19 | ||||
| -rw-r--r-- | core/jni/android_os_ParcelFileDescriptor.cpp | 22 |
3 files changed, 54 insertions, 0 deletions
diff --git a/api/current.xml b/api/current.xml index 626a5cc..0df5d3f 100644 --- a/api/current.xml +++ b/api/current.xml @@ -126818,6 +126818,19 @@ <exception name="IOException" type="java.io.IOException"> </exception> </method> +<method name="createPipe" + return="android.os.ParcelFileDescriptor[]" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> <method name="describeContents" return="int" abstract="false" diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 9d213b3..d853f13 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -134,6 +134,25 @@ public class ParcelFileDescriptor implements Parcelable { private static native FileDescriptor getFileDescriptorFromSocket(Socket socket); /** + * Create two ParcelFileDescriptors structured as a data pipe. The first + * ParcelFileDescriptor in the returned array is the read side; the second + * is the write side. + */ + public static ParcelFileDescriptor[] createPipe() throws IOException { + FileDescriptor[] fds = new FileDescriptor[2]; + int res = createPipeNative(fds); + if (res == 0) { + ParcelFileDescriptor[] pfds = new ParcelFileDescriptor[2]; + pfds[0] = new ParcelFileDescriptor(fds[0]); + pfds[1] = new ParcelFileDescriptor(fds[1]); + return pfds; + } + throw new IOException("Unable to create pipe: errno=" + -res); + } + + private static native int createPipeNative(FileDescriptor[] outFds); + + /** * Retrieve the actual FileDescriptor associated with this object. * * @return Returns the FileDescriptor associated with this object. diff --git a/core/jni/android_os_ParcelFileDescriptor.cpp b/core/jni/android_os_ParcelFileDescriptor.cpp index 848a57a..eceef1c 100644 --- a/core/jni/android_os_ParcelFileDescriptor.cpp +++ b/core/jni/android_os_ParcelFileDescriptor.cpp @@ -66,6 +66,26 @@ static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromSocket(JNIEn return fileDescriptorClone; } +static int android_os_ParcelFileDescriptor_createPipeNative(JNIEnv* env, + jobject clazz, jobjectArray outFds) +{ + int fds[2]; + if (pipe(fds) < 0) { + return -errno; + } + + for (int i=0; i<2; i++) { + jobject fdObj = env->NewObject(gFileDescriptorOffsets.mClass, + gFileDescriptorOffsets.mConstructor); + if (fdObj != NULL) { + env->SetIntField(fdObj, gFileDescriptorOffsets.mDescriptor, fds[i]); + } + env->SetObjectArrayElement(outFds, i, fdObj); + } + + return 0; +} + static jint getFd(JNIEnv* env, jobject clazz) { jobject descriptor = env->GetObjectField(clazz, gParcelFileDescriptorOffsets.mFileDescriptor); @@ -109,6 +129,8 @@ static jlong android_os_ParcelFileDescriptor_seekTo(JNIEnv* env, static const JNINativeMethod gParcelFileDescriptorMethods[] = { {"getFileDescriptorFromSocket", "(Ljava/net/Socket;)Ljava/io/FileDescriptor;", (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromSocket}, + {"createPipeNative", "([Ljava/io/FileDescriptor;)I", + (void*)android_os_ParcelFileDescriptor_createPipeNative}, {"getStatSize", "()J", (void*)android_os_ParcelFileDescriptor_getStatSize}, {"seekTo", "(J)J", |
