MIMETypeInfo.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Реализация среды исполнения языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    Copyright © 2021, 2024 Малик Разработчик

    Это свободная программа: вы можете перераспространять ее и/или изменять
    ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она будет полезной,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <https://www.gnu.org/licenses/>.
*/

package platform.independent.streamformat;

public final class MIMETypeInfo(Object, Cloneable)
{
    public static final String TYPE_APPLICATION = "application";
    public static final String TYPE_AUDIO       =       "audio";
    public static final String TYPE_EXAMPLE     =     "example";
    public static final String TYPE_FONT        =        "font";
    public static final String TYPE_IMAGE       =       "image";
    public static final String TYPE_MESSAGE     =     "message";
    public static final String TYPE_MODEL       =       "model";
    public static final String TYPE_MULTIPART   =   "multipart";
    public static final String TYPE_TEXT        =        "text";
    public static final String TYPE_VIDEO       =       "video";

    private static final int CODEC   = 4;
    private static final int ENCODER = 2;
    private static final int DECODER = 1;

    private final int fldSupported;
    private final String fldMIMEType;

    public (String mimeType, boolean decoderSupported, boolean encoderSupported, boolean codecSupported) {
        fldSupported = (decoderSupported ? DECODER : 0) | (encoderSupported ? ENCODER : 0) | (codecSupported ? CODEC : 0);
        fldMIMEType = mimeType;
    }

    private (String mimeType, int supported) {
        fldSupported = supported;
        fldMIMEType = mimeType;
    }

    public boolean equals(Object anot) {
        if(anot == this) return true;
        if(!(anot instanceof MIMETypeInfo)) return false;
        MIMETypeInfo amti = (MIMETypeInfo) anot;
        if(fldSupported != amti.fldSupported) return false;
        Object mimeType = fldMIMEType;
        return mimeType == null ? amti.fldMIMEType == null : mimeType.equals(amti.fldMIMEType);
    }

    public int hashCode() {
        Object mimeType = fldMIMEType;
        return (mimeType == null ? -1 : mimeType.hashCode()) ^ fldSupported;
    }

    public long hashCodeAsLong() {
        Object mimeType = fldMIMEType;
        return (mimeType == null ? -1L : mimeType.hashCodeAsLong()) ^ fldSupported;
    }

    public long2 hashCodeAsLong2() {
        Object mimeType = fldMIMEType;
        return (mimeType == null ? new long2 { -1L, -1L } : mimeType.hashCodeAsLong2()) ^ fldSupported;
    }

    public long4 hashCodeAsLong4() {
        Object mimeType = fldMIMEType;
        return Long4.create(mimeType == null ? new long2 { -1L, -1L } : mimeType.hashCodeAsLong2(), fldSupported);
    }

    public String toString() {
        boolean first = false;
        int supported = fldSupported;
        Object mimeType = fldMIMEType;
        StringBuilder result = new StringBuilder() + (mimeType != null ? mimeType : "<null>");
        if((supported & DECODER) != 0)
        {
            result + " [decoder";
            first = true;
        }
        if((supported & ENCODER) != 0)
        {
            result + (first ? ", encoder" : " [encoder");
            first = true;
        }
        if((supported & CODEC) != 0)
        {
            result + (first ? ", codec" : " [codec");
            first = true;
        }
        return (first ? result + "]" : result).toString();
    }

    public MIMETypeInfo clone() { return new MIMETypeInfo(fldMIMEType, fldSupported); }

    public String type() {
        String mimeType = fldMIMEType;
        if(mimeType == null) return null;
        int solidusPosition = mimeType.indexOf('/');
        return solidusPosition < 0 ? mimeType : mimeType.substring(0, solidusPosition);
    }

    public String subtype() {
        String mimeType = fldMIMEType;
        if(mimeType == null) return null;
        int solidusPosition = mimeType.indexOf('/');
        return solidusPosition < 0 ? "" : mimeType.substring(solidusPosition + 1);
    }

    public boolean codecSupported { index = CODEC, read = isSupported }

    public boolean encoderSupported { index = ENCODER, read = isSupported }

    public boolean decoderSupported { index = DECODER, read = isSupported }

    public String mimeType { read = fldMIMEType }

    private boolean isSupported(int index) { return (fldSupported & index) != 0; }
}