Enhancement for OnInfo callback on DRM Framework

In DRM framework, plugins can transmit DrmInfoEvent to Java layer.
Although DrmInfoEvent has several entries, current implementation
can only convey integer and String. This change enables plugins
uto propagate a hashmap to Java layer. The hashmap can have
one or more Strings and one byte array as value.

Changes are made by Sony Corporation.

bug: 10459159

Change-Id: Ic19265d4ad3db4eda66a3c27e1e08873a8f2a4d7
(cherry picked from commit 4f782bf0cb69929ebf03de239e2c9bf8e82adf5e)
diff --git a/drm/common/DrmInfoEvent.cpp b/drm/common/DrmInfoEvent.cpp
index 27a5a2d..2315aa9 100644
--- a/drm/common/DrmInfoEvent.cpp
+++ b/drm/common/DrmInfoEvent.cpp
@@ -16,16 +16,29 @@
 
 #include <utils/String8.h>
 #include <drm/DrmInfoEvent.h>
+#include <stdlib.h>
 
 using namespace android;
 
 DrmInfoEvent::DrmInfoEvent(int uniqueId, int infoType, const String8 message)
     : mUniqueId(uniqueId),
       mInfoType(infoType),
-      mMessage(message) {
+      mMessage(message),
+      mDrmBuffer() {
 
 }
 
+DrmInfoEvent::DrmInfoEvent(int uniqueId, int infoType, const String8 message,
+        const DrmBuffer& drmBuffer)
+        : mUniqueId(uniqueId), mInfoType(infoType), mMessage(message), mDrmBuffer() {
+    setData(drmBuffer);
+}
+
+DrmInfoEvent::~DrmInfoEvent() {
+    delete [] mDrmBuffer.data;
+}
+
+
 int DrmInfoEvent::getUniqueId() const {
     return mUniqueId;
 }
@@ -38,3 +51,80 @@
     return mMessage;
 }
 
+int DrmInfoEvent::getCount() const {
+    return mAttributes.size();
+}
+
+status_t DrmInfoEvent::put(const String8& key, String8& value) {
+        mAttributes.add(key, value);
+    return DRM_NO_ERROR;
+}
+
+const String8 DrmInfoEvent::get(const String8& key) const {
+    if (mAttributes.indexOfKey(key) != NAME_NOT_FOUND) {
+        return mAttributes.valueFor(key);
+    }
+    return String8("");
+}
+
+const DrmBuffer& DrmInfoEvent::getData() const {
+    return mDrmBuffer;
+}
+
+void DrmInfoEvent::setData(const DrmBuffer& drmBuffer) {
+    delete [] mDrmBuffer.data;
+    mDrmBuffer.data = new char[drmBuffer.length];;
+    mDrmBuffer.length = drmBuffer.length;
+    memcpy(mDrmBuffer.data, drmBuffer.data, drmBuffer.length);
+}
+
+DrmInfoEvent::KeyIterator DrmInfoEvent::keyIterator() const {
+    return KeyIterator(this);
+}
+
+DrmInfoEvent::Iterator DrmInfoEvent::iterator() const {
+    return Iterator(this);
+}
+
+// KeyIterator implementation
+DrmInfoEvent::KeyIterator::KeyIterator(const DrmInfoEvent::KeyIterator& keyIterator)
+        : mDrmInfoEvent(keyIterator.mDrmInfoEvent), mIndex(keyIterator.mIndex) {
+}
+
+bool DrmInfoEvent::KeyIterator::hasNext() {
+    return (mIndex < mDrmInfoEvent->mAttributes.size());
+}
+
+const String8& DrmInfoEvent::KeyIterator::next() {
+    const String8& key = mDrmInfoEvent->mAttributes.keyAt(mIndex);
+    mIndex++;
+    return key;
+}
+
+DrmInfoEvent::KeyIterator& DrmInfoEvent::KeyIterator::operator=(
+        const DrmInfoEvent::KeyIterator& keyIterator) {
+    mDrmInfoEvent = keyIterator.mDrmInfoEvent;
+    mIndex = keyIterator.mIndex;
+    return *this;
+}
+
+// Iterator implementation
+DrmInfoEvent::Iterator::Iterator(const DrmInfoEvent::Iterator& iterator)
+        : mDrmInfoEvent(iterator.mDrmInfoEvent), mIndex(iterator.mIndex) {
+}
+
+DrmInfoEvent::Iterator& DrmInfoEvent::Iterator::operator=(const DrmInfoEvent::Iterator& iterator) {
+    mDrmInfoEvent = iterator.mDrmInfoEvent;
+    mIndex = iterator.mIndex;
+    return *this;
+}
+
+bool DrmInfoEvent::Iterator::hasNext() {
+    return mIndex < mDrmInfoEvent->mAttributes.size();
+}
+
+const String8& DrmInfoEvent::Iterator::next() {
+    const String8& value = mDrmInfoEvent->mAttributes.editValueAt(mIndex);
+    mIndex++;
+    return value;
+}