var SipletCtr=0;
var Siplet = function()
{
this.socket = null;
this.sipNum = (++SipletCtr);
this.mudport=23;
this.basecallback = null;
this.callback = null;
this.token = null;
this.host = '';
this.vulnerableState = false;
this.the_real_mccoy=true;
};
Siplet.prototype.connectToURL = function(host, port, mudport, callback)
{
if(this.socket == null)
{
this.socket = new WebSocket("ws://"+host+":"+port+"/SipletInterface");
var self=this;
this.host = host;
this.mudport = mudport;
this.socket.onmessage = function(event)
{
self.receivedData.apply(self, [ event ]);
};
this.socket.onopen = function(event)
{
self.openOccurred.apply(self, [ event ]);
};
this.socket.onclose = function(event)
{
self.closeOccurred.apply(self, [ event ]);
};
this.socket.onerror = function(event)
{
self.errorOccurred.apply(self, [ event ]);
};
if(callback)
this.callback = callback;
window.console.info("cn:"+this.sipNum+":"+(new Date).getTime()+": "+this.socket.readyState+": connectToURL "+host+":"+port);
}
return true;
};
Siplet.prototype.isConnecting = function()
{
if(this.socket)
{
return this.socket.readyState === 0;
}
return false;
}
Siplet.prototype.receivedData = function(event)
{
if(this.callback)
this.callback(this.socket.readyState == 1, event.data);
if(this.basecallback)
this.callback = this.basecallback;
window.console.info("dr:"+this.sipNum+":"+(new Date).getTime()+": "+this.socket.readyState+": receivedData:"+event.data.length);
};
Siplet.prototype.closeOccurred = function(event)
{
window.console.info("cl:"+this.sipNum+":"+(new Date).getTime()+": "+this.socket.readyState+": close ");
this.cleanUpClose();
};
Siplet.prototype.errorOccurred = function(event)
{
window.console.info("er:"+this.sipNum+":"+(new Date).getTime()+": "+this.socket.readyState+": error ");
if(this.callback)
this.callback(false,'');
this.disconnectFromURL();
};
Siplet.prototype.openOccurred = function(event)
{
var self=this;
var finishConnect;
finishConnect = function(tries)
{
window.console.info("o1:"+self.sipNum+":"+(new Date).getTime()+": "+self.socket.readyState+": attempt open ");
if(self.socket && self.socket.readyState == 1)
{
var safeurl=encodeURIComponent(self.host);
var safeport=encodeURIComponent(self.mudport);
var cmd = 'CONNECT&URL='+safeurl+'&PORT='+safeport;
self.socket.send(cmd);
window.console.info("o2:"+self.sipNum+":"+(new Date).getTime()+": "+self.socket.readyState+": open ");
}
else
if(self.socket && (self.socket.readyState == 0) && (tries < 10))
{
setTimeout(function()
{
finishConnect(tries + 1);
}, 500);
}
};
finishConnect(0);
};
Siplet.prototype.cleanUpClose = function()
{
this.socket.onmessage = null;
this.socket.onopen = null;
this.socket.onclose = null;
this.socket.onerror = null;
this.callback = null;
}
Siplet.prototype.disconnectFromURL = function()
{
if(this.socket)
{
this.cleanUpClose();
if(this.socket.readyState < 2)
{
window.console.info("du:"+this.sipNum+":"+(new Date).getTime()+": "+this.socket.readyState+": disconnectFromURL ");
if(this.token)
this.socket.send('DISCONNECT&TOKEN='+this.token);
this.socket.close();
}
}
};
Siplet.prototype.isConnectedToURL = function()
{
return (this.socket && this.socket.readyState === 1);
};
Siplet.prototype.getURLData = function(callback)
{
if(this.socket && this.socket.readyState === 1)
{
this.callback = callback;
this.basecallback = callback;
window.console.info("gu:"+this.sipNum+":"+(new Date).getTime()+": "+this.token+": "+this.socket.readyState+": getURLData");
this.socket.send('POLL&TOKEN='+this.token);
}
};
Siplet.prototype.sendData = function(s, callback)
{
if(this.socket && this.socket.readyState === 1)
{
this.callback = callback;
s=encodeURIComponent(''+s);
window.console.info("se:"+this.sipNum+":"+(new Date).getTime()+": "+this.token+": "+this.socket.readyState+": sendData");
this.socket.send('SENDDATA&TOKEN='+this.token+'&DATA='+s);
}
};