/* * Jeti, a Java Jabber client, Copyright (C) 2001 E.S. de Boer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For questions, comments etc, * use the website at http://jeti.jabberstudio.org * or mail/IM me at jeti@jabber.org * */ package nu.fw.jeti.backend.roster; import java.util.*; import nu.fw.jeti.jabber.JID; import nu.fw.jeti.jabber.JIDStatus; import nu.fw.jeti.jabber.elements.Presence; import nu.fw.jeti.jabber.elements.RosterItem; import nu.fw.jeti.util.I18N; import nu.fw.jeti.util.Preferences; /** * Copyright: Copyright (c) 2001 * @author E.S. de Boer */ //stores jid + status //inconsistent with equals to make consistant add jid + equals if comletejids are same public class NormalJIDStatus extends SecondaryJIDStatus { private JID jid; private String nickname; private String subscription; private String waiting; private List groups; private ArrayList resources; private String resource; private String type; private boolean forcedOffline=false;//if transport loggedoff public NormalJIDStatus(RosterItem item) {//call update?? jid = item.getJID(); completeJID = jid; show = Presence.UNAVAILABLE; resource = completeJID.getResource(); JIDStatus server = Roster.getJIDStatus(new JID(jid.getDomain())); if(server == null) type =null; else type = server.getType(); update(item); } //add to special transport jid? public boolean isForcedOffline() { return forcedOffline; } public void setForcedOffline(boolean forced) { forcedOffline = forced; } //TODO REMOVE /** * Make jidStatus from jid and nickname (used by groupchat) * @param jid * @param nickname */ public NormalJIDStatus(JID jid,String nickname) {//call update?? this.jid = jid; completeJID = jid; this.nickname = nickname; if(nickname == null || nickname.equals("")) { this.nickname = jid.toString(); } show = Presence.UNAVAILABLE; resource = completeJID.getResource(); //System.out.println("jidstatus made"); JIDStatus server = Roster.getJIDStatus(new JID(jid.getDomain())); if(server == null) type =null; else type = server.getType(); } public void update(RosterItem item) { nickname = item.getName(); if(nickname == null || nickname.equals("")) { nickname = jid.toString(); } subscription = item.getSubscription(); waiting = item.getAsk(); if(item.getGroups()==null) { groups = new LinkedList(); groups.add(I18N.gettext("main.main.roster.Unfiled")); } else groups = item.getGroups(); } public void updatePresence(Presence presence) {//resources super.updatePresence(presence); resource = completeJID.getResource(); } public void sortSecondary() {//swap resources ,highest in normal if(resources == null) return; Collections.sort(resources); if(this.compareTo(resources.get(0)) > 0) { //System.out.println("swap"); ResourceJIDStatus resourceJIDStatus = (ResourceJIDStatus) resources.get(0); ResourceJIDStatus tempJIDStatus =(ResourceJIDStatus) resourceJIDStatus.clone(); resourceJIDStatus.update(completeJID,show,status,online); completeJID = tempJIDStatus.getCompleteJID(); resource = completeJID.getResource(); show = tempJIDStatus.getShow(); status = tempJIDStatus.getStatus(); online = tempJIDStatus.isOnline(); Collections.sort(resources); } } public String toString() {//jid if("msn".equals(type)&& Preferences.getBoolean("jeti","showRealNick", false)) { if(getMSNNick()!=null)return getMSNNick(); if(status!=null && jid.getUser()!=null) { return status; } return nickname; } return nickname; } public JID getJID(){return jid;} public void setStatus(String status) { this.status = status; } public String getNick() { return nickname; } public void setNick(String nick) { nickname = nick; } public String getType() { if(type == null) return "jabber"; return type; } public void setType(String type) { //System.out.println(type); this.type = type; } // public StringArray getNamespaces() // { // return namespaces; // } // // public void setNamespaces(StringArray namespaces) // { // this.namespaces = namespaces; // } public String getSubscription(){return subscription;} public String getWaiting() { return waiting; } public JIDStatus normalJIDStatus() { return this; } public SecondaryJIDStatus getSecondaryJIDStatus(String resource) { if(this.resource == null) { this.resource = resource; return this; } if(resource.equals(this.resource)) return this; if(resources !=null) { for(Iterator i = resources.iterator();i.hasNext();) { SecondaryJIDStatus secondary = (SecondaryJIDStatus)i.next(); if(resource.equals(secondary.getCompleteJID().getResource())) return secondary; } } return null; } public ResourceJIDStatus addSecondaryJIDStatus(JID jid) { ResourceJIDStatus resource = new ResourceJIDStatus(jid,this); if(resources == null) resources = new ArrayList(4); resources.add(resource); return resource; } public Iterator getSecondaryJIDStatussen() { if(resources ==null) { return new Iterator() { public boolean hasNext() { return false; } public Object next(){throw new NoSuchElementException();} public void remove(){} }; } else { return new Iterator() { private int count = resources.size(); public boolean hasNext() { return count > 0; } public Object next() { count--; if(count<0)throw new NoSuchElementException(); return resources.get(count); } public void remove(){} }; } } public ResourceJIDStatus removeResource(String resource) { //System.out.println(resource + " mee"); //System.out.println(this.resource + " eigen"); if(resource == null) return null; //no resource so remove nothing if(resource.equals(this.resource)) { //System.out.println(resource + " equal" ); if(resources != null) { ResourceJIDStatus resourceJIDStatus =(ResourceJIDStatus) resources.remove(0); completeJID = resourceJIDStatus.getCompleteJID(); this.resource = completeJID.getResource(); show = resourceJIDStatus.getShow(); status = resourceJIDStatus.getStatus(); online = resourceJIDStatus.isOnline(); if(resources.isEmpty()) resources = null; return resourceJIDStatus ; } else this.resource = null; completeJID = jid; return null;//resource does not change } if(resources==null) return null;// removing something that not exists for(Iterator i = resources.iterator();i.hasNext();) { ResourceJIDStatus resourceJIDStatus = (ResourceJIDStatus)i.next(); if(resourceJIDStatus.getCompleteJID().getResource().equals(resource)) { resources.remove(resourceJIDStatus); if(resources.isEmpty()) resources = null; return resourceJIDStatus; } } System.out.println("error"); //hier hoort ie niet te komen return null; } public int groupCount() { if(groups == null) return 0; return groups.size(); } public List getGroupsCopy() { return new LinkedList(groups); } public Iterator getGroups() { return groups.iterator(); } public boolean isGroupPresent(String group) { return groups.contains(group); } /* public boolean equals(Object object) { if (object instanceof JIDStatus) { JIDStatus temp = (JIDStatus)object; return temp.getCompleteJID().equals(completeJID); } else return false; } public int hashCode() { System.out.println("hash"); return completeJID.hashCode(); } */ public int compareTo(Object o) {//compare jid return compareTo(this,(JIDStatus)o); } public int compareTo(JIDStatus jidStatus1,JIDStatus jidStatus) { if(jidStatus1.equals(jidStatus)) return 0; if(jidStatus1.getShow() == jidStatus.getShow()) { if(jidStatus1.getJID().getDomain().equals(nu.fw.jeti.backend.Connect.getMyJID().getDomain())) {//is this jid own server? if(jidStatus.getJID().getDomain().equals(nu.fw.jeti.backend.Connect.getMyJID().getDomain())) {//other jid has the same server return (jidStatus1.getJID().toStringNoResource().compareTo(jidStatus.getJID().toString())); } return -1; } //check if other jid has the server you are logged in to if(jidStatus.getJID().getDomain().equals(nu.fw.jeti.backend.Connect.getMyJID().getDomain())) return 1; //check servertypes if(jidStatus1.getType().equals(jidStatus.getType())) { return (jidStatus1.getJID().toStringNoResource().compareTo(jidStatus.getJID().toString())); } if (getTypeRank(jidStatus1.getType()) < getTypeRank(jidStatus.getType())) return -1; return 1; } if(jidStatus1.getShow() < jidStatus.getShow()) return -1; return 1; } // private int getShowRank(String show) // { // if(show.equals("chat")) return 0; // if(show.equals("available")) return 1; // if(show.equals("away")) return 2; // if(show.equals("dnd")) return 3; // if(show.equals("xa")) return 4; // return 5; // } private int getTypeRank(String type) { if(type.equals("jabber")) return 0; if(type.equals("msn")) return 1; if(type.equals("icq")) return 2; return 3; } } /* * Overrides for emacs * Local variables: * tab-width: 4 * End: */