package com.mogujie.tt.packet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import com.mogujie.tt.config.ProtocolConstant;
import com.mogujie.tt.imlib.IMPacketDispatcher;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.packet.action.Action;
import com.mogujie.tt.packet.action.ActionCallback;
import com.mogujie.tt.packet.action.Action.Builder;
import com.mogujie.tt.packet.base.DataBuffer;
import com.mogujie.tt.packet.base.Header;
import com.mogujie.tt.packet.base.Packet;
/**
* 消息处理中心
*
* @author dolphinWang
* @time 2014/05/03
*/
public class MessageDispatchCenter {
/**
* 消息列表,可以自行添加
*/
public static final int MESSAGE_OFFLINE = 0x0001;
public static final int MESSAGE_ONLINE = 0x0002;
private static final ConcurrentHashMap<Integer, ArrayList<Handler>> mHandlerMap = new ConcurrentHashMap<Integer, ArrayList<Handler>>();
private static final List<Handler> mInterestAllList = new LinkedList<Handler>();
private Logger logger = Logger.getLogger(MessageDispatchCenter.class);
private static Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
final int what = msg.what;
final Object obj = msg.obj;
final ArrayList<Handler> list = mHandlerMap.get(what);
if (null != list) {
for (Handler handler : list) {
if (null != handler) {
handler.sendMessage(handler.obtainMessage(what, obj));
}
}
}
synchronized (mInterestAllList) {
for (Handler handler : mInterestAllList) {
if (null != handler) {
handler.sendMessage(handler.obtainMessage(what, obj));
} else {
mInterestAllList.remove(handler);
}
}
}
super.handleMessage(msg);
}
};
private MessageDispatchCenter() {
}
private static class SingletonHolder {
static MessageDispatchCenter center = new MessageDispatchCenter();
}
// public void OnRecvMessage(DataBuffer buffer) {
// logger.d("OnRecvMessage");
// if (null == buffer) {
// logger.d("buffer is empty");
// return;
// }
//
// try {
// Header header = new Header();
// header.decode(buffer);
//
//
// buffer.resetReaderIndex();
// int seqNo = header.getReserved();
// int commandId = header.getCommandId();
// int serviceId = header.getServiceId();
//
// ProtocolConstant.ProtocolDumper.dump(false, header);
//
// /*
// if (serviceId == ProtocolConstant.SID_MSG || serviceId == ProtocolConstant.SID_GROUP) {
// //todo eric
// IMPacketDispatcher.dispatch(serviceId, commandId, buffer);
// return;
// }
// */
//
//
// if (serviceId == ProtocolConstant.SID_MSG
// && commandId == ProtocolConstant.CID_MSG_UNREAD_MSG_RESPONSE) {
// }
// Packet packet = null;
// Action action = SocketMessageQueue.getInstance()
// .getFromWaitingList(seqNo);
// if (null == action) {// waitingList中没有找到,说明不是我们主动请求的
// // 脏包直接抛弃
// // TODO:
// if (seqNo != 0) {
// // 注释掉下面一行:@lanhu 不知道当时为什么要这样做
// // packet = PacketDistinguisher.make(serviceId, commandId,
// // null, false);
//
// logger.w("packet#seqNo is not 0, should be new packets");
// //IMPacketDispatcher.dispatch(serviceId, commandId, buffer);
//
//
// return;
// }
//
// // SERVER推过来的数据
// packet = PacketDistinguisher.make(serviceId, commandId, null,
// false);
// if (null == packet)
// return;
// Builder builder = new Builder();
// action = builder.setPacket(packet).setCallback(null).build();
// action.getPacket().decode(buffer);
// packet = action.getPacket();
// } else {
// action.getPacket().decode(buffer);
// packet = action.getPacket();
// ActionCallback callback = action.getCallback();
// if (null != callback && null != packet.getResponse()) {
// callback.onSuccess(packet);
// }
// }
//
// if (null != packet.getResponse()) {
// Message msg = new Message();
// msg.what = serviceId * 1000 + commandId;
// msg.obj = packet;
// mHandler.sendMessage(msg);
// } else {
// logger.e(
// " packet.getResponse() == null sid = " + serviceId
// + " cid = " + commandId);
// }
// } catch (Exception e) {
// logger.e("find exception");
// logger.e(e.getMessage());
// }
//
// }
public static MessageDispatchCenter getInstance() {
return SingletonHolder.center;
}
public void register(Handler hander, int... messages) {
synchronized (mHandlerMap) {
if (null == messages || messages.length == 0 || null == hander) {
return;
}
for (int message : messages) {
ArrayList<Handler> handlerList = mHandlerMap.get(message);
if (null == handlerList) {
handlerList = new ArrayList<Handler>();
handlerList.add(hander);
mHandlerMap.put(message, handlerList);
} else {
handlerList.add(hander);
}
}
}
}
public void registerAllInterest(Handler hander) {
if (null == hander)
return;
synchronized (mInterestAllList) {
if (!mInterestAllList.contains(hander))
mInterestAllList.add(hander);
}
}
public void unregisterAllInterest(Handler hander) {
if (null == hander)
return;
synchronized (mInterestAllList) {
if (mInterestAllList.contains(hander))
mInterestAllList.remove(hander);
}
}
public void unRegister(Handler hander) {
synchronized (mHandlerMap) {
if (null == hander) {
return;
}
Iterator<Entry<Integer, ArrayList<Handler>>> itor = mHandlerMap
.entrySet().iterator();
while (itor.hasNext()) {
Entry<Integer, ArrayList<Handler>> entry = itor.next();
final ArrayList<Handler> list = entry.getValue();
if (null != list && list.contains(hander)) {
list.remove(hander);
}
}
}
}
/**
* 这个函数提供针对某个handler的部分“取消注册”。如果messages参数为空或者没有值但handler不为空,
* 表示取消某个handler全部注册。 如果messages参数部位空但handler为空,表示取消某些message得注册。
*
* @param hander
* @param messages
*/
public void unRegister(Handler hander, int... messages) {
synchronized (mHandlerMap) {
if (null == messages && null == hander) {
return;
}
if (null == messages && null != hander) {
unRegister(hander);
} else if (null != messages && messages.length == 0
&& null == hander) {
unRegister(messages);
}
for (int message : messages) {
final ArrayList<Handler> list = mHandlerMap.get(message);
if (null != list) {
list.remove(hander);
}
}
}
}
/**
* 这个函数提供针对某个message的全部“取消注册”
*
* @param messages
*/
public void unRegister(int... messages) {
synchronized (mHandlerMap) {
for (int message : messages) {
final ArrayList<Handler> list = mHandlerMap.get(message);
list.clear();
}
}
}
public Handler getDispatcher() {
return mHandler;
}
}