properties.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * noVNC: HTML5 VNC client
  3. * Copyright (C) 2012 Joel Martin
  4. * Licensed under MPL 2.0 (see LICENSE.txt)
  5. *
  6. * See README.md for usage and integration instructions.
  7. */
  8. /*
  9. * Getter/Setter Creation Utilities
  10. */
  11. import * as Log from './logging.js';
  12. function make_property (proto, name, mode, type) {
  13. "use strict";
  14. var getter;
  15. if (type === 'arr') {
  16. getter = function (idx) {
  17. if (typeof idx !== 'undefined') {
  18. return this['_' + name][idx];
  19. } else {
  20. return this['_' + name];
  21. }
  22. };
  23. } else {
  24. getter = function () {
  25. return this['_' + name];
  26. };
  27. }
  28. var make_setter = function (process_val) {
  29. if (process_val) {
  30. return function (val, idx) {
  31. if (typeof idx !== 'undefined') {
  32. this['_' + name][idx] = process_val(val);
  33. } else {
  34. this['_' + name] = process_val(val);
  35. }
  36. };
  37. } else {
  38. return function (val, idx) {
  39. if (typeof idx !== 'undefined') {
  40. this['_' + name][idx] = val;
  41. } else {
  42. this['_' + name] = val;
  43. }
  44. };
  45. }
  46. };
  47. var setter;
  48. if (type === 'bool') {
  49. setter = make_setter(function (val) {
  50. if (!val || (val in {'0': 1, 'no': 1, 'false': 1})) {
  51. return false;
  52. } else {
  53. return true;
  54. }
  55. });
  56. } else if (type === 'int') {
  57. setter = make_setter(function (val) { return parseInt(val, 10); });
  58. } else if (type === 'float') {
  59. setter = make_setter(parseFloat);
  60. } else if (type === 'str') {
  61. setter = make_setter(String);
  62. } else if (type === 'func') {
  63. setter = make_setter(function (val) {
  64. if (!val) {
  65. return function () {};
  66. } else {
  67. return val;
  68. }
  69. });
  70. } else if (type === 'arr' || type === 'dom' || type == 'raw') {
  71. setter = make_setter();
  72. } else {
  73. throw new Error('Unknown property type ' + type); // some sanity checking
  74. }
  75. // set the getter
  76. if (typeof proto['get_' + name] === 'undefined') {
  77. proto['get_' + name] = getter;
  78. }
  79. // set the setter if needed
  80. if (typeof proto['set_' + name] === 'undefined') {
  81. if (mode === 'rw') {
  82. proto['set_' + name] = setter;
  83. } else if (mode === 'wo') {
  84. proto['set_' + name] = function (val, idx) {
  85. if (typeof this['_' + name] !== 'undefined') {
  86. throw new Error(name + " can only be set once");
  87. }
  88. setter.call(this, val, idx);
  89. };
  90. }
  91. }
  92. // make a special setter that we can use in set defaults
  93. proto['_raw_set_' + name] = function (val, idx) {
  94. setter.call(this, val, idx);
  95. //delete this['_init_set_' + name]; // remove it after use
  96. };
  97. };
  98. export function make_properties (constructor, arr) {
  99. "use strict";
  100. for (var i = 0; i < arr.length; i++) {
  101. make_property(constructor.prototype, arr[i][0], arr[i][1], arr[i][2]);
  102. }
  103. };
  104. export function set_defaults (obj, conf, defaults) {
  105. var defaults_keys = Object.keys(defaults);
  106. var conf_keys = Object.keys(conf);
  107. var keys_obj = {};
  108. var i;
  109. for (i = 0; i < defaults_keys.length; i++) { keys_obj[defaults_keys[i]] = 1; }
  110. for (i = 0; i < conf_keys.length; i++) { keys_obj[conf_keys[i]] = 1; }
  111. var keys = Object.keys(keys_obj);
  112. for (i = 0; i < keys.length; i++) {
  113. var setter = obj['_raw_set_' + keys[i]];
  114. if (!setter) {
  115. Log.Warn('Invalid property ' + keys[i]);
  116. continue;
  117. }
  118. if (keys[i] in conf) {
  119. setter.call(obj, conf[keys[i]]);
  120. } else {
  121. setter.call(obj, defaults[keys[i]]);
  122. }
  123. }
  124. };