/*
* ServiceDiscovery.java
*
* Created on 9 Февраль 2009 г., 15:58
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
// #sijapp cond.if protocols_JABBER is "true" #
package protocol.xmpp;
import jimm.Jimm;
import jimmui.view.text.TextList;
import jimmui.view.text.*;
import java.util.Vector;
import jimmui.view.*;
import jimmui.view.menu.*;
import jimm.util.JLocale;
import jimm.comm.*;
import jimmui.view.base.CanvasEx;
import jimmui.view.text.TextListController;
import jimmui.view.text.TextListModel;
import protocol.*;
/**
*
* @author Vladimir Kryukov
*/
public final class ServiceDiscovery extends TextListController implements TextBoxListener {
private boolean isConferenceList = false;
private int totalCount = 0;
private Xmpp xmpp;
private String serverJid;
private InputTextBox serverBox;
private InputTextBox searchBox;
private boolean shortView;
private Vector<String> jids = new Vector<String>();
private TextList screen = new TextList(JLocale.getString("service_discovery"));
private TextListModel model = new TextListModel();
private static final int COMMAND_ADD = 0;
private static final int COMMAND_SET = 1;
private static final int COMMAND_REGISTER = 2;
private static final int COMMAND_SEARCH = 3;
private static final int COMMAND_SET_SERVER = 4;
private static final int COMMAND_HOME = 5;
public ServiceDiscovery() {
serverBox = new InputTextBox().create("service_discovery_server", 64);
searchBox = new InputTextBox().create("service_discovery_search", 64);
screen.setModel(model);
}
public void setProtocol(Xmpp protocol) {
xmpp = protocol;
}
protected void doJimmAction(int action) {
doJimmBaseAction(action);
String jid = getCurrentJid();
if (!StringUtils.isEmpty(jid)) {
switch (action) {
case COMMAND_ADD:
Contact c = xmpp.createTempContact(jid);
xmpp.addContact(c);
Jimm.getJimm().getCL().activate(c);
break;
case COMMAND_SET:
setServer(jid);
screen.restore();
break;
case COMMAND_REGISTER:
xmpp.getConnection().register(jid);
break;
}
}
switch (action) {
case COMMAND_SEARCH:
searchBox.setTextBoxListener(this);
searchBox.show();
break;
case COMMAND_SET_SERVER:
serverBox.setString(serverJid);
serverBox.setTextBoxListener(this);
serverBox.show();
break;
case COMMAND_HOME:
setServer("");
screen.restore();
break;
}
}
protected MenuModel getMenu() {
MenuModel menu = new MenuModel();
String jid = getCurrentJid();
if (Jid.isConference(jid)) {
menu.addItem("service_discovery_add", COMMAND_ADD);
setDefaultCode(COMMAND_ADD);
} else if (Jid.isKnownGate(jid)) {
menu.addItem("register", COMMAND_REGISTER);
setDefaultCode(COMMAND_REGISTER);
} else {
menu.addItem("select", COMMAND_SET);
if (Jid.isGate(jid)) {
menu.addItem("register", COMMAND_REGISTER);
}
setDefaultCode(COMMAND_SET);
}
menu.addItem("service_discovery_search", COMMAND_SEARCH);
menu.addItem("service_discovery_server", COMMAND_SET_SERVER);
menu.addItem("service_discovery_home", COMMAND_HOME);
menu.setActionListener(this);
return menu;
}
private String getJid(int num) {
if (num < jids.size()) {
String rawJid = (String)jids.elementAt(num);
if (rawJid.endsWith("@")) {
return rawJid + serverJid;
}
return rawJid;
}
return "";
}
private int getJidIndex(int textIndex) {
if (!model.isSelectable(textIndex)) return -1;
int index = -1;
for (int i = 0; i <= textIndex; ++i) {
if (model.isSelectable(i)) index++;
}
return index;
}
private String getCurrentJid() {
int currentIndex = getJidIndex(screen.getContent().getCurrItem());
return (-1 == currentIndex) ? "" : getJid(currentIndex);
}
private void addServer(boolean active) {
if (0 < serverJid.length()) {
Parser item = model.createNewParser(active);
if (active) {
item.useMinHeight();
}
item.addText(serverJid, CanvasEx.THEME_TEXT, CanvasEx.FONT_STYLE_BOLD);
model.addPar(item);
if (active) {
jids.addElement(serverJid);
}
}
}
private void clear() {
model.clear();
jids.removeAllElements();
addServer(false);
screen.getContent().setAllToTop();
}
public void setTotalCount(int count) {
model.clear();
jids.removeAllElements();
addServer(true);
totalCount = count;
shortView |= (totalCount > 400);
screen.updateModel();
}
private String makeShortJid(String jid) {
if (isConferenceList) {
return jid.substring(0, jid.indexOf('@') + 1);
}
return jid;
}
private String makeReadableJid(String jid) {
if (isConferenceList) {
return jid;
}
if (Jid.isConference(serverJid)) {
return Jid.getResource(jid, jid);
}
jid = Util.replace(jid, "@conference.jabber.ru", "@c.j.ru");
return Util.replace(jid, "@conference.", "@c.");
}
public void addItem(String name, String jid) {
if (StringUtils.isEmpty(jid)) {
return;
}
String shortJid = makeShortJid(jid);
String visibleJid = makeReadableJid(shortJid);
Parser item = model.createNewParser(true);
item.useMinHeight();
item.addText(visibleJid, CanvasEx.THEME_TEXT,
shortView ? CanvasEx.FONT_STYLE_PLAIN : CanvasEx.FONT_STYLE_BOLD);
if (!shortView) {
if (StringUtils.isEmpty(name)) {
name = shortJid;
}
item.doCRLF();
item.addText(name, CanvasEx.THEME_TEXT, CanvasEx.FONT_STYLE_PLAIN);
}
model.addPar(item);
jids.addElement(shortJid);
if (0 == (jids.size() % 50)) {
screen.updateModel();
}
}
public void showIt() {
if (StringUtils.isEmpty(serverJid)) {
setServer("");
}
screen.setController(this);
screen.show();
}
public void update() {
screen.updateModel();
}
private void addUnique(String text, String jid) {
if (-1 == jids.indexOf(jid)) {
addItem(text, jid);
}
}
private void addBookmarks() {
Vector all = xmpp.getContactItems();
boolean notEmpty = false;
for (int i = 0; i < all.size(); ++i) {
XmppContact contact = (XmppContact)all.elementAt(i);
if (contact.isConference()) {
addUnique(contact.getName(), contact.getUserId());
notEmpty = true;
}
}
if (notEmpty) {
Parser br = model.createNewParser(false);
br.addText("\n", CanvasEx.THEME_TEXT, CanvasEx.FONT_STYLE_PLAIN);
model.addPar(br);
}
}
private void addBuildInList() {
addUnique("Jimm aspro", "jimm-aspro@conference.jabber.ru");
Parser br = model.createNewParser(false);
br.addText("\n", CanvasEx.THEME_TEXT, CanvasEx.FONT_STYLE_PLAIN);
model.addPar(br);
String domain = Jid.getDomain(xmpp.getUserId());
addUnique(JLocale.getString("my_server"), domain);
addUnique(JLocale.getString("conferences_on_") + domain, "conference." + domain);
}
public void setServer(String jid) {
jid = Jid.getNormalJid(jid);
totalCount = 0;
shortView = false;
serverJid = jid;
isConferenceList = (-1 == jid.indexOf('@')) && Jid.isConference('@' + jid);
clear();
if (0 == jid.length()) {
Config conf = new Config().loadLocale("/jabber-services.txt");
boolean conferences = true;
addBookmarks();
for (int i = 0; i < conf.getKeys().length; ++i) {
if (conferences && !Jid.isConference(conf.getKeys()[i])) {
conferences = false;
addBuildInList();
}
addUnique(conf.getValues()[i], conf.getKeys()[i]);
}
if (conferences) {
addBuildInList();
}
screen.updateModel();
return;
}
if (Jid.isConference(serverJid)) {
shortView = true;
}
Parser wait = model.createNewParser(false);
wait.addText(JLocale.getString("wait"),
CanvasEx.THEME_TEXT, CanvasEx.FONT_STYLE_PLAIN);
model.addPar(wait);
screen.updateModel();
xmpp.getConnection().requestDiscoItems(serverJid);
}
void setError(String description) {
clear();
Parser error = model.createNewParser(false);
error.addText(description, CanvasEx.THEME_TEXT, CanvasEx.FONT_STYLE_PLAIN);
model.addPar(error);
screen.updateModel();
}
private void setCurrTextIndex(int textIndex) {
int index = 0;
int currIndex = 0;
for (int i = 0; i < model.getSize(); ++i) {
if (model.isSelectable(i)) {
if (textIndex == currIndex) {
index = i;
break;
}
currIndex++;
}
}
screen.getContent().setCurrentItemIndex(index);
}
public void textboxAction(InputTextBox box, boolean ok) {
if (!ok) {
return;
}
if (serverBox == box) {
setServer(serverBox.getString());
screen.restore();
} else if (searchBox == box) {
String text = searchBox.getString();
if (isConferenceList) {
text = StringUtils.toLowerCase(text);
}
int currentIndex = getJidIndex(screen.getContent().getCurrItem()) + 1;
for (int i = currentIndex; i < jids.size(); ++i) {
String jid = (String)jids.elementAt(i);
if (-1 != jid.indexOf(text)) {
setCurrTextIndex(i);
break;
}
}
screen.restore();
}
}
}
// #sijapp cond.end #