//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / 
//
//File: mibtest.cpp
//
//Version: $Revision: 1.8 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/07/08 11:57:23 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//      Test program for mibTree and mibObjects
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 


#include <typeinfo>
#include <iostream.h>
#include <asn-incl.h>
#include "protocol/ilmi/asn/rfc1155-smi.h"
#include "protocol/ilmi/asn/rfc1157-snmp.h"
#include "protocol/ilmi/asn/rfc1213-mib2.h"
#include "protocol/ilmi/asn/asnutil.h"

#include "mib/convert.h"
#include "mib/mibtree.h"
#include "mib/mibdestination.h"
#include "pf/debug.h"
//#include "protocol/ilmi/asn/asnutil.h"

int main(void)
{
    debugOutputCout();

    //for(pfUlong i=0; i<300; i++) // no memory leaking
    //{
        /*
        string addrTable("1.3.6.1.4.1.353.2.6.1");
        asnUtil::oidList idList;
        asnUtil::stringToList(addrTable, idList);
        AsnOid oid = asnUtil::listToAsnOid(idList);
        string taulu = asnUtil::asnOidToString(oid);
        asnUtil::asnOidToList(oid, idList);
        taulu = asnUtil::listToString(idList);
        debugString("taulu ", taulu);
        */

    mibTree puu;
    mibDestination *dest= 0;
    
    string ilmi("1.3.6.1.4.1.353.2");
    string addr("1.3.6.1.4.1.353.2.6");
    string addrTable("1.3.6.1.4.1.353.2.6.1");
    string addrTablePort("1.3.6.1.4.1.353.2.6.1.1.1");
    string addrTablePrefix("1.3.6.1.4.1.353.2.6.1.1.2");
    string addrTableStatus("1.3.6.1.4.1.353.2.6.1.1.3");
    try
    {
        puu.insertNode("1.3.6.1");
        puu.insertNode("1.3.6.1.2.1.1");

        string sysDescr("1.3.6.1.2.1.1.1");
        string sysObjectID("1.3.6.1.2.1.1.2");
        string sysName("1.3.6.1.2.1.1.5");
        string sysServices("1.3.6.1.2.1.1.7");        
        puu.insertAsnOctsLeaf(sysDescr, dest);
        puu.insertAsnOidLeaf(sysObjectID, dest);
        puu.insertAsnOctsLeaf(sysName, dest);
        puu.insertAsnIntLeaf(sysServices, dest);
        
        puu.insertNode(ilmi);
        puu.insertNode(addr);        
        puu.insertTable(addrTable);        

        puu.insertAsnIntColumn(addrTablePort, dest);
        //puu.insertAsnOctsColumn(addrTablePrefix, dest);
        //puu.insertAsnIntColumn(addrTableStatus, dest);
        
        //string rivi("0.222.33");
        //puu.insertRow(addrTable, rivi);
        puu.insertRow("1.3.6.1.4.1.353.2.6.1.1.1.0.32.4242.4.34");
        puu.insertRow("1.3.6.1.4.1.353.2.6.1.1.1.0.32.32.65.34");
        puu.insertRow("1.3.6.1.4.1.353.2.6.1.1.1.0.32.32.4.324");
        puu.deleteRow("1.3.6.1.4.1.353.2.6.1.1.1.0.32.4242.4.34");
        puu.deleteRow("1.3.6.1.4.1.353.2.6.1.1.1.0.32.32.65.34");
        puu.deleteRow("1.3.6.1.4.1.353.2.6.1.1.1.0.32.32.4.324");
        //puu.deleteRow("1.3.6.1.4.1.353.2.6.1.1.1.0.32.32.4.324");
        
        //puu.clearTable(addrTable);

    }
    catch(mibException &ex)
    {
        cout << "Error: " << ex.getErrorStatus() << endl;
        delete (mibException *)&ex;
    }

//}
    
    // stringToVarBind/varBindToString - testing
  
    try
    {
        cout << "\n\n*Testing varBindToString*\n";
        
        // AsnInt-type -----------------------
        VarBind *var1 = new VarBind;
        ObjectName name1 = sysServices;
        //AsnOid aport(1,3,6,1,4,1,353,2,6,1,1,1);
        //ObjectName name1 = aport; // column

        asnIntConvert intConvert;
        intConvert.setStringValue(var1, "0");        
        var1->name = name1;

        string s11, s12;
        puu.varBindToString(var1, s11, s12);
        cout << "S11: " << s11 << " s12: " << s12 << endl;

        
        // AsnOcts-type -------------------------
        VarBind *var2 = new VarBind;
        ObjectName name2 = sysName;

        asnOctsConvert octsConvert;
        octsConvert.setStringValue(var2, "TOVE ilmiswitch");
        var2->name = name2;

        string s21, s22;
        puu.varBindToString(var2, s21, s22);
        cout << "S21: " << s21 << " S22: " << s22 << endl;


        // AsnOid-type -------------------------
        VarBind *var3 = new VarBind;
        ObjectName name3 = sysObjectID;
        
        asnOidConvert oidConvert;
        oidConvert.setStringValue(var3, "1.2.3.4.5.6.7");
        var3->name = name3;
        
        string s31, s32;
        puu.varBindToString(var3, s31, s32);
        cout << "S31: " << s31 << " S32: " << s32 << endl;

        
        cout << "\n*Testing stringToVarBind*\n";
        VarBind *vb1 = new VarBind;
        VarBind *vb2 = new VarBind;
        VarBind *vb3 = new VarBind;    
        
        puu.stringToVarBind(vb1, s11, s12);
        puu.stringToVarBind(vb2, s21, s22);
        puu.stringToVarBind(vb3, s31, s32);
        
        cout << "\nvb1: ";
        (vb1->name).Print(cout);
        (vb1->value)->Print(cout);
        cout << "\nvb2: ";
        (vb2->name).Print(cout);
        (vb2->value)->Print(cout);                
        cout << "\nvb3: ";
        (vb3->name).Print(cout);
        (vb3->value)->Print(cout);
                
        //cout << "\n*Testing get(sysServices)*\n";
        //puu.get(var1);
        
        //cout << "\n*Testing set(sysServices)*\n";
        //puu.set(var1);
        
        //cout << "\n*Testing getNext(sysObjectID)*\n";
        //puu.getNext(var3);
        //(var3->name).Print(cout);
        //(var3->value)->Print(cout);


        //cout << "\n*Testing getNext(addrTable (1.3.6.1.4.1.353.2.6.1))*\n";
        //VarBind *vari = new VarBind;
        //ObjectName namei = AsnOid(1, 3, 6, 1, 4, 1, 353, 2, 6, 1);
        //vari->name = namei;
        //puu.getNext(vari);
        //(vari->name).Print(cout);
    }
    catch(mibException &ex)
    {
        cout << "Error: " << ex.getErrorStatus() << endl;
        delete (mibException *)&ex;
    }
    catch(...)
    {
        cout << "Generic Error!" << endl;
    }
  
    cout << endl;
    return 0;
}






