diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-03-23 00:04:36 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-03-23 00:04:36 -0400 |
| commit | b20151fff373100da7946df93afb7dd4dccea3e4 (patch) | |
| tree | a16d7085c0eab807c309c94461ed60821029f1ff /MediaBrowser.WebDashboard/ApiClient.js | |
| parent | 4bc27f3a65ddbffcc7b74683df72503f20df275c (diff) | |
copy dashboard to the output folder and load from the file system, instead of using embedded resources
Diffstat (limited to 'MediaBrowser.WebDashboard/ApiClient.js')
| -rw-r--r-- | MediaBrowser.WebDashboard/ApiClient.js | 233 |
1 files changed, 228 insertions, 5 deletions
diff --git a/MediaBrowser.WebDashboard/ApiClient.js b/MediaBrowser.WebDashboard/ApiClient.js index f3b24cd29..1d2d18006 100644 --- a/MediaBrowser.WebDashboard/ApiClient.js +++ b/MediaBrowser.WebDashboard/ApiClient.js @@ -2,7 +2,7 @@ window.MediaBrowser = {}; } -MediaBrowser.ApiClient = function ($, navigator) { +MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { /** * Creates a new api client instance @@ -15,8 +15,9 @@ MediaBrowser.ApiClient = function ($, navigator) { var self = this; var deviceName = "Web Browser"; - var deviceId = SHA1(navigator.userAgent + (navigator.cpuClass || "")); + var deviceId = MediaBrowser.SHA1(navigator.userAgent + (navigator.cpuClass || "")); var currentUserId; + var webSocket; /** * Gets the server host name. @@ -88,6 +89,55 @@ MediaBrowser.ApiClient = function ($, navigator) { return url; }; + self.openWebSocket = function (port) { + + var url = "ws://" + serverHostName + ":" + port + "/mediabrowser"; + + webSocket = new WebSocket(url); + + webSocket.onmessage = function (msg) { + msg = JSON.parse(msg.data); + $(self).trigger("websocketmessage", [msg]); + }; + + webSocket.onopen = function () { + setTimeout(function () { + $(self).trigger("websocketopen"); + }, 500); + }; + webSocket.onerror = function () { + setTimeout(function () { + $(self).trigger("websocketerror"); + }, 0); + }; + webSocket.onclose = function () { + setTimeout(function () { + $(self).trigger("websocketclose"); + }, 0); + }; + }; + + self.sendWebSocketMessage = function (name, data) { + + var msg = { MessageType: name }; + + if (data) { + msg.Data = data; + } + + msg = JSON.stringify(msg); + + webSocket.send(msg); + }; + + self.isWebSocketOpen = function () { + return webSocket && webSocket.readyState === WebSocket.OPEN; + }; + + self.isWebSocketOpenOrConnecting = function () { + return webSocket && (webSocket.readyState === WebSocket.OPEN || webSocket.readyState === WebSocket.CONNECTING); + }; + /** * Gets an item from the server * Omit itemId to get the root folder. @@ -1184,7 +1234,7 @@ MediaBrowser.ApiClient = function ($, navigator) { var url = self.getUrl("Users/" + userId + "/authenticate"); var postData = { - password: SHA1(password || "") + password: MediaBrowser.SHA1(password || "") }; return self.ajax({ @@ -1214,7 +1264,7 @@ MediaBrowser.ApiClient = function ($, navigator) { }; - postData.currentPassword = SHA1(currentPassword); + postData.currentPassword = MediaBrowser.SHA1(currentPassword); if (newPassword) { postData.newPassword = newPassword; @@ -1523,7 +1573,7 @@ MediaBrowser.ApiClient = function ($, navigator) { }; }; -}(jQuery, navigator); +}(jQuery, navigator, JSON, window.WebSocket, setTimeout); /** * Provides a friendly way to create an api client instance using information from the browser's current url @@ -1533,4 +1583,177 @@ MediaBrowser.ApiClient.create = function (clientName) { var loc = window.location; return new MediaBrowser.ApiClient(loc.protocol, loc.hostname, loc.port, clientName); +}; + +/** +* +* Secure Hash Algorithm (SHA1) +* http://www.webtoolkit.info/ +* +**/ +MediaBrowser.SHA1 = function (msg) { + + function rotate_left(n, s) { + var t4 = (n << s) | (n >>> (32 - s)); + return t4; + }; + + function lsb_hex(val) { + var str = ""; + var i; + var vh; + var vl; + + for (i = 0; i <= 6; i += 2) { + vh = (val >>> (i * 4 + 4)) & 0x0f; + vl = (val >>> (i * 4)) & 0x0f; + str += vh.toString(16) + vl.toString(16); + } + return str; + }; + + function cvt_hex(val) { + var str = ""; + var i; + var v; + + for (i = 7; i >= 0; i--) { + v = (val >>> (i * 4)) & 0x0f; + str += v.toString(16); + } + return str; + }; + + + function Utf8Encode(string) { + string = string.replace(/\r\n/g, "\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if ((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }; + + var blockstart; + var i, j; + var W = new Array(80); + var H0 = 0x67452301; + var H1 = 0xEFCDAB89; + var H2 = 0x98BADCFE; + var H3 = 0x10325476; + var H4 = 0xC3D2E1F0; + var A, B, C, D, E; + var temp; + + msg = Utf8Encode(msg); + + var msg_len = msg.length; + + var word_array = new Array(); + for (i = 0; i < msg_len - 3; i += 4) { + j = msg.charCodeAt(i) << 24 | msg.charCodeAt(i + 1) << 16 | + msg.charCodeAt(i + 2) << 8 | msg.charCodeAt(i + 3); + word_array.push(j); + } + + switch (msg_len % 4) { + case 0: + i = 0x080000000; + break; + case 1: + i = msg.charCodeAt(msg_len - 1) << 24 | 0x0800000; + break; + + case 2: + i = msg.charCodeAt(msg_len - 2) << 24 | msg.charCodeAt(msg_len - 1) << 16 | 0x08000; + break; + + case 3: + i = msg.charCodeAt(msg_len - 3) << 24 | msg.charCodeAt(msg_len - 2) << 16 | msg.charCodeAt(msg_len - 1) << 8 | 0x80; + break; + } + + word_array.push(i); + + while ((word_array.length % 16) != 14) word_array.push(0); + + word_array.push(msg_len >>> 29); + word_array.push((msg_len << 3) & 0x0ffffffff); + + + for (blockstart = 0; blockstart < word_array.length; blockstart += 16) { + + for (i = 0; i < 16; i++) W[i] = word_array[blockstart + i]; + for (i = 16; i <= 79; i++) W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + + A = H0; + B = H1; + C = H2; + D = H3; + E = H4; + + for (i = 0; i <= 19; i++) { + temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff; + E = D; + D = C; + C = rotate_left(B, 30); + B = A; + A = temp; + } + + for (i = 20; i <= 39; i++) { + temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff; + E = D; + D = C; + C = rotate_left(B, 30); + B = A; + A = temp; + } + + for (i = 40; i <= 59; i++) { + temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff; + E = D; + D = C; + C = rotate_left(B, 30); + B = A; + A = temp; + } + + for (i = 60; i <= 79; i++) { + temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff; + E = D; + D = C; + C = rotate_left(B, 30); + B = A; + A = temp; + } + + H0 = (H0 + A) & 0x0ffffffff; + H1 = (H1 + B) & 0x0ffffffff; + H2 = (H2 + C) & 0x0ffffffff; + H3 = (H3 + D) & 0x0ffffffff; + H4 = (H4 + E) & 0x0ffffffff; + + } + + var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4); + + return temp.toLowerCase(); };
\ No newline at end of file |
