diff options
Diffstat (limited to 'drm')
-rw-r--r-- | drm/common/DrmInfoEvent.cpp | 92 | ||||
-rw-r--r-- | drm/common/IDrmServiceListener.cpp | 32 |
2 files changed, 122 insertions, 2 deletions
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 @@ const String8 DrmInfoEvent::getMessage() const { 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; +} diff --git a/drm/common/IDrmServiceListener.cpp b/drm/common/IDrmServiceListener.cpp index 6eeea40..d825afb 100644 --- a/drm/common/IDrmServiceListener.cpp +++ b/drm/common/IDrmServiceListener.cpp @@ -32,6 +32,19 @@ status_t BpDrmServiceListener::notify(const DrmInfoEvent& event) { data.writeInt32(event.getType()); data.writeString8(event.getMessage()); + data.writeInt32(event.getCount()); + DrmInfoEvent::KeyIterator keyIt = event.keyIterator(); + while (keyIt.hasNext()) { + String8 key = keyIt.next(); + data.writeString8(key); + data.writeString8(event.get(key)); + } + const DrmBuffer& value = event.getData(); + data.writeInt32(value.length); + if (value.length > 0) { + data.write(value.data, value.length); + } + remote()->transact(NOTIFY, data, &reply); return reply.readInt32(); } @@ -49,7 +62,24 @@ status_t BnDrmServiceListener::onTransact( int type = data.readInt32(); const String8& message = data.readString8(); - status_t status = notify(DrmInfoEvent(uniqueId, type, message)); + DrmInfoEvent event(uniqueId, type, message); + int size = data.readInt32(); + for (int index = 0; index < size; index++) { + String8 key(data.readString8()); + String8 value(data.readString8()); + event.put(key, value); + } + int valueSize = data.readInt32(); + if (valueSize > 0) { + char* valueData = new char[valueSize]; + data.read(valueData, valueSize); + DrmBuffer drmBuffer(valueData, valueSize); + event.setData(drmBuffer); + delete[] valueData; + } + + status_t status = notify(event); + reply->writeInt32(status); return DRM_NO_ERROR; |