rsence 2.0.0.0.pre
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.
- data/INSTALL.rdoc +295 -0
- data/LICENSE +622 -0
- data/README.rdoc +24 -0
- data/VERSION +1 -0
- data/bin/build_client.rb +254 -0
- data/bin/help +6 -0
- data/bin/launch.rb +120 -0
- data/bin/rdoc.sh +2 -0
- data/bin/restart +6 -0
- data/bin/rsence +120 -0
- data/bin/run +6 -0
- data/bin/run.rb +6 -0
- data/bin/save +6 -0
- data/bin/start +6 -0
- data/bin/status +6 -0
- data/bin/stop +6 -0
- data/conf/config.ru +5 -0
- data/conf/default_conf.yaml +337 -0
- data/conf/default_strings.yaml +77 -0
- data/conf/local_conf.yaml +14 -0
- data/conf/unicorn.conf +78 -0
- data/js/comm/comm/autosync/autosync.js +18 -0
- data/js/comm/comm/autosync/js.inc +0 -0
- data/js/comm/comm/comm.js +195 -0
- data/js/comm/comm/js.inc +0 -0
- data/js/comm/comm/queue/js.inc +0 -0
- data/js/comm/comm/queue/queue.js +183 -0
- data/js/comm/comm/session/js.inc +0 -0
- data/js/comm/comm/session/session.js +51 -0
- data/js/comm/comm/sessionwatcher/js.inc +0 -0
- data/js/comm/comm/sessionwatcher/sessionwatcher.js +43 -0
- data/js/comm/comm/transporter/js.inc +0 -0
- data/js/comm/comm/transporter/transporter.js +257 -0
- data/js/comm/comm/urlresponder/js.inc +0 -0
- data/js/comm/comm/urlresponder/urlresponder.js +148 -0
- data/js/comm/comm/values/js.inc +0 -0
- data/js/comm/comm/values/values.js +432 -0
- data/js/comm/jsloader/js.inc +0 -0
- data/js/comm/jsloader/jsloader.js +114 -0
- data/js/comm/reloadapp/js.inc +0 -0
- data/js/comm/reloadapp/reloadapp.js +150 -0
- data/js/comm/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
- data/js/comm/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/js/comm/sha/js.inc +0 -0
- data/js/comm/sha/sha.js +432 -0
- data/js/comm/values/value/js.inc +0 -0
- data/js/comm/values/value/value.js +182 -0
- data/js/comm/values/valuematrix/js.inc +0 -0
- data/js/comm/values/valuematrix/valuematrix.js +138 -0
- data/js/controls/button/button.js +57 -0
- data/js/controls/button/js.inc +0 -0
- data/js/controls/button/themes/bright/button.css +89 -0
- data/js/controls/button/themes/bright/button.html +7 -0
- data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/bright/button_parts1.png +0 -0
- data/js/controls/button/themes/default/button.css +89 -0
- data/js/controls/button/themes/default/button.html +7 -0
- data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
- data/js/controls/button/themes/default/button_parts1.png +0 -0
- data/js/controls/checkbox/checkbox.js +47 -0
- data/js/controls/checkbox/js.inc +0 -0
- data/js/controls/checkbox/themes/default/checkbox.css +69 -0
- data/js/controls/checkbox/themes/default/checkbox.html +5 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
- data/js/controls/datetime/calendar/calendar.js +197 -0
- data/js/controls/datetime/calendar/js.inc +0 -0
- data/js/controls/datetime/calendar/themes/default/calendar.css +108 -0
- data/js/controls/datetime/calendar/themes/default/calendar.html +9 -0
- data/js/controls/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
- data/js/controls/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/controls/datetime/datetimevalue/datetimevalue.js +246 -0
- data/js/controls/datetime/datetimevalue/js.inc +0 -0
- data/js/controls/datetime/timesheet/js.inc +0 -0
- data/js/controls/datetime/timesheet/themes/default/timesheet.css +30 -0
- data/js/controls/datetime/timesheet/themes/default/timesheet.html +2 -0
- data/js/controls/datetime/timesheet/timesheet.js +182 -0
- data/js/controls/datetime/timesheet_item/js.inc +0 -0
- data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
- data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
- data/js/controls/datetime/timesheet_item/timesheet_item.js +247 -0
- data/js/controls/datetime/timesheet_item_edit/js.inc +0 -0
- data/js/controls/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
- data/js/controls/dialogs/alert_sheet/alert_sheet.js +62 -0
- data/js/controls/dialogs/alert_sheet/js.inc +0 -0
- data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +36 -0
- data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/js.inc +0 -0
- data/js/controls/dialogs/sheet/sheet.js +83 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
- data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
- data/js/controls/imageview/imageview.js +108 -0
- data/js/controls/imageview/js.inc +0 -0
- data/js/controls/imageview/themes/default/blank.gif +0 -0
- data/js/controls/lists/checkboxlist/checkboxlist.js +170 -0
- data/js/controls/lists/checkboxlist/js.inc +0 -0
- data/js/controls/lists/listitems/js.inc +0 -0
- data/js/controls/lists/listitems/listitems.js +65 -0
- data/js/controls/lists/radiobuttonlist/js.inc +0 -0
- data/js/controls/lists/radiobuttonlist/radiobuttonlist.js +126 -0
- data/js/controls/passwordcontrol/js.inc +0 -0
- data/js/controls/passwordcontrol/passwordcontrol.js +22 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
- data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
- data/js/controls/progress/progressbar/js.inc +0 -0
- data/js/controls/progress/progressbar/progressbar.js +36 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
- data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
- data/js/controls/progress/progressindicator/js.inc +0 -0
- data/js/controls/progress/progressindicator/progressindicator.js +43 -0
- data/js/controls/radiobutton/js.inc +0 -0
- data/js/controls/radiobutton/radiobutton.js +41 -0
- data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
- data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
- data/js/controls/sliders/slider/js.inc +0 -0
- data/js/controls/sliders/slider/slider.js +356 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
- data/js/controls/sliders/slider/themes/default/slider.css +108 -0
- data/js/controls/sliders/slider/themes/default/slider.html +5 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
- data/js/controls/sliders/vslider/js.inc +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
- data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
- data/js/controls/sliders/vslider/vslider.js +40 -0
- data/js/controls/stepper/js.inc +0 -0
- data/js/controls/stepper/stepper.js +212 -0
- data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
- data/js/controls/stepper/themes/default/stepper.css +14 -0
- data/js/controls/stepper/themes/default/stepper.html +2 -0
- data/js/controls/stepper/themes/default/stepper.png +0 -0
- data/js/controls/stringview/js.inc +0 -0
- data/js/controls/stringview/stringview.js +49 -0
- data/js/controls/stringview/themes/default/stringview.css +8 -0
- data/js/controls/stringview/themes/default/stringview.html +1 -0
- data/js/controls/tab/js.inc +0 -0
- data/js/controls/tab/tab.js +276 -0
- data/js/controls/tab/themes/bright/tab.css +76 -0
- data/js/controls/tab/themes/bright/tab.html +6 -0
- data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
- data/js/controls/tab/themes/default/tab.css +77 -0
- data/js/controls/tab/themes/default/tab.html +6 -0
- data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
- data/js/controls/tab/themes/default/tab_parts1.png +0 -0
- data/js/controls/textarea/js.inc +0 -0
- data/js/controls/textarea/textarea.js +23 -0
- data/js/controls/textarea/themes/default/textarea.css +21 -0
- data/js/controls/textarea/themes/default/textarea.html +18 -0
- data/js/controls/textcontrol/js.inc +0 -0
- data/js/controls/textcontrol/textcontrol.js +372 -0
- data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
- data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
- data/js/controls/uploader/js.inc +0 -0
- data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
- data/js/controls/uploader/themes/default/uploader.css +108 -0
- data/js/controls/uploader/themes/default/uploader.html +27 -0
- data/js/controls/uploader/uploader.js +153 -0
- data/js/controls/validatorview/js.inc +0 -0
- data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
- data/js/controls/validatorview/themes/default/validator.png +0 -0
- data/js/controls/validatorview/themes/default/validatorview.css +0 -0
- data/js/controls/validatorview/themes/default/validatorview.html +0 -0
- data/js/controls/validatorview/validatorview.js +55 -0
- data/js/controls/window/js.inc +0 -0
- data/js/controls/window/themes/default/window.css +219 -0
- data/js/controls/window/themes/default/window.html +17 -0
- data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_active.png +0 -0
- data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
- data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_buttons.png +0 -0
- data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts1.png +0 -0
- data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
- data/js/controls/window/themes/default/window_parts2.png +0 -0
- data/js/controls/window/window.js +284 -0
- data/js/core/class/class.js +317 -0
- data/js/core/class/js.inc +0 -0
- data/js/core/elem/elem.js +1376 -0
- data/js/core/elem/js.inc +0 -0
- data/js/core/event/event.js +1021 -0
- data/js/core/event/js.inc +0 -0
- data/js/core/iefix/ie_css_element.htc +5 -0
- data/js/core/iefix/ie_css_style.htc +5 -0
- data/js/core/iefix/iefix.js +359 -0
- data/js/core/iefix/js.inc +0 -0
- data/js/debugg/debugg.js +43 -0
- data/js/debugg/js.inc +0 -0
- data/js/foundation/application/application.js +209 -0
- data/js/foundation/application/js.inc +0 -0
- data/js/foundation/control/control.js +342 -0
- data/js/foundation/control/controldefaults/controldefaults.js +59 -0
- data/js/foundation/control/controldefaults/js.inc +0 -0
- data/js/foundation/control/dummyvalue/dummyvalue.js +50 -0
- data/js/foundation/control/dummyvalue/js.inc +0 -0
- data/js/foundation/control/dyncontrol/dyncontrol.js +494 -0
- data/js/foundation/control/dyncontrol/js.inc +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
- data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
- data/js/foundation/control/eventresponder/eventresponder.js +713 -0
- data/js/foundation/control/eventresponder/js.inc +0 -0
- data/js/foundation/control/js.inc +0 -0
- data/js/foundation/control/valueresponder/js.inc +0 -0
- data/js/foundation/control/valueresponder/valueresponder.js +77 -0
- data/js/foundation/geom/point/js.inc +0 -0
- data/js/foundation/geom/point/point.js +202 -0
- data/js/foundation/geom/rect/js.inc +0 -0
- data/js/foundation/geom/rect/rect.js +610 -0
- data/js/foundation/json_renderer/js.inc +0 -0
- data/js/foundation/json_renderer/json_renderer.js +231 -0
- data/js/foundation/system/js.inc +0 -0
- data/js/foundation/system/system.js +369 -0
- data/js/foundation/thememanager/js.inc +0 -0
- data/js/foundation/thememanager/thememanager.js +387 -0
- data/js/foundation/view/js.inc +0 -0
- data/js/foundation/view/markupview/js.inc +0 -0
- data/js/foundation/view/markupview/markupview.js +113 -0
- data/js/foundation/view/morphanimation/js.inc +0 -0
- data/js/foundation/view/morphanimation/morphanimation.js +236 -0
- data/js/foundation/view/view.js +1804 -0
- data/js/foundation/view/viewdefaults/js.inc +0 -0
- data/js/foundation/view/viewdefaults/viewdefaults.js +25 -0
- data/js/views/centerview/centerview.js +45 -0
- data/js/views/centerview/js.inc +0 -0
- data/js/views/inlineview/inlineview.js +14 -0
- data/js/views/inlineview/js.inc +0 -0
- data/js/views/scrollview/js.inc +0 -0
- data/js/views/scrollview/scrollview.js +39 -0
- data/lib/conf/default.rb +220 -0
- data/lib/conf/wizard.rb +303 -0
- data/lib/daemon/daemon.rb +293 -0
- data/lib/http/broker.rb +102 -0
- data/lib/http/rackup.rb +88 -0
- data/lib/http/request.rb +69 -0
- data/lib/http/response.rb +63 -0
- data/lib/plugins/gui_plugin.rb +129 -0
- data/lib/plugins/guiparser.rb +114 -0
- data/lib/plugins/plugin.rb +652 -0
- data/lib/plugins/plugin_plugins.rb +47 -0
- data/lib/plugins/plugin_sqlite_db.rb +72 -0
- data/lib/plugins/plugin_util.rb +96 -0
- data/lib/plugins/pluginmanager.rb +517 -0
- data/lib/plugins/servlet.rb +69 -0
- data/lib/session/msg.rb +291 -0
- data/lib/session/sessionmanager.rb +491 -0
- data/lib/session/sessionstorage.rb +314 -0
- data/lib/transporter/transporter.rb +254 -0
- data/lib/util/gzstring.rb +5 -0
- data/lib/values/hvalue.rb +323 -0
- data/lib/values/valuemanager.rb +152 -0
- data/plugins/client_pkg/client_pkg.rb +186 -0
- data/plugins/client_pkg/info.yaml +25 -0
- data/plugins/client_pkg/lib/client_pkg_build.rb +569 -0
- data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
- data/plugins/client_pkg/lib/client_pkg_serve.rb +210 -0
- data/plugins/client_pkg/log/build_log +0 -0
- data/plugins/index_html/img/loading.gif +0 -0
- data/plugins/index_html/img/riassence.gif +0 -0
- data/plugins/index_html/index_html.rb +150 -0
- data/plugins/index_html/tmpl/index.html +22 -0
- data/plugins/index_html/tmpl/startup_index.html +29 -0
- data/plugins/legacy/disabled +0 -0
- data/plugins/legacy/disabled- +0 -0
- data/plugins/legacy/info.yaml +22 -0
- data/plugins/legacy/legacy.rb +15 -0
- data/plugins/main/js/riassence_ns.js +87 -0
- data/plugins/main/main.rb +234 -0
- data/plugins/main/values.yaml +8 -0
- data/plugins/ticketservices/lib/common.rb +300 -0
- data/plugins/ticketservices/lib/favicon.rb +38 -0
- data/plugins/ticketservices/lib/file.rb +58 -0
- data/plugins/ticketservices/lib/img.rb +50 -0
- data/plugins/ticketservices/lib/objblob.rb +66 -0
- data/plugins/ticketservices/lib/rsrc.rb +34 -0
- data/plugins/ticketservices/lib/upload.rb +206 -0
- data/plugins/ticketservices/ticketservices.rb +268 -0
- data/var/db/.git_include +0 -0
- data/var/log/.git_include +0 -0
- data/var/run/.git_include +0 -0
- metadata +390 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
## Riassence Framework
|
|
2
|
+
# Copyright 2006 Riassence Inc.
|
|
3
|
+
# http://riassence.com/
|
|
4
|
+
#
|
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module RSence
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## HValue is the server-side representation of the client's HValue object.
|
|
14
|
+
## It's the 'messenger' to syncronize server-client data and is smart enough
|
|
15
|
+
## to validate and process itself as well as tell the client-side
|
|
16
|
+
## representation of itself.
|
|
17
|
+
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
|
+
|
|
25
|
+
# get the value storage from the session data
|
|
26
|
+
session_values = msg.session[:values][:by_id]
|
|
27
|
+
|
|
28
|
+
## Store the object here
|
|
29
|
+
session_values[ @val_id ] = self
|
|
30
|
+
|
|
31
|
+
## Sends the client-side description
|
|
32
|
+
restore( msg )
|
|
33
|
+
|
|
34
|
+
## Set the valid flag, so we know that the value is initially in sync
|
|
35
|
+
@valid = true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
## (Re-)Send the client-size representation
|
|
39
|
+
def restore( msg )
|
|
40
|
+
|
|
41
|
+
## Tags itself as a new value from the client's point of view
|
|
42
|
+
@is_new_to_client = true
|
|
43
|
+
|
|
44
|
+
add_to_sync( msg )
|
|
45
|
+
|
|
46
|
+
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 )
|
|
51
|
+
|
|
52
|
+
## Get an unique integer id for the value
|
|
53
|
+
@val_id = msg.valuemanager.randgen.gen
|
|
54
|
+
|
|
55
|
+
## set the data of the hvalue
|
|
56
|
+
set( msg, data, true )
|
|
57
|
+
|
|
58
|
+
## the @sync flag is raised, when the client data is older than the server data
|
|
59
|
+
@sync = false
|
|
60
|
+
|
|
61
|
+
## the @is_valid flas is lowered, when the client data is newer than the server data
|
|
62
|
+
@is_valid = true
|
|
63
|
+
|
|
64
|
+
## Bind the value to the value manager and report it to the client
|
|
65
|
+
add( msg )
|
|
66
|
+
|
|
67
|
+
## storage for validator bindings
|
|
68
|
+
@members = {}
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Binds the value to the plugin method (both as
|
|
73
|
+
# strings; plugin as the name registered in PluginManager)
|
|
74
|
+
#
|
|
75
|
+
# It uses strings instead of '...method(...)' because
|
|
76
|
+
# it won't work with marshal. Strings are easier and work
|
|
77
|
+
# as well.
|
|
78
|
+
def bind( plugin_name, method_name )
|
|
79
|
+
@members[plugin_name] = [] unless @members.has_key?( plugin_name )
|
|
80
|
+
@members[plugin_name].push( method_name ) unless @members[plugin_name].include?( method_name )
|
|
81
|
+
return true
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Releases the binding of the value, both params as
|
|
85
|
+
# in bind, but optional (false = 'wildcard')
|
|
86
|
+
def release( plugin_name=false, method_name=false )
|
|
87
|
+
return release_all if not plugin_name and not method_name
|
|
88
|
+
return false unless @members.has_key?( plugin_name )
|
|
89
|
+
if not method_name
|
|
90
|
+
@members.delete( plugin_name )
|
|
91
|
+
else
|
|
92
|
+
@members[plugin_name].slice!(@members[plugin_name].index( method_name )) if @members[plugin_name].include?(method_name)
|
|
93
|
+
end
|
|
94
|
+
return true
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
## Releases all members.
|
|
98
|
+
def release_all
|
|
99
|
+
@members = {}
|
|
100
|
+
return true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# The unbind method can be used as an alias to release (as in the client).
|
|
104
|
+
alias unbind release
|
|
105
|
+
|
|
106
|
+
# Tell all bound instances that the value is changed.
|
|
107
|
+
def tell( msg )
|
|
108
|
+
invalid_count = 0
|
|
109
|
+
@members.each_key do |plugin_name|
|
|
110
|
+
@members[plugin_name].each do |method_name|
|
|
111
|
+
invalid_count += 1 unless msg.plugins.run_plugin( plugin_name, method_name, msg, self )
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
if invalid_count == 0
|
|
115
|
+
@is_valid = true
|
|
116
|
+
msg.session[:values][:check].delete( @val_id )
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Handle client updates.
|
|
121
|
+
def from_client( msg, data )
|
|
122
|
+
|
|
123
|
+
# only process changes, if different from the one already stored.
|
|
124
|
+
if @data != data
|
|
125
|
+
|
|
126
|
+
## set takes care of the setting..
|
|
127
|
+
@data = data
|
|
128
|
+
|
|
129
|
+
## change the valid state, because the value was set by the client!
|
|
130
|
+
@is_valid = false
|
|
131
|
+
|
|
132
|
+
## add the id to the values to be checked
|
|
133
|
+
check_ids = msg.session[:values][:check]
|
|
134
|
+
unless check_ids.include?( @val_id )
|
|
135
|
+
check_ids.push( @val_id )
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def add_to_sync( msg )
|
|
142
|
+
## add the id to the values to be syncronized (to client)
|
|
143
|
+
sync_ids = msg.session[:values][:sync]
|
|
144
|
+
unless sync_ids.include?( @val_id )
|
|
145
|
+
sync_ids.push( @val_id )
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Sets the data.
|
|
150
|
+
def set( msg, data, dont_tell_client=false )
|
|
151
|
+
|
|
152
|
+
@data = data
|
|
153
|
+
|
|
154
|
+
# won't tell the client about the change, usually not needed
|
|
155
|
+
unless dont_tell_client
|
|
156
|
+
## update the flags
|
|
157
|
+
@sync = false
|
|
158
|
+
@is_valid = true
|
|
159
|
+
|
|
160
|
+
add_to_sync( msg )
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Tell the client that the value changed.
|
|
165
|
+
def to_client( msg )
|
|
166
|
+
if @is_new_to_client
|
|
167
|
+
## Initialize a new client value
|
|
168
|
+
init_str = "COMM.Values.create(#{@val_id.to_json},#{@data.to_json});"
|
|
169
|
+
msg.reply_value( init_str )
|
|
170
|
+
@is_new_to_client = false
|
|
171
|
+
else
|
|
172
|
+
## Sets the client value
|
|
173
|
+
msg.reply_value "HVM.s(#{@val_id.to_json},#{@data.to_json});"
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Clean up self.
|
|
178
|
+
def die( msg=false )
|
|
179
|
+
|
|
180
|
+
release_all
|
|
181
|
+
|
|
182
|
+
# get the value storage from the session data
|
|
183
|
+
session_values = msg.session[:values][:by_id]
|
|
184
|
+
|
|
185
|
+
## Store the object here
|
|
186
|
+
session_values.delete( @val_id )
|
|
187
|
+
|
|
188
|
+
if msg and not @is_new_to_client
|
|
189
|
+
msg.reply_value("HVM.del(#{@val_id.to_json});")
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class UploadValue < HValue
|
|
196
|
+
|
|
197
|
+
@state_responders = {
|
|
198
|
+
:ready => [], # id == 0
|
|
199
|
+
:started => [], # id == 1
|
|
200
|
+
:process => [], # id == 2 ; also uses bind
|
|
201
|
+
3 => [], # id == 3
|
|
202
|
+
4 => [], # id == 4
|
|
203
|
+
:error => [] # id < 0
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@upload_state = 0
|
|
207
|
+
@upload_key = ''
|
|
208
|
+
@uploads = []
|
|
209
|
+
|
|
210
|
+
# the data should contain both state and key in the value
|
|
211
|
+
def from_client( msg, data )
|
|
212
|
+
|
|
213
|
+
## change the valid state, because the value was set by the client!
|
|
214
|
+
@is_valid = data.include?(':::')
|
|
215
|
+
|
|
216
|
+
# the state and key are separated by the ':::' delimitter string
|
|
217
|
+
if @is_valid
|
|
218
|
+
|
|
219
|
+
# split state and key using the delimitter
|
|
220
|
+
(upload_state, upload_key) = data.split(':::')
|
|
221
|
+
|
|
222
|
+
# the state is a number
|
|
223
|
+
upload_state = upload_state.to_i
|
|
224
|
+
|
|
225
|
+
@upload_state = upload_state
|
|
226
|
+
@upload_key = upload_key
|
|
227
|
+
|
|
228
|
+
# negative states are errors
|
|
229
|
+
if upload_state < 0
|
|
230
|
+
# "upload error: #{upload_state}"
|
|
231
|
+
# (parse the error)
|
|
232
|
+
unless @state_respders[:error].empty?
|
|
233
|
+
@state_responders[:error].each do |plugin_name,method_name|
|
|
234
|
+
msg.run( plugin_name,method_name,msg,self,upload_state )
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# the default state, 0 means the ui is ready to send an
|
|
239
|
+
# upload and ticketserve is ready to receive it
|
|
240
|
+
elsif upload_state == 0
|
|
241
|
+
# "upload state: ready to upload."
|
|
242
|
+
# (do nothing)
|
|
243
|
+
|
|
244
|
+
unless @state_respders[:ready].empty?
|
|
245
|
+
@state_responders[:ready].each do |plugin_name,method_name|
|
|
246
|
+
msg.run( plugin_name,method_name,msg,self,upload_state )
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# this state means the upload's transfer is started and progressing
|
|
251
|
+
elsif upload_state == 1
|
|
252
|
+
# "upload state: upload started."
|
|
253
|
+
# (show progress bar)
|
|
254
|
+
|
|
255
|
+
unless @state_respders[:started].empty?
|
|
256
|
+
@state_responders[:started].each do |plugin_name,method_name|
|
|
257
|
+
msg.run( plugin_name,method_name,msg,self,upload_state )
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# this state means the upload's transfer is complete,
|
|
262
|
+
# but the uploaded data hasn't been handled yet.
|
|
263
|
+
elsif upload_state == 2
|
|
264
|
+
# "upload state: waiting to process."
|
|
265
|
+
|
|
266
|
+
uploads = msg.plugins[:ticketservices].get_uploads(upload_key,true)
|
|
267
|
+
if uploads.size == 1
|
|
268
|
+
uploaded_data = uploads[0]
|
|
269
|
+
|
|
270
|
+
# only process changes, if different from the one already stored.
|
|
271
|
+
if uploaded_data != @data
|
|
272
|
+
|
|
273
|
+
@data = uploaded_data
|
|
274
|
+
|
|
275
|
+
## add the id to the values to be checked
|
|
276
|
+
check_ids = msg.session[:values][:check]
|
|
277
|
+
unless check_ids.include?( @val_id )
|
|
278
|
+
check_ids.push( @val_id )
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
end
|
|
282
|
+
msg.plugins[:ticketservices].del_uploads(upload_key,msg.ses_id)
|
|
283
|
+
else
|
|
284
|
+
# "upload, amount of uploads: #{uploads.size}"
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
#
|
|
288
|
+
hvalue.set(msg,"3:::#{upload_key}")
|
|
289
|
+
|
|
290
|
+
msg.console( "upload state: set to ack" )
|
|
291
|
+
|
|
292
|
+
elsif upload_state == 3
|
|
293
|
+
# "upload state: waiting for user ack."
|
|
294
|
+
# (do nothing)
|
|
295
|
+
|
|
296
|
+
msg.console( "upload state: waiting user ack" )
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
elsif upload_state == 4
|
|
300
|
+
# "upload state: user wants to upload again."
|
|
301
|
+
# (set a new upload key, )
|
|
302
|
+
|
|
303
|
+
msg.console( "upload state: ack, getting new key" )
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
setup_upload( msg, hvalue )
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
else
|
|
310
|
+
# "upload unknown state: #{upload_state.inspect}"
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
return true
|
|
314
|
+
end
|
|
315
|
+
def setup_upload(msg,hvalue,size_bytes=500*1024,accept_mime=/image\/(.*?)/,allow_multi=false)
|
|
316
|
+
upload_key = msg.plugins[:ticketservices].upload_key(msg,hvalue.val_id,size_bytes,accept_mime,allow_multi)
|
|
317
|
+
hvalue.set( msg, upload_key )
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
## Riassence Framework
|
|
2
|
+
# Copyright 2006 Riassence Inc.
|
|
3
|
+
# http://riassence.com/
|
|
4
|
+
#
|
|
5
|
+
# You should have received a copy of the GNU General Public License along
|
|
6
|
+
# with this software package. If not, contact licensing@riassence.com
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Require needed value types (hvalue supports bool/float/int/string)
|
|
11
|
+
require 'values/hvalue'
|
|
12
|
+
|
|
13
|
+
# RandomGenerator produces unique, random values
|
|
14
|
+
require 'randgen'
|
|
15
|
+
|
|
16
|
+
module RSence
|
|
17
|
+
|
|
18
|
+
## ValueManager provides automagic, transparent syncronization of values between client and server.
|
|
19
|
+
class ValueManager
|
|
20
|
+
|
|
21
|
+
attr_accessor :randgen
|
|
22
|
+
|
|
23
|
+
# Initializes the member value handler objects.
|
|
24
|
+
def initialize
|
|
25
|
+
|
|
26
|
+
@config = ::RSence.config[:session_conf]
|
|
27
|
+
|
|
28
|
+
## 'Unique' Random String generator for HValue keys (passed on to the client)
|
|
29
|
+
@randgen = RandGen.new( @config[:key_length] )
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Re-constructs all stored values and sends them to the client
|
|
34
|
+
def resend_session_values( msg )
|
|
35
|
+
|
|
36
|
+
# with disposable keys enabled,
|
|
37
|
+
# sessions restored from cookie_key replace
|
|
38
|
+
# all val_id:s with new ones
|
|
39
|
+
if @config[:disposable_keys]
|
|
40
|
+
|
|
41
|
+
# get the session values
|
|
42
|
+
ses_values = msg.session[:values]
|
|
43
|
+
|
|
44
|
+
# loop through the value id:s
|
|
45
|
+
old_ids = ses_values[:by_id].keys
|
|
46
|
+
old_ids.each do |old_id|
|
|
47
|
+
|
|
48
|
+
# make a new id
|
|
49
|
+
new_id = @randgen.gen
|
|
50
|
+
|
|
51
|
+
# get the hvalue
|
|
52
|
+
val_obj = ses_values[:by_id][old_id]
|
|
53
|
+
|
|
54
|
+
# replace the old id in the hvalue itself
|
|
55
|
+
val_obj.val_id = new_id
|
|
56
|
+
|
|
57
|
+
# re-associate the value with the new id
|
|
58
|
+
ses_values[:by_id][new_id] = val_obj
|
|
59
|
+
ses_values[:by_id].delete(old_id)
|
|
60
|
+
|
|
61
|
+
# replace the id in the unvalidated values (:check) array
|
|
62
|
+
if ses_values[:check].include?(old_id)
|
|
63
|
+
old_idx = ses_values[:check].index(old_id)
|
|
64
|
+
ses_values[:check][old_idx] = new_id
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# replace the id in the unsynchronized values (:sync) array
|
|
68
|
+
if ses_values[:sync].include?(old_id)
|
|
69
|
+
old_idx = ses_values[:sync].index(old_id)
|
|
70
|
+
ses_values[:sync][old_idx] = new_id
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# tell the hvalue to send its client-side initialization
|
|
74
|
+
val_obj.restore( msg )
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
## keeping the id:s between page reloads is faster, but less tamper-proof
|
|
79
|
+
else
|
|
80
|
+
msg.session[:values][:by_id].each_key do |val_id|
|
|
81
|
+
msg.session[:values][:by_id][val_id].restore( msg )
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Parses the json from the client and passes it on to associated values
|
|
88
|
+
def xhr( msg, syncdata_str )
|
|
89
|
+
|
|
90
|
+
# parses the json data sent by the client
|
|
91
|
+
syncdata = JSON.parse( syncdata_str )
|
|
92
|
+
|
|
93
|
+
session_values = msg.session[:values][:by_id]
|
|
94
|
+
syncdata.each do |value_key, value_data|
|
|
95
|
+
if session_values.has_key?( value_key )
|
|
96
|
+
value_obj = session_values[ value_key ]
|
|
97
|
+
value_obj.from_client( msg, value_data )
|
|
98
|
+
else
|
|
99
|
+
raise "HValue; unassigned value id! (#{val_id.inspect})"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Sets a value by id
|
|
105
|
+
def set( msg, val_id, val_data )
|
|
106
|
+
|
|
107
|
+
# get the session data of this session
|
|
108
|
+
session_values = msg.session[:values][:by_id]
|
|
109
|
+
|
|
110
|
+
# tell the value of that id that it has new data
|
|
111
|
+
val_obj = session_values[ val_id ]
|
|
112
|
+
val_obj.set( msg, val_data )
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Validates the new data of all client-side-modified session-bound values
|
|
116
|
+
def validate( msg )
|
|
117
|
+
|
|
118
|
+
# get the session data of this session
|
|
119
|
+
session_values = msg.session[:values]
|
|
120
|
+
|
|
121
|
+
# loop through un-validated values and validate them
|
|
122
|
+
check_ids = session_values[:check]
|
|
123
|
+
check_ids.each do |check_id|
|
|
124
|
+
session_values[:by_id][check_id].tell( msg )
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Sends the new data of all server-side-modified session-bound values to the client
|
|
130
|
+
def sync_client( msg )
|
|
131
|
+
|
|
132
|
+
# get the session data of this session
|
|
133
|
+
session_values = msg.session[:values]
|
|
134
|
+
|
|
135
|
+
# go through the currently un-synced values
|
|
136
|
+
session_values[:sync].size.times do |count_num|
|
|
137
|
+
|
|
138
|
+
# the sync-array will return the value id
|
|
139
|
+
val_id = session_values[:sync].shift
|
|
140
|
+
|
|
141
|
+
# tell the value of that id to report its state to the client
|
|
142
|
+
session_values[:by_id][val_id].to_client( msg )
|
|
143
|
+
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
end
|
|
152
|
+
|