| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /*
- * noVNC: HTML5 VNC client
- * Copyright (C) 2012 Joel Martin
- * Licensed under MPL 2.0 (see LICENSE.txt)
- *
- * See README.md for usage and integration instructions.
- */
- /*
- * Getter/Setter Creation Utilities
- */
- import * as Log from './logging.js';
- function make_property (proto, name, mode, type) {
- "use strict";
- var getter;
- if (type === 'arr') {
- getter = function (idx) {
- if (typeof idx !== 'undefined') {
- return this['_' + name][idx];
- } else {
- return this['_' + name];
- }
- };
- } else {
- getter = function () {
- return this['_' + name];
- };
- }
- var make_setter = function (process_val) {
- if (process_val) {
- return function (val, idx) {
- if (typeof idx !== 'undefined') {
- this['_' + name][idx] = process_val(val);
- } else {
- this['_' + name] = process_val(val);
- }
- };
- } else {
- return function (val, idx) {
- if (typeof idx !== 'undefined') {
- this['_' + name][idx] = val;
- } else {
- this['_' + name] = val;
- }
- };
- }
- };
- var setter;
- if (type === 'bool') {
- setter = make_setter(function (val) {
- if (!val || (val in {'0': 1, 'no': 1, 'false': 1})) {
- return false;
- } else {
- return true;
- }
- });
- } else if (type === 'int') {
- setter = make_setter(function (val) { return parseInt(val, 10); });
- } else if (type === 'float') {
- setter = make_setter(parseFloat);
- } else if (type === 'str') {
- setter = make_setter(String);
- } else if (type === 'func') {
- setter = make_setter(function (val) {
- if (!val) {
- return function () {};
- } else {
- return val;
- }
- });
- } else if (type === 'arr' || type === 'dom' || type == 'raw') {
- setter = make_setter();
- } else {
- throw new Error('Unknown property type ' + type); // some sanity checking
- }
- // set the getter
- if (typeof proto['get_' + name] === 'undefined') {
- proto['get_' + name] = getter;
- }
- // set the setter if needed
- if (typeof proto['set_' + name] === 'undefined') {
- if (mode === 'rw') {
- proto['set_' + name] = setter;
- } else if (mode === 'wo') {
- proto['set_' + name] = function (val, idx) {
- if (typeof this['_' + name] !== 'undefined') {
- throw new Error(name + " can only be set once");
- }
- setter.call(this, val, idx);
- };
- }
- }
- // make a special setter that we can use in set defaults
- proto['_raw_set_' + name] = function (val, idx) {
- setter.call(this, val, idx);
- //delete this['_init_set_' + name]; // remove it after use
- };
- };
- export function make_properties (constructor, arr) {
- "use strict";
- for (var i = 0; i < arr.length; i++) {
- make_property(constructor.prototype, arr[i][0], arr[i][1], arr[i][2]);
- }
- };
- export function set_defaults (obj, conf, defaults) {
- var defaults_keys = Object.keys(defaults);
- var conf_keys = Object.keys(conf);
- var keys_obj = {};
- var i;
- for (i = 0; i < defaults_keys.length; i++) { keys_obj[defaults_keys[i]] = 1; }
- for (i = 0; i < conf_keys.length; i++) { keys_obj[conf_keys[i]] = 1; }
- var keys = Object.keys(keys_obj);
- for (i = 0; i < keys.length; i++) {
- var setter = obj['_raw_set_' + keys[i]];
- if (!setter) {
- Log.Warn('Invalid property ' + keys[i]);
- continue;
- }
- if (keys[i] in conf) {
- setter.call(obj, conf[keys[i]]);
- } else {
- setter.call(obj, defaults[keys[i]]);
- }
- }
- };
|