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

net.luminis.quic.impl.Version Maven / Gradle / Ivy

/*
 * Copyright © 2019, 2020, 2021, 2022, 2023, 2024 Peter Doornbosch
 *
 * This file is part of Kwik, an implementation of the QUIC protocol in Java.
 *
 * Kwik 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 3 of the License, or (at your option)
 * any later version.
 *
 * Kwik 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 program. If not, see .
 */
package net.luminis.quic.impl;

import net.luminis.quic.QuicConnection;

import java.nio.ByteBuffer;


/**
 * Represents a QUIC version.
 */
public class Version {

    public final static Version IETF_draft_27 = new Version(0xff00001b);
    public final static Version IETF_draft_29 = new Version(0xff00001d);
    public final static Version QUIC_version_1 = new Version(0x00000001);
    public final static Version QUIC_version_2 = new Version(0x6b3343cf);

    private int versionId;

    public static Version of(QuicConnection.QuicVersion version) {
        if (version == null) {
            return null;
        }
        switch (version) {
            case V1:
                return QUIC_version_1;
            case V2:
                return QUIC_version_2;
        }
        return null;
    }
    
    public Version(int versionId) {
        this.versionId = versionId;
    }

    public byte[] getBytes() {
        ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES);
        buffer.putInt(versionId);
        return buffer.array();
    }

    public static Version parse(int input) {
        return new Version(input);
    }

    public static Version getDefault() {
        return QUIC_version_1;
    }

    public boolean isZero() {
        return versionId == 0x00000000;
    }

    public boolean isV1() {
        return versionId == QUIC_version_1.versionId;
    }

    public boolean isV2() {
        return versionId == QUIC_version_2.versionId;
    }

    /**
     * @return   true if version is V1 or V2, false otherwise.
     */
    public boolean isV1V2() {
        return versionId == QUIC_version_1.versionId || versionId == QUIC_version_2.versionId;
    }

    public int getId() {
        return versionId;
    }

    @Override
    public String toString() {
        String versionString;
        switch (versionId) {
            case 0x00000001:
                versionString = "v1";
                break;
            case 0x6b3343cf:
                versionString = "v2";
                break;
            default:
                if (versionId > 0xff000000 && versionId <= 0xff000022) {
                    versionString = "draft-" + (versionId - 0xff000000);
                }
                else {
                    versionString = "v-" + Integer.toHexString(versionId);
                }
        }
        return versionString;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Version)) return false;
        Version version = (Version) o;
        return versionId == version.versionId;
    }

    @Override
    public int hashCode() {
        return versionId;
    }

    public QuicConnection.QuicVersion toQuicVersion() {
        if (versionId == QUIC_version_1.versionId) {
            return QuicConnection.QuicVersion.V1;
        }
        else if (versionId == QUIC_version_2.versionId) {
            return QuicConnection.QuicVersion.V2;
        }
        else {
            return null;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy