| 21 | } |
| 22 | |
| 23 | function replaceVar(group, fqn, val) { |
| 24 | var exclusive = false; |
| 25 | for (var j in group.excludes) { |
| 26 | if (group.excludes[j]) { |
| 27 | exclusive = true; |
| 28 | break; |
| 29 | } |
| 30 | } |
| 31 | var users = Object.keys(group.users); |
| 32 | var i = 0, ll = users.length; |
| 33 | var toSend = {}, |
| 34 | flattenedVal = {}, |
| 35 | fqns, |
| 36 | user; |
| 37 | |
| 38 | // Setup: generate flattenedVal and toSend. |
| 39 | if (val && typeof val === 'object') { |
| 40 | flattenedVal = nowUtil.flatten(val, fqn); |
| 41 | fqns = Object.keys(flattenedVal); |
| 42 | // Iterate through all leaves. |
| 43 | for (i = 0, ll = fqns.length; i < ll; i++) { |
| 44 | toSend[fqns[i]] = nowUtil.getValOrFqn(flattenedVal[fqns[i]], fqns[i]); |
| 45 | } |
| 46 | } else { |
| 47 | // val is not an object. |
| 48 | fqns = [fqn]; |
| 49 | toSend[fqn] = nowUtil.getValOrFqn(val, fqn); |
| 50 | flattenedVal[fqn] = val; |
| 51 | } |
| 52 | |
| 53 | var ff = fqns.length, k; |
| 54 | if (exclusive) { |
| 55 | for (i = 0, ll = users.length; i < ll; i++) { |
| 56 | user = group.users[users[i]]; |
| 57 | if (group.excludes[user.user.clientId]) { |
| 58 | continue; |
| 59 | } |
| 60 | // Clear the user's scopeTable entry before setting the new |
| 61 | // value. |
| 62 | user.deleteVar(fqn); |
| 63 | user.socket.emit('rv', toSend); |
| 64 | |
| 65 | if (ff === 0) { |
| 66 | group.scopeTable.set(fqn, []); |
| 67 | } |
| 68 | |
| 69 | for (k = 0; k < ff; k++) { |
| 70 | // Set values for individual users. |
| 71 | user.scopeTable.set(fqns[k], flattenedVal[fqns[k]]); |
| 72 | } |
| 73 | } |
| 74 | return; |
| 75 | } else { |
| 76 | // Not an exclusive group. |
| 77 | group.deleteVar(fqn); |
| 78 | for (k = 0; k < ff; k++) { |
| 79 | // Set values for the group. |
| 80 | group.scopeTable.set(fqns[k], flattenedVal[fqns[k]]); |