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

📄 faceutil.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
字号:
/*
* LumaQQ - Java QQ Client
*
* Copyright (C) 2004 luma <stubma@163.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.tsinghua.lumaqq.utils;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import edu.tsinghua.lumaqq.FaceEntry;
import edu.tsinghua.lumaqq.IconHolder;
import edu.tsinghua.lumaqq.qq.Util;
import edu.tsinghua.lumaqq.xml.faces.Face;
import edu.tsinghua.lumaqq.xml.faces.FaceGroup;
import edu.tsinghua.lumaqq.xml.faces.FaceGroupImpl;
import edu.tsinghua.lumaqq.xml.faces.FaceImpl;
import edu.tsinghua.lumaqq.xml.faces.Faces;

/**
 * 管理自定义表情的工具类
 * 
 * @author luma
 */
public class FaceUtil {
	private Faces faces;
	private String fileName;
	
	// id号到md5的映射
	private Map id2md5;
	// md5到id的映射
	private Map md52id;
	// face到face group的映射
	private Map face2group;
	// md5到face的映射
	private Map md52face;
	// 组名到组的映射
	private Map name2group;
	
	// 接收到的表情映射
	private Map recv_md52id;
	private Map recv_id2md5;
	private Map recv_md52filename;
	
	// 接收到的自定义表情使用50000 - 65535之间的id范围,所以最多允许存放15536张表情
	private static final int MIN_RECEIVED_FACE_ID = 50000;
	private static final int MAX_RECEIVED_FACE_ID = 65535;
	private int currentReceivedId;
	
    // Log对象
    private static Log log = LogFactory.getLog(FaceUtil.class);
	
	// singleton模式
	private static FaceUtil instance = new FaceUtil();
	
	/**
	 * @return 单一实例
	 */
	public static FaceUtil getInstance() {
		return instance;
	}
	
	/**
	 * @return
	 * 		允许的最大接收表情数
	 */
	public int getMaxReceiveCount() {
	    return MAX_RECEIVED_FACE_ID - MIN_RECEIVED_FACE_ID + 1;
	}
	
	/**
	 * 构造函数
	 * @param options
	 */
	private FaceUtil() {
	    id2md5 = new HashMap();
	    md52id = new HashMap();
	    face2group = new HashMap();
	    md52face = new HashMap();
	    name2group = new HashMap();
	    recv_md52id = new HashMap();
	    recv_id2md5 = new HashMap();
	    recv_md52filename = new HashMap();
	    currentReceivedId = MIN_RECEIVED_FACE_ID;
	}
	
	/**
	 * 根据md5得到文件名
	 * 
	 * @param md5
	 * @return
	 * 		如果不存在返回null
	 */
	public String getFaceFileName(String md5) {
	    Face f = (Face)md52face.get(md5);
	    return (f == null) ? null : f.getFilename();
	}
	
	/**
	 * 添加一个接收到的表情md5
	 * 
	 * @param md5
	 * 		图片的md5
	 * @param filename
	 * 		图片文件名
	 */
	public void addReceivedFace(String md5, String filename) {
	    Integer id = new Integer(currentReceivedId);
	    recv_id2md5.put(id, md5);
	    recv_md52id.put(md5, id);
	    recv_md52filename.put(md5, filename);
	    if(currentReceivedId == MAX_RECEIVED_FACE_ID)
	        currentReceivedId = MIN_RECEIVED_FACE_ID;
	    else
	        currentReceivedId++;
	}
	
	/**
	 * 得到接收到的表情的md5
	 * 
	 * @param md5
	 * 		md5
	 * @return
	 * 		接收到表情的id
	 */
	public int getReceivedFaceId(String md5) {
	    Integer id = (Integer)recv_md52id.get(md5);
	    return (id == null) ? 0 : id.intValue();
	}
	
	/**
	 * 根据接收到的表情id得到表情的文件名
	 * 
	 * @param id
	 * 		表情id
	 * @return
	 * 		表情文件名
	 */
	public String getReceivedFaceFileNameById(int id) {
	    return (String)recv_md52filename.get(getReceiveFaceMd5(id));
	}
	
	/**
	 * 得到接收到的表情的md5
	 * 
	 * @param id
	 * @return
	 */
	public String getReceiveFaceMd5(int id) {
	    return (String)recv_id2md5.get(new Integer(id));
	}
	
	/**
	 * 把group组的第index个图片上移一个位置
	 * 
	 * @param group
	 * 		组索引
	 * @param index
	 * 		图片的组内索引
	 */
	public void upFace(int group, int index) {
	    FaceGroup g = getFaceGroup(group);
	    if(g == null)
	        return;
	    
	    List faces = g.getFaceList();
	    if(index < 1 || index >= faces.size())
	        return;
	    
	    Object obj = faces.remove(index);
	    faces.add(index - 1, obj);
	}
	
	/**
	 * 把group组的第index个图片下移一个位置
	 * 
	 * @param group
	 * 		组索引
	 * @param index
	 * 	
	 */
	public void downFace(int group, int index) {
	    FaceGroup g = getFaceGroup(group);
	    if(g == null)
	        return;
	    
	    List faces = g.getFaceList();
	    if(index < 0 || index >= faces.size() - 1)
	        return;
	    
	    Object obj = faces.remove(index);
	    faces.add(index + 1, obj);
	}
	
	/**
	 * 设置根元素对象
	 * 
	 * @param faces
	 */
	public void setFacesModel(Faces faces) {
		this.faces = faces;
		
		// 建立映射
		List groups = faces.getFaceGroupList();
		Iterator i = groups.iterator();
		while(i.hasNext()) {
			FaceGroup g = (FaceGroup)i.next();
			List f = g.getFaceList();
			Iterator fIter = f.iterator();
			while(fIter.hasNext()) {
				Face face = (Face)fIter.next();
				id2md5.put(face.getId(), face.getMd5());
				md52id.put(face.getMd5(), face.getId());
				md52face.put(face.getMd5(), face);
				face2group.put(face, g);
			}
		}
	}
	
	/**
	 * @return
	 * 		根元素对象
	 */
	public Faces getFacesModel() {
		return faces;
	}
	
	/**
	 * 添加一个组
	 * 
	 * @param name
	 * 		组名
	 */
	public void addGroup(String name) {
		if(faces == null)
			return;
		
		FaceGroup g = new FaceGroupImpl();
		g.setName(name);
		faces.addFaceGroup(g);
		name2group.put(g.getName(), g);
	}
	
	/**
	 * 删除一个组
	 * 
	 * @param name
	 * 		组名
	 */
	public void removeGroup(String name) {
		if(faces == null)
			return;
		
		FaceGroup g = getFaceGroup(name);
		if(g == null)
			return;
		
		faces.getFaceGroupList().remove(g);
	}
	
	/**
	 * 删除一个组
	 * 
	 * @param group
	 * 		组序号
	 */
	public FaceGroup removeGroup(int group) {
	    if(faces == null)
	        return null;
	    
	    if(group < 0 || group >= getGroupCount())
	        return null;
	    
	    return (FaceGroup)faces.getFaceGroupList().remove(group);
	}
	
	/**
	 * 添加一个表情
	 * 
	 * @param md5
	 * 		图片的md5
	 * @param g
	 * 		组元素对象
	 */
	public void addFace(FaceEntry entry, FaceGroup g) {
		Face f = new FaceImpl();
		f.setMd5(entry.md5);
		f.setFilename(entry.filename);
		f.setId(faces.getNextId());		
		g.addFace(f);
		id2md5.put(f.getId(), f.getMd5());
		md52id.put(f.getMd5(), f.getId());
		md52face.put(f.getMd5(), f);
		face2group.put(f, g);
		increaseNextId();
	}
	
	/**
	 * 从id得到md5
	 * 
	 * @param id
	 * 		id
	 * @return
	 * 		md5字符串
	 */
	public String getMd5ById(int id) {
		return getMd5ById(String.valueOf(id));
	}
	
	/**
	 * 从id得到md5
	 * 
	 * @param id
	 * 		id字符串
	 * @return
	 * 		md5字符串
	 */
	public String getMd5ById(String id) {
		return (String)id2md5.get(id);
	}
	
	/**
	 * 得到自定义表情组的个数
	 * 
	 * @return
	 * 		组个数
	 */
	public int getGroupCount() {
	    if(faces == null)
	        return 0;
	    else
	        return faces.getFaceGroupList().size();
	}
	
	/**
	 * 得到某个组中自定义表情数目
	 * 
	 * @param group
	 * @return
	 */
	public int getFaceCount(int group) {
	    FaceGroup g = getFaceGroup(group);
	    if(g == null)
	        return 0;
	    
	    return g.getFaceList().size();
	}
	
