package protocol.xmpp;
// #sijapp cond.if protocols_JABBER is "true" #
import jimm.*;
import jimm.comm.*;
import jimmui.view.form.Form;
import jimmui.view.form.FormListener;
import protocol.Profile;
/**
*
* @author Vladimir Kryukov
*/
public class XmppRegistration implements Runnable, FormListener {
private XForm form;
private XmppConnection connection;
private AccountsForm opts;
private byte type;
private String id;
private String domain = "";
private String xml = null;
private String username;
private String password;
public final static byte TYPE_NEW_ACCOUNT_DOMAIN = 0;
public final static byte TYPE_NEW_ACCOUNT_CREATE = 1;
public final static byte TYPE_NONE = 2;
private final static int FORM_SERVER = 0;
public XmppRegistration(AccountsForm of) {
opts = of;
}
public void show() {
form = new XForm();
type = TYPE_NEW_ACCOUNT_DOMAIN;
id = "reg0";
form = new XForm();
form.init("registration", this);
form.getForm().addTextField(FORM_SERVER, "domain", "", 50);
form.getForm().show();
}
private String getServer(String domain) {
protocol.net.SrvResolver r = new protocol.net.SrvResolver();
String server = r.getXmpp(domain);
r.close();
return StringUtils.isEmpty(server) ? (domain + ":5222") : server;
}
public void run() {
String error = null;
try {
connection = new XmppConnection();
XmlNode xform = connection.newAccountConnect(domain, "socket://" + getServer(domain));
id = "reg1";
form.loadFromXml(xform.childAt(0), xform);
while (null == xml) {
try {
Thread.sleep(1000);
} catch (Exception ignored) {
}
}
if (0 == xml.length()) {
throw new JimmException(0, 0);
}
XmlNode n = connection.newAccountRegister(xml);
if (("r" + "esult").equals(n.getAttribute("t" + "ype"))) {
Profile account = new Profile();
account.protocolType = Profile.PROTOCOL_XMPP;
account.userId = username + "@" + domain;
account.password = password;
account.nick = "";
account.isActive = true;
opts.addAccount(Options.getMaxAccountCount(), account);
} else {
error = connection.getError(n.getFirstNode("e" + "rror"));
}
} catch (JimmException ignored) {
} catch (Exception ignored) {
}
try {
connection.disconnect();
} catch (Exception ignored) {
}
if (null == error) {
form.back();
opts = null;
} else {
type = TYPE_NONE;
form.setErrorMessage(error);
}
}
private void register(String form) {
xml = form;
}
private void cancel() {
xml = "";
}
private void requestForm(String domain) {
this.domain = domain;
new Thread(this).start();
}
public void formAction(Form uiForm, boolean apply) {
if (apply) {
if ((0 < form.getSize()) || (TYPE_NEW_ACCOUNT_DOMAIN == type)) {
doAction();
}
} else {
cancel();
form.back();
}
}
private String getRegisterXml() {
return "<iq type='set' to='" + Util.xmlEscape(domain) + "' id='"
+ Util.xmlEscape(id)
+ "'><query xmlns='jabber:iq:register'>"
+ form.getXmlForm()
+ "</query></iq>";
}
private void doAction() {
switch (type) {
case TYPE_NEW_ACCOUNT_DOMAIN:
String jid = form.getForm().getTextFieldValue(FORM_SERVER);
if (!StringUtils.isEmpty(jid)) {
form.setWainting();
requestForm(jid);
type = TYPE_NEW_ACCOUNT_CREATE;
}
break;
case TYPE_NEW_ACCOUNT_CREATE:
username = StringUtils.notNull(form.getField(XForm.S_USERNAME));
password = StringUtils.notNull(form.getField(XForm.S_PASSWORD));
register(getRegisterXml());
break;
}
}
}
// #sijapp cond.end#