DeepConnect 0.4.06
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.
- data/lib/deep-connect.rb +83 -0
- data/lib/deep-connect/accepter.rb +64 -0
- data/lib/deep-connect/class-spec-space.rb +652 -0
- data/lib/deep-connect/conf.rb +48 -0
- data/lib/deep-connect/cron.rb +91 -0
- data/lib/deep-connect/deep-fork.rb +70 -0
- data/lib/deep-connect/deep-mq.rb +62 -0
- data/lib/deep-connect/deep-space.rb +403 -0
- data/lib/deep-connect/evaluator.rb +149 -0
- data/lib/deep-connect/event.rb +551 -0
- data/lib/deep-connect/exceptions.rb +38 -0
- data/lib/deep-connect/future.rb +67 -0
- data/lib/deep-connect/organizer.rb +378 -0
- data/lib/deep-connect/port.rb +151 -0
- data/lib/deep-connect/reference.rb +422 -0
- data/lib/deep-connect/serialize.rb +127 -0
- data/lib/deep-connect/session.rb +348 -0
- data/lib/deep-connect/version.rb +8 -0
- metadata +86 -0
@@ -0,0 +1,149 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# evaluator.rb -
|
4
|
+
# Copyright (C) 1996-2010 Keiju ISHITSUKA
|
5
|
+
# (Penta Advanced Labrabries, Co.,Ltd)
|
6
|
+
#
|
7
|
+
|
8
|
+
|
9
|
+
require "deep-connect/event"
|
10
|
+
require "deep-connect/exceptions"
|
11
|
+
|
12
|
+
module DeepConnect
|
13
|
+
class Evaluator
|
14
|
+
def initialize(org)
|
15
|
+
@organizer = org
|
16
|
+
end
|
17
|
+
|
18
|
+
def evaluate_request(session, event)
|
19
|
+
begin
|
20
|
+
if @organizer.shallow_connect?
|
21
|
+
if !(mspec = Organizer::method_spec(event.receiver, event.method)) or
|
22
|
+
!mspec.interface?
|
23
|
+
DC.Raise NoInterfaceMethod, event.receiver.class, event.method
|
24
|
+
end
|
25
|
+
end
|
26
|
+
ret = event.receiver.send(event.method, *event.args)
|
27
|
+
unless event.kind_of?(Event::NoReply)
|
28
|
+
session.accept event.reply(ret)
|
29
|
+
end
|
30
|
+
# rescue SygnalException
|
31
|
+
# puts "Info: catch"
|
32
|
+
#
|
33
|
+
rescue SystemExit
|
34
|
+
raise
|
35
|
+
rescue Exception
|
36
|
+
#p event.receiver.class
|
37
|
+
#p event.method
|
38
|
+
#p $!
|
39
|
+
#p $@
|
40
|
+
unless event.kind_of?(Event::NoReply)
|
41
|
+
session.accept event.reply(ret, $!)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def evaluate_iterator_request(session, event)
|
47
|
+
begin
|
48
|
+
if @organizer.shallow_connect?
|
49
|
+
if !(mspec = Organizer::method_spec(event.receiver, event.method)) or
|
50
|
+
!mspec.interface?
|
51
|
+
DC.Raise NoInterfaceMethod, event.receiver.class, event.method
|
52
|
+
end
|
53
|
+
end
|
54
|
+
fin = event.receiver.send(event.method, *event.args){|*args|
|
55
|
+
begin
|
56
|
+
# if args.size == 1 && args.first.kind_of?(Array)
|
57
|
+
# args = args.first
|
58
|
+
# end
|
59
|
+
callback_req = session.block_yield(event, args)
|
60
|
+
|
61
|
+
case callback_req.result_event
|
62
|
+
when Event::IteratorCallBackReplyBreak
|
63
|
+
break callback_req.result
|
64
|
+
else
|
65
|
+
callback_req.result
|
66
|
+
end
|
67
|
+
rescue
|
68
|
+
# ここ内部エラーじゃないなぁ...
|
69
|
+
if Conf.DEBUG
|
70
|
+
puts "INFO: BLOCK YIELD EXCEPTION:"
|
71
|
+
puts "\t#{$!}"
|
72
|
+
$@.each{|l| puts "\t#{l}"}
|
73
|
+
end
|
74
|
+
raise
|
75
|
+
end
|
76
|
+
}
|
77
|
+
session.accept event.reply(fin)
|
78
|
+
rescue SystemExit
|
79
|
+
raise
|
80
|
+
rescue Exception
|
81
|
+
session.accept event.reply(fin, $!)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def evaluate_block_yield(session, ev)
|
86
|
+
if @organizer.shallow_connect?
|
87
|
+
# yield が許されているかチェック
|
88
|
+
end
|
89
|
+
begin
|
90
|
+
args = ev.args
|
91
|
+
|
92
|
+
if ev.block.arity > 1
|
93
|
+
begin
|
94
|
+
if args.size == 1 && args.first.__deep_connect_reference?
|
95
|
+
if args.first.kind_of?(Array)
|
96
|
+
args = args.first.dc_dup
|
97
|
+
end
|
98
|
+
end
|
99
|
+
rescue
|
100
|
+
p $!, $!
|
101
|
+
raise
|
102
|
+
end
|
103
|
+
end
|
104
|
+
ret = ev.block.call(*args)
|
105
|
+
session.accept ev.reply(ret)
|
106
|
+
rescue LocalJumpError
|
107
|
+
exp = $!
|
108
|
+
case exp.reason
|
109
|
+
when :break
|
110
|
+
session.accept ev.reply(ret,
|
111
|
+
exp.exit_value,
|
112
|
+
Event::IteratorCallBackReplyBreak)
|
113
|
+
else
|
114
|
+
session.accept ev.reply(ret, exp)
|
115
|
+
end
|
116
|
+
rescue Exception
|
117
|
+
exp = $!
|
118
|
+
session.accept e = ev.reply(ret, exp)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def evaluate_mq_request(session, event, callback)
|
123
|
+
begin
|
124
|
+
if @organizer.shallow_connect?
|
125
|
+
if !(mspec = Organizer::method_spec(event.receiver, event.method)) or
|
126
|
+
!mspec.interface?
|
127
|
+
DC.Raise NoInterfaceMethod, event.receiver.class, event.method
|
128
|
+
end
|
129
|
+
end
|
130
|
+
ret = event.receiver.send(event.method, *event.args)
|
131
|
+
if callback
|
132
|
+
callback.asynchronus_send(:call, ret, nil)
|
133
|
+
callback.release
|
134
|
+
end
|
135
|
+
rescue SystemExit
|
136
|
+
raise
|
137
|
+
rescue Exception
|
138
|
+
if callback
|
139
|
+
p event.receiver.class
|
140
|
+
p event.method
|
141
|
+
p $!
|
142
|
+
p $@
|
143
|
+
callback.asynchronus_send(:call, ret, $!)
|
144
|
+
callback.release
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,551 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# event.rb -
|
4
|
+
# Copyright (C) 1996-2010 Keiju ISHITSUKA
|
5
|
+
# (Penta Advanced Labrabries, Co.,Ltd)
|
6
|
+
#
|
7
|
+
|
8
|
+
require "deep-connect/class-spec-space"
|
9
|
+
require "deep-connect/reference"
|
10
|
+
|
11
|
+
module DeepConnect
|
12
|
+
|
13
|
+
class PeerSideException<StandardError
|
14
|
+
def initialize(exp)
|
15
|
+
#Fairy::Log.debug(self, exp.inspect)
|
16
|
+
begin
|
17
|
+
m = exp.message
|
18
|
+
rescue
|
19
|
+
m = "(NoMessage from PeerSide)"
|
20
|
+
end
|
21
|
+
super(m)
|
22
|
+
@peer_exception = exp
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :peer_exception
|
26
|
+
end
|
27
|
+
|
28
|
+
module Event
|
29
|
+
EV = Event
|
30
|
+
|
31
|
+
def Event.materialize(session, type, *rest)
|
32
|
+
type.materialize_sub(session, type, *rest)
|
33
|
+
end
|
34
|
+
|
35
|
+
class Event
|
36
|
+
def initialize(session, receiver)
|
37
|
+
@session = session
|
38
|
+
@receiver = receiver
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_reader :session
|
42
|
+
attr :receiver
|
43
|
+
attr :seq
|
44
|
+
|
45
|
+
public :iterator?
|
46
|
+
|
47
|
+
def inspect
|
48
|
+
sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, receiver=#{@receiver}>"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module NoReply; end
|
53
|
+
|
54
|
+
class Request < Event
|
55
|
+
def Request.request(session, receiver, method, args)
|
56
|
+
req = new(session, receiver, method, args)
|
57
|
+
req.init_req
|
58
|
+
req
|
59
|
+
end
|
60
|
+
|
61
|
+
def Request.receipt(session, seq, receiver, method, args)
|
62
|
+
rec = new(session, receiver, method, args)
|
63
|
+
rec.set_seq(seq)
|
64
|
+
rec
|
65
|
+
end
|
66
|
+
|
67
|
+
def Request.materialize_sub(session, type, klass, seq, receiver_id, method, args)
|
68
|
+
receiver = session.deep_space.root(receiver_id)
|
69
|
+
|
70
|
+
type.receipt(session, seq,
|
71
|
+
receiver,
|
72
|
+
method,
|
73
|
+
args.collect{|elm|
|
74
|
+
Reference.materialize(session.deep_space, *elm)})
|
75
|
+
end
|
76
|
+
|
77
|
+
def reply(ret, exp = nil, reply_class = reply_class)
|
78
|
+
reply_class.reply(self.session, self, ret, exp)
|
79
|
+
end
|
80
|
+
|
81
|
+
def reply_class
|
82
|
+
Reply
|
83
|
+
end
|
84
|
+
|
85
|
+
def initialize(session, receiver, method, args)
|
86
|
+
super(session, receiver)
|
87
|
+
@method = method
|
88
|
+
@args = args
|
89
|
+
end
|
90
|
+
|
91
|
+
def init_req
|
92
|
+
@seq = @session.next_request_event_id
|
93
|
+
@result = :__DEEPCONNECT__NO_VALUE__
|
94
|
+
@result_mutex = Mutex.new
|
95
|
+
@result_cv = ConditionVariable.new
|
96
|
+
end
|
97
|
+
|
98
|
+
def set_seq(seq)
|
99
|
+
@seq = seq
|
100
|
+
end
|
101
|
+
|
102
|
+
def serialize
|
103
|
+
mspec = @session.deep_space.method_spec(@receiver, @method)
|
104
|
+
if mspec && mspec.args
|
105
|
+
args = mspec.arg_zip(@args){|spec, arg|
|
106
|
+
Reference.serialize_with_spec(@session.deep_space, arg, spec)
|
107
|
+
}
|
108
|
+
else
|
109
|
+
args = @args.collect{|elm|
|
110
|
+
Reference.serialize(@session.deep_space, elm)
|
111
|
+
}
|
112
|
+
end
|
113
|
+
sel = [self.class, @seq, @receiver.peer_id, @method]
|
114
|
+
sel.push args
|
115
|
+
sel
|
116
|
+
end
|
117
|
+
|
118
|
+
def request?
|
119
|
+
true
|
120
|
+
end
|
121
|
+
|
122
|
+
def result_event
|
123
|
+
@result_mutex.synchronize do
|
124
|
+
while @result == :__DEEPCONNECT__NO_VALUE__
|
125
|
+
@result_cv.wait(@result_mutex)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
@result
|
129
|
+
end
|
130
|
+
|
131
|
+
def result
|
132
|
+
result_event
|
133
|
+
if @result.exp
|
134
|
+
raise create_exception
|
135
|
+
end
|
136
|
+
@result.result
|
137
|
+
end
|
138
|
+
|
139
|
+
def result=(ev)
|
140
|
+
@result = ev
|
141
|
+
@result_cv.broadcast
|
142
|
+
end
|
143
|
+
|
144
|
+
attr :method
|
145
|
+
attr :args
|
146
|
+
|
147
|
+
def inspect
|
148
|
+
sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, receiver=#{@receiver}, method=#{@method.id2name}, args=#{@args.collect{|e| e.to_s}.join(', ')}>"
|
149
|
+
end
|
150
|
+
|
151
|
+
def create_exception
|
152
|
+
exp = nil
|
153
|
+
begin
|
154
|
+
exp = @result.exp.dc_dup
|
155
|
+
rescue
|
156
|
+
exp = PeerSideException.new(@result.exp)
|
157
|
+
end
|
158
|
+
|
159
|
+
bt = @result.exp.backtrace
|
160
|
+
bt.push "-- peer side --"
|
161
|
+
bt.push *caller(0)
|
162
|
+
bt = bt.select{|e| /deep-connect/ !~ e} unless Conf.DEBUG
|
163
|
+
exp.set_backtrace(bt)
|
164
|
+
exp
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
class RequestWithBlock < Request
|
170
|
+
def self.materialize_sub(session, type, klass, seq, receiver_id, method, args, block)
|
171
|
+
|
172
|
+
receiver = receiver(session, receiver_id)
|
173
|
+
|
174
|
+
type.receipt(session, seq,
|
175
|
+
receiver,
|
176
|
+
method,
|
177
|
+
args.collect{|elm|
|
178
|
+
Reference.materialize(session.deep_space, *elm)},
|
179
|
+
Reference.materialize(session.deep_space, *block))
|
180
|
+
end
|
181
|
+
|
182
|
+
def self.request(session, receiver, method, args, block)
|
183
|
+
req = new(session, receiver, method, args, block)
|
184
|
+
req.init_req
|
185
|
+
req
|
186
|
+
end
|
187
|
+
|
188
|
+
def self.receipt(session, seq, receiver, method, args, block)
|
189
|
+
rec = new(session, receiver, method, args, block)
|
190
|
+
rec.set_seq(seq)
|
191
|
+
rec
|
192
|
+
end
|
193
|
+
|
194
|
+
def initialize(session, receiver, method, args, block)
|
195
|
+
super(session, receiver, method, args)
|
196
|
+
@block = block
|
197
|
+
end
|
198
|
+
|
199
|
+
attr_reader :block
|
200
|
+
|
201
|
+
def serialize
|
202
|
+
mspec = method_spec(@receiver, @method)
|
203
|
+
if mspec && mspec_args(mspec)
|
204
|
+
args = mspec_arg_zip(mspec){|spec, arg|
|
205
|
+
Reference.serialize_with_spec(@session.deep_space, arg, spec)
|
206
|
+
}
|
207
|
+
else
|
208
|
+
args = @args.collect{|elm|
|
209
|
+
Reference.serialize(@session.deep_space, elm)
|
210
|
+
}
|
211
|
+
end
|
212
|
+
receiver_id = receiver_id(@receiver)
|
213
|
+
# @receiver.peer_id
|
214
|
+
sel = [self.class, @seq, receiver_id, @method]
|
215
|
+
sel.push args
|
216
|
+
sel.push Reference.serialize(@session.deep_space, @block)
|
217
|
+
sel
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
class IteratorRequest<RequestWithBlock
|
222
|
+
|
223
|
+
def self.receiver(session, receiver_id)
|
224
|
+
session.deep_space.root(receiver_id)
|
225
|
+
end
|
226
|
+
|
227
|
+
def method_spec(receiver, method)
|
228
|
+
@session.deep_space.method_spec(receiver, method)
|
229
|
+
end
|
230
|
+
|
231
|
+
def receiver_id(receriver)
|
232
|
+
receiver.peer_id
|
233
|
+
end
|
234
|
+
|
235
|
+
def mspec_args(mspec)
|
236
|
+
mspec.args
|
237
|
+
end
|
238
|
+
|
239
|
+
def mspec_arg_zip(mspec, &block)
|
240
|
+
mspec.arg_zip(@args, &block)
|
241
|
+
end
|
242
|
+
|
243
|
+
def reply_class
|
244
|
+
IteratorReply
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
class IteratorCallBackRequest<RequestWithBlock
|
249
|
+
|
250
|
+
def self.receiver(session, receiver_id)
|
251
|
+
Reference.materialize(session.deep_space, *receiver_id)
|
252
|
+
end
|
253
|
+
|
254
|
+
def method_spec(receiver, method)
|
255
|
+
@session.deep_space.my_method_spec(receiver, method)
|
256
|
+
end
|
257
|
+
|
258
|
+
def receiver_id(receriver)
|
259
|
+
Reference.serialize(@session.deep_space, @receiver)
|
260
|
+
end
|
261
|
+
|
262
|
+
def mspec_args(mspec)
|
263
|
+
mspec.block_args
|
264
|
+
end
|
265
|
+
|
266
|
+
def mspec_arg_zip(mspec, &block)
|
267
|
+
mspec.block_arg_zip(@args, &block)
|
268
|
+
end
|
269
|
+
|
270
|
+
def IteratorCallBackRequest.call_back_event(event, args)
|
271
|
+
req = new(event.session, event.receiver, event.method, args, event.block)
|
272
|
+
req.init_req
|
273
|
+
req
|
274
|
+
end
|
275
|
+
|
276
|
+
def reply_class
|
277
|
+
IteratorCallBackReply
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
class AsyncronusRequest<Request
|
282
|
+
def AsyncronusRequest.request(session, receiver, method, args, callback)
|
283
|
+
req = new(session, receiver, method, args, callback)
|
284
|
+
req.init_req
|
285
|
+
req
|
286
|
+
end
|
287
|
+
|
288
|
+
def AsyncronusRequest.receipt(session, seq, receiver, method, args)
|
289
|
+
rec = new(session, receiver, method, args)
|
290
|
+
rec.set_seq(seq)
|
291
|
+
rec
|
292
|
+
end
|
293
|
+
|
294
|
+
|
295
|
+
def initialize(session, receiver, method, args, callback = nil)
|
296
|
+
super(session, receiver, method, args)
|
297
|
+
@callback = callback
|
298
|
+
end
|
299
|
+
|
300
|
+
def reply_class
|
301
|
+
AsyncronusReply
|
302
|
+
end
|
303
|
+
|
304
|
+
def result=(ev)
|
305
|
+
@result = ev
|
306
|
+
if @callback
|
307
|
+
Thread.start do
|
308
|
+
if ev.exp
|
309
|
+
exp = create_exception
|
310
|
+
@callback.call(nil, exp)
|
311
|
+
else
|
312
|
+
@callback.call(ev.result, nil)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
class MQRequest<IteratorRequest
|
320
|
+
def MQRequest.request(session, receiver, method, args, callback)
|
321
|
+
req = new(session, receiver, method, args, callback)
|
322
|
+
req.init_req
|
323
|
+
req
|
324
|
+
end
|
325
|
+
|
326
|
+
def MQRequest.receipt(session, seq, receiver, method, args, callback)
|
327
|
+
rec = new(session, receiver, method, args, callback)
|
328
|
+
rec.set_seq(seq)
|
329
|
+
rec
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
def initialize(session, receiver, method, args, callback = nil)
|
334
|
+
super(session, receiver, method, args, callback)
|
335
|
+
@callback = callback
|
336
|
+
end
|
337
|
+
attr_reader :callback
|
338
|
+
|
339
|
+
def reply_class
|
340
|
+
MQReply
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
class SessionRequest < Request
|
345
|
+
def SessionRequest.request(session, method, args=[])
|
346
|
+
req = new(session, session, method, args)
|
347
|
+
req.init_req
|
348
|
+
req
|
349
|
+
end
|
350
|
+
|
351
|
+
def SessionRequest.receipt(session, seq, dummy, method, args=[])
|
352
|
+
rec = new(session, session, method, args)
|
353
|
+
rec.set_seq(seq)
|
354
|
+
rec
|
355
|
+
end
|
356
|
+
|
357
|
+
def reply_class
|
358
|
+
SessionReply
|
359
|
+
end
|
360
|
+
|
361
|
+
def serialize
|
362
|
+
args = @args.collect{|elm|
|
363
|
+
Reference.serialize(@session.deep_space, elm)
|
364
|
+
}
|
365
|
+
sel = [self.class, @seq, @receiver.peer_id, @method]
|
366
|
+
sel.push args
|
367
|
+
sel
|
368
|
+
end
|
369
|
+
|
370
|
+
def inspect
|
371
|
+
# sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, method=#{@method.id2name}, args=#{@args.collect{|e| e.to_s}.join(', ')}>"
|
372
|
+
sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, method=#{@method.id2name}, args=...>"
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
class SessionRequestNoReply<SessionRequest
|
377
|
+
include NoReply
|
378
|
+
end
|
379
|
+
|
380
|
+
class Reply < Event
|
381
|
+
def Reply.materialize_sub(session, type, klass, seq, receiver, method, ret, exp=nil)
|
382
|
+
if exp
|
383
|
+
type.new(session, seq,
|
384
|
+
session.deep_space.root(receiver),
|
385
|
+
method,
|
386
|
+
Reference.materialize(session.deep_space, *ret),
|
387
|
+
Reference.materialize(session.deep_space, *exp))
|
388
|
+
else
|
389
|
+
type.new(session, seq,
|
390
|
+
session.deep_space.root(receiver),
|
391
|
+
method,
|
392
|
+
Reference.materialize(session.deep_space, *ret))
|
393
|
+
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def self.reply(session, req, ret, exp=nil)
|
398
|
+
new(session, req.seq, req.receiver, req.method, ret, exp)
|
399
|
+
end
|
400
|
+
|
401
|
+
def initialize(session, seq, receiver, method, ret, exp=nil)
|
402
|
+
super(session, receiver)
|
403
|
+
@seq = seq
|
404
|
+
@method = method
|
405
|
+
@result = ret
|
406
|
+
@exp = exp
|
407
|
+
end
|
408
|
+
|
409
|
+
def serialize
|
410
|
+
mspec = @session.deep_space.my_method_spec(@receiver, @method)
|
411
|
+
if mspec && mspec.rets
|
412
|
+
if mspec.rets.kind_of?(Array)
|
413
|
+
rets = mspec.rets_zip(@result){|spec, ret|
|
414
|
+
Reference.serialize_with_spec(@session.deep_space, ret, spec)
|
415
|
+
}
|
416
|
+
sel_result = [:VAL, "Array", [Array, rets]]
|
417
|
+
else
|
418
|
+
sel_result = Reference.serialize(@session.deep_space, @result, mspec.rets)
|
419
|
+
end
|
420
|
+
else
|
421
|
+
sel_result = Reference.serialize(@session.deep_space, @result)
|
422
|
+
end
|
423
|
+
|
424
|
+
if @exp
|
425
|
+
[self.class, @seq,
|
426
|
+
# Reference.serialize(@session.deep_space, @receiver),
|
427
|
+
nil,
|
428
|
+
@method,
|
429
|
+
sel_result,
|
430
|
+
Reference.serialize(@session.deep_space, @exp)]
|
431
|
+
else
|
432
|
+
[self.class, @seq,
|
433
|
+
# Reference.serialize(@session.deep_space, @receiver),
|
434
|
+
nil,
|
435
|
+
@method,
|
436
|
+
sel_result]
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
def request?
|
441
|
+
false
|
442
|
+
end
|
443
|
+
|
444
|
+
attr_reader :result
|
445
|
+
attr_reader :exp
|
446
|
+
attr_reader :method
|
447
|
+
|
448
|
+
def inspect
|
449
|
+
sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, receiver=#{@receiver}, method=#{@method} result=#{@result} exp=#{@exp}}>"
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
class IteratorReply < Reply; end
|
454
|
+
|
455
|
+
class IteratorCallBackReply<Reply
|
456
|
+
def serialize
|
457
|
+
mspec = @session.deep_space.method_spec(@receiver, @method)
|
458
|
+
if mspec && mspec.rets
|
459
|
+
if mspec.rets.kind_of?(Array)
|
460
|
+
rets = mspec.rets_zip(@result){|spec, ret|
|
461
|
+
Reference.serialize_with_spec(@session.deep_space, ret, spec)
|
462
|
+
}
|
463
|
+
sel_result = [:VAL, "Array", [Array, rets]]
|
464
|
+
else
|
465
|
+
sel_result = Reference.serialize(@session.deep_space, @result, mspec.rets)
|
466
|
+
end
|
467
|
+
else
|
468
|
+
sel_result = Reference.serialize(@session.deep_space, @result)
|
469
|
+
end
|
470
|
+
|
471
|
+
if @exp
|
472
|
+
[self.class, @seq,
|
473
|
+
# Reference.serialize(@session.deep_space, @receiver),
|
474
|
+
nil,
|
475
|
+
@method,
|
476
|
+
sel_result,
|
477
|
+
Reference.serialize(@session.deep_space, @exp)]
|
478
|
+
else
|
479
|
+
[self.class, @seq,
|
480
|
+
# Reference.serialize(@session.deep_space, @receiver),
|
481
|
+
nil,
|
482
|
+
@method,
|
483
|
+
sel_result]
|
484
|
+
end
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
class IteratorCallBackReplyBreak<IteratorCallBackReply; end
|
489
|
+
class IteratorReplyFinish < Reply; end
|
490
|
+
|
491
|
+
class AsyncronusReply<Reply; end
|
492
|
+
|
493
|
+
class MQReply<Reply;end
|
494
|
+
|
495
|
+
class SessionReply < Reply
|
496
|
+
def SessionReply.materialize_sub(session, type, klass, seq, receiver, method, ret, exp = nil)
|
497
|
+
# puts "SESSIONREPLY: #{type}, #{session}, #{ret.collect{|e| e.to_s}.join(',')}"
|
498
|
+
if exp
|
499
|
+
type.new(session, seq,
|
500
|
+
session,
|
501
|
+
method,
|
502
|
+
Reference.materialize(session.deep_space, *ret),
|
503
|
+
Reference.materialize(session.deep_space, *exp))
|
504
|
+
else
|
505
|
+
type.new(session, seq,
|
506
|
+
session,
|
507
|
+
method,
|
508
|
+
Reference.materialize(session.deep_space, *ret))
|
509
|
+
end
|
510
|
+
end
|
511
|
+
|
512
|
+
def inspect
|
513
|
+
sprintf "#<#{self.class}, session=#{@session}, seq=#{@seq}, result=#{@result}}>"
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
# session 初期化
|
518
|
+
class InitSessionEvent<Event
|
519
|
+
def self.materialize_sub(session, type, klass, local_id)
|
520
|
+
new(local_id)
|
521
|
+
end
|
522
|
+
|
523
|
+
def initialize(local_id)
|
524
|
+
@local_id=local_id
|
525
|
+
end
|
526
|
+
|
527
|
+
attr_reader :local_id
|
528
|
+
|
529
|
+
def serialize
|
530
|
+
[self.class, @local_id]
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
class ConnectResult<Event
|
535
|
+
def self.materialize_sub(session, type, klass, result)
|
536
|
+
new(result)
|
537
|
+
end
|
538
|
+
|
539
|
+
def initialize(result)
|
540
|
+
@result = result
|
541
|
+
end
|
542
|
+
|
543
|
+
attr_reader :result
|
544
|
+
|
545
|
+
def serialize
|
546
|
+
[self.class, @result]
|
547
|
+
end
|
548
|
+
end
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|