注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

widebright的个人空间

// 编程和生活

 
 
 

日志

 
 

Spark聊天信息加密插件第一部分ChatEncryptorPlugin 类,过滤消息事件  

2010-07-01 19:54:49|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在这里为所有的发送出去的消息与收到的消息,添加自己的处理动作

package papaya.guava.mango;

import java.io.IOException;

import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.spark.plugin.Plugin;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.ChatManager;
import org.jivesoftware.spark.ui.ChatRoom;
import org.jivesoftware.spark.ui.ChatRoomListenerAdapter;
import org.jivesoftware.spark.ui.MessageEventListener;
import org.jivesoftware.spark.ui.MessageFilter;
import org.jivesoftware.spark.ui.rooms.ChatRoomImpl;

/**
* Implements the Spark Plugin framework to display the different possibilities
* using Spark.
*/

public class ChatEncryptorPlugin implements Plugin {

/**
* Called after Spark is loaded to initialize the new plugin.
*/
public void initialize() {
   /*
   * 到http://www.igniterealtime.org/projects/spark/sparkplug-kit.jsp
   * 下载 Sparkplug Kit,回来之后。
   *
   * 1. 把sparkplugs\builder\build\build.xml 的
   *      ant buildfile文件导入自己工程修改好。
   *
   * 2. 按照sparkplug_dev_guide.html 导入spark的包,
   *      和配置好启动的class, 还有debug configure 的
   *      vm 参数加上下面两句之际spark的目录和自己插件的xml文件
   *      -Dappdir="C:\\Documents and Settings\\dddddd\\Desktop\\sparkplugs\\spark"
                -Dplugin="E:\Eclipse_workspace\ChatEncryptor\plugin.xml"
   *     
   * 3、直接运行会出现错误MAIN_IMAGE not found 错误
   *   需要 手工打开 spark.jar包
   *   把 \org\jivesoftware\resource 目录下
   *   spark.properties 和Default.class两个文件里面的
   *   MAIN_IMAGE 值修改成一样的,同时确保文件名在 spark.jar里面的
   *   images\ 文件夹下可以找到。
   *   我自己用java decompiler 反编译,然后调试了一下他的
   *   src/java/org/jivesoftware/resource/Default.java 文件才找出问题
   *  
   *   不知道是不是他们故意设置一个这样的门槛,呵呵
   *  
   * 4. 然后就可以调试插件了
   * */
  
   System.out.println("我的chat encryptor 插件开始运行了哦...");
   installMessageFilter();
   installMessageEventListenerForAllChatRoom();
}

/**
* Called when Spark is shutting down to allow for persistence of
* information or releasing of resources.
*/
public void shutdown() {

}

/**
* Return true if the Spark can shutdown on users request.
*
* @return true if Spark can shutdown on users request.
*/
public boolean canShutDown() {
   return true;
}

/**
* Is called when a user explicitly asked to uninstall this plugin. The
* plugin owner is responsible to clean up any resources and remove any
* components install in Spark.
*/
public void uninstall() {
   // Remove all resources belonging to this plugin.
}

/**
* Installs a new MessageFilter.
*/
private void installMessageFilter() {
   // Retrieve the ChatManager from SparkManager
   ChatManager chatManager = SparkManager.getChatManager();

   MessageFilter messageFilter = new MessageFilter() {
    /*
    * 查看这个源代码,这个在事件在添加到 聊天窗体之前 和接受之后触发,是比较合适的处理位置。
    */
    public void filterIncoming(ChatRoom room, Message message) {
     // 现在不支持群组消息

     boolean broadcast = message.getProperty("broadcast") != null;
     // If this is a group chat message, discard
     if (message.getType() == Message.Type.groupchat || broadcast
       || message.getType() == Message.Type.normal
       || message.getType() == Message.Type.headline) {
      return;
     }

     // Do not accept Administrative messages.
     final String host = SparkManager.getSessionManager()
       .getServerAddress();
     if (host.equals(message.getFrom())) {
      return;
     }

     if (message.getType() != Message.Type.chat) {
      return;
     }

     if (!(room instanceof ChatRoomImpl)) {
      return;
     }

     E2EProtocal.MessageIn(message);
    }

    /*
    * 查看这个源代码,这个是消息添加到聊天窗体之前触发, 不是合适的处理位置。加密应该在显示到聊天窗体之后才合适
    */
    public void filterOutgoing(ChatRoom room, Message message) {

    }

   };

   chatManager.addMessageFilter(messageFilter);

   // Just remember to remove your filter if need be.
}

private void installMessageEventListenerForAllChatRoom() {
   // Retrieve ChatManager from the SparkManager
   ChatManager chatManager = SparkManager.getChatManager();

   // Add to a new ChatRoom when the ChatRoom opens.
   chatManager.addChatRoomListener(new ChatRoomListenerAdapter() {
    public void chatRoomOpened(ChatRoom room) {
     // only do the translation for single chat
     if (room instanceof ChatRoomImpl) {
      final ChatRoomImpl roomImpl = (ChatRoomImpl) room;
      //
      // // Create a new ChatRoomButton.
      // final JComboBox translatorBox = new
      // JComboBox(TranslatorUtil.TranslationType.getTypes());
      //
      // translatorBox.addActionListener(new ActionListener() {
      // public void actionPerformed(ActionEvent e) {
      // // Set the focus back to the message box.
      // roomImpl.getChatInputEditor().requestFocusInWindow();
      // }
      // });
      //
      // roomImpl.getEditorBar().add(translatorBox);

      final MessageEventListener messageListener = new MessageEventListener() {

       /*
       * 这个在收到消息,添加到聊天记录之后,才触发, 不是的合适的处理点,解密应该在显示到聊天窗体之前做才合适
       */
       public void receivingMessage(Message message) {
       
       }

       /*
       * 这个事件在消息添加到 聊天记录之后,发送之前触发 比较适合的处理点 加密应该在显示到聊天窗体之后才合适
       */
       public void sendingMessage(Message message) {

        E2EProtocal.MessageOut(message);
       }

      };
      roomImpl.addMessageEventListener(messageListener);

     }
    }
   });

}

}

  评论这张
 
阅读(2539)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017