private OtpErlangObject processRequest(final OtpErlangPid from,
final OtpErlangObject arequest) {
if (callback == null) {
return error;
}
Bindings b;
try {
if (arequest instanceof OtpErlangTuple) {
final OtpErlangTuple request = (OtpErlangTuple) arequest;
final String tag = ((OtpErlangAtom) request.elementAt(0)).atomValue();
if ("put_chars".equals(tag)) {
b = OtpErlang.match("{put_chars, Chars}", request);
if (b != null) {
return callback.putChars(from, IOEncoding.latin1, b.get("Chars"));
}
b = OtpErlang.match("{put_chars, Enc:a, Chars}", request);
if (b != null) {
final String enc = b.getAtom("Enc");
return callback.putChars(from, IOEncoding.valueOf(enc),
b.get("Chars"));
}
b = OtpErlang.match("{put_chars, M:a, F:a, A}", request);
if (b != null) {
final String m = b.getAtom("M");
final String f = b.getAtom("F");
final Collection<OtpErlangObject> a = b.getList("A");
return callback.putChars(from, IOEncoding.latin1, m, f, a);
}
b = OtpErlang.match("{put_chars, Enc:a, M:a, F:a, A}", request);
if (b != null) {
final String enc = b.getAtom("Enc");
final String m = b.getAtom("M");
final String f = b.getAtom("F");
final Collection<OtpErlangObject> a = b.getList("A");
return callback.putChars(from, IOEncoding.valueOf(enc), m, f, a);
}
return error;
} else if ("get_until".equals(tag)) {
b = OtpErlang.match("{get_until, Prompt}", request);
if (b != null) {
return callback.getUntil(IOEncoding.latin1, b.get("Prompt"));
}
b = OtpErlang.match("{get_until, Prompt, N:i}", request);
if (b != null) {
final long n = b.getLong("N");
return callback.getUntil(IOEncoding.latin1, b.get("Prompt"), n);
}
b = OtpErlang.match("{get_until, Enc:a, Prompt}", request);
if (b != null) {
final String enc = b.getAtom("Enc");
return callback
.getUntil(IOEncoding.valueOf(enc), b.get("Prompt"));
}
b = OtpErlang.match("{get_until, Enc:a, Prompt, N:i}", request);
if (b != null) {
final String enc = b.getAtom("Enc");
final long n = b.getLong("N");
return callback.getUntil(IOEncoding.valueOf(enc),
b.get("Prompt"), n);
}
b = OtpErlang.match("{get_until, Prompt, M:a, F:a, A}", request);
if (b != null) {
final String m = b.getAtom("M");
final String f = b.getAtom("F");
final Collection<OtpErlangObject> a = b.getList("A");
return callback.getUntil(IOEncoding.latin1, b.get("Prompt"), m,
f, a);
}
b = OtpErlang.match("{get_until, Enc: a, Prompt, M:a, F:a, A}",
request);
if (b != null) {
final String enc = b.getAtom("Enc");
final String m = b.getAtom("M");
final String f = b.getAtom("F");
final Collection<OtpErlangObject> a = b.getList("A");
return callback.getUntil(IOEncoding.valueOf(enc),
b.get("Prompt"), m, f, a);
}
} else if ("requests".equals(tag)) {
b = OtpErlang.match("{requests, Reqs:lx}", request);
if (b != null) {
final Collection<OtpErlangObject> reqs = b.getList("Reqs");
OtpErlangObject val = null;
for (final OtpErlangObject r : reqs) {
val = processRequest(from, r);
if (val.equals(error)) {
return error;
}
}
return val == null ? error : val;
}
} else if ("setopts".equals(tag)) {
b = OtpErlang.match("{setopts, Opts:lx}", request);
if (b != null) {
final Collection<OtpErlangObject> opts = b.getList("Opts");
return callback.setOpts(opts);
}
} else if ("get_geometry".equals(tag)) {
return OtpErlang.mkTuple(new OtpErlangAtom("error"),
new OtpErlangAtom("enotsup"));