//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / 
//
//File: 
//
//Version: $Revision: 1.5 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/04 12:18:39 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//      
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#include <typeinfo>
#include <string>
#include "pf/storage.h"
#include "ie/connectionidentifier.h"
#include "ie/iestrings.h"
#include <iostream.h>
#include "pf/debug.h"
#include <autoptr.h>


int main(void)
{
    debugOutputCout();
        
    pfStorage store, store2;
    string ieStr = ieConnectionIdentifierStr;

    //store.defineMultiIE(ie1Str); // Lisätään muuttuja, joita voi olla useita
    store.defineIE(ieStr);
    //store.defineMultiIE(ie2Str); // Laiton!!!

    debugUser("Phase 1");
    if(1) // to simulate local variable
    {
        /*
        ieConnectionIdentifier *ie = new ieConnectionIdentifier;
        auto_ptr<pfIE> iePtr(ie);

        ie->setVPCI(1);
        ie->setVCI(5);
        
        store.setIE(ieStr, iePtr);
        */
    }
    
    /*
    pfStorage st;
    st.defineInteger("int");
    st.setInteger("int", 2);

    store.defineStorage("st");
    store.setStorage("st", st);

    pfStorage st2;
    st2.defineInteger("int");
    st2.setInteger("int", 3);
    store2.defineStorage("st");
    store2.setStorage("st", st2);
    */

    // from sigif
    string sigCauseStr("Cause");
    string sigCause2Str("Cause2");
    string sigCause_LocationStr("Location");
    string sigCause_ClassStr("Class");
    string sigCause_ValueStr("Value");

    store.defineStorage(sigCauseStr);
    //pfStorage &st = (store)[sigCauseStr];
    pfStorage st;
    st.defineInteger(sigCause_LocationStr);
    st.setInteger(sigCause_LocationStr, 33);
    st.defineInteger(sigCause_ClassStr);
    st.defineInteger(sigCause_ValueStr);
    st.setInteger(sigCause_ValueStr, 3); 
    store.setStorage(sigCauseStr, st);

    store2.defineStorage(sigCauseStr);
    pfStorage &st2 = (store2)[sigCauseStr];
    st2.defineInteger(sigCause_LocationStr);
    st2.setInteger(sigCause_LocationStr, 11);
    st2.defineInteger(sigCause_ClassStr);
    st2.defineInteger(sigCause_ValueStr);
    st2.setInteger(sigCause_ValueStr, 1);
    //store2.undefine(sigCauseStr);

    
    cout << "store: " << endl;
    store.print();
    cout << "store2: " << endl;
    store2.print();
    store2.copyIfPresent(store, sigCauseStr);
    //store2.fetch(store);
    cout << "store2: " << endl;
    store2.print();
    

    debugUser("Phase 2");

    try
    {
        if(1) // to simulate local variable
        {
            /*
            pfIE &ieRef = store.getIEreference(ieStr);
            ieConnectionIdentifier &testIE =
                dynamic_cast<ieConnectionIdentifier&>(ieRef);
            
            cout << "VPCI: " << testIE.getVPCI() << endl;
            cout << "VCI: " << testIE.getVCI() << endl;    
            
            testIE.setVPCI(10);
            testIE.setVCI(2);
            */
            
            pfIE *ieRef = store.getIE(ieStr);
            ieConnectionIdentifier *testIE =
                dynamic_cast<ieConnectionIdentifier *>(ieRef);
            
            cout << "VPCI: " << testIE->getVPCI() << endl;
            cout << "VCI: " << testIE->getVCI() << endl;    
            
            testIE->setVPCI(10);
            testIE->setVCI(2);

        }
        
        debugUser("Phase 3");
        
        pfIE *ieRef2 = store.adoptIE(ieStr);
        ieConnectionIdentifier *testIE2 =
            dynamic_cast<ieConnectionIdentifier *>(ieRef2);
        cout << "VPCI: " << testIE2->getVPCI() << endl;
        cout << "VCI: " << testIE2->getVCI() << endl;    

    }
    catch(pfException &ex)
    {
        ex.printInfo();
    }
    /*
    pfIE &ieRef2 = store.getIE(ieStr);
    ieConnectionIdentifier &testIE2 =
        dynamic_cast<ieConnectionIdentifier&>(ieRef2);    
    cout << "VPCI: " << testIE2.getVPCI() << endl;
    cout << "VCI: " << testIE2.getVCI() << endl;    
    */
    return 0;
}
