    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *      http://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017package org.apache.commons.imaging.icc;
    018
    019import static org.apache.commons.imaging.common.BinaryFunctions.read4Bytes;
    020
    021import java.io.ByteArrayInputStream;
    022import java.io.IOException;
    023import java.io.InputStream;
    024import java.nio.ByteOrder;
    025import java.nio.charset.StandardCharsets;
    026import java.util.logging.Logger;
    027
    028import org.apache.commons.imaging.ImageReadException;
    029
    030public enum IccTagDataTypes implements IccTagDataType {
    031    DESC_TYPE(
    032            "descType", 0x64657363) {
    033        @Override
    034        public void dump(final String prefix, final byte[] bytes)
    035                throws ImageReadException, IOException {
    036            try (InputStream bis = new ByteArrayInputStream(bytes)) {
    037                read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    038
    039                //            bis.setDebug(true);
    040                read4Bytes("ignore", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    041                final int stringLength = read4Bytes("stringLength", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    042
    043                //            bis.readByteArray("ignore", bytes.length -12, "none");
    044                final String s = new String(bytes, 12, stringLength - 1, StandardCharsets.US_ASCII);
    045                LOGGER.fine(prefix + "s: '" + s + "'");
    046            }
    047        }
    048
    049    },
    050
    051    DATA_TYPE(
    052            "dataType", 0x64617461) {
    053        @Override
    054        public void dump(final String prefix, final byte[] bytes)
    055                throws ImageReadException, IOException {
    056            try (InputStream bis = new ByteArrayInputStream(bytes)) {
    057                read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    058            }
    059        }
    060
    061    },
    062
    063    MULTI_LOCALIZED_UNICODE_TYPE(
    064            "multiLocalizedUnicodeType", (0x6D6C7563)) {
    065        @Override
    066        public void dump(final String prefix, final byte[] bytes)
    067                throws ImageReadException, IOException {
    068            try (InputStream bis = new ByteArrayInputStream(bytes)) {
    069                read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    070            }
    071        }
    072
    073    },
    074
    075    SIGNATURE_TYPE(
    076            "signatureType", ((0x73696720))) {
    077        @Override
    078        public void dump(final String prefix, final byte[] bytes)
    079                throws ImageReadException, IOException {
    080            try (InputStream bis = new ByteArrayInputStream(bytes)) {
    081                read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    082                read4Bytes("ignore", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    083                final int theSignature = read4Bytes("theSignature ", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    084                LOGGER.fine(prefix
    085                        + "theSignature: "
    086                        + Integer.toHexString(theSignature)
    087                        + " ("
    088                        + new String(new byte[]{
    089                                (byte) (0xff & (theSignature >> 24)),
    090                                (byte) (0xff & (theSignature >> 16)),
    091                                (byte) (0xff & (theSignature >> 8)),
    092                                (byte) (0xff & (theSignature >> 0)), }, StandardCharsets.US_ASCII)
    093                        + ")");
    094            }
    095        }
    096
    097    },
    098
    099    TEXT_TYPE(
    100            "textType", 0x74657874) {
    101        @Override
    102        public void dump(final String prefix, final byte[] bytes)
    103                throws ImageReadException, IOException {
    104            try (InputStream bis = new ByteArrayInputStream(bytes)) {
    105                read4Bytes("type_signature", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    106                read4Bytes("ignore", bis, "ICC: corrupt tag data", ByteOrder.BIG_ENDIAN);
    107                final String s = new String(bytes, 8, bytes.length - 8, StandardCharsets.US_ASCII);
    108                LOGGER.fine(prefix + "s: '" + s + "'");
    109            }
    110        }
    111
    112    };
    113
    114    private static final Logger LOGGER = Logger.getLogger(IccTagDataTypes.class.getName());
    115
    116    public final String name;
    117    public final int signature;
    118
    119    IccTagDataTypes(final String name, final int signature) {
    120        this.name = name;
    121        this.signature = signature;
    122    }
    123
    124    @Override
    125    public String getName() {
    126        return name;
    127    }
    128
    129    @Override
    130    public int getSignature() {
    131        return signature;
    132    }
    133}