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

Commit 4f8bb114 authored by Marco Nelissen's avatar Marco Nelissen Committed by Android Git Automerger
Browse files

am 1526c2e1: am 96a7b5a9: Merge "Long mp3 metadata displays as corrupted file after transfer"

* commit '1526c2e1':
  Long mp3 metadata displays as corrupted file after transfer
parents 6146f60c 1526c2e1
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;