Simpiti.js
Summary
No overview generated for 'Simpiti.js'
|
Class Summary
|
| Simpiti |
Simpiti is a simple SMTP listener (because server
would be exaggerated). |
| Simpiti.Connection |
Instances of this class are used to handle client
connections to the Simpiti listener as well as the retrieved
message via a callback handler. |
var Simpiti = function(port) {
var self = this;
var listener, thread, callback;
var connections = new Array;
this.start = function() {
listener = new java.net.ServerSocket(port || 25);
thread = new Thread(function() {
var socket, conn;
while (true) {
try {
socket = listener.accept();
conn = new Simpiti.Connection(socket, callback);
self.flush();
connections.push(conn);
} catch (x) {
app.logger.debug(x);
}
}
return;
});
thread.start();
app.log("Started Simpiti listener on port " + listener.getLocalPort());
return thread;
};
this.stop = function() {
for (var i in connections) {
connections[i].close();
}
thread.stop();
listener.close();
app.log("Stopped Simpiti listener on port " + listener.getLocalPort());
return;
};
this.setMessageCallback = function(handler, method) {
callback = {handler: handler, method: method};
return;
};
this.getConnections = function() {
self.flush();
return connections;
};
this.flush = function() {
var i = 0;
while (i < connections.length) {
if (connections[i].valueOf().isClosed()) {
connections.shift();
} else {
i += 1;
}
}
return;
}
this.isStarted = function() {
return thread.isRunning();
};
this.isStopped = function() {
return !self.isStarted();
};
this.toString = function() {
return "Simpiti SMTP listener (" + (isStarted ? "port " +
listener.getLocalPort() : "stopped") + ")";
};
return this;
};
Simpiti.Connection = function(socket, callback) {
var reader = new (function() {
var buffer = new java.io.BufferedReader(
new java.io.InputStreamReader(socket.getInputStream())
);
this.readln = function() {
var str = buffer.readLine();
app.logger.debug("Simpiti " + str);
return str;
};
return this;
});
var writer = new (function() {
var buffer = new java.io.PrintWriter(
new java.io.OutputStreamWriter(socket.getOutputStream())
);
this.writeln = function(str) {
buffer.println(str);
buffer.flush();
return;
};
return this;
});
var runner = function() {
var message = new java.lang.StringBuffer();
var finished = false;
writer.writeln("220 This is Simpiti");
var input, tokens, command;
mainLoop:
while (true) {
input = reader.readln();
if (input == null) {
break;
}
tokens = new java.util.StringTokenizer(input, " ;");
try {
command = tokens.nextToken().toUpperCase();
} catch (x) {
app.logger.debug(x);
continue;
}
switch (command) {
case "NOOP":
case "EHLO":
case "HELO":
case "RSET":
writer.writeln("250 OK");
break;
case "MAIL":
writer.writeln("250 OK");
break;
case "RCPT":
writer.writeln("250 OK");
break;
case "DATA":
writer.writeln("354 Start mail data; end with <CRLF>.<CRLF>");
var data;
while ((data = reader.readln()) != ".") {
data && message.append(data);
message.append("\n");
if (message.length() > 1048576) {
writer.writeln("552 Mail data exceeds limit");
break mainLoop;
}
}
writer.writeln("250 OK");
finished = true;
break;
case "QUIT":
writer.writeln("221 Good bye");
break mainLoop;
default:
writer.writeln("502 Unknown command " + command);
}
}
socket.close();
if (finished && callback && callback.handler && callback.method) {
new Thread(callback.handler, callback.method, message.toString()) .start();
}
return;
};
var thread = new Thread(runner) .start();
this.close = function() {
socket.close();
return;
};
this.valueOf = function() {
return socket;
}
this.toString = function() {
return socket.toString();
};
return this;
};
Simpiti.parseMessage = function(message) {
var result = new Object;
var lines = message.split("\n");
if (lines.length > 1) {
var i, str, pairs;
while (!!(str = lines.shift())) {
pairs = str.split(/^([^ ]+): (.*)$/);
if (pairs.length < 4 || !pairs[1] || !pairs[2]) {
continue;
}
result[pairs[1].trim()] = pairs[2].trim().replace(/^<(.+@.+)>$/, "$1");
}
if (result.Date) {
result.Date = new Date(result.date);
}
}
result.Body = lines.join("\n");
return result;
};
Documentation generated by
JSDoc on Sun Mar 4 00:51:24 2007