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

org.restcomm.protocols.ss7.map.smstpdu.AbsoluteTimeStampImpl Maven / Gradle / Ivy

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2011, Red Hat, Inc. and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This 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 software 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 software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.restcomm.protocols.ss7.map.smstpdu;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.restcomm.protocols.ss7.map.api.MAPException;
import org.restcomm.protocols.ss7.map.api.smstpdu.AbsoluteTimeStamp;

/**
 *
 * @author sergey vetyutnev
 *
 */
public class AbsoluteTimeStampImpl implements AbsoluteTimeStamp {

    private int year;
    private int month;
    private int day;
    private int hour;
    private int minute;
    private int second;
    private int timeZone;

    private AbsoluteTimeStampImpl() {
    }

    public AbsoluteTimeStampImpl(int year, int month, int day, int hour, int minute, int second, int timeZone) {
        this.year = year;
        this.month = month;
        this.day = day;
        this.hour = hour;
        this.minute = minute;
        this.second = second;
        this.timeZone = timeZone;
    }

    public static AbsoluteTimeStampImpl createMessage(InputStream stm) throws MAPException {

        if (stm == null)
            throw new MAPException("Error creating ServiceCentreTimeStamp: stream must not be null");

        AbsoluteTimeStampImpl res = new AbsoluteTimeStampImpl();

        try {
            byte[] buf = new byte[7];
            int i1 = stm.read(buf);
            if (i1 < 7)
                throw new MAPException("Error creating ServiceCentreTimeStamp: not enouph data in the stream");

            res.year = constractDigitVal(buf[0]);
            res.month = constractDigitVal(buf[1]);
            res.day = constractDigitVal(buf[2]);
            res.hour = constractDigitVal(buf[3]);
            res.minute = constractDigitVal(buf[4]);
            res.second = constractDigitVal(buf[5]);
            res.timeZone = constractDigitVal((byte) (buf[6] & 0xF7));
            if ((buf[6] & 0x08) != 0)
                res.timeZone = -res.timeZone;
        } catch (IOException e) {
            throw new MAPException("IOException when creating ServiceCentreTimeStamp: " + e.getMessage(), e);
        }

        return res;
    }

    private static int constractDigitVal(byte bt) {
        return (bt & 0xF) * 10 + ((bt & 0xF0) >>> 4);
    }

    public int getYear() {
        return year;
    }

    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    public int getHour() {
        return hour;
    }

    public int getMinute() {
        return minute;
    }

    public int getSecond() {
        return second;
    }

    public int getTimeZone() {
        return timeZone;
    }

    private static int constractEncodesVal(int val) {
        int i1 = val % 10;
        int i2 = val / 10;
        return (i1 << 4) | i2;
    }

    public void encodeData(OutputStream stm) throws MAPException {

        try {
            stm.write(constractEncodesVal(this.year));
            stm.write(constractEncodesVal(this.month));
            stm.write(constractEncodesVal(this.day));
            stm.write(constractEncodesVal(this.hour));
            stm.write(constractEncodesVal(this.minute));
            stm.write(constractEncodesVal(this.second));
            if (this.timeZone >= 0)
                stm.write(constractEncodesVal(this.timeZone));
            else
                stm.write(constractEncodesVal((-this.timeZone)) | 0x08);
        } catch (IOException e) {
            // This can no occur
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        sb.append("AbsoluteTimeStamp [");

        int yr;
        if (this.year > 90)
            yr = 1900 + this.year;
        else
            yr = 2000 + this.year;
        sb.append(this.month);
        sb.append("/");
        sb.append(this.day);
        sb.append("/");
        sb.append(yr);

        sb.append(" ");
        sb.append(this.hour);
        sb.append(":");
        sb.append(this.minute);
        sb.append(":");
        sb.append(this.second);

        sb.append(" GMT");
        if (this.timeZone >= 0)
            sb.append("+");
        sb.append(this.timeZone / 4);
        sb.append(":");
        sb.append((this.timeZone % 4) * 15);

        sb.append("]");

        return sb.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy