Exemple #1
0
def _read_method_call(ctx):
    node = Node('BinaryMethodCall')

    flags = util.read_fmt(ctx.handle, '<L')
    node.add_leaf('Flags', flags)

    primitive_type = _read_primitive_type(ctx)
    node.add_leaf('MethodName', read_primitive(ctx.handle, primitive_type))

    primitive_type = _read_primitive_type(ctx)
    node.add_leaf('TypeName', read_primitive(ctx.handle, primitive_type))

    if (flags & MessageFlags.ContextInline.value) != 0:
        primitive_type = _read_primitive_type(ctx)
        node.add_leaf('CallContext', read_primitive(ctx.handle,
                                                    primitive_type))

    if (flags & MessageFlags.ArgsInline.value) != 0:
        args_node = _read_array_of_value_with_code(ctx)
        args_node.name = 'Args'
        node.add(args_node)
    elif (flags & MessageFlags.NoArgs.value) == 0:
        record_type = _read_record_type(ctx)
        args_node = _read_record(ctx, record_type)
        args_node.name = 'Args'
        node.add(args_node)

    return node
Exemple #2
0
def _read_method_call(ctx):
    node = Node('BinaryMethodCall')

    flags = util.read_fmt(ctx.handle, '<L')
    node.add_leaf('Flags', flags)

    primitive_type = _read_primitive_type(ctx)
    node.add_leaf('MethodName', read_primitive(ctx.handle, primitive_type))

    primitive_type = _read_primitive_type(ctx)
    node.add_leaf('TypeName', read_primitive(ctx.handle, primitive_type))

    if (flags & MessageFlags.ContextInline.value) != 0:
        primitive_type = _read_primitive_type(ctx)
        node.add_leaf('CallContext', read_primitive(ctx.handle, primitive_type))

    if (flags & MessageFlags.ArgsInline.value) != 0:
        args_node = _read_array_of_value_with_code(ctx)
        args_node.name = 'Args'
        node.add(args_node)
    elif (flags & MessageFlags.NoArgs.value) == 0:
        record_type = _read_record_type(ctx)
        args_node = _read_record(ctx, record_type)
        args_node.name = 'Args'
        node.add(args_node)

    return node
Exemple #3
0
def _read_binary_array(ctx):
    node, object_id = _read_create_object(ctx, 'BinaryArray')
    array_type = BinaryArrayType(util.read_fmt(ctx.handle, 'B'))
    node.add_leaf('BinaryArrayType', array_type)

    rank = util.read_fmt(ctx.handle, '<l')
    node.add_leaf('Rank', rank)

    dimensions_node = Node('Dimensions')
    element_count = 0
    for i in range(rank):
        dimension = util.read_fmt(ctx.handle, '<l')
        dimensions_node.add_leaf('Dimension', dimension)
        if i == 0:
            element_count = dimension
        else:
            element_count *= dimension
    node.add(dimensions_node)

    if array_type in (BinaryArrayType.SingleOffset,
                      BinaryArrayType.JaggedOffset,
                      BinaryArrayType.RectangularOffset):
        lower_bounds_node = Node('LowerBounds')
        for i in range(rank):
            lower_bounds_node.add_leaf('LowerBound',
                                       util.read_fmt(ctx.handle, '<l'))
        node.add(lower_bounds_node)

    binary_type = _read_binary_type(ctx)
    primitive_type = PrimitiveType.Invalid
    if binary_type in (BinaryType.Primitive, BinaryType.PrimitiveArray):
        primitive_type = _read_primitive_type(ctx)
    elif binary_type == BinaryType.SystemClass:
        node.add_leaf('ClassName',
                      read_primitive(ctx.handle, PrimitiveType.String))
    elif binary_type == BinaryType.Class:
        node.add_leaf('ClassName',
                      read_primitive(ctx.handle, PrimitiveType.String))
        node.add_leaf('LibraryId',
                      read_primitive(ctx.handle, PrimitiveType.Int32))

    elements_node = Node('Elements')
    for i in range(element_count):
        elements_node.add(
            _read_from_binary_type(ctx, binary_type, primitive_type))
    node.add(elements_node)
    return node
