MTP: check for replacing existing files via the database instead of the file system

Change-Id: I283dab48f24d2836e48fab8e49764a9cdf13de55
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/media/java/android/media/MtpDatabase.java b/media/java/android/media/MtpDatabase.java
index 4a9e483..688c7b3 100644
--- a/media/java/android/media/MtpDatabase.java
+++ b/media/java/android/media/MtpDatabase.java
@@ -91,6 +91,7 @@
             Files.FileColumns.DATE_MODIFIED, // 5
     };
     private static final String ID_WHERE = Files.FileColumns._ID + "=?";
+    private static final String PATH_WHERE = Files.FileColumns.DATA + "=?";
     private static final String PARENT_WHERE = Files.FileColumns.PARENT + "=?";
     private static final String PARENT_FORMAT_WHERE = PARENT_WHERE + " AND "
                                             + Files.FileColumns.FORMAT + "=?";
@@ -154,6 +155,25 @@
 
     private int beginSendObject(String path, int format, int parent,
                          int storage, long size, long modified) {
+        // first make sure the object does not exist
+        if (path != null) {
+            Cursor c = null;
+            try {
+                c = mMediaProvider.query(mObjectsUri, ID_PROJECTION, PATH_WHERE,
+                        new String[] { path }, null);
+                if (c != null && c.getCount() > 0) {
+                    Log.w(TAG, "file already exists in beginSendObject: " + path);
+                    return -1;
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException in beginSendObject", e);
+            } finally {
+                if (c != null) {
+                    c.close();
+                }
+            }
+        }
+
         mDatabaseModified = true;
         ContentValues values = new ContentValues();
         values.put(Files.FileColumns.DATA, path);
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index b371e41..236cd0a 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -683,10 +683,6 @@
         path += "/";
     path += (const char *)name;
 
-    // file should not already exist
-    if (access(path, R_OK) == 0)
-        return MTP_RESPONSE_GENERAL_ERROR;
-
     // check space first
     if (mSendObjectFileSize > storage->getFreeSpace())
         return MTP_RESPONSE_STORAGE_FULL;