⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsregisterbean.java

📁 一款即时通讯软件
💻 JAVA
字号:
package edu.ou.kmi.buddyspace.core;

/*
 * BSRegisterBean.java
 *
 * Project: BuddySpace
 * (C) Copyright Knowledge Media Institute 2002
 *
 *
 * Created on 5 August 2002, 14:59
 */

import java.util.*;
import org.jabber.jabberbeans.*;
import org.jabber.jabberbeans.util.*;
//import org.jabber.jabberbeans.Extension.*;
import org.jabber.jabberbeans.Extension.Extension;
import edu.ou.kmi.buddyspace.xml.*;

/**
 * <code>BSRegisterBean</code> provides new account registration handling.
 * It relies on <code>BSInfoQueryBean</code>, which must be set after each
 * reconnection.
 *
 * @author  Jiri Komzak, Knowledge Media Institute, Open University, United Kingdom
 */
public class BSRegisterBean implements PacketListener {
    private IQBean iqBean = null;
    private final String name = "Registration";
    private Vector regListeners;
    private Hashtable servedTasks;
    
    /**
     * Constructor
     */
    BSRegisterBean() {
        servedTasks = new Hashtable();
        regListeners = new Vector();
    }
    
    /**
     * Constructor, which sets existing and connected <code>IQBean</code>.
     * Then this is registered as listener for IQ packets.
     */
    BSRegisterBean(IQBean iqBean) {
        this();
        setIQBean(iqBean);
    }
    
    /**
     * Sets existing and connected <code>IQBean</code>.
     * Then this is registered as listener for IQ packets.
     */
    protected void setIQBean(IQBean iqBean) {
        if (this.iqBean != null)
            this.iqBean.delPacketListener(this);
        this.iqBean = iqBean;
        if (iqBean != null)
            iqBean.addPacketListener(this);
        
        servedTasks.clear();
    }
    
    /**
     * Returns currently used <code>IQBean</code>.
     */
    protected IQBean getIQBean() {
        return iqBean;
    }
    
    /**
     * Frees all object bindings to allow object destroy
     */
    protected void prepareToDestroy() {
        removeAllRegListeners();
        if (iqBean != null)
            iqBean.delPacketListener(this);
        iqBean = null;
        servedTasks.clear();
    }
    
    /**
     * Sets current state in registration process for given jid.
     */
    private void setState(JID jid, int state, String servedID) {
        //String jidStr = (jid == null)? "@@@" : BSPresenceBean.getJIDHashString(jid, true);
        JID key = (jid == null)? new JID("@@@") : jid;
        //BSRegState task = (BSRegState) servedTasks.get(jidStr);
        BSRegState task = (BSRegState) servedTasks.get(key);
        if (task == null) {
            task = new BSRegState();
            //servedTasks.put(jidStr, task);
            servedTasks.put(key, task);
        }
        task.jid = jid;
        task.value = state;
        task.servedID = servedID;
    }
    
    /**
     * Returns state for given JID.
     */
    private BSRegState getState(JID jid) {
        //String jidStr = (jid == null)? "@@@" : BSPresenceBean.getJIDHashString(jid, true);
        JID key = (jid == null)? new JID("@@@") : jid;
        //BSRegState task = (BSRegState) servedTasks.get(jidStr);
        BSRegState task = (BSRegState) servedTasks.get(key);
        return task;
    }
    
    /**
     * Invokes registration.
     */
    public boolean register(JID jid, PacketID packetID) {
        
        if (iqBean == null || iqBean.getConnection() == null) {
            BSCore.logEvent(name, "error: not connected");
            return false;
        }
        
        // starts logging in
        String id = new String("BS_REG_" + String.valueOf(BSCore.getNextID()));
        if (packetID != null) packetID.setID(id);
        setState(jid, BSRegState.REGISTERING1, id);
        InfoQueryBuilder iqBuilder = new InfoQueryBuilder();
        IQRegisterBuilder iqRegBuilder = new IQRegisterBuilder();
        
        try {
            iqBuilder.addExtension(iqRegBuilder.build());
            iqBuilder.setType("get");
            iqBuilder.setIdentifier(id);
            if (jid != null) 
                iqBuilder.setToAddress(jid);
            iqBean.getConnection().send(iqBuilder.build());
        } catch (InstantiationException e) {
            BSCore.logEvent(name, "error: IQ builder failed");
            setState(jid, BSRegState.NOT_REGISTERED, null);
            return false;
        }
        
        BSCore.logEvent(name, "registration phase 1");
        return true;
    }
    
    /**
     * Sends user information needed for registration.
     * This is done during the second phase of registration process.
     */
    public boolean sendInfos(JID jid, PacketID packetID, Hashtable regInfos) {
        if (iqBean == null || iqBean.getConnection() == null) {
            BSCore.logEvent(name, "error: not connected");
            return false;
        }
        // sends the required information
        String id = new String("BS_REG_" + String.valueOf(BSCore.getNextID()));
        if (packetID != null) packetID.setID(id);
        setState(jid, BSRegState.REGISTERING2, id);
        InfoQueryBuilder iqBuilder = new InfoQueryBuilder();
        IQRegisterBuilder iqRegBuilder = new IQRegisterBuilder();
        
        Enumeration names = regInfos.keys();
        while (names.hasMoreElements()) {
            String n = (String) names.nextElement();
            String v = (String) regInfos.get(n);
            iqRegBuilder.set(n, v);
        }
        
        try {
            iqBuilder.addExtension(iqRegBuilder.build());
            iqBuilder.setType("set");
            iqBuilder.setIdentifier(id);
            if (jid != null) iqBuilder.setToAddress(jid);
            iqBean.getConnection().send(iqBuilder.build());
        } catch (InstantiationException e) {
            BSCore.logEvent(name, "error: IQ builder failed");
            setState(jid, BSRegState.NOT_REGISTERED, null);
            return false;
        }
        
        // will wait for register response
        BSCore.logEvent(name, "registration phase 2");
        return true;
    }
    
    /**
     * Directly sends user information needed for registration. Doesn't
     * ask for needed information and sends only username and password.
     */
    public boolean sendInfos(String username, String password, PacketID packetID) {
        Hashtable values = new Hashtable();
        values.put("username", username);
        values.put("password", password);
        
        return sendInfos(null, packetID, values);
    }
    
    // *** packet handling ***
    
    /**
     * Invoked when a IQ packet is received.
     */
    public void receivedPacket(PacketEvent pe) {
        if (!(pe.getPacket() instanceof InfoQuery)) {
            BSCore.logEvent(name, "warning: nonIQ packet received");
            return;
        }
        
        InfoQuery iq = (InfoQuery) pe.getPacket();
        BSRegState task = getState(iq.getFromAddress());
        if (task == null || task.servedID == null || 
            !task.servedID.equals(iq.getIdentifier()))
            return;
        
        if (iq.getType() != null && iq.getType().equals("result"))
            handleResult(iq, task);
        else if (iq.getType() != null && iq.getType().equals("error"))
            handleError(iq, task);
        else if (iq.getType() != null && iq.getType().equals("set"))
            handleSet(iq, task);
    }
    
    /**
     * Invoked when a IQ packet send failes.
     */
    public void sendFailed(PacketEvent pe) { }
    
    /**
     * Invoked when a IQ packet is sent.
     */
    public void sentPacket(PacketEvent pe) { }

    // *** infoQuery handling ***
    
    /**
     * Handles <code>InfoQuery</code> packet, if it does contain an error.
     * Before this is called it checks if that is response on the sent IQ
     * authentication packet.
     */
    private void handleError(InfoQuery iq, BSRegState task) {
        BSCore.logEvent(name, "error " + iq.getErrorCode() + ": " + iq.getErrorText());
        setState(task.jid, BSRegState.NOT_REGISTERED, null);
        fireError(iq, iq.getIdentifier());
    }
    
    /**
     * Handles <code>InfoQuery</code> packet, if it does contain a result.
     * Before this is called it checks if that is response on the sent IQ
     * authentication packet.
     */
    private void handleResult(InfoQuery iq, BSRegState task) {
        String id = iq.getIdentifier();
        
        if (task.value == BSRegState.REGISTERING1) {
            // calls to enter the required values
            fireRegInfosRequired(iq, id);
        }
        
        else if (task.value == BSRegState.REGISTERING2) {
            setState(iq.getFromAddress(), BSRegState.REGISTERED, null);
            fireRegistered(iq, id);
        }
        
        else {
            BSCore.logEvent(name, "error: unexpected IQ result");
            //servedID = null;
            //setState(BSAuthState.NOT_REGISTERED);
        }
    }
    
    public Hashtable getRequiredInfos(InfoQuery iq) {
        Hashtable requiredInfos = new Hashtable();
        
        if (iq == null) return requiredInfos;
        
        Enumeration extensions = iq.Extensions();
        
        // for all extensions
        while (extensions != null && extensions.hasMoreElements()) {
            Extension ext = (Extension) extensions.nextElement();
            // if that is a register extension
            if (ext instanceof IQRegister) {
                // reads the tags names and values into a hashtable
                Enumeration names = ((IQRegister)ext).getNames();
                while (names.hasMoreElements()) {
                    String n = (String) names.nextElement();
                    String v = ((IQRegister)ext).getValue(n);
                    requiredInfos.put(n, v);
                }
            }
            else if (ext instanceof org.jabber.jabberbeans.Extension.IQRegister) {
                // reads the tags names and values into a hashtable
                Enumeration names = ((org.jabber.jabberbeans.Extension.IQRegister)ext).getNames();
                while (names.hasMoreElements()) {
                    String n = (String) names.nextElement();
                    String v = ((org.jabber.jabberbeans.Extension.IQRegister)ext).getValue(n);
                    requiredInfos.put(n, v);
                }
            }
            // if that is a register extension
            /*else if (ext instanceof edu.ou.kmi.buddyspace.xml.IQRegister) {
                // reads the tags names and values into a hashtable
                Enumeration names = ((edu.ou.kmi.buddyspace.xml.IQRegister)ext).getNames();
                while (names.hasMoreElements()) {
                    String n = (String) names.nextElement();
                    String v = ((edu.ou.kmi.buddyspace.xml.IQRegister)ext).getValue(n);
                    requiredInfos.put(n, v);
                }
            }*/
        }
        
        return requiredInfos;
    }
    
    /**
     * Handles <code>InfoQuery</code> packet, if it IQ-set.
     * Before this is called it checks if that is response on the sent IQ
     * authentication packet.
     */
    private void handleSet(InfoQuery iq, BSRegState task) {
        return;
    }
    
    // *** registration listeners ***
    /**
     * Adds <code>BSRegListener</code> to listeners notified when
     * registration state changes.
     *
     * @see #removeRegListener
     * @see #removeAllRegListeners
     * @see #notifyRegListeners
     */
    public void addRegListener(BSRegListener listener) {
        //assert listener != null : listener;
        if (listener == null) return;
        if (!regListeners.contains(listener)) {
            regListeners.addElement(listener);
        }
    }

    /**
     * Removes <code>BSRegListener</code> to listeners notified when
     * registration state changes.
     *
     * @see #addRegListener
     * @see #removeAllRegListeners
     * @see #notifyRegListeners
     */
    public void removeRegListener(BSRegListener listener) {
        //assert listener != null : listener;
        if (listener == null) return;
        regListeners.removeElement(listener);
    }

    /**
     * Removes all listeners notified when registration state changes.
     * This can be used before to free dependencies and allow dispose of
     * all objects.
     *
     * @see #addRegListener
     * @see #removeRegListener
     * @see #notifyRegListeners
     */
    public void removeAllRegListeners() {
        regListeners.clear();
    }

    /**
     * Notifies registration listeners.
     *
     * @see #addRegListeners
     * @see #removeRegListener
     * @see #removeAllRegListeners
     */
    protected void fireRegInfosRequired(InfoQuery iq, String id) {
        for (Enumeration e = regListeners.elements(); e.hasMoreElements(); ) {
            BSRegListener listener = (BSRegListener) e.nextElement();
            listener.regInfosNeeded(iq, id);
        }
    }
    
    protected void fireRegistered(InfoQuery iq, String id) {
        for (Enumeration e = regListeners.elements(); e.hasMoreElements(); ) {
            BSRegListener listener = (BSRegListener) e.nextElement();
            listener.registered(iq, id);
        }
    }
    
    protected void fireError(InfoQuery iq, String id) {
        for (Enumeration e = regListeners.elements(); e.hasMoreElements(); ) {
            BSRegListener listener = (BSRegListener) e.nextElement();
            listener.regError(iq, id);
        }
    }
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -