ssdp 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a650ded600f6688ce2d53aa7185b275d39b279f3
4
- data.tar.gz: 65f3d49aa1aae08d792d61424c7891e4ffc4c35d
3
+ metadata.gz: 45a022bdf308b1a26cb8e290067a9882f97e0d15
4
+ data.tar.gz: c5b651cee29b9a61788da711ec6e9797fef72c2d
5
5
  SHA512:
6
- metadata.gz: 428f3aa8fb465cd6407f9ef31723187ea2fe7810bb96da72a807dd8fe18c04e1e9be656e74567a27520b5dffc4f1c5f01448f18673e3ab6656a0017babd83964
7
- data.tar.gz: 61af0480b1a12ac1230c7452d3a6d5271748686adf9aa8c11c6852eb8aa2508f8b1f3297442d9b0dc3f10bdb593218df0971791716f3514c1851ff8e89c555d5
6
+ metadata.gz: 60672a24ffd30f738f26773195cd2956be4c860a5580f5d79d4bea223e83d45587f4d38e5f114490f01e378da9fa1586eedb5ea575b090c9a69ad56d485d2257
7
+ data.tar.gz: fd617fa6bc5d97013297fb7542cd58ebd5e6e9d2178d0f3534d3117f7ba5d12b45ab0a302c10207d893bad4f551cd80936b8bca25ade21c35e887069662660a1
@@ -6,18 +6,19 @@ require_relative 'ssdp/consumer'
6
6
  module SSDP
7
7
  DEFAULTS = {
8
8
  # Shared
9
- :broadcast => '239.255.255.250',
10
- :bind => '0.0.0.0',
11
- :port => 1900,
12
- :maxpack => 65_507,
9
+ :broadcast => '239.255.255.250',
10
+ :bind => '0.0.0.0',
11
+ :port => 1900,
12
+ :maxpack => 65_507,
13
13
  # Producer-Only
14
- :interval => 30,
15
- :notifier => true,
14
+ :interval => 30,
15
+ :notifier => true,
16
+ :respond_to_all => true,
16
17
  # Consumer-Only
17
- :timeout => 30,
18
- :first_only => false,
19
- :synchronous => true,
20
- :no_warnings => false
18
+ :timeout => 30,
19
+ :first_only => false,
20
+ :synchronous => true,
21
+ :no_warnings => false
21
22
  }
22
23
 
23
24
  HEADER_MATCH = /^([^:]+):\s*(.+)$/
@@ -13,7 +13,7 @@ module SSDP
13
13
  }
14
14
  end
15
15
 
16
- def search(options, &block)
16
+ def search(options = {}, &block)
17
17
  options = @options.merge options
18
18
  options[:callback] ||= block unless block.nil?
19
19
  fail "SSDP consumer async search missing callback." if (options[:synchronous] == false) && options[:callback].nil?
@@ -74,16 +74,26 @@ module SSDP
74
74
 
75
75
  def search_single(options)
76
76
  result = nil
77
+ found = false
77
78
 
78
79
  if options[:timeout]
79
- ready = IO::select [@search_socket], nil, nil, options[:timeout]
80
- if ready
80
+ began = Time.now
81
+ remaining = options[:timeout]
82
+ while !found && remaining > 0
83
+ ready = IO::select [@search_socket], nil, nil, remaining
84
+ if ready
85
+ message, producer = @search_socket.recvfrom options[:maxpack]
86
+ result = process_ssdp_packet message, producer
87
+ found = options[:filter].nil? ? true : options[:filter].call(result)
88
+ end
89
+ remaining = options[:timeout] - (Time.now - began).to_i
90
+ end
91
+ else
92
+ while !found
81
93
  message, producer = @search_socket.recvfrom options[:maxpack]
82
94
  result = process_ssdp_packet message, producer
95
+ found = options[:filter].nil? ? true : options[:filter].call(result)
83
96
  end
84
- else
85
- message, producer = @search_socket.recvfrom options[:maxpack]
86
- result = process_ssdp_packet message, producer
87
97
  end
88
98
 
89
99
  if options[:synchronous]
@@ -102,7 +112,12 @@ module SSDP
102
112
  ready = IO::select [@search_socket], nil, nil, remaining
103
113
  if ready
104
114
  message, producer = @search_socket.recvfrom options[:maxpack]
105
- responses << process_ssdp_packet(message, producer)
115
+ if options[:filter].nil?
116
+ responses << process_ssdp_packet(message, producer)
117
+ else
118
+ result = process_ssdp_packet message, producer
119
+ responses << result if options[:filter].call(result)
120
+ end
106
121
  end
107
122
  remaining -= (Time.now - start_time).to_i
108
123
  end
@@ -20,12 +20,12 @@ module SSDP
20
20
  end
21
21
 
22
22
  def start
23
- start_notifier if @options[:notifier]
24
- start_listener
23
+ start_notifier if @notifier[:thread].nil? && @options[:notifier]
24
+ start_listener if @listener[:thread].nil?
25
25
  end
26
26
 
27
27
  def stop(bye_bye = true)
28
- @services.each { |type, params| send_bye_bye type, params } if bye_bye
28
+ was_running = running?
29
29
 
30
30
  if @listener[:thread] != nil
31
31
  @listener[:thread].exit
@@ -35,6 +35,8 @@ module SSDP
35
35
  @notifier[:thread].exit
36
36
  @notifier[:thread] = nil
37
37
  end
38
+
39
+ @services.each { |type, params| send_bye_bye type, params } if bye_bye && @options[:notifier] && was_running
38
40
  end
39
41
 
40
42
  def add_service(type, location_or_param_hash)
@@ -47,11 +49,11 @@ module SSDP
47
49
  end
48
50
 
49
51
  @services[type] = params
50
- send_notification type, params if @options[:notifier]
52
+ send_notification type, params if @options[:notifier] && running?
51
53
  end
52
54
 
53
55
  def remove_service(type)
54
- @services.delete[type]
56
+ @services.delete type
55
57
  end
56
58
 
57
59
  private
@@ -61,6 +63,12 @@ module SSDP
61
63
  return unless ssdp[:status].start_with? 'M-SEARCH * HTTP'
62
64
 
63
65
  return if ssdp[:params]['ST'].nil?
66
+
67
+ if @options[:respond_to_all] && ssdp[:params]['ST'].downcase == 'ssdp:all'
68
+ @services.each { |service, _| send_response service, consumer }
69
+ return
70
+ end
71
+
64
72
  return if @services[ssdp[:params]['ST']].nil?
65
73
  send_response ssdp[:params]['ST'], consumer
66
74
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ssdp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dillon Aumiller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-02 00:00:00.000000000 Z
11
+ date: 2015-02-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: SSDP client/server library. Server notify/part/respond; client search/listen.
14
14
  email: dillonaumiller@gmail.com