MTP: Add host support for deleting objects.

For example, deleting pictures on a digital camera.

Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/media/java/android/media/MtpClient.java b/media/java/android/media/MtpClient.java
index 946a400..a6d3ec9 100644
--- a/media/java/android/media/MtpClient.java
+++ b/media/java/android/media/MtpClient.java
@@ -43,6 +43,18 @@
         mEventThread.start();
     }
 
+    public boolean deleteObject(int deviceID, int objectID) {
+        return native_delete_object(deviceID, objectID);
+    }
+
+    public int getParent(int deviceID, int objectID) {
+        return native_get_parent(deviceID, objectID);
+    }
+
+    public int getStorageID(int deviceID, int objectID) {
+        return native_get_storage_id(deviceID, objectID);
+    }
+
     private class MtpEventThread extends Thread {
 
         private boolean mDone;
@@ -77,4 +89,7 @@
     private native final void native_setup();
     private native final void native_finalize();
     private native void native_wait_for_event();
+    private native boolean native_delete_object(int deviceID, int objectID);
+    private native int native_get_parent(int deviceID, int objectID);
+    private native int native_get_storage_id(int deviceID, int objectID);
 }
\ No newline at end of file
diff --git a/media/java/android/media/MtpCursor.java b/media/java/android/media/MtpCursor.java
index cf3bc09..6ecfd0d 100644
--- a/media/java/android/media/MtpCursor.java
+++ b/media/java/android/media/MtpCursor.java
@@ -108,6 +108,16 @@
         return mCount;
     }
 
+    @Override
+    public boolean requery() {
+        Log.d(TAG, "requery");
+        mCount = NO_COUNT;
+        if (mWindow != null) {
+            mWindow.clear();
+        }
+        return super.requery();
+    }
+
     private void fillWindow(int startPos) {
         if (mWindow == null) {
             // If there isn't a window set already it will only be accessed locally
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp
index ee352174..3aa8a35 100644
--- a/media/mtp/MtpDevice.cpp
+++ b/media/mtp/MtpDevice.cpp
@@ -179,6 +179,8 @@
 }
 
 MtpObjectInfo* MtpDevice::getObjectInfo(MtpObjectHandle handle) {
+    // FIXME - we might want to add some caching here
+
     mRequest.reset();
     mRequest.setParameter(1, handle);
     if (!sendRequest(MTP_OPERATION_GET_OBJECT_INFO))
@@ -205,7 +207,33 @@
     }
     outLength = 0;
     return NULL;
+}
 
+bool MtpDevice::deleteObject(MtpObjectHandle handle) {
+    mRequest.reset();
+    mRequest.setParameter(1, handle);
+    if (sendRequest(MTP_OPERATION_DELETE_OBJECT)) {
+        MtpResponseCode ret = readResponse();
+        if (ret == MTP_RESPONSE_OK)
+            return true;
+    }
+    return false;
+}
+
+MtpObjectHandle MtpDevice::getParent(MtpObjectHandle handle) {
+    MtpObjectInfo* info = getObjectInfo(handle);
+    if (info)
+        return info->mParent;
+    else
+        return -1;
+}
+
+MtpObjectHandle MtpDevice::getStorageID(MtpObjectHandle handle) {
+    MtpObjectInfo* info = getObjectInfo(handle);
+    if (info)
+        return info->mStorageID;
+    else
+        return -1;
 }
 
 MtpProperty* MtpDevice::getDevicePropDesc(MtpDeviceProperty code) {
diff --git a/media/mtp/MtpDevice.h b/media/mtp/MtpDevice.h
index 0ee930f..9b05197 100644
--- a/media/mtp/MtpDevice.h
+++ b/media/mtp/MtpDevice.h
@@ -71,6 +71,9 @@
     MtpObjectHandleList*    getObjectHandles(MtpStorageID storageID, MtpObjectFormat format, MtpObjectHandle parent);
     MtpObjectInfo*          getObjectInfo(MtpObjectHandle handle);
     void*                   getThumbnail(MtpObjectHandle handle, int& outLength);
+    bool                    deleteObject(MtpObjectHandle handle);
+    MtpObjectHandle         getParent(MtpObjectHandle handle);
+    MtpObjectHandle         getStorageID(MtpObjectHandle handle);
 
     MtpProperty*            getDevicePropDesc(MtpDeviceProperty code);