iZsh-wwmd 0.2.19
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +24 -0
- data/README.rdoc +87 -0
- data/Rakefile +34 -0
- data/examples/config_example.yaml +24 -0
- data/examples/wwmd_example.rb +73 -0
- data/lib/wwmd.rb +78 -0
- data/lib/wwmd/class_extensions.rb +2 -0
- data/lib/wwmd/class_extensions/extensions_base.rb +235 -0
- data/lib/wwmd/class_extensions/extensions_encoding.rb +79 -0
- data/lib/wwmd/class_extensions/extensions_external.rb +18 -0
- data/lib/wwmd/class_extensions/extensions_nilclass.rb +11 -0
- data/lib/wwmd/class_extensions/extensions_rbkb.rb +188 -0
- data/lib/wwmd/class_extensions/mixins_string_encoding.rb +40 -0
- data/lib/wwmd/guid.rb +155 -0
- data/lib/wwmd/page.rb +3 -0
- data/lib/wwmd/page/auth.rb +17 -0
- data/lib/wwmd/page/constants.rb +64 -0
- data/lib/wwmd/page/form.rb +99 -0
- data/lib/wwmd/page/form_array.rb +296 -0
- data/lib/wwmd/page/headers.rb +111 -0
- data/lib/wwmd/page/helpers.rb +30 -0
- data/lib/wwmd/page/html2text_hpricot.rb +76 -0
- data/lib/wwmd/page/html2text_nokogiri.rb +42 -0
- data/lib/wwmd/page/inputs.rb +47 -0
- data/lib/wwmd/page/irb_helpers.rb +114 -0
- data/lib/wwmd/page/page.rb +241 -0
- data/lib/wwmd/page/parsing_convenience.rb +94 -0
- data/lib/wwmd/page/reporting_helpers.rb +87 -0
- data/lib/wwmd/page/scrape.rb +198 -0
- data/lib/wwmd/page/spider.rb +127 -0
- data/lib/wwmd/urlparse.rb +104 -0
- data/lib/wwmd/viewstate.rb +17 -0
- data/lib/wwmd/viewstate/viewstate.rb +101 -0
- data/lib/wwmd/viewstate/viewstate_deserializer_methods.rb +217 -0
- data/lib/wwmd/viewstate/viewstate_from_xml.rb +128 -0
- data/lib/wwmd/viewstate/viewstate_types.rb +51 -0
- data/lib/wwmd/viewstate/viewstate_utils.rb +162 -0
- data/lib/wwmd/viewstate/viewstate_yaml.rb +25 -0
- data/lib/wwmd/viewstate/vs_stubs.rb +22 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_array.rb +38 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_binary_serialized.rb +30 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_hashtable.rb +42 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_hybrid_dict.rb +42 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_indexed_string.rb +6 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_indexed_string_ref.rb +24 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_int_enum.rb +27 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_list.rb +34 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_pair.rb +29 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_read_types.rb +11 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_read_value.rb +35 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_sparse_array.rb +58 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_string.rb +33 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_string_array.rb +39 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_string_formatted.rb +32 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_stub_helpers.rb +37 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_triplet.rb +31 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_type.rb +23 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_unit.rb +30 -0
- data/lib/wwmd/viewstate/vs_stubs/vs_value.rb +35 -0
- data/lib/wwmd/wwmd_config.rb +52 -0
- data/lib/wwmd/wwmd_puts.rb +9 -0
- data/lib/wwmd/wwmd_utils.rb +28 -0
- data/spec/README +3 -0
- data/spec/form_array.spec +49 -0
- data/spec/spider_csrf_test.spec +28 -0
- data/spec/urlparse_test.spec +101 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +51 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/test.rake +40 -0
- data/tasks/zentest.rake +36 -0
- metadata +174 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
module WWMD
|
2
|
+
# private const byte Marker_Format = 0xff;
|
3
|
+
# private const byte Marker_Version_1 = 1;
|
4
|
+
# private const int StringTableSize = 0xff;
|
5
|
+
|
6
|
+
VIEWSTATE_MAGIC = ["\xff\x01"] unless defined?(VIEWSTATE_MAGIC)
|
7
|
+
|
8
|
+
VIEWSTATE_TYPES = {
|
9
|
+
# System.Web.UI.LosFormatter
|
10
|
+
# System.Web.UI.ObjectStateFormatter
|
11
|
+
# .DeserializeValue
|
12
|
+
|
13
|
+
0x00 => :debug, ##X debugging
|
14
|
+
0x01 => :int16, #RX private const byte Token_Int16 = 1;
|
15
|
+
0x02 => :int32, #RX private const byte Token_Int32 = 2;
|
16
|
+
0x03 => :byte, #RX private const byte Token_Byte = 3;
|
17
|
+
0x04 => :char, #RX private const byte Token_Char = 4;
|
18
|
+
0x05 => :string, ##X private const byte Token_String = 5;
|
19
|
+
0x06 => :date_time, #RX private const byte Token_DateTime = 6;
|
20
|
+
0x07 => :double, #RX private const byte Token_Double = 7;
|
21
|
+
0x08 => :single, #RX private const byte Token_Single = 8;
|
22
|
+
0x09 => :color, ##X private const byte Token_Color = 9;
|
23
|
+
0x0a => :known_color, ##X private const byte Token_KnownColor = 10;
|
24
|
+
0x0b => :int_enum, ##X private const byte Token_IntEnum = 11;
|
25
|
+
0x0c => :empty_color, #VX private const byte Token_EmptyColor = 12;
|
26
|
+
0x0f => :pair, ##X private const byte Token_Pair = 15;
|
27
|
+
0x10 => :triplet, ##X private const byte Token_Triplet = 0x10;
|
28
|
+
0x14 => :array, ##X private const byte Token_Array = 20;
|
29
|
+
0x15 => :string_array, ##X private const byte Token_StringArray = 0x15;
|
30
|
+
0x16 => :list, ##X private const byte Token_ArrayList = 0x16;
|
31
|
+
0x17 => :hashtable, ##X private const byte Token_Hashtable = 0x17
|
32
|
+
0x18 => :hybrid_dict, ##X private const byte Token_HybridDictionary = 0x18;
|
33
|
+
0x19 => :type, ##X private const byte Token_Type = 0x19;
|
34
|
+
0x1b => :unit, ##X private const byte Token_Unit = 0x1b;
|
35
|
+
0x1c => :empty_unit, #VX private const byte Token_EmptyUnit = 0x1c;
|
36
|
+
0x1e => :indexed_string, ##X private const byte Token_IndexedStringAdd = 30;
|
37
|
+
0x1f => :indexed_string_ref, ##X private const byte Token_IndexedString = 0x1f;
|
38
|
+
0x28 => :string_formatted, ##X private const byte Token_StringFormatted = 40;
|
39
|
+
0x29 => :typeref_add, ##X private const byte Token_TypeRefAdd = 0x29;
|
40
|
+
0x2a => :typeref_add_local, ##X private const byte Token_TypeRefAddLocal = 0x2a;
|
41
|
+
0x2b => :typeref, ##X private const byte Token_TypeRef = 0x2b;
|
42
|
+
0x32 => :binary_serialized, ##X private const byte Token_BinarySerialized = 50;
|
43
|
+
0x3c => :sparse_array, ##X private const byte Token_SparseArray = 60;
|
44
|
+
0x64 => :null, #VX private const byte Token_Null = 100;
|
45
|
+
0x65 => :empty_byte, #VX private const byte Token_EmptyString = 0x65;
|
46
|
+
0x66 => :zeroint32, #VX private const byte Token_ZeroInt32 = 0x66;
|
47
|
+
0x67 => :bool_true, #VX private const byte Token_True = 0x67;
|
48
|
+
0x68 => :bool_false, #VX private const byte Token_False = 0x68;
|
49
|
+
} unless defined?(VIEWSTATE_TYPES)
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module WWMD
|
2
|
+
module ViewStateUtils
|
3
|
+
|
4
|
+
def putd(msg)
|
5
|
+
puts(msg) if self.debug
|
6
|
+
end
|
7
|
+
|
8
|
+
def slog(obj,msg=nil)
|
9
|
+
raise "No @value" if not obj.respond_to?(:value)
|
10
|
+
raise "No @size" if not obj.respond_to?(:size)
|
11
|
+
return nil if !self.debug
|
12
|
+
putd "#{@stack.size.to_s(16).rjust(8,"0")} [0x#{obj.opcode.to_s(16)}] #{obj.class}: #{msg}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def dlog(t,msg)
|
16
|
+
raise "null token passed to dlog()" if t.nil?
|
17
|
+
o = WWMD::VIEWSTATE_TYPES[t]
|
18
|
+
@obj_counts[o] ||= 0
|
19
|
+
@obj_counts[o] += 1
|
20
|
+
return nil if !self.debug
|
21
|
+
putd "#{self.last_offset} [0x#{t.to_s(16).rjust(2,"0")}] #{VIEWSTATE_TYPES[t]}: #{msg}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def write_7bit_encoded_int(val)
|
25
|
+
s = ""
|
26
|
+
while (val >= 0x80) do
|
27
|
+
s << [val | 0x80].pack("C")
|
28
|
+
val = val >> 7
|
29
|
+
end
|
30
|
+
s << [val].pack("C")
|
31
|
+
return s
|
32
|
+
end
|
33
|
+
|
34
|
+
# why oh why did I have to go find this?
|
35
|
+
# System.IO.BinaryReader.Read7BitEncodedInt
|
36
|
+
def read_7bit_encoded_int(buf=nil)
|
37
|
+
l = 0 # length
|
38
|
+
s = 0 # shift
|
39
|
+
b = "" # byte
|
40
|
+
buf = buf.scan(/./m) if buf
|
41
|
+
begin
|
42
|
+
if not buf
|
43
|
+
b = self.read_int
|
44
|
+
else
|
45
|
+
b = buf.shift.unpack("C").first
|
46
|
+
end
|
47
|
+
l |= (b & 0x7f) << s
|
48
|
+
s += 7
|
49
|
+
end while ((b & 0x80) != 0)
|
50
|
+
return l
|
51
|
+
end
|
52
|
+
|
53
|
+
def read_string
|
54
|
+
len = read_7bit_encoded_int
|
55
|
+
starr = []
|
56
|
+
(1..len).each { |i| starr << @bufarr.shift }
|
57
|
+
return starr.to_s
|
58
|
+
# @bufarr.slice!(0..(len - 1)).join("")
|
59
|
+
end
|
60
|
+
|
61
|
+
def read(count)
|
62
|
+
@bufarr.slice!(0..(count - 1)).join("")
|
63
|
+
end
|
64
|
+
|
65
|
+
def read_int
|
66
|
+
@bufarr.shift.unpack("C").first
|
67
|
+
end
|
68
|
+
alias_method :read_byte, :read_int
|
69
|
+
|
70
|
+
def write_int(val)
|
71
|
+
[val].pack("C")
|
72
|
+
end
|
73
|
+
alias_method :write_byte, :write_int
|
74
|
+
|
75
|
+
def read_short
|
76
|
+
self.read(2).unpack("S").first
|
77
|
+
end
|
78
|
+
|
79
|
+
def write_short(val)
|
80
|
+
[val].pack("n")
|
81
|
+
end
|
82
|
+
|
83
|
+
def read_int32
|
84
|
+
@bufarr.slice!(0..3).join("").unpack("L").first
|
85
|
+
end
|
86
|
+
alias_method :read_single, :read_int32
|
87
|
+
|
88
|
+
def write_int32(val)
|
89
|
+
[val].pack("I")
|
90
|
+
end
|
91
|
+
alias_method :write_single, :write_int32
|
92
|
+
|
93
|
+
def read_double
|
94
|
+
@bufarr.slice!(0..7).join("").unpack("Q").first
|
95
|
+
end
|
96
|
+
|
97
|
+
def write_double(val)
|
98
|
+
[val].pack("Q")
|
99
|
+
end
|
100
|
+
|
101
|
+
def magic?
|
102
|
+
@magic = [@bufarr.shift,@bufarr.shift].join("")
|
103
|
+
VIEWSTATE_MAGIC.include?(@magic)
|
104
|
+
end
|
105
|
+
|
106
|
+
def read_raw_byte
|
107
|
+
@bufarr.shift
|
108
|
+
end
|
109
|
+
|
110
|
+
def serialize_type(op,ref)
|
111
|
+
op_str = [op].pack("C")
|
112
|
+
s = op_str
|
113
|
+
case op
|
114
|
+
when VIEWSTATE_TYPES.index(:typeref)
|
115
|
+
s << write_7bit_encoded_int(ref)
|
116
|
+
when VIEWSTATE_TYPES.index(:typeref_add_local)
|
117
|
+
s << write_7bit_encoded_int(ref.size)
|
118
|
+
s << ref
|
119
|
+
when VIEWSTATE_TYPES.index(:typeref_add)
|
120
|
+
s << write_7bit_encoded_int(ref.size)
|
121
|
+
s << ref
|
122
|
+
else
|
123
|
+
raise "Invalid Type Error #{op.to_s(16)}"
|
124
|
+
end
|
125
|
+
return s
|
126
|
+
end
|
127
|
+
|
128
|
+
def deserialize_type(t=nil)
|
129
|
+
op = self.read_byte
|
130
|
+
case op
|
131
|
+
when VIEWSTATE_TYPES.index(:typeref)
|
132
|
+
type = read_7bit_encoded_int
|
133
|
+
return [op,type]
|
134
|
+
when VIEWSTATE_TYPES.index(:typeref_add_local)
|
135
|
+
name = read_string
|
136
|
+
return [op,name]
|
137
|
+
when VIEWSTATE_TYPES.index(:typeref_add)
|
138
|
+
name = read_string
|
139
|
+
return [op,name]
|
140
|
+
else
|
141
|
+
raise "Invalid Type Error 0x#{op.to_s(16)}"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def offset(cur=nil)
|
146
|
+
(self.size - @bufarr.size).to_s(16).rjust(8,"0")
|
147
|
+
end
|
148
|
+
|
149
|
+
def throw(t=nil)
|
150
|
+
STDERR.puts "==== Error at Type 0x#{t.to_s(16).rjust(2,"0")}"
|
151
|
+
STDERR.puts "offset: #{self.offset}"
|
152
|
+
STDERR.puts "left: #{@bufarr.size}"
|
153
|
+
STDERR.puts @bufarr[0..31].join("").hexdump
|
154
|
+
end
|
155
|
+
|
156
|
+
def next_type
|
157
|
+
t = @bufarr.first.unpack("C").first
|
158
|
+
throw(t) if not VIEWSTATE_TYPES.include?(t)
|
159
|
+
VIEWSTATE_TYPES[t]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class String
|
2
|
+
# right now I have no idea why "\x0d\x0a" is getting munged in yaml transforms
|
3
|
+
# something weird helped find by timur@. double up "\r" before "\n" works
|
4
|
+
# this might be mac specific and break on other platforms. I don't care.
|
5
|
+
# patch not for general use do not try this at home.
|
6
|
+
def to_yaml( opts = {} )
|
7
|
+
YAML::quick_emit( is_complex_yaml? ? object_id : nil, opts ) do |out|
|
8
|
+
if is_binary_data?
|
9
|
+
out.scalar( "tag:yaml.org,2002:binary", [self].pack("m"), :literal )
|
10
|
+
elsif ( self =~ /\r\n/ )
|
11
|
+
# out.scalar( "tag:yaml.org,2002:binary", [self].pack("m"), :literal )
|
12
|
+
out.scalar( taguri, self.gsub(/\r\n/,"\r\r\n"), :quote2 )
|
13
|
+
elsif to_yaml_properties.empty?
|
14
|
+
out.scalar( taguri, self, self =~ /^:/ ? :quote2 : to_yaml_style )
|
15
|
+
else
|
16
|
+
out.map( taguri, to_yaml_style ) do |map|
|
17
|
+
map.add( 'str', "#{self}" )
|
18
|
+
to_yaml_properties.each do |m|
|
19
|
+
map.add( m, instance_variable_get( m ) )
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module WWMD::VSStubs; end
|
2
|
+
require 'wwmd/viewstate/vs_stubs/vs_stub_helpers'
|
3
|
+
require 'wwmd/viewstate/vs_stubs/vs_read_value'
|
4
|
+
require 'wwmd/viewstate/vs_stubs/vs_read_types'
|
5
|
+
require 'wwmd/viewstate/vs_stubs/vs_value'
|
6
|
+
require 'wwmd/viewstate/vs_stubs/vs_array'
|
7
|
+
require 'wwmd/viewstate/vs_stubs/vs_binary_serialized'
|
8
|
+
require 'wwmd/viewstate/vs_stubs/vs_int_enum'
|
9
|
+
require 'wwmd/viewstate/vs_stubs/vs_hashtable'
|
10
|
+
require 'wwmd/viewstate/vs_stubs/vs_hybrid_dict'
|
11
|
+
require 'wwmd/viewstate/vs_stubs/vs_list'
|
12
|
+
require 'wwmd/viewstate/vs_stubs/vs_pair'
|
13
|
+
require 'wwmd/viewstate/vs_stubs/vs_sparse_array'
|
14
|
+
require 'wwmd/viewstate/vs_stubs/vs_string'
|
15
|
+
require 'wwmd/viewstate/vs_stubs/vs_string_array'
|
16
|
+
require 'wwmd/viewstate/vs_stubs/vs_string_formatted'
|
17
|
+
require 'wwmd/viewstate/vs_stubs/vs_triplet'
|
18
|
+
require 'wwmd/viewstate/vs_stubs/vs_type'
|
19
|
+
require 'wwmd/viewstate/vs_stubs/vs_unit'
|
20
|
+
require 'wwmd/viewstate/vs_stubs/vs_indexed_string'
|
21
|
+
require 'wwmd/viewstate/vs_stubs/vs_indexed_string_ref'
|
22
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module WWMD
|
2
|
+
class VSStubs::VSArray
|
3
|
+
include VSStubHelpers
|
4
|
+
|
5
|
+
attr_accessor :value
|
6
|
+
attr_reader :typeref
|
7
|
+
attr_reader :typeval
|
8
|
+
|
9
|
+
def initialize(typeref,typeval)
|
10
|
+
@typeref = typeref
|
11
|
+
@typeval = typeval
|
12
|
+
@value = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def add(obj)
|
16
|
+
@value << obj
|
17
|
+
end
|
18
|
+
|
19
|
+
def serialize
|
20
|
+
stack = super
|
21
|
+
stack << self.write_7bit_encoded_int(self.value.size)
|
22
|
+
self.value.each do |v|
|
23
|
+
stack << v.serialize
|
24
|
+
end
|
25
|
+
return stack
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_xml
|
29
|
+
xml = super
|
30
|
+
xml.add_attribute("size", self.value.size.to_s)
|
31
|
+
self.value.each do |v|
|
32
|
+
xml.add_element(v.to_xml)
|
33
|
+
end
|
34
|
+
xml
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module WWMD
|
2
|
+
class VSStubs::VSBinarySerialized
|
3
|
+
include VSStubHelpers
|
4
|
+
|
5
|
+
attr_accessor :value
|
6
|
+
|
7
|
+
def initialize()
|
8
|
+
@value = ''
|
9
|
+
end
|
10
|
+
|
11
|
+
def set(str)
|
12
|
+
@value = str
|
13
|
+
end
|
14
|
+
|
15
|
+
def serialize
|
16
|
+
stack = super
|
17
|
+
stack << self.write_7bit_encoded_int(self.size)
|
18
|
+
stack << self.value
|
19
|
+
return stack
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_xml
|
23
|
+
xml = super
|
24
|
+
xml.add_attribute("encoding","base64")
|
25
|
+
xml.add_text(self.value.b64e)
|
26
|
+
xml
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module WWMD
|
2
|
+
class VSStubs::VSHashtable
|
3
|
+
include VSStubHelpers
|
4
|
+
|
5
|
+
attr_accessor :value
|
6
|
+
|
7
|
+
def initialize()
|
8
|
+
@value = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(obj1,obj2)
|
12
|
+
@value << [obj1,obj2]
|
13
|
+
end
|
14
|
+
|
15
|
+
def serialize
|
16
|
+
stack = super
|
17
|
+
stack << self.write_7bit_encoded_int(self.size)
|
18
|
+
self.value.each do |k,v|
|
19
|
+
stack << k.serialize
|
20
|
+
stack << v.serialize
|
21
|
+
end
|
22
|
+
return stack
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_xml
|
26
|
+
xml = super
|
27
|
+
xml.add_attribute("size",self.value.size.to_s)
|
28
|
+
self.value.each do |k,v|
|
29
|
+
pair = REXML::Element.new("Pair")
|
30
|
+
key = REXML::Element.new("Key")
|
31
|
+
key.add_element(k.to_xml)
|
32
|
+
val = REXML::Element.new("Value")
|
33
|
+
val.add_element(v.to_xml)
|
34
|
+
pair.add_element(key)
|
35
|
+
pair.add_element(val)
|
36
|
+
xml.add_element(pair)
|
37
|
+
end
|
38
|
+
xml
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module WWMD
|
2
|
+
class VSStubs::VSHybridDict
|
3
|
+
include VSStubHelpers
|
4
|
+
|
5
|
+
attr_accessor :value
|
6
|
+
|
7
|
+
def initialize()
|
8
|
+
@value = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(obj1,obj2)
|
12
|
+
@value << [obj1,obj2]
|
13
|
+
end
|
14
|
+
|
15
|
+
def serialize
|
16
|
+
stack = super
|
17
|
+
stack << self.write_7bit_encoded_int(self.size)
|
18
|
+
self.value.each do |k,v|
|
19
|
+
stack << k.serialize
|
20
|
+
stack << v.serialize
|
21
|
+
end
|
22
|
+
return stack
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_xml
|
26
|
+
xml = super
|
27
|
+
xml.add_attribute("size",self.value.size.to_s)
|
28
|
+
self.value.each do |k,v|
|
29
|
+
pair = REXML::Element.new("Pair")
|
30
|
+
key = REXML::Element.new("Key")
|
31
|
+
key.add_element(k.to_xml)
|
32
|
+
val = REXML::Element.new("Value")
|
33
|
+
val.add_element(v.to_xml)
|
34
|
+
pair.add_element(key)
|
35
|
+
pair.add_element(val)
|
36
|
+
xml.add_element(pair)
|
37
|
+
end
|
38
|
+
xml
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module WWMD
|
2
|
+
class VSStubs::VSIndexedStringRef
|
3
|
+
include VSStubHelpers
|
4
|
+
|
5
|
+
attr_reader :value
|
6
|
+
|
7
|
+
def initialize(ref)
|
8
|
+
@value = ref
|
9
|
+
end
|
10
|
+
|
11
|
+
def serialize
|
12
|
+
stack = super
|
13
|
+
stack << self.write_int(@value)
|
14
|
+
return stack
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_xml
|
18
|
+
xml = super
|
19
|
+
xml.add_text(self.value.to_s)
|
20
|
+
xml
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|