blob: 6b0bc3d3aee12196d82a53308408de94dc0eb8dc [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// -----------------
// Original code by Joe Walnes
// -----------------
function Connection(webmqUrl, id) {
this.messageListeners = new Array()
this.webmqUrl = webmqUrl
if (id == null) {
// TODO use secure random id generation
id = Math.round(Math.random() * 100000000)
}
this.id = id
// TODO don't start anything until document has finished loading
var http = this.createHttpControl()
this.getNextMessageAndLoop(webmqUrl, id, http)
}
Connection.prototype.getNextMessageAndLoop = function(webmqUrl, id, http) {
http.open("GET", webmqUrl + "?id=" + id + "&xml=true", true)
var connection = this
http.onreadystatechange = function() {
if (http.readyState == 4) {
var ok
try {
ok = http.status && http.status == 200
}
catch (e) {
ok = false // sometimes accessing the http.status fields causes errors in firefox. dunno why. -joe
}
if (ok) {
connection.processIncomingMessage(http)
}
// why do we have to create a new instance?
// this is not required on firefox but is on mozilla
//http.abort()
http = connection.createHttpControl()
connection.getNextMessageAndLoop(webmqUrl, id, http)
}
}
http.send(null)
}
Connection.prototype.sendMessage = function(destination, message) {
// TODO should post via body rather than URL
// TODO specify destination in message
var http = this.createHttpControl()
http.open("POST", this.webmqUrl + "?id=" + this.id + "&body=" + message, true)
http.send(null)
}
Connection.prototype.processIncomingMessage = function(http) {
var destination = http.getResponseHeader("destination")
var message = http.responseXML
if (message == null) {
message = http.responseText
}
//alert(message.responseText)
for (var j = 0; j < this.messageListeners.length; j++) {
var registration = this.messageListeners[j]
if (registration.matcher(destination)) {
registration.messageListener(message, destination)
}
}
}
Connection.prototype.addMessageListener = function(matcher, messageListener) {
var wrappedMatcher
if (matcher.constructor == RegExp) {
wrappedMatcher = function(destination) {
return matcher.test(destination)
}
}
else if (matcher.constructor == String) {
wrappedMatcher = function(destination) {
return matcher == destination
}
}
else {
wrappedMatcher = matcher
}
this.messageListeners[this.messageListeners.length] = { matcher: wrappedMatcher, messageListener: messageListener }
}
Connection.prototype.createHttpControl = function() {
// for details on using XMLHttpRequest see
// http://webfx.eae.net/dhtml/xmlextras/xmlextras.html
try {
if (window.XMLHttpRequest) {
var req = new XMLHttpRequest()
// some older versions of Moz did not support the readyState property
// and the onreadystate event so we patch it!
if (req.readyState == null) {
req.readyState = 1
req.addEventListener("load", function () {
req.readyState = 4
if (typeof req.onreadystatechange == "function") {
req.onreadystatechange()
}
}, false)
}
return req
}
if (window.ActiveXObject) {
return new ActiveXObject(this.getControlPrefix() + ".XmlHttp")
}
}
catch (ex) {}
// fell through
throw new Error("Your browser does not support XmlHttp objects")
}
Connection.prototype.getControlPrefix = function() {
if (this.prefix) {
return this.prefix
}
var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"]
var o, o2
for (var i = 0; i < prefixes.length; i++) {
try {
// try to create the objects
o = new ActiveXObject(prefixes[i] + ".XmlHttp")
o2 = new ActiveXObject(prefixes[i] + ".XmlDom")
return this.prefix = prefixes[i]
}
catch (ex) {}
}
throw new Error("Could not find an installed XML parser")
}