package com.mogujie.tt.utils; import java.util.LinkedList; import java.util.List; import com.mogujie.tt.cache.biz.CacheHub; import com.mogujie.tt.config.ProtocolConstant; import com.mogujie.tt.config.SysConstant; import com.mogujie.tt.entity.MessageInfo; import com.mogujie.tt.log.Logger; public class MessageSplitResult { public MessageSplitResult(MessageInfo info, byte[] content) { originMsgInfo = info; originContent = content; if (CacheHub.getInstance().getChatUser() != null) { logger.d("target user id = " + CacheHub.getInstance().getChatUser().getUserId() + " name = " + CacheHub.getInstance().getChatUser().getName()); } } private Logger logger = Logger.getLogger(MessageSplitResult.class); private boolean isTextMsgType(byte msgType) { return (msgType == ProtocolConstant.MSG_TYPE_GROUP_TEXT || msgType == ProtocolConstant.MSG_TYPE_P2P_TEXT); } private boolean isAudioMsgType(byte msgType) { return (msgType == ProtocolConstant.MSG_TYPE_GROUP_AUDIO || msgType == ProtocolConstant.MSG_TYPE_P2P_AUDIO); } public void decode() { byte msgType = originMsgInfo.getMsgType(); if (isAudioMsgType(msgType)) { setAudioDetail(); } else if (isTextMsgType(msgType)) { split(); } } private void split() { if (originMsgInfo == null || originContent == null) return; String strOriginContent = new String(originContent); if (strOriginContent == null || strOriginContent.equals("")) return; logger.d("chat#originContent:%s",strOriginContent); // C++程序员的写法.... 这里是不是可以抽出一个函数,放在StringUtil里面? by语鬼 String start = SysConstant.MESSAGE_IMAGE_LINK_START; String end = SysConstant.MESSAGE_IMAGE_LINK_END; while (!strOriginContent.isEmpty()) { int nStart = strOriginContent.indexOf(start); if (nStart < 0) {// 没有头 String strSplitString = strOriginContent; addMessage(strSplitString); strOriginContent = ""; } else { String subContentString = strOriginContent.substring(nStart); int nEnd = subContentString.indexOf(end); if (nEnd < 0) {// 没有尾 String strSplitString = strOriginContent; addMessage(strSplitString); strOriginContent = ""; } else {// 匹配到 String pre = strOriginContent.substring(0, nStart); addMessage(pre); String matchString = subContentString.substring(0, nEnd + end.length()); addMessage(matchString); strOriginContent = subContentString.substring(nEnd + end.length()); } } } } private MessageInfo originMsgInfo = null; private List<MessageInfo> MsgList = new LinkedList<MessageInfo>(); private byte[] originContent = null; private int nMsgParentId = -1; public void addMessage(String strContent) { if (strContent == null) return; strContent.trim(); if (strContent.equals("")) return; MessageInfo msgInfo = new MessageInfo(); msgInfo.copyFromOtherMsgInfo(originMsgInfo); if (strContent.startsWith(SysConstant.MESSAGE_IMAGE_LINK_START) && strContent.endsWith(SysConstant.MESSAGE_IMAGE_LINK_END)) { // image message msgInfo.setDisplayType(SysConstant.DISPLAY_TYPE_IMAGE); String imageUrl = strContent .substring(SysConstant.MESSAGE_IMAGE_LINK_START.length()); imageUrl = imageUrl.substring(0, imageUrl.indexOf(SysConstant.MESSAGE_IMAGE_LINK_END)); logger.d("recv an image message: image url = " + imageUrl); msgInfo.setUrl(imageUrl.isEmpty() ? null : imageUrl); msgInfo.setDisplayType(SysConstant.DISPLAY_TYPE_IMAGE); msgInfo.setMsgContent(""); msgInfo.setMsgLoadState(SysConstant.MESSAGE_STATE_UNLOAD); msgInfo.setMsgReadStatus(SysConstant.MESSAGE_UNREAD); msgInfo.setMsgParentId(nMsgParentId); // int newId = // IMDBManager.getInstance(Login.context).pushMsg(msgInfo); if (!FileUtil.isSdCardAvailuable()) { msgInfo.setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_FAILED); } // int newId = CacheHub.getInstance().obtainMsgId(); // if (newId > 0) { // msgInfo.setMsgId(newId); // CacheHub.getInstance().pushMsg(msgInfo); // logger.d("push to db, success"); // } // if (nMsgParentId == -1) { // nMsgParentId = newId; // } MsgList.add(msgInfo); } else { // text message msgInfo.setDisplayType(SysConstant.DISPLAY_TYPE_TEXT); msgInfo.setMsgContent(strContent); msgInfo.setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_SUCCESSED); msgInfo.setMsgReadStatus(SysConstant.MESSAGE_UNREAD); msgInfo.setMsgParentId(nMsgParentId); logger.d("recv a text message, content = " + strContent); // int newId = // IMDBManager.getInstance(Login.context).pushMsg(msgInfo); // int newId = CacheHub.getInstance().obtainMsgId(); // if (newId > 0) { // msgInfo.setMsgId(newId); // CacheHub.getInstance().pushMsg(msgInfo); // logger.d("push to db, success"); // } // if (nMsgParentId == -1) { // nMsgParentId = newId; // } MsgList.add(msgInfo); } } public byte[] getOriginContent() { return originContent; } public void setOriginContent(byte[] originContent) { this.originContent = originContent; } private void setAudioDetail() { if (originContent == null) return; MessageInfo audioMessageInfo = new MessageInfo(); audioMessageInfo.copyFromOtherMsgInfo(originMsgInfo); int msgLen = originContent.length; if (msgLen < 4) {// 错误判断 audioMessageInfo.setSavePath(""); audioMessageInfo.setPlayTime(0); audioMessageInfo.setDisplayType(SysConstant.DISPLAY_TYPE_AUDIO); } else { logger.d("recv an audio message"); byte[] playTimeByte = new byte[4]; byte[] audioContent = new byte[msgLen - 4]; System.arraycopy(originContent, 0, playTimeByte, 0, 4); System.arraycopy(originContent, 4, audioContent, 0, msgLen - 4); int playTime = CommonUtil.byteArray2int(playTimeByte); String audioSavePath = FileUtil .saveAudioResourceToFile(audioContent); audioMessageInfo.setPlayTime(playTime); audioMessageInfo.setSavePath(audioSavePath); audioMessageInfo.setDisplayType(SysConstant.DISPLAY_TYPE_AUDIO); } audioMessageInfo.setMsgParentId(nMsgParentId); // int newId = CacheHub.getInstance().obtainMsgId(); // if (newId > 0) { // audioMessageInfo.setMsgId(newId); // CacheHub.getInstance().pushMsg(audioMessageInfo); // } // // if (nMsgParentId == -1) { // nMsgParentId = newId; // } MsgList.add(audioMessageInfo); } public List<MessageInfo> getMsgList() { return MsgList; } public void setMsgList(List<MessageInfo> msgList) { MsgList = msgList; } }