static bool ReadAMFObjectField()

in src/brpc/amf.cpp [609:694]


static bool ReadAMFObjectField(AMFInputStream* stream,
                               AMFObject* obj,
                               const std::string& name) {
    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;
        obj->SetNumber(name, *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;
        }
        obj->SetBool(name, val);
    } break;
    case AMF_MARKER_STRING: {
        std::string val;
        if (!ReadAMFShortStringBody(&val, stream)) {
            return false;
        }
        obj->SetString(name, 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(obj->MutableObject(name), stream)) {
            return false;
        }
    } break;
    case AMF_MARKER_ECMA_ARRAY: {
        if (!ReadAMFEcmaArrayBody(obj->MutableObject(name), stream)) {
            return false;
        }
    } break;
    case AMF_MARKER_STRICT_ARRAY: {
        if (!ReadAMFArrayBody(obj->MutableArray(name), stream)) {
            return false;
        }
    } break;
    case AMF_MARKER_NULL:
        obj->SetNull(name);
        break;
    case AMF_MARKER_UNDEFINED:
        obj->SetUndefined(name);
        break;
    case AMF_MARKER_UNSUPPORTED:
        obj->SetUnsupported(name);
        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;
        }
        obj->SetString(name, val);
    } break;
    } // switch
    return true;
}