static bool ReadAMFArrayItem()

in src/brpc/amf.cpp [760:843]


static bool ReadAMFArrayItem(AMFInputStream* stream, AMFArray* arr) {
    uint8_t marker;
    if (stream->cut_u8(&marker) != 1u) {
        LOG(ERROR) << "stream is not long enough";
        return false;
    }
    switch ((AMFMarker)marker) {
    case AMF_MARKER_NUMBER: {
        uint64_t val = 0;
        if (stream->cut_u64(&val) != 8u) {
            LOG(ERROR) << "stream is not long enough";
            return false;
        }
        double* dptr = (double*)&val;
        arr->AddNumber(*dptr);
    } break;
    case AMF_MARKER_BOOLEAN: {
        uint8_t val = 0;
        if (stream->cut_u8(&val) != 1u) {
            LOG(ERROR) << "stream is not long enough";
            return false;
        }
        arr->AddBool(val);
    } break;
    case AMF_MARKER_STRING: {
        std::string val;
        if (!ReadAMFShortStringBody(&val, stream)) {
            return false;
        }
        arr->AddString(val);
    } break;
    case AMF_MARKER_TYPED_OBJECT: {
        std::string class_name;
        if (!ReadAMFShortStringBody(&class_name, stream)) {
            LOG(ERROR) << "Fail to read class_name";
        }
    }
    // fall through
    case AMF_MARKER_OBJECT: {
        if (!ReadAMFObjectBody(arr->AddObject(), stream)) {
            return false;
        }
    } break;
    case AMF_MARKER_ECMA_ARRAY: {
        if (!ReadAMFEcmaArrayBody(arr->AddObject(), stream)) {
            return false;
        }
    } break;
    case AMF_MARKER_STRICT_ARRAY: {
        if (!ReadAMFArrayBody(arr->AddArray(), stream)) {
            return false;
        }
    } break;
    case AMF_MARKER_NULL:
        arr->AddNull();
        break;
    case AMF_MARKER_UNDEFINED:
        arr->AddUndefined();
        break;
    case AMF_MARKER_UNSUPPORTED:
        arr->AddUnsupported();
        break;
    case AMF_MARKER_MOVIECLIP:
    case AMF_MARKER_REFERENCE:
    case AMF_MARKER_DATE:
    case AMF_MARKER_RECORDSET:
    case AMF_MARKER_XML_DOCUMENT:
    case AMF_MARKER_AVMPLUS_OBJECT:
        LOG(ERROR) << marker2str(marker) << " is not supported yet";
        return false;
    case AMF_MARKER_OBJECT_END:
        CHECK(false) << "object-end shouldn't be present here";
        break;
    case AMF_MARKER_LONG_STRING: {
        std::string val;
        if (!ReadAMFLongStringBody(&val, stream)) {
            LOG(ERROR) << "stream is not long enough";
            return false;
        }
        arr->AddString(val);
    } break;
    } // switch
    return true;
}