//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / 
//
//File: convert.cpp
//
//Version: $Revision: 1.10 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/07/06 08:07:48 $
//
//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 "convert.h"
#include "protocol/ilmi/asn/asnutil.h"
#include "protocol/ilmi/asn/rfc1155-smi.h"
#include "protocol/ilmi/asn/rfc1157-snmp.h"

// Base class convert ----------------------------
convert :: convert(void)
{
    return;
}

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


// class AsnIntConvert --------------------
asnIntConvert :: asnIntConvert(void)
    : convert()
{
    return;
}

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

string asnIntConvert :: getStringValue(VarBind *varBind_)
{
    string stringValue, sign;
    ObjectSyntax *value = varBind_->value;
    if(value->choiceId != ObjectSyntax::simpleCid)
    {
        throw mibException(PDUInt::badValue);
    }
    SimpleSyntax *simple = value->simple;
    if(simple->choiceId != SimpleSyntax::numberCid)
    {
        throw mibException(PDUInt::badValue);
    }
    AsnIntType tempIntType = (AsnIntType)(*(simple->number));
    pfLong number = (pfLong)tempIntType;
    if(number < 0)
    {
        sign = "-";
        number /= -1;
    }
    else
    {
        sign = "+";
    }
    while(number > 0)
    {
        stringValue = (char)((number % 10) + 48) + stringValue;
        number /= 10;
    }
    stringValue = sign + stringValue;
    return stringValue;
}

void asnIntConvert :: setStringValue(VarBind *varBind_, const string &string_)
{
    pfLong number = strtol(string_.c_str(), 0, 10);
    
    SimpleSyntax *simple = new SimpleSyntax();
    simple->choiceId = SimpleSyntax::numberCid;
    simple->number = new AsnInt(number);
    
    ObjectSyntax *value = new ObjectSyntax();
    value->choiceId = ObjectSyntax::simpleCid;
    value->simple = simple;
    
    varBind_->value = value;
    return;
}


// class asnOctsConvert --------------------
asnOctsConvert :: asnOctsConvert(void)
    : convert()
{
    return;
}

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

string asnOctsConvert :: getStringValue(VarBind *varBind_)
{
    string stringValue;
    ObjectSyntax *value = varBind_->value;
    if(value->choiceId != ObjectSyntax::simpleCid)
    {
        throw mibException(PDUInt::badValue);
    }
    SimpleSyntax *simple = value->simple;
    if(simple->choiceId != SimpleSyntax::stringCid)
    {
        throw mibException(PDUInt::badValue);
    }
    int len = (simple->string)->Len();
    stringValue.assign((const char *)*(simple->string), len);
    return stringValue;
}

void asnOctsConvert :: setStringValue(VarBind *varBind_, const string &string_)
{
    SimpleSyntax *simple = new SimpleSyntax();
    simple->choiceId = SimpleSyntax::stringCid;
    simple->string = new AsnOcts(string_.c_str());    
    
    ObjectSyntax *value = new ObjectSyntax();
    value->choiceId = ObjectSyntax::simpleCid;
    value->simple = simple;
    
    varBind_->value = value;
    return;
}


// class asnOidConvert --------------------
asnOidConvert :: asnOidConvert(void)
    : convert()
{
    return;
}

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

string asnOidConvert :: getStringValue(VarBind *varBind_)
{
    ObjectSyntax *value = varBind_->value;
    if(value->choiceId != ObjectSyntax::simpleCid)
    {
        throw mibException(PDUInt::badValue);
    }
    SimpleSyntax *simple = value->simple;
    if(simple->choiceId != SimpleSyntax::objectCid)
    {
        throw mibException(PDUInt::badValue);
    }
    string stringValue = asnUtil::asnOidToString(*(simple->object));
    return stringValue;
}

void asnOidConvert :: setStringValue(VarBind *varBind_, const string &string_)
{
    AsnOid asnOid = asnUtil::stringToAsnOid(string_);
    
    SimpleSyntax *simple = new SimpleSyntax();
    simple->choiceId = SimpleSyntax::objectCid;
    simple->object = new AsnOid(asnOid);

    ObjectSyntax *value = new ObjectSyntax();
    value->choiceId = ObjectSyntax::simpleCid;
    value->simple = simple;
    
    varBind_->value = value;
    return;
}
