Class: Jabber::Bytestreams::IBBTarget

Inherits:
IBB
  • Object
show all
Defined in:
lib/xmpp4r/bytestreams/helper/ibb/target.rb

Overview

Implementation of IBB at the target side

Constant Summary

Constants inherited from IBB

Jabber::Bytestreams::IBB::NS_IBB

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from IBB

#active?, #close, #flush, #read, #write

Constructor Details

#initialize(stream, session_id, initiator_jid, target_jid) ⇒ IBBTarget

Returns a new instance of IBBTarget


13
14
15
16
17
# File 'lib/xmpp4r/bytestreams/helper/ibb/target.rb', line 13

def initialize(stream, session_id, initiator_jid, target_jid)
  # Target and Initiator are swapped here, because we're the target
  super(stream, session_id, target_jid, initiator_jid)
  @accept_ready = Semaphore::new
end

Instance Attribute Details

#block_sizeObject (readonly)

You may read the block-size after accept


11
12
13
# File 'lib/xmpp4r/bytestreams/helper/ibb/target.rb', line 11

def block_size
  @block_size
end

Instance Method Details

#acceptObject

Wait for the initiator side to start the stream.


26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/xmpp4r/bytestreams/helper/ibb/target.rb', line 26

def accept
  connect_sem = Semaphore.new

  @stream.add_iq_callback(200, self) { |iq|
    open = iq.first_element('open')
    if iq.type == :set and iq.from == @peer_jid and iq.to == @my_jid and open and open.attributes['sid'] == @session_id
      @stream.delete_iq_callback(self)
      activate
      @block_size = (open.attributes['block-size'] || 4096).to_i

      reply = iq.answer(false)
      reply.type = :result
      @stream.send(reply)

      connect_sem.run
      true
    else
      false
    end
  }

  @accept_ready.run

  connect_sem.wait
  true
end

#accept_waitObject


19
20
21
# File 'lib/xmpp4r/bytestreams/helper/ibb/target.rb', line 19

def accept_wait
  @accept_ready.wait
end