Class: Rex::Struct2::SStruct

Inherits:
Object
  • Object
show all
Includes:
Element
Defined in:
lib/rex/struct2/s_struct.rb

Direct Known Subclasses

CStruct

Instance Attribute Summary collapse

Attributes included from Element

#container, #restraint, #value

Instance Method Summary collapse

Methods included from Element

#slength, #update_restraint

Constructor Details

#initialize(*opts) ⇒ SStruct

watch out!, leftover returns our copy of the string! so don't do anything stupid like struct.leftover.slice! !!


20
21
22
23
# File 'lib/rex/struct2/s_struct.rb', line 20

def initialize(*opts)
  self.elements = [ ]
  self.add_element(*opts)
end

Instance Attribute Details

#leftoverObject

Returns the value of attribute leftover


12
13
14
# File 'lib/rex/struct2/s_struct.rb', line 12

def leftover
  @leftover
end

Instance Method Details

#<<(obj) ⇒ Object


39
40
41
# File 'lib/rex/struct2/s_struct.rb', line 39

def <<(obj)
  self.add_element(obj)
end

#[](obj) ⇒ Object


64
65
66
# File 'lib/rex/struct2/s_struct.rb', line 64

def [](obj)
  return elements[obj]
end

#add_element(*objs) ⇒ Object


31
32
33
34
35
36
37
# File 'lib/rex/struct2/s_struct.rb', line 31

def add_element(*objs)
  objs.each { |o|
    elements << o
    o.container = self
  }
  return self
end

#each(&block) ⇒ Object


68
69
70
# File 'lib/rex/struct2/s_struct.rb', line 68

def each(&block)
  return elements.each(&block)
end

#from_s(obytes) ⇒ Object


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/rex/struct2/s_struct.rb', line 72

def from_s(obytes)
  # make my own copy so I can chop it up
  bytes = obytes.dup
  length = 0

  # I don't think we should call update_restraint here, but
  # I could have mis thought or something

  # if we have a restraint (and if there is a val) truncate
  if restraint
    max = restraint.max
    bytes = bytes.slice(0, max) if max
  end

  elements.each { |e|
    used = e.from_s(bytes)
    return if !used
    bytes.slice!(0, used)
    length += used
  }

  # make sure we matched out min restraint, else return failure
  if restraint
    min = restraint.min
    return if min && length < min
  end

  # I guess this is me getting "set", so I should have a value
  # and I should update my restraints on set
  self.value = obytes.slice(0, length)

  self.leftover = bytes
  return(length)
end

#lengthObject


60
61
62
# File 'lib/rex/struct2/s_struct.rb', line 60

def length
  return elements.length
end

#resetObject


26
27
28
29
# File 'lib/rex/struct2/s_struct.rb', line 26

def reset
  elements.each {|e| e.reset}
  return self
end

#to_sObject


43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rex/struct2/s_struct.rb', line 43

def to_s
  # !!! what do we do on mix restraint issues? just fail?
  # maybe throw an exception, because that is most likely
  # a usage error

  buff = ""
  elements.each do |e|
    buff << e.to_s
  end

  if restraint && restraint.max
    return buff.slice(0, restraint.max)
  else
    return buff
  end
end