exerb 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/ChangeLog.ja.rd +305 -0
  4. data/README.en.txt +12 -0
  5. data/README.ja.html +143 -0
  6. data/README.ja.txt +6 -0
  7. data/README.md +50 -0
  8. data/Rakefile +205 -0
  9. data/bin/exerb +185 -0
  10. data/bin/mkexy +47 -0
  11. data/doc/LGPL +513 -0
  12. data/doc/class.ja.html +92 -0
  13. data/doc/command.ja.html +109 -0
  14. data/doc/core.ja.html +72 -0
  15. data/doc/example.ja.html +89 -0
  16. data/doc/faq.ja.html +59 -0
  17. data/doc/inside.ja.rd +404 -0
  18. data/doc/license.ja.html +62 -0
  19. data/doc/logo.gif +0 -0
  20. data/doc/misc.ja.html +72 -0
  21. data/doc/navi.gif +0 -0
  22. data/doc/recipe.ja.html +317 -0
  23. data/doc/style.css +187 -0
  24. data/doc/tutorial.ja.html +182 -0
  25. data/example/Makefile +54 -0
  26. data/example/cat_n.rb +14 -0
  27. data/example/exception.rb +9 -0
  28. data/example/ext/Win32API.so +0 -0
  29. data/example/ext/swin.so +0 -0
  30. data/example/msgbox.rb +14 -0
  31. data/example/rubytk.rb +22 -0
  32. data/example/runtime.ico +0 -0
  33. data/example/runtime.rb +19 -0
  34. data/example/vr/clipboard.rb +106 -0
  35. data/example/vr/compat/rubycompat.rb +18 -0
  36. data/example/vr/compat/vrcomctl.rb +12 -0
  37. data/example/vr/compat/vrcontrol.rb +50 -0
  38. data/example/vr/compat/vrmmedia.rb +24 -0
  39. data/example/vr/contrib/inifile.rb +116 -0
  40. data/example/vr/contrib/msgboxconst.rb +55 -0
  41. data/example/vr/contrib/toolbar.rb +371 -0
  42. data/example/vr/contrib/vrctlcolor.rb +110 -0
  43. data/example/vr/contrib/vrhotkey.rb +35 -0
  44. data/example/vr/contrib/vrlistviewex.rb +71 -0
  45. data/example/vr/contrib/vrstdscrollbar.rb +414 -0
  46. data/example/vr/contrib/vrwincomponent.rb +54 -0
  47. data/example/vr/dragdropformat.rb +209 -0
  48. data/example/vr/rscutil.rb +168 -0
  49. data/example/vr/sysmod.rb +249 -0
  50. data/example/vr/vractivex.rb +56 -0
  51. data/example/vr/vrclipboard.rb +53 -0
  52. data/example/vr/vrcomctl.rb +1819 -0
  53. data/example/vr/vrcontrol.rb +1374 -0
  54. data/example/vr/vrdde.rb +623 -0
  55. data/example/vr/vrddrop.rb +190 -0
  56. data/example/vr/vrdialog.rb +406 -0
  57. data/example/vr/vrhandler.rb +195 -0
  58. data/example/vr/vrlayout.old.rb +209 -0
  59. data/example/vr/vrlayout.rb +173 -0
  60. data/example/vr/vrlayout2.rb +340 -0
  61. data/example/vr/vrmargin.rb +141 -0
  62. data/example/vr/vrmgdlayout.rb +381 -0
  63. data/example/vr/vrmmedia.rb +287 -0
  64. data/example/vr/vrolednd.rb +192 -0
  65. data/example/vr/vrowndraw.rb +108 -0
  66. data/example/vr/vrrichedit.rb +366 -0
  67. data/example/vr/vrtimer.rb +148 -0
  68. data/example/vr/vrtooltip.rb +273 -0
  69. data/example/vr/vrtray.rb +143 -0
  70. data/example/vr/vrtvitem.rb +118 -0
  71. data/example/vr/vrtwopane.rb +223 -0
  72. data/example/vr/vruby.rb +1051 -0
  73. data/example/vr/winconst.rb +158 -0
  74. data/example/vruby.rb +38 -0
  75. data/exerb.gemspec +26 -0
  76. data/extconf.rb +7 -0
  77. data/lib/exerb/archive.rb +143 -0
  78. data/lib/exerb/config.rb +51 -0
  79. data/lib/exerb/error.rb +15 -0
  80. data/lib/exerb/executable.rb +68 -0
  81. data/lib/exerb/file_table.rb +189 -0
  82. data/lib/exerb/mkexy.rb +81 -0
  83. data/lib/exerb/name_table.rb +120 -0
  84. data/lib/exerb/recipe.rb +465 -0
  85. data/lib/exerb/resource.rb +190 -0
  86. data/lib/exerb/resource/base.rb +29 -0
  87. data/lib/exerb/resource/binary.rb +31 -0
  88. data/lib/exerb/resource/dialog.rb +30 -0
  89. data/lib/exerb/resource/group_icon.rb +85 -0
  90. data/lib/exerb/resource/icon.rb +52 -0
  91. data/lib/exerb/resource/version_info.rb +155 -0
  92. data/lib/exerb/resource_library.rb +120 -0
  93. data/lib/exerb/utility.rb +95 -0
  94. data/lib/exerb/utility2.rb +122 -0
  95. data/lib/exerb/version.rb +13 -0
  96. data/lib/exerb/win32/const/resource.rb +51 -0
  97. data/lib/exerb/win32/icon_file.rb +78 -0
  98. data/lib/exerb/win32/pe_file.rb +59 -0
  99. data/lib/exerb/win32/resource_directory.rb +105 -0
  100. data/lib/exerb/win32/resource_directory_root.rb +67 -0
  101. data/lib/exerb/win32/resource_entry.rb +98 -0
  102. data/lib/exerb/win32/struct/base.rb +43 -0
  103. data/lib/exerb/win32/struct/icon_dir_entry.rb +83 -0
  104. data/lib/exerb/win32/struct/icon_header.rb +43 -0
  105. data/lib/exerb/win32/struct/icon_res_entry.rb +48 -0
  106. data/lib/exerb/win32/struct/image_dos_header.rb +73 -0
  107. data/lib/exerb/win32/struct/image_file_header.rb +47 -0
  108. data/lib/exerb/win32/struct/image_nt_headers32.rb +53 -0
  109. data/lib/exerb/win32/struct/image_optional_header32.rb +107 -0
  110. data/lib/exerb/win32/struct/image_resource_data_entry.rb +45 -0
  111. data/lib/exerb/win32/struct/image_resource_directory.rb +47 -0
  112. data/lib/exerb/win32/struct/image_resource_directory_entry.rb +72 -0
  113. data/lib/exerb/win32/struct/image_section_header.rb +53 -0
  114. data/lib/exerb/win32/struct/version_info_block.rb +75 -0
  115. data/lib/exerb/win32/struct/vs_fixed_file_info.rb +62 -0
  116. data/src/exerb/cui.c +48 -0
  117. data/src/exerb/default.rb +1 -0
  118. data/src/exerb/exerb.c +877 -0
  119. data/src/exerb/exerb.h +92 -0
  120. data/src/exerb/gui.c +176 -0
  121. data/src/exerb/module.c +138 -0
  122. data/src/exerb/module.h +7 -0
  123. data/src/exerb/patch.c +27 -0
  124. data/src/exerb/resource.h +22 -0
  125. data/src/exerb/resource.rc +121 -0
  126. data/src/exerb/ruby.ico +0 -0
  127. data/src/exerb/utility.c +263 -0
  128. data/src/exerb/utility.h +33 -0
  129. data/test/alltests.rb +16 -0
  130. data/test/test-argv.rb +26 -0
  131. data/test/test-argv/test-argv.rb +9 -0
  132. data/test/test-argv/test-argv.ret +1 -0
  133. data/test/test-dollarzero.rb +26 -0
  134. data/test/test-dollarzero/test-dollarzero.rb +10 -0
  135. data/test/test-dollarzero/test-dollarzero.ret +2 -0
  136. data/test/test-dot.rb +26 -0
  137. data/test/test-dot/dot.dot.dot.rb +9 -0
  138. data/test/test-dot/dot.dot.rb +9 -0
  139. data/test/test-dot/test-dot.rb +13 -0
  140. data/test/test-dot/test-dot.ret +5 -0
  141. data/test/test-exitcode.rb +28 -0
  142. data/test/test-exitcode/test-exitcode.rb +9 -0
  143. data/test/test-kcode.rb +43 -0
  144. data/test/test-kcode/euc.rb +10 -0
  145. data/test/test-kcode/euc.ret +2 -0
  146. data/test/test-kcode/none.rb +10 -0
  147. data/test/test-kcode/none.ret +2 -0
  148. data/test/test-kcode/sjis.rb +10 -0
  149. data/test/test-kcode/sjis.ret +2 -0
  150. data/test/test-kcode/utf8.rb +10 -0
  151. data/test/test-kcode/utf8.ret +2 -0
  152. data/test/test-loadpath.rb +24 -0
  153. data/test/test-loadpath/test-loadpath.rb +9 -0
  154. data/test/test-nest.rb +18 -0
  155. data/test/test-nest/foo.rb +1 -0
  156. data/test/test-nest/foo/bar.rb +2 -0
  157. data/test/test-nest/foo/foo.rb +1 -0
  158. data/test/test-nest/test-nest.rb +1 -0
  159. data/test/test-nest/test-nest.ret +1 -0
  160. data/test/test-preload.rb +24 -0
  161. data/test/test-preload/test-preload.rb +9 -0
  162. data/test/test-regexp.rb +26 -0
  163. data/test/test-regexp/test-regexp.rb +23 -0
  164. data/test/test-regexp/test-regexp.ret +13 -0
  165. data/test/test-require1.rb +26 -0
  166. data/test/test-require1/require1.rb +9 -0
  167. data/test/test-require1/require2.rb +9 -0
  168. data/test/test-require1/require3.rb +9 -0
  169. data/test/test-require1/require4.rb +9 -0
  170. data/test/test-require1/require5.rb +9 -0
  171. data/test/test-require1/require6.rb +9 -0
  172. data/test/test-require1/test-require1.rb +41 -0
  173. data/test/test-require1/test-require1.ret +27 -0
  174. data/test/test-socket.rb +26 -0
  175. data/test/test-socket/test-socket.rb +7 -0
  176. data/test/test-socket/test-socket.ret +1 -0
  177. data/test/testcase.rb +66 -0
  178. data/vendor/mkexports.rb +167 -0
  179. metadata +352 -0
@@ -0,0 +1,190 @@
1
+
2
+ #==============================================================================#
3
+ # $Id: resource.rb,v 1.30 2005/05/05 02:45:41 yuya Exp $
4
+ #==============================================================================#
5
+
6
+ require 'stringio'
7
+ require 'exerb/error'
8
+ require 'exerb/win32/resource_directory'
9
+ require 'exerb/win32/resource_directory_root'
10
+ require 'exerb/win32/resource_entry'
11
+ require 'exerb/win32/pe_file'
12
+ require 'exerb/win32/const/resource'
13
+ require 'exerb/resource/icon'
14
+ require 'exerb/resource/group_icon'
15
+ require 'exerb/resource/version_info'
16
+ require 'exerb/resource/dialog'
17
+ require 'exerb/resource/binary'
18
+
19
+ #==============================================================================#
20
+
21
+ module Exerb
22
+ end # Exerb
23
+
24
+ #==============================================================================#
25
+
26
+ class Exerb::Resource
27
+
28
+ include Enumerable
29
+
30
+ DEFAULT_LANG_ID = 0x0400 # Neutral
31
+ RT_EXERB = 100
32
+ ID_EXERB = 1
33
+
34
+ def initialize
35
+ @entries = {}
36
+ end
37
+
38
+ attr_reader :entries
39
+
40
+ def self.read(io, base)
41
+ return self.new.read(io, base)
42
+ end
43
+
44
+ def self.new_from_binary(bin, base)
45
+ return self.read(StringIO.new(bin), base)
46
+ end
47
+
48
+ def self.new_from_pe_binary(bin)
49
+ pe = Exerb::Win32::PeFile.new_from_binary(bin)
50
+ rsrc = pe.sections.find { |sec| sec.name == '.rsrc' }
51
+ raise(ExerbError, "a resource section was not found in the core") if rsrc.nil?
52
+
53
+ return self.new_from_binary(bin[rsrc.pointer_to_raw_data, rsrc.virtual_size], rsrc.virtual_address)
54
+ end
55
+
56
+ def self.new_from_pe_file(filepath)
57
+ return File.open(filepath) { |file| self.new_from_pe_binary(file.read) }
58
+ end
59
+
60
+ def each
61
+ @entries.keys.sort.each { |type|
62
+ @entries[type].keys.sort.each { |id|
63
+ @entries[type][id].keys.sort.each { |lang|
64
+ yield(@entries[type][id][lang])
65
+ }
66
+ }
67
+ }
68
+ end
69
+
70
+ def add(type, id, data, lang = DEFAULT_LANG_ID)
71
+ @entries[type] ||= {}
72
+ @entries[type][id] ||= {}
73
+ @entries[type][id][lang] = Exerb::Resource::Entry.new(type, id, lang, data)
74
+
75
+ return self
76
+ end
77
+
78
+ def add_icon(id, data, lang = DEFAULT_LANG_ID)
79
+ return self.add(Exerb::Win32::Const::RT_ICON, id, data, lang)
80
+ end
81
+
82
+ def add_group_icon(id, data, lang = DEFAULT_LANG_ID)
83
+ return self.add(Exerb::Win32::Const::RT_GROUP_ICON, id, data, lang)
84
+ end
85
+
86
+ def add_dialog(id, data, lang = DEFAULT_LANG_ID)
87
+ return self.add(Exerb::Win32::Const::RT_DIALOG, id, data, lang)
88
+ end
89
+
90
+ def add_version(id, data, lang = DEFAULT_LANG_ID)
91
+ return self.add(Exerb::Win32::Const::RT_VERSION, id, data, lang)
92
+ end
93
+
94
+ def add_archive(archive)
95
+ return self.add(Exerb::Resource::RT_EXERB, Exerb::Resource::ID_EXERB, archive)
96
+ end
97
+
98
+ def pack(base, reloc = [])
99
+ root_dir = Exerb::Win32::ResourceDirectoryRoot.new
100
+
101
+ @entries.keys.sort.each { |type|
102
+ root_dir << Exerb::Win32::ResourceDirectory.new(type) { |type_dir|
103
+ @entries[type].keys.sort.each { |id|
104
+ type_dir << Exerb::Win32::ResourceDirectory.new(id) { |item_dir|
105
+ @entries[type][id].keys.sort.each { |lang|
106
+ item_dir << @entries[type][id][lang].to_resource_entry
107
+ }
108
+ }
109
+ }
110
+ }
111
+ }
112
+
113
+ return root_dir.pack_all(base, reloc)
114
+ end
115
+
116
+ def read(io, base)
117
+ root_dir = Exerb::Win32::ResourceDirectoryRoot.read(io, base)
118
+ root_dir.entries.each { |type_dir|
119
+ type_dir.entries.each { |item_dir|
120
+ item_dir.entries.each { |item|
121
+ type, id, lang = type_dir.name, item_dir.name, item.lang
122
+ @entries[type] ||= {}
123
+ @entries[type][id] ||= {}
124
+ @entries[type][id][lang] = Exerb::Resource::Entry.new(type, id, lang, Exerb::Resource::Binary.new(item.entry_data.data))
125
+ }
126
+ }
127
+ }
128
+
129
+ return self
130
+ end
131
+
132
+ def remove(type, id = nil, lang = nil)
133
+ if type && id && lang
134
+ if @entries[type] && @entries[type][id] && @entries[type][id][lang]
135
+ @entries[type][id].delete(lang)
136
+ end
137
+ elsif type && id
138
+ if @entries[type] && @entries[type][id]
139
+ @entries[type].delete(id)
140
+ end
141
+ elsif type
142
+ if @entries[type]
143
+ @entries.delete(type)
144
+ end
145
+ end
146
+
147
+ if type && id && @entries[type] && @entries[type][id] && @entries[type][id].empty?
148
+ @entries[type].delete(id)
149
+ end
150
+
151
+ if type && @entries[type] && @entries[type].empty?
152
+ @entries.delete(type)
153
+ end
154
+
155
+ return self
156
+ end
157
+
158
+ def merge(res)
159
+ res.each { |entry|
160
+ @entries[entry.type] ||= {}
161
+ @entries[entry.type][entry.id] ||= {}
162
+ @entries[entry.type][entry.id][entry.lang] = entry
163
+ }
164
+
165
+ return self
166
+ end
167
+
168
+ end # Exerb::Resource
169
+
170
+ #==============================================================================#
171
+
172
+ class Exerb::Resource::Entry
173
+
174
+ def initialize(type, id, lang, data)
175
+ @type = type
176
+ @id = id
177
+ @lang = lang
178
+ @data = data
179
+ end
180
+
181
+ attr_accessor :type, :id, :lang, :data
182
+
183
+ def to_resource_entry
184
+ return Exerb::Win32::ResourceEntry.new(@data.pack, lang)
185
+ end
186
+
187
+ end # Exerb::Resource::Entry
188
+
189
+ #==============================================================================#
190
+ #==============================================================================#
@@ -0,0 +1,29 @@
1
+
2
+ #==============================================================================#
3
+ # $Id: base.rb,v 1.2 2005/04/30 15:16:04 yuya Exp $
4
+ #==============================================================================#
5
+
6
+ module Exerb
7
+ class Resource
8
+ end # Resource
9
+ end # Exerb
10
+
11
+ #==============================================================================#
12
+
13
+ class Exerb::Resource::Base
14
+
15
+ def initialize
16
+ end
17
+
18
+ def pack
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def size
23
+ return self.pack.size
24
+ end
25
+
26
+ end # Exerb::Resource::Base
27
+
28
+ #==============================================================================#
29
+ #==============================================================================#
@@ -0,0 +1,31 @@
1
+
2
+ #==============================================================================#
3
+ # $Id: binary.rb,v 1.2 2005/04/30 15:37:02 yuya Exp $
4
+ #==============================================================================#
5
+
6
+ require 'exerb/resource/base'
7
+
8
+ #==============================================================================#
9
+
10
+ module Exerb
11
+ class Resource
12
+ end # Resource
13
+ end # Exerb
14
+
15
+ #==============================================================================#
16
+
17
+ class Exerb::Resource::Binary < Exerb::Resource::Base
18
+
19
+ def initialize(bin)
20
+ super()
21
+ @bin = bin
22
+ end
23
+
24
+ def pack
25
+ return @bin
26
+ end
27
+
28
+ end # Exerb::Resource::Binary
29
+
30
+ #==============================================================================#
31
+ #==============================================================================#
@@ -0,0 +1,30 @@
1
+
2
+ #==============================================================================#
3
+ # $Id: dialog.rb,v 1.4 2005/04/30 15:37:02 yuya Exp $
4
+ #==============================================================================#
5
+
6
+ require 'exerb/resource/base'
7
+
8
+ #==============================================================================#
9
+
10
+ module Exerb
11
+ class Resource
12
+ end # Resource
13
+ end # Exerb
14
+
15
+ #==============================================================================#
16
+
17
+ class Exerb::Resource::Dialog < Exerb::Resource::Base
18
+
19
+ def initialize
20
+ super()
21
+ end
22
+
23
+ def pack
24
+ raise(NotImplementedError)
25
+ end
26
+
27
+ end # Exerb::Resource::Dialog
28
+
29
+ #==============================================================================#
30
+ #==============================================================================#
@@ -0,0 +1,85 @@
1
+
2
+ #==============================================================================#
3
+ # $Id: group_icon.rb,v 1.9 2010/06/26 03:13:36 arton Exp $
4
+ #==============================================================================#
5
+
6
+ require 'exerb/win32/struct/icon_header'
7
+ require 'exerb/win32/struct/icon_res_entry'
8
+ require 'exerb/resource/base'
9
+
10
+ #==============================================================================#
11
+
12
+ module Exerb
13
+ class Resource
14
+ end # Resource
15
+ end # Exerb
16
+
17
+ #==============================================================================#
18
+
19
+ class Exerb::Resource::GroupIcon < Exerb::Resource::Base
20
+
21
+ def initialize
22
+ super()
23
+ @entries = []
24
+ end
25
+
26
+ attr_reader :entries
27
+
28
+ def add(id, icon)
29
+ @entries << Entry.new(id, icon.width, icon.height, icon.bit_count, icon.size)
30
+ return self
31
+ end
32
+
33
+ def pack
34
+ header = Exerb::Win32::Struct::IconHeader.new
35
+ header.reserved = 0
36
+ header.type = 1
37
+ header.count = @entries.size
38
+
39
+ packed_header = header.pack
40
+ packed_entries = @entries.collect { |entry| entry.pack }.join
41
+
42
+ return packed_header + packed_entries
43
+ end
44
+
45
+ class Entry
46
+
47
+ def initialize(id, width, height, bit_count, size)
48
+ @id = id
49
+ @widht = width
50
+ @height = height
51
+ @bit_count = bit_count
52
+ @size = size
53
+ end
54
+
55
+ attr_accessor :id, :width, :height, :bit_count, :size
56
+
57
+ def pack
58
+ case @bit_count
59
+ when 1 then cc, bc = 2, 1
60
+ when 4 then cc, bc = 16, 4
61
+ when 8 then cc, bc = 0, 8
62
+ when 24 then cc, bc = 0, 24
63
+ when 32 then cc, bc = 0, 32
64
+ else raise "invalid bit count -- #{@bit_count}"
65
+ end
66
+
67
+ icon_dir_entry = Exerb::Win32::Struct::IconResEntry.new
68
+ icon_dir_entry.width = @widht
69
+ icon_dir_entry.height = @height
70
+ icon_dir_entry.color_count = cc
71
+ icon_dir_entry.reserved = 0
72
+ icon_dir_entry.planes = 1
73
+ icon_dir_entry.bit_count = bc
74
+ icon_dir_entry.bytes_in_res = @size
75
+ icon_dir_entry.image_offset = @id
76
+
77
+ return icon_dir_entry.pack
78
+ end
79
+
80
+ end # Entry
81
+
82
+ end # Exerb::Resource::GroupIcon
83
+
84
+ #==============================================================================#
85
+ #==============================================================================#
@@ -0,0 +1,52 @@
1
+
2
+ #==============================================================================#
3
+ # $Id: icon.rb,v 1.6 2005/05/05 02:26:29 yuya Exp $
4
+ #==============================================================================#
5
+
6
+ require 'exerb/error'
7
+ require 'exerb/win32/icon_file'
8
+ require 'exerb/resource/base'
9
+
10
+ #==============================================================================#
11
+
12
+ module Exerb
13
+ class Resource
14
+ end # Resource
15
+ end # Exerb
16
+
17
+ #==============================================================================#
18
+
19
+ class Exerb::Resource::Icon < Exerb::Resource::Base
20
+
21
+ def initialize
22
+ super()
23
+ @width = nil
24
+ @height = nil
25
+ @bit_count = nil
26
+ @value = nil
27
+ end
28
+
29
+ attr_accessor :width, :height, :bit_count, :value
30
+
31
+ def self.read(input, width, height, bit_count)
32
+ icon_file = Exerb::Win32::IconFile.read(input)
33
+ icon_entry = icon_file.entries.find { |entry| entry.width == width && entry.height == height && entry.bit_count == bit_count }
34
+ raise(Exerb::ExerbError, "no such icon #{width}x#{height}x#{bit_count} in #{input}") unless icon_entry
35
+
36
+ icon = self.new
37
+ icon.width = icon_entry.width
38
+ icon.height = icon_entry.height
39
+ icon.bit_count = icon_entry.bit_count
40
+ icon.value = icon_entry.value
41
+
42
+ return icon
43
+ end
44
+
45
+ def pack
46
+ return @value
47
+ end
48
+
49
+ end # Exerb::Resource::Icon
50
+
51
+ #==============================================================================#
52
+ #==============================================================================#
@@ -0,0 +1,155 @@
1
+
2
+ #==============================================================================#
3
+ # $Id: version_info.rb,v 1.15 2006/06/02 00:47:54 yuya Exp $
4
+ #==============================================================================#
5
+
6
+ require 'exerb/utility'
7
+ require 'exerb/resource/base'
8
+ require 'exerb/win32/const/resource'
9
+ require 'exerb/win32/struct/vs_fixed_file_info'
10
+ require 'exerb/win32/struct/version_info_block'
11
+
12
+ #==============================================================================#
13
+
14
+ module Exerb
15
+ class Resource
16
+ end # Resource
17
+ end # Exerb
18
+
19
+ #==============================================================================#
20
+
21
+ class Exerb::Resource::VersionInfo < Exerb::Resource::Base
22
+
23
+ def initialize
24
+ @file_version_number = 0
25
+ @product_version_number = 0
26
+ @comments = ""
27
+ @company_name = ""
28
+ @legal_copyright = ""
29
+ @legal_trademarks = ""
30
+ @file_version = ""
31
+ @product_version = ""
32
+ @product_name = ""
33
+ @file_description = ""
34
+ @internal_name = ""
35
+ @original_filename = ""
36
+ @private_build = ""
37
+ @special_build = ""
38
+
39
+ @is_dll = false
40
+ end
41
+
42
+ attr_accessor :file_version_number, :product_version_number, :comments, :company_name, :legal_copyright, :legal_trademarks, :file_version, :product_version, :product_name, :file_description, :internal_name, :original_filename, :private_build, :special_build, :is_dll
43
+
44
+ def self.make_version(n1, n2, n3, n4)
45
+ version = (n1 & 0xFFFF) << 48
46
+ version |= (n2 & 0xFFFF) << 32
47
+ version |= (n3 & 0xFFFF) << 16
48
+ version |= (n4 & 0xFFFF)
49
+
50
+ return version
51
+ end
52
+
53
+ def pack
54
+ vsffi = Exerb::Win32::Struct::VsFixedFileInfo.new
55
+ vsffi.signature = Exerb::Win32::Const::VS_FFI_SIGNATURE
56
+ vsffi.struct_version = Exerb::Win32::Const::VS_FFI_STRUCVERSION
57
+ vsffi.file_version_ms = @file_version_number >> 32
58
+ vsffi.file_version_ls = @file_version_number & 0xFFFFFFFF
59
+ vsffi.product_version_ms = @product_version_number >> 32
60
+ vsffi.product_version_ls = @product_version_number & 0xFFFFFFFF
61
+ vsffi.file_flags_mask = Exerb::Win32::Const::VS_FFI_FILEFLAGSMASK
62
+ vsffi.file_flags = 0x00000000
63
+ vsffi.file_os = Exerb::Win32::Const::VOS_NT_WINDOWS32
64
+ vsffi.file_type = (@is_dll ? Exerb::Win32::Const::VFT_DLL : Exerb::Win32::Const::VFT_APP)
65
+ vsffi.file_subtype = Exerb::Win32::Const::VFT2_UNKNOWN
66
+ vsffi.file_date_ms = 0x00000000
67
+ vsffi.file_date_ls = 0x00000000
68
+
69
+ block = BlockType0.new('VS_VERSION_INFO', vsffi.pack) { |vvi|
70
+ vvi << BlockType1.new('StringFileInfo') { |sfi|
71
+ # Language:Neutral CodePage:Unicode
72
+ sfi << BlockType1.new('000004b0') { |neutral|
73
+ neutral << BlockType1String.new('Comments', @comments)
74
+ neutral << BlockType1String.new('CompanyName', @company_name)
75
+ neutral << BlockType1String.new('LegalCopyright', @legal_copyright)
76
+ neutral << BlockType1String.new('LegalTrademarks', @legal_trademarks)
77
+ neutral << BlockType1String.new('FileVersion', @file_version)
78
+ neutral << BlockType1String.new('ProductVersion', @product_version)
79
+ neutral << BlockType1String.new('ProductName', @product_name)
80
+ neutral << BlockType1String.new('FileDescription', @file_description)
81
+ neutral << BlockType1String.new('InternalName', @internal_name)
82
+ neutral << BlockType1String.new('OriginalFilename', @original_filename)
83
+ neutral << BlockType1String.new('PrivateBuild', @private_build)
84
+ neutral << BlockType1String.new('SpecialBuild', @special_build)
85
+ }
86
+ }
87
+ vvi << BlockType1.new('VarFileInfo') { |vfi|
88
+ vfi << BlockType0.new('Translation', [0x04B00000].pack('L'))
89
+ }
90
+ }
91
+
92
+ return block.pack
93
+ end
94
+
95
+ class BlockBase
96
+
97
+ def initialize(type, key, value = '', unicode = false)
98
+ @type = type
99
+ @key = key
100
+ @value = value
101
+ @unicode = unicode
102
+ @children = []
103
+
104
+ yield(self) if block_given?
105
+ end
106
+
107
+ attr_accessor :type, :key, :value, :unicode, :children
108
+
109
+ def <<(child)
110
+ @children << child
111
+ end
112
+
113
+ def pack
114
+ packed_children = @children.collect { |child| child.pack }.join
115
+
116
+ block = Exerb::Win32::Struct::VersionInfoBlock.new
117
+ block.type = @type
118
+ block.key = @key.unpack("U*").pack("v*") # UTF-8 to UTF-16LE
119
+ block.data = @value
120
+ block.value_length = (@unicode ? @value.size / 2 : @value.size)
121
+ block.total_length = block.pack.size + packed_children.size
122
+
123
+ return Exerb::Utility.alignment(block.pack, 4) + packed_children
124
+ end
125
+
126
+ end # Block
127
+
128
+ class BlockType0 < BlockBase
129
+
130
+ def initialize(key, value = '', unicode = false)
131
+ super(0x0000, key, value, unicode)
132
+ end
133
+
134
+ end # BlockType0
135
+
136
+ class BlockType1 < BlockBase
137
+
138
+ def initialize(key, value = '', unicode = false)
139
+ super(0x0001, key, value, unicode)
140
+ end
141
+
142
+ end # BlockType1
143
+
144
+ class BlockType1String < BlockType1
145
+
146
+ def initialize(key, value)
147
+ super(key, value.to_s.unpack("U*").pack("v*") + "\0\0", true) # UTF-8 to UTF-16LE
148
+ end
149
+
150
+ end # BlockType1String
151
+
152
+ end # Exerb::Resource::VersionInfo
153
+
154
+ #==============================================================================#
155
+ #==============================================================================#