133 lines · 4.8 KB · Java
RawDownload
/* * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.imageio.plugins.jpeg; import javax.imageio.metadata.IIOMetadataNode;import javax.imageio.stream.ImageOutputStream;import javax.imageio.metadata.IIOInvalidTreeException; import java.io.IOException;import java.io.UnsupportedEncodingException; import org.w3c.dom.Node; /** * A Comment marker segment.  Retains an array of bytes representing the * comment data as it is read from the stream.  If the marker segment is * constructed from a String, then local default encoding is assumed * when creating the byte array.  If the marker segment is created from * an <code>IIOMetadataNode</code>, the user object, if present is * assumed to be a byte array containing the comment data.  If there is * no user object then the comment attribute is used to create the * byte array, again assuming the default local encoding. */class COMMarkerSegment extends MarkerSegment {    private static final String ENCODING = "ISO-8859-1";     /**     * Constructs a marker segment from the given buffer, which contains     * data from an <code>ImageInputStream</code>.  This is used when     * reading metadata from a stream.     */    COMMarkerSegment(JPEGBuffer buffer) throws IOException {        super(buffer);        loadData(buffer);    }     /**     * Constructs a marker segment from a String.  This is used when     * modifying metadata from a non-native tree and when transcoding.     * The default encoding is used to construct the byte array.     */    COMMarkerSegment(String comment) {        super(JPEG.COM);        data = comment.getBytes(); // Default encoding    }     /**     * Constructs a marker segment from a native tree node.  If the node     * is an <code>IIOMetadataNode</code> and contains a user object,     * that object is used rather than the string attribute.  If the     * string attribute is used, the default encoding is used.     */    COMMarkerSegment(Node node) throws IIOInvalidTreeException{        super(JPEG.COM);        if (node instanceof IIOMetadataNode) {            IIOMetadataNode ourNode = (IIOMetadataNode) node;            data = (byte []) ourNode.getUserObject();        }        if (data == null) {            String comment =                node.getAttributes().getNamedItem("comment").getNodeValue();            if (comment != null) {                data = comment.getBytes(); // Default encoding            } else {                throw new IIOInvalidTreeException("Empty comment node!", node);            }        }    }     /**     * Returns the array encoded as a String, using ISO-Latin-1 encoding.     * If an application needs another encoding, the data array must be     * consulted directly.     */    String getComment() {        try {            return new String (data, ENCODING);        } catch (UnsupportedEncodingException e) {}  // Won't happen        return null;    }     /**     * Returns an <code>IIOMetadataNode</code> containing the data array     * as a user object and a string encoded using ISO-8895-1, as an     * attribute.     */    IIOMetadataNode getNativeNode() {        IIOMetadataNode node = new IIOMetadataNode("com");        node.setAttribute("comment", getComment());        if (data != null) {            node.setUserObject(data.clone());        }        return node;    }     /**     * Writes the data for this segment to the stream in     * valid JPEG format, directly from the data array.     */    void write(ImageOutputStream ios) throws IOException {        length = 2 + data.length;        writeTag(ios);        ios.write(data);    }     void print() {        printTag("COM");        System.out.println("<" + getComment() + ">");    }}