	/**
	 * 删除一个自定义表情
	 * 
	 * @param md5
	 */
	public void removeFace(String md5) {
		if(faces == null)
			return;
		
		Face f = (Face)md52face.remove(md5);
		if(f == null)
			return;
		
		md52id.remove(md5);
		id2md5.remove(f.getId());
		
		FaceGroup g = (FaceGroup)face2group.remove(f);
		if(g == null)
			return;
		
		g.getFaceList().remove(f);		
		face2group.remove(md52face.remove(md5));
	}
	
	/**
	 * 设置组名称
	 * 
	 * @param group
	 * @param name
	 */
	public void setGroupName(int group, String name) {
	    FaceGroup g = getFaceGroup(group);
	    if(g == null)
	        return;
	    
	    g.setName(name);
	}
	
	/**
	 * 下一个可用的id号加1
	 */
	private void increaseNextId() {
		int i = Util.getInt(faces.getNextId(), 0);
		i++;
		faces.setNextId(String.valueOf(i));
	}
	
	/**
	 * 移动一个表情到另外一个组
	 * 
	 * @param face
	 * 		表情文件元素对象
	 * @param destGroup
	 * 		目的组索引
	 */
	public void moveFace(Face face, int destGroup) {
	    FaceGroup dest = getFaceGroup(destGroup);
	    if(dest == null)
	        return;	    
	    FaceGroup src = (FaceGroup)face2group.get(face);
	    
	    src.getFaceList().remove(face);
	    dest.getFaceList().add(face);
	    face2group.put(face, dest);
	}
	
	/**
	 * 得到一个组
	 * 
	 * @param name
	 * 		组名
	 * @return
	 * 		如果没有这个组,返回null
	 */
	public FaceGroup getFaceGroup(String name) {
		return (FaceGroup)name2group.get(name);
	}
	
	/**
	 * 通过序号得到表情组
	 * 
	 * @param index
	 * @return
	 */
	public FaceGroup getFaceGroup(int index) {
	    if(faces == null)
	        return null;	    
	    List list = faces.getFaceGroupList();
	    if(index < 0 || index >= list.size())
	        return null;
	    return (FaceGroup)faces.getFaceGroupList().get(index);
	}
	
	/**
	 * 通过序号得到表情
	 * 
	 * @param group
	 * 		组序号
	 * @param index
	 * 		表情序号
	 * @return
	 * 		Face元素对象
	 */
	public Face getFace(int group, int index) {
	    FaceGroup g = getFaceGroup(group);
	    if(g == null)
	        return null;
	    List list = g.getFaceList();
	    if(index < 0 || index >= list.size())
	        return null;
	    return (Face)g.getFaceList().get(index);
	}
	
	/**
	 * 得到图片id
	 * 
	 * @param md5
	 * @return
	 */
	public int getFaceId(String md5) {
	    return Util.getInt((String)md52id.get(md5), 0);
	}
	
	/**
	 * 根据表情id得到Face对象
	 * 
	 * @param id
	 * 		id
	 * @return
	 * 		Face
	 */
	public Face getFace(int id) {
	    String md5 = getMd5ById(id);
	    return (Face)md52face.get(md5);
	}
	
	/**
	 * 检查是否存在这个face
	 * 
	 * @param md5
	 * 		图片的md5值
	 * @return
	 * 		true表示这个图片已经存在
	 */
	public boolean hasFace(String md5) {
	    return md52face.containsKey(md5);
	}
	
	/**
	 * 检查是否接收过的表情中有这个图片
	 * 
	 * @param md5
	 * 		图片的MD5
	 * @return
	 * 		true表示这个图片已经存在
	 */
	public boolean hasReceivedFace(String md5) {
	    return recv_md52id.containsKey(md5);
	}
	
	/**
	 * 保存设置
	 */
	public void save() {
		File file = new File(fileName);
		try {
			faces.marshal(file);
		} catch (IOException e) {
			log.error("无法保存系统设置文件,所作的改变将丢弃");
		}
	}
	
	/**
	 * 得到表情文件的长度
	 * 
	 * @param md5
	 * 		表情文件的md5
	 * @return
	 * 		长度
	 */
	public int getFaceLength(String md5) {
	    String path = IconHolder.getInstance().getCustomFacePath(getFaceFileName(md5));
	    File file = new File(path);
	    if(file.exists())
	        return (int)file.length();
	    else
	        return 0;
	}

	/**
	 * @param string
	 */
	public void setFileName(String string) {
		this.fileName = string;
	}
}

⌨️ 快捷键说明

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