/* Copyright (C) 2011 monte This file is part of PSP NetParty. PSP NetParty 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 3 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, see <http://www.gnu.org/licenses/>. */ package pspnetparty.lib; import java.io.PrintWriter; import java.io.StringWriter; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.util.Date; import org.jnetpcap.protocol.lan.Ethernet; import pspnetparty.lib.constants.AppConstants; public class Utility { private Utility() { } public static int compare(long l1, long l2) { if (l1 < l2) return -1; else if (l1 > l2) return 1; else return 0; } public static int compare(int i1, int i2) { if (i1 < i2) return -1; else if (i1 > i2) return 1; else return 0; } public static ByteBuffer encode(CharSequence cs) { return AppConstants.CHARSET.encode(CharBuffer.wrap(cs)); } public static String decode(ByteBuffer buffer) { return AppConstants.CHARSET.decode(buffer).toString(); } public static String toHexString(ByteBuffer buffer) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); for (int i = buffer.position(); i < buffer.limit(); i++) { byte b = buffer.get(i); pw.format("%02X ", b); } return sw.toString(); } public static String stackTraceToString(Throwable exception) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); exception.printStackTrace(pw); return sw.toString(); } public static boolean isEmpty(String str) { if (str == null) return true; return "".equals(str); } public static boolean equals(String str1, String str2) { if (str1 == str2) return true; if (isEmpty(str1)) return isEmpty(str2); return str1.equals(str2); } public static String trim(String string, int maxLength) { if (string == null) return ""; return string.substring(0, Math.min(maxLength, string.length())); } public static String multiLineToSingleLine(String lines) { if (lines == null) return ""; return lines.replace("\r", "").replace("\n", " "); } public static String validateNameString(String name) { return name.replaceAll("(^[\\s ]+|[\\s ]+$)", "").replaceAll("[\\s ]+", " "); } public static boolean isValidNameString(String name) { if (name == null || name.length() == 0 || name.length() > AppConstants.NAME_STRING_MAX_LENGTH) return false; return !name.matches("(^[\\s ]+.*|.*[\\s ]{2,}.*|.*[\\s ]+$)"); } public static boolean isPspPacket(ByteBuffer packet) { return packet.limit() > 14 && packet.get(12) == -120 && packet.get(13) == -56; } public static boolean isPspPacket(Ethernet ethernet) { return ethernet.type() == 35016;// 0x88c8; } public static InetSocketAddress parseSocketAddress(String address) { String[] tokens = address.split(":"); if (tokens.length != 2) return null; return parseSocketAddress(tokens[0], tokens[1]); } public static InetSocketAddress parseSocketAddress(String hostname, String port) { int portNum; try { portNum = Integer.parseInt(port); if (portNum > 0 && portNum < 65536) return new InetSocketAddress(hostname, portNum); } catch (NumberFormatException e) { } return null; } public static String socketAddressToStringByHostName(InetSocketAddress address) { if (address == null) return ""; return address.getHostName() + ":" + address.getPort(); } public static String socketAddressToStringByIP(InetSocketAddress address) { if (address == null) return ""; return address.getAddress().getHostAddress() + ":" + address.getPort(); } public static void appendSocketAddressByHostName(StringBuilder sb, InetSocketAddress address) { if (address == null) return; sb.append(address.getHostName()).append(':').append(address.getPort()); } public static void appendSocketAddressByIP(StringBuilder sb, InetSocketAddress address) { if (address == null) return; sb.append(address.getAddress().getHostAddress()).append(':').append(address.getPort()); } public static String macAddressToString(ByteBuffer packet, int offset, boolean needHyphen) { if (packet == null) return ""; if (packet.limit() < offset + 6) throw new IllegalArgumentException(); String format = needHyphen ? "%02X-%02X-%02X-%02X-%02X-%02X" : "%02X%02X%02X%02X%02X%02X"; return String.format(format, packet.get(offset), packet.get(offset + 1), packet.get(offset + 2), packet.get(offset + 3), packet.get(offset + 4), packet.get(offset + 5)); } public static String macAddressToString(byte[] packet, int offset, boolean needHyphen) { if (packet == null) return ""; if (packet.length < offset + 6) throw new IllegalArgumentException(); String format = needHyphen ? "%02X-%02X-%02X-%02X-%02X-%02X" : "%02X%02X%02X%02X%02X%02X"; return String.format(format, packet[offset], packet[offset + 1], packet[offset + 2], packet[offset + 3], packet[offset + 4], packet[offset + 5]); } public static boolean isMacBroadCastAddress(String macAddress) { return "FFFFFFFFFFFF".equals(macAddress); } public static String makeAuthCode() { long val = (long) (Math.random() * 1000000000); return Long.toString(val); } public static String makeKeepAliveLog(String transport, InetSocketAddress local, InetSocketAddress remote, long time) { StringBuilder sb = new StringBuilder(); sb.append(transport); sb.append(" KeepAlive受信: "); sb.append(socketAddressToStringByIP(remote)); sb.append(" -> "); sb.append(socketAddressToStringByIP(local)); sb.append(" ["); sb.append(ILogger.DATE_FORMAT.format(new Date(time))); sb.append("]"); return sb.toString(); } public static String makeKeepAliveDisconnectLog(String transport, InetSocketAddress address, long deadline, long lastReceived) { Date date = new Date(); StringBuilder sb = new StringBuilder(); sb.append(transport); sb.append(" KeepAlive切断: "); date.setTime(deadline); sb.append("Deadline["); sb.append(ILogger.DATE_FORMAT.format(date)); date.setTime(lastReceived); sb.append("] LastReceived["); sb.append(ILogger.DATE_FORMAT.format(date)); sb.append("] @ "); appendSocketAddressByIP(sb, address); return sb.toString(); } public static void main(String[] args) { byte[] data = new byte[] { (byte) 255, (byte) 255, (byte) 255, (byte) 255, (byte) 255, (byte) 255 }; ByteBuffer mac = ByteBuffer.wrap(data); System.out.println(macAddressToString(mac, 0, true)); System.out.println(macAddressToString(mac, 0, false)); System.out.println(macAddressToString(data, 0, true)); System.out.println(macAddressToString(data, 0, false)); System.out.println(mac); System.out.println(ByteBuffer.allocateDirect(100)); System.out.println(trim("EAG", 10)); System.out.println(trim("EAGkljhklglkgWGQWW", 10)); } }