Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4d79983f authored by Yin Liu's avatar Yin Liu Committed by Steve Kondik
Browse files

Long mp3 metadata displays as corrupted file after transfer

Cut the metadata to 1 Byte and return in function
getObjectPropertyList in order to show it properly on a PC.

Change-Id: Iefacf9fa86c20ece2572e6d95d35877a94066fe7
parent 6dc441b8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -331,7 +331,7 @@ void MtpDataPacket::putString(const char* s) {

void MtpDataPacket::putString(const uint16_t* string) {
    int count = 0;
    for (int i = 0; i < 256; i++) {
    for (int i = 0; i <= MTP_STRING_MAX_CHARACTER_NUMBER; i++) {
        if (string[i])
            count++;
        else
+21 −16
Original line number Diff line number Diff line
@@ -56,42 +56,47 @@ MtpStringBuffer::~MtpStringBuffer() {
}

void MtpStringBuffer::set(const char* src) {
    int length = strlen(src);
    if (length >= sizeof(mBuffer))
        length = sizeof(mBuffer) - 1;
    memcpy(mBuffer, src, length);

    // count the characters
    int count = 0;
    char ch;
    while ((ch = *src++) != 0) {
    char* dest = (char*)mBuffer;

    while ((ch = *src++) != 0 && count < MTP_STRING_MAX_CHARACTER_NUMBER) {
        if ((ch & 0x80) == 0) {
            // single byte character
            *dest++ = ch;
        } else if ((ch & 0xE0) == 0xC0) {
            // two byte character
            if (! *src++) {
            char ch1 = *src++;
            if (! ch1) {
                // last character was truncated, so ignore last byte
                length--;
                break;
            }

            *dest++ = ch;
            *dest++ = ch1;
        } else if ((ch & 0xF0) == 0xE0) {
            // 3 byte char
            if (! *src++) {
            char ch1 = *src++;
            if (! ch1) {
                // last character was truncated, so ignore last byte
                length--;
                break;
            }
            if (! *src++) {
                // last character was truncated, so ignore last two bytes
                length -= 2;
            char ch2 = *src++;
            if (! ch2) {
                // last character was truncated, so ignore last byte
                break;
            }

            *dest++ = ch;
            *dest++ = ch1;
            *dest++ = ch2;
        }
        count++;
    }

    mByteCount = length + 1;
    mBuffer[length] = 0;
    *dest++ = 0;
    mByteCount = dest - (char*)mBuffer;
    mCharCount = count;
}

@@ -100,7 +105,7 @@ void MtpStringBuffer::set(const uint16_t* src) {
    uint16_t ch;
    uint8_t* dest = mBuffer;

    while ((ch = *src++) != 0 && count < 255) {
    while ((ch = *src++) != 0 && count < MTP_STRING_MAX_CHARACTER_NUMBER) {
        if (ch >= 0x0800) {
            *dest++ = (uint8_t)(0xE0 | (ch >> 12));
            *dest++ = (uint8_t)(0x80 | ((ch >> 6) & 0x3F));
+4 −1
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@

#include <stdint.h>

// Max Character number of a MTP String
#define MTP_STRING_MAX_CHARACTER_NUMBER             255

namespace android {

class MtpDataPacket;
@@ -29,7 +32,7 @@ class MtpStringBuffer {
private:
    // mBuffer contains string in UTF8 format
    // maximum 3 bytes/character, with 1 extra for zero termination
    uint8_t         mBuffer[255 * 3 + 1];
    uint8_t         mBuffer[MTP_STRING_MAX_CHARACTER_NUMBER * 3 + 1];
    int             mCharCount;
    int             mByteCount;