/* Copyright (c) 2008 Bluendo S.r.L.
* See about.html for details about license.
*
* $Id: RegisterScreen.java 1564 2009-06-09 14:17:08Z luca $
*/
package it.yup.screens;
import java.io.IOException;
import java.io.InputStream;
import lampiro.LampiroMidlet;
import it.yup.util.Logger;
import it.yup.util.ResourceIDs;
import it.yup.util.ResourceManager;
import it.yup.util.Utils;
import it.yup.xmlstream.BasicXmlStream;
import it.yup.xmlstream.EventQuery;
import it.yup.xmlstream.EventQueryRegistration;
import it.yup.xmlstream.StreamEventListener;
import it.yup.xmpp.Config;
import it.yup.xmpp.XMPPClient;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
public class RegisterScreen extends Form implements CommandListener,
StreamEventListener {
private static ResourceManager rm = ResourceManager.getManager("common",
"en");
private static RegisterScreen _instance;
private TextField tf_jid = new TextField(rm
.getString(ResourceIDs.STR_JABBER_ID), null, 32,
TextField.EMAILADDR | TextField.NON_PREDICTIVE);
private TextField tf_pwd = new TextField(rm
.getString(ResourceIDs.STR_PASSWORD), null, 32, TextField.ANY
| TextField.PASSWORD);
private TextField tf_email = new TextField(rm
.getString(ResourceIDs.STR_EMAIL_ADDRESS), null, 32,
TextField.EMAILADDR);
private TextField tf_server = new TextField(rm
.getString(ResourceIDs.STR_SERVER_NAME), null, 32, TextField.ANY
| TextField.NON_PREDICTIVE);
private ChoiceGroup grp_new_account = new ChoiceGroup("",
ChoiceGroup.MULTIPLE);
private ChoiceGroup grp_advanced = new ChoiceGroup("", ChoiceGroup.MULTIPLE);
private ChoiceGroup grp_server = new ChoiceGroup("Connecting server",
ChoiceGroup.EXCLUSIVE);
/** Progress bar during login */
private Gauge progress_gauge = new Gauge(
rm.getString(ResourceIDs.STR_WAIT), false, Gauge.INDEFINITE,
Gauge.CONTINUOUS_RUNNING);
private StringItem btn_login = new StringItem(null, rm
.getString(ResourceIDs.STR_LOGIN), Item.BUTTON);
private Command cmd_exit = new Command(rm.getString(ResourceIDs.STR_EXIT),
Command.EXIT, 1);
private Command cmd_login = new Command("Login", Command.SCREEN, 1);
/** true if we must register a new account */
private boolean register = false;
private EventQueryRegistration reg;
private Config cfg = Config.getInstance();
/** local copy of the jid server (for detecting changes) */
private String jid_server = "";
private RegisterScreen() {
super(rm.getString(ResourceIDs.STR_TITLE));
// Add options to the connecting group
grp_new_account.append(rm.getString(ResourceIDs.STR_NEW_USER), null);
grp_advanced.append(rm.getString(ResourceIDs.STR_ADVANCED_OPTIONS),
null);
grp_server.append("automatic", null);
grp_server.append("manual", null);
btn_login.setLayout(Item.LAYOUT_CENTER | Item.LAYOUT_EXPAND
| Item.LAYOUT_NEWLINE_AFTER);
btn_login.setDefaultCommand(new Command("Login", Command.ITEM, 1));
// set the command listener for the login button
btn_login.setItemCommandListener(new ItemCommandListener() {
public void commandAction(Command _1, Item _2) {
// just forward the command to the login
login();
}
});
setItemStateListener(new ItemStateListener() {
public void itemStateChanged(Item item) {
_itemStateChanged(item);
}
});
// set the values from config
if (cfg.getProperty(Config.USER) != null) {
String tempUser = cfg.getProperty(Config.USER, "") + "@"
+ cfg.getProperty(Config.SERVER, "");
if (tempUser.compareTo("@") == 0) {
tempUser = "@" + Config.BLUENDO_SERVER;
this.grp_new_account.setSelectedFlags(new boolean[] { true });
} else
grp_server.setSelectedIndex(1, true);
tf_jid.setString(tempUser);
jid_server = get_server(tf_jid.getString());
tf_pwd.setString(cfg.getProperty(Config.PASSWORD, ""));
tf_server.setString(cfg.getProperty(Config.CONNECTING_SERVER, ""));
// append(btn_login);
}
addCommand(cmd_exit);
setCommandListener(this);
// #debug
//@ addCommand(new Command("debug", Command.SCREEN, 1));
}
public static RegisterScreen getInstance() {
if (_instance == null) {
_instance = new RegisterScreen();
}
_instance.placeItems();
return _instance;
}
private void placeItems() {
deleteAll();
append(grp_new_account);
append(tf_jid);
append(tf_pwd);
if (grp_new_account.isSelected(0)) {
append(tf_email);
}
append(grp_advanced);
checkLogin();
if (grp_advanced.isSelected(0)) {
append(grp_server);
if (grp_server.getSelectedIndex() == 1) {
append(tf_server);
}
}
}
public void commandAction(Command c, Displayable d) {
if (c == cmd_exit) {
LampiroMidlet.exit();
// #mdebug
//@ } else if ("debug".equals(c.getLabel())) {
//@ DebugScreen debugScreen = new DebugScreen();
//@ debugScreen.setReturnScreen(this);
//@ LampiroMidlet.disp.setCurrent(debugScreen);
// #enddebug
} else if (c == cmd_login) {
login();
}
}
private void login() {
deleteAll();
append("Logging in...");
append(progress_gauge);
new Thread() {
public void run() {
String jid = tf_jid.getString();
int at_idx = jid.indexOf("@");
String user = jid.substring(0, at_idx);
String server = jid.substring(at_idx + 1);
String cfg_user = cfg.getProperty(Config.USER);
String cfg_server = cfg.getProperty(Config.SERVER);
if ((cfg_user == null || !cfg_user.equals(user))
|| (cfg_server == null || !cfg_server.equals(server))) {
cfg.setProperty(Config.CLIENT_INITIALIZED, Config.FALSE);
}
cfg.setProperty(Config.USER, user);
cfg.setProperty(Config.SERVER, server);
cfg.setProperty(Config.PASSWORD, tf_pwd.getString());
cfg.setProperty(Config.EMAIL, tf_email.getString());
if (grp_server.getSelectedIndex() == 0) {
cfg.setProperty(Config.CONNECTING_SERVER, srvQuery());
} else {
cfg.setProperty(Config.CONNECTING_SERVER, tf_server
.getString());
}
cfg.saveToStorage();
try {
// Get the XMPP client
XMPPClient xmpp = XMPPClient.getInstance();
boolean newCredentials = Config.FALSE.equals(cfg
.getProperty(Config.CLIENT_INITIALIZED));
xmpp.createStream(register, newCredentials);
EventQuery qAuth = new EventQuery(EventQuery.ANY_EVENT,
null, null);
reg = BasicXmlStream.addEventListener(qAuth,
RegisterScreen.this);
xmpp.openStream();
} catch (Exception e) {
Logger.log(e.getMessage());
} catch (Error e) {
Logger.log("Error:" + e.getClass().getName() + ":"
+ e.getMessage());
}
}
}.start();
}
public void gotStreamEvent(String event, Object source) {
XMPPClient client = XMPPClient.getInstance();
if (BasicXmlStream.STREAM_ERROR.equals(event)
|| BasicXmlStream.CONNECTION_FAILED.equals(event)
|| BasicXmlStream.CONNECTION_LOST.equals(event)) {
reg.remove();
client.closeStream();
String description = null;
if (BasicXmlStream.CONNECTION_FAILED.equals(event)) {
description = "connection failed";
} else if (BasicXmlStream.CONNECTION_LOST.equals(event)) {
description = "connection lost";
} else {
description = (String) source;
}
client.showAlert(AlertType.ERROR, register ? rm
.getString(ResourceIDs.STR_REGFAIL_TITLE) : rm
.getString(ResourceIDs.STR_LOGFAIL_TITLE), (register ? (rm
.getString(ResourceIDs.STR_REGFAIL_DESC) + " ") : (rm
.getString(ResourceIDs.STR_LOGFAIL_DESC) + " "))
+ description, this);
placeItems();
} else if (BasicXmlStream.STREAM_INITIALIZED.equals(event)) {
reg.remove();
client.stream_authenticated();
}
}
private int indexOf(Item item) {
for (int i = 0; i < size(); i++) {
if (item.equals(get(i))) return i;
}
return -1;
}
private void _itemStateChanged(Item item) {
if (item.equals(grp_new_account)) {
register = grp_new_account.isSelected(0);
if (register) insert(indexOf(tf_pwd) + 1, tf_email);
else
delete(indexOf(tf_email));
} else if (item.equals(grp_server)) {
if (grp_server.getSelectedIndex() == 1) {
insert(indexOf(grp_server) + 1, tf_server);
String jid = tf_jid.getString();
tf_server.setString(get_server(jid) + ":5222");
} else {
int idx = indexOf(tf_server);
if (idx != -1) {
delete(idx);
}
}
return;
} else if (item.equals(grp_advanced)) {
if (grp_advanced.isSelected(0)) {
append(grp_server);
if (grp_server.isSelected(1)) {
append(tf_server);
}
} else {
delete(indexOf(grp_server));
int idx = indexOf(tf_server);
if (idx >= 0) delete(idx);
}
return;
} else if (item.equals(tf_jid)) {
if (grp_server.getSelectedIndex() == 1) {
String jid_server = get_server(tf_jid.getString());
if (!this.jid_server.equals(jid_server)) {
this.jid_server = jid_server;
grp_server.setSelectedIndex(0, true);
int idx = indexOf(tf_server);
if (idx >= 0) delete(idx);
}
}
}
// check if we must enable / disable
checkLogin();
}
/**
* check if we must enable the login
*/
private void checkLogin() {
TextField items[] = new TextField[] { null, null, null, null };
boolean checkmail[] = new boolean[] { true, false, true, false };
items[0] = tf_jid;
items[1] = tf_pwd;
if (register) {
items[2] = tf_email;
}
if (grp_server.getSelectedIndex() == 1) {
items[3] = tf_server;
}
boolean complete = true;
for (int i = 0; i < items.length; i++) {
if (items[i] == null) continue;
String s = items[i].getString();
if (s.length() == 0) {
complete = false;
break;
} else if (checkmail[i] && !Utils.is_email(s)) {
complete = false;
break;
}
;
}
int idx = indexOf(btn_login);
if (complete && idx == -1) {
insert(indexOf(grp_advanced), btn_login);
addCommand(cmd_login);
} else if (!complete && idx != -1) {
delete(idx);
removeCommand(cmd_login);
}
}
private String srvQuery() {
String jid = RegisterScreen.this.tf_jid.getString();
String host = jid.substring(jid.indexOf("@") + 1);
try {
String domain = host;
HttpConnection conn = (HttpConnection) Connector
.open(Config.SRV_QUERY_PATH + domain);
InputStream is = conn.openInputStream();
int b = -1;
StringBuffer buffer = new StringBuffer();
while ((b = is.read()) != -1) {
buffer.append((char) b);
}
String result = buffer.toString();
if ("_:-1".equals(result)) {
result = host + ":5222";
}
return result;
} catch (IOException e) {
return host + ":5222";
}
}
private String get_server(String jid) {
int server_idx = jid.indexOf("@");
if (server_idx >= 0) {
return jid.substring(server_idx + 1);
} else {
return "";
}
}
}