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,623 @@
1
+ ###################################
2
+ #
3
+ # vrdde.rb
4
+ # Programmed by nyasu <nyasu@osk.3web.ne.jp>
5
+ # Copyright 1999-2005 Nishikawa,Yasuhiro
6
+ #
7
+ # More information at http://vruby.sourceforge.net/index.html
8
+ #
9
+ ###################################
10
+
11
+ =begin
12
+ = VisualuRuby(tmp) modules for DDE
13
+ This file provides modules for DDE conversation.
14
+ <<< handlers.rd
15
+ =end
16
+
17
+
18
+ # DDE_ADVISE not tested.
19
+
20
+ VR_DIR="vr/" unless defined?(::VR_DIR)
21
+ require VR_DIR+'vruby'
22
+ require VR_DIR+'sysmod'
23
+
24
+ module DDElParam
25
+ PackDDElParam=Win32API.new("user32","PackDDElParam",["I","I","I"],"L")
26
+ UnpackDDElParam=Win32API.new("user32","UnpackDDElParam",["I","L","P","P"],"I")
27
+ FreeDDElParam=Win32API.new("user32","FreeDDElParam",["I","L"],"I")
28
+ ReuseDDElParam=Win32API.new("user32","ReuseDDElParam","IIIII","L")
29
+
30
+ def packDDElParam(msg,low,high)
31
+ PackDDElParam.call(msg,low,high)
32
+ end
33
+ def unpackDDElParam(msg,lparam)
34
+ a=" "; b=" "
35
+ UnpackDDElParam.call(msg,lparam,a,b)
36
+ [a.unpack("I")[0],b.unpack("I")[0]]
37
+ end
38
+
39
+ def freeDDElParam(msg,lparam)
40
+ FreeDDElParam.call(msg,lparam)
41
+ end
42
+
43
+ def reuseDDElParam(lParam, uMsgIn, uMsgOut, uLow, uHigh) #by yukimi_sake
44
+ ReuseDDElParam.call(lParam, uMsgIn, uMsgOut, uLow, uHigh)
45
+ end
46
+ end
47
+
48
+ module VRDdeConversation
49
+ =begin
50
+ == VRDdeConversation
51
+ Utilities for DDE conversation.
52
+
53
+ === Methods
54
+ --- sendDDEAck(shwnd,aItem,retcode=0,ack=true,busy=false)
55
+ Sends DDE_ACK message to shwnd.
56
+
57
+ == VRDdeConversation::DDEAckFlags
58
+ This is a capsule of return code,ack flag, busy flag for DDE_ACK message
59
+ === Attributes
60
+ --- retcode
61
+ 8bit value.
62
+ --- ack
63
+ DDE request is accepted or not.
64
+ --- busy
65
+ busy or not.
66
+ =end
67
+
68
+ WM_DDE_INITIATE = 0x3e0
69
+ WM_DDE_TERMINATE= 0x3e1
70
+ WM_DDE_ADVISE = 0x3e2
71
+ WM_DDE_UNADVISE = 0x3e3
72
+ WM_DDE_ACK = 0x3e4
73
+ WM_DDE_DATA = 0x3e5
74
+ WM_DDE_REQUEST = 0x3e6
75
+ WM_DDE_POKE = 0x3e7
76
+ WM_DDE_EXECUTE = 0x3e8
77
+
78
+ class DDEAckFlags
79
+ # attr_accessor :ack
80
+ # attr_accessor :busy
81
+ # attr_accessor :retcode
82
+ def ack() @_vr_ack; end
83
+ def busy() @_vr_busy; end
84
+ def retcode() @_vr_retcode; end
85
+
86
+ def initialize(ack=true,busy=false,retcode=0)
87
+ @_vr_ack,@_vr_busy,@_vr_retcode = ack,busy,retcode
88
+ end
89
+ end
90
+
91
+ def sendDDEAck(shwnd,aItem,retcode=0,ack=true,busy=false)
92
+ r = retcode & 0xff
93
+ r |= 0x8000 if ack
94
+ r |= 0x4000 if busy
95
+ lparam = packDDElParam(WM_DDE_ACK,r,aItem)
96
+ SMSG::PostMessage.call shwnd,WM_DDE_ACK, self.hWnd,lparam
97
+ end
98
+ end
99
+
100
+ module VRDdeServer
101
+ =begin
102
+ == VRDdeServer
103
+ This module prepares fundamental functions for DDE server.
104
+
105
+ === Methods
106
+ --- addDDEAppTopic(appname,topic)
107
+ Adds acceptable pair of application name and topic for DDE.
108
+ --- delDDEAppTopic(appname,topic)
109
+ Deletes acceptable pair of application name and topic.
110
+
111
+ === Event handlers
112
+ --- ????_ddeinitiate(shwnd,appname,topic)
113
+ Fired when DDE client whose hwnd is ((|shwnd|)) connects the
114
+ DDE server.
115
+ --- ???_ddeterminate(shwnd)
116
+ Fired when DDE client whose hwnd is ((|shwnd|)) disconnects.
117
+ =end
118
+
119
+ include VRMessageHandler
120
+ include VRDdeConversation
121
+ include DDElParam
122
+
123
+ def ddeserverinit
124
+ acceptEvents([WM_DDE_INITIATE,WM_DDE_TERMINATE])
125
+ addHandler WM_DDE_INITIATE,"_ddeInitiate",MSGTYPE::ARGINTINTINT,nil
126
+ addHandler WM_DDE_TERMINATE,"_ddeTerminate",MSGTYPE::ARGWINT,nil
127
+ @_vr_clients={} #{client's hwnd=>[client's hwnd,appname,topic]
128
+ @_vr_ddeacceptable=[] # [appname,topic]
129
+ end
130
+ def vrinit
131
+ super
132
+ ddeserverinit
133
+ end
134
+
135
+ def self__ddeInitiate(shwnd,aApp,aTopic)
136
+ p=[GAtom::GetName(aApp),GAtom::GetName(aTopic)]
137
+ return unless @_vr_ddeacceptable.index(p)
138
+
139
+ @_vr_clients[shwnd] = [shwnd] + p
140
+ r=nil
141
+ r=selfmsg_dispatching("ddeinitiate",shwnd,p[0],p[1])
142
+ SMSG::SendMessage.call shwnd,WM_DDE_ACK,self.hWnd,MAKELPARAM(aApp,aTopic)
143
+ end
144
+
145
+ def self__ddeTerminate(shwnd)
146
+ selfmsg_dispatching("ddeterminate",shwnd)
147
+ SMSG::PostMessage.call shwnd,WM_DDE_TERMINATE,self.hWnd,0
148
+ @_vr_clients.delete(shwnd)
149
+ end
150
+
151
+ def addDDEAppTopic(appname,topic)
152
+ @_vr_ddeacceptable.push([appname,topic])
153
+ end
154
+ def delDDEAppTopic(appname,topic)
155
+ @_vr_ddeacceptable.delete([appname,topic])
156
+ end
157
+
158
+ def self_ddeinitiate(*args) end
159
+ def self_ddeterminate(*arg) end
160
+ end
161
+
162
+ module VRDdeExecuteServer
163
+ =begin
164
+ == VRDdeExecuteServer
165
+ This module provides a feature of DDE_Execute server.
166
+ ((<VRDdeServer>)) is included.
167
+
168
+ === Event handler
169
+ --- self_ddeexecute(command,shwnd,appname,topic)
170
+ Fired when the client whose name is ((|shwnd|)) sends DDE_EXECUTE
171
+ to the server.The command string is ((|command|)).
172
+ If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
173
+ DDE_ACK message that will be sent is according to this return value.
174
+ =end
175
+
176
+ include VRDdeServer
177
+
178
+ EXECUTEMETHOD="ddeexecute"
179
+
180
+ def ddeexecuteserverinit
181
+ addEvent WM_DDE_EXECUTE
182
+ addHandler WM_DDE_EXECUTE,"_ddeexecuteinternal",MSGTYPE::ARGINTINT,nil
183
+ end
184
+ def vrinit
185
+ super
186
+ ddeexecuteserverinit
187
+ end
188
+
189
+ def self__ddeexecuteinternal(shwnd,hcmd)
190
+ cl=@_vr_clients[shwnd]
191
+ raise "unknown dde client (not initiated)" unless cl
192
+ cmd=GMEM::Get(hcmd).unpack("A*")[0]
193
+ ret=nil
194
+ ret=selfmsg_dispatching(EXECUTEMETHOD,cmd,*cl)
195
+ freeDDElParam(WM_DDE_EXECUTE,hcmd) #by yukimi_sake
196
+ if ret.is_a?(DDEAckFlags) then
197
+ sendDDEAck shwnd,hcmd,(ret.retcode || 0),ret.ack,ret.busy
198
+ else
199
+ sendDDEAck shwnd,hcmd
200
+ end
201
+ end
202
+ end
203
+
204
+ module VRDdeRequestServer #by yukimi_sake
205
+ =begin
206
+ == VRDdeRequestServer
207
+ This module provides a feature of DDE_REQUEST server.
208
+ ((<VRDdeServer>)) is included.
209
+
210
+ === Event handler
211
+ --- self_dderequest(item,shwnd,app,topic)
212
+ Fired when the client whose name is ((|shwnd|)) sends DDE_REQUEST
213
+ to the server.The item string is ((|item|)).
214
+ Retuern value(as String) is sended to shwnd which is handle of client,
215
+ using WM_DDE_DATA message.
216
+ If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
217
+ DDE_ACK message that will be sent is according to this return value.
218
+ =end
219
+
220
+ include VRDdeServer
221
+
222
+ EXECUTEMETHOD="dderequest"
223
+ GMEM_DDESHARE=0x2000
224
+
225
+ def sendDDEData(shwnd,lp,data)
226
+ raise "Data must be a String" unless data.is_a? String
227
+ dDEDATA=[0xb000,ClipboardFormat::CF_TEXT,data+"\0"].pack("Ssa*")
228
+ hData=GMEM::AllocStr(GMEM_DDESHARE,dDEDATA)
229
+ lParam=reuseDDElParam lp,WM_DDE_REQUEST,WM_DDE_DATA,hData,HIWORD(lp)
230
+ SMSG::PostMessage.call shwnd, WM_DDE_DATA, self.hWnd, lParam
231
+ end
232
+
233
+ def dderequestserverinit
234
+ addEvent WM_DDE_REQUEST
235
+ addHandler WM_DDE_REQUEST,"_dderequestinternal",MSGTYPE::ARGINTINT,nil
236
+ end
237
+
238
+ def vrinit
239
+ super
240
+ dderequestserverinit
241
+ end
242
+
243
+ def self__dderequestinternal(shwnd,lparam)
244
+ cl=@_vr_clients[shwnd]
245
+ raise "unknown dde client (not initiated)" unless cl
246
+ cformat,aitem = unpackDDElParam(WM_DDE_REQUEST,lparam)
247
+ raise "not supported this format" unless cformat == 1
248
+ item = GAtom::GetName(aitem)
249
+ ret=nil
250
+ ret=selfmsg_dispatching(EXECUTEMETHOD,item,*cl)
251
+ if ret.is_a?(DDEAckFlags) then
252
+ freeDDElParam(WM_DDE_REQEST,lparam)
253
+ sendDDEAck shwnd,aitem,(ret.retcode || 0),ret.ack,ret.busy
254
+ else
255
+ sendDDEData shwnd,lparam,ret
256
+ end
257
+ end
258
+ def self_dderequest(item,shwnd,app,topic) end
259
+ end
260
+
261
+ module VRDdePokeServer #by yukimi_sake
262
+ =begin
263
+ == VRDdePokeServer
264
+ This module provides a feature of DDE_POKE server.
265
+ ((<VRDdeServer>)) is included.
266
+
267
+ === Event handler
268
+ --- self_ddepoke(item,data,cfmt,shwnd,app,topic)
269
+ Fired when the client whose name is ((|shwnd|)) sends DDE_POKE
270
+ to the server.The item string is ((|item|)).The data is ((|data|)).
271
+ If you want to treat data other than String, carry out according to
272
+ clipboard format ((|cfmt|)) in the handler.
273
+ If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
274
+ DDE_ACK message that will be sent is according to this return value.
275
+ =end
276
+ include VRDdeServer
277
+
278
+ EXECUTEMETHOD="ddepoke"
279
+
280
+ def ddepokeserverinit
281
+ addEvent WM_DDE_POKE
282
+ addHandler WM_DDE_POKE,"_ddepokeinternal",MSGTYPE::ARGINTINT,nil
283
+ end
284
+
285
+ def vrinit
286
+ super
287
+ ddepokeserverinit
288
+ end
289
+
290
+ def self__ddepokeinternal(shwnd,lparam)
291
+ cl=@_vr_clients[shwnd]
292
+ raise "unknown dde client (not initiated)" unless cl
293
+ hdata,aitem = unpackDDElParam(WM_DDE_POKE,lparam)
294
+ item = GAtom::GetName(aitem)
295
+ datastr = GMEM::Get(hdata)
296
+ flag,cfmt,data = datastr.unpack("SsA*")
297
+ if (flag&0x2000) > 0 then # fRelease is asserted
298
+ GMEM::Free(hdata)
299
+ end
300
+ ret=nil
301
+ ret=selfmsg_dispatching(EXECUTEMETHOD,item,data,cfmt,*cl)
302
+ freeDDElParam(WM_DDE_POKE, lparam)
303
+ if ret.is_a?(DDEAckFlags) then
304
+ sendDDEAck shwnd,aitem,(ret.retcode || 0),ret.ack,ret.busy
305
+ else
306
+ sendDDEAck shwnd,aitem
307
+ end
308
+ end
309
+ def self_ddepoke(item,data,cfmt,shwnd,app,topic) end
310
+ end
311
+
312
+ module VRDdeClient
313
+ =begin
314
+ == VRDdeClient
315
+ This module provides features of DDE clients.
316
+
317
+ === Methods
318
+ --- ddeconnected?
319
+ --- ddeready?
320
+ Returns whether it is able to request dde conversation.
321
+ --- ddebusy?
322
+ Returns true when it waits DDE_ACK/DDE_DATA message.
323
+
324
+ --- ddeexecute(appname,topic.command)
325
+ Sends DDE_EXECUTE request to the server specified by the pair of (appname,topic).
326
+ --- ddepoke(appname,topic,item,data,fmt)
327
+ Sends DDE_POKE request to the server specified by the pair of (appname,topic).
328
+ The ((|data|)) in the format of ((|fmt|)) (1 as CF_TEXT and so on) is transferred
329
+ tothe ((|item|)) in the server
330
+ --- dderequest(appname,topic,item,fmt)
331
+ Sends DDE_REQUEST request to the server specified by the pair of (appname,topic).
332
+ The server calls back ((<self_dderequestdata>)) method of client window to
333
+ transfer the data of ((|item|)).
334
+ --- ddeadvise(appname,topic,item,fmt)
335
+ --- ddeunadvise(appname,topic,item,fmt)
336
+ Not tested.
337
+
338
+ === Event handlers
339
+ ???? is the downcase-ed appname of the DDE conversation. It is because the ???? name
340
+ is named by WM_DDE_ACK message's App-name which is created by the server and that
341
+ may be different from the requested appname from client.
342
+
343
+ --- ????_ddeterminate(shwnd)
344
+ Fired when the server disconnects the conversation.
345
+ --- ????_dderefused(retcode,busy)
346
+ Fired when the server refused the connection. The return code is ((|retcode|)) and
347
+ busy flag is ((|busy|)).
348
+ --- ????_ddeexecdone(retcode)
349
+ Fired when the server accepts the DDE_EXECUTE request.
350
+ --- ????_ddepokedone(retcode)
351
+ Fired when the server accepts the DDE_POKE request.
352
+ --- ????_ddedata(data,fmt,flag)
353
+ Fired when the server returns the data by the DDE_REQUEST that client sended.
354
+ If the return value is a kind of VRDdeConversation::((<DDEAckFlags>)),
355
+ DDE_ACK message that will be sent is according to this return value.
356
+ --- ????_ddeadvisedata(data,fmt,flag)
357
+ Not tested.
358
+ =end
359
+
360
+ include VRMessageHandler
361
+ include VRDdeConversation
362
+ include DDElParam
363
+
364
+ private
365
+ STATUSCONNECT= 1
366
+ STATUSEXECUTE= 2
367
+ STATUSPOKE = 4
368
+ STATUSREQUEST= 8
369
+ STATUSADVISE = 16
370
+ STATUSTERMINATE=128
371
+ GMEMSTYLE = 0x2042
372
+
373
+
374
+ def ddeconnect(appname,topic)
375
+ raise "DDE_INITIATE busy!" if @_vr_ddesearching
376
+ raise "Application name must be specified" unless appname
377
+ aApp = GAtom::Add(appname)
378
+ aTopic = if topic then GAtom::Add(topic) else 0 end
379
+
380
+ srv = @_vr_servers.find do |key,item| item[1]==appname end
381
+
382
+ shwnd = if srv then srv[0] else 0xffffffff end
383
+ @_vr_ddesearching=nil
384
+ SMSG::SendMessage.call shwnd,WM_DDE_INITIATE,self.hWnd,MAKELPARAM(aApp,aTopic)
385
+ shwnd = @_vr_ddesearching unless srv
386
+ @_vr_ddesearching=nil
387
+
388
+ GAtom::Delete(aApp)
389
+ GAtom::Delete(aTopic) if topic!=0
390
+ raise "DDE Server (#{appname}:#{topic}) not found" unless shwnd
391
+ shwnd
392
+ end
393
+
394
+ def ddeterminate(shwnd)
395
+ SMSG::PostMessage.call shwnd,WM_DDE_TERMINATE,self.hWnd,0
396
+ @_vr_servers[shwnd][2]|=STATUSTERMINATE
397
+ # @_vr_servers.delete(shwnd)
398
+ end
399
+
400
+ public
401
+ def vrinit
402
+ super
403
+ ddeclientinit
404
+ end
405
+
406
+ def ddeclientinit
407
+ acceptEvents([WM_DDE_ACK,WM_DDE_DATA,WM_DDE_TERMINATE])
408
+ addHandler WM_DDE_ACK, "ddeAck", MSGTYPE::ARGINTINT,nil
409
+ addHandler WM_DDE_DATA,"ddeData",MSGTYPE::ARGINTINT,nil
410
+ addHandler WM_DDE_TERMINATE,"ddeTerminate",MSGTYPE::ARGWINT,nil
411
+ @_vr_servers={} # {server's hwnd => [server's hwnd,appname,status,params]}
412
+ @_vr_ddesearching = false
413
+ end
414
+
415
+ def ddeconnected?(appname)
416
+ srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
417
+ if srv then srv=srv[1];((srv[2]&STATUSCONNECT)>0) else false end
418
+ end
419
+ def ddebusy?(appname)
420
+ srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
421
+ if srv then srv=srv[1]; ((srv[2] & ~STATUSCONNECT)>0) else nil end
422
+ end
423
+ def ddeidle?(appname)
424
+ srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
425
+ if srv then
426
+ srv=srv[1]
427
+ ((srv[2]&STATUSCONNECT)>0) and ((srv[2] & ~STATUSCONNECT)==0)
428
+ else
429
+ true
430
+ end
431
+ end
432
+ def ddeready?(appname)
433
+ srv = @_vr_servers.find do |key,item| item[1].downcase==appname.downcase end
434
+ if srv then
435
+ srv=srv[1]
436
+ ((srv[2]&STATUSCONNECT)>0) and
437
+ ((srv[2] & ~(STATUSCONNECT | STATUSADVISE))==0)
438
+ else
439
+ true
440
+ end
441
+ end
442
+
443
+ def ddeexecute(appname,topic,cmdstr)
444
+ raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
445
+ shwnd=ddeconnect(appname,topic)
446
+ executemem = GMEM::AllocStr(GMEMSTYLE,cmdstr)
447
+ @_vr_servers[shwnd][2] |= STATUSEXECUTE
448
+ SMSG::PostMessage.call shwnd,WM_DDE_EXECUTE,self.hWnd,executemem
449
+ end
450
+
451
+ def ddepoke(appname,topic,item,data,fmt=ClipboardFormat::CF_TEXT)
452
+ raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
453
+ shwnd=ddeconnect(appname,topic)
454
+
455
+ aItem = GAtom::Add(item.to_s)
456
+
457
+ pokedata=[0,fmt].pack("Ss")+data.to_s
458
+ pokemem = GMEM::AllocStr(GMEMSTYLE,pokedata)
459
+
460
+ @_vr_servers[shwnd][2] |= STATUSPOKE
461
+ @_vr_servers[shwnd][3] = pokemem
462
+
463
+ lparam = packDDElParam(WM_DDE_POKE,pokemem,aItem)
464
+ SMSG::PostMessage.call shwnd,WM_DDE_POKE,self.hWnd,lparam
465
+ end
466
+
467
+ def dderequest(appname,topic,item,fmt=ClipboardFormat::CF_TEXT)
468
+ raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
469
+ shwnd=ddeconnect(appname,topic)
470
+
471
+ aItem = GAtom::Add(item.to_s)
472
+
473
+ @_vr_servers[shwnd][2] |= STATUSREQUEST
474
+ SMSG::PostMessage.call shwnd,WM_DDE_REQUEST,self.hWnd,
475
+ MAKELPARAM(fmt.to_i,aItem)
476
+ end
477
+
478
+ def ddeadvise(appname,topic,item,fmt=1,defup=false,ackreq=false)
479
+ raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
480
+ shwnd=ddeconnect(appname,topic)
481
+
482
+ aItem = GAtom::Add(item.to_s)
483
+
484
+ flag = 0
485
+ if defup then flag |= 0x4000 end
486
+ if ackreq then flag |= 0x8000 end
487
+
488
+ advisedata=[flag,fmt].pack("Ss")
489
+ advisemem = GMEM::AllocStr(GMEMSTYLE,advisedata)
490
+
491
+ @_vr_servers[shwnd][2] |= STATUSADVISE
492
+ lparam = packDDElParam(WM_DDE_POKE,advisemem,aItem)
493
+ SMSG::PostMessage.call shwnd,WM_DDE_ADVISE,self.hWnd,lparam
494
+ end
495
+
496
+ def ddeunadvise(appname,topic,item,fmt=0)
497
+ raise "dde(#{appname}:#{topic}) not ready" unless ddeready?(appname)
498
+ shwnd=ddeconnect(appname,topic)
499
+
500
+ aItem = GAtom::Add(item.to_s)
501
+
502
+ @_vr_servers[n][2] |= STATUSREQUEST
503
+ SMSG::PostMessage.call @_vr_servers[n][0],WM_DDE_UNADVISE,self.hWnd,
504
+ MAKELPARAM(fmt.to_i,aItem)
505
+ end
506
+
507
+
508
+ def self_ddeTerminate(shwnd)
509
+ return unless @_vr_servers[shwnd]
510
+ controlmsg_dispatching(@_vr_servers[shwnd][1],"ddeterminate")
511
+ @_vr_servers.delete(shwnd)
512
+ end
513
+
514
+ def self_ddeAck(shwnd,lparam)
515
+ #p "ACK"
516
+ sv = @_vr_servers[shwnd]
517
+ fname=""
518
+ if(!sv) then
519
+ aApp,aTopic = LOWORD(lparam),HIWORD(lparam)
520
+ appname=GAtom::GetName(aApp).downcase
521
+ tpcname=GAtom::GetName(aTopic)
522
+ appname2=appname.dup
523
+ def appname2.name() self; end # tricky thing for parentrelayer
524
+ @_vr_servers[shwnd]=[shwnd,appname2,STATUSCONNECT,nil]
525
+
526
+ @_vr_ddesearching=shwnd
527
+
528
+ GAtom::Delete(aApp)
529
+ GAtom::Delete(aTopic)
530
+
531
+ elsif (sv[2] & ~STATUSCONNECT)>0 then
532
+ wstatus,param = unpackDDElParam(WM_DDE_ACK,lparam)
533
+ freeDDElParam(WM_DDE_ACK,lparam)
534
+
535
+ retcode = wstatus&0xf
536
+ busy= 0<(wstatus&0x4000)
537
+ ack = 0<(wstatus&0x8000)
538
+ sname = sv[1]
539
+
540
+ unless ack then
541
+ sv[2] &= STATUSCONNECT
542
+ # fname=sname+"_dderefused"
543
+ # __send__(fname,retcode,busy) if respond_to?(fname)
544
+ controlmsg_dispatching(sname,"dderefused",retcode,busy)
545
+ end
546
+ if (sv[2] & STATUSEXECUTE)>0 then
547
+ GMEM::Free(param) unless ack
548
+ sv[2] &= ~STATUSEXECUTE
549
+ fname="ddeexecdone"
550
+ ddeterminate(shwnd)
551
+ elsif(sv[2] & STATUSPOKE)>0 then
552
+ GAtom::Delete(param)
553
+ GMEM::Free(sv[3])
554
+ sv[3]=nil
555
+ sv[2] &= ~STATUSPOKE
556
+ fname="ddepokedone"
557
+ ddeterminate(shwnd)
558
+ elsif(sv[2] & STATUSREQUEST)>0 then
559
+ GAtom::Delete(param)
560
+ sv[2] &= ~STATUSPOKE
561
+ fname=nil
562
+ ddeterminate(shwnd)
563
+ elsif(sv[2] & STATUSADVISE)>0 then
564
+ GMEM::Free(param) unless ack
565
+ sv[2] &= ~STATUSADVISE
566
+ fname=nil
567
+ else
568
+ ddeterminate(shwnd)
569
+ end
570
+ controlmsg_dispatching(sname,fname,retcode) if ack and fname
571
+ else
572
+ raise "DDE MultiSession Error"
573
+ end
574
+ end
575
+
576
+ def self_ddeData(shwnd,lparam)
577
+ #p "DATA"
578
+ datamem,aItem = unpackDDElParam(WM_DDE_DATA,lparam)
579
+ freeDDElParam(WM_DDE_DATA,lparam)
580
+
581
+ sv = @_vr_servers[shwnd]
582
+ fname=sname=nil
583
+
584
+ datastr = GMEM::Get(datamem)
585
+ flag,fmt,data = datastr.unpack("Ssa*")
586
+
587
+ if (flag&0x2000) > 0 then # fRelease is asserted
588
+ GMEM::Free(datamem)
589
+ end
590
+
591
+ ret = nil
592
+ if(!sv) then
593
+ # Ignored
594
+ else
595
+ sname=sv[1]
596
+ if (sv[2] & STATUSREQUEST)>0 then
597
+ sv[2]&=1
598
+ fname="ddedata"
599
+ ddeterminate(sv[0])
600
+ elsif (sv[2] & STATUSADVISE)>0
601
+ sv[2]&=1
602
+ fname="ddeadvisedata"
603
+ else
604
+ end
605
+
606
+ fn=sname+fname
607
+ if(fn) then
608
+ ret=controlmsg_dispatching(sname,fname,data,fmt,flag)
609
+ end
610
+ end
611
+
612
+ if (flag&0x8000) > 0 then #fAckReq is asserted
613
+ if ret.is_a?(DDEAckFlags) then
614
+ sendDDEAck shwnd,aItem,(ret.retcode || 0),ret.ack,ret.busy
615
+ else
616
+ sendDDEAck shwnd,aItem
617
+ end
618
+ else
619
+ GAtom::Delete(aItem)
620
+ end
621
+
622
+ end
623
+ end