/* * 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]]); } } };