MTP: Implement GetThumb command

This allows the PC to access thumbnails in JPEG files over MTP/PTP

Bug: 3219495

Change-Id: I4964f8b4826dffb7f0f77464ec91bd2e97a2f007
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index b744b5b..4a8fd3e 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -50,7 +50,7 @@
     MTP_OPERATION_GET_OBJECT_HANDLES,
     MTP_OPERATION_GET_OBJECT_INFO,
     MTP_OPERATION_GET_OBJECT,
-//    MTP_OPERATION_GET_THUMB,
+    MTP_OPERATION_GET_THUMB,
     MTP_OPERATION_DELETE_OBJECT,
     MTP_OPERATION_SEND_OBJECT_INFO,
     MTP_OPERATION_SEND_OBJECT,
@@ -370,6 +370,9 @@
         case MTP_OPERATION_GET_OBJECT:
             response = doGetObject();
             break;
+        case MTP_OPERATION_GET_THUMB:
+            response = doGetThumb();
+            break;
         case MTP_OPERATION_GET_PARTIAL_OBJECT:
         case MTP_OPERATION_GET_PARTIAL_OBJECT_64:
             response = doGetPartialObject(operation);
@@ -736,6 +739,22 @@
     return MTP_RESPONSE_OK;
 }
 
+MtpResponseCode MtpServer::doGetThumb() {
+    MtpObjectHandle handle = mRequest.getParameter(1);
+    size_t thumbSize;
+    void* thumb = mDatabase->getThumbnail(handle, thumbSize);
+    if (thumb) {
+        // send data
+        mData.setOperationCode(mRequest.getOperationCode());
+        mData.setTransactionID(mRequest.getTransactionID());
+        mData.writeData(mFD, thumb, thumbSize);
+        free(thumb);
+        return MTP_RESPONSE_OK;
+    } else {
+        return MTP_RESPONSE_GENERAL_ERROR;
+    }
+}
+
 MtpResponseCode MtpServer::doGetPartialObject(MtpOperationCode operation) {
     if (!hasStorage())
         return MTP_RESPONSE_INVALID_OBJECT_HANDLE;