Exemple #4
0
def _read_array_single_object(ctx):
    node, object_id = _read_create_object(ctx, 'ArraySingleObject')
    length = util.read_fmt(ctx.handle, '<l')
    record_type = _read_record_type(ctx)
    elements_node = Node('Elements')
    for i in range(length):
        elements_node.add_leaf('Element', _read_record(ctx, record_type))
    node.add(elements_node)
    return node
Exemple #5
0
def _read_string(handle):
    length = 0
    for i in range(5):
        num = util.read_fmt(handle, 'B')
        length = length | (num & 0x7F) << (i * 7)
        if num & 0x80 == 0:
            break
    ret = handle.read(length)
    return ret.decode('utf-8')
Exemple #6
0
def _read_string(handle):
    length = 0
    for i in range(5):
        num = util.read_fmt(handle, "B")
        length = length | (num & 0x7F) << (i * 7)
        if num & 0x80 == 0:
            break
    ret = handle.read(length)
    return ret.decode("utf-8")
Exemple #7
0
def _read_array_single_object(ctx):
    node, object_id = _read_create_object(ctx, 'ArraySingleObject')
    length = util.read_fmt(ctx.handle, '<l')
    record_type = _read_record_type(ctx)
    elements_node = Node('Elements')
    for i in range(length):
        elements_node.add_leaf('Element', _read_record(ctx, record_type))
    node.add(elements_node)
    return node
Exemple #8
0
def _read_binary_array(ctx):
    node, object_id = _read_create_object(ctx, 'BinaryArray')
    array_type = BinaryArrayType(util.read_fmt(ctx.handle, 'B'))
    node.add_leaf('BinaryArrayType', array_type)

    rank = util.read_fmt(ctx.handle, '<l')
    node.add_leaf('Rank', rank)

    dimensions_node = Node('Dimensions')
    element_count = 0
    for i in range(rank):
        dimension = util.read_fmt(ctx.handle, '<l')
        dimensions_node.add_leaf('Dimension', dimension)
        if i == 0:
            element_count = dimension
        else:
            element_count *= dimension
    node.add(dimensions_node)

    if array_type in (
            BinaryArrayType.SingleOffset,
            BinaryArrayType.JaggedOffset,
            BinaryArrayType.RectangularOffset):
        lower_bounds_node = Node('LowerBounds')
        for i in range(rank):
            lower_bounds_node.add_leaf(
                'LowerBound', util.read_fmt(ctx.handle, '<l'))
        node.add(lower_bounds_node)

    binary_type = _read_binary_type(ctx)
    primitive_type = PrimitiveType.Invalid
    if binary_type in (BinaryType.Primitive, BinaryType.PrimitiveArray):
        primitive_type = _read_primitive_type(ctx)
    elif binary_type == BinaryType.SystemClass:
        node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String))
    elif binary_type == BinaryType.Class:
        node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String))
        node.add_leaf('LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32))

    elements_node = Node('Elements')
    for i in range(element_count):
        elements_node.add(_read_from_binary_type(ctx, binary_type, primitive_type))
    node.add(elements_node)
    return node
Exemple #9
0
    return util.read_fmt(handle, "<q")


def _read_string(handle):
    length = 0
    for i in range(5):
        num = util.read_fmt(handle, "B")
        length = length | (num & 0x7F) << (i * 7)
        if num & 0x80 == 0:
            break
    ret = handle.read(length)
    return ret.decode("utf-8")


_PRIMITIVE_FACTORY_MAP = {
    PrimitiveType.Boolean: lambda h: util.read_fmt(h, "?"),
    PrimitiveType.Byte: lambda h: util.read_fmt(h, "B"),
    PrimitiveType.Double: lambda h: util.read_fmt(h, "d"),
    PrimitiveType.Int16: lambda h: util.read_fmt(h, "<h"),
    PrimitiveType.Int32: lambda h: util.read_fmt(h, "<l"),
    PrimitiveType.Int64: lambda h: util.read_fmt(h, "<q"),
    PrimitiveType.SByte: lambda h: util.read_fmt(h, "c"),
    PrimitiveType.Single: lambda h: util.read_fmt(h, "f"),
    PrimitiveType.TimeSpan: _read_timespan,
    PrimitiveType.UInt16: lambda h: util.read_fmt(h, "<H"),
    PrimitiveType.UInt32: lambda h: util.read_fmt(h, "<L"),
    PrimitiveType.UInt64: lambda h: util.read_fmt(h, "<Q"),
    PrimitiveType.Null: lambda h: None,
    PrimitiveType.String: _read_string,
}
Exemple #10
0
def _read_record_type(ctx):
    return RecordType(util.read_fmt(ctx.handle, 'B'))
Exemple #11
0
def _read_binary_type(ctx):
    return BinaryType(util.read_fmt(ctx.handle, 'B'))
Exemple #12
0
def _read_primitive_type(ctx):
    return PrimitiveType(util.read_fmt(ctx.handle, 'B'))
Exemple #13
0
def _read_class_with_id(ctx):
    node, object_id = _read_create_object(ctx, 'ClassWithId')
    metadata_id = util.read_fmt(ctx.handle, '<l')
    node.add(ctx.objects[metadata_id].get('MembersMeta'))
    node.add(_read_class_members(ctx, metadata_id))
    return node
Exemple #14
0
def _read_record_type(ctx):
    return RecordType(util.read_fmt(ctx.handle, 'B'))
Exemple #15
0
def _read_timespan(handle):
    return util.read_fmt(handle, "<q")
Exemple #16
0
def _read_timespan(handle):
    return util.read_fmt(handle, '<q')
Exemple #17
0
    return util.read_fmt(handle, '<q')


def _read_string(handle):
    length = 0
    for i in range(5):
        num = util.read_fmt(handle, 'B')
        length = length | (num & 0x7F) << (i * 7)
        if num & 0x80 == 0:
            break
    ret = handle.read(length)
    return ret.decode('utf-8')


_PRIMITIVE_FACTORY_MAP = {
    PrimitiveType.Boolean: lambda h: util.read_fmt(h, '?'),
    PrimitiveType.Byte: lambda h: util.read_fmt(h, 'B'),
    PrimitiveType.Double: lambda h: util.read_fmt(h, 'd'),
    PrimitiveType.Int16: lambda h: util.read_fmt(h, '<h'),
    PrimitiveType.Int32: lambda h: util.read_fmt(h, '<l'),
    PrimitiveType.Int64: lambda h: util.read_fmt(h, '<q'),
    PrimitiveType.SByte: lambda h: util.read_fmt(h, 'c'),
    PrimitiveType.Single: lambda h: util.read_fmt(h, 'f'),
    PrimitiveType.TimeSpan: _read_timespan,
    PrimitiveType.UInt16: lambda h: util.read_fmt(h, '<H'),
    PrimitiveType.UInt32: lambda h: util.read_fmt(h, '<L'),
    PrimitiveType.UInt64: lambda h: util.read_fmt(h, '<Q'),
    PrimitiveType.Null: lambda h: None,
    PrimitiveType.String: _read_string,
}
Exemple #18
0
def _read_class_with_id(ctx):
    node, object_id = _read_create_object(ctx, 'ClassWithId')
    metadata_id = util.read_fmt(ctx.handle, '<l')
    node.add(ctx.objects[metadata_id].get('MembersMeta'))
    node.add(_read_class_members(ctx, metadata_id))
    return node
Exemple #19
0
def _read_primitive_type(ctx):
    return PrimitiveType(util.read_fmt(ctx.handle, 'B'))
Exemple #20
0
def _read_binary_type(ctx):
    return BinaryType(util.read_fmt(ctx.handle, 'B'))