protected List parseIPTCBlock()

in src/main/java/org/apache/commons/imaging/formats/jpeg/iptc/IptcParser.java [131:256]


    protected List<IptcRecord> parseIPTCBlock(byte bytes[], boolean verbose)
            throws ImageReadException, IOException
    {
        List<IptcRecord> elements = new ArrayList<IptcRecord>();

        int index = 0;
        // Integer recordVersion = null;
        while (index + 1 < bytes.length)
        {
            int tagMarker = 0xff & bytes[index++];
            if (verbose)
                Debug.debug("tagMarker", tagMarker + " (0x"
                        + Integer.toHexString(tagMarker) + ")");

            if (tagMarker != IPTC_RECORD_TAG_MARKER)
            {
                if (verbose)
                    System.out
                            .println("Unexpected record tag marker in IPTC data.");
                return elements;
            }

            int recordNumber = 0xff & bytes[index++];
            if (verbose)
                Debug.debug("recordNumber", recordNumber + " (0x"
                        + Integer.toHexString(recordNumber) + ")");

            // int recordPrefix = convertByteArrayToShort("recordPrefix", index,
            // bytes);
            // if (verbose)
            // Debug.debug("recordPrefix", recordPrefix + " (0x"
            // + Integer.toHexString(recordPrefix) + ")");
            // index += 2;
            //
            // if (recordPrefix != IPTC_RECORD_PREFIX)
            // {
            // if (verbose)
            // System.out
            // .println("Unexpected record prefix in IPTC data!");
            // return elements;
            // }

            // throw new ImageReadException(
            // "Unexpected record prefix in IPTC data.");

            int recordType = 0xff & bytes[index];
            if (verbose)
                Debug.debug("recordType", recordType + " (0x"
                        + Integer.toHexString(recordType) + ")");
            index++;

            int recordSize = convertByteArrayToShort("recordSize", index, bytes);
            index += 2;

            boolean extendedDataset = recordSize > IPTC_NON_EXTENDED_RECORD_MAXIMUM_SIZE;
            int dataFieldCountLength = recordSize & 0x7fff;
            if (extendedDataset && verbose)
                Debug.debug("extendedDataset. dataFieldCountLength: "
                        + dataFieldCountLength);
            if (extendedDataset) // ignore extended dataset and everything
                // after.
                return elements;

            byte recordData[] = readBytearray("recordData", bytes, index,
                    recordSize);
            index += recordSize;

            // Debug.debug("recordSize", recordSize + " (0x"
            // + Integer.toHexString(recordSize) + ")");
            
            if (recordNumber != IPTC_APPLICATION_2_RECORD_NUMBER)
                continue;

            if (recordType == 0)
            {
                if (verbose)
                    System.out.println("ignore record version record! "
                            + elements.size());
                // ignore "record version" record;
                continue;
            }
            // if (recordVersion == null)
            // {
            // // The first record in a JPEG/Photoshop IPTC block must be
            // // the record version.
            // if (recordType != 0)
            // throw new ImageReadException("Missing record version: "
            // + recordType);
            // recordVersion = new Integer(convertByteArrayToShort(
            // "recordNumber", recordData));
            //
            // if (recordSize != 2)
            // throw new ImageReadException(
            // "Invalid record version record size: " + recordSize);
            //
            // // JPEG/Photoshop IPTC metadata is always in Record version
            // // 2
            // if (recordVersion.intValue() != 2)
            // throw new ImageReadException(
            // "Invalid IPTC record version: " + recordVersion);
            //
            // // Debug.debug("recordVersion", recordVersion);
            // continue;
            // }

            String value = new String(recordData, "ISO-8859-1");

            IptcType iptcType = IptcTypeLookup.getIptcType(recordType);

            // Debug.debug("iptcType", iptcType);
            // debugByteArray("iptcData", iptcData);
            // Debug.debug();

            // if (recordType == IPTC_TYPE_CREDIT.type
            // || recordType == IPTC_TYPE_OBJECT_NAME.type)
            // {
            // this.debugByteArray("recordData", recordData);
            // Debug.debug("index", IPTC_TYPE_CREDIT.name);
            // }

            IptcRecord element = new IptcRecord(iptcType, recordData, value);
            elements.add(element);
        }

        return elements;
    }