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.database;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
207cd51efcbd2d083bf577696591ef1769034f7e2fJeff Hamiltonimport android.os.Bundle;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
23df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brownimport android.os.Parcelable;
247cd51efcbd2d083bf577696591ef1769034f7e2fJeff Hamiltonimport android.os.RemoteException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Native implementation of the bulk cursor. This is only for use in implementing
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * IPC, application code should use the Cursor interface.
29df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown *
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BulkCursorNative extends Binder implements IBulkCursor
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BulkCursorNative()
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachInterface(this, descriptor);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cast a Binder object into a content resolver interface, generating
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a proxy if needed.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public IBulkCursor asInterface(IBinder obj)
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (obj == null) {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBulkCursor in = (IBulkCursor)obj.queryLocalInterface(descriptor);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (in != null) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return in;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new BulkCursorProxy(obj);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (code) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case GET_CURSOR_WINDOW_TRANSACTION: {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IBulkCursor.descriptor);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int startPos = data.readInt();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CursorWindow window = getWindow(startPos);
65d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                    reply.writeNoException();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (window == null) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reply.writeInt(0);
68d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                    } else {
69d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                        reply.writeInt(1);
70d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown                        window.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DEACTIVATE_TRANSACTION: {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IBulkCursor.descriptor);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    deactivate();
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case CLOSE_TRANSACTION: {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IBulkCursor.descriptor);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    close();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REQUERY_TRANSACTION: {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IBulkCursor.descriptor);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IContentObserver observer =
920cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                            IContentObserver.Stub.asInterface(data.readStrongBinder());
930cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown                    int count = requery(observer);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeInt(count);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeBundle(getExtras());
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ON_MOVE_TRANSACTION: {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IBulkCursor.descriptor);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int position = data.readInt();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    onMove(position);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case GET_EXTRAS_TRANSACTION: {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IBulkCursor.descriptor);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Bundle extras = getExtras();
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeBundle(extras);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case RESPOND_TRANSACTION: {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.enforceInterface(IBulkCursor.descriptor);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Bundle extras = data.readBundle();
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Bundle returnExtras = respond(extras);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeNoException();
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    reply.writeBundle(returnExtras);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DatabaseUtils.writeExceptionToParcel(reply, e);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.onTransact(code, data, reply, flags);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder asBinder()
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class BulkCursorProxy implements IBulkCursor {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mRemote;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle mExtras;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BulkCursorProxy(IBinder remote)
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRemote = remote;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mExtras = null;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder asBinder()
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRemote;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
155650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown    public CursorWindow getWindow(int position) throws RemoteException
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
159df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
160df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IBulkCursor.descriptor);
161650de3dcfcbc7635da3c070410ef1dc4027ae464Jeff Brown            data.writeInt(position);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
163df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(GET_CURSOR_WINDOW_TRANSACTION, data, reply, 0);
164df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
166df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            CursorWindow window = null;
167df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            if (reply.readInt() == 1) {
168df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                window = CursorWindow.newFromParcel(reply);
169df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            }
170df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return window;
171df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
172df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
173df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onMove(int position) throws RemoteException {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
180df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
181df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IBulkCursor.descriptor);
182df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInt(position);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
184df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(ON_MOVE_TRANSACTION, data, reply, 0);
185df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
186df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
187df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
188df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
189df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void deactivate() throws RemoteException
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
196df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
197df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IBulkCursor.descriptor);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(DEACTIVATE_TRANSACTION, data, reply, 0);
200df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
201df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
202df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
203df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
204df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void close() throws RemoteException
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
211df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
212df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IBulkCursor.descriptor);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
214df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(CLOSE_TRANSACTION, data, reply, 0);
215df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
216df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
217df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
218df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
219df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2220cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown    public int requery(IContentObserver observer) throws RemoteException {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
225df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
226df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IBulkCursor.descriptor);
227df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeStrongInterface(observer);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            boolean result = mRemote.transact(REQUERY_TRANSACTION, data, reply, 0);
230df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
232df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            int count;
233df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            if (!result) {
234df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                count = -1;
235df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            } else {
236df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                count = reply.readInt();
237df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                mExtras = reply.readBundle();
238df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            }
239df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return count;
240df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
241df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
242df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Bundle getExtras() throws RemoteException {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mExtras == null) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel data = Parcel.obtain();
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel reply = Parcel.obtain();
250df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            try {
251df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                data.writeInterfaceToken(IBulkCursor.descriptor);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
253df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                mRemote.transact(GET_EXTRAS_TRANSACTION, data, reply, 0);
254df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                DatabaseUtils.readExceptionFromParcel(reply);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
256df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                mExtras = reply.readBundle();
257df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            } finally {
258df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                data.recycle();
259df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown                reply.recycle();
260df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mExtras;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Bundle respond(Bundle extras) throws RemoteException {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain();
268df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        try {
269df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeInterfaceToken(IBulkCursor.descriptor);
270df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.writeBundle(extras);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
272df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            mRemote.transact(RESPOND_TRANSACTION, data, reply, 0);
273df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            DatabaseUtils.readExceptionFromParcel(reply);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
275df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            Bundle returnExtras = reply.readBundle();
276df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            return returnExtras;
277df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        } finally {
278df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            data.recycle();
279df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown            reply.recycle();
280df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown        }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
284