rsence 2.0.0.10.pre → 2.0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +10 -0
- data/INSTALL.rdoc +52 -86
- data/{LICENSE → LICENSE.txt} +0 -0
- data/README.rdoc +52 -49
- data/VERSION +1 -1
- data/bin/rsence +4 -6
- data/conf/default_conf.yaml +314 -305
- data/conf/default_strings.yaml +70 -71
- data/docs/ExampleGuiPlugin.rdoc +193 -0
- data/{js/comm/comm/autosync/js.inc → docs/JavascriptBundles.rdoc} +0 -0
- data/docs/PluginBundleInfo.rdoc +173 -0
- data/docs/PluginBundles.rdoc +96 -0
- data/docs/Values.rdoc +163 -0
- data/js/comm/{comm/autosync → autosync}/autosync.js +1 -2
- data/js/comm/{comm → autosync}/js.inc +0 -0
- data/js/comm/{comm/comm.js → comm.js} +1 -0
- data/js/comm/{comm/queue/js.inc → js.inc} +0 -0
- data/js/comm/jsloader/jsloader.js +2 -4
- data/js/comm/{comm/session → queue}/js.inc +0 -0
- data/js/comm/{comm/queue → queue}/queue.js +1 -0
- data/js/comm/{comm/sessionwatcher → session}/js.inc +0 -0
- data/js/comm/{comm/session → session}/session.js +4 -3
- data/js/comm/{comm/transporter → sessionwatcher}/js.inc +0 -0
- data/js/comm/{comm/sessionwatcher → sessionwatcher}/sessionwatcher.js +1 -0
- data/js/comm/{comm/urlresponder → transporter}/js.inc +0 -0
- data/js/comm/{comm/transporter → transporter}/transporter.js +1 -0
- data/js/comm/{comm/values → urlresponder}/js.inc +0 -0
- data/js/comm/{comm/urlresponder → urlresponder}/urlresponder.js +1 -0
- data/js/comm/{reloadapp → values}/js.inc +0 -0
- data/js/comm/{comm/values → values}/values.js +1 -0
- data/js/controls/button/button.js +10 -1
- data/js/controls/checkbox/checkbox.js +2 -0
- data/js/controls/dialogs/alert_sheet/alert_sheet.js +1 -0
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +1 -0
- data/js/controls/dialogs/sheet/sheet.js +1 -0
- data/js/controls/imageview/imageview.js +1 -0
- data/js/controls/passwordcontrol/passwordcontrol.js +1 -0
- data/js/controls/progress/progressbar/progressbar.js +1 -0
- data/js/controls/progress/progressindicator/progressindicator.js +1 -0
- data/js/controls/radiobutton/radiobutton.js +3 -1
- data/js/controls/sliders/slider/slider.js +1 -0
- data/js/controls/sliders/vslider/vslider.js +1 -0
- data/js/controls/stepper/stepper.js +1 -0
- data/js/controls/stringview/stringview.js +2 -2
- data/js/controls/tab/tab.js +7 -5
- data/js/controls/textarea/textarea.js +1 -0
- data/js/controls/textcontrol/textcontrol.js +3 -1
- data/js/controls/uploader/uploader.js +1 -0
- data/js/controls/validatorview/validatorview.js +62 -59
- data/js/controls/window/window.js +1 -0
- data/js/core/class/class.js +2 -1
- data/js/core/elem/elem.js +27 -27
- data/js/core/event/event.js +3 -874
- data/js/{comm/sha → core/rsence_ns}/js.inc +0 -0
- data/js/core/rsence_ns/rsence_ns.js +15 -0
- data/js/{controls/datetime → datetime}/calendar/calendar.js +1 -0
- data/js/{comm/values/value → datetime/calendar}/js.inc +0 -0
- data/js/{controls/datetime → datetime}/calendar/themes/default/calendar.css +0 -0
- data/js/{controls/datetime → datetime}/calendar/themes/default/calendar.html +0 -0
- data/js/{controls/datetime → datetime}/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
- data/js/{controls/datetime → datetime}/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/{controls/datetime → datetime}/datetimevalue/datetimevalue.js +1 -0
- data/js/{comm/values/valuematrix → datetime/datetimevalue}/js.inc +0 -0
- data/js/{controls/datetime/calendar → datetime/timesheet}/js.inc +0 -0
- data/js/{controls/datetime → datetime}/timesheet/themes/default/timesheet.css +0 -0
- data/js/{controls/datetime → datetime}/timesheet/themes/default/timesheet.html +0 -0
- data/js/{controls/datetime → datetime}/timesheet/timesheet.js +1 -0
- data/js/{controls/datetime/datetimevalue → datetime/timesheet_item}/js.inc +0 -0
- data/js/{controls/datetime → datetime}/timesheet_item/themes/default/timesheet_item.css +0 -0
- data/js/{controls/datetime → datetime}/timesheet_item/themes/default/timesheet_item.html +0 -0
- data/js/{controls/datetime → datetime}/timesheet_item/timesheet_item.js +1 -0
- data/js/{controls/datetime/timesheet → datetime/timesheet_item_edit}/js.inc +0 -0
- data/js/{controls/datetime → datetime}/timesheet_item_edit/timesheet_item_edit.js +1 -1
- data/js/foundation/application/application.js +1 -2
- data/js/foundation/control/control.js +1 -4
- data/js/foundation/control/controldefaults/controldefaults.js +1 -4
- data/js/foundation/control/dummyvalue/dummyvalue.js +1 -0
- data/js/foundation/control/dyncontrol/dyncontrol.js +1 -2
- data/js/foundation/control/eventresponder/eventresponder.js +11 -3
- data/js/{controls/datetime/timesheet_item → foundation/control/valuematrix}/js.inc +0 -0
- data/js/{comm/values → foundation/control}/valuematrix/valuematrix.js +2 -5
- data/js/foundation/control/valueresponder/valueresponder.js +3 -1
- data/js/foundation/eventmanager/eventmanager.js +884 -0
- data/js/{controls/datetime/timesheet_item_edit → foundation/eventmanager}/js.inc +0 -0
- data/js/foundation/geom/point/point.js +2 -2
- data/js/foundation/geom/rect/rect.js +1 -0
- data/js/foundation/json_renderer/json_renderer.js +2 -0
- data/js/foundation/system/system.js +2 -1
- data/js/foundation/thememanager/thememanager.js +29 -23
- data/js/{controls/lists/checkboxlist → foundation/value}/js.inc +0 -0
- data/js/{comm/values → foundation}/value/value.js +1 -0
- data/js/foundation/view/markupview/markupview.js +2 -1
- data/js/foundation/view/morphanimation/morphanimation.js +1 -0
- data/js/foundation/view/view.js +6 -12
- data/js/foundation/view/viewdefaults/viewdefaults.js +1 -0
- data/js/{controls/lists → lists}/checkboxlist/checkboxlist.js +1 -0
- data/js/{controls/lists/listitems → lists/checkboxlist}/js.inc +0 -0
- data/js/{controls/lists/radiobuttonlist → lists/listitems}/js.inc +0 -0
- data/js/{controls/lists → lists}/listitems/listitems.js +22 -3
- data/js/lists/radiobuttonlist/js.inc +0 -0
- data/js/{controls/lists → lists}/radiobuttonlist/radiobuttonlist.js +2 -12
- data/js/util/reloadapp/js.inc +0 -0
- data/js/{comm → util}/reloadapp/reloadapp.js +10 -8
- data/js/{comm → util}/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
- data/js/{comm → util}/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/js/util/sha/js.inc +0 -0
- data/js/{comm → util}/sha/sha.js +27 -33
- data/js/views/centerview/centerview.js +33 -3
- data/js/views/inlineview/inlineview.js +1 -0
- data/js/views/scrollview/scrollview.js +1 -0
- data/lib/conf/argv.rb +34 -22
- data/lib/conf/default.rb +165 -173
- data/lib/daemon/daemon.rb +9 -9
- data/lib/daemon/sigcomm.rb +4 -4
- data/lib/http/broker.rb +30 -27
- data/lib/http/rackup.rb +2 -3
- data/lib/http/request.rb +1 -2
- data/lib/http/response.rb +10 -10
- data/lib/plugins/dependencies.rb +2 -1
- data/lib/plugins/gui_plugin.rb +77 -50
- data/lib/plugins/guiparser.rb +26 -22
- data/lib/plugins/plugin.rb +207 -427
- data/lib/plugins/plugin_base.rb +162 -0
- data/lib/plugins/plugin_plugins.rb +21 -15
- data/lib/plugins/plugin_sqlite_db.rb +45 -20
- data/lib/plugins/pluginmanager.rb +10 -5
- data/lib/plugins/plugins.rb +65 -31
- data/lib/plugins/servlet.rb +74 -26
- data/lib/rsence.rb +32 -0
- data/lib/session/msg.rb +131 -96
- data/lib/session/sessionmanager.rb +5 -4
- data/lib/session/sessionstorage.rb +4 -3
- data/lib/transporter/transporter.rb +30 -21
- data/lib/util/gzstring.rb +4 -2
- data/lib/util/ruby19_fixes.rb +18 -0
- data/lib/values/hvalue.rb +139 -88
- data/lib/values/valuemanager.rb +60 -46
- data/plugins/client_pkg/client_pkg.rb +6 -5
- data/plugins/client_pkg/lib/client_pkg_build.rb +5 -5
- data/plugins/client_pkg/lib/client_pkg_serve.rb +8 -0
- data/plugins/index_html/index_html.rb +3 -1
- data/plugins/index_html/tmpl/index.html +2 -3
- data/plugins/main/js/main.js +84 -0
- data/plugins/main/main.rb +54 -27
- data/plugins/ticket/lib/common.rb +4 -2
- data/plugins/ticket/lib/favicon.rb +3 -2
- data/plugins/ticket/lib/file.rb +2 -2
- data/plugins/ticket/lib/img.rb +2 -2
- data/plugins/ticket/lib/objblob.rb +2 -2
- data/plugins/ticket/lib/rsrc.rb +2 -2
- data/plugins/ticket/lib/upload.rb +9 -8
- data/plugins/ticket/ticket.rb +141 -8
- data/setup/welcome/welcome.rb +1 -0
- metadata +76 -72
- data/lib/plugins/plugin_util.rb +0 -107
- data/plugins/index_html/tmpl/startup_index.html +0 -29
- data/plugins/main/js/riassence_ns.js +0 -87
- data/setup/legacy/info.yaml +0 -18
- data/setup/legacy/legacy.rb +0 -17
- data/setup/welcome/gui/welcome.yaml +0 -68
- data/setup/welcome/text/welcome.html +0 -8
@@ -7,6 +7,7 @@
|
|
7
7
|
##
|
8
8
|
|
9
9
|
|
10
|
+
|
10
11
|
module RSence
|
11
12
|
|
12
13
|
require 'rubygems'
|
@@ -240,7 +241,7 @@ module RSence
|
|
240
241
|
def stop_client_with_message( msg,
|
241
242
|
title = 'Unknown Issue',
|
242
243
|
descr = 'No issue description given.',
|
243
|
-
uri =
|
244
|
+
uri = RSence.config[:index_html][:respond_address] )
|
244
245
|
msg.error_msg( [
|
245
246
|
"jsLoader.load('default_theme');",
|
246
247
|
"jsLoader.load('controls');",
|
@@ -261,7 +262,7 @@ module RSence
|
|
261
262
|
# checks, if a cookie named 'ses_key' is found
|
262
263
|
if cookie_raw.has_key?('ses_key')
|
263
264
|
|
264
|
-
# gets just the data itself (discards comment, domain,
|
265
|
+
# gets just the data itself (discards comment, domain, expiration etc)
|
265
266
|
cookie_key = cookie_raw['ses_key'].split(';')[0]
|
266
267
|
|
267
268
|
end
|
@@ -383,11 +384,11 @@ module RSence
|
|
383
384
|
ses_cookie_max_age = @config[:timeout_secs]
|
384
385
|
|
385
386
|
## Only match the handshaking address of rsence,
|
386
|
-
## prevents
|
387
|
+
## prevents unnecessary cookie-juggling in xhr's
|
387
388
|
if @config[:trust_cookies]
|
388
389
|
ses_cookie_path = '/'
|
389
390
|
else
|
390
|
-
ses_cookie_path =
|
391
|
+
ses_cookie_path = RSence.config[:broker_urls][:hello]
|
391
392
|
end
|
392
393
|
|
393
394
|
## Formats the cookie to string
|
@@ -7,6 +7,7 @@
|
|
7
7
|
##
|
8
8
|
|
9
9
|
|
10
|
+
|
10
11
|
module RSence
|
11
12
|
|
12
13
|
require 'rubygems'
|
@@ -19,7 +20,7 @@ module RSence
|
|
19
20
|
# the superclass for SessionManager that does all the boring
|
20
21
|
# housekeeping duties.
|
21
22
|
#
|
22
|
-
#
|
23
|
+
# Spliced of as a separate file to reduce the complexity
|
23
24
|
# of SessionManager.
|
24
25
|
class SessionStorage
|
25
26
|
attr_accessor :db
|
@@ -44,9 +45,9 @@ module RSence
|
|
44
45
|
}
|
45
46
|
|
46
47
|
## Disposable keys (new ses_key each request)
|
47
|
-
@config =
|
48
|
+
@config = RSence.config[:session_conf]
|
48
49
|
|
49
|
-
@db_uri =
|
50
|
+
@db_uri = RSence.config[:database][:ses_db]
|
50
51
|
|
51
52
|
if db_test
|
52
53
|
@db_avail = true
|
@@ -1,4 +1,3 @@
|
|
1
|
-
#--
|
2
1
|
## RSence
|
3
2
|
# Copyright 2008 Riassence Inc.
|
4
3
|
# http://riassence.com/
|
@@ -6,28 +5,38 @@
|
|
6
5
|
# You should have received a copy of the GNU General Public License along
|
7
6
|
# with this software package. If not, contact licensing@riassence.com
|
8
7
|
##
|
9
|
-
#++
|
10
8
|
|
11
9
|
|
12
|
-
|
10
|
+
# ValueManager synchronizes value objects
|
11
|
+
require 'values/valuemanager'
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
class Transporter
|
17
|
-
|
18
|
-
# ValueManager syncronizes value objects
|
19
|
-
require 'values/valuemanager'
|
20
|
-
|
21
|
-
# SessionManager creates, validates, stores and expires sessions
|
22
|
-
require 'session/sessionmanager'
|
13
|
+
# SessionManager creates, validates, stores and expires sessions
|
14
|
+
require 'session/sessionmanager'
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
16
|
+
# PluginManager handles all the plugins
|
17
|
+
require 'plugins/pluginmanager'
|
18
|
+
|
19
|
+
|
20
|
+
module RSence
|
28
21
|
|
22
|
+
# Transporter handles incoming requests targeted at RSence and distributes calls and data accordingly. It's called via {Broker}.
|
23
|
+
# @see Broker
|
24
|
+
class Transporter
|
25
|
+
|
26
|
+
# The single instance of the {ValueManager}
|
27
|
+
# @return [ValueManager]
|
28
|
+
attr_accessor :valuemanager
|
29
|
+
|
30
|
+
# The single instance of the {SessionManager}
|
31
|
+
# @return [SessionManager]
|
32
|
+
attr_accessor :sessions
|
33
|
+
|
34
|
+
# The main instance of the {PluginManager}
|
35
|
+
# @return [PluginManager]
|
36
|
+
attr_accessor :plugins
|
37
|
+
|
29
38
|
def initialize
|
30
|
-
@config =
|
39
|
+
@config = RSence.config[:transporter_conf]
|
31
40
|
@accept_req = false
|
32
41
|
@valuemanager = ValueManager.new
|
33
42
|
@sessions = SessionManager.new( self )
|
@@ -35,7 +44,7 @@ module RSence
|
|
35
44
|
:core => [:transporter, :session_storage, :session_manager, :value_manager]
|
36
45
|
}
|
37
46
|
@plugins = PluginManager.new(
|
38
|
-
|
47
|
+
RSence.config[:plugin_paths],
|
39
48
|
self,
|
40
49
|
RSence.args[:autoupdate],
|
41
50
|
false,
|
@@ -70,7 +79,7 @@ module RSence
|
|
70
79
|
end
|
71
80
|
|
72
81
|
def servlet( request_type, request, response )
|
73
|
-
broker_urls =
|
82
|
+
broker_urls = RSence.config[:broker_urls]
|
74
83
|
uri = request.fullpath
|
75
84
|
|
76
85
|
if request_type == :post
|
@@ -116,7 +125,7 @@ module RSence
|
|
116
125
|
## handles incoming XMLHttpRequests from the browser
|
117
126
|
def xhr(request, response, options = { :cookies => false, :servlet => false } )
|
118
127
|
|
119
|
-
session_conf =
|
128
|
+
session_conf = RSence.config[:session_conf]
|
120
129
|
|
121
130
|
options[:cookies] = false unless options.has_key?(:cookies)
|
122
131
|
|
@@ -143,7 +152,7 @@ module RSence
|
|
143
152
|
# If cookies are true, it means the url base needs to
|
144
153
|
# be changed from /hello to /x to prevent further cookie juggling.
|
145
154
|
if options[:cookies] and not options[:servlet]
|
146
|
-
msg.reply("COMM.Transporter.url=#{
|
155
|
+
msg.reply("COMM.Transporter.url=#{RSence.config[:broker_urls][:x].to_json};")
|
147
156
|
end
|
148
157
|
|
149
158
|
# Appends a 'new session.' message for new sessions in RSence.args[:verbose]:
|
data/lib/util/gzstring.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
|
1
2
|
require 'zlib'
|
2
3
|
|
3
|
-
|
4
|
-
#
|
4
|
+
|
5
|
+
# @private Implements the +write+ method for strings, used with zlib to
|
6
|
+
# use GZStrings as the target for compression.
|
5
7
|
class GZString < String
|
6
8
|
alias write <<
|
7
9
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
# NOTE: Ruby 1.9 isn't fully supported yet.
|
3
|
+
# There are some encoding handlers and some of the dependencies are not fully working yet.
|
4
|
+
# One should wait for Ruby 2.0 for production use anyway.
|
5
|
+
|
6
|
+
# Ruby 1.9 encoding defaults.
|
7
|
+
# This is clearly not enough but a good start for fixing the encoding madness.
|
8
|
+
Encoding.default_external = Encoding::BINARY
|
9
|
+
Encoding.default_internal = Encoding::BINARY
|
10
|
+
|
11
|
+
# Ruby 1.9 doesn't have String#each anymore.
|
12
|
+
# This is a backwards-compatible work-around.
|
13
|
+
class String
|
14
|
+
def each
|
15
|
+
self.split($/).each { |e| yield e }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
data/lib/values/hvalue.rb
CHANGED
@@ -7,87 +7,128 @@
|
|
7
7
|
##
|
8
8
|
|
9
9
|
|
10
|
+
|
10
11
|
module RSence
|
11
12
|
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
## to validate and process itself as well as tell the client-side
|
16
|
-
## representation of itself.
|
14
|
+
# HValue is the model for client-server synchronized values.
|
15
|
+
# A value contains its payload {#data} and enough meta-data to define its behavior.
|
17
16
|
class HValue
|
18
|
-
|
19
|
-
attr_reader :valid, :sync, :val_id, :data, :members
|
20
|
-
attr_writer :valid, :val_id
|
21
|
-
|
22
|
-
# Method for binding the value to the session data.
|
23
|
-
def add( msg )
|
24
17
|
|
18
|
+
# The validity of the data. Defaults to false, when the data comes from the client.
|
19
|
+
# @return [Boolean] True, when set by the server. False when initially set by the client. Also false, unless all responders return true.
|
20
|
+
attr_reader :is_valid
|
21
|
+
|
22
|
+
# @private Is true when changed by the server. Causes the ValueManager to send its client-side representation.
|
23
|
+
attr_reader :sync
|
24
|
+
|
25
|
+
# @private The unique ID of the value.
|
26
|
+
attr_reader :value_id
|
27
|
+
alias val_id value_id
|
28
|
+
|
29
|
+
# The payload data. Use {#set} to change.
|
30
|
+
attr_reader :data
|
31
|
+
|
32
|
+
# @private List of responders
|
33
|
+
attr_reader :members
|
34
|
+
|
35
|
+
# @private
|
36
|
+
attr_writer :is_valid
|
37
|
+
|
38
|
+
# @private
|
39
|
+
def value_id=(new_id)
|
40
|
+
@value_id = new_id
|
41
|
+
end
|
42
|
+
# @private
|
43
|
+
alias val_id= value_id=
|
44
|
+
|
45
|
+
alias valid is_valid
|
46
|
+
alias valid? is_valid
|
47
|
+
|
48
|
+
# @private Method for binding the value to the session data.
|
49
|
+
def add( msg )
|
50
|
+
|
25
51
|
# get the value storage from the session data
|
26
52
|
session_values = msg.session[:values][:by_id]
|
27
|
-
|
53
|
+
|
28
54
|
## Store the object here
|
29
|
-
session_values[ @
|
30
|
-
|
55
|
+
session_values[ @value_id ] = self
|
56
|
+
|
31
57
|
## Sends the client-side description
|
32
58
|
restore( msg )
|
33
|
-
|
59
|
+
|
34
60
|
## Set the valid flag, so we know that the value is initially in sync
|
35
|
-
@
|
61
|
+
@is_valid = true
|
36
62
|
end
|
37
|
-
|
38
|
-
## (Re-)Send the client-size representation
|
39
|
-
def restore( msg )
|
40
63
|
|
64
|
+
# @private (Re-)Send the client-size representation
|
65
|
+
def restore( msg )
|
66
|
+
|
41
67
|
## Tags itself as a new value from the client's point of view
|
42
68
|
@is_new_to_client = true
|
43
|
-
|
69
|
+
|
44
70
|
add_to_sync( msg )
|
45
|
-
|
71
|
+
|
46
72
|
end
|
47
|
-
|
48
|
-
# +HValue+ constructor. Binds HValue automatically to the +Message+ instance
|
49
|
-
# given as parameter. Data given as second parameter.
|
50
|
-
def initialize( msg, data, meta = { :name => nil } )
|
51
73
|
|
74
|
+
# Value meta-data. The third constructor parameter
|
75
|
+
attr_accessor :meta
|
76
|
+
|
77
|
+
# Creates a new client-server automatically synchronized data wrapper object.
|
78
|
+
# @param [Message] msg Just pass on the +msg+ from the scope you call from.
|
79
|
+
# @param [#to_json] data Any data that can be converted to JSON.
|
80
|
+
# @param [Hash] meta Has no effect yet.
|
81
|
+
def initialize( msg, data, meta = { :name => nil } )
|
82
|
+
|
52
83
|
## Get an unique integer id for the value
|
53
84
|
if RSence.args[:debug] and meta[:name] and not msg.valuemanager.id_exists?( msg, meta[:name] )
|
54
|
-
@
|
85
|
+
@value_id = meta[:name]
|
55
86
|
else
|
56
|
-
@
|
87
|
+
@value_id = msg.valuemanager.randgen.gen
|
57
88
|
end
|
58
|
-
|
89
|
+
|
90
|
+
@meta = meta
|
91
|
+
|
59
92
|
## set the data of the hvalue
|
60
93
|
set( msg, data, true )
|
61
|
-
|
94
|
+
|
62
95
|
## the @sync flag is raised, when the client data is older than the server data
|
63
96
|
@sync = false
|
64
|
-
|
65
|
-
## the @is_valid
|
97
|
+
|
98
|
+
## the @is_valid flag is lowered, when the client data is newer than the server data
|
66
99
|
@is_valid = true
|
67
|
-
|
100
|
+
|
68
101
|
## Bind the value to the value manager and report it to the client
|
69
102
|
add( msg )
|
70
|
-
|
103
|
+
|
71
104
|
## storage for validator bindings
|
72
105
|
@members = {}
|
73
|
-
|
106
|
+
|
74
107
|
end
|
75
|
-
|
76
|
-
# Binds the value to
|
77
|
-
#
|
108
|
+
|
109
|
+
# Binds the value to a responder. The responder is an instance of {Plugins::Plugin__ Plugin} or {Plugins::GUIPlugin__ GUIPlugin}.
|
110
|
+
# Responders are called once, when the client requests the data to be changed.
|
111
|
+
# Responders must return +true+, if they accept the change. Otherwise the data is treated as invalid.
|
112
|
+
# Responders must respond to exactly two parameters: ( (Message) +msg+, (HValue) +value+ )
|
78
113
|
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
114
|
+
# @param [Symbol] plugin_name The name of the registered plugin to call with the +method_name+
|
115
|
+
# @param [Symbol] method_name The name of the method of the registered plugin +plugin_name+ to call.
|
116
|
+
# @return [true]
|
82
117
|
def bind( plugin_name, method_name )
|
118
|
+
plugin_name = plugin_name.to_sym unless plugin_name.class == Symbol
|
119
|
+
method_name = method_name.to_sym unless method_name.class == Symbol
|
83
120
|
@members[plugin_name] = [] unless @members.has_key?( plugin_name )
|
84
121
|
@members[plugin_name].push( method_name ) unless @members[plugin_name].include?( method_name )
|
85
122
|
return true
|
86
123
|
end
|
87
|
-
|
88
|
-
# Releases the
|
89
|
-
#
|
124
|
+
|
125
|
+
# 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
|
+
# @param [Symbol] plugin_name The name of the plugin acting as a responder to the value.
|
127
|
+
# @param [Symbol] method_name The name of the method of the plugin acting as a responder to the value.
|
128
|
+
# @return [Boolean] Returns true, if successful, false if not bound or other error.
|
90
129
|
def release( plugin_name=false, method_name=false )
|
130
|
+
plugin_name = plugin_name.to_sym if plugin_name.class == String
|
131
|
+
method_name = method_name.to_sym if method_name.class == String
|
91
132
|
return release_all if not plugin_name and not method_name
|
92
133
|
return false unless @members.has_key?( plugin_name )
|
93
134
|
if not method_name
|
@@ -97,17 +138,18 @@ module RSence
|
|
97
138
|
end
|
98
139
|
return true
|
99
140
|
end
|
100
|
-
|
101
|
-
|
141
|
+
|
142
|
+
# Releases all responders.
|
143
|
+
# @return [true]
|
102
144
|
def release_all
|
103
145
|
@members = {}
|
104
146
|
return true
|
105
147
|
end
|
106
|
-
|
107
|
-
#
|
148
|
+
|
149
|
+
# @deprecated Use {#release} as the opposite to bind.
|
108
150
|
alias unbind release
|
109
|
-
|
110
|
-
# Tell all bound instances that the value is changed.
|
151
|
+
|
152
|
+
# @private Tell all bound instances that the value is changed.
|
111
153
|
def tell( msg )
|
112
154
|
invalid_count = 0
|
113
155
|
@members.each_key do |plugin_name|
|
@@ -117,85 +159,93 @@ module RSence
|
|
117
159
|
end
|
118
160
|
if invalid_count == 0
|
119
161
|
@is_valid = true
|
120
|
-
msg.session[:values][:check].delete( @
|
162
|
+
msg.session[:values][:check].delete( @value_id )
|
121
163
|
end
|
122
164
|
end
|
123
|
-
|
124
|
-
# Handle client updates.
|
125
|
-
def from_client( msg, data )
|
126
165
|
|
166
|
+
# @private Handle updates from the client.
|
167
|
+
def from_client( msg, data )
|
168
|
+
|
127
169
|
# only process changes, if different from the one already stored.
|
128
170
|
if @data != data
|
129
|
-
|
171
|
+
|
130
172
|
## set takes care of the setting..
|
131
173
|
@data = data
|
132
|
-
|
174
|
+
|
133
175
|
## change the valid state, because the value was set by the client!
|
134
176
|
@is_valid = false
|
135
|
-
|
177
|
+
|
136
178
|
## add the id to the values to be checked
|
137
179
|
check_ids = msg.session[:values][:check]
|
138
|
-
unless check_ids.include?( @
|
139
|
-
check_ids.push( @
|
180
|
+
unless check_ids.include?( @value_id )
|
181
|
+
check_ids.push( @value_id )
|
140
182
|
end
|
141
183
|
end
|
142
|
-
|
184
|
+
|
143
185
|
end
|
144
|
-
|
186
|
+
|
187
|
+
# @private Adds the value to the sync array.
|
145
188
|
def add_to_sync( msg )
|
146
|
-
## add the id to the values to be
|
189
|
+
## add the id to the values to be synchronized (to client)
|
147
190
|
sync_ids = msg.session[:values][:sync]
|
148
|
-
unless sync_ids.include?( @
|
149
|
-
sync_ids.push( @
|
191
|
+
unless sync_ids.include?( @value_id )
|
192
|
+
sync_ids.push( @value_id )
|
150
193
|
end
|
151
194
|
end
|
152
|
-
|
153
|
-
# Sets the data.
|
154
|
-
def set( msg, data, dont_tell_client=false )
|
155
195
|
|
196
|
+
# Sets the data of the value, the change will be synced with the client.
|
197
|
+
# @param [Message] msg The {Message} instance.
|
198
|
+
# @param [#to_json] data Any data that can be mapped to JSON and handled by the client.
|
199
|
+
# @param [Boolean] dont_tell_client Doesn't notify the client about the change, if true.
|
200
|
+
def set( msg, data, dont_tell_client=false )
|
201
|
+
|
156
202
|
@data = data
|
157
|
-
|
203
|
+
|
158
204
|
# won't tell the client about the change, usually not needed
|
159
205
|
unless dont_tell_client
|
160
206
|
## update the flags
|
161
207
|
@sync = false
|
162
208
|
@is_valid = true
|
163
|
-
|
209
|
+
|
164
210
|
add_to_sync( msg )
|
165
211
|
end
|
166
212
|
end
|
167
|
-
|
168
|
-
# Tell the client that the value changed.
|
213
|
+
|
214
|
+
# @private Tell the client that the value changed.
|
169
215
|
def to_client( msg )
|
170
216
|
if @is_new_to_client
|
171
217
|
## Initialize a new client value
|
172
|
-
init_str = "COMM.Values.create(#{@
|
218
|
+
init_str = "COMM.Values.create(#{@value_id.to_json},#{@data.to_json});"
|
173
219
|
msg.reply_value( init_str )
|
174
220
|
@is_new_to_client = false
|
175
221
|
else
|
176
222
|
## Sets the client value
|
177
|
-
msg.reply_value "HVM.s(#{@
|
223
|
+
msg.reply_value "HVM.s(#{@value_id.to_json},#{@data.to_json});"
|
178
224
|
end
|
179
225
|
end
|
180
|
-
|
181
|
-
# Clean up self.
|
182
|
-
def die( msg=false )
|
183
226
|
|
227
|
+
# Destructor method. If msg is supplied, deletes the client representation too.
|
228
|
+
# @param [false, Message] A {Message} instance. When supplied, deletes the client representation.
|
229
|
+
def die!( msg=false )
|
230
|
+
|
184
231
|
release_all
|
185
|
-
|
232
|
+
|
186
233
|
# get the value storage from the session data
|
187
234
|
session_values = msg.session[:values][:by_id]
|
188
|
-
|
235
|
+
|
189
236
|
## Store the object here
|
190
|
-
session_values.delete( @
|
191
|
-
|
237
|
+
session_values.delete( @value_id )
|
238
|
+
|
192
239
|
if msg and not @is_new_to_client
|
193
|
-
msg.reply_value("HVM.del(#{@
|
240
|
+
msg.reply_value("HVM.del(#{@value_id.to_json});")
|
194
241
|
end
|
195
242
|
end
|
196
|
-
|
243
|
+
alias die die!
|
244
|
+
|
197
245
|
end
|
198
246
|
|
247
|
+
|
248
|
+
=begin
|
199
249
|
class UploadValue < HValue
|
200
250
|
|
201
251
|
@state_responders = {
|
@@ -217,10 +267,10 @@ module RSence
|
|
217
267
|
## change the valid state, because the value was set by the client!
|
218
268
|
@is_valid = data.include?(':::')
|
219
269
|
|
220
|
-
# the state and key are separated by the ':::'
|
270
|
+
# the state and key are separated by the ':::' delimiter string
|
221
271
|
if @is_valid
|
222
272
|
|
223
|
-
# split state and key using the
|
273
|
+
# split state and key using the delimiter
|
224
274
|
(upload_state, upload_key) = data.split(':::')
|
225
275
|
|
226
276
|
# the state is a number
|
@@ -233,19 +283,19 @@ module RSence
|
|
233
283
|
if upload_state < 0
|
234
284
|
# "upload error: #{upload_state}"
|
235
285
|
# (parse the error)
|
236
|
-
unless @
|
286
|
+
unless @state_responders[:error].empty?
|
237
287
|
@state_responders[:error].each do |plugin_name,method_name|
|
238
288
|
msg.run( plugin_name,method_name,msg,self,upload_state )
|
239
289
|
end
|
240
290
|
end
|
241
291
|
|
242
|
-
# the default state, 0 means the
|
292
|
+
# the default state, 0 means the UI is ready to send an
|
243
293
|
# upload and ticketserve is ready to receive it
|
244
294
|
elsif upload_state == 0
|
245
295
|
# "upload state: ready to upload."
|
246
296
|
# (do nothing)
|
247
297
|
|
248
|
-
unless @
|
298
|
+
unless @state_responders[:ready].empty?
|
249
299
|
@state_responders[:ready].each do |plugin_name,method_name|
|
250
300
|
msg.run( plugin_name,method_name,msg,self,upload_state )
|
251
301
|
end
|
@@ -256,7 +306,7 @@ module RSence
|
|
256
306
|
# "upload state: upload started."
|
257
307
|
# (show progress bar)
|
258
308
|
|
259
|
-
unless @
|
309
|
+
unless @state_responders[:started].empty?
|
260
310
|
@state_responders[:started].each do |plugin_name,method_name|
|
261
311
|
msg.run( plugin_name,method_name,msg,self,upload_state )
|
262
312
|
end
|
@@ -278,8 +328,8 @@ module RSence
|
|
278
328
|
|
279
329
|
## add the id to the values to be checked
|
280
330
|
check_ids = msg.session[:values][:check]
|
281
|
-
unless check_ids.include?( @
|
282
|
-
check_ids.push( @
|
331
|
+
unless check_ids.include?( @value_id )
|
332
|
+
check_ids.push( @value_id )
|
283
333
|
end
|
284
334
|
|
285
335
|
end
|
@@ -321,6 +371,7 @@ module RSence
|
|
321
371
|
hvalue.set( msg, upload_key )
|
322
372
|
end
|
323
373
|
end
|
374
|
+
=end
|
324
375
|
|
325
376
|
end
|
326
377
|
|