/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1999 by Sun Microsystems, Inc. * All rights reserved. * */ // Opaque.java: Wrapper for byte[]. // Author: James Kempf // Created On: Tue Apr 7 15:21:58 1998 // Last Modified By: James Kempf // Last Modified On: Fri Jun 5 15:26:59 1998 // Update Count: 38 // package com.sun.slp; import java.util.*; import java.io.*; /** * The Opaque class wraps Java byte arrays so we can do object-like * things, such as deep equality comparison and printing. * * @author James Kempf */ class Opaque extends Object { // Character to use for fill. private static final char ZERO = '0'; // The byte array. byte[] bytes; // For identifying opaques. final static String OPAQUE_HEADER = "\\ff"; // Construct a Opaque. Opaque(byte[] nb) { bytes = nb; } // Construct a byte array from an escaped string. static byte[] unescapeByteArray(String str) throws ServiceLocationException { // Check for opaque header. if (!str.startsWith(OPAQUE_HEADER)) { throw new ServiceLocationException( ServiceLocationException.PARSE_ERROR, "no_opaque_header", new Object[] {str}); } String string = str.substring(OPAQUE_HEADER.length()); // Process escapes to remove slash. // string. int i, n = string.length(); int len = 0; int nlen = n / 3; byte[] b = new byte[nlen]; for (i = 0; i < n; i++) { if (string.charAt(i) != ServiceLocationAttribute.ESCAPE) { throw new ServiceLocationException( ServiceLocationException.PARSE_ERROR, "escape_err", new Object[] {str}); } // Get the next two characters. if (i > n - 2) { throw new ServiceLocationException( ServiceLocationException.PARSE_ERROR, "nonterminating_escape", new Object[] {str}); } if (len >= nlen) { throw new ServiceLocationException( ServiceLocationException.PARSE_ERROR, "wrong_char_num", new Object[] {str}); } try { i++; b[len++] = (byte)(Integer.parseInt( string.substring(i, i+2), 16) & 0xFF); i++; } catch (NumberFormatException ex) { throw new ServiceLocationException( ServiceLocationException.PARSE_ERROR, "not_hex", new Object[] {str}); } } return b; } // Overrides Object.equals(). public boolean equals(Object o) { if (o == this) { return true; } if (!(o instanceof Opaque)) { return false; } byte[] cbyte = ((Opaque)o).bytes; // Not equal if lengths aren't. if (cbyte.length != bytes.length) { return false; } // Check inside. int i; for (i = 0; i < cbyte.length; i++) { if (cbyte[i] != bytes[i]) { return false; } } return true; } public String toString() { int i, n = bytes.length; StringBuffer buf = new StringBuffer(); buf.append(OPAQUE_HEADER); for (i = 0; i < n; i++) { String str = null; // Convert each byte into a string, then escape. We use // an 8-bit encoding, LATIN1, since escapes are two // characters only. str = Integer.toHexString(((int)bytes[i] & 0xFF)); buf.append(ServiceLocationAttribute.ESCAPE); if (str.length() < 2) { buf.append(ZERO); } buf.append(str); } return buf.toString(); } }