Revert "DecryptHandle cleanup"

This reverts commit e75d74c70f125bddeb36e175de77e3b0461d1e48.

Test: Local build completes
Bug: 144814133
diff --git a/drm/common/IDrmManagerService.cpp b/drm/common/IDrmManagerService.cpp
index e234547..a6d33b0 100644
--- a/drm/common/IDrmManagerService.cpp
+++ b/drm/common/IDrmManagerService.cpp
@@ -33,6 +33,7 @@
 
 #include "IDrmManagerService.h"
 
+#define INVALID_BUFFER_LENGTH (-1)
 #define MAX_BINDER_TRANSACTION_SIZE ((1*1024*1024)-(4096*2))
 
 using namespace android;
@@ -43,6 +44,26 @@
     data->writeString8(handle->mimeType);
     data->writeInt32(handle->decryptApiType);
     data->writeInt32(handle->status);
+
+    int size = handle->copyControlVector.size();
+    data->writeInt32(size);
+    for (int i = 0; i < size; i++) {
+        data->writeInt32(handle->copyControlVector.keyAt(i));
+        data->writeInt32(handle->copyControlVector.valueAt(i));
+    }
+
+    size = handle->extendedData.size();
+    data->writeInt32(size);
+    for (int i = 0; i < size; i++) {
+        data->writeString8(handle->extendedData.keyAt(i));
+        data->writeString8(handle->extendedData.valueAt(i));
+    }
+
+    if (NULL != handle->decryptInfo) {
+        data->writeInt32(handle->decryptInfo->decryptBufferLength);
+    } else {
+        data->writeInt32(INVALID_BUFFER_LENGTH);
+    }
 }
 
 static void readDecryptHandleFromParcelData(
@@ -55,12 +76,39 @@
     handle->mimeType = data.readString8();
     handle->decryptApiType = data.readInt32();
     handle->status = data.readInt32();
+
+    int size = data.readInt32();
+    for (int i = 0; i < size; i++) {
+        DrmCopyControl key = (DrmCopyControl)data.readInt32();
+        int value = data.readInt32();
+        handle->copyControlVector.add(key, value);
+    }
+
+    size = data.readInt32();
+    for (int i = 0; i < size; i++) {
+        String8 key = data.readString8();
+        String8 value = data.readString8();
+        handle->extendedData.add(key, value);
+    }
+
+    handle->decryptInfo = NULL;
+    const int bufferLen = data.readInt32();
+    if (INVALID_BUFFER_LENGTH != bufferLen) {
+        handle->decryptInfo = new DecryptInfo();
+        handle->decryptInfo->decryptBufferLength = bufferLen;
+    }
 }
 
 static void clearDecryptHandle(sp<DecryptHandle> &handle) {
     if (handle == NULL) {
         return;
     }
+    if (handle->decryptInfo) {
+        delete handle->decryptInfo;
+        handle->decryptInfo = NULL;
+    }
+    handle->copyControlVector.clear();
+    handle->extendedData.clear();
 }
 
 int BpDrmManagerService::addUniqueId(bool isNative) {
diff --git a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
index 86a2c8f..769de0c 100644
--- a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
+++ b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
@@ -512,6 +512,7 @@
             decryptHandle->mimeType = MimeTypeUtil::convertMimeType(contentType);
             decryptHandle->decryptApiType = DecryptApiType::CONTAINER_BASED;
             decryptHandle->status = RightsStatus::RIGHTS_VALID;
+            decryptHandle->decryptInfo = NULL;
             result = DRM_NO_ERROR;
         } else {
             if (retVal && NULL != decodeSession) {
@@ -578,6 +579,13 @@
     }
 
     if (NULL != decryptHandle.get()) {
+        if (NULL != decryptHandle->decryptInfo) {
+            delete decryptHandle->decryptInfo;
+            decryptHandle->decryptInfo = NULL;
+        }
+
+        decryptHandle->copyControlVector.clear();
+        decryptHandle->extendedData.clear();
         decryptHandle.clear();
     }
 
diff --git a/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp b/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp
index 976b820..0fa3478 100644
--- a/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp
+++ b/drm/libdrmframework/plugins/passthru/src/DrmPassthruPlugIn.cpp
@@ -244,6 +244,7 @@
     decryptHandle->mimeType = String8("video/passthru");
     decryptHandle->decryptApiType = DecryptApiType::ELEMENTARY_STREAM_BASED;
     decryptHandle->status = DRM_NO_ERROR;
+    decryptHandle->decryptInfo = NULL;
     return DRM_NO_ERROR;
 #else
     (void)(decryptHandle.get()); // unused
@@ -260,6 +261,9 @@
 status_t DrmPassthruPlugIn::onCloseDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle) {
     ALOGV("DrmPassthruPlugIn::onCloseDecryptSession() : %d", uniqueId);
     if (NULL != decryptHandle.get()) {
+        if (NULL != decryptHandle->decryptInfo) {
+            delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL;
+        }
         decryptHandle.clear();
     }
     return DRM_NO_ERROR;
diff --git a/include/drm/drm_framework_common.h b/include/drm/drm_framework_common.h
index 7e3c28f..d5f3ba2 100644
--- a/include/drm/drm_framework_common.h
+++ b/include/drm/drm_framework_common.h
@@ -49,6 +49,17 @@
 };
 
 /**
+ * copy control settings used in DecryptHandle::copyControlVector
+ */
+enum DrmCopyControl {
+    DRM_COPY_CONTROL_BASE = 1000,
+    // the key used to set the value for HDCP
+    // if the associated value is 1, then HDCP is required
+    // otherwise, HDCP is not required
+    DRM_COPY_CONTROL_HDCP = DRM_COPY_CONTROL_BASE
+};
+
+/**
  * Defines DRM Buffer
  */
 class DrmBuffer {
@@ -226,6 +237,20 @@
 };
 
 /**
+ * Defines decryption information
+ */
+class DecryptInfo {
+public:
+    /**
+     * size of memory to be allocated to get the decrypted content.
+     */
+    int decryptBufferLength;
+    /**
+     * reserved for future purpose
+     */
+};
+
+/**
  * Defines decryption handle
  */
 class DecryptHandle : public RefBase {
@@ -262,16 +287,35 @@
      *     RIGHTS_VALID, RIGHTS_INVALID, RIGHTS_EXPIRED or RIGHTS_NOT_ACQUIRED
      */
     int status;
+    /**
+     * Information required to decrypt content
+     * e.g. size of memory to be allocated to get the decrypted content.
+     */
+    DecryptInfo* decryptInfo;
+    /**
+     * Defines a vector for the copy control settings sent from the DRM plugin
+     * to the player
+     */
+    KeyedVector<DrmCopyControl, int> copyControlVector;
+
+    /**
+     * Defines a vector for any extra data the DRM plugin wants to send
+     * to the native code
+     */
+    KeyedVector<String8, String8> extendedData;
 
 public:
     DecryptHandle():
             decryptId(INVALID_VALUE),
             mimeType(""),
             decryptApiType(INVALID_VALUE),
-            status(INVALID_VALUE) {
+            status(INVALID_VALUE),
+            decryptInfo(NULL) {
+
     }
 
     ~DecryptHandle() {
+        delete decryptInfo; decryptInfo = NULL;
     }
 };