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

io.pkts.packet.sip.address.TelURI Maven / Gradle / Ivy

package io.pkts.packet.sip.address;

import static io.pkts.packet.sip.impl.PreConditions.assertNotEmpty;
import static io.pkts.packet.sip.impl.PreConditions.assertNotNull;

import java.io.IOException;

import io.pkts.buffer.Buffer;
import io.pkts.buffer.Buffers;
import io.pkts.packet.sip.SipParseException;
import io.pkts.packet.sip.address.impl.TelURIImpl;
import io.pkts.packet.sip.header.impl.ParametersSupport;
import io.pkts.packet.sip.impl.PreConditions;
import io.pkts.packet.sip.impl.SipParser;
import io.pkts.packet.sip.impl.TelUriParser;

/**
 * 
 * @author dmnava
 *
 */
public interface TelURI extends URI {

    /**
     * Specifies whether the telephone number is global or not
     * 
     * @return
     */
    boolean isGlobal();

    /**
     * Returns the phone number, without the '+' in case of global number
     * 
     * @return
     */
    Buffer getPhoneNumber();

    @Override
    default boolean isTelURI() {
        return true;
    }

    @Override
    default TelURI toTelURI() {
        return this;
    }

    /**
     * Get the value of the named parameter. If the named parameter is a
     * so-called flag parameter, then the value returned will be an empty
     * {@link Buffer}, which can be checked with {@link Buffer#isEmpty()} or
     * {@link Buffer#capacity()}, which will return zero. As with any empty
     * {@link Buffer}, if you do {@link Buffer#toString()} you will be getting
     * an empty {@link String} back, which would be yet another way to check for
     * a flag parameter.
     * 
     * @param name
     *            the name of the parameter we are looking for.
     * @return the value of the named parameter or null if there is no such
     *         parameter. If the named parameter is a flag parameter, then an
     *         empty buffer will be returned.
     * @throws SipParseException
     *             in case anything goes wrong while extracting the parameter.
     * @throws IllegalArgumentException
     *             in case the name is null.
     */
    Buffer getParameter(Buffer name) throws SipParseException, IllegalArgumentException;

    /**
     * Same as {@link #getParameter(Buffer)}.
     * 
     * @param name
     * @return
     * @throws SipParseException
     *             in case anything goes wrong while extracting the parameter.
     * @throws IllegalArgumentException
     *             in case the name is null.
     */
    Buffer getParameter(String name) throws SipParseException, IllegalArgumentException;

    /**
     * Frame a TEL Uri, which according to RFC 3966 has the following syntax:
     * 
     * 
     *    telephone-uri        = "tel:" telephone-subscriber
     *    telephone-subscriber = global-number / local-number
     *    global-number        = global-number-digits *par
     *    local-number         = local-number-digits *par context *par
     *    par                  = parameter / extension / isdn-subaddress
     *    isdn-subaddress      = ";isub=" 1*uric
     *    extension            = ";ext=" 1*phonedigit
     *    context              = ";phone-context=" descriptor
     *    descriptor           = domainname / global-number-digits
     *    global-number-digits = "+" *phonedigit DIGIT *phonedigit
     *    local-number-digits  = phonedigit-hex (HEXDIG / "*" / "#")*phonedigit-hex
     *    domainname           = *( domainlabel "." ) toplabel [ "." ]
     *    domainlabel          = alphanum
     *                              / alphanum *( alphanum / "-" ) alphanum
     *    toplabel             = ALPHA / ALPHA *( alphanum / "-" ) alphanum
     *    parameter            = ";" pname ["=" pvalue ]
     *    pname                = 1*( alphanum / "-" )
     *    pvalue               = 1*paramchar
     *    paramchar            = param-unreserved / unreserved / pct-encoded
     *    unreserved           = alphanum / mark
     *    mark                 = "-" / "_" / "." / "!" / "~" / "*" / "'" / "(" / ")"
     *    pct-encoded          = "%" HEXDIG HEXDIG
     *    param-unreserved     = "[" / "]" / "/" / ":" / "&" / "+" / "$"
     *    phonedigit           = DIGIT / [ visual-separator ]
     *    phonedigit-hex       = HEXDIG / "*" / "#" / [ visual-separator ]
     *    visual-separator     = "-" / "." / "(" / ")"
     *    alphanum             = ALPHA / DIGIT
     *    reserved             = ";" / "/" / "?" / ":" / "@" / "&" / "=" / "+" / "$" / ","
     *    uric                 = reserved / unreserved / pct-encoded
     * 
* * * @param buffer * @return * @throws SipParseException * @throws IndexOutOfBoundsException * @throws IOException */ static TelURI frame(final Buffer buffer) throws SipParseException, IndexOutOfBoundsException, IOException { final Buffer original = buffer.slice(); try { SipParser.expectTel(buffer); } catch (final SipParseException e) { throw new SipParseException(e.getErrorOffset() - 1, "TEL URI must start with tel:"); } TelUriParser parser = new TelUriParser(buffer, original); return parser.getTelUri(); } static Builder withPhoneNumber(final Buffer phoneNumber) { final Builder builder = new Builder(); return builder.withPhoneNumber(phoneNumber); } static Builder withPhoneNumber(final String phoneNumber) { final Builder builder = new Builder(); return builder.withPhoneNumber(phoneNumber); } class Builder extends URI.Builder { private boolean isGlobal; private Buffer phoneNumber; private ParametersSupport paramSupport = new ParametersSupport(); public Builder withPhoneNumber(Buffer phoneNumber) { assertNotNull(phoneNumber, "phoneNumber cannot be null"); this.phoneNumber = phoneNumber; return this; } public Builder withPhoneNumber(String phoneNumber) { assertNotEmpty(phoneNumber, "phoneNumber cannot be null or the empty string"); return withPhoneNumber(Buffers.wrap(phoneNumber)); } public Builder withGlobal(final boolean isGlobal) { this.isGlobal = isGlobal; return this; } public Builder withParameter(final Buffer name, final Buffer value) throws SipParseException, IllegalArgumentException { this.paramSupport.setParameter(name, value); return this; } public Builder withParameter(final String name, final String value) throws SipParseException, IllegalArgumentException { this.paramSupport.setParameter(name, value); return this; } public Builder withParameter(final String name, final int value) throws SipParseException, IllegalArgumentException { this.paramSupport.setParameter(Buffers.wrap(name), Buffers.wrap(value)); return this; } public Builder withParameter(final Buffer name, final int value) throws SipParseException, IllegalArgumentException { this.paramSupport.setParameter(name, Buffers.wrap(value)); return this; } public Builder withNoParameters() { this.paramSupport = new ParametersSupport(null); return this; } public Builder withParameters(ParametersSupport paramSupport) { this.paramSupport = paramSupport; return this; } @Override public TelURI build() throws SipParseException { PreConditions.assertNotEmpty(this.phoneNumber, "Phone number cannot be empty"); int size = 4; // tel: size += isGlobal ? 1 : 0; size += phoneNumber.capacity(); final Buffer params = this.paramSupport.toBuffer(); if (params != null) { size += params.capacity(); } final Buffer uri = Buffers.createBuffer(size); SipParser.SCHEME_TEL_COLON.getBytes(0, uri); if (isGlobal) uri.write(SipParser.PLUS); phoneNumber.getBytes(0, uri); params.getBytes(0, uri); return new TelURIImpl(isGlobal, phoneNumber, params, uri); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy