adhearsion 2.6.4 → 3.0.0.beta1

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 (242) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -9
  3. data/CHANGELOG.md +22 -7
  4. data/Gemfile +2 -0
  5. data/README.markdown +4 -5
  6. data/Rakefile +1 -2
  7. data/adhearsion.gemspec +19 -8
  8. data/features/cli_create.feature +19 -3
  9. data/features/step_definitions/cli_steps.rb +0 -11
  10. data/features/support/env.rb +3 -4
  11. data/lib/adhearsion.rb +48 -27
  12. data/lib/adhearsion/call.rb +34 -50
  13. data/lib/adhearsion/call_controller.rb +6 -12
  14. data/lib/adhearsion/call_controller/dial.rb +15 -53
  15. data/lib/adhearsion/call_controller/input.rb +39 -162
  16. data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
  17. data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
  18. data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
  19. data/lib/adhearsion/call_controller/input/result.rb +46 -0
  20. data/lib/adhearsion/call_controller/output.rb +48 -67
  21. data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
  22. data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
  23. data/lib/adhearsion/call_controller/output/player.rb +1 -1
  24. data/lib/adhearsion/call_controller/record.rb +23 -8
  25. data/lib/adhearsion/calls.rb +1 -1
  26. data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
  27. data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
  28. data/lib/adhearsion/configuration.rb +91 -39
  29. data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
  30. data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
  31. data/lib/adhearsion/error.rb +5 -0
  32. data/lib/adhearsion/event.rb +21 -0
  33. data/lib/adhearsion/event/active_speaker.rb +11 -0
  34. data/lib/adhearsion/event/answered.rb +11 -0
  35. data/lib/adhearsion/event/asterisk.rb +10 -0
  36. data/lib/adhearsion/event/asterisk/ami.rb +34 -0
  37. data/lib/adhearsion/event/complete.rb +75 -0
  38. data/lib/adhearsion/event/dtmf.rb +11 -0
  39. data/lib/adhearsion/event/end.rb +22 -0
  40. data/lib/adhearsion/event/input_timers_started.rb +9 -0
  41. data/lib/adhearsion/event/joined.rb +17 -0
  42. data/lib/adhearsion/event/offer.rb +14 -0
  43. data/lib/adhearsion/event/ringing.rb +11 -0
  44. data/lib/adhearsion/event/started_speaking.rb +13 -0
  45. data/lib/adhearsion/event/stopped_speaking.rb +13 -0
  46. data/lib/adhearsion/event/unjoined.rb +17 -0
  47. data/lib/adhearsion/events.rb +47 -66
  48. data/lib/adhearsion/foundation.rb +0 -1
  49. data/lib/adhearsion/foundation/object.rb +0 -5
  50. data/lib/adhearsion/generators/app/app_generator.rb +4 -1
  51. data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
  52. data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
  53. data/lib/adhearsion/generators/app/templates/config.ru +7 -0
  54. data/lib/adhearsion/generators/app/templates/en.yml +4 -0
  55. data/lib/adhearsion/generators/app/templates/events.erb +2 -2
  56. data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
  57. data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
  58. data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
  59. data/lib/adhearsion/has_headers.rb +34 -0
  60. data/lib/adhearsion/http_server.rb +37 -0
  61. data/lib/adhearsion/initializer.rb +19 -153
  62. data/lib/adhearsion/logging.rb +6 -25
  63. data/lib/adhearsion/outbound_call.rb +5 -5
  64. data/lib/adhearsion/plugin.rb +1 -0
  65. data/lib/adhearsion/protocol_error.rb +26 -0
  66. data/lib/adhearsion/rayo.rb +30 -0
  67. data/lib/adhearsion/rayo/client.rb +62 -0
  68. data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
  69. data/lib/adhearsion/rayo/command.rb +21 -0
  70. data/lib/adhearsion/rayo/command/accept.rb +16 -0
  71. data/lib/adhearsion/rayo/command/answer.rb +16 -0
  72. data/lib/adhearsion/rayo/command/dial.rb +57 -0
  73. data/lib/adhearsion/rayo/command/hangup.rb +16 -0
  74. data/lib/adhearsion/rayo/command/join.rb +43 -0
  75. data/lib/adhearsion/rayo/command/mute.rb +13 -0
  76. data/lib/adhearsion/rayo/command/redirect.rb +23 -0
  77. data/lib/adhearsion/rayo/command/reject.rb +40 -0
  78. data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
  79. data/lib/adhearsion/rayo/command/unmute.rb +13 -0
  80. data/lib/adhearsion/rayo/command_node.rb +47 -0
  81. data/lib/adhearsion/rayo/component.rb +21 -0
  82. data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
  83. data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
  84. data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
  85. data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
  86. data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
  87. data/lib/adhearsion/rayo/component/component_node.rb +90 -0
  88. data/lib/adhearsion/rayo/component/input.rb +186 -0
  89. data/lib/adhearsion/rayo/component/output.rb +471 -0
  90. data/lib/adhearsion/rayo/component/prompt.rb +53 -0
  91. data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
  92. data/lib/adhearsion/rayo/component/record.rb +165 -0
  93. data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
  94. data/lib/adhearsion/rayo/component/stop.rb +11 -0
  95. data/lib/adhearsion/rayo/connection.rb +12 -0
  96. data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
  97. data/lib/adhearsion/rayo/connection/connected.rb +22 -0
  98. data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
  99. data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
  100. data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
  101. data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
  102. data/lib/adhearsion/rayo/rayo_node.rb +127 -0
  103. data/lib/adhearsion/rayo/ref.rb +57 -0
  104. data/lib/adhearsion/statistics.rb +1 -1
  105. data/lib/adhearsion/tasks.rb +1 -2
  106. data/lib/adhearsion/tasks/configuration.rb +1 -1
  107. data/lib/adhearsion/tasks/environment.rb +0 -2
  108. data/lib/adhearsion/tasks/i18n.rb +49 -0
  109. data/lib/adhearsion/translator.rb +11 -0
  110. data/lib/adhearsion/translator/asterisk.rb +234 -0
  111. data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
  112. data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
  113. data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
  114. data/lib/adhearsion/translator/asterisk/call.rb +416 -0
  115. data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
  116. data/lib/adhearsion/translator/asterisk/component.rb +88 -0
  117. data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
  118. data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
  119. data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
  120. data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
  121. data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
  122. data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
  123. data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
  124. data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
  125. data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
  126. data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
  127. data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
  128. data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
  129. data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
  130. data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
  131. data/lib/adhearsion/uri_list.rb +21 -0
  132. data/lib/adhearsion/version.rb +1 -1
  133. data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
  134. data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
  135. data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
  136. data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
  137. data/spec/adhearsion/call_controller/output_spec.rb +162 -215
  138. data/spec/adhearsion/call_controller/record_spec.rb +15 -16
  139. data/spec/adhearsion/call_controller_spec.rb +23 -40
  140. data/spec/adhearsion/call_spec.rb +123 -129
  141. data/spec/adhearsion/calls_spec.rb +3 -3
  142. data/spec/adhearsion/configuration_spec.rb +94 -108
  143. data/spec/adhearsion/event/answered_spec.rb +50 -0
  144. data/spec/adhearsion/event/asterisk/Find Results +402 -0
  145. data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
  146. data/spec/adhearsion/event/complete_spec.rb +176 -0
  147. data/spec/adhearsion/event/dtmf_spec.rb +35 -0
  148. data/spec/adhearsion/event/end_spec.rb +85 -0
  149. data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
  150. data/spec/adhearsion/event/joined_spec.rb +53 -0
  151. data/spec/adhearsion/event/offer_spec.rb +106 -0
  152. data/spec/adhearsion/event/ringing_spec.rb +50 -0
  153. data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
  154. data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
  155. data/spec/adhearsion/event/unjoined_spec.rb +48 -0
  156. data/spec/adhearsion/event/untitled +0 -0
  157. data/spec/adhearsion/events_spec.rb +19 -45
  158. data/spec/adhearsion/initializer_spec.rb +12 -184
  159. data/spec/adhearsion/logging_spec.rb +5 -20
  160. data/spec/adhearsion/outbound_call_spec.rb +13 -13
  161. data/spec/adhearsion/plugin_spec.rb +3 -4
  162. data/spec/adhearsion/protocol_error_spec.rb +91 -0
  163. data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
  164. data/spec/adhearsion/rayo/client_spec.rb +134 -0
  165. data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
  166. data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
  167. data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
  168. data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
  169. data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
  170. data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
  171. data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
  172. data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
  173. data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
  174. data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
  175. data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
  176. data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
  177. data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
  178. data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
  179. data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
  180. data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
  181. data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
  182. data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
  183. data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
  184. data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
  185. data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
  186. data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
  187. data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
  188. data/spec/adhearsion/rayo/ref_spec.rb +168 -0
  189. data/spec/adhearsion/rayo_spec.rb +7 -0
  190. data/spec/adhearsion/router/route_spec.rb +1 -1
  191. data/spec/adhearsion/statistics_spec.rb +2 -5
  192. data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
  193. data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
  194. data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
  195. data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
  196. data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
  197. data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
  198. data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
  199. data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
  200. data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
  201. data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
  202. data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
  203. data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
  204. data/spec/adhearsion/uri_list_spec.rb +88 -0
  205. data/spec/adhearsion_spec.rb +89 -14
  206. data/spec/fixtures/locale/en.yml +13 -0
  207. data/spec/fixtures/locale/it.yml +13 -0
  208. data/spec/spec_helper.rb +18 -5
  209. data/spec/support/call_controller_test_helpers.rb +3 -2
  210. data/spec/support/initializer_stubs.rb +3 -1
  211. data/spec/support/punchblock_examples.rb +65 -0
  212. data/spec/support/punchblock_mocks.rb +12 -0
  213. metadata +412 -70
  214. data/features/cli_daemon.feature +0 -20
  215. data/features/cli_restart.feature +0 -52
  216. data/features/cli_stop.feature +0 -50
  217. data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
  218. data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
  219. data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
  220. data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
  221. data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
  222. data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
  223. data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
  224. data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
  225. data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
  226. data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
  227. data/lib/adhearsion/call_controller/utility.rb +0 -77
  228. data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
  229. data/lib/adhearsion/punchblock_plugin.rb +0 -63
  230. data/scripts/cloc-1.64.pl +0 -10483
  231. data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
  232. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
  233. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
  234. data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
  235. data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
  236. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
  237. data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
  238. data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
  239. data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
  240. data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
  241. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
  242. data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
@@ -0,0 +1,471 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/uri_list'
4
+
5
+ module Adhearsion
6
+ module Rayo
7
+ module Component
8
+ class Output < ComponentNode
9
+ include HasHeaders
10
+
11
+ register :output, :output
12
+
13
+ class Document < RayoNode
14
+ register :document, :output
15
+
16
+ SSML_CONTENT_TYPE = 'application/ssml+xml'
17
+
18
+ # @return [String] the URL from which the fetch the grammar
19
+ attribute :url
20
+
21
+ # @return [String] the document content type
22
+ attribute :content_type, String, default: ->(grammar, attribute) { grammar.url ? nil : SSML_CONTENT_TYPE }
23
+
24
+ # @return [String, RubySpeech::SSML::Speak, URIList] the document
25
+ attribute :value
26
+
27
+ def inherit(xml_node)
28
+ super
29
+ self.value = if ssml?
30
+ RubySpeech::SSML.import xml_node.content
31
+ elsif urilist?
32
+ URIList.import xml_node.content
33
+ else
34
+ xml_node.content
35
+ end
36
+ self
37
+ end
38
+
39
+ def rayo_attributes
40
+ {
41
+ 'url' => url,
42
+ 'content-type' => content_type
43
+ }
44
+ end
45
+
46
+ def rayo_children(root)
47
+ root.cdata xml_value
48
+ super
49
+ end
50
+
51
+ def size
52
+ if ssml?
53
+ value.children.count
54
+ else
55
+ value.size
56
+ end
57
+ end
58
+
59
+ def ssml?
60
+ content_type == SSML_CONTENT_TYPE
61
+ end
62
+
63
+ private
64
+
65
+ def xml_value
66
+ if ssml?
67
+ value.to_s
68
+ elsif urilist?
69
+ value.to_s
70
+ elsif
71
+ value
72
+ end
73
+ end
74
+
75
+ def urilist?
76
+ content_type == 'text/uri-list'
77
+ end
78
+ end
79
+
80
+ def inherit(xml_node)
81
+ document_nodes = xml_node.xpath 'ns:document', ns: self.class.registered_ns
82
+ self.render_documents = document_nodes.to_a.map { |node| Document.from_xml node }
83
+ super
84
+ end
85
+
86
+ # @return [String] the TTS voice to use
87
+ attribute :voice, String
88
+
89
+ # @return [Symbol] input type on which to interrupt output
90
+ attribute :interrupt_on, Symbol
91
+
92
+ # @return [Integer] Indicates some offset through which the output should be skipped before rendering begins.
93
+ attribute :start_offset, Integer
94
+
95
+ # @return [true, false] Indicates wether or not the component should be started in a paused state to be resumed at a later time.
96
+ attribute :start_paused, Boolean
97
+
98
+ # @return [Integer] Indicates the duration of silence that should space repeats of the rendered document.
99
+ attribute :repeat_interval, Integer
100
+
101
+ # @return [Integer] Indicates the number of times the output should be played.
102
+ attribute :repeat_times, Integer
103
+
104
+ # @return [Integer] Indicates the maximum amount of time for which the output should be allowed to run before being terminated. Includes repeats.
105
+ attribute :max_time, Integer
106
+
107
+ # @return [String] the rendering engine requested by the component
108
+ attribute :renderer, String
109
+
110
+ def rayo_attributes
111
+ {
112
+ 'voice' => voice,
113
+ 'interrupt-on' => interrupt_on,
114
+ 'start-offset' => start_offset,
115
+ 'start-paused' => start_paused,
116
+ 'repeat-interval' => repeat_interval,
117
+ 'repeat-times' => repeat_times,
118
+ 'max-time' => max_time,
119
+ 'renderer' => renderer
120
+ }
121
+ end
122
+
123
+ def rayo_children(root)
124
+ render_documents.each do |render_document|
125
+ render_document.to_rayo root.parent
126
+ end
127
+ super
128
+ end
129
+
130
+ # @return [Document] the document to render
131
+ attribute :render_documents, Array[Document], default: []
132
+
133
+ ##
134
+ # @param [Hash] other
135
+ # @option other [String] :content_type the document content type
136
+ # @option other [String] :value the output doucment
137
+ # @option other [String] :url the url from which to fetch the document
138
+ #
139
+ def render_document=(other)
140
+ self.render_documents = [other].compact
141
+ end
142
+
143
+ def ssml=(other)
144
+ self.render_documents = [{:value => other}]
145
+ end
146
+
147
+ state_machine :state do
148
+ event :paused do
149
+ transition :executing => :paused
150
+ end
151
+
152
+ event :resumed do
153
+ transition :paused => :executing
154
+ end
155
+ end
156
+
157
+ # Pauses a running Output
158
+ #
159
+ # @return [Command::Output::Pause] an Rayo pause message for the current Output
160
+ #
161
+ # @example
162
+ # output_obj.pause_action.to_xml
163
+ #
164
+ # returns:
165
+ # <pause xmlns="urn:xmpp:rayo:output:1"/>
166
+ def pause_action
167
+ Pause.new :component_id => component_id, :target_call_id => target_call_id
168
+ end
169
+
170
+ ##
171
+ # Sends an Rayo pause message for the current Output
172
+ #
173
+ def pause!
174
+ raise InvalidActionError, "Cannot pause a Output that is not executing" unless executing?
175
+ pause_action.tap do |action|
176
+ result = write_action action
177
+ paused! if result
178
+ end
179
+ end
180
+
181
+ ##
182
+ # Create an Rayo resume message for the current Output
183
+ #
184
+ # @return [Command::Output::Resume] an Rayo resume message
185
+ #
186
+ # @example
187
+ # output_obj.resume_action.to_xml
188
+ #
189
+ # returns:
190
+ # <resume xmlns="urn:xmpp:rayo:output:1"/>
191
+ def resume_action
192
+ Resume.new :component_id => component_id, :target_call_id => target_call_id
193
+ end
194
+
195
+ ##
196
+ # Sends an Rayo resume message for the current Output
197
+ #
198
+ def resume!
199
+ raise InvalidActionError, "Cannot resume a Output that is not paused." unless paused?
200
+ resume_action.tap do |action|
201
+ result = write_action action
202
+ resumed! if result
203
+ end
204
+ end
205
+
206
+ class Pause < CommandNode # :nodoc:
207
+ register :pause, :output
208
+ end
209
+
210
+ class Resume < CommandNode # :nodoc:
211
+ register :resume, :output
212
+ end
213
+
214
+ ##
215
+ # Creates an Rayo seek message for the current Output
216
+ #
217
+ # @return [Command::Output::Seek] a Rayo seek message
218
+ #
219
+ # @example
220
+ # output_obj.seek_action.to_xml
221
+ #
222
+ # returns:
223
+ # <seek xmlns="urn:xmpp:rayo:output:1"/>
224
+ def seek_action(options = {})
225
+ Seek.new({ :component_id => component_id, :target_call_id => target_call_id }.merge(options)).tap do |s|
226
+ s.original_component = self
227
+ end
228
+ end
229
+
230
+ ##
231
+ # Sends a Rayo seek message for the current Output
232
+ #
233
+ def seek!(options = {})
234
+ raise InvalidActionError, "Cannot seek an Output that is already seeking." if seeking?
235
+ seek_action(options).tap do |action|
236
+ write_action action
237
+ end
238
+ end
239
+
240
+ state_machine :seek_status, :initial => :not_seeking do
241
+ event :seeking do
242
+ transition :not_seeking => :seeking
243
+ end
244
+
245
+ event :stopped_seeking do
246
+ transition :seeking => :not_seeking
247
+ end
248
+ end
249
+
250
+ class Seek < CommandNode # :nodoc:
251
+ register :seek, :output
252
+
253
+ attribute :direction
254
+ attribute :amount
255
+
256
+ def request!
257
+ source.seeking!
258
+ super
259
+ end
260
+
261
+ def execute!
262
+ source.stopped_seeking!
263
+ super
264
+ end
265
+
266
+ def rayo_attributes
267
+ {'direction' => direction, 'amount' => amount}
268
+ end
269
+ end
270
+
271
+ ##
272
+ # Creates an Rayo speed up message for the current Output
273
+ #
274
+ # @return [Command::Output::SpeedUp] a Rayo speed up message
275
+ #
276
+ # @example
277
+ # output_obj.speed_up_action.to_xml
278
+ #
279
+ # returns:
280
+ # <speed-up xmlns="urn:xmpp:rayo:output:1"/>
281
+ def speed_up_action
282
+ SpeedUp.new(:component_id => component_id, :target_call_id => target_call_id).tap do |s|
283
+ s.original_component = self
284
+ end
285
+ end
286
+
287
+ ##
288
+ # Sends a Rayo speed up message for the current Output
289
+ #
290
+ def speed_up!
291
+ raise InvalidActionError, "Cannot speed up an Output that is already speeding." unless not_speeding?
292
+ speed_up_action.tap do |action|
293
+ write_action action
294
+ end
295
+ end
296
+
297
+ ##
298
+ # Creates an Rayo slow down message for the current Output
299
+ #
300
+ # @return [Command::Output::SlowDown] a Rayo slow down message
301
+ #
302
+ # @example
303
+ # output_obj.slow_down_action.to_xml
304
+ #
305
+ # returns:
306
+ # <speed-down xmlns="urn:xmpp:rayo:output:1"/>
307
+ def slow_down_action
308
+ SlowDown.new(:component_id => component_id, :target_call_id => target_call_id).tap do |s|
309
+ s.original_component = self
310
+ end
311
+ end
312
+
313
+ ##
314
+ # Sends a Rayo slow down message for the current Output
315
+ #
316
+ def slow_down!
317
+ raise InvalidActionError, "Cannot slow down an Output that is already speeding." unless not_speeding?
318
+ slow_down_action.tap do |action|
319
+ write_action action
320
+ end
321
+ end
322
+
323
+ state_machine :speed_status, :initial => :not_speeding do
324
+ event :speeding_up do
325
+ transition :not_speeding => :speeding_up
326
+ end
327
+
328
+ event :slowing_down do
329
+ transition :not_speeding => :slowing_down
330
+ end
331
+
332
+ event :stopped_speeding do
333
+ transition [:speeding_up, :slowing_down] => :not_speeding
334
+ end
335
+ end
336
+
337
+ class SpeedUp < CommandNode # :nodoc:
338
+ register :'speed-up', :output
339
+
340
+ def request!
341
+ source.speeding_up!
342
+ super
343
+ end
344
+
345
+ def execute!
346
+ source.stopped_speeding!
347
+ super
348
+ end
349
+ end
350
+
351
+ class SlowDown < CommandNode # :nodoc:
352
+ register :'speed-down', :output
353
+
354
+ def request!
355
+ source.slowing_down!
356
+ super
357
+ end
358
+
359
+ def execute!
360
+ source.stopped_speeding!
361
+ super
362
+ end
363
+ end
364
+
365
+ ##
366
+ # Creates an Rayo volume up message for the current Output
367
+ #
368
+ # @return [Command::Output::VolumeUp] a Rayo volume up message
369
+ #
370
+ # @example
371
+ # output_obj.volume_up_action.to_xml
372
+ #
373
+ # returns:
374
+ # <volume-up xmlns="urn:xmpp:rayo:output:1"/>
375
+ def volume_up_action
376
+ VolumeUp.new(:component_id => component_id, :target_call_id => target_call_id).tap do |s|
377
+ s.original_component = self
378
+ end
379
+ end
380
+
381
+ ##
382
+ # Sends a Rayo volume up message for the current Output
383
+ #
384
+ def volume_up!
385
+ raise InvalidActionError, "Cannot volume up an Output that is already voluming." unless not_voluming?
386
+ volume_up_action.tap do |action|
387
+ write_action action
388
+ end
389
+ end
390
+
391
+ ##
392
+ # Creates an Rayo volume down message for the current Output
393
+ #
394
+ # @return [Command::Output::VolumeDown] a Rayo volume down message
395
+ #
396
+ # @example
397
+ # output_obj.volume_down_action.to_xml
398
+ #
399
+ # returns:
400
+ # <volume-down xmlns="urn:xmpp:rayo:output:1"/>
401
+ def volume_down_action
402
+ VolumeDown.new(:component_id => component_id, :target_call_id => target_call_id).tap do |s|
403
+ s.original_component = self
404
+ end
405
+ end
406
+
407
+ ##
408
+ # Sends a Rayo volume down message for the current Output
409
+ #
410
+ def volume_down!
411
+ raise InvalidActionError, "Cannot volume down an Output that is already voluming." unless not_voluming?
412
+ volume_down_action.tap do |action|
413
+ write_action action
414
+ end
415
+ end
416
+
417
+ state_machine :volume_status, :initial => :not_voluming do
418
+ event :voluming_up do
419
+ transition :not_voluming => :voluming_up
420
+ end
421
+
422
+ event :voluming_down do
423
+ transition :not_voluming => :voluming_down
424
+ end
425
+
426
+ event :stopped_voluming do
427
+ transition [:voluming_up, :voluming_down] => :not_voluming
428
+ end
429
+ end
430
+
431
+ class VolumeUp < CommandNode # :nodoc:
432
+ register :'volume-up', :output
433
+
434
+ def request!
435
+ source.voluming_up!
436
+ super
437
+ end
438
+
439
+ def execute!
440
+ source.stopped_voluming!
441
+ super
442
+ end
443
+ end
444
+
445
+ class VolumeDown < CommandNode # :nodoc:
446
+ register :'volume-down', :output
447
+
448
+ def request!
449
+ source.voluming_down!
450
+ super
451
+ end
452
+
453
+ def execute!
454
+ source.stopped_voluming!
455
+ super
456
+ end
457
+ end
458
+
459
+ class Complete
460
+ class Finish < Event::Complete::Reason
461
+ register :finish, :output_complete
462
+ end
463
+
464
+ class MaxTime < Event::Complete::Reason
465
+ register :'max-time', :output_complete
466
+ end
467
+ end
468
+ end
469
+ end
470
+ end
471
+ end