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.
Files changed (311) hide show
  1. data/INSTALL.rdoc +295 -0
  2. data/LICENSE +622 -0
  3. data/README.rdoc +24 -0
  4. data/VERSION +1 -0
  5. data/bin/build_client.rb +254 -0
  6. data/bin/help +6 -0
  7. data/bin/launch.rb +120 -0
  8. data/bin/rdoc.sh +2 -0
  9. data/bin/restart +6 -0
  10. data/bin/rsence +120 -0
  11. data/bin/run +6 -0
  12. data/bin/run.rb +6 -0
  13. data/bin/save +6 -0
  14. data/bin/start +6 -0
  15. data/bin/status +6 -0
  16. data/bin/stop +6 -0
  17. data/conf/config.ru +5 -0
  18. data/conf/default_conf.yaml +337 -0
  19. data/conf/default_strings.yaml +77 -0
  20. data/conf/local_conf.yaml +14 -0
  21. data/conf/unicorn.conf +78 -0
  22. data/js/comm/comm/autosync/autosync.js +18 -0
  23. data/js/comm/comm/autosync/js.inc +0 -0
  24. data/js/comm/comm/comm.js +195 -0
  25. data/js/comm/comm/js.inc +0 -0
  26. data/js/comm/comm/queue/js.inc +0 -0
  27. data/js/comm/comm/queue/queue.js +183 -0
  28. data/js/comm/comm/session/js.inc +0 -0
  29. data/js/comm/comm/session/session.js +51 -0
  30. data/js/comm/comm/sessionwatcher/js.inc +0 -0
  31. data/js/comm/comm/sessionwatcher/sessionwatcher.js +43 -0
  32. data/js/comm/comm/transporter/js.inc +0 -0
  33. data/js/comm/comm/transporter/transporter.js +257 -0
  34. data/js/comm/comm/urlresponder/js.inc +0 -0
  35. data/js/comm/comm/urlresponder/urlresponder.js +148 -0
  36. data/js/comm/comm/values/js.inc +0 -0
  37. data/js/comm/comm/values/values.js +432 -0
  38. data/js/comm/jsloader/js.inc +0 -0
  39. data/js/comm/jsloader/jsloader.js +114 -0
  40. data/js/comm/reloadapp/js.inc +0 -0
  41. data/js/comm/reloadapp/reloadapp.js +150 -0
  42. data/js/comm/reloadapp/themes/default/reloadapp_warning-ie6.gif +0 -0
  43. data/js/comm/reloadapp/themes/default/reloadapp_warning.png +0 -0
  44. data/js/comm/sha/js.inc +0 -0
  45. data/js/comm/sha/sha.js +432 -0
  46. data/js/comm/values/value/js.inc +0 -0
  47. data/js/comm/values/value/value.js +182 -0
  48. data/js/comm/values/valuematrix/js.inc +0 -0
  49. data/js/comm/values/valuematrix/valuematrix.js +138 -0
  50. data/js/controls/button/button.js +57 -0
  51. data/js/controls/button/js.inc +0 -0
  52. data/js/controls/button/themes/bright/button.css +89 -0
  53. data/js/controls/button/themes/bright/button.html +7 -0
  54. data/js/controls/button/themes/bright/button_parts1-ie6.gif +0 -0
  55. data/js/controls/button/themes/bright/button_parts1.png +0 -0
  56. data/js/controls/button/themes/default/button.css +89 -0
  57. data/js/controls/button/themes/default/button.html +7 -0
  58. data/js/controls/button/themes/default/button_parts1-ie6.gif +0 -0
  59. data/js/controls/button/themes/default/button_parts1.png +0 -0
  60. data/js/controls/checkbox/checkbox.js +47 -0
  61. data/js/controls/checkbox/js.inc +0 -0
  62. data/js/controls/checkbox/themes/default/checkbox.css +69 -0
  63. data/js/controls/checkbox/themes/default/checkbox.html +5 -0
  64. data/js/controls/checkbox/themes/default/checkbox_parts1-ie6.gif +0 -0
  65. data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
  66. data/js/controls/datetime/calendar/calendar.js +197 -0
  67. data/js/controls/datetime/calendar/js.inc +0 -0
  68. data/js/controls/datetime/calendar/themes/default/calendar.css +108 -0
  69. data/js/controls/datetime/calendar/themes/default/calendar.html +9 -0
  70. data/js/controls/datetime/calendar/themes/default/calendar_arrows-ie6.gif +0 -0
  71. data/js/controls/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  72. data/js/controls/datetime/datetimevalue/datetimevalue.js +246 -0
  73. data/js/controls/datetime/datetimevalue/js.inc +0 -0
  74. data/js/controls/datetime/timesheet/js.inc +0 -0
  75. data/js/controls/datetime/timesheet/themes/default/timesheet.css +30 -0
  76. data/js/controls/datetime/timesheet/themes/default/timesheet.html +2 -0
  77. data/js/controls/datetime/timesheet/timesheet.js +182 -0
  78. data/js/controls/datetime/timesheet_item/js.inc +0 -0
  79. data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.css +42 -0
  80. data/js/controls/datetime/timesheet_item/themes/default/timesheet_item.html +8 -0
  81. data/js/controls/datetime/timesheet_item/timesheet_item.js +247 -0
  82. data/js/controls/datetime/timesheet_item_edit/js.inc +0 -0
  83. data/js/controls/datetime/timesheet_item_edit/timesheet_item_edit.js +274 -0
  84. data/js/controls/dialogs/alert_sheet/alert_sheet.js +62 -0
  85. data/js/controls/dialogs/alert_sheet/js.inc +0 -0
  86. data/js/controls/dialogs/confirm_sheet/confirm_sheet.js +36 -0
  87. data/js/controls/dialogs/confirm_sheet/js.inc +0 -0
  88. data/js/controls/dialogs/sheet/js.inc +0 -0
  89. data/js/controls/dialogs/sheet/sheet.js +83 -0
  90. data/js/controls/dialogs/sheet/themes/default/sheet.css +64 -0
  91. data/js/controls/dialogs/sheet/themes/default/sheet.html +14 -0
  92. data/js/controls/dialogs/sheet/themes/default/sheet_bg-ie6.gif +0 -0
  93. data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
  94. data/js/controls/dialogs/sheet/themes/default/sheet_dim-ie6.gif +0 -0
  95. data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
  96. data/js/controls/dialogs/sheet/themes/default/sheet_parts1-ie6.gif +0 -0
  97. data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
  98. data/js/controls/dialogs/sheet/themes/default/sheet_parts2-ie6.gif +0 -0
  99. data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
  100. data/js/controls/dialogs/sheet/themes/default/sheet_warning-ie6.gif +0 -0
  101. data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
  102. data/js/controls/imageview/imageview.js +108 -0
  103. data/js/controls/imageview/js.inc +0 -0
  104. data/js/controls/imageview/themes/default/blank.gif +0 -0
  105. data/js/controls/lists/checkboxlist/checkboxlist.js +170 -0
  106. data/js/controls/lists/checkboxlist/js.inc +0 -0
  107. data/js/controls/lists/listitems/js.inc +0 -0
  108. data/js/controls/lists/listitems/listitems.js +65 -0
  109. data/js/controls/lists/radiobuttonlist/js.inc +0 -0
  110. data/js/controls/lists/radiobuttonlist/radiobuttonlist.js +126 -0
  111. data/js/controls/passwordcontrol/js.inc +0 -0
  112. data/js/controls/passwordcontrol/passwordcontrol.js +22 -0
  113. data/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
  114. data/js/controls/passwordcontrol/themes/default/passwordcontrol.html +18 -0
  115. data/js/controls/progress/progressbar/js.inc +0 -0
  116. data/js/controls/progress/progressbar/progressbar.js +36 -0
  117. data/js/controls/progress/progressbar/themes/default/progressbar.css +16 -0
  118. data/js/controls/progress/progressbar/themes/default/progressbar.html +2 -0
  119. data/js/controls/progress/progressindicator/js.inc +0 -0
  120. data/js/controls/progress/progressindicator/progressindicator.js +43 -0
  121. data/js/controls/radiobutton/js.inc +0 -0
  122. data/js/controls/radiobutton/radiobutton.js +41 -0
  123. data/js/controls/radiobutton/themes/default/radiobutton.css +69 -0
  124. data/js/controls/radiobutton/themes/default/radiobutton.html +5 -0
  125. data/js/controls/radiobutton/themes/default/radiobutton_parts1-ie6.gif +0 -0
  126. data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
  127. data/js/controls/sliders/slider/js.inc +0 -0
  128. data/js/controls/sliders/slider/slider.js +356 -0
  129. data/js/controls/sliders/slider/themes/default/hslider_tracks-ie6.gif +0 -0
  130. data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
  131. data/js/controls/sliders/slider/themes/default/slider.css +108 -0
  132. data/js/controls/sliders/slider/themes/default/slider.html +5 -0
  133. data/js/controls/sliders/slider/themes/default/slider_thumbs-ie6.gif +0 -0
  134. data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
  135. data/js/controls/sliders/vslider/js.inc +0 -0
  136. data/js/controls/sliders/vslider/themes/default/vslider.css +52 -0
  137. data/js/controls/sliders/vslider/themes/default/vslider.html +5 -0
  138. data/js/controls/sliders/vslider/themes/default/vslider_tracks-ie6.gif +0 -0
  139. data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
  140. data/js/controls/sliders/vslider/vslider.js +40 -0
  141. data/js/controls/stepper/js.inc +0 -0
  142. data/js/controls/stepper/stepper.js +212 -0
  143. data/js/controls/stepper/themes/default/stepper-ie6.gif +0 -0
  144. data/js/controls/stepper/themes/default/stepper.css +14 -0
  145. data/js/controls/stepper/themes/default/stepper.html +2 -0
  146. data/js/controls/stepper/themes/default/stepper.png +0 -0
  147. data/js/controls/stringview/js.inc +0 -0
  148. data/js/controls/stringview/stringview.js +49 -0
  149. data/js/controls/stringview/themes/default/stringview.css +8 -0
  150. data/js/controls/stringview/themes/default/stringview.html +1 -0
  151. data/js/controls/tab/js.inc +0 -0
  152. data/js/controls/tab/tab.js +276 -0
  153. data/js/controls/tab/themes/bright/tab.css +76 -0
  154. data/js/controls/tab/themes/bright/tab.html +6 -0
  155. data/js/controls/tab/themes/bright/tab_bg_color-ie6.gif +0 -0
  156. data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
  157. data/js/controls/tab/themes/bright/tab_border_pattern-ie6.gif +0 -0
  158. data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
  159. data/js/controls/tab/themes/bright/tab_parts1-ie6.gif +0 -0
  160. data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
  161. data/js/controls/tab/themes/default/tab.css +77 -0
  162. data/js/controls/tab/themes/default/tab.html +6 -0
  163. data/js/controls/tab/themes/default/tab_bg_color-ie6.gif +0 -0
  164. data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
  165. data/js/controls/tab/themes/default/tab_border_pattern-ie6.gif +0 -0
  166. data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
  167. data/js/controls/tab/themes/default/tab_parts1-ie6.gif +0 -0
  168. data/js/controls/tab/themes/default/tab_parts1.png +0 -0
  169. data/js/controls/textarea/js.inc +0 -0
  170. data/js/controls/textarea/textarea.js +23 -0
  171. data/js/controls/textarea/themes/default/textarea.css +21 -0
  172. data/js/controls/textarea/themes/default/textarea.html +18 -0
  173. data/js/controls/textcontrol/js.inc +0 -0
  174. data/js/controls/textcontrol/textcontrol.js +372 -0
  175. data/js/controls/textcontrol/themes/default/textcontrol.css +107 -0
  176. data/js/controls/textcontrol/themes/default/textcontrol.html +18 -0
  177. data/js/controls/textcontrol/themes/default/textcontrol_parts1-ie6.gif +0 -0
  178. data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
  179. data/js/controls/textcontrol/themes/default/textcontrol_parts2-ie6.gif +0 -0
  180. data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
  181. data/js/controls/textcontrol/themes/default/textcontrol_parts3-ie6.gif +0 -0
  182. data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
  183. data/js/controls/uploader/js.inc +0 -0
  184. data/js/controls/uploader/themes/default/upload_progress.gif +0 -0
  185. data/js/controls/uploader/themes/default/uploader.css +108 -0
  186. data/js/controls/uploader/themes/default/uploader.html +27 -0
  187. data/js/controls/uploader/uploader.js +153 -0
  188. data/js/controls/validatorview/js.inc +0 -0
  189. data/js/controls/validatorview/themes/default/validator-ie6.gif +0 -0
  190. data/js/controls/validatorview/themes/default/validator.png +0 -0
  191. data/js/controls/validatorview/themes/default/validatorview.css +0 -0
  192. data/js/controls/validatorview/themes/default/validatorview.html +0 -0
  193. data/js/controls/validatorview/validatorview.js +55 -0
  194. data/js/controls/window/js.inc +0 -0
  195. data/js/controls/window/themes/default/window.css +219 -0
  196. data/js/controls/window/themes/default/window.html +17 -0
  197. data/js/controls/window/themes/default/window_bg_active-ie6.gif +0 -0
  198. data/js/controls/window/themes/default/window_bg_active.png +0 -0
  199. data/js/controls/window/themes/default/window_bg_inactive-ie6.gif +0 -0
  200. data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
  201. data/js/controls/window/themes/default/window_buttons-ie6.gif +0 -0
  202. data/js/controls/window/themes/default/window_buttons.png +0 -0
  203. data/js/controls/window/themes/default/window_parts1-ie6.gif +0 -0
  204. data/js/controls/window/themes/default/window_parts1.png +0 -0
  205. data/js/controls/window/themes/default/window_parts2-ie6.gif +0 -0
  206. data/js/controls/window/themes/default/window_parts2.png +0 -0
  207. data/js/controls/window/window.js +284 -0
  208. data/js/core/class/class.js +317 -0
  209. data/js/core/class/js.inc +0 -0
  210. data/js/core/elem/elem.js +1376 -0
  211. data/js/core/elem/js.inc +0 -0
  212. data/js/core/event/event.js +1021 -0
  213. data/js/core/event/js.inc +0 -0
  214. data/js/core/iefix/ie_css_element.htc +5 -0
  215. data/js/core/iefix/ie_css_style.htc +5 -0
  216. data/js/core/iefix/iefix.js +359 -0
  217. data/js/core/iefix/js.inc +0 -0
  218. data/js/debugg/debugg.js +43 -0
  219. data/js/debugg/js.inc +0 -0
  220. data/js/foundation/application/application.js +209 -0
  221. data/js/foundation/application/js.inc +0 -0
  222. data/js/foundation/control/control.js +342 -0
  223. data/js/foundation/control/controldefaults/controldefaults.js +59 -0
  224. data/js/foundation/control/controldefaults/js.inc +0 -0
  225. data/js/foundation/control/dummyvalue/dummyvalue.js +50 -0
  226. data/js/foundation/control/dummyvalue/js.inc +0 -0
  227. data/js/foundation/control/dyncontrol/dyncontrol.js +494 -0
  228. data/js/foundation/control/dyncontrol/js.inc +0 -0
  229. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.css +0 -0
  230. data/js/foundation/control/dyncontrol/themes/default/dyncontrol.html +0 -0
  231. data/js/foundation/control/eventresponder/eventresponder.js +713 -0
  232. data/js/foundation/control/eventresponder/js.inc +0 -0
  233. data/js/foundation/control/js.inc +0 -0
  234. data/js/foundation/control/valueresponder/js.inc +0 -0
  235. data/js/foundation/control/valueresponder/valueresponder.js +77 -0
  236. data/js/foundation/geom/point/js.inc +0 -0
  237. data/js/foundation/geom/point/point.js +202 -0
  238. data/js/foundation/geom/rect/js.inc +0 -0
  239. data/js/foundation/geom/rect/rect.js +610 -0
  240. data/js/foundation/json_renderer/js.inc +0 -0
  241. data/js/foundation/json_renderer/json_renderer.js +231 -0
  242. data/js/foundation/system/js.inc +0 -0
  243. data/js/foundation/system/system.js +369 -0
  244. data/js/foundation/thememanager/js.inc +0 -0
  245. data/js/foundation/thememanager/thememanager.js +387 -0
  246. data/js/foundation/view/js.inc +0 -0
  247. data/js/foundation/view/markupview/js.inc +0 -0
  248. data/js/foundation/view/markupview/markupview.js +113 -0
  249. data/js/foundation/view/morphanimation/js.inc +0 -0
  250. data/js/foundation/view/morphanimation/morphanimation.js +236 -0
  251. data/js/foundation/view/view.js +1804 -0
  252. data/js/foundation/view/viewdefaults/js.inc +0 -0
  253. data/js/foundation/view/viewdefaults/viewdefaults.js +25 -0
  254. data/js/views/centerview/centerview.js +45 -0
  255. data/js/views/centerview/js.inc +0 -0
  256. data/js/views/inlineview/inlineview.js +14 -0
  257. data/js/views/inlineview/js.inc +0 -0
  258. data/js/views/scrollview/js.inc +0 -0
  259. data/js/views/scrollview/scrollview.js +39 -0
  260. data/lib/conf/default.rb +220 -0
  261. data/lib/conf/wizard.rb +303 -0
  262. data/lib/daemon/daemon.rb +293 -0
  263. data/lib/http/broker.rb +102 -0
  264. data/lib/http/rackup.rb +88 -0
  265. data/lib/http/request.rb +69 -0
  266. data/lib/http/response.rb +63 -0
  267. data/lib/plugins/gui_plugin.rb +129 -0
  268. data/lib/plugins/guiparser.rb +114 -0
  269. data/lib/plugins/plugin.rb +652 -0
  270. data/lib/plugins/plugin_plugins.rb +47 -0
  271. data/lib/plugins/plugin_sqlite_db.rb +72 -0
  272. data/lib/plugins/plugin_util.rb +96 -0
  273. data/lib/plugins/pluginmanager.rb +517 -0
  274. data/lib/plugins/servlet.rb +69 -0
  275. data/lib/session/msg.rb +291 -0
  276. data/lib/session/sessionmanager.rb +491 -0
  277. data/lib/session/sessionstorage.rb +314 -0
  278. data/lib/transporter/transporter.rb +254 -0
  279. data/lib/util/gzstring.rb +5 -0
  280. data/lib/values/hvalue.rb +323 -0
  281. data/lib/values/valuemanager.rb +152 -0
  282. data/plugins/client_pkg/client_pkg.rb +186 -0
  283. data/plugins/client_pkg/info.yaml +25 -0
  284. data/plugins/client_pkg/lib/client_pkg_build.rb +569 -0
  285. data/plugins/client_pkg/lib/client_pkg_cache.rb +50 -0
  286. data/plugins/client_pkg/lib/client_pkg_serve.rb +210 -0
  287. data/plugins/client_pkg/log/build_log +0 -0
  288. data/plugins/index_html/img/loading.gif +0 -0
  289. data/plugins/index_html/img/riassence.gif +0 -0
  290. data/plugins/index_html/index_html.rb +150 -0
  291. data/plugins/index_html/tmpl/index.html +22 -0
  292. data/plugins/index_html/tmpl/startup_index.html +29 -0
  293. data/plugins/legacy/disabled +0 -0
  294. data/plugins/legacy/disabled- +0 -0
  295. data/plugins/legacy/info.yaml +22 -0
  296. data/plugins/legacy/legacy.rb +15 -0
  297. data/plugins/main/js/riassence_ns.js +87 -0
  298. data/plugins/main/main.rb +234 -0
  299. data/plugins/main/values.yaml +8 -0
  300. data/plugins/ticketservices/lib/common.rb +300 -0
  301. data/plugins/ticketservices/lib/favicon.rb +38 -0
  302. data/plugins/ticketservices/lib/file.rb +58 -0
  303. data/plugins/ticketservices/lib/img.rb +50 -0
  304. data/plugins/ticketservices/lib/objblob.rb +66 -0
  305. data/plugins/ticketservices/lib/rsrc.rb +34 -0
  306. data/plugins/ticketservices/lib/upload.rb +206 -0
  307. data/plugins/ticketservices/ticketservices.rb +268 -0
  308. data/var/db/.git_include +0 -0
  309. data/var/log/.git_include +0 -0
  310. data/var/run/.git_include +0 -0
  311. metadata +390 -0
@@ -0,0 +1,5 @@
1
+ require 'zlib'
2
+
3
+ class GZString < String
4
+ alias write <<
5
+ end
@@ -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
+