Package com.liuyix.xmpp

Source Code of com.liuyix.xmpp.Register

package com.liuyix.xmpp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.IQTypeFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Registration;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.FormField;

/**
* 注册信息类,获取注册需要的所有信息并完成注册。
* */
public class Register {
 
  Connection conn;
  Registration regInfo;
  Map<String,String> attribs;
  String instruction;
  Form regForm = null;
  /**
   * 初始化Register,并获取注册需要的表单信息(调用getAttribs方法)。
   * @param conn 初始化参数
   *
   * */
  //FIXME 重构Register类,将错误输出改为Util类
  public Register(Connection conn){
    if(conn == null || conn.isConnected()==false || conn.isAuthenticated()==true){
      if(conn == null){
        System.err.println("Connection is NULL");
      }
      else if(conn.isConnected() == false){
        System.err.println("Connection is not connected");
      }
      else if(conn.isAuthenticated() == true){
        System.err.println("Connection is NULL");
      }
      System.err.println("RegisterInfo Error!@construction");
    }
    else{
      this.conn = conn;
      getAttribs();
    }
  }
  /**
   * 过滤得到Register信息包</br>
   * 建立一个过滤包类-->发送空register-->收register包-->取得attribs,form
   * */
  private void getAttribs(){
    PacketFilter filter = new AndFilter(new PacketTypeFilter(IQ.class),new IQTypeFilter(IQ.Type.RESULT));
    PacketCollector regCollector = conn.createPacketCollector(filter);
    //发送空的registration
    conn.sendPacket(new Registration());
    //等待包
    Packet recvPacket = regCollector.nextResult();
    Registration recvReg = (Registration)recvPacket;
    attribs = recvReg.getAttributes();
    regInfo = new Registration();
    regInfo.setAttributes(attribs);
    if(recvPacket.getExtension("jabber:x:data")!=null){
      //有FORM项
      regForm = Form.getFormFrom(recvPacket);
    }
    else regForm = null;
    return ;
  }
  /**
   * 得到注册信息
   * @param reader 得到注册信息的输入流
   * @param writer 输出需要的注册信息的输出流
   * */
  private void getRegInfo(BufferedReader reader,BufferedWriter writer){
    String inputStr = null;
    try {
      if(regForm == null){
        //无FORM则输出register     
          for(Map.Entry<String, String>m:attribs.entrySet()){         
              writer.append(m.getKey() + "\n");
              //不flush则无法输出
              writer.flush();
              inputStr = reader.readLine();
              regInfo.getAttributes().put(m.getKey(), inputStr);
          }
      }
      else {
        //TODO 重构注册信息的显示,要更清晰,可考虑独立出一个方法
        Form formToSend = regForm.createAnswerForm();
        for(Iterator<FormField> itr =regForm.getFields();itr.hasNext();){
          FormField field = itr.next();
          writer.append(field.getDescription() + "\n");
          writer.append(field.getLabel() + "\n");
          writer.append(field.isRequired()?"Required":"No required");
          Iterator<String> formFielditr = field.getValues();
          if(formFielditr != null){
            writer.append("Options:\n");
            while(formFielditr.hasNext()){
              writer.append(formFielditr.next() + "\n");
            }
          }
          writer.flush();
          inputStr = reader.readLine();
          formToSend.setAnswer(field.getVariable(), inputStr);
        }//end for
        //将填写好的表单附加到regInfo后面
        regInfo.addExtension(formToSend.getDataFormToSend());
        regInfo.setType(IQ.Type.SET);
      }
    }catch (IOException e) {
//      e.printStackTrace();
      System.err.println("getRegInfo exception.\n" + e.getMessage());
    }//end try..catch
  }
 
  /**
   * RegisterHandler:调用其他函数,完成注册
   * @author cnliuyix
   * @param reader 读入数据流
   * @param writer 提示信息数据流
   * */
  public void registerHandler(BufferedReader reader,BufferedWriter writer){
    if(reader == null || writer == null){
      throw new IllegalArgumentException("parameters is null!");
    }
    else{
      getRegInfo(reader, writer);
      conn.sendPacket(regInfo);
    }
  } 
}
TOP

Related Classes of com.liuyix.xmpp.Register

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.