/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package protocol.xmpp;
// #sijapp cond.if protocols_JABBER is "true" #
import java.util.Vector;
import javax.microedition.lcdui.*;
import jimm.comm.*;
import jimmui.view.UIBuilder;
import jimmui.view.form.Form;
import jimmui.view.form.FormListener;
import jimm.util.JLocale;
/**
*
* @author Vladimir Kryukov
*/
final class XForm {
private Form form;
private boolean waitingForm;
private boolean isXData;
private Vector<String> fields = new Vector<String>();
private Vector<String> types = new Vector<String>();
private Vector<String> values = new Vector<String>();
XForm() {
this.waitingForm = true;
}
void init(String caption, FormListener listener) {
form = UIBuilder.createForm(caption, "ok", "back", listener);
}
public boolean isWaiting() {
return waitingForm;
}
public int getSize() {
return fields.size();
}
public void back() {
form.back();
}
public void clearForm() {
form.clearForm();
}
public Form getForm() {
return form;
}
public void setWainting() {
waitingForm = true;
form.clearForm();
form.addString(JLocale.getString("wait"));
}
public void setErrorMessage(String error) {
form.clearForm();
form.addString(error);
form.restore();
}
public String getField(String name) {
for (int i = 0; i < fields.size(); ++i) {
String field = (String)fields.elementAt(i);
if (name.equals(field)) {
return form.getTextFieldValue(i);
}
}
return null;
}
public void loadXFromXml(XmlNode xml, XmlNode baseXml) {
waitingForm = false;
clearForm();
XmlNode xForm = xml.getFirstNode("x", "jabber:x:data");
isXData = (null != xForm);
if (!isXData) {
return;
}
addInfo(xForm.getFirstNodeValue("ti" + "tle"),
xForm.getFirstNodeValue("instruct" + "ions"));
for (int i = 0; i < xForm.childrenCount(); ++i) {
XmlNode item = xForm.childAt(i);
if (!item.is("fie" + "ld")) {
continue;
}
if (item.contains("m" + "edia")) {
String bs64img = baseXml.getFirstNodeValueRecursive("d" + "ata");
if (null != bs64img) {
byte[] imgBytes = Util.base64decode(bs64img);
bs64img = null;
form.addImage(Image.createImage(imgBytes, 0, imgBytes.length));
}
}
addField(item, item.getAttribute("ty" + "pe"));
}
}
public void loadFromXml(XmlNode xml, XmlNode baseXml) {
waitingForm = false;
clearForm();
XmlNode xForm = xml.getFirstNode("x", "jabber:x:data");
isXData = (null != xForm);
if (isXData) {
loadXFromXml(xml, baseXml);
return;
}
addInfo(xml.getFirstNodeValue("ti" + "tle"),
xml.getFirstNodeValue("instruct" + "ions"));
for (int i = 0; i < xml.childrenCount(); ++i) {
XmlNode item = xml.childAt(i);
if (item.is(S_EMAIL)) {
addField(S_EMAIL, S_TEXT_SINGLE, "e-mail", "");
} else if (item.is(S_USERNAME)) {
addField(S_USERNAME, S_TEXT_SINGLE, "nick", "");
} else if (item.is(S_PASSWORD)) {
addField(S_PASSWORD, S_TEXT_PRIVATE, "password", "");
} else if (item.is(S_KEY)) {
addField(S_KEY, S_HIDDEN, "", "");
}
}
}
public String getXmlForm() {
for (int i = 0; i < fields.size(); ++i) {
String itemType = (String)types.elementAt(i);
if (S_LIST_SINGLE.equals(itemType)) {
String[] list = Util.explode((String)values.elementAt(i), '|');
values.setElementAt(list[form.getSelectorValue(i)], i);
} else if (itemType.startsWith("jid-")) {
values.setElementAt(form.getTextFieldValue(i), i);
} else if (itemType.startsWith("text-")) {
values.setElementAt(form.getTextFieldValue(i), i);
} else if (S_BOOLEAN.equals(itemType)) {
values.setElementAt(form.getCheckBoxValue(i) ? "1" : "0", i);
} else if ("".equals(itemType)) {
values.setElementAt(form.getTextFieldValue(i), i);
}
}
StringBuilder sb = new StringBuilder();
if (!isXData) {
for (int i = 0; i < fields.size(); ++i) {
sb.append("<").append((String)fields.elementAt(i)).append(">");
sb.append(Util.xmlEscape((String)values.elementAt(i)));
sb.append("</").append((String)fields.elementAt(i)).append(">");
}
return sb.toString();
}
sb.append("<x xmlns='jabber:x:data' type='submit'>");
for (int i = 0; i < fields.size(); ++i) {
String itemType = (String)types.elementAt(i);
String value = (String)values.elementAt(i);
sb.append("<field type='");
sb.append(Util.xmlEscape(itemType));
sb.append("' var='");
sb.append(Util.xmlEscape((String)fields.elementAt(i)));
sb.append("'><value>");
if (S_JID_MULTI.equals(itemType) || S_TEXT_MULTI.equals(itemType)) {
String[] vals = Util.explode(value.trim(), '\n');
for (int j = 0; j < vals.length; ++j) {
sb.append(Util.xmlEscape(vals[j]));
if (j != vals.length - 1) {
sb.append("</value><value>");
}
}
} else {
sb.append(Util.xmlEscape(value));
}
sb.append("</value></field>");
}
sb.append("</x>");
return sb.toString();
}
private void addField(XmlNode field, String type) {
final String S_VALUE = "va" + "lue";
final String S_OPTION = "o" + "ption";
final String S_LABEL = "la" + "bel";
String name = StringUtils.notNull(field.getAttribute("var"));
String label = StringUtils.notNull(field.getAttribute(S_LABEL));
String value = StringUtils.notNull(field.getFirstNodeValue(S_VALUE));
if (S_LIST_SINGLE.equals(type)) {
int selectedIndex = 0;
int totalCount = 0;
StringBuilder items = new StringBuilder();
StringBuilder labels = new StringBuilder();
field.removeNode(S_VALUE);
for (int i = 0; i < field.childrenCount(); ++i) {
XmlNode opt = field.childAt(i);
if (opt.is(S_OPTION)) {
String curValue = opt.getFirstNodeValue(S_VALUE);
labels.append('|').append(opt.getAttribute(S_LABEL));
items.append('|').append(curValue);
if (value.equals(curValue)) {
selectedIndex = totalCount;
}
totalCount++;
}
}
items.deleteCharAt(0);
labels.deleteCharAt(0);
int num = fields.size();
fields.addElement(name);
types.addElement(type);
values.addElement(items.toString());
form.addSelector(num, label, Util.explode(labels.toString(), '|'), selectedIndex);
} else if (S_JID_MULTI.equals(type) || S_TEXT_MULTI.equals(type)) {
StringBuilder all = new StringBuilder();
for (int i = 0; i < field.childrenCount(); ++i) {
XmlNode opt = field.childAt(i);
if (opt.is(S_VALUE)) {
all.append(opt.value).append('\n');
}
}
value = all.toString();
addField(name, type, label, value);
} else if (S_FIXED.equals(type)) {
form.addString(value);
} else {
addField(name, type, label, value);
}
// String desc = field.getFirstNodeValue("des" + "c");
// if (!StringConvertor.isEmpty(desc)) {
// form.addString(desc);
// }
}
private void addInfo(String title, String instructions) {
form.addString(title, instructions);
}
private void addField(String name, String type, String label, String value) {
int num = fields.size();
name = StringUtils.notNull(name);
type = StringUtils.notNull(type);
value = StringUtils.notNull(value);
fields.addElement(name);
types.addElement(type);
values.addElement(value);
if (S_HIDDEN.equals(type)) {
} else if (S_TEXT_SINGLE.equals(type)) {
form.addTextField(num, label, value, 512);
} else if (S_TEXT_MULTI.equals(type)) {
int size = Math.max(2 * 1024, value.length());
form.addTextField(num, label, value, size);
} else if (S_TEXT_PRIVATE.equals(type)) {
form.addPasswordField(num, label, value, 512);
} else if (S_BOOLEAN.equals(type)) {
form.addCheckBox(num, label, XmppConnection.isTrue(value));
} else if (S_JID_SINGLE.equals(type)) {
form.addTextField(num, label, value, 512);
} else if (S_JID_MULTI.equals(type)) {
int size = Math.max(2 * 1024, value.length());
form.addTextField(num, label, value, size);
} else if ("".equals(type)) {
form.addTextField(num, label, value, 512);
}
}
private final static String S_EMAIL = "emai" + "l";
public final static String S_USERNAME = "u" + "sername";
public final static String S_PASSWORD = "p" + "assword";
private final static String S_KEY = "k" + "e" + "y";
private static final String S_TEXT_SINGLE = "text-single";
private static final String S_LIST_SINGLE = "list-single";
private static final String S_TEXT_PRIVATE = "text-private";
private static final String S_JID_SINGLE = "jid-single";
private static final String S_JID_MULTI = "jid-multi";
private static final String S_HIDDEN = "hid" + "den";
private static final String S_BOOLEAN = "bo" + "olean";
private static final String S_FIXED = "f" + "ixed";
private static final String S_TEXT_MULTI = "text-multi";
}
// #sijapp cond.end #