Пример #1
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
Пример #2
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
Пример #3
0
def _read_serialized_stream_header(ctx):
    node = Node('SerializedStreamHeader')
    node.add_leaf('RootId', read_primitive(ctx.handle, PrimitiveType.Int32))
    node.add_leaf('HeaderId', read_primitive(ctx.handle, PrimitiveType.Int32))
    node.add_leaf('MajorVersion',
                  read_primitive(ctx.handle, PrimitiveType.Int32))
    node.add_leaf('MinorVersion',
                  read_primitive(ctx.handle, PrimitiveType.Int32))
    return node
Пример #4
0
def deserialize(handle):
    ctx = Context(handle)
    root = Node('Root')
    while True:
        try:
            record_type = _read_record_type(ctx)
        except EOFError:
            break
        child = _read_record(ctx, record_type)
        root.add(child)
    return root
Пример #5
0
def deserialize(handle):
    ctx = Context(handle)
    root = Node('Root')
    while True:
        try:
            record_type = _read_record_type(ctx)
        except EOFError:
            break
        child = _read_record(ctx, record_type)
        root.add(child)
    return root
Пример #6
0
def _read_class_members(ctx, object_id):
    if not object_id in ctx.objects:
        raise CorruptDataError(
            'Bad reference to ObjectID {0}'.format(object_id))
    members_meta = ctx.objects[object_id].get('MembersMeta')
    member_nodes = Node('Members')
    for i, member_meta in enumerate(members_meta.children):
        member_node = Node('Member')
        member_node.add(member_meta.get('Name'))
        member_node.add(
            _read_from_binary_type(ctx, member_meta.get_leaf('BinaryType'),
                                   member_meta.get_leaf('PrimitiveType',
                                                        None)))
        member_nodes.add(member_node)
    return member_nodes
Пример #7
0
def _read_binary_library(ctx):
    library_node = Node('BinaryLibrary')
    library_node.add_leaf('LibraryId',
                          read_primitive(ctx.handle, PrimitiveType.Int32))
    library_node.add_leaf('LibraryName',
                          read_primitive(ctx.handle, PrimitiveType.String))
    record_type = _read_record_type(ctx)
    if _is_class(record_type):
        library_node.add(_read_record(ctx, record_type))
        return library_node
    elif _is_array(record_type):
        library_node.add(_read_record(ctx, record_type))
        return library_node
    else:
        raise CorruptDataError(
            'Binary library followed with neither class or array')
Пример #8
0
def _read_binary_library(ctx):
    library_node = Node('BinaryLibrary')
    library_node.add_leaf('LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32))
    library_node.add_leaf('LibraryName', read_primitive(ctx.handle, PrimitiveType.String))
    record_type = _read_record_type(ctx)
    if _is_class(record_type):
        library_node.add(_read_record(ctx, record_type))
        return library_node
    elif _is_array(record_type):
        library_node.add(_read_record(ctx, record_type))
        return library_node
    else:
        raise CorruptDataError(
            'Binary library followed with neither class or array')
Пример #9
0
def _read_serialized_stream_header(ctx):
    node = Node('SerializedStreamHeader')
    node.add_leaf('RootId', read_primitive(ctx.handle, PrimitiveType.Int32))
    node.add_leaf('HeaderId', read_primitive(ctx.handle, PrimitiveType.Int32))
    node.add_leaf('MajorVersion', read_primitive(ctx.handle, PrimitiveType.Int32))
    node.add_leaf('MinorVersion', read_primitive(ctx.handle, PrimitiveType.Int32))
    return node
Пример #10
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
Пример #11
0
def _read_class_members(ctx, object_id):
    if not object_id in ctx.objects:
        raise CorruptDataError(
            'Bad reference to ObjectID {0}'.format(object_id))
    members_meta = ctx.objects[object_id].get('MembersMeta')
    member_nodes = Node('Members')
    for i, member_meta in enumerate(members_meta.children):
        member_node = Node('Member')
        member_node.add(member_meta.get('Name'))
        member_node.add(_read_from_binary_type(
            ctx,
            member_meta.get_leaf('BinaryType'),
            member_meta.get_leaf('PrimitiveType', None)))
        member_nodes.add(member_node)
    return member_nodes
Пример #12
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
Пример #13
0
def _read_create_object(ctx, name):
    object_id = read_primitive(ctx.handle, PrimitiveType.Int32)
    node = Node(name)
    ctx.objects[object_id] = node
    node.add_leaf('ObjectId', object_id)
    return node, object_id
Пример #14
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
Пример #15
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
Пример #16
0
def _read_class_members_meta(ctx, object_id):
    count = read_primitive(ctx.handle, PrimitiveType.Int32)
    names = [None] * count
    binary_types = [None] * count
    for i in range(count):
        names[i] = read_primitive(ctx.handle, PrimitiveType.String)
    for i in range(count):
        binary_types[i] = _read_binary_type(ctx)

    node = Node('MembersMeta')
    for i in range(count):
        member_node = Node('MemberMeta')
        member_node.add_leaf('Name', names[i])
        member_node.add_leaf('BinaryType', binary_types[i])
        if binary_types[i] in (BinaryType.Primitive, BinaryType.PrimitiveArray):
            member_node.add_leaf('PrimitiveType', _read_primitive_type(ctx))
        elif binary_types[i] == BinaryType.SystemClass:
            member_node.add_leaf(
                'ClassName', read_primitive(ctx.handle, PrimitiveType.String))
        elif binary_types[i] == BinaryType.Class:
            member_node.add_leaf(
                'ClassName', read_primitive(ctx.handle, PrimitiveType.String))
            member_node.add_leaf(
                'LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32))
        node.add(member_node)
    return node
Пример #17
0
def _read_create_object(ctx, name):
    object_id = read_primitive(ctx.handle, PrimitiveType.Int32)
    node = Node(name)
    ctx.objects[object_id] = node
    node.add_leaf('ObjectId', object_id)
    return node, object_id
Пример #18
0
def _read_class_members_meta(ctx, object_id):
    count = read_primitive(ctx.handle, PrimitiveType.Int32)
    names = [None] * count
    binary_types = [None] * count
    for i in range(count):
        names[i] = read_primitive(ctx.handle, PrimitiveType.String)
    for i in range(count):
        binary_types[i] = _read_binary_type(ctx)

    node = Node('MembersMeta')
    for i in range(count):
        member_node = Node('MemberMeta')
        member_node.add_leaf('Name', names[i])
        member_node.add_leaf('BinaryType', binary_types[i])
        if binary_types[i] in (BinaryType.Primitive,
                               BinaryType.PrimitiveArray):
            member_node.add_leaf('PrimitiveType', _read_primitive_type(ctx))
        elif binary_types[i] == BinaryType.SystemClass:
            member_node.add_leaf(
                'ClassName', read_primitive(ctx.handle, PrimitiveType.String))
        elif binary_types[i] == BinaryType.Class:
            member_node.add_leaf(
                'ClassName', read_primitive(ctx.handle, PrimitiveType.String))
            member_node.add_leaf(
                'LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32))
        node.add(member_node)
    return node