]> git.proxmox.com Git - mirror_novnc.git/blob - core/util/properties.js
Move cursor URI check to RFB object
[mirror_novnc.git] / core / util / properties.js
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 /*
10 * Getter/Setter Creation Utilities
11 */
12
13 import * as Log from './logging.js';
14
15 function make_property (proto, name, mode, type) {
16 "use strict";
17
18 var getter;
19 if (type === 'arr') {
20 getter = function (idx) {
21 if (typeof idx !== 'undefined') {
22 return this['_' + name][idx];
23 } else {
24 return this['_' + name];
25 }
26 };
27 } else {
28 getter = function () {
29 return this['_' + name];
30 };
31 }
32
33 var make_setter = function (process_val) {
34 if (process_val) {
35 return function (val, idx) {
36 if (typeof idx !== 'undefined') {
37 this['_' + name][idx] = process_val(val);
38 } else {
39 this['_' + name] = process_val(val);
40 }
41 };
42 } else {
43 return function (val, idx) {
44 if (typeof idx !== 'undefined') {
45 this['_' + name][idx] = val;
46 } else {
47 this['_' + name] = val;
48 }
49 };
50 }
51 };
52
53 var setter;
54 if (type === 'bool') {
55 setter = make_setter(function (val) {
56 if (!val || (val in {'0': 1, 'no': 1, 'false': 1})) {
57 return false;
58 } else {
59 return true;
60 }
61 });
62 } else if (type === 'int') {
63 setter = make_setter(function (val) { return parseInt(val, 10); });
64 } else if (type === 'float') {
65 setter = make_setter(parseFloat);
66 } else if (type === 'str') {
67 setter = make_setter(String);
68 } else if (type === 'func') {
69 setter = make_setter(function (val) {
70 if (!val) {
71 return function () {};
72 } else {
73 return val;
74 }
75 });
76 } else if (type === 'arr' || type === 'dom' || type == 'raw') {
77 setter = make_setter();
78 } else {
79 throw new Error('Unknown property type ' + type); // some sanity checking
80 }
81
82 // set the getter
83 if (typeof proto['get_' + name] === 'undefined') {
84 proto['get_' + name] = getter;
85 }
86
87 // set the setter if needed
88 if (typeof proto['set_' + name] === 'undefined') {
89 if (mode === 'rw') {
90 proto['set_' + name] = setter;
91 } else if (mode === 'wo') {
92 proto['set_' + name] = function (val, idx) {
93 if (typeof this['_' + name] !== 'undefined') {
94 throw new Error(name + " can only be set once");
95 }
96 setter.call(this, val, idx);
97 };
98 }
99 }
100
101 // make a special setter that we can use in set defaults
102 proto['_raw_set_' + name] = function (val, idx) {
103 setter.call(this, val, idx);
104 //delete this['_init_set_' + name]; // remove it after use
105 };
106 };
107
108 export function make_properties (constructor, arr) {
109 "use strict";
110 for (var i = 0; i < arr.length; i++) {
111 make_property(constructor.prototype, arr[i][0], arr[i][1], arr[i][2]);
112 }
113 };
114
115 export function set_defaults (obj, conf, defaults) {
116 var defaults_keys = Object.keys(defaults);
117 conf = conf || {};
118 var conf_keys = Object.keys(conf);
119 var keys_obj = {};
120 var i;
121 for (i = 0; i < defaults_keys.length; i++) { keys_obj[defaults_keys[i]] = 1; }
122 for (i = 0; i < conf_keys.length; i++) { keys_obj[conf_keys[i]] = 1; }
123 var keys = Object.keys(keys_obj);
124
125 for (i = 0; i < keys.length; i++) {
126 var setter = obj['_raw_set_' + keys[i]];
127 if (!setter) {
128 Log.Warn('Invalid property ' + keys[i]);
129 continue;
130 }
131
132 if (keys[i] in conf) {
133 setter.call(obj, conf[keys[i]]);
134 } else {
135 setter.call(obj, defaults[keys[i]]);
136 }
137 }
138 };
139