19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetFileDescriptor;
20fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brownimport android.database.BulkCursorDescriptor;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.BulkCursorNative;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.BulkCursorToCursorAdaptor;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
24d2183654e03d589b120467f4e98da1b178ceeadbJeff Brownimport android.database.CursorToBulkCursorAdaptor;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.IBulkCursor;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.IContentObserver;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
301877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrickimport android.os.Bundle;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
33a7771df3696954f0e279407e8894a916a7cb26ccJeff Brownimport android.os.ICancellationSignal;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
3903d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintanaimport java.util.ArrayList;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectabstract public class ContentProviderNative extends Binder implements IContentProvider {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentProviderNative()
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachInterface(this, descriptor);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cast a Binder object into a content resolver interface, generating
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a proxy if needed.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public IContentProvider asInterface(IBinder obj)
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (obj == null) {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IContentProvider in =
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (IContentProvider)obj.queryLocalInterface(descriptor);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (in != null) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return in;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new ContentProviderProxy(obj);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown    /**
69d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown     * Gets the name of the content provider.
70d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown     * Should probably be part of the {@link IContentProvider} interface.
71d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown     * @return The content provider name.
72d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown     */
73d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown    public abstract String getProviderName();
74d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (code) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case QUERY_TRANSACTION:
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
839ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
859ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick
869ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick                    // String[] projection
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int num = data.readInt();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String[] projection = null;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (num > 0) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        projection = new String[num];
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i = 0; i < num; i++) {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            projection[i] = data.readString();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
959ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick
969ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick                    // String selection, String[] selectionArgs...
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String selection = data.readString();
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    num = data.readInt();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String[] selectionArgs = null;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (num > 0) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        selectionArgs = new String[num];
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i = 0; i < num; i++) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            selectionArgs[i] = data.readString();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1069ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String sortOrder = data.readString();
108d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                    IContentObserver observer = IContentObserver.Stub.asInterface(
109d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                            data.readStrongBinder());
1104c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown                    ICancellationSignal cancellationSignal = ICancellationSignal.Stub.asInterface(
11175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                            data.readStrongBinder());
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    Cursor cursor = query(url, projection, selection, selectionArgs, sortOrder,
1144c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown                            cancellationSignal);
115d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                    if (cursor != null) {
116d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                        CursorToBulkCursorAdaptor adaptor = new CursorToBulkCursorAdaptor(
1170cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                                cursor, observer, getProviderName());
118fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown                        BulkCursorDescriptor d = adaptor.getBulkCursorDescriptor();
119d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown
120d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                        reply.writeNoException();
121fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown                        reply.writeInt(1);
122fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown                        d.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
124eca53640a863b40ea9f96f280a90ce8aa538f9d1Fabrice Di Meglio                        reply.writeNoException();
125fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown                        reply.writeInt(0);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1279ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case GET_TYPE_TRANSACTION:
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String type = getType(url);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeString(type);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case INSERT_TRANSACTION:
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ContentValues values = ContentValues.CREATOR.createFromParcel(data);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri out = insert(url, values);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri.writeToParcel(reply, out);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case BULK_INSERT_TRANSACTION:
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ContentValues[] values = data.createTypedArray(ContentValues.CREATOR);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int count = bulkInsert(url, values);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeInt(count);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1668943737692169f564cd34a9c8d471f3a5d438712Fred Quintana                case APPLY_BATCH_TRANSACTION:
1678943737692169f564cd34a9c8d471f3a5d438712Fred Quintana                {
1688943737692169f564cd34a9c8d471f3a5d438712Fred Quintana                    data.enforceInterface(IContentProvider.descriptor);
16903d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana                    final int numOperations = data.readInt();
17003d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana                    final ArrayList<ContentProviderOperation> operations =
17103d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana                            new ArrayList<ContentProviderOperation>(numOperations);
17203d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana                    for (int i = 0; i < numOperations; i++) {
17303d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana                        operations.add(i, ContentProviderOperation.CREATOR.createFromParcel(data));
17403d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana                    }
1758943737692169f564cd34a9c8d471f3a5d438712Fred Quintana                    final ContentProviderResult[] results = applyBatch(operations);
1766a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana                    reply.writeNoException();
1778943737692169f564cd34a9c8d471f3a5d438712Fred Quintana                    reply.writeTypedArray(results, 0);
1786a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana                    return true;
1796a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana                }
1806a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DELETE_TRANSACTION:
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String selection = data.readString();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String[] selectionArgs = data.readStringArray();
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int count = delete(url, selection, selectionArgs);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeInt(count);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case UPDATE_TRANSACTION:
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ContentValues values = ContentValues.CREATOR.createFromParcel(data);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String selection = data.readString();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String[] selectionArgs = data.readStringArray();
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int count = update(url, values, selection, selectionArgs);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeInt(count);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case OPEN_FILE_TRANSACTION:
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String mode = data.readString();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ParcelFileDescriptor fd;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fd = openFile(url, mode);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (fd != null) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reply.writeInt(1);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fd.writeToParcel(reply,
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reply.writeInt(0);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case OPEN_ASSET_FILE_TRANSACTION:
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IContentProvider.descriptor);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri url = Uri.CREATOR.createFromParcel(data);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String mode = data.readString();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    AssetFileDescriptor fd;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fd = openAssetFile(url, mode);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (fd != null) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reply.writeInt(1);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fd.writeToParcel(reply,
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reply.writeInt(0);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2471877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick
2481877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                case CALL_TRANSACTION:
2491877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                {
2501877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    data.enforceInterface(IContentProvider.descriptor);
2511877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick
2521877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    String method = data.readString();
2531877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    String stringArg = data.readString();
2541877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    Bundle args = data.readBundle();
2551877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick
2561877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    Bundle responseBundle = call(method, stringArg, args);
2571877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick
2581877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    reply.writeNoException();
2591877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    reply.writeBundle(responseBundle);
2601877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                    return true;
2611877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick                }
26223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
26323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                case GET_STREAM_TYPES_TRANSACTION:
26423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                {
26523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    data.enforceInterface(IContentProvider.descriptor);
26623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    Uri url = Uri.CREATOR.createFromParcel(data);
26723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    String mimeTypeFilter = data.readString();
26823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    String[] types = getStreamTypes(url, mimeTypeFilter);
26923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    reply.writeNoException();
27023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    reply.writeStringArray(types);
27123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
27223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    return true;
27323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                }
27423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
27523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                case OPEN_TYPED_ASSET_FILE_TRANSACTION:
27623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                {
27723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    data.enforceInterface(IContentProvider.descriptor);
27823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    Uri url = Uri.CREATOR.createFromParcel(data);
27923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    String mimeType = data.readString();
28023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    Bundle opts = data.readBundle();
28123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
28223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    AssetFileDescriptor fd;
28323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    fd = openTypedAssetFile(url, mimeType, opts);
28423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    reply.writeNoException();
28523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    if (fd != null) {
28623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                        reply.writeInt(1);
28723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                        fd.writeToParcel(reply,
28823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                                Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
28923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    } else {
29023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                        reply.writeInt(0);
29123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    }
29223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                    return true;
29323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn                }
29475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown
29575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                case CREATE_CANCELATION_SIGNAL_TRANSACTION:
29675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                {
29775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    data.enforceInterface(IContentProvider.descriptor);
29875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown
2994c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown                    ICancellationSignal cancellationSignal = createCancellationSignal();
30075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    reply.writeNoException();
3014c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown                    reply.writeStrongBinder(cancellationSignal.asBinder());
30275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    return true;
30375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DatabaseUtils.writeExceptionToParcel(reply, e);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.onTransact(code, data, reply, flags);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder asBinder()
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class ContentProviderProxy implements IContentProvider
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentProviderProxy(IBinder remote)
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRemote = remote;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder asBinder()
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRemote;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
332d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown    public Cursor query(Uri url, String[] projection, String selection,
3334c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown            String[] selectionArgs, String sortOrder, ICancellationSignal cancellationSignal)
33475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    throws RemoteException {
3350cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown        BulkCursorToCursorAdaptor adaptor = new BulkCursorToCursorAdaptor();
3360cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown        Parcel data = Parcel.obtain();
3370cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown        Parcel reply = Parcel.obtain();
338df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
3390cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
3400cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown
3410cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            url.writeToParcel(data, 0);
3420cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            int length = 0;
3430cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            if (projection != null) {
3440cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                length = projection.length;
3450cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            }
3460cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            data.writeInt(length);
3470cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            for (int i = 0; i < length; i++) {
3480cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                data.writeString(projection[i]);
3490cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            }
3500cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            data.writeString(selection);
3510cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            if (selectionArgs != null) {
3520cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                length = selectionArgs.length;
3530cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            } else {
3540cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                length = 0;
3550cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            }
3560cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            data.writeInt(length);
3570cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            for (int i = 0; i < length; i++) {
3580cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                data.writeString(selectionArgs[i]);
3590cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            }
3600cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            data.writeString(sortOrder);
3610cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            data.writeStrongBinder(adaptor.getObserver().asBinder());
3624c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown            data.writeStrongBinder(cancellationSignal != null ? cancellationSignal.asBinder() : null);
3630cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown
3640cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            mRemote.transact(IContentProvider.QUERY_TRANSACTION, data, reply, 0);
3650cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown
3660cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
3670cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown
368fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown            if (reply.readInt() != 0) {
369fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown                BulkCursorDescriptor d = BulkCursorDescriptor.CREATOR.createFromParcel(reply);
370fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown                adaptor.initialize(d);
3710cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            } else {
372d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                adaptor.close();
3730cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                adaptor = null;
3749ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick            }
3750cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            return adaptor;
3760cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown        } catch (RemoteException ex) {
3770cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            adaptor.close();
3780cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            throw ex;
3790cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown        } catch (RuntimeException ex) {
3800cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            adaptor.close();
3810cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            throw ex;
382df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
3830cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            data.recycle();
3840cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown            reply.recycle();
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getType(Uri url) throws RemoteException
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
392df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
393df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
395df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
397df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.GET_TYPE_TRANSACTION, data, reply, 0);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
400df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            String out = reply.readString();
401df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return out;
402df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
403df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
404df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
405df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uri insert(Uri url, ContentValues values) throws RemoteException
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
412df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
413df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
415df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
416df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            values.writeToParcel(data, 0);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
418df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.INSERT_TRANSACTION, data, reply, 0);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
420df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
421df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            Uri out = Uri.CREATOR.createFromParcel(reply);
422df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return out;
423df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
424df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
425df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
426df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int bulkInsert(Uri url, ContentValues[] values) throws RemoteException {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
432df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
433df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
435df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
436df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeTypedArray(values, 0);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
438df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.BULK_INSERT_TRANSACTION, data, reply, 0);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
440df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
441df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            int count = reply.readInt();
442df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return count;
443df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
444df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
445df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
446df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44903d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana    public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
4508943737692169f564cd34a9c8d471f3a5d438712Fred Quintana            throws RemoteException, OperationApplicationException {
4516a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana        Parcel data = Parcel.obtain();
4526a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana        Parcel reply = Parcel.obtain();
453df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
454df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
455df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInt(operations.size());
456df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            for (ContentProviderOperation operation : operations) {
457df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                operation.writeToParcel(data, 0);
458df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            }
459df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.APPLY_BATCH_TRANSACTION, data, reply, 0);
460df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown
461df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(reply);
462df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            final ContentProviderResult[] results =
463df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                    reply.createTypedArray(ContentProviderResult.CREATOR);
464df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return results;
465df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
466df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
467df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
46803d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana        }
4696a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana    }
4706a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int delete(Uri url, String selection, String[] selectionArgs)
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
475df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
476df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
478df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
479df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(selection);
480df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeStringArray(selectionArgs);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
482df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.DELETE_TRANSACTION, data, reply, 0);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
484df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
485df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            int count = reply.readInt();
486df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return count;
487df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
488df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
489df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
490df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int update(Uri url, ContentValues values, String selection,
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] selectionArgs) throws RemoteException {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
497df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
498df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
500df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
501df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            values.writeToParcel(data, 0);
502df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(selection);
503df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeStringArray(selectionArgs);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
505df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.UPDATE_TRANSACTION, data, reply, 0);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
507df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
508df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            int count = reply.readInt();
509df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return count;
510df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
511df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
512df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
513df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ParcelFileDescriptor openFile(Uri url, String mode)
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException, FileNotFoundException {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
520df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
521df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
523df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
524df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(mode);
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
526df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.OPEN_FILE_TRANSACTION, data, reply, 0);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
528df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(reply);
529df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            int has = reply.readInt();
530df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            ParcelFileDescriptor fd = has != 0 ? reply.readFileDescriptor() : null;
531df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return fd;
532df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
533df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
534df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
535df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetFileDescriptor openAssetFile(Uri url, String mode)
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException, FileNotFoundException {
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
542df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
543df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
545df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
546df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(mode);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
548df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.OPEN_ASSET_FILE_TRANSACTION, data, reply, 0);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
550df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(reply);
551df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            int has = reply.readInt();
552df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            AssetFileDescriptor fd = has != 0
553df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                    ? AssetFileDescriptor.CREATOR.createFromParcel(reply) : null;
554df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return fd;
555df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
556df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
557df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
558df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5611877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick    public Bundle call(String method, String request, Bundle args)
5621877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick            throws RemoteException {
5631877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick        Parcel data = Parcel.obtain();
5641877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick        Parcel reply = Parcel.obtain();
565df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
566df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
5671877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick
568df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(method);
569df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(request);
570df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeBundle(args);
571dfb437e17c6ba3b29f9e636d064125668d706249Brad Fitzpatrick
572df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.CALL_TRANSACTION, data, reply, 0);
573dfb437e17c6ba3b29f9e636d064125668d706249Brad Fitzpatrick
574df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
575df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            Bundle bundle = reply.readBundle();
576df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return bundle;
577df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
578df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
579df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
580df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
5811877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick    }
5821877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick
58323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn    public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException
58423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn    {
58523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn        Parcel data = Parcel.obtain();
58623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn        Parcel reply = Parcel.obtain();
587df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
588df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
58923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
590df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
591df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(mimeTypeFilter);
59223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
593df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.GET_STREAM_TYPES_TRANSACTION, data, reply, 0);
59423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
595df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
596df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            String[] out = reply.createStringArray();
597df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return out;
598df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
599df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
600df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
601df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
60223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn    }
60323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
60423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn    public AssetFileDescriptor openTypedAssetFile(Uri url, String mimeType, Bundle opts)
60523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn            throws RemoteException, FileNotFoundException {
60623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn        Parcel data = Parcel.obtain();
60723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn        Parcel reply = Parcel.obtain();
608df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
609df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
610df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown
611df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            url.writeToParcel(data, 0);
612df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeString(mimeType);
613df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeBundle(opts);
614df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown
615df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(IContentProvider.OPEN_TYPED_ASSET_FILE_TRANSACTION, data, reply, 0);
616df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown
617df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(reply);
618df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            int has = reply.readInt();
619df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            AssetFileDescriptor fd = has != 0
620df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                    ? AssetFileDescriptor.CREATOR.createFromParcel(reply) : null;
621df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return fd;
622df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
623df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
624df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
625df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
62623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn    }
62723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn
6284c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown    public ICancellationSignal createCancellationSignal() throws RemoteException {
62975ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown        Parcel data = Parcel.obtain();
63075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown        Parcel reply = Parcel.obtain();
63175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown        try {
63275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown            data.writeInterfaceToken(IContentProvider.descriptor);
63375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown
63475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown            mRemote.transact(IContentProvider.CREATE_CANCELATION_SIGNAL_TRANSACTION,
63575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    data, reply, 0);
63675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown
63775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
6384c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown            ICancellationSignal cancellationSignal = ICancellationSignal.Stub.asInterface(
63975ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown                    reply.readStrongBinder());
6404c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown            return cancellationSignal;
64175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown        } finally {
64275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown            data.recycle();
64375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown            reply.recycle();
64475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown        }
64575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown    }
64675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mRemote;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
649