//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / IE
//
//File: partynumber.cpp
//
//Version: $Revision: 1.5 $
//
//State: $State: Exp $
//
//Date: $Date: 1999/03/10 15:01:36 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//      See corresponding header file.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#include "partynumber.h"
#include "pf/exception.h"

iePartyNumber :: iePartyNumber(void)
    : ieInformationElement(),
      _number(""),
      _type(unknownType),
      _plan(unknownPlan),
      _usedPlan(unspecified),
      _presentation(0), // valid value, if not given (Q.2931)
      _screening(0)     // valid value, if not given (Q.2931)
{
    return;
}

iePartyNumber :: iePartyNumber(
    const iePartyNumber &other_)
    : _number(other_._number),
      _type(other_._type),
      _plan(other_._plan),
      _usedPlan(other_._usedPlan),
      _presentation(other_._presentation),
      _screening(other_._screening)
{
    return;
}

iePartyNumber :: ~iePartyNumber(void)
{
    return;
}

pfIE *iePartyNumber :: clone(void) const
{
    iePartyNumber *newIe = new iePartyNumber(*this);
    return (pfIE *)newIe;
}

iePartyNumber* iePartyNumber :: narrow(pfIE *ie_)
{
    iePartyNumber *result = dynamic_cast<iePartyNumber*>(ie_);
    THROW_IF_DYNAMIC_CAST_FAILED(result);
    return result;
}

pfByte iePartyNumber :: getType(void) const
{
    return _type;
}

pfByte iePartyNumber :: getPlan (void) const
{
    return _plan;
}

void iePartyNumber :: setNSAP(const string &number_)
{
    if (number_.length() != 20)
    {
        throw pfOutOfRangeException(PF_EX_INFO);
    }
    _number = number_;
    _type = unknownType; 
    _plan = nsapPlan;
    _usedPlan = NSAP;
    return;
}

string iePartyNumber :: getNSAP(void) const
{
    string returnValue("");
    if (_usedPlan == NSAP)
    {
        returnValue = _number;
    }
    else if (_usedPlan == ISDN)
    {
        returnValue = "45" + _number;
        // ++TODO++
    }
    return returnValue;
}

void iePartyNumber :: setInternationalISDN(const string &number_)
{
    _number = number_;
    _type = internationalType;
    _plan = isdnPlan;
    _usedPlan = ISDN;
    return;
}

void iePartyNumber :: setNationalISDN(const string &number_)
{
    _number = number_;
    _type = nationalType;
    _plan = isdnPlan;
    _usedPlan = ISDN;
    return;
}

void iePartyNumber :: setSubscriberISDN(const string &number_)
{
    _number = number_;
    _type = subscriberType;
    _plan = isdnPlan;
    _usedPlan = ISDN;
    return;
}

string iePartyNumber :: getISDN(void) const
{
    string returnValue("");
    if (_usedPlan == ISDN)
    {
        returnValue = _number;
    }
    return returnValue;
}

void iePartyNumber :: setPresentationIndicator(pfUlong value_)
{
    _presentation = value_;
    return;
}

pfUlong iePartyNumber :: getPresentationIndicator(void) const
{
    return _presentation;
}

void iePartyNumber :: setScreeningIndicator(pfUlong value_)
{
    _screening = value_;
    return;
}

pfUlong iePartyNumber :: getScreeningIndicator(void) const
{
    return _screening;
}
