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