| | 743 | |
| | 744 | |
| | 745 | |
| | 746 | // XXX: the Orbited.XSDR stuff (presumably) doesn't work yet. |
| | 747 | // mcarter - 8-9-08 (~rev 476) |
| | 748 | |
| | 749 | Orbited.singleton.XSDR = { |
| | 750 | receiveCbs: {}, |
| | 751 | queues: {}, |
| | 752 | id: 0, |
| | 753 | register: function(receive, queue) { |
| | 754 | var id = ++Orbited.singleton.XSDR; |
| | 755 | Orbited.singleton.XSDR.receiveCbs[id] = receive; |
| | 756 | Orbited.singleton.XSDR.queues[id] = queue; |
| | 757 | } |
| | 758 | } |
| | 759 | |
| | 760 | Orbited.XSDR = function() { |
| | 761 | var self = this; |
| | 762 | |
| | 763 | var ifr = null; |
| | 764 | var url; |
| | 765 | var method; |
| | 766 | var data; |
| | 767 | var requestHeaders; |
| | 768 | var queue = [] |
| | 769 | var id = Orbited.singleton.XSDR.register( |
| | 770 | function(data) { receive(data) }, |
| | 771 | queue |
| | 772 | ) |
| | 773 | var bridgeUrl = new URL("") |
| | 774 | bridgeUrl.domain = Orbited.hostname |
| | 775 | bridgeUrl.port = Orbited.port |
| | 776 | bridgeUrl.path = '/static/xsdrBridge.html' |
| | 777 | bridgeUrl.hash = id; |
| | 778 | |
| | 779 | var reset = function() { |
| | 780 | self.responseText = "" |
| | 781 | self.status = null; |
| | 782 | self.readyState = 0; |
| | 783 | url = null; |
| | 784 | method = null; |
| | 785 | data = null; |
| | 786 | requestHeaders = {}; |
| | 787 | |
| | 788 | } |
| | 789 | reset(); |
| | 790 | |
| | 791 | self.open = function(_method, _url, async) { |
| | 792 | if (self.readyState == 4) { |
| | 793 | reset(); |
| | 794 | } |
| | 795 | if (self.readyState != 0) { |
| | 796 | throw new Error("Invalid readyState"); |
| | 797 | } |
| | 798 | if (!async) { |
| | 799 | throw new Error("Only Async XSDR supported") |
| | 800 | } |
| | 801 | self.readyState = 1; |
| | 802 | url = _url; |
| | 803 | method = _method; |
| | 804 | } |
| | 805 | |
| | 806 | self.send = function(data) { |
| | 807 | if (self.readyState != 1) { |
| | 808 | throw new Error("Invalid readyState"); |
| | 809 | } |
| | 810 | if (!ifr) { |
| | 811 | ifr = document.createElement("iframe") |
| | 812 | hideIframe(ifr); |
| | 813 | ifr.src = bridgeUrl.render() |
| | 814 | document.body.appendChild(ifr); |
| | 815 | } |
| | 816 | else { |
| | 817 | queue.push([method, url, data, requestHeaders]); |
| | 818 | } |
| | 819 | } |
| | 820 | |
| | 821 | self.abort = function() { |
| | 822 | if (self.readyState > 0 && self.readyState < 4) { |
| | 823 | queue.push(['ABORT']); |
| | 824 | } |
| | 825 | } |
| | 826 | |
| | 827 | self.setRequestHeader = function(key, val) { |
| | 828 | if (self.readyState != 0) { |
| | 829 | throw new Error("Invalid readyState"); |
| | 830 | } |
| | 831 | requestHeaders[key] = val; |
| | 832 | } |
| | 833 | |
| | 834 | self.getResponseHeader = function() { |
| | 835 | if (self.readyState < 2) { |
| | 836 | throw new Error("Invalid readyState"); |
| | 837 | } |
| | 838 | return responseHeaders[key] |
| | 839 | } |
| | 840 | |
| | 841 | var receive = function(payload) { |
| | 842 | switch(payload[0]) { |
| | 843 | case 'initialize': |
| | 844 | push([method, url, data, requestHeaders]); |
| | 845 | break; |
| | 846 | case 'readystatechange': |
| | 847 | var data = payload[1] |
| | 848 | self.readyState = data.readyState |
| | 849 | if (data.status) { |
| | 850 | self.status = data.status |
| | 851 | } |
| | 852 | if (data.responseText) { |
| | 853 | self.responseText += data.responseText |
| | 854 | } |
| | 855 | self.onreadystatechange(); |
| | 856 | } |
| | 857 | } |
| | 858 | |
| | 859 | var hideIframe =function (ifr) { |
| | 860 | ifr.style.display = 'block'; |
| | 861 | ifr.style.width = '0'; |
| | 862 | ifr.style.height = '0'; |
| | 863 | ifr.style.border = '0'; |
| | 864 | ifr.style.margin = '0'; |
| | 865 | ifr.style.padding = '0'; |
| | 866 | ifr.style.overflow = 'hidden'; |
| | 867 | ifr.style.visibility = 'hidden'; |
| | 868 | } |
| | 869 | |
| | 870 | } |
| | 871 | Orbited.XSDR.prototype.logger = Orbited.getLogger("Orbited.XSDR"); |