com.github.stephenc.javaisotools.iso9660.impl.ISO9660Config 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.iso9660.impl;
import java.lang.Character.UnicodeBlock;
import com.github.stephenc.javaisotools.iso9660.ConfigException;
import com.github.stephenc.javaisotools.iso9660.StandardConfig;
public class ISO9660Config extends StandardConfig {
private boolean restrictDirDepthTo8, allowASCII, padEnd;
public ISO9660Config() {
super();
this.restrictDirDepthTo8 = true;
this.allowASCII(false);
}
/**
* Set Interchange Level
1: Filenames 8+3, directories 8 characters
2: Filenames 30, directories 31
* characters
3: multiple File Sections (files > 2 GB)
*
* @param level 1, 2 or 3
*
* @throws com.github.stephenc.javaisotools.iso9660.ConfigException Invalid or unsupported Interchange Level
*/
public void setInterchangeLevel(int level) throws ConfigException {
if (level < 1 || level > 3) {
throw new ConfigException(this, "Invalid ISO9660 Interchange Level: " + level);
}
if (level == 3) {
throw new ConfigException(this,
"Interchange Level 3 (multiple File Sections per file) is not (yet) supported by this implementation.");
}
ISO9660NamingConventions.INTERCHANGE_LEVEL = level;
}
/**
* Force Dot Delimiter
*
* @param force Whether files must include the dot character
*/
public void forceDotDelimiter(boolean force) {
ISO9660NamingConventions.FORCE_DOT_DELIMITER = force;
if (!force) {
System.out.println("Warning: Not forcing to include the dot in filenames breaks ISO 9660 conformance.");
}
}
/**
* Allow ASCII for filenames and other strings
*
* @param allow Whether to allow the ASCII character set for filenames and other strings
*/
public void allowASCII(boolean allow) {
this.allowASCII = allow;
ISO9660NamingConventions.FORCE_ISO9660_CHARSET = !allow;
if (allow) {
System.out.println("Warning: Allowing the full ASCII character set breaks ISO 9660 conformance.");
}
}
/**
* Returns whether ASCII is allowed
*
* @return Whether the ASCII character set is allowed
*/
public boolean allowsASCII() {
return allowASCII;
}
/**
* Returns whether the directory depth is restricted to eight levels
*
* @return Whether the directory hierarchy is limited to eight levels
*/
public boolean dirDepthRestrictedTo8() {
return restrictDirDepthTo8;
}
/**
* Restrict directory depth to eight levels
*
* @param restrictDirDepthTo8 Whether to limit the directory hierarchy to eight levels
*/
public void restrictDirDepthTo8(boolean restrictDirDepthTo8) {
this.restrictDirDepthTo8 = restrictDirDepthTo8;
if (!restrictDirDepthTo8) {
System.out.println("Warning: Allowing more than 8 directory levels breaks ISO 9660 conformance.");
}
}
public void setDataPreparer(String dataPreparer) throws ConfigException {
super.setDataPreparer(checkAString(dataPreparer));
}
public void setPublisher(String publisher) throws ConfigException {
super.setPublisher(checkAString(publisher));
}
public void setSystemID(String systemID) throws ConfigException {
super.setSystemID(checkAString(systemID));
}
public void setApp(String app) throws ConfigException {
super.setApp(checkAString(app));
}
public void setVolumeID(String volumeID) throws ConfigException {
super.setVolumeID(checkDString(volumeID));
}
public void setVolumeSetID(String volumeSetID) throws ConfigException {
super.setVolumeSetID(checkDString(volumeSetID));
}
public void setPadEnd(boolean padEnd) {
this.padEnd = padEnd;
}
public boolean getPadEnd() {
return this.padEnd;
}
private String checkAString(String string) {
if (allowsASCII()) {
return checkASCIIString(string);
} // else
return string.toUpperCase().replaceAll("[^" + ISO9660Constants.ECMA6_A_CHARACTERS + "]", "_");
}
private String checkDString(String string) {
if (allowsASCII()) {
return checkASCIIString(string);
} // else
return string.toUpperCase().replaceAll("[^" + ISO9660Constants.ECMA6_D_CHARACTERS + "]", "_");
}
private String checkASCIIString(String string) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
UnicodeBlock characterBlock = UnicodeBlock.of(string.charAt(i));
if (characterBlock == UnicodeBlock.BASIC_LATIN) {
buf.append(string.charAt(i));
} else {
buf.append('_');
}
}
return buf.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy