Class: Rex::Java::Serialization::Model::NewClassDesc

Inherits:
Element
  • Object
show all
Includes:
Rex::Java::Serialization
Defined in:
lib/rex/java/serialization/model/new_class_desc.rb

Overview

This class provides a newClassDesc representation

Constant Summary

Constants included from Rex::Java::Serialization

BASE_WIRE_HANDLE, OBJECT_TYPE_CODES, PRIMITIVE_TYPE_CODES, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, TC_ARRAY, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING, TYPE_CODES

Instance Attribute Summary collapse

Attributes inherited from Element

#stream

Instance Method Summary collapse

Methods inherited from Element

decode

Constructor Details

#initialize(stream = nil) ⇒ NewClassDesc

Returns a new instance of NewClassDesc.

Parameters:



32
33
34
35
36
37
38
39
40
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 32

def initialize(stream = nil)
  super(stream)
  self.class_name = nil
  self.serial_version = 0
  self.flags = 0
  self.fields = []
  self.class_annotation = nil
  self.super_class = nil
end

Instance Attribute Details

#class_annotationRex::Java::Serialization::Model::Annotation

Returns The java class annotations.

Returns:



26
27
28
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 26

def class_annotation
  @class_annotation
end

#class_nameRex::Java::Serialization::Model::Utf

Returns The name of the class.

Returns:



14
15
16
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 14

def class_name
  @class_name
end

#fieldsArray

Returns The java class fields.

Returns:

  • (Array)

    The java class fields



23
24
25
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 23

def fields
  @fields
end

#flagsFixnum

Returns The java class flags.

Returns:

  • (Fixnum)

    The java class flags



20
21
22
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 20

def flags
  @flags
end

#serial_versionFixnum

Returns The java class serial version.

Returns:

  • (Fixnum)

    The java class serial version



17
18
19
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 17

def serial_version
  @serial_version
end

#super_classRex::Java::Serialization::Model::ClassDesc

Returns The java class superclass description.

Returns:



29
30
31
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 29

def super_class
  @super_class
end

Instance Method Details

#decode(io) ⇒ self

Deserializes a Rex::Java::Serialization::Model::NewClassDesc

Parameters:

  • io (IO)

    the io to read from

Returns:

  • (self)

    if deserialization succeeds

Raises:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 47

def decode(io)
  self.class_name = Utf.decode(io, stream)
  self.serial_version = decode_serial_version(io)
  stream.add_reference(self) unless stream.nil?
  self.flags = decode_flags(io)
  fields_length = decode_fields_length(io)
  fields_length.times do
    field = Field.decode(io, stream)
    self.fields << field
  end

  self.class_annotation = Annotation.decode(io, stream)
  self.super_class = ClassDesc.decode(io, stream)

  self
end

#encodeString

Serializes the Rex::Java::Serialization::Model::ClassDescription

Returns:

  • (String)

    if serialization succeeds

Raises:



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 68

def encode
  unless class_name.class == Rex::Java::Serialization::Model::Utf ||
          class_annotation.class == Rex::Java::Serialization::Model::Annotation ||
          super_class.class == Rex::Java::Serialization::Model::ClassDesc
    raise Rex::Java::Serialization::EncodeError, 'Filed to serialize NewClassDesc'
  end
  encoded = ''
  encoded << class_name.encode
  encoded << [serial_version].pack('q>')
  encoded << [flags].pack('C')
  encoded << [fields.length].pack('n')
  fields.each do |field|
    encoded << field.encode
  end
  encoded << class_annotation.encode
  encoded << super_class.encode

  encoded
end

#to_sString

Creates a print-friendly string representation

Returns:

  • (String)


91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/rex/java/serialization/model/new_class_desc.rb', line 91

def to_s
  str = "#{class_name}, [ "
  fields_str = []
  fields.each do |field|
    fields_str << field.to_s
  end
  str << "#{fields_str.join(', ')} ]"

  case super_class.description
  when NewClassDesc
    str << ", @super_class: #{super_class.description.class_name.to_s}"
  when Reference
    str << ", @super_class: #{super_class.description.to_s}"
  end

  str
end