All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.stephenc.javaisotools.rockridge.impl.RRIPFactory Maven / Gradle / Ivy

/*
 * Copyright (c) 2010. Stephen Connolly.
 * Copyright (C) 2007. Jens Hatlak 
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

package com.github.stephenc.javaisotools.rockridge.impl;

import com.github.stephenc.javaisotools.iso9660.impl.ISO9660ShortDateDataReference;
import com.github.stephenc.javaisotools.sabre.HandlerException;
import com.github.stephenc.javaisotools.sabre.StreamHandler;
import com.github.stephenc.javaisotools.sabre.impl.ByteArrayDataReference;
import com.github.stephenc.javaisotools.sabre.impl.ByteDataReference;
import com.github.stephenc.javaisotools.iso9660.impl.ISO9660DateDataReference;
import com.github.stephenc.javaisotools.iso9660.sabre.impl.BothWordDataReference;
import com.github.stephenc.javaisotools.sabre.DataReference;
import com.github.stephenc.javaisotools.sabre.Fixup;

public class RRIPFactory extends SUSPFactory {

    public static boolean MKISOFS_COMPATIBILITY = true;
    public static final int CR_CONTINUES = 1;
    public static final int CR_CURRENT = 2;
    public static final int CR_PARENT = 4;
    public static final int CR_ROOT = 8;
    public static final int NM_CONTINUES = 1;
    public static final int NM_CURRENT = 2;
    public static final int NM_PARENT = 4;
    public static final int TF_CREATION = 1;
    public static final int TF_MODIFY = 2;
    public static final int TF_ACCESS = 4;
    public static final int TF_ATTRIBUTES = 8;
    public static final int TF_BACKUP = 16;
    public static final int TF_EXPIRATION = 32;
    public static final int TF_EFFECTIVE = 64;
    public static final int TF_LONG_FORM = 128;
    public static final int RR_PX_RECORDED = 1;
    public static final int RR_PN_RECORDED = 2;
    public static final int RR_SL_RECORDED = 4;
    public static final int RR_NM_RECORDED = 8;
    public static final int RR_CL_RECORDED = 16;
    public static final int RR_PL_RECORDED = 32;
    public static final int RR_RE_RECORDED = 64;
    public static final int RR_TF_RECORDED = 128;
    public static final int NM_ENTRY_LENGTH = 5;

    public RRIPFactory(StreamHandler streamHandler) {
        super(streamHandler);
    }

    public void doPXEntry(int fileModes, int fileLinks, int uid, int gid, long serialNumber) throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("PX", 1));
        streamHandler.data(new BothWordDataReference(fileModes));
        streamHandler.data(new BothWordDataReference(fileLinks));
        streamHandler.data(new BothWordDataReference(uid));
        streamHandler.data(new BothWordDataReference(gid));

        if (!MKISOFS_COMPATIBILITY) {
            // RRIP 1.12 includes the Serial Number field, RRIP 1.09 does not
            streamHandler.data(new BothWordDataReference(serialNumber));
        }

        streamHandler.endElement();
    }

    public void doPNEntry(int deviceNumberHigh, int deviceNumberLow) throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("PN", 1));
        streamHandler.data(new BothWordDataReference(deviceNumberHigh));
        streamHandler.data(new BothWordDataReference(deviceNumberLow));
        streamHandler.endElement();
    }

    public void startSLEntry(boolean continues) throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("SL", 1));
        streamHandler.data(new ByteDataReference(continues ? 1 : 0));
    }

    public void doComponentRecord(int flags) throws HandlerException {
        if (flags != CR_CONTINUES && flags != CR_CURRENT && flags != CR_PARENT && flags != CR_ROOT) {
            throw new HandlerException("Invalid Rock Ridge Component Record flags combination: " + flags);
        }
        streamHandler.data(new ByteDataReference(flags));
        streamHandler.data(new ByteDataReference(0));
    }

    public void doComponentRecord(DataReference name) throws HandlerException {
        streamHandler.data(new ByteDataReference(0));
        streamHandler.data(new ByteDataReference(name.getLength()));
        streamHandler.data(name);
    }

    public void endSLEntry() throws HandlerException {
        streamHandler.endElement();
    }

    public void doNMEntry(int flags, DataReference name) throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("NM", 1));

        if (flags != 0 && flags != NM_CONTINUES && flags != NM_CURRENT && flags != NM_PARENT) {
            throw new HandlerException("Invalid Rock Ridge directory flags combination: " + flags);
        }
        streamHandler.data(new ByteDataReference(flags));

        streamHandler.data(name);
        streamHandler.endElement();
    }

    public Fixup doCLEntry() throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("CL", 1));
        Fixup childLocationFixup = streamHandler.fixup(new BothWordDataReference(0));
        streamHandler.endElement();

        return childLocationFixup;
    }

    public Fixup doPLEntry() throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("PL", 1));
        Fixup parentLocationFixup = streamHandler.fixup(new BothWordDataReference(0));
        streamHandler.endElement();

        return parentLocationFixup;
    }

    public void doREEntry() throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("RE", 1));
        streamHandler.endElement();
    }

    public void doTFEntry(int type, ISO9660DateDataReference date) throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("TF", 1));

        checkTFType(type);
        streamHandler.data(new ByteDataReference(type | TF_LONG_FORM));

        streamHandler.data(date);
        streamHandler.endElement();
    }

    public void doTFEntry(int type, ISO9660ShortDateDataReference date) throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("TF", 1));

        checkTFType(type);
        streamHandler.data(new ByteDataReference(type));

        streamHandler.data(date);
        streamHandler.endElement();
    }

    private void checkTFType(int type) throws HandlerException {
        if (type != TF_CREATION && type != TF_MODIFY && type != TF_ACCESS && type != TF_ATTRIBUTES
                && type != TF_BACKUP && type != TF_EXPIRATION && type != TF_EFFECTIVE) {
            throw new HandlerException("Invalid Rock Ridge Timestamp type: " + type);
        }
    }

    public void doSFEntry(long virtualFileSizeHigh, long virtualFileSizeLow, int tableDepth) throws HandlerException {
        streamHandler.startElement(new SystemUseEntryElement("SF", 1));
        streamHandler.data(new BothWordDataReference(virtualFileSizeHigh));
        streamHandler.data(new BothWordDataReference(virtualFileSizeLow));
        streamHandler.data(new ByteDataReference(tableDepth));
        streamHandler.endElement();
    }

    public void doEREntry() throws HandlerException {
        String id, descriptor, source;
        if (RRIPFactory.MKISOFS_COMPATIBILITY) {
            id = "RRIP_1991A";
            descriptor = "THE ROCK RIDGE INTERCHANGE PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS";
            source =
                    "PLEASE CONTACT DISC PUBLISHER FOR SPECIFICATION SOURCE.  SEE PUBLISHER IDENTIFIER IN PRIMARY VOLUME DESCRIPTOR FOR CONTACT INFORMATION";
        } else {
            id = "IEEE 1282";
            descriptor = "THE IEEE 1282 PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS.";
            source = "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, PISCATAWAY, NJ, USA FOR THE 1282 SPECIFICATION.";
        }

        ByteArrayDataReference idRef = new ByteArrayDataReference(id.getBytes());
        ByteArrayDataReference descriptorRef = new ByteArrayDataReference(descriptor.getBytes());
        ByteArrayDataReference sourceRef = new ByteArrayDataReference(source.getBytes());

        doEREntry(idRef, descriptorRef, sourceRef, 1);
    }

    public void doRREntry(int flags) throws HandlerException {
        if (MKISOFS_COMPATIBILITY) {
            if (flags < 0 || flags > 255) {
                throw new HandlerException("Invalid RR flags: " + flags);
            }

            streamHandler.startElement(new SystemUseEntryElement("RR", 1));
            streamHandler.data(new ByteDataReference(flags));
            streamHandler.endElement();
        }
        // Else: Do nothing (RRIP 1.12 does not include the RR Entry type)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy