rsence 2.0.9.23 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/INSTALL.rdoc +61 -49
- data/README.rdoc +20 -4
- data/VERSION +1 -1
- data/conf/default_conf.yaml +8 -0
- data/conf/rsence_command_strings.yaml +31 -20
- data/docs/ExampleGuiPlugin.rdoc +2 -2
- data/js/comm/comm.js +27 -5
- data/js/comm/transporter/transporter.js +1 -1
- data/js/comm/values/values.js +12 -5
- data/js/controls/button/button.js +12 -2
- data/js/controls/dialogs/alert_sheet/alert_sheet.js +13 -1
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +13 -2
- data/js/controls/dialogs/sheet/sheet.js +35 -28
- data/js/controls/imageview/imageview.js +13 -13
- data/js/controls/progress/progressindicator/progressindicator.js +5 -5
- data/js/controls/sliders/slider/slider.js +4 -31
- data/js/controls/stepper/stepper.js +12 -19
- data/js/controls/textcontrol/textcontrol.js +0 -50
- data/js/controls/textcontrol/themes/default/textcontrol.html +1 -1
- data/js/controls/window/window.js +1 -1
- data/js/core/elem/elem.js +146 -160
- data/js/core/rsence_ns/rsence_ns.js +7 -0
- data/js/foundation/control/eventresponder/eventresponder.js +8 -7
- data/js/foundation/eventmanager/eventmanager.js +81 -48
- data/js/foundation/geom/rect/rect.js +1 -1
- data/js/foundation/json_renderer/json_renderer.js +4 -1
- data/js/foundation/system/system.js +37 -34
- data/js/foundation/view/morphanimation/morphanimation.js +53 -43
- data/js/foundation/view/view.js +119 -118
- data/js/lists/listitems/listitems.js +10 -10
- data/js/lists/propertylist/js.inc +0 -0
- data/js/lists/propertylist/propertylist.js +574 -0
- data/js/lists/propertylist/propertylisteditor/js.inc +0 -0
- data/js/lists/propertylist/propertylisteditor/propertylisteditor.js +233 -0
- data/js/lists/radiobuttonlist/radiobuttonlist.js +15 -8
- data/js/menus/minimenu/js.inc +0 -0
- data/js/menus/minimenu/minimenu.js +139 -0
- data/js/menus/minimenu/minimenuitem/js.inc +0 -0
- data/js/menus/minimenu/minimenuitem/minimenuitem.js +33 -0
- data/js/menus/minimenu/minimenuitem/themes/default/minimenuitem.css +45 -0
- data/js/menus/minimenu/minimenuitem/themes/default/minimenuitem.html +4 -0
- data/js/menus/minimenu/minimenuitem/themes/default/minimenuitem_checkmark.png +0 -0
- data/js/menus/minimenu/themes/default/minimenu.css +63 -0
- data/js/menus/minimenu/themes/default/minimenu.html +7 -0
- data/js/menus/minimenu/themes/default/minimenu.png +0 -0
- data/js/util/reloadapp/reloadapp.js +1 -1
- data/lib/conf/argv.rb +40 -11
- data/lib/daemon/daemon.rb +63 -22
- data/lib/plugins/gui_plugin.rb +28 -31
- data/lib/plugins/guiparser.rb +37 -7
- data/lib/plugins/plugin.rb +260 -28
- data/lib/plugins/plugin_base.rb +14 -0
- data/lib/plugins/plugin_plugins.rb +11 -1
- data/lib/plugins/pluginmanager.rb +127 -44
- data/lib/plugins/plugins.rb +10 -1
- data/lib/session/msg.rb +25 -1
- data/lib/session/sessionmanager.rb +11 -2
- data/lib/session/sessionstorage.rb +14 -14
- data/lib/transporter/transporter.rb +29 -13
- data/lib/values/hvalue.rb +30 -0
- data/plugins/client_pkg/info.yaml +2 -2
- data/plugins/{index_html → main}/img/loading.gif +0 -0
- data/plugins/{index_html → main}/img/riassence.gif +0 -0
- data/plugins/main/info.yaml +5 -4
- data/plugins/main/main.rb +180 -24
- data/plugins/{index_html → main}/tmpl/index.html +4 -2
- data/plugins/ticket/info.yaml +2 -2
- data/plugins/ticket/lib/upload.rb +57 -5
- data/plugins/ticket/ticket.rb +10 -4
- data/setup/welcome/info.yaml +2 -2
- data/setup/welcome/text/welcome.html +1 -1
- metadata +22 -11
- data/plugins/index_html/index_html.rb +0 -120
- data/plugins/index_html/info.yaml +0 -18
@@ -38,19 +38,26 @@ module RSence
|
|
38
38
|
def initialize
|
39
39
|
@config = RSence.config[:transporter_conf]
|
40
40
|
@accept_req = false
|
41
|
-
@valuemanager = ValueManager.new
|
42
|
-
@sessions = SessionManager.new( self )
|
43
41
|
core_pkgs = {
|
44
42
|
:core => [:transporter, :session_storage, :session_manager, :value_manager]
|
45
43
|
}
|
46
|
-
@plugins = PluginManager.new(
|
47
|
-
RSence.config[:plugin_paths],
|
48
|
-
self,
|
49
|
-
RSence.args[:autoupdate],
|
50
|
-
false,
|
51
|
-
core_pkgs[:core],
|
52
|
-
core_pkgs
|
53
|
-
)
|
44
|
+
@plugins = PluginManager.new( {
|
45
|
+
:plugin_paths => RSence.config[:plugin_paths],
|
46
|
+
:transporter => self,
|
47
|
+
:autoreload => RSence.args[:autoupdate],
|
48
|
+
:name_prefix => false,
|
49
|
+
:resolved_deps => core_pkgs[:core],
|
50
|
+
:resolved_categories => core_pkgs
|
51
|
+
})
|
52
|
+
@valuemanager = ValueManager.new
|
53
|
+
@sessions = SessionManager.new( self )
|
54
|
+
if RSence.config[:session_conf][:reset_sessions]
|
55
|
+
puts "Resetting all sessions..."
|
56
|
+
@sessions.reset_sessions()
|
57
|
+
else
|
58
|
+
@sessions.restore_sessions()
|
59
|
+
end
|
60
|
+
|
54
61
|
if RSence.launch_pid != Process.pid
|
55
62
|
Process.kill( 'TERM', RSence.launch_pid )
|
56
63
|
end
|
@@ -180,7 +187,7 @@ module RSence
|
|
180
187
|
## Calls the restore_ses of plugins, when a session is restored (page reload with previously active session)
|
181
188
|
if msg.restored_session
|
182
189
|
msg.session[:deps] = []
|
183
|
-
|
190
|
+
|
184
191
|
if msg.cloned_source
|
185
192
|
begin
|
186
193
|
@plugins.delegate( :cloned_target, msg, msg.cloned_source )
|
@@ -190,24 +197,29 @@ module RSence
|
|
190
197
|
xhr_traceback_handler( e, "Transporter::PluginDelegateClonedTargetError: @plugins.delegate 'cloned_target' failed." )
|
191
198
|
end
|
192
199
|
end
|
193
|
-
|
200
|
+
|
194
201
|
begin
|
195
202
|
@plugins.delegate( :restore_ses, msg )
|
203
|
+
msg.session[:plugin_incr] == @plugins.incr
|
196
204
|
rescue => e
|
197
205
|
response_success = false
|
198
206
|
xhr_error_handler( msg, :plugin_delegate_restore_ses_error, e.message )
|
199
207
|
xhr_traceback_handler( e, "Transporter::PluginDelegateRestoreSesError: @plugins.delegate 'restore_ses' failed." )
|
200
208
|
end
|
201
|
-
|
209
|
+
|
202
210
|
elsif msg.new_session
|
211
|
+
|
203
212
|
begin
|
204
213
|
@plugins.delegate( :init_ses, msg )
|
214
|
+
msg.session[:plugin_incr] == @plugins.incr
|
205
215
|
rescue => e
|
206
216
|
response_success = false
|
207
217
|
xhr_error_handler( msg, :plugin_delegate_init_ses_error, e.message )
|
208
218
|
xhr_traceback_handler( e, "Transporter::PluginDelegateInitSesError: @plugins.delegate 'init_ses' failed." )
|
209
219
|
end
|
220
|
+
|
210
221
|
elsif msg.cloned_targets
|
222
|
+
|
211
223
|
begin
|
212
224
|
@plugins.delegate( :cloned_source, msg, msg.cloned_targets )
|
213
225
|
rescue => e
|
@@ -215,6 +227,10 @@ module RSence
|
|
215
227
|
xhr_error_handler( msg, :plugin_delegate_cloned_source_error, e.message )
|
216
228
|
xhr_traceback_handler( e, "Transporter::PluginDelegateClonedSourceError: @plugins.delegate 'cloned_source' failed." )
|
217
229
|
end
|
230
|
+
|
231
|
+
elsif msg.refresh_page?( @plugins.incr ) and @config[:client_autoreload]
|
232
|
+
# Forces the client to reload, if plugins are incremented
|
233
|
+
msg.reply("window.location.reload( true );")
|
218
234
|
end
|
219
235
|
|
220
236
|
## Calls validators for changed values
|
data/lib/values/hvalue.rb
CHANGED
@@ -122,6 +122,14 @@ module RSence
|
|
122
122
|
return true
|
123
123
|
end
|
124
124
|
|
125
|
+
# Checks, if the plugin_name and method_name pairing is already bound with the bind method. Returns true or false.
|
126
|
+
def bound?( plugin_name, method_name )
|
127
|
+
plugin_name = plugin_name.to_sym unless plugin_name.class == Symbol
|
128
|
+
method_name = method_name.to_sym unless method_name.class == Symbol
|
129
|
+
return false unless @members.has_key?(plugin_name)
|
130
|
+
return @members[plugin_name].include?(method_name)
|
131
|
+
end
|
132
|
+
|
125
133
|
# Releases the responder of the value, both params as in bind, but optional +method_name+ can be omitted, matching all methods bound to the +plugin_name+.
|
126
134
|
# @param [Symbol] plugin_name The name of the plugin acting as a responder to the value.
|
127
135
|
# @param [Symbol] method_name The name of the method of the plugin acting as a responder to the value.
|
@@ -135,6 +143,9 @@ module RSence
|
|
135
143
|
@members.delete( plugin_name )
|
136
144
|
else
|
137
145
|
@members[plugin_name].slice!(@members[plugin_name].index( method_name )) if @members[plugin_name].include?(method_name)
|
146
|
+
if @members[plugin_name].empty?
|
147
|
+
@members.delete( plugin_name )
|
148
|
+
end
|
138
149
|
end
|
139
150
|
return true
|
140
151
|
end
|
@@ -211,6 +222,25 @@ module RSence
|
|
211
222
|
end
|
212
223
|
end
|
213
224
|
|
225
|
+
# Sets the key of the hash data of the value, the change will be synced with the client.
|
226
|
+
# @param [Message] msg The {Message} instance.
|
227
|
+
# @param [String] key The key of data to change
|
228
|
+
# @param [#to_json] data Any data that can be mapped to JSON and handled by the client.
|
229
|
+
# @param [Boolean] dont_tell_client Doesn't notify the client about the change, if true.
|
230
|
+
def set_key( msg, key, data, dont_tell_client=false )
|
231
|
+
|
232
|
+
@data[key] = data
|
233
|
+
|
234
|
+
# won't tell the client about the change, usually not needed
|
235
|
+
unless dont_tell_client
|
236
|
+
## update the flags
|
237
|
+
@sync = false
|
238
|
+
@is_valid = true
|
239
|
+
|
240
|
+
add_to_sync( msg )
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
214
244
|
# @private Tell the client that the value changed.
|
215
245
|
def to_client( msg )
|
216
246
|
if @is_new_to_client
|
@@ -3,7 +3,7 @@
|
|
3
3
|
title: Client Resource Package
|
4
4
|
|
5
5
|
# The human-readable version of the package
|
6
|
-
version: 2.
|
6
|
+
version: 2.1.0
|
7
7
|
|
8
8
|
# A brief description of the package (rdoc formatting supported)
|
9
9
|
description: |
|
@@ -17,7 +17,7 @@ description: |
|
|
17
17
|
reloadable: false
|
18
18
|
|
19
19
|
# System version requirement.
|
20
|
-
sys_version: '>= 2.
|
20
|
+
sys_version: '>= 2.1.0'
|
21
21
|
|
22
22
|
category: :system
|
23
23
|
|
File without changes
|
File without changes
|
data/plugins/main/info.yaml
CHANGED
@@ -3,16 +3,17 @@
|
|
3
3
|
title: Main Plugin
|
4
4
|
|
5
5
|
# The human-readable version of the package
|
6
|
-
version: 2.
|
6
|
+
version: 2.1.0
|
7
7
|
|
8
8
|
# A brief description of the package (rdoc formatting supported)
|
9
9
|
description: |
|
10
|
-
The main plugin manages the flow of communication between client and server
|
10
|
+
The main plugin manages the flow of communication between client and server
|
11
|
+
as well as initializes a startup web page, if no other plugin does so.
|
11
12
|
|
12
13
|
# System version requirement.
|
13
|
-
sys_version: '>= 2.
|
14
|
+
sys_version: '>= 2.1.0'
|
14
15
|
|
15
16
|
category: :system
|
16
17
|
|
17
|
-
depends_on: :
|
18
|
+
depends_on: :client_pkg
|
18
19
|
|
data/plugins/main/main.rb
CHANGED
@@ -7,9 +7,10 @@
|
|
7
7
|
##
|
8
8
|
|
9
9
|
|
10
|
-
# The MainPlugin is accessible as +@plugins.main+ from other plugins.
|
10
|
+
# The MainPlugin is accessible as +@plugins.main+ and just +main+ from other plugins.
|
11
11
|
#
|
12
12
|
# = MainPlugin provides mainly client setup and the following services:
|
13
|
+
# * The root html page, which includes the scripts and sets up client startup variables.
|
13
14
|
# * The url of the client as a HValue, including the anchor.
|
14
15
|
# * Accessible via +msg.session[:main][:location_href]+
|
15
16
|
# * The local time of the client's web browser as a HValue, as seconds since epoch.
|
@@ -18,38 +19,165 @@
|
|
18
19
|
# * Provides the +#init_ui+ event for plugins that respond to it.
|
19
20
|
class MainPlugin < Plugin
|
20
21
|
|
21
|
-
#
|
22
|
+
# # Session-specific index page renderer (unused)
|
23
|
+
# def session_index_html( request, response )
|
24
|
+
#
|
25
|
+
# ses_key = @randgen.gen
|
26
|
+
# sha_key = ''
|
27
|
+
#
|
28
|
+
# buffer = [
|
29
|
+
# "var qP=function(cmd){COMM.Queue.push(cmd);};"
|
30
|
+
# ]
|
31
|
+
#
|
32
|
+
# req_num = 0
|
33
|
+
#
|
34
|
+
# 3.times do |req_num|
|
35
|
+
# sha_key = Digest::SHA1.hexdigest( ses_key + sha_key )
|
36
|
+
# msg = @plugins.transporter.xhr(
|
37
|
+
# request, response, {
|
38
|
+
# :servlet => true,
|
39
|
+
# :cookie => (req_num==0),
|
40
|
+
# :query => {
|
41
|
+
# 'ses_key' => "#{req_num}:.o.:#{sha_key}"
|
42
|
+
# }
|
43
|
+
# }
|
44
|
+
# )
|
45
|
+
# buffer += msg.value_buffer
|
46
|
+
# msg.buffer.each do |buffer_item|
|
47
|
+
# buffer.push( "qP(function(){#{buffer_item};});")
|
48
|
+
# end
|
49
|
+
# ses_key = msg.ses_key
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# buffer.unshift( "COMM.Session.newKey(#{ses_key.to_json});" )
|
53
|
+
# buffer.unshift( "COMM.Session.sha_key=#{sha_key.to_json};" )
|
54
|
+
# buffer.unshift( "COMM.Session.req_num=#{req_num};" )
|
55
|
+
#
|
56
|
+
# index_html = render_index_html
|
57
|
+
#
|
58
|
+
# return index_html.gsub('__STARTUP_SEQUENCE__', buffer.join("\n") )
|
59
|
+
# end
|
60
|
+
|
61
|
+
|
62
|
+
# Index page renderer
|
63
|
+
def render_index_html
|
64
|
+
|
65
|
+
index_html = @index_html_src.clone
|
66
|
+
|
67
|
+
client_rev = client_pkg.client_cache.client_rev
|
68
|
+
deps_src = ''
|
69
|
+
@conf[:deps].each do |dep|
|
70
|
+
deps_src += %{<script src="#{dep}" type="text/javascript"></script>}
|
71
|
+
end
|
72
|
+
client_base = File.join(@bconf[:h],client_rev)
|
73
|
+
|
74
|
+
index_html.gsub!( '__CLIENT_BASE__', client_base )
|
75
|
+
index_html.gsub!( '__DEFAULT_TITLE__', @conf[:title] )
|
76
|
+
index_html.gsub!( '__CLIENT_REV__', client_rev )
|
77
|
+
index_html.gsub!( '__CLIENT_HELLO__', @bconf[:hello] )
|
78
|
+
index_html.gsub!( '__NOSCRIPT__', @conf[:noscript] )
|
79
|
+
index_html.gsub!( '__SCRIPT_DEPS__', deps_src )
|
80
|
+
|
81
|
+
return index_html
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
### Top-level plugin events:
|
87
|
+
|
88
|
+
|
89
|
+
# Binds configuration data as instance variables
|
22
90
|
def init
|
23
91
|
super
|
92
|
+
@plugins.register_alias( :main, :index_html )
|
93
|
+
@randgen = RandGen.new( 40 )
|
94
|
+
::RSence.config[:index_html][:instance] = self
|
24
95
|
@conf = ::RSence.config[:index_html]
|
25
96
|
@bconf = ::RSence.config[:broker_urls]
|
26
97
|
@goodbye_uri = File.join(@bconf[:hello],'goodbye')
|
27
98
|
end
|
28
99
|
|
29
|
-
#
|
30
|
-
def
|
31
|
-
|
100
|
+
# Opens and renders the index page template
|
101
|
+
def open
|
102
|
+
super
|
103
|
+
@index_html_src = file_read( ::RSence.config[:index_html][:index_tmpl] )
|
104
|
+
render_index_html
|
105
|
+
end
|
106
|
+
|
107
|
+
# Frees the ticket resource id of the "loading" gif image.
|
108
|
+
def close
|
109
|
+
super
|
110
|
+
@plugins[:ticket].del_rsrc( @loading_gif_id )
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
### Servlet features; responds to GET / as well as POST /hello/goodbye
|
116
|
+
|
117
|
+
|
118
|
+
# @private Internal structures, matches the "hello/goodbye" session termination POST request and the "/" index html page GET request
|
119
|
+
def match( uri, method )
|
120
|
+
if uri == ::RSence.config[:index_html][:respond_address] and method == :get
|
32
121
|
return true
|
122
|
+
elsif req_type == :post and uri == @goodbye_uri
|
123
|
+
return true
|
124
|
+
else
|
125
|
+
return false
|
33
126
|
end
|
34
|
-
return false
|
35
127
|
end
|
36
128
|
|
37
|
-
# @private Internal structures, score for the "hello/goodbye" session termination request
|
38
|
-
def score
|
129
|
+
# @private Internal structures, score for the "hello/goodbye" session termination request and the default index html page
|
130
|
+
def score
|
131
|
+
return 1000 # allows overriding with anything with a score below 1000
|
132
|
+
end
|
133
|
+
|
134
|
+
# Inspects the http request header to decide if the browser supports gzip compressed responses.
|
135
|
+
def support_gzip( header )
|
136
|
+
return false if not ::RSence.config[:no_gzip]
|
137
|
+
return false if not header.has_key?('accept-encoding')
|
138
|
+
return header['accept-encoding'].include?('gzip')
|
139
|
+
end
|
140
|
+
|
141
|
+
# Outputs the startup web page.
|
142
|
+
def get( req, response, ses )
|
143
|
+
index_html = render_index_html
|
144
|
+
|
145
|
+
response.status = 200
|
146
|
+
|
147
|
+
response['Content-Type'] = 'text/html; charset=UTF-8'
|
148
|
+
response['Date'] = httime( Time.now )
|
149
|
+
response['Server'] = 'RSence'
|
150
|
+
response['Cache-Control'] = 'no-cache'
|
151
|
+
|
152
|
+
if support_gzip( req.header )
|
153
|
+
index_gzip = GZString.new('')
|
154
|
+
gzwriter = Zlib::GzipWriter.new( index_gzip, 9 )
|
155
|
+
gzwriter.write( index_html )
|
156
|
+
gzwriter.close
|
157
|
+
response['Content-Length'] = index_gzip.length
|
158
|
+
response['Content-Encoding'] = 'gzip'
|
159
|
+
response.body = index_gzip
|
160
|
+
else
|
161
|
+
response['Content-Length'] = index_html.length
|
162
|
+
response.body = index_html
|
163
|
+
end
|
164
|
+
end
|
39
165
|
|
40
|
-
#
|
166
|
+
# Returns the "hello/goodbye" session termination request
|
41
167
|
def post( req, res, ses )
|
42
168
|
@plugins.sessions.expire_ses_by_req( req, res )
|
43
169
|
end
|
44
170
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
171
|
+
|
172
|
+
|
173
|
+
### Features accessible from other plugins:
|
174
|
+
|
175
|
+
# The +#url_responder+ gets called whenever the anchor (pound) of location.href changes.
|
176
|
+
# It enables virtual url events for back/forward buttons and bookmarking in browsers whenever utilized.
|
49
177
|
#
|
50
178
|
# Client-side support is included in js/url_responder.js
|
51
179
|
#
|
52
|
-
# Also allows virtual-host -like behavior
|
180
|
+
# Also allows virtual-host -like behavior if utilized.
|
53
181
|
def url_responder(msg,location_href)
|
54
182
|
|
55
183
|
ses = get_ses( msg )
|
@@ -84,13 +212,30 @@ class MainPlugin < Plugin
|
|
84
212
|
end
|
85
213
|
|
86
214
|
|
87
|
-
#
|
215
|
+
# Returns base url of browser (before the '#' sign)
|
216
|
+
def url( msg )
|
217
|
+
get_ses( msg )[:url][0]
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
# Returns pound url of browser (after the '#' sign)
|
222
|
+
def pound( msg )
|
223
|
+
get_ses( msg )[:url][1]
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
|
228
|
+
### Session events:
|
229
|
+
|
230
|
+
|
231
|
+
# New session initialization, called just once per session.
|
88
232
|
def init_ses(msg)
|
89
233
|
super
|
90
234
|
restore_ses( msg )
|
91
235
|
end
|
92
236
|
|
93
|
-
|
237
|
+
|
238
|
+
# Called once when a session is restored or cloned using the cookie's ses_key
|
94
239
|
def restore_ses(msg)
|
95
240
|
super
|
96
241
|
## Resets session data to defaults
|
@@ -101,6 +246,7 @@ class MainPlugin < Plugin
|
|
101
246
|
ses[:poll_mode] = true
|
102
247
|
end
|
103
248
|
|
249
|
+
|
104
250
|
# Interface for adding delayed calls
|
105
251
|
#
|
106
252
|
# When adding a delayed call, use an Array to define a plugin/method with optional arguments that will be called on the next request. The client will call back immediately when a delayed call is pending. The first param of the method is a +msg+. Don't include the +msg+ of the current request in params, it will be inserted automatically for the delayed call.
|
@@ -125,6 +271,7 @@ class MainPlugin < Plugin
|
|
125
271
|
get_ses( msg )[:delayed_calls].push( params )
|
126
272
|
end
|
127
273
|
|
274
|
+
|
128
275
|
# @private Initializes the client-side COMM.urlResponder and sesWatcher
|
129
276
|
def boot0( msg, ses )
|
130
277
|
|
@@ -148,18 +295,27 @@ class MainPlugin < Plugin
|
|
148
295
|
|
149
296
|
end
|
150
297
|
|
298
|
+
|
151
299
|
# @private Calls the init_ui method of each loaded plugin and removes the loading -message
|
152
300
|
def boot1( msg, ses )
|
153
301
|
# Delegates the init_ui method to each plugin to signal bootstrap completion.
|
154
302
|
msg.plugins.delegate( 'init_ui', msg ) unless ses[:dont_init_ui]
|
155
303
|
end
|
156
304
|
|
157
|
-
|
305
|
+
|
306
|
+
# Disables the init_ui event.
|
158
307
|
def dont_init_ui( msg )
|
159
308
|
get_ses( msg )[:dont_init_ui] = true
|
160
309
|
end
|
161
310
|
|
162
|
-
|
311
|
+
|
312
|
+
# Enables the init_ui event.
|
313
|
+
def do_init_ui( msg )
|
314
|
+
get_ses( msg )[:dont_init_ui] = false
|
315
|
+
end
|
316
|
+
|
317
|
+
|
318
|
+
# Flushes commands in the :delayed_calls array
|
163
319
|
def flush_delayed( msg, ses )
|
164
320
|
## Limits the amount of delayed calls to process to 4.
|
165
321
|
## Prevents the client from choking even when the server
|
@@ -213,10 +369,10 @@ class MainPlugin < Plugin
|
|
213
369
|
end
|
214
370
|
end
|
215
371
|
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
219
|
-
#
|
372
|
+
# When nothing is delayed and the second poll has been made (init_ui called),
|
373
|
+
# sets the client to non-polling-mode, having only value synchronization trigger
|
374
|
+
# new requests. On the client, SesWatcher forces the change by sending the
|
375
|
+
# client time periodically.
|
220
376
|
def end_polling( msg, ses )
|
221
377
|
if ses[:poll_mode] == true
|
222
378
|
msg.reply "COMM.Transporter.poll(0);"
|
@@ -224,7 +380,7 @@ class MainPlugin < Plugin
|
|
224
380
|
end
|
225
381
|
end
|
226
382
|
|
227
|
-
#
|
383
|
+
# Starts polling mode.
|
228
384
|
def start_polling( msg, ses )
|
229
385
|
if ses[:poll_mode] == false
|
230
386
|
msg.reply( "COMM.Transporter.poll(#{::RSence.config[:transporter_conf][:client_poll_priority]});" )
|
@@ -232,7 +388,7 @@ class MainPlugin < Plugin
|
|
232
388
|
end
|
233
389
|
end
|
234
390
|
|
235
|
-
#
|
391
|
+
# Called on every request of an active, valid session
|
236
392
|
def idle(msg)
|
237
393
|
|
238
394
|
ses = get_ses( msg )
|