exerb 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
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