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

Commit 489558d0 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "Offer to write Strings through Parcels as UTF-8." into rvc-dev

parents d838f693 2f8bdb55
Loading
Loading
Loading
Loading
+42 −30
Original line number Original line Diff line number Diff line
@@ -987,12 +987,22 @@ status_t Parcel::writeCString(const char* str)


status_t Parcel::writeString8(const String8& str)
status_t Parcel::writeString8(const String8& str)
{
{
    status_t err = writeInt32(str.bytes());
    return writeString8(str.string(), str.size());
    // only write string if its length is more than zero characters,
}
    // as readString8 will only read if the length field is non-zero.

    // this is slightly different from how writeString16 works.
status_t Parcel::writeString8(const char* str, size_t len)
    if (str.bytes() > 0 && err == NO_ERROR) {
{
        err = write(str.string(), str.bytes()+1);
    if (str == nullptr) return writeInt32(-1);

    status_t err = writeInt32(len);
    if (err == NO_ERROR) {
        uint8_t* data = (uint8_t*)writeInplace(len+sizeof(char));
        if (data) {
            memcpy(data, str, len);
            *reinterpret_cast<char*>(data+len) = 0;
            return NO_ERROR;
        }
        err = mError;
    }
    }
    return err;
    return err;
}
}
@@ -1832,37 +1842,39 @@ const char* Parcel::readCString() const


String8 Parcel::readString8() const
String8 Parcel::readString8() const
{
{
    String8 retString;
    size_t len;
    status_t status = readString8(&retString);
    const char* str = readString8Inplace(&len);
    if (status != OK) {
    if (str) return String8(str, len);
        // We don't care about errors here, so just return an empty string.
    ALOGE("Reading a NULL string not supported here.");
    return String8();
    return String8();
}
}
    return retString;
}


status_t Parcel::readString8(String8* pArg) const
status_t Parcel::readString8(String8* pArg) const
{
{
    int32_t size;
    size_t len;
    status_t status = readInt32(&size);
    const char* str = readString8Inplace(&len);
    if (status != OK) {
    if (str) {
        return status;
        pArg->setTo(str, len);
    }
        return 0;
    // watch for potential int overflow from size+1
    } else {
    if (size < 0 || size >= INT32_MAX) {
        return BAD_VALUE;
    }
    // |writeString8| writes nothing for empty string.
    if (size == 0) {
        *pArg = String8();
        *pArg = String8();
        return OK;
        return UNEXPECTED_NULL;
    }
}
}

const char* Parcel::readString8Inplace(size_t* outLen) const
{
    int32_t size = readInt32();
    // watch for potential int overflow from size+1
    if (size >= 0 && size < INT32_MAX) {
        *outLen = size;
        const char* str = (const char*)readInplace(size+1);
        const char* str = (const char*)readInplace(size+1);
    if (str == nullptr) {
        if (str != nullptr) {
        return BAD_VALUE;
            return str;
        }
        }
    pArg->setTo(str, size);
    }
    return OK;
    *outLen = 0;
    return nullptr;
}
}


String16 Parcel::readString16() const
String16 Parcel::readString16() const
+2 −0
Original line number Original line Diff line number Diff line
@@ -119,6 +119,7 @@ public:
    status_t            writeDouble(double val);
    status_t            writeDouble(double val);
    status_t            writeCString(const char* str);
    status_t            writeCString(const char* str);
    status_t            writeString8(const String8& str);
    status_t            writeString8(const String8& str);
    status_t            writeString8(const char* str, size_t len);
    status_t            writeString16(const String16& str);
    status_t            writeString16(const String16& str);
    status_t            writeString16(const std::unique_ptr<String16>& str);
    status_t            writeString16(const std::unique_ptr<String16>& str);
    status_t            writeString16(const char16_t* str, size_t len);
    status_t            writeString16(const char16_t* str, size_t len);
@@ -283,6 +284,7 @@ public:
    const char*         readCString() const;
    const char*         readCString() const;
    String8             readString8() const;
    String8             readString8() const;
    status_t            readString8(String8* pArg) const;
    status_t            readString8(String8* pArg) const;
    const char*         readString8Inplace(size_t* outLen) const;
    String16            readString16() const;
    String16            readString16() const;
    status_t            readString16(String16* pArg) const;
    status_t            readString16(String16* pArg) const;
    status_t            readString16(std::unique_ptr<String16>* pArg) const;
    status_t            readString16(std::unique_ptr<String16>* pArg) const;