tinkerbell 0.01

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 (171) hide show
  1. data/Readme.txt +475 -0
  2. data/bin/tinkerbell +19 -0
  3. data/code/01rwdcore/01rwdcore.rb +29 -0
  4. data/code/01rwdcore/02helptexthashbegin.rb +4 -0
  5. data/code/01rwdcore/03helptexthash.rb +23 -0
  6. data/code/01rwdcore/04helptextend.rb +6 -0
  7. data/code/01rwdcore/jumplinkcommand.rb +26 -0
  8. data/code/01rwdcore/openhelpwindow.rb +31 -0
  9. data/code/01rwdcore/returntomain.rb +10 -0
  10. data/code/01rwdcore/rundocuments.rb +10 -0
  11. data/code/01rwdcore/runeditconfiguration.rb +10 -0
  12. data/code/01rwdcore/runhelpabout.rb +10 -0
  13. data/code/01rwdcore/runopentinkerdocument.rb +7 -0
  14. data/code/01rwdcore/rwdtinkerversion.rb +22 -0
  15. data/code/01rwdcore/rwdwindowreturn.rb +9 -0
  16. data/code/01rwdcore/selectiontab.rb +9 -0
  17. data/code/01rwdcore/setuphelpaboutoptions.rb +13 -0
  18. data/code/01rwdcore/setuptinkerdocuments.rb +6 -0
  19. data/code/01rwdcore/test_cases.rb +109 -0
  20. data/code/01rwdcore/test_harness.rb +13 -0
  21. data/code/01rwdcore/uploadreturns.rb +62 -0
  22. data/code/dd0viewphoto/dd0viewphoto.rb +3 -0
  23. data/code/superant.com.rwdtinkerbackwindow/diagnostictab.rb +19 -0
  24. data/code/superant.com.rwdtinkerbackwindow/helptexthashtinkerwin2.rb +61 -0
  25. data/code/superant.com.rwdtinkerbackwindow/initiateapplets.rb +240 -0
  26. data/code/superant.com.rwdtinkerbackwindow/installgemapplet.rb +34 -0
  27. data/code/superant.com.rwdtinkerbackwindow/installremotegem.rb +20 -0
  28. data/code/superant.com.rwdtinkerbackwindow/listgemdirs.rb +12 -0
  29. data/code/superant.com.rwdtinkerbackwindow/listgemzips.rb +53 -0
  30. data/code/superant.com.rwdtinkerbackwindow/listinstalledfiles.rb +12 -0
  31. data/code/superant.com.rwdtinkerbackwindow/listzips.rb +33 -0
  32. data/code/superant.com.rwdtinkerbackwindow/loadconfigurationrecord.rb +22 -0
  33. data/code/superant.com.rwdtinkerbackwindow/loadconfigurationvariables.rb +14 -0
  34. data/code/superant.com.rwdtinkerbackwindow/network.rb +87 -0
  35. data/code/superant.com.rwdtinkerbackwindow/openappletname.rb +19 -0
  36. data/code/superant.com.rwdtinkerbackwindow/openhelpwindowtinkerwin2.rb +38 -0
  37. data/code/superant.com.rwdtinkerbackwindow/remotegemlist.rb +24 -0
  38. data/code/superant.com.rwdtinkerbackwindow/removeapplet.rb +46 -0
  39. data/code/superant.com.rwdtinkerbackwindow/removeappletvariables.rb +52 -0
  40. data/code/superant.com.rwdtinkerbackwindow/runremoteinstall.rb +11 -0
  41. data/code/superant.com.rwdtinkerbackwindow/runrwdtinkerbackwindow.rb +15 -0
  42. data/code/superant.com.rwdtinkerbackwindow/rwdtinkerwin2version.rb +13 -0
  43. data/code/superant.com.rwdtinkerbackwindow/saveconfigurationrecord.rb +19 -0
  44. data/code/superant.com.rwdtinkerbackwindow/viewappletcontents.rb +22 -0
  45. data/code/superant.com.rwdtinkerbackwindow/viewgemappletcontents.rb +24 -0
  46. data/code/superant.com.sandbox/tabone.rb +1 -0
  47. data/code/superant.com.sandbox/tabthree.rb +54 -0
  48. data/code/superant.com.sandbox/tabtwo.rb +1 -0
  49. data/code/superant.com.tinkerbell/0uninstallapplet.rb +9 -0
  50. data/code/superant.com.tinkerbell/clearguiscreen.rb +15 -0
  51. data/code/superant.com.tinkerbell/helptexthashrwdhypernote.rb +30 -0
  52. data/code/superant.com.tinkerbell/initiateapplets.rb +148 -0
  53. data/code/superant.com.tinkerbell/launchtinkerbellnew.rb +19 -0
  54. data/code/superant.com.tinkerbell/listcodefiles.rb +8 -0
  55. data/code/superant.com.tinkerbell/listoptions.rb +7 -0
  56. data/code/superant.com.tinkerbell/loadcode01.rb +19 -0
  57. data/code/superant.com.tinkerbell/loadconfigurationrecord.rb +22 -0
  58. data/code/superant.com.tinkerbell/loadconfigurationvariables.rb +15 -0
  59. data/code/superant.com.tinkerbell/loadtab01.rb +50 -0
  60. data/code/superant.com.tinkerbell/openhelpwindow.rb +30 -0
  61. data/code/superant.com.tinkerbell/runrwdapplet.rb +14 -0
  62. data/code/superant.com.tinkerbell/rwdtinkerversion.rb +10 -0
  63. data/code/superant.com.tinkerbell/savecoderecord.rb +18 -0
  64. data/code/superant.com.tinkerbell/saveconfigurationrecord.rb +20 -0
  65. data/code/superant.com.tinkerbell/saveguirecord.rb +22 -0
  66. data/code/superant.com.tinkerbellback/helptexthashshell.rb +18 -0
  67. data/code/superant.com.tinkerbellback/rubyeval.rb +23 -0
  68. data/code/zz0applicationend/zz0end.rb +4 -0
  69. data/configuration/language.dist +8 -0
  70. data/configuration/rwdapplicationidentity.dist +3 -0
  71. data/configuration/rwdtinker.dist +18 -0
  72. data/configuration/tinkerbellw-0.01.dist +8 -0
  73. data/configuration/tinkerwin2variables.dist +17 -0
  74. data/gui/00coreguibegin/applicationguitop.rwd +4 -0
  75. data/gui/frontwindow0/cc0openphoto.rwd +22 -0
  76. data/gui/frontwindowselections/00selectiontabbegin.rwd +11 -0
  77. data/gui/frontwindowselections/jumplinkcommands.rwd +15 -0
  78. data/gui/frontwindowselections/wwselectionend.rwd +3 -0
  79. data/gui/frontwindowtdocuments/00documentbegin.rwd +6 -0
  80. data/gui/frontwindowtdocuments/tinkerdocuments.rwd +14 -0
  81. data/gui/frontwindowtdocuments/zzdocumentend.rwd +8 -0
  82. data/gui/helpaboutbegin/zzzrwdlasttab.rwd +6 -0
  83. data/gui/helpaboutbegin/zzzzhelpscreenstart.rwd +3 -0
  84. data/gui/helpaboutbegin/zzzzzzhelpabouttab.rwd +15 -0
  85. data/gui/helpaboutzend/helpscreenend.rwd +3 -0
  86. data/gui/helpaboutzend/zhelpscreenstart2.rwd +3 -0
  87. data/gui/helpaboutzend/zzzzhelpabout2.rwd +15 -0
  88. data/gui/helpaboutzend/zzzzhelpscreen2end.rwd +3 -0
  89. data/gui/tinkerbackwindows/superant.com.sandbox/10appletbegin.rwd +4 -0
  90. data/gui/tinkerbackwindows/superant.com.sandbox/11tabone.rwd +12 -0
  91. data/gui/tinkerbackwindows/superant.com.sandbox/22tabtwo.rwd +12 -0
  92. data/gui/tinkerbackwindows/superant.com.sandbox/33tabthree.rwd +23 -0
  93. data/gui/tinkerbackwindows/superant.com.sandbox/98jumplinkcommands.rwd +17 -0
  94. data/gui/tinkerbackwindows/superant.com.sandbox/9end.rwd +6 -0
  95. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/1appname.rwd +5 -0
  96. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/40rwdlistzips.rwd +41 -0
  97. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/45installremotezip.rwd +44 -0
  98. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/50rwdlistapplets.rwd +44 -0
  99. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/60editconfiguration.rwd +30 -0
  100. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/70rwddiagnostics.rwd +29 -0
  101. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/81jumplinkcommands.rwd +17 -0
  102. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/9backend.rwd +6 -0
  103. data/gui/tinkerbackwindows/superant.com.tinkerbell/10appletbegin.rwd +4 -0
  104. data/gui/tinkerbackwindows/superant.com.tinkerbell/10guiedit.rwd +37 -0
  105. data/gui/tinkerbackwindows/superant.com.tinkerbell/15codeedit.rwd +37 -0
  106. data/gui/tinkerbackwindows/superant.com.tinkerbell/67viewconfiguration.rwd +27 -0
  107. data/gui/tinkerbackwindows/superant.com.tinkerbell/81jumplinkcommands.rwd +17 -0
  108. data/gui/tinkerbackwindows/superant.com.tinkerbell/9end.rwd +6 -0
  109. data/gui/tinkerbackwindows/superant.com.tinkerbellback/1appname.rwd +4 -0
  110. data/gui/tinkerbackwindows/superant.com.tinkerbellback/1rwdrubyeval.rwd +15 -0
  111. data/gui/tinkerbackwindows/superant.com.tinkerbellback/2rwdrubyeval.rwd +17 -0
  112. data/gui/tinkerbackwindows/superant.com.tinkerbellback/77jumplinkcommands.rwd +17 -0
  113. data/gui/tinkerbackwindows/superant.com.tinkerbellback/z9end.rwd +6 -0
  114. data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/1appname.rwd +31 -0
  115. data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/9end.rwd +4 -0
  116. data/gui/tinkerbackwindows/superant.com.versionwindow/1appname.rwd +19 -0
  117. data/gui/tinkerbackwindows/superant.com.versionwindow/helpaboutwindow.rwd +17 -0
  118. data/gui/zzcoreguiend/yy9rwdend.rwd +4 -0
  119. data/init.rb +277 -0
  120. data/installed/temp.rb +1 -0
  121. data/installed/tinkerbellw-0.01.inf +13 -0
  122. data/lang/en/rwdcore/languagefile.rb +58 -0
  123. data/lang/es/rwdcore/languagefile-es.rb +62 -0
  124. data/lang/fr/rwdcore/languagefile.rb +64 -0
  125. data/lang/jp/rwdcore/languagefile.rb +72 -0
  126. data/lang/nl/rwdcore/languagefile.rb +75 -0
  127. data/lib/rconftool.rb +380 -0
  128. data/lib/rwd/browser.rb +123 -0
  129. data/lib/rwd/ftools.rb +174 -0
  130. data/lib/rwd/mime.rb +328 -0
  131. data/lib/rwd/net.rb +866 -0
  132. data/lib/rwd/ruby.rb +889 -0
  133. data/lib/rwd/rwd.rb +1405 -0
  134. data/lib/rwd/sgml.rb +236 -0
  135. data/lib/rwd/thread.rb +63 -0
  136. data/lib/rwd/tree.rb +371 -0
  137. data/lib/rwd/xml.rb +101 -0
  138. data/lib/rwdthemes/default.rwd +317 -0
  139. data/lib/rwdthemes/pda.rwd +72 -0
  140. data/lib/rwdthemes/windowslike.rwd +171 -0
  141. data/lib/zip/ioextras.rb +114 -0
  142. data/lib/zip/stdrubyext.rb +111 -0
  143. data/lib/zip/tempfile_bugfixed.rb +195 -0
  144. data/lib/zip/zip.rb +1378 -0
  145. data/lib/zip/zipfilesystem.rb +558 -0
  146. data/lib/zip/ziprequire.rb +61 -0
  147. data/rwd_files/HowTo_Tinker.txt +475 -0
  148. data/rwd_files/HowTo_TinkerBell.txt +110 -0
  149. data/rwd_files/HowTo_TinkerWin2.txt +202 -0
  150. data/rwd_files/Readme.txt +57 -0
  151. data/rwd_files/RubyWebDialogs.html +6 -0
  152. data/rwd_files/favicon.ico +0 -0
  153. data/rwd_files/rdoc-style.css +175 -0
  154. data/rwd_files/rwdapplications.html +54 -0
  155. data/rwd_files/tinker.png +0 -0
  156. data/rwdconfig.dist +21 -0
  157. data/rwdtinker.rb +1 -0
  158. data/tests/RubyGauge.rb +179 -0
  159. data/tests/checkdepends.sh +4 -0
  160. data/tests/cleancnf.sh +6 -0
  161. data/tests/makedist-tinkerbell.rb +56 -0
  162. data/tests/makedist.rb +69 -0
  163. data/tests/rdep.rb +354 -0
  164. data/tests/totranslate.lang +93 -0
  165. data/tinkerbell-0.01.gem +0 -0
  166. data/zips/rwdwaddresses-1.05.zip +0 -0
  167. data/zips/rwdwgutenberg-0.09.zip +0 -0
  168. data/zips/temp.rb +1 -0
  169. data/zips/tinkerbellw-0.01.zip +0 -0
  170. data/zips/wrubyslippers-1.06.zip +0 -0
  171. metadata +231 -0
data/lib/rwd/rwd.rb ADDED
@@ -0,0 +1,1405 @@
1
+ require "lib/rwd/ruby"
2
+ require "lib/rwd/xml"
3
+ require "lib/rwd/net"
4
+ require "lib/rwd/browser"
5
+ require "lib/rwd/thread"
6
+ require "md5"
7
+ require "rbconfig"
8
+
9
+
10
+
11
+ begin
12
+ require "win32ole"
13
+ require "win32/registry"
14
+ rescue LoadError
15
+ $".push "win32ole.so"
16
+ $".push "win32/registry.rb"
17
+ end
18
+
19
+ $rwd_exit = ARGV.include?("--rwd-exit") # Hack ???
20
+ $rwd_exit = true if defined?(REQUIRE2LIB)
21
+ $rwd_debug = ($rwd_debug or $DEBUG or false)
22
+ $rwd_border = ($rwd_border or 0)
23
+ $rwd_dir = Dir.pwd
24
+ $rwd_files = File.expand_path("rwd_files", Dir.pwd)
25
+ $rwd_html = {}
26
+
27
+ ARGV.delete_if do |arg|
28
+ arg =~ /^--rwd-/
29
+ end
30
+
31
+ RWDEmptyline = "..."
32
+
33
+ #module RWD
34
+
35
+ rcfile = nil
36
+ s = ENV["HOME"] ; s = File.expand_path(".rwdrc", s) unless s.nil? ; rcfile = s if (not s.nil? and rcfile.nil? and File.file?(s))
37
+ s = ENV["USERPROFILE"] ; s = File.expand_path("rwd.cfg", s) unless s.nil? ; rcfile = s if (not s.nil? and rcfile.nil? and File.file?(s))
38
+ s = ENV["windir"] ; s = File.expand_path("rwd.cfg", s) unless s.nil? ; rcfile = s if (not s.nil? and rcfile.nil? and File.file?(s))
39
+
40
+ AL = "align='left'"
41
+ AC = "align='center'"
42
+ AR = "align='right'"
43
+ VA = "valign='middle'"
44
+
45
+ Format = "\n<!-- %-10s %-10s -->\t"
46
+
47
+ unless rcfile.nil?
48
+ puts "Reading #{rcfile} ..."
49
+
50
+ Hash.file(rcfile).each do |k, v|
51
+ ENV[k] = v unless ENV.include?(k)
52
+ end
53
+ end
54
+
55
+ if ENV["RWDTHEME"]
56
+ if ENV["RWDTHEME"] = "PDA"
57
+ load 'lib/rwdthemes/default.rwd'
58
+ end
59
+ if ENV["RWDTHEME"] = "DEFAULT"
60
+ $stderr.puts "loading theme DEFAULT"
61
+ load 'lib/rwdthemes/default.rwd'
62
+ end
63
+ if ENV["RWDTHEME"] = "WINDOWSLOOKALIKE"
64
+ load 'lib/rwdthemes/windowslike.rwd'
65
+ end
66
+ else
67
+ load 'lib/rwdthemes/default.rwd'
68
+ end
69
+
70
+ ENV["RWDBROWSER"] = (ENV["RWDBROWSER"] or defaultbrowser) or puts "No browser found."
71
+ ENV["RWDPORTS"] = (ENV["RWDPORTS"] or "7701-7709")
72
+ ENV["RWDTHEME"] = (ENV["RWDTHEME"] or "DEFAULT")
73
+
74
+ #trap("INT") {puts "Terminating..." ; exit}
75
+
76
+ $SAFE = 0
77
+
78
+ class IE
79
+ def initialize(url)
80
+ @ie = WIN32OLE.new("InternetExplorer.Application")
81
+ @ev = WIN32OLE_EVENT.new(@ie, "DWebBrowserEvents2")
82
+
83
+ @ie.navigate(url)
84
+
85
+ @ie.menubar = false
86
+ @ie.toolbar = false
87
+ @ie.addressbar = false
88
+ @ie.statusbar = false
89
+
90
+ @ie.visible = true
91
+
92
+ at_exit do
93
+ @ie.visible = false
94
+ end
95
+
96
+ @ev.on_event("OnQuit") do
97
+ Thread.main.exit
98
+ end
99
+
100
+ Thread.new do
101
+ loop do
102
+ WIN32OLE_EVENT.message_loop
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ class Array
109
+ def rwd_options(emptyline=nil)
110
+ if emptyline.nil?
111
+ a = self
112
+ else
113
+ a = [emptyline].concat(self)
114
+ end
115
+
116
+ a.numsort.collect{|s| "<option>#{s.to_s.to_html}</option>" }.join("\n")
117
+ end
118
+
119
+ def rwd_method(method)
120
+ res = ""
121
+
122
+ self.each do |s|
123
+ s = s.join("/") if s.kind_of?(Array)
124
+ s2 = s.dup
125
+ s2[0..0] = s2[0..0].upcase
126
+ res = res + "<p align='left'><a action='#{method}/#{s.to_html}'>#{s2.to_html}</a></p>"
127
+ end
128
+
129
+ return res
130
+ end
131
+
132
+ def rwd_row(key=nil, value=nil, bold=false)
133
+ res = ""
134
+
135
+ res = res + "<row valign='top'>"
136
+ res = res + "<radio name='#{key.to_html}' value='#{value.to_html}'/>" unless key.nil?
137
+ res = res + self.collect{|s| "<p align='#{(s.kind_of?(Numeric) or s =~ /^\d+\.\d+$/) ? "right" : "left"}'>#{"<b>" if bold}#{s.to_s.to_html}#{"</b>" if bold}</p>"}.join("")
138
+ res = res + "</row>"
139
+
140
+ return res
141
+ end
142
+
143
+ def rwd_table(headers=nil, highlightrows=[])
144
+ res = ""
145
+
146
+ highlightrows = [highlightrows].flatten
147
+
148
+ n = -1
149
+
150
+ res = res + "<table>"
151
+ res = res + headers.rwd_row(nil, nil, true) unless headers.nil?
152
+ res = res + self.collect{|a| a.rwd_row(nil, nil, highlightrows.include?(n+=1))}.join("")
153
+ res = res + "</table>"
154
+
155
+ return res
156
+ end
157
+
158
+ def rwd_headers(emptyfield=false)
159
+ res = ""
160
+
161
+ res = res + "<row>"
162
+ res = res + "<p/>" if emptyfield
163
+ res = res + self.collect{|s| "<p align='left'><b>#{s.to_html}</b></p>" }.join("")
164
+ res = res + "</row>"
165
+
166
+ return res
167
+ end
168
+
169
+ def rwd_form(prefix, values=[], twoparts=0, options={})
170
+ res = []
171
+
172
+ res << "<table>"
173
+ self.each_index do |n|
174
+ name = "#{prefix.to_html}#{self[n].downcase.to_html}"
175
+
176
+ res << "<row>"
177
+ res << "<p align='right'>"
178
+ res << "#{self[n].to_html}:"
179
+ res << "</p>"
180
+
181
+ if options.keys.include?(self[n])
182
+ res << "<select name='#{name}'>"
183
+ res << options[self[n]].rwd_options(RWDEmptyline)
184
+ res << "</select>"
185
+ else
186
+ s = ""
187
+
188
+ s << "<text name='#{name}'"
189
+ s << " value='#{values[n].to_s.to_html}'" if n < values.length
190
+ s << "/>"
191
+
192
+ res << s
193
+ end
194
+
195
+ res << "</row>"
196
+
197
+ if twoparts > 0 and n == twoparts-1
198
+ res << "<row><empty/></row>"
199
+ end
200
+ end
201
+ res << "</table>"
202
+
203
+ return res.join("\n")
204
+ end
205
+ end
206
+
207
+ class Hash
208
+ def rwd_table(field=nil, joinwith=nil, headers=nil)
209
+ res = []
210
+
211
+ res << "<table>"
212
+ res << headers.rwd_headers((not field.nil?)) if not headers.nil?
213
+ self.keys.numsort.each do |key|
214
+ key2 = key
215
+ value2 = self[key]
216
+
217
+ key2 = key2.join(joinwith) if key2.kind_of?(Array)
218
+ value2 = [value2] if value2.kind_of?(String)
219
+
220
+ res << value2.rwd_row(field, key2)
221
+ end
222
+ res << "</table>"
223
+
224
+ res.join("\n")
225
+ end
226
+ end
227
+
228
+ class EVTable
229
+ def rwd_table(field=nil, joinwith=@sep)
230
+ super(field, joinwith, @headers)
231
+ end
232
+
233
+ def rwd_form(prefix="", key=nil, twoparts=false)
234
+ values = self[key] if not key.nil?
235
+ values = [] if values.nil?
236
+ options = {}
237
+
238
+ if File.file?(oldlocation("constraints.tsv"))
239
+ table = File.basename(@file).gsub(/\.tsv$/, "")
240
+
241
+ TSVFile.new(oldlocation("constraints.tsv")).subset(["Table", "Constraint"], [table, "key"], ["Column", "Value"]).values.each do |column, table2|
242
+ options[column] = TSVFile.new(oldlocation("#{table2}.tsv")).keys.collect{|a| a.join("\t")}
243
+ end
244
+ end
245
+
246
+ @headers.rwd_form(prefix, values, twoparts ? @key : 0, options)
247
+ end
248
+
249
+ def rwd_metadata
250
+ res = []
251
+
252
+ res << "<table>"
253
+ res << "<row>"
254
+ res << " <empty/>"
255
+ res << " <text name='header_new' value=''/>"
256
+ res << "</row>"
257
+ @headers.each_index do |n|
258
+ res << "<row>"
259
+ res << " <text name='header_#{n}_old' value='#{@headers[n]}'/>"
260
+ res << " <text name='header_#{n}_new' value=''/>"
261
+ res << "</row>"
262
+ end
263
+ res << "</table>"
264
+
265
+ return res.join("\n")
266
+ end
267
+ end
268
+
269
+ class OpenTag
270
+ def prechildren(res, before, after, varshtml, varsstring, switches, help, oneormorefields, firstaction, tabs, tab, pda)
271
+ bef = before[-1]
272
+ res << Format % ["Before", @subtype] if ($rwd_debug and not bef.nil?)
273
+ res << bef if not bef.nil?
274
+
275
+ res << Format % ["Pre", @subtype] if $rwd_debug
276
+
277
+ align = AC
278
+ align = "align='#{@args["align"]}'" if @args.include?("align")
279
+
280
+ valign = VA
281
+ valign = "valign='#{@args["valign"]}'" if @args.include?("valign")
282
+
283
+ value1 = ""
284
+ value1 = varshtml[@args["name"]] if varshtml.include?(@args["name"])
285
+ value1 = @args["value"] if @args.include?("value")
286
+
287
+ value2 = ""
288
+ value2 = varsstring[@args["name"]] if varsstring.include?(@args["name"])
289
+ value2 = @args["value"] if @args.include?("value")
290
+
291
+ cellspacing = 3
292
+ cellspacing = 0 if pda
293
+
294
+ case @subtype
295
+ when "application"
296
+ when "window", "helpwindow"
297
+ args = @args.deep_dup
298
+
299
+ args["nohelpbutton"] = (not help)
300
+
301
+ template = $rwd_html_1
302
+ template = $rwd_html_PDA_1 if pda
303
+
304
+ res << (template(template, args))
305
+ when "p" then res << "<p #{align}>"
306
+ when "pre" then res << "<pre #{align}>"
307
+ when "big" then res << "<p #{align}><big>"
308
+ when "small" then res << "<p #{align}><small>"
309
+ when "list" then res << "<ul #{align}>"
310
+ when "item" then res << "<li #{align}>"
311
+ when "empty" then res << "<p><br>"
312
+ when "image"
313
+ width = "width='#{@args["width"]}" if @args.include?("width")
314
+ height = "height='#{@args["height"]}'" if @args.include?("height")
315
+
316
+ res << "<img src='#{@args["src"]}' alt='#{@args["alt"]}' #{width} #{height}>"
317
+ when "progressbar"
318
+ width = 200
319
+
320
+ res << "<table>"
321
+ res << " <tr>"
322
+ res << " <td colspan='2'><img src='rwd_pixel.gif' height='1' width='#{width+5}'></td>"
323
+ res << " </tr>"
324
+ res << " <tr>"
325
+ res << " <td bgcolor='#DDDDDD'><img src='rwd_pixel.gif' height='10' width='#{(width*@args["value"].to_f).to_i}'></td>"
326
+ res << " <td bgcolor='#EEEEEE'><img src='rwd_pixel.gif' height='10' width='#{(width*(1.0-@args["value"].to_f)).to_i}'></td>"
327
+ res << " </tr>"
328
+ res << "</table>"
329
+ when "br" then res << "<br>"
330
+ when "hr" then res << "<hr>"
331
+ when "b" then res << "<b>"
332
+ when "i" then res << "<i>"
333
+ when "a"
334
+ if @args.include?("href")
335
+ res << "<a href='#{@args["href"]}' target='#{@args["target"] or "_blank"}'>"
336
+ else
337
+ res << "<a href='javascript:document.bodyform.rwd_action.value=\"#{@args["action"]}\";document.bodyform.submit();'>"
338
+ end
339
+ when "vertical" then res << "<table #{AC} border='#{$rwd_border}' cellspacing='#{cellspacing}' cellpadding='0'>"
340
+ when "horizontal" then res << "<table #{AC} border='#{$rwd_border}' cellspacing='#{cellspacing}' cellpadding='0'><tr #{align} #{valign}>"
341
+ when "table" then res << "<table #{AC} border='#{$rwd_border}' cellspacing='#{cellspacing}' cellpadding='0'>"
342
+ when "row" then res << "<tr #{align} #{valign}>"
343
+ when "hidden" then res << "<p #{align}><input name='#{@args["name"]}' value='#{value1}' type='hidden'>"
344
+ when "text"
345
+ maxlength = ""
346
+ maxlength = "maxlength='%s'" % @args["maxlength"] if @args.include?("maxlength")
347
+ size = ""
348
+ size = "size='%s'" % @args["size"] if @args.include?("size")
349
+ size = "size='%s'" % 10 if pda
350
+ res << "<p #{align}><input name='#{@args["name"]}' value='#{value1}' type='text' #{maxlength} #{size}>"
351
+ oneormorefields << "true"
352
+ when "textarea"
353
+ res << "<p #{align}><textarea name='#{@args["name"]}' rows='25' cols='80'>#{value2.crlf}</textarea>"
354
+ oneormorefields << "true"
355
+ when "password"
356
+ maxlength = ""
357
+ maxlength = "maxlength='%s'" % @args["maxlength"] if @args.include?("maxlength")
358
+ size = ""
359
+ size = "size='%s'" % 10 if pda
360
+ res << "<p #{align}><input name='#{@args["name"]}' value='#{value1}' type='password' #{maxlength} #{size}>"
361
+ oneormorefields << "true"
362
+ when "checkbox"
363
+ if varshtml[@args["name"]] == "on"
364
+ switches[@args["name"]] = true
365
+ res << "<p #{align}><input name='#{@args["name"]}' checked='on' type='checkbox'>"
366
+ else
367
+ switches[@args["name"]] = false
368
+ res << "<p #{align}><input name='#{@args["name"]}' type='checkbox'>"
369
+ end
370
+ oneormorefields << "true"
371
+ when "radio"
372
+ if varshtml[@args["name"]] == value1 # ??? 1 or 2?
373
+ res << "<p #{align}><input name='#{@args["name"]}' checked='on' value='#{value1}' type='radio'>"
374
+ else
375
+ res << "<p #{align}><input name='#{@args["name"]}' value='#{value1}' type='radio'>"
376
+ end
377
+ oneormorefields << "true"
378
+ when "select"
379
+ res << "<select #{align} name='#{@args["name"]}' width='#{@args["width"]} size='#{@args["size"]}'>" # ??? Misschien nog iets met 'multiple'?
380
+ name = @args["name"]
381
+ $select = varshtml[name]
382
+ oneormorefields << "true"
383
+ when "option"
384
+ if $select == @children[0].text
385
+ res << "<option selected='true'>"
386
+ else
387
+ res << "<option>"
388
+ end
389
+ when "button"
390
+ res << "<input type='submit' value='#{@args["caption"]}' onclick='document.bodyform.rwd_action.value=\"#{@args["action"]}\";'>"
391
+ firstaction << @args["action"] if (firstaction.empty? and @args.include?("action"))
392
+ oneormorefields << "true"
393
+ when "back"
394
+ res << "<input type='submit' value='Back' onclick='document.bodyform.rwd_action.value=\"rwd_back\";'>"
395
+ firstaction << "rwd_back" if firstaction.empty?
396
+ oneormorefields << "true"
397
+ when "cancel"
398
+ res << "<input type='submit' value='Cancel' onclick='document.bodyform.rwd_action.value=\"rwd_cancel\";'>"
399
+ firstaction << "rwd_cancel" if firstaction.empty?
400
+ oneormorefields << "true"
401
+ when "help"
402
+ res << "<input type='submit' value='Help' onclick='document.bodyform.rwd_action.value=\"rwd_help\";'>"
403
+ firstaction << "rwd_help" if firstaction.empty?
404
+ oneormorefields << "true"
405
+ when "quit"
406
+ res << "<input type='submit' value='Quit' onclick='document.bodyform.rwd_action.value=\"rwd_quit\";'>"
407
+ firstaction << "rwd_quit" if firstaction.empty?
408
+ oneormorefields << "true"
409
+ when "close"
410
+ res << "<input type='submit' value='Close' onclick='window.close();'>"
411
+ firstaction << "rwd_quit" if firstaction.empty?
412
+ oneormorefields << "true"
413
+ when "main"
414
+ res << "<input type='submit' value='Main' onclick='document.bodyform.rwd_action.value=\"rwd_main\";'>"
415
+ firstaction << "rwd_main" if firstaction.empty?
416
+ oneormorefields << "true"
417
+ when "reset"
418
+ res << "<input type='reset' value='Reset'>"
419
+ firstaction << "rwd_quit" if firstaction.empty? # ???
420
+ oneormorefields << "true"
421
+ when "closewindow"
422
+ #res << "<script type='text/javascript'>\n" # ???
423
+ #res << "<!--\n"
424
+ #res << " window.close();\n"
425
+ #res << "//-->\n"
426
+ #res << "</script>"
427
+ when "tabs"
428
+ res << "<table #{AC} border='#{$rwd_border}' cellspacing='0' cellpadding='0'>"
429
+ res << " <tr #{AL}>"
430
+ res << " <td #{AL} class='tabs'>"
431
+ res << " <table #{AL} border='#{$rwd_border}' cellspacing='0' cellpadding='0'>"
432
+ res << " <tr #{AL}>"
433
+ #res << " <td class='notab'>&nbsp;</td>"
434
+ tabs.each do |obj|
435
+ name = obj.args["name"]
436
+ caption = obj.args["caption"]
437
+
438
+ res << "<td #{AL} class='notab'>&nbsp;</td>" unless obj == tabs[0]
439
+
440
+ if name == tab
441
+ res << "<td #{AC} class='activetab'><tt>&nbsp;#{caption}&nbsp;</tt></td>"
442
+ else
443
+ res << "<td #{AC} class='passivetab'><a href='javascript:document.bodyform.rwd_action.value=\"rwd_tab_#{name}\";document.bodyform.submit();'><tt>&nbsp;#{caption}&nbsp;</tt></a></td>"
444
+ end
445
+ end
446
+ res << " <td class='notab' width='100%'>&nbsp;</td>"
447
+ res << " </tr>"
448
+ res << " </table>"
449
+ res << " </td>"
450
+ res << " </tr>"
451
+ res << " <tr #{align}>"
452
+ res << " <td #{align} class='tabblad'>"
453
+ when "tab"
454
+ res << "<table #{AC} border='#{$rwd_border}' cellspacing='3' cellpadding='0'>"
455
+ when "panel"
456
+ level = (@args["level"] or "normal")
457
+ res << "<table #{AC} border='#{$rwd_border}' cellspacing='0' cellpadding='0'>"
458
+ res << " <tr #{align}>"
459
+ res << " <td #{align} class='panel1'>" if level == "normal"
460
+ res << " <td #{align} class='panel1high'>" if level == "high"
461
+ res << " <td #{align} class='panel1low'>" if level == "low"
462
+ res << " <table #{AC} border='#{$rwd_border}' cellspacing='0' cellpadding='0'>"
463
+ res << " <tr #{align}>"
464
+ res << " <td #{align} class='panel2'>" if level == "normal"
465
+ res << " <td #{align} class='panel2high'>" if level == "high"
466
+ res << " <td #{align} class='panel2low'>" if level == "low"
467
+ res << " <table #{AC} border='#{$rwd_border}' cellspacing='3' cellpadding='0'>"
468
+ else
469
+ puts "<#{@subtype}>"
470
+ res << "&lt;#{@subtype}&gt;"
471
+ end
472
+
473
+ bef = nil
474
+ aft = nil
475
+
476
+ case @subtype
477
+ when "vertical", "window", "helpwindow", "tab", "panel"
478
+ res << Format % ["AftPre", @subtype] if $rwd_debug
479
+ if @args.include?("spacing")
480
+ s = "<tr><td>&nbsp;</td></tr>" * (@args["spacing"].to_i)
481
+ else
482
+ s = ""
483
+ end
484
+ bef = "#{s}<tr #{align} #{valign}><td #{align}>"
485
+ aft = "</td></tr>"
486
+ when "horizontal", "row"
487
+ res << Format % ["AftPre", @subtype] if $rwd_debug
488
+ bef = "<td #{align}>"
489
+ aft = "</td>"
490
+ end
491
+
492
+ before.push(bef)
493
+ after.push(aft)
494
+ end
495
+
496
+ def postchildren(res, before, after, varshtml, varsstring, switches, help, oneormorefields, firstaction, tabs, tab, pda)
497
+ case @subtype
498
+ when "vertical", "window", "helpwindow", "tab", "panel"
499
+ res << Format % ["BefPost", @subtype] if $rwd_debug
500
+ if @args.include?("spacing")
501
+ res << "<tr><td>&nbsp;</td></tr>" * (@args["spacing"].to_i)
502
+ end
503
+ when "horizontal", "row"
504
+ res << Format % ["BefPost", @subtype] if $rwd_debug
505
+ end
506
+
507
+ res << Format % ["Post", @subtype] if $rwd_debug
508
+
509
+ case @subtype
510
+ when "application"
511
+ when "window", "helpwindow"
512
+ args = @args.deep_dup
513
+
514
+ args["nohelpbutton"] = (not help)
515
+
516
+ template = $rwd_html_2
517
+ template = $rwd_html_PDA_2 if pda
518
+
519
+ res << (template(template, args))
520
+ when "p" then res << "</p>"
521
+ when "pre" then res << "</pre>"
522
+ when "big" then res << "</big></p>"
523
+ when "small" then res << "</small></p>"
524
+ when "list" then res << "</ul>"
525
+ when "item" then res << "</li>"
526
+ when "empty" then res << "</p>"
527
+ when "image" then res << ""
528
+ when "progressbar" then res << ""
529
+ when "br" then res << ""
530
+ when "hr" then res << ""
531
+ when "b" then res << "</b>"
532
+ when "i" then res << "</i>"
533
+ when "a" then res << "</a>"
534
+ when "vertical" then res << "</table>"
535
+ when "horizontal" then res << "</tr></table>"
536
+ when "table" then res << "</table>"
537
+ when "row" then res << "</tr>"
538
+ when "hidden" then res << "</p>"
539
+ when "text" then res << "</p>"
540
+ when "textarea" then res << "</p>"
541
+ when "password" then res << "</p>"
542
+ when "checkbox" then res << "</p>"
543
+ when "radio" then res << "</p>"
544
+ when "select"
545
+ res << "</select>"
546
+ $select = nil
547
+ when "option" then res << "</option>"
548
+ when "button" then res << ""
549
+ when "back" then res << ""
550
+ when "cancel" then res << ""
551
+ when "help" then res << ""
552
+ when "quit" then res << ""
553
+ when "close" then res << ""
554
+ when "main" then res << ""
555
+ when "reset" then res << ""
556
+ when "closewindow" then res << ""
557
+ when "tabs"
558
+ res << " </td>"
559
+ res << " </tr>"
560
+ res << "</table>"
561
+ when "tab"
562
+ res << "</table>"
563
+ when "panel"
564
+ res << " </table>"
565
+ res << " </td>"
566
+ res << " </tr>"
567
+ res << " </table>"
568
+ res << " </td>"
569
+ res << " </tr>"
570
+ res << "</table>"
571
+ else
572
+ puts "</#{@subtype}>"
573
+ res << "&lt;/#{@subtype}&gt;"
574
+ end
575
+
576
+ before.pop
577
+ after.pop
578
+
579
+ aft = after[-1]
580
+ res << Format % ["After", @subtype] if ($rwd_debug and not aft.nil?)
581
+ res << aft if not aft.nil?
582
+ end
583
+
584
+ def template(html, vars)
585
+ res = []
586
+
587
+ a = {}
588
+
589
+ vars.each do |k, v|
590
+ a[k.upcase] = v
591
+ end
592
+
593
+ logo = nil
594
+ logo = File.expand_path(vars["logo"], $rwd_files) if vars.include?("logo")
595
+ logo = nil unless logo.nil? or File.file?(logo)
596
+
597
+ watermark = nil
598
+ watermark = File.expand_path(vars["watermark"], $rwd_files) if vars.include?("watermark")
599
+ watermark = nil unless watermark.nil? or File.file?(watermark)
600
+
601
+ a["LOGO"] = "" unless not logo.nil?
602
+ a["WATERMARK"] = "" unless not watermark.nil?
603
+
604
+ a["HELPBUTTON"] = (not (vars["nohelpbutton"]))
605
+ a["BACKBUTTONS"] = (not (vars["nobackbuttons"]))
606
+ a["BACKBUTTONS"] = (not (vars["nobackbuttons"]))
607
+ a["CLOSEBUTTON"] = (not (vars["noclosebutton"]))
608
+
609
+ if a.include?("WIDTH")
610
+ a["WIDTH1"] = "width='#{a["WIDTH"]}'"
611
+ a["WIDTH2"] = a["WIDTH"]
612
+ else
613
+ a["WIDTH1"] = " "
614
+ a["WIDTH2"] = "1"
615
+ end
616
+
617
+ html.split(/\r*\n/).each do |line|
618
+ if line =~ /%[A-Z0-9]+%/
619
+ a.each do |k, v|
620
+ v = false if (v.kind_of?(String) and v.empty?)
621
+
622
+ if line.include?("%#{k}%")
623
+ line.gsub!("%#{k}%", "#{v}") if v
624
+ end
625
+ end
626
+
627
+ line = "<!-- #{line.scan(/%[A-Z0-9]+%/).join(" ")} -->" if line =~ /%[A-Z0-9]+%/
628
+ end
629
+
630
+ res << line
631
+ end
632
+
633
+ res.join("\n")
634
+ end
635
+ end
636
+
637
+ class Text
638
+ def prechildren(res, before, after, varshtml, varsstring, switches, help, oneormorefields, firstaction, tabs, tab, pda)
639
+ if not @text.scan(/[^ \t\r\n]/).empty?
640
+ res << Format % ["Text", ""] if $rwd_debug
641
+ res << "#{@text}"
642
+ end
643
+ end
644
+ end
645
+
646
+ class RWDTree < XML
647
+ end
648
+
649
+ class RWDWindow
650
+ @@windows = {} # Kind of caching.
651
+ @@helpwindows = {} # Kind of caching.
652
+
653
+ def initialize(rwd, window=nil)
654
+ rwd = rwd.join("\n") if rwd.kind_of?(Array)
655
+
656
+ if @@windows[rwd].nil?
657
+ @@windows[rwd] = {}
658
+ @@helpwindows[rwd] = {}
659
+
660
+ tree = XML.new(rwd)
661
+
662
+ tree.parse(OpenTag, "window") do |type, obj|
663
+ $rwd_appvars.each{|k, v| obj.args[k] = v}
664
+ @@windows[rwd][obj.args["name"]] = obj.to_h
665
+ end
666
+
667
+ tree.parse(OpenTag, "helpwindow") do |type, obj|
668
+ $rwd_appvars.each{|k, v| obj.args[k] = v}
669
+ @@helpwindows[rwd][obj.args["name"]] = obj.to_h
670
+ end
671
+ end
672
+
673
+ @rwd = (@@windows[rwd][window] or "").dup
674
+ @helprwd = (@@helpwindows[rwd][window] or "").dup
675
+ end
676
+
677
+ def render(pda, action=nil, vars=Hash.new, switches=Hash.new, help=false, tab="")
678
+ varshtml = Hash.new
679
+ varsstring = Hash.new
680
+ oneormorefields = ""
681
+ firstaction = ""
682
+ html = []
683
+
684
+ vars = vars.deep_dup
685
+
686
+ begin # error wrap
687
+
688
+ vars.each do |key, value|
689
+ if not key.empty?
690
+ if value.respond_to? "to_s"
691
+ @rwd.gsub!(/%%#{key}%%/, value.to_s)
692
+ @rwd.gsub!(/%#{key}%/, value.to_s.to_html)
693
+
694
+ @helprwd.gsub!(/%%#{key}%%/, value.to_s)
695
+ @helprwd.gsub!(/%#{key}%/, value.to_s.to_html)
696
+
697
+ varshtml[key] = value.to_s.to_html
698
+ varsstring[key] = value.to_s
699
+ end
700
+ end
701
+ end
702
+
703
+ windowobject = RWDTree.new(@rwd).children.dup.delete_if{|obj| obj.subtype != "window"}[0]
704
+ helpobject = RWDTree.new(@helprwd).children.dup.delete_if{|obj| obj.subtype != "helpwindow"}[0]
705
+
706
+ tabsobj = windowobject.children.dup.delete_if{|obj| obj.subtype != "tabs"}[0]
707
+
708
+ if not tabsobj.nil?
709
+ tabs = tabsobj.children.dup.delete_if{|obj| (not obj.kind_of?(OpenTag)) or (obj.subtype != "tab")}
710
+
711
+ if tab.empty?
712
+ tab = tabs[0].args["name"]
713
+ end
714
+
715
+ tabsobj.children.delete_if{|obj| (obj.kind_of?(OpenTag)) and (obj.subtype == "tab") and obj.args["name"] != tab}
716
+ end
717
+
718
+ if help
719
+ helpobject.parsetree("prechildren", "postchildren", html, [""], [""], varshtml, varsstring, switches, false, oneormorefields, firstaction, tabs, tab, pda)
720
+ else
721
+ windowobject.parsetree("prechildren", "postchildren", html, [""], [""], varshtml, varsstring, switches, (not @helprwd.empty?), oneormorefields, firstaction, tabs, tab, pda)
722
+ end
723
+
724
+ html = html.join("") # ???
725
+
726
+ html.gsub!(/%%*[[:alnum:]_\-]+%%*/, "") if not $rwd_debug
727
+ html.gsub!(/%%/, "%")
728
+ html.gsub!(/\n\n*/, "\n")
729
+
730
+ if oneormorefields.empty?
731
+ focus = ""
732
+ else
733
+ focus = "document.bodyform.elements[0].focus();"
734
+ end
735
+
736
+ firstaction = action if windowobject.args.keys.include?("refresh") unless action.nil?
737
+
738
+ html.gsub!(/\$RWD_FIRSTACTION\$/ , firstaction)
739
+ html.gsub!(/\$RWD_FOCUS\$/ , focus)
740
+
741
+ html
742
+ end
743
+
744
+ rescue
745
+ if $DEBUG
746
+ $stderr.puts "error in RWDWindow - render method"
747
+ end
748
+ end
749
+ end
750
+
751
+ class RWDMessage < RWDWindow
752
+ def initialize(msg)
753
+ super("<window title='RWD Message' nobackbuttons noclosebutton><p>#{msg}</p><back/></window>")
754
+ end
755
+ end
756
+
757
+ class RWDError < RWDWindow
758
+ def initialize(msg)
759
+ super("<window title='RWD Error' nobackbuttons noclosebutton><p><b>Error:</b> #{msg}</p><back/></window>")
760
+ end
761
+ end
762
+
763
+ class RWDProgressBar < RWDWindow
764
+ def initialize(refresh, progress)
765
+ s = ""
766
+ s << "<window title='RWD Progress' nobackbuttons noclosebutton refresh='#{refresh}'>"
767
+ if progress.length == 1
768
+ progress.each do |caption, value|
769
+ s << "<p>#{caption}</p><progressbar value='#{value}'/><p>#{(100*value).to_i}%%</p>"
770
+ end
771
+ else
772
+ s << "<table>"
773
+ progress.each do |caption, value|
774
+ s << "<row><p align='left'>#{caption}</p><progressbar value='#{value}'/><p align='right'>#{(100*value).to_i}%%</p></row>"
775
+ end
776
+ s << "</table>"
777
+ end
778
+ s << "<cancel/>"
779
+ s << "</window>"
780
+ super(s)
781
+ end
782
+ end
783
+
784
+ class RWDDone < RWDWindow
785
+ def initialize(exitbrowser)
786
+ super("<window title='RWD Message' nobackbuttons noclosebutton><p>Done.</p><i>(Some browsers don't close,<br>because of security reasons.)</i><horizontal><close/>#{exitbrowser ? "" : "<button caption='Again'/>"}</horizontal>#{exitbrowser ? "<closewindow/>" : ""}</window>")
787
+ end
788
+ end
789
+
790
+ class RWDialog
791
+
792
+ def initialize(xml)
793
+ @rwd_xml = $rwd_gui_tinker
794
+ # change from default ev - was xml
795
+ @rwd_exitbrowser = false
796
+ @rwd_history = []
797
+ @rwd_ignore_vars = []
798
+ @rwd_call_after_back = []
799
+ @rwd_time = Time.now
800
+
801
+ $rwd_appvars = {} if $rwd_appvars.nil?
802
+ XML.new(xml).parse(OpenTag, "application") do |type, obj|
803
+ obj.args.deep_dup.each do |k, v|
804
+ $rwd_appvars[k] = v
805
+ end
806
+ end
807
+ end
808
+
809
+ def self.file(rwdfile, *args)
810
+ new(File.new(rwdfile).readlines, *args)
811
+ end
812
+
813
+ def serve(port=nil, auth=nil, realm=self.class.to_s)
814
+ exit if $rwd_exit
815
+
816
+ raise "RWD is not initialized." if @rwd_xml.nil?
817
+
818
+ low, high = ENV["RWDPORTS"].split(/[^\d+]/)
819
+ high = low if high.nil?
820
+ low, high = low.to_i, high.to_i
821
+
822
+ io = nil
823
+
824
+ port, io = TCPServer.freeport(low, high, (not auth.nil?)) if port.nil?
825
+ raise "No free TCP port." if port.nil?
826
+
827
+ port = port.to_i
828
+
829
+ @rwd_server = RWDServer.new(self, port, io, auth, realm)
830
+
831
+ self
832
+ end
833
+
834
+ def render(res, path, post, download, downloadfile, pda, sessionid)
835
+ # Avoid a timeout.
836
+
837
+ @rwd_time = Time.now
838
+
839
+ # Initialize some vars.
840
+
841
+ vars = Hash.new if vars.nil?
842
+ @rwd_switches = Hash.new if @rwd_switches.nil?
843
+
844
+ done = false
845
+ help = false
846
+ back = false
847
+ tab = ""
848
+ @rwd_progress_thread = nil
849
+ @rwd_msgtype = nil if @rwd_progress_thread.nil?
850
+ @rwd_download = nil
851
+ @rwd_download_file = nil
852
+
853
+ # Switches are used for checkboxes.
854
+
855
+ @rwd_switches.each do |key, value|
856
+ vars[key] = "off"
857
+ end
858
+
859
+ @rwd_switches = Hash.new
860
+
861
+ # Copy the vars from the window to vars. vars wil later on be copied to instance variables.
862
+
863
+ post.sort.each do |key, value|
864
+ puts "Post: #{key} -> #{value.from_html.inspect}" if $rwd_debug
865
+
866
+ vars[key] = value.from_html
867
+ end
868
+
869
+ # Stack handling for rwd_action, rwd_window and rwd_tab.
870
+
871
+ @rwd_action = vars["rwd_action"] if vars.include?("rwd_action")
872
+ @rwd_action, @rwd_args = @rwd_action.split(/\//, 2) unless @rwd_action.nil?
873
+ @rwd_action, rest = @rwd_action.split(/\?/) unless @rwd_action.nil?
874
+
875
+ @rwd_refresh_action = (@rwd_action or @rwd_refresh_action or "main")
876
+
877
+ unless rest.nil?
878
+ rest.each do |s|
879
+ k, v = s.split(/=/, 2)
880
+ vars[k] = v
881
+ end
882
+ end
883
+
884
+ if @rwd_action == "rwd_cancel"
885
+ @rwd_progress_thread.kill unless @rwd_progress_thread.nil?
886
+ @rwd_progress_thread = nil
887
+ @rwd_action = "rwd_back"
888
+ end
889
+
890
+ @rwd_history = [["main", [], "main", ""]] if @rwd_history.empty?
891
+
892
+ if @rwd_action =~ /^rwd_tab_/
893
+ @rwd_tab = @rwd_action.sub(/^rwd_tab_/, "")
894
+ @rwd_history[-1][3] = @rwd_tab
895
+ else
896
+ case @rwd_action
897
+ when "rwd_back"
898
+ @rwd_history.pop
899
+ @rwd_action = (@rwd_history[-1] or [nil, nil, nil])[0]
900
+ @rwd_args = (@rwd_history[-1] or [nil, nil, nil])[1]
901
+ @rwd_window = (@rwd_history[-1] or [nil, nil, nil])[2]
902
+ @rwd_tab = (@rwd_history[-1] or [nil, nil, nil])[3]
903
+ back = true
904
+ when "rwd_help"
905
+ help = true
906
+ when "rwd_main"
907
+ @rwd_action = nil
908
+ @rwd_window = nil
909
+ @rwd_tab = nil
910
+ @rwd_history = []
911
+ when "rwd_quit"
912
+ done = true
913
+ else
914
+ end
915
+
916
+ # History stuff
917
+
918
+ @rwd_history = @rwd_history[-100..-1] if @rwd_history.length >= 100
919
+ @rwd_action = "main" if @rwd_action.nil?
920
+ @rwd_action = "main" if @rwd_action.empty?
921
+ @rwd_window = "main" if @rwd_window.nil?
922
+ @rwd_window = "main" if @rwd_window.empty?
923
+ @rwd_tab = "" if @rwd_tab.nil?
924
+ @rwd_args = [] if @rwd_args.nil?
925
+ @rwd_args = [] if @rwd_action == "main"
926
+
927
+ vars["rwd_action"] = @rwd_action
928
+ vars["rwd_window"] = @rwd_window
929
+ vars["rwd_tab"] = @rwd_tab
930
+
931
+ # Copy vars from window to instance.
932
+
933
+ vars.each do |k, v|
934
+ instance_eval "@#{k} = vars['#{k}']" if ((not k.empty?) and k.scan(/^rwd_/).empty? and not @rwd_ignore_vars.include?("@#{k}"))
935
+ end
936
+
937
+ # Callback.
938
+
939
+ if (not back) or @rwd_call_after_back.include?(@rwd_action)
940
+ unless @rwd_action =~ /^rwd_/
941
+ puts "Method: #{@rwd_action}(#{@rwd_args.join(", ")})" if $rwd_debug
942
+ if methods.include?(@rwd_action)
943
+ method(@rwd_action).call(*@rwd_args)
944
+ else
945
+ puts "Method '%s' is not defined." % @rwd_action
946
+ end
947
+ end
948
+
949
+ # History stuff
950
+
951
+ @rwd_history = [["main", [], "main", ""]] if @rwd_action == "main"
952
+ @rwd_history = [["main", [], "main", ""]] if @rwd_history.empty?
953
+
954
+ a = [@rwd_action, @rwd_args, @rwd_window, @rwd_tab]
955
+
956
+ @rwd_history.push a if (@rwd_history[-1] != a or not @rwd_msgtype.nil?)
957
+
958
+ if @rwd_window == "rwd_back"
959
+ @rwd_history.pop
960
+ @rwd_history.pop
961
+ @rwd_action = (@rwd_history[-1] or [nil, nil, nil])[0]
962
+ @rwd_args = (@rwd_history[-1] or [nil, nil, nil])[1]
963
+ @rwd_window = (@rwd_history[-1] or [nil, nil, nil])[2]
964
+ @rwd_tab = (@rwd_history[-1] or [nil, nil, nil])[3]
965
+ end
966
+ end
967
+ end
968
+
969
+ # Copy vars from instance to window.
970
+
971
+ instance_variables.each do |k|
972
+ k.sub!(/^@/, "")
973
+ instance_eval "vars['#{k}'] = @#{k}.to_s" if (k.scan(/^rwd_/).empty? and not @rwd_ignore_vars.include?("@#{k}"))
974
+ end
975
+
976
+ # just ignore.
977
+
978
+ vars.sort.each do |key, value|
979
+ puts "Pre: #{key} -> #{value.inspect}" if $rwd_debug
980
+ end
981
+
982
+
983
+ # Answer to browser.
984
+
985
+ if done
986
+ res << RWDDone.new(@rwd_exitbrowser).render(pda)
987
+ else
988
+ if not @rwd_download.nil?
989
+ puts "Download: #{@rwd_window}" if $rwd_debug
990
+
991
+ download << @rwd_download
992
+ downloadfile << @rwd_download_file
993
+ else
994
+ if not @rwd_progress_thread.nil?
995
+ res << RWDProgressBar.new(@rwd_progress_refresh, @rwd_progress_progress).render(pda, @rwd_refresh_action)
996
+ else
997
+ if not @rwd_msgtype.nil?
998
+ res << RWDMessage.new(@rwd_msg).render(pda) if @rwd_msgtype == "message"
999
+ res << RWDError.new(@rwd_msg).render(pda) if @rwd_msgtype == "error"
1000
+ res << @rwd_msg if @rwd_msgtype == "text"
1001
+ else
1002
+ puts "Window: #{@rwd_window}" if $rwd_debug
1003
+ puts "Tab: #{@rwd_tab}" if $rwd_debug
1004
+
1005
+ begin # error block
1006
+ if @rwd_window.empty?
1007
+ @rwd_window = "main"
1008
+ end
1009
+ res << RWDWindow.new($rwd_gui_tinker, @rwd_window).render(pda, @rwd_refresh_action, vars, @rwd_switches, help, @rwd_tab)
1010
+ rescue
1011
+ if $DEBUG
1012
+ $stderr.puts "error in render"
1013
+ end
1014
+ end
1015
+ end
1016
+ end
1017
+ end
1018
+ end
1019
+
1020
+ return done
1021
+ end
1022
+
1023
+ def samewindow?
1024
+ @rwd_history[-1][2] == @rwd_window
1025
+ end
1026
+
1027
+ def message(msg, &block)
1028
+ @rwd_msg = msg
1029
+ @rwd_msgtype = "message"
1030
+ end
1031
+
1032
+ def error(msg, &block)
1033
+ @rwd_msg = msg
1034
+ @rwd_msgtype = "error"
1035
+ end
1036
+
1037
+ def text(msg)
1038
+ @rwd_msg = "<html><body><pre>#{msg}</pre></body></html>"
1039
+ @rwd_msgtype = "text"
1040
+ end
1041
+
1042
+ def progressbar(refresh, *progress)
1043
+ @rwd_progress_refresh = (refresh or 1)
1044
+ @rwd_progress_progress = []
1045
+
1046
+ while not progress.empty?
1047
+ s = (progress.shift or "")
1048
+ if s.kind_of?(Array)
1049
+ caption, value = s
1050
+ value = (value or 0.0).to_f
1051
+ else
1052
+ caption = s
1053
+ value = (progress.shift or 0.0).to_f
1054
+ end
1055
+
1056
+ @rwd_progress_progress << [caption, value]
1057
+ end
1058
+
1059
+ if @rwd_progress_thread.nil?
1060
+ @rwd_progress_progress.each do |a|
1061
+ a[1] = 0.0
1062
+ end
1063
+
1064
+ @rwd_progress_thread =
1065
+ Thread.new do
1066
+ yield
1067
+ end
1068
+ Thread.pass
1069
+ end
1070
+
1071
+ @rwd_progress_thread = nil unless @rwd_progress_thread.alive?
1072
+ end
1073
+
1074
+ def download(data, filename="")
1075
+ @rwd_download = data
1076
+ @rwd_download_file = filename
1077
+ end
1078
+
1079
+ def exitbrowser
1080
+ @rwd_exitbrowser = true
1081
+ end
1082
+
1083
+ def timeout(timeout, interval=1)
1084
+ @rwd_timeout = timeout
1085
+
1086
+ unless @rwd_timeout_thread
1087
+ @rwd_timeout_thread =
1088
+ Thread.new do
1089
+ loop do
1090
+ if Time.now - @rwd_time > @rwd_timeout
1091
+ $stderr.puts "Exiting due to timeout (#{@rwd_timeout} seconds)."
1092
+ exit 1
1093
+ end
1094
+ sleep interval
1095
+ end
1096
+ end
1097
+ end
1098
+ end
1099
+ end
1100
+
1101
+ class RWDLogin < RWDialog
1102
+ def initialize(realm)
1103
+ super("<window name='main' title='RWD Login for #{realm}' nobackbuttons noclosebutton><table><row><p align='right'>Username:</p><text name='rwd_a'/></row><row><p align='right'>Password:</p><password name='rwd_b'/></row></table><button caption='Login'/></window>")
1104
+ end
1105
+ end
1106
+
1107
+ class RWDTimeOut < RWDialog
1108
+ def initialize
1109
+ super("<window name='main' title='RWD Error' nobackbuttons noclosebutton><p><b>Error:</b> Session has expired.</p><button caption='New session'/></window>")
1110
+ end
1111
+ end
1112
+
1113
+ class SessionCleanup
1114
+ def initialize(sessions, interval, timeout)
1115
+ every(interval) do
1116
+ sessions.delete_if do |id, session|
1117
+ time = Time.now.to_i - session.lastaccess.to_i
1118
+
1119
+ puts "Session %s deleted" % id if time > timeout
1120
+
1121
+ time > timeout
1122
+ end
1123
+ end
1124
+ end
1125
+ end
1126
+
1127
+ class Sessions
1128
+ def initialize(rack, cleanup)
1129
+ @rack = rack.to_s
1130
+ @cleanup = SessionCleanup.new(self, 3600, 24*3600) if cleanup
1131
+ @sessions = {}
1132
+ end
1133
+
1134
+ def [](sessionid)
1135
+ @sessions[sessionid]
1136
+ end
1137
+
1138
+ def []=(sessionid, value)
1139
+ @sessions[sessionid] = value
1140
+ end
1141
+
1142
+ def delete(sessionid)
1143
+ @sessions.delete(sessionid)
1144
+ end
1145
+
1146
+ def delete_if(&block)
1147
+ @sessions.delete_if{|k, v| block.call(k, v)}
1148
+ end
1149
+
1150
+ def include?(sessionid)
1151
+ @sessions.include?(sessionid)
1152
+ end
1153
+ end
1154
+
1155
+ class RWDSession < Hash
1156
+ attr_reader :sessionid
1157
+ attr_reader :lastaccess
1158
+ attr_reader :authenticated
1159
+ attr_writer :authenticated
1160
+
1161
+ def initialize(sessionid=nil)
1162
+ @sessionid = sessionid
1163
+ @lastaccess = Time.now
1164
+ @authenticated = false
1165
+ end
1166
+
1167
+ def touch
1168
+ @lastaccess = Time.now
1169
+ end
1170
+
1171
+ def render(res, path, post, download, downloadfile, pda)
1172
+ done = self["object"].render(res, path, post, download, downloadfile, pda, @sessionid)
1173
+
1174
+ res.gsub!(/\$RWD_SESSION\$/, done ? "" : "#{@sessionid}")
1175
+
1176
+ return done
1177
+ end
1178
+ end
1179
+
1180
+ class RWDServer
1181
+ def initialize(obj, port, io, auth, realm)
1182
+ @object = obj
1183
+ @localbrowsing = false
1184
+ @browserstarted = false
1185
+ @sessions = Sessions.new(obj.class, (not auth.nil?))
1186
+
1187
+ if auth.nil?
1188
+ @localbrowsing = true
1189
+
1190
+ if ENV.include?("RWDBROWSER") and not ENV["RWDBROWSER"].nil? and not ENV["RWDBROWSER"].empty?
1191
+ @browserstarted = true
1192
+ @object.exitbrowser
1193
+
1194
+ # Start browser.
1195
+
1196
+ @browserthread =
1197
+ Thread.new do
1198
+ puts "Starting the browser..."
1199
+
1200
+ #if ENV["RWDBROWSER"].downcase =~ /iexplore/ # ???
1201
+ #@ie = IE.new("http://localhost:#{port}/")
1202
+ #else
1203
+ browser = ENV["RWDBROWSER"].dup
1204
+ url = "http://localhost:%s/" % [port]
1205
+
1206
+ re = /[$%]1\b/
1207
+ command = "%s \"%s\"" % [browser, url]
1208
+ command = browser.gsub(re, url) if browser =~ re
1209
+
1210
+ command.gsub!(/%port%/, port.to_s)
1211
+
1212
+ system(command) or $stderr.puts "Starting of the browser failed, or the browser terminated abnormally.\nCommand => #{command}"
1213
+ #end
1214
+
1215
+ puts "The browser has terminated."
1216
+ end
1217
+ end
1218
+ end
1219
+
1220
+ # Start server.
1221
+
1222
+ portio = port
1223
+ portio = [port, io] unless io.nil?
1224
+ threadlimiter = ThreadLimiter.new(1)
1225
+
1226
+ HTTPServer.serve(portio, (not auth.nil?)) do |req, resp|
1227
+ threadlimiter.wait do
1228
+ vars = {}
1229
+ req.vars.each do |k, v|
1230
+ vars[k] = v.join("\t")
1231
+ end
1232
+ pad = (req.request.path or "/")
1233
+
1234
+ if auth.kind_of? String
1235
+ file = "#{home}/#{auth}"
1236
+ auths = {}
1237
+ auths = Hash.file(file) if File.file?(file)
1238
+ else
1239
+ auths = auth
1240
+ end
1241
+
1242
+ #oldsessionid = vars["rwd_session"]
1243
+ oldsessionid = req.cookies["sessionid"]
1244
+
1245
+ # Retrieve session.
1246
+
1247
+ session = @sessions[oldsessionid]
1248
+
1249
+ # Eventually create new session.
1250
+
1251
+ if session.nil?
1252
+ sessionid = MD5.new(req.peeraddr[3].to_s + @object.inspect.to_s + ("%1.6f" % Time.now.to_f)).to_s while (sessionid == nil or @sessions.include?(sessionid))
1253
+ session = RWDSession.new(sessionid)
1254
+
1255
+ if auth.nil?
1256
+ session["object"] = @object
1257
+ else
1258
+ session["object"] = @object.clone
1259
+ end
1260
+
1261
+ if oldsessionid.nil? or oldsessionid.empty?
1262
+ if not auth.nil? and not auth.empty? and not session.authenticated and pad !~ /^\/rwd_/
1263
+
1264
+ # Check authentication
1265
+
1266
+ us = vars["rwd_a"]
1267
+ pa = vars["rwd_b"]
1268
+
1269
+ if us.nil? or pa.nil? or auths[us] != pa
1270
+ session = RWDSession.new
1271
+ session["object"] = RWDLogin.new(realm)
1272
+ pad = "/"
1273
+ else
1274
+ session.authenticated = true
1275
+ @sessions[session.sessionid] = session
1276
+ end
1277
+ else
1278
+ session.authenticated = true
1279
+ @sessions[session.sessionid] = session
1280
+ end
1281
+ else
1282
+ session = RWDSession.new
1283
+ session["object"] = RWDTimeOut.new
1284
+ end
1285
+
1286
+ vars = {}
1287
+ end
1288
+
1289
+ # Avoid timeout.
1290
+
1291
+ session.touch
1292
+
1293
+ if pad == "/"
1294
+
1295
+ # Serve methods/callbacks.
1296
+
1297
+ # Build new page.
1298
+
1299
+ download = ""
1300
+ downloadfile = ""
1301
+ res = ""
1302
+
1303
+ done = session.render(res, pad, vars, download, downloadfile, req.pda?)
1304
+
1305
+ begin
1306
+ if download.empty?
1307
+ resp["Content-Type"] = "text/html"
1308
+ if done
1309
+ resp.cookies["sessionid"] = ""
1310
+ else
1311
+ resp.cookies["sessionid"] = session.sessionid
1312
+ end
1313
+
1314
+ resp << res
1315
+ else
1316
+ resp["Content-Type"] = "application/octet-stream"
1317
+ resp["Content-Disposition"] = "attachment;"
1318
+ resp["Content-Disposition"] = "attachment; filename=%s" % downloadfile unless downloadfile.empty?
1319
+
1320
+ resp << download
1321
+ end
1322
+ rescue
1323
+ puts "Sending response to browser failed."
1324
+
1325
+ @sessions.delete(session.sessionid)
1326
+ end
1327
+
1328
+ # Eventually delete this session.
1329
+
1330
+ if done
1331
+ @sessions.delete(session.sessionid)
1332
+
1333
+ if @localbrowsing
1334
+ resp.stop
1335
+
1336
+ if @browserstarted and not @browserthread.nil? and @browserthread.alive?
1337
+ resp.stop do
1338
+ puts "Waiting for the browser to terminate..."
1339
+
1340
+ @browserthread.join
1341
+ end
1342
+ end
1343
+ end
1344
+ end
1345
+
1346
+ else
1347
+
1348
+ # Serve files.
1349
+
1350
+ if pad == "/rwd_pixel.gif"
1351
+ resp["Cache-Control"] = "max-age=86400"
1352
+ resp["Content-Type"] = "image/gif"
1353
+ resp << $rwd_pixel
1354
+ else
1355
+ if session.authenticated
1356
+ pwd = Dir.pwd
1357
+ file = File.expand_path(pad.gsub(/^\/*/, ""), $rwd_files)
1358
+
1359
+ if not file.index(pwd) == 0
1360
+ resp["Content-Type"] = "text/html"
1361
+ resp.response = "HTTP/1.0 400 BAD REQUEST"
1362
+ resp << "<html><body><p><b>Bad Request.</b> (<tt>#{pad}</tt>)</p></body></html>"
1363
+ elsif File.file?(file)
1364
+ resp << File.new(file, "rb").read rescue nil
1365
+ else
1366
+ resp["Content-Type"] = "text/html"
1367
+ resp.response = "HTTP/1.0 404 NOT FOUND"
1368
+ resp << "<html><body><p><b>Not found.</b> (<tt>#{pad}</tt>)</p></body></html>"
1369
+ end
1370
+ else
1371
+ resp["Content-Type"] = "text/html"
1372
+ resp.response = "HTTP/1.0 ??? NOT AUTHORIZED"
1373
+ resp << "<html><body><p><b>Not Authorized.</b></p></body></html>"
1374
+ end
1375
+ end
1376
+
1377
+ end
1378
+
1379
+ end
1380
+ end
1381
+ end
1382
+ end
1383
+
1384
+
1385
+
1386
+ $rwd_pixel = "
1387
+ R0lGODlhAQABAMIAAAAAAP///+7u7kREiP///////////////yH5BAEKAAMA
1388
+ LAAAAAABAAEAAAMCOAkAOw==
1389
+ ".unpack("m").shift
1390
+
1391
+ $rwd_logo = "
1392
+ R0lGODlhEAAQAMIAAAAAAP///+7u7kREiP///////////////yH5BAEKAAQA
1393
+ LAAAAAAQABAAAANCSErQ/k21QKulrIrNu8heuAGUcJ0BuQVD676DasK0zNKv
1394
+ jefB+oo6l6AxBAx7M2HRePQph5xga0RsJqfELPI2DSUAADs=
1395
+ ".unpack("m").shift
1396
+
1397
+
1398
+ $rwd_html_1, $rwd_html_2 = $rwd_html[ENV["RWDTHEME"]].split(/^\s*%BODY%\s*\r*$/)
1399
+ #if ENV["RWDTHEME"] == "PDA"
1400
+ #$rwd_html_PDA_1, $rwd_html_PDA_2 = $rwd_html["PDA"].split(/^\s*%BODY%\s*\r*$/)
1401
+ #end
1402
+ #end
1403
+ #
1404
+ #class RWDialog < RWD::RWDialog
1405
+ #end