#include "stdafx.h"

#include "termevnt.h"


HRESULT CASRTerminalEvent::FireEvent(
                                     CTAPI * pTapi,
                                     ITCallInfo *pCall,
                                     ITTerminal  * pTerminal,
                                     HRESULT hrErrorCode
                                     )
{

    STATICLOG((TL_TRACE, "FireEvent - enter" ));


    CCall *pCCall = NULL;

    pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
    
    if (NULL == pCCall)
    {
        STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
        return E_FAIL;
    }

    if( pCCall->DontExpose())
    {
        STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
        return S_OK;
    }

    if (NULL == pTapi)
    {
        STATICLOG((TL_ERROR, "FireEvent - tapi object is NULL" ));
        return E_POINTER;
    }


    //
    // create the event object
    //

    HRESULT hr = E_FAIL;

    CComObject<CASRTerminalEvent> *p;

    hr = CComObject<CASRTerminalEvent>::CreateInstance( &p );

    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
        return E_OUTOFMEMORY;
    }


    //
    // save event information to the event object
    //

    hr = p->put_Call(pCall);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Call failed" ));

        delete p;
        return hr;
    }

    hr = p->put_Terminal(pTerminal);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Terminal failed" ));

        delete p;
        return hr;
    }


    hr = p->put_ErrorCode(hrErrorCode);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_ErrorCode failed" ));

        delete p;
        return hr;
    }


    //
    // get the dispatch interface
    //

    IDispatch *pDisp = NULL;

    hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );

    if (FAILED(hr))
    {
        delete p;
        STATICLOG((TL_ERROR, "FireEvent - could not get IDispatch %lx", hr));

        return hr;
    }

    
    //
    // fire the event
    //

    pTapi->Event(
                 TE_ASRTERMINAL,
                 pDisp
                );


    //
    // release our reference
    //
    pDisp->Release();
    
    STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));

    
    return S_OK;
}


CASRTerminalEvent::CASRTerminalEvent()
    :m_pCallInfo(NULL),
    m_pTerminal(NULL),
    m_hr(S_OK)
{
    LOG((TL_TRACE, "CASRTerminalEvent[%p] - enter", this));
    
    LOG((TL_TRACE, "CASRTerminalEvent - finish"));
}


CASRTerminalEvent::~CASRTerminalEvent()
{
    LOG((TL_INFO, "~CASRTerminalEvent[%p] - enter", this));

 
    //
    // remember to release all the references we may hold
    //

    if (NULL != m_pCallInfo)
    {
        LOG((TL_INFO, "~CASRTerminalEvent - releasing m_pCallInfo %p", m_pCallInfo));

        m_pCallInfo->Release();
        m_pCallInfo = NULL;
    }


    if ( NULL != m_pTerminal) 
    {
        LOG((TL_INFO, "~CASRTerminalEvent - releasing m_pTerminal %p", m_pTerminal));

        m_pTerminal->Release();
        m_pTerminal = NULL;
    }


    LOG((TL_TRACE, "~CASRTerminalEvent - finish"));
}



HRESULT STDMETHODCALLTYPE CASRTerminalEvent::get_Call(
        OUT ITCallInfo **ppCallInfo
        )
{
    LOG((TL_TRACE, "get_Call[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppCallInfo, sizeof(ITCallInfo *)))
    {
        LOG((TL_ERROR, "get_Call - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppCallInfo = NULL;


    //
    // return call info if we have it
    //

    if (NULL != m_pCallInfo)
    {

        *ppCallInfo = m_pCallInfo;
        (*ppCallInfo)->AddRef();
    }


    LOG((TL_TRACE, "get_Call - finish"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CASRTerminalEvent::get_Terminal(
        OUT ITTerminal **ppTerminal
        )
{
    LOG((TL_TRACE, "get_Terminal[%p] - enter", this));

    
    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppTerminal, sizeof(ITTerminal*)))
    {
        LOG((TL_ERROR, "get_Terminal - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppTerminal = NULL;


    //
    // return terminal if we have it
    //
    
    if (NULL != m_pTerminal)
    {

        *ppTerminal = m_pTerminal;
        (*ppTerminal)->AddRef();
    }


    LOG((TL_TRACE, "get_Terminal - finish"));

    return S_OK;
}



HRESULT STDMETHODCALLTYPE CASRTerminalEvent::get_Error(
        OUT HRESULT *phrErrorCode
        )
{
    LOG((TL_TRACE, "get_Error[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(phrErrorCode, sizeof(HRESULT)))
    {
        LOG((TL_ERROR, "get_Error - bad pointer passed in"));

        return E_POINTER;
    }


    //
    // return error code
    //
    
    *phrErrorCode = m_hr;


    LOG((TL_TRACE, "get_Error - finish. hr = [%lx]", m_hr));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CASRTerminalEvent::put_Terminal(
            IN ITTerminal *pTerminal
            )
{
    LOG((TL_TRACE, "put_Terminal[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pTerminal) && IsBadReadPtr(pTerminal, sizeof(ITTerminal)))
    {
        LOG((TL_ERROR, "put_Terminal - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pTerminal = pTerminal;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pTerminal)
    {
        m_pTerminal->AddRef();
    }


    LOG((TL_TRACE, "put_Terminal - finished"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CASRTerminalEvent::put_Call(
            IN ITCallInfo *pCallInfo
            )
{
    LOG((TL_TRACE, "put_Call[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pCallInfo) && IsBadReadPtr(pCallInfo, sizeof(ITCallInfo)))
    {
        LOG((TL_ERROR, "put_Call - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pCallInfo = pCallInfo;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pCallInfo)
    {
        m_pCallInfo->AddRef();
    }


    LOG((TL_TRACE, "put_Call - finished"));

    return S_OK;
}



HRESULT STDMETHODCALLTYPE CASRTerminalEvent::put_ErrorCode(
            IN HRESULT hrErrorCode
            )
{
    
    LOG((TL_TRACE, "put_ErrorCode[%p] - enter. hr = [%lx]", this, hrErrorCode));
  

    //
    // keep the value
    //

    m_hr = hrErrorCode;

    
    LOG((TL_TRACE, "put_ErrorCode - finished"));

    return S_OK;
}



HRESULT CFileTerminalEvent::FireEvent(
                                     CAddress *pCAddress,
                                     CTAPI * pTapi,
                                     ITCallInfo *pCall,
                                     TERMINAL_MEDIA_STATE tmsTerminalState,
                                     FT_STATE_EVENT_CAUSE ftecEventCause,
                                     ITTerminal  * pTerminal,
                                     ITFileTrack * pFileTrack,
                                     HRESULT hrErrorCode
                                     )
{

    STATICLOG((TL_TRACE, "FireEvent - enter" ));
    STATICLOG((TL_INFO, "     File Terminal State -------------> %d", tmsTerminalState));
    STATICLOG((TL_INFO, "     File Terminal Event Cause -------> %d", ftecEventCause));
    STATICLOG((TL_INFO, "     File Terminal -------------------> %p", pTerminal));


    CCall *pCCall = NULL;

    pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
    
    if (NULL == pCCall)
    {
        STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
        return E_FAIL;
    }

    if( pCCall->DontExpose())
    {
        STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
        return S_OK;
    }

    if (NULL == pTapi)
    {
        STATICLOG((TL_ERROR, "FireEvent - tapi object is NULL" ));
        return E_POINTER;
    }

    
    //
    // Check the event filter mask
    // This are MSP events and are not filtered by
    // TapiSrv
    //

    DWORD dwEventFilterMask = 0;
    dwEventFilterMask = pCAddress->GetSubEventsMask( TE_FILETERMINAL );
    if( !( dwEventFilterMask & GET_SUBEVENT_FLAG(tmsTerminalState)))
    {
        STATICLOG((TL_WARN, "FireEvent - filtering out this event [%lx]", tmsTerminalState));
        return S_OK;
    }


    //
    // create the event object
    //

    HRESULT hr = E_FAIL;

    CComObject<CFileTerminalEvent> *p;

    hr = CComObject<CFileTerminalEvent>::CreateInstance( &p );

    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
        return E_OUTOFMEMORY;
    }


    //
    // save event information to the event object
    //

    hr = p->put_Call(pCall);

    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Call failed" ));

        delete p;
        return hr;
    }

    hr = p->put_Terminal(pTerminal);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Terminal failed" ));

        delete p;
        return hr;
    }

    hr = p->put_Track(pFileTrack);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Track failed" ));

        delete p;
        return hr;
    }

    hr = p->put_State(tmsTerminalState);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_State failed" ));

        delete p;
        return hr;
    }

    hr = p->put_Cause(ftecEventCause);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Cause failed" ));

        delete p;
        return hr;
    }

    hr = p->put_ErrorCode(hrErrorCode);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_ErrorCode failed" ));

        delete p;
        return hr;
    }


    //
    // get the dispatch interface
    //

    IDispatch *pDisp = NULL;

    hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );

    if (FAILED(hr))
    {
        delete p;
        STATICLOG((TL_ERROR, "FireEvent - could not get IDispatch %lx", hr));

        return hr;
    }

    
    //
    // fire the event
    //

    pTapi->Event(
                 TE_FILETERMINAL,
                 pDisp
                );


    //
    // release our reference
    //
    pDisp->Release();
    
    STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));

    
    return S_OK;
}


CFileTerminalEvent::CFileTerminalEvent()
    :m_pCallInfo(NULL),
    m_pParentFileTerminal(NULL),
    m_pFileTrack(NULL),
    m_tmsTerminalState(TMS_IDLE),
    m_ftecEventCause(FTEC_NORMAL),
    m_hr(S_OK)
{
    LOG((TL_TRACE, "CFileTerminalEvent[%p] - enter", this));
    
    LOG((TL_TRACE, "CFileTerminalEvent - finish"));
}


CFileTerminalEvent::~CFileTerminalEvent()
{
    LOG((TL_TRACE, "~CFileTerminalEvent[%p] - enter", this));

 
    //
    // remember to release all the references we may hold
    //

    if (NULL != m_pCallInfo)
    {
        LOG((TL_INFO, "~CFileTerminalEvent - releasing m_pCallInfo %p", m_pCallInfo));

        m_pCallInfo->Release();
        m_pCallInfo = NULL;
    }


    if ( NULL != m_pParentFileTerminal) 
    {
        LOG((TL_INFO, "~CFileTerminalEvent - releasing m_pParentFileTerminal %p", m_pParentFileTerminal));

        m_pParentFileTerminal->Release();
        m_pParentFileTerminal = NULL;
    }

    
    if (NULL != m_pFileTrack)
    {
        LOG((TL_INFO, "~CFileTerminalEvent - releasing m_pFileTrack %p", m_pFileTrack));

        m_pFileTrack->Release();
        m_pFileTrack = NULL;
    }


    LOG((TL_TRACE, "~CFileTerminalEvent - finish"));
}



HRESULT STDMETHODCALLTYPE CFileTerminalEvent::get_Call(
        OUT ITCallInfo **ppCallInfo
        )
{
    LOG((TL_TRACE, "get_Call[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppCallInfo, sizeof(ITCallInfo *)))
    {
        LOG((TL_ERROR, "get_Call - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppCallInfo = NULL;


    //
    // return call info if we have it
    //

    if (NULL != m_pCallInfo)
    {

        *ppCallInfo = m_pCallInfo;
        (*ppCallInfo)->AddRef();
    }


    LOG((TL_TRACE, "get_Call - finish"));

    return S_OK;
}
    
HRESULT STDMETHODCALLTYPE CFileTerminalEvent::get_State(
        OUT TERMINAL_MEDIA_STATE *pFileTerminallState
        )
{
    LOG((TL_TRACE, "get_State[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(pFileTerminallState, sizeof(TERMINAL_MEDIA_STATE)))
    {
        LOG((TL_ERROR, "get_State - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // return state
    //

    *pFileTerminallState = m_tmsTerminalState;

 
    LOG((TL_TRACE, "get_State - finish. state = [%lx]", m_tmsTerminalState));

    return S_OK;
}

    
HRESULT STDMETHODCALLTYPE CFileTerminalEvent::get_Cause(
        OUT FT_STATE_EVENT_CAUSE *pCause
        )
{
    LOG((TL_TRACE, "get_Cause[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(pCause, sizeof(FT_STATE_EVENT_CAUSE)))
    {
        LOG((TL_ERROR, "get_Cause - bad pointer passed in"));

        return E_POINTER;
    }


    //
    // return cause
    //
    
    *pCause = m_ftecEventCause;


    LOG((TL_TRACE, "get_Cause - finish. cause = [%lx]", m_ftecEventCause));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CFileTerminalEvent::get_Terminal(
        OUT ITTerminal **ppTerminal
        )
{
    LOG((TL_TRACE, "get_Terminal[%p] - enter", this));

    
    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppTerminal, sizeof(ITTerminal*)))
    {
        LOG((TL_ERROR, "get_Terminal - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppTerminal = NULL;


    //
    // return terminal if we have it
    //
    
    if (NULL != m_pParentFileTerminal)
    {

        *ppTerminal = m_pParentFileTerminal;
        (*ppTerminal)->AddRef();
    }


    LOG((TL_TRACE, "get_Terminal - finish"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CFileTerminalEvent::get_Track(
        OUT ITFileTrack **ppFileTrack
        )
{
    LOG((TL_TRACE, "get_Track[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppFileTrack, sizeof(ITFileTrack*)))
    {
        LOG((TL_ERROR, "get_Track - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppFileTrack = NULL;


    //
    // return track terminal if we have it
    //
    
    if (NULL != m_pFileTrack)
    {

        *ppFileTrack = m_pFileTrack;
        (*ppFileTrack)->AddRef();
    }


    LOG((TL_TRACE, "get_Track - finish"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CFileTerminalEvent::get_Error(
        OUT HRESULT *phrErrorCode
        )
{
    LOG((TL_TRACE, "get_Error[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(phrErrorCode, sizeof(HRESULT)))
    {
        LOG((TL_ERROR, "get_Error - bad pointer passed in"));

        return E_POINTER;
    }


    //
    // return error code
    //
    
    *phrErrorCode = m_hr;


    LOG((TL_TRACE, "get_Error - finish. hr = [%lx]", m_hr));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CFileTerminalEvent::put_Terminal(
            IN ITTerminal *pTerminal
            )
{
    LOG((TL_TRACE, "put_Terminal[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pTerminal) && IsBadReadPtr(pTerminal, sizeof(ITTerminal)))
    {
        LOG((TL_ERROR, "put_Terminal - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pParentFileTerminal = pTerminal;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pParentFileTerminal)
    {
        m_pParentFileTerminal->AddRef();
    }


    LOG((TL_TRACE, "put_Terminal - finished"));

    return S_OK;
}

HRESULT STDMETHODCALLTYPE CFileTerminalEvent::put_Track(
            IN ITFileTrack *pFileTrack
            )
{
    LOG((TL_TRACE, "put_Track[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pFileTrack) && IsBadReadPtr(pFileTrack, sizeof(ITFileTrack)))
    {
        LOG((TL_ERROR, "put_Track - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pFileTrack = pFileTrack;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pFileTrack)
    {
        m_pFileTrack->AddRef();
    }


    LOG((TL_TRACE, "put_Track - finished"));

    return S_OK;
}

HRESULT STDMETHODCALLTYPE CFileTerminalEvent::put_Call(
            IN ITCallInfo *pCallInfo
            )
{
    LOG((TL_TRACE, "put_Call[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pCallInfo) && IsBadReadPtr(pCallInfo, sizeof(ITCallInfo)))
    {
        LOG((TL_ERROR, "put_Call - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pCallInfo = pCallInfo;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pCallInfo)
    {
        m_pCallInfo->AddRef();
    }


    LOG((TL_TRACE, "put_Call - finished"));

    return S_OK;
}

    
HRESULT STDMETHODCALLTYPE CFileTerminalEvent::put_State(
            IN TERMINAL_MEDIA_STATE tmsTerminalState
            )
{
    
    LOG((TL_TRACE, "put_State[%p] - enter. State = [%x]", this, tmsTerminalState));
  

    //
    // keep the value
    //

    m_tmsTerminalState = tmsTerminalState;

    
    LOG((TL_TRACE, "put_State - finished"));

    return S_OK;
}
    
HRESULT STDMETHODCALLTYPE CFileTerminalEvent::put_Cause(
            IN FT_STATE_EVENT_CAUSE Cause
            )
{
    
    LOG((TL_TRACE, "put_Cause[%p] - enter. Cause = [%x]", this, Cause));
  

    //
    // keep the value
    //

    m_ftecEventCause = Cause;

    
    LOG((TL_TRACE, "put_Cause - finished"));

    return S_OK;
}

HRESULT STDMETHODCALLTYPE CFileTerminalEvent::put_ErrorCode(
            IN HRESULT hrErrorCode
            )
{
    
    LOG((TL_TRACE, "put_ErrorCode[%p] - enter. hr = [%lx]", this, hrErrorCode));
  

    //
    // keep the value
    //

    m_hr = hrErrorCode;

    
    LOG((TL_TRACE, "put_ErrorCode - finished"));

    return S_OK;
}


HRESULT CToneTerminalEvent::FireEvent(
                                     CTAPI * pTapi,
                                     ITCallInfo *pCall,
                                     ITTerminal  * pTerminal,
                                     HRESULT hrErrorCode
                                     )
{

    STATICLOG((TL_TRACE, "FireEvent - enter" ));


    CCall *pCCall = NULL;

    pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
    
    if (NULL == pCCall)
    {
        STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
        return E_FAIL;
    }

    if( pCCall->DontExpose())
    {
        STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
        return S_OK;
    }

    if (NULL == pTapi)
    {
        STATICLOG((TL_ERROR, "FireEvent - tapi object is NULL" ));
        return E_POINTER;
    }


    //
    // create the event object
    //

    HRESULT hr = E_FAIL;

    CComObject<CToneTerminalEvent> *p;

    hr = CComObject<CToneTerminalEvent>::CreateInstance( &p );

    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
        return E_OUTOFMEMORY;
    }


    //
    // save event information to the event object
    //

    hr = p->put_Call(pCall);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Call failed" ));

        delete p;
        return hr;
    }

    hr = p->put_Terminal(pTerminal);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Terminal failed" ));

        delete p;
        return hr;
    }


    hr = p->put_ErrorCode(hrErrorCode);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_ErrorCode failed" ));

        delete p;
        return hr;
    }


    //
    // get the dispatch interface
    //

    IDispatch *pDisp = NULL;

    hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );

    if (FAILED(hr))
    {
        delete p;
        STATICLOG((TL_ERROR, "FireEvent - could not get IDispatch %lx", hr));

        return hr;
    }

    
    //
    // fire the event
    //

    pTapi->Event(
                 TE_TONETERMINAL,
                 pDisp
                );


    //
    // release our reference
    //
    pDisp->Release();
    
    STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));

    
    return S_OK;
}


CToneTerminalEvent::CToneTerminalEvent()
    :m_pCallInfo(NULL),
    m_pTerminal(NULL),
    m_hr(S_OK)
{
    LOG((TL_TRACE, "CToneTerminalEvent[%p] - enter", this));
    
    LOG((TL_TRACE, "CToneTerminalEvent - finish"));
}


CToneTerminalEvent::~CToneTerminalEvent()
{
    LOG((TL_TRACE, "~CToneTerminalEvent[%p] - enter", this));

 
    //
    // remember to release all the references we may hold
    //

    if (NULL != m_pCallInfo)
    {
        LOG((TL_INFO, "~CToneTerminalEvent - releasing m_pCallInfo %p", m_pCallInfo));

        m_pCallInfo->Release();
        m_pCallInfo = NULL;
    }


    if ( NULL != m_pTerminal) 
    {
        LOG((TL_INFO, "~CToneTerminalEvent - releasing m_pTerminal %p", m_pTerminal));

        m_pTerminal->Release();
        m_pTerminal = NULL;
    }


    LOG((TL_TRACE, "~CToneTerminalEvent - finish"));
}



HRESULT STDMETHODCALLTYPE CToneTerminalEvent::get_Call(
        OUT ITCallInfo **ppCallInfo
        )
{
    LOG((TL_TRACE, "get_Call[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppCallInfo, sizeof(ITCallInfo *)))
    {
        LOG((TL_ERROR, "get_Call - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppCallInfo = NULL;


    //
    // return call info if we have it
    //

    if (NULL != m_pCallInfo)
    {

        *ppCallInfo = m_pCallInfo;
        (*ppCallInfo)->AddRef();
    }


    LOG((TL_TRACE, "get_Call - finish"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CToneTerminalEvent::get_Terminal(
        OUT ITTerminal **ppTerminal
        )
{
    LOG((TL_TRACE, "get_Terminal[%p] - enter", this));

    
    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppTerminal, sizeof(ITTerminal*)))
    {
        LOG((TL_ERROR, "get_Terminal - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppTerminal = NULL;


    //
    // return terminal if we have it
    //
    
    if (NULL != m_pTerminal)
    {

        *ppTerminal = m_pTerminal;
        (*ppTerminal)->AddRef();
    }


    LOG((TL_TRACE, "get_Terminal - finish"));

    return S_OK;
}



HRESULT STDMETHODCALLTYPE CToneTerminalEvent::get_Error(
        OUT HRESULT *phrErrorCode
        )
{
    LOG((TL_TRACE, "get_Error[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(phrErrorCode, sizeof(HRESULT)))
    {
        LOG((TL_ERROR, "get_Error - bad pointer passed in"));

        return E_POINTER;
    }


    //
    // return error code
    //
    
    *phrErrorCode = m_hr;


    LOG((TL_TRACE, "get_Error - finish. hr = [%lx]", m_hr));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CToneTerminalEvent::put_Terminal(
            IN ITTerminal *pTerminal
            )
{
    LOG((TL_TRACE, "put_Terminal[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pTerminal) && IsBadReadPtr(pTerminal, sizeof(ITTerminal)))
    {
        LOG((TL_ERROR, "put_Terminal - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pTerminal = pTerminal;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pTerminal)
    {
        m_pTerminal->AddRef();
    }


    LOG((TL_TRACE, "put_Terminal - finished"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CToneTerminalEvent::put_Call(
            IN ITCallInfo *pCallInfo
            )
{
    LOG((TL_TRACE, "put_Call[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pCallInfo) && IsBadReadPtr(pCallInfo, sizeof(ITCallInfo)))
    {
        LOG((TL_ERROR, "put_Call - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pCallInfo = pCallInfo;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pCallInfo)
    {
        m_pCallInfo->AddRef();
    }


    LOG((TL_TRACE, "put_Call - finished"));

    return S_OK;
}



HRESULT STDMETHODCALLTYPE CToneTerminalEvent::put_ErrorCode(
            IN HRESULT hrErrorCode
            )
{
    
    LOG((TL_TRACE, "put_ErrorCode[%p] - enter. hr = [%lx]", this, hrErrorCode));
  

    //
    // keep the value
    //

    m_hr = hrErrorCode;

    
    LOG((TL_TRACE, "put_ErrorCode - finished"));

    return S_OK;
}



HRESULT CTTSTerminalEvent::FireEvent(
                                     CTAPI * pTapi,
                                     ITCallInfo *pCall,
                                     ITTerminal  * pTerminal,
                                     HRESULT hrErrorCode
                                     )
{

    STATICLOG((TL_TRACE, "FireEvent - enter" ));


    CCall *pCCall = NULL;

    pCCall = dynamic_cast<CComObject<CCall>*>(pCall);
    
    if (NULL == pCCall)
    {
        STATICLOG((TL_ERROR, "FireEvent - bad call pointer" ));
        return E_FAIL;
    }

    if( pCCall->DontExpose())
    {
        STATICLOG((TL_INFO, "FireEvent - Don't expose this call %p", pCCall));
        return S_OK;
    }

    if (NULL == pTapi)
    {
        STATICLOG((TL_ERROR, "FireEvent - tapi object is NULL" ));
        return E_POINTER;
    }


    //
    // create the event object
    //

    HRESULT hr = E_FAIL;

    CComObject<CTTSTerminalEvent> *p;

    hr = CComObject<CTTSTerminalEvent>::CreateInstance( &p );

    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - could not createinstance" ));
        return E_OUTOFMEMORY;
    }


    //
    // save event information to the event object
    //

    hr = p->put_Call(pCall);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Call failed" ));

        delete p;
        return hr;
    }

    hr = p->put_Terminal(pTerminal);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_Terminal failed" ));

        delete p;
        return hr;
    }


    hr = p->put_ErrorCode(hrErrorCode);
    if (FAILED(hr))
    {
        STATICLOG((TL_ERROR, "FireEvent - put_ErrorCode failed" ));

        delete p;
        return hr;
    }


    //
    // get the dispatch interface
    //

    IDispatch *pDisp = NULL;

    hr = p->_InternalQueryInterface( IID_IDispatch, (void **)&pDisp );

    if (FAILED(hr))
    {
        delete p;
        STATICLOG((TL_ERROR, "FireEvent - could not get IDispatch %lx", hr));

        return hr;
    }

    
    //
    // fire the event
    //

    pTapi->Event(
                 TE_TTSTERMINAL,
                 pDisp
                );


    //
    // release our reference
    //
    pDisp->Release();
    
    STATICLOG((TL_TRACE, "FireEvent - exit - returing SUCCESS" ));

    
    return S_OK;
}


CTTSTerminalEvent::CTTSTerminalEvent()
    :m_pCallInfo(NULL),
    m_pTerminal(NULL),
    m_hr(S_OK)
{
    LOG((TL_TRACE, "CTTSTerminalEvent[%p] - enter", this));
    
    LOG((TL_TRACE, "CTTSTerminalEvent - finish"));
}


CTTSTerminalEvent::~CTTSTerminalEvent()
{
    LOG((TL_TRACE, "~CTTSTerminalEvent[%p] - enter", this));

 
    //
    // remember to release all the references we may hold
    //

    if (NULL != m_pCallInfo)
    {
        LOG((TL_INFO, "~CTTSTerminalEvent - releasing m_pCallInfo %p", m_pCallInfo));

        m_pCallInfo->Release();
        m_pCallInfo = NULL;
    }


    if ( NULL != m_pTerminal) 
    {
        LOG((TL_INFO, "~CTTSTerminalEvent - releasing m_pTerminal %p", m_pTerminal));

        m_pTerminal->Release();
        m_pTerminal = NULL;
    }


    LOG((TL_TRACE, "~CTTSTerminalEvent - finish"));
}



HRESULT STDMETHODCALLTYPE CTTSTerminalEvent::get_Call(
        OUT ITCallInfo **ppCallInfo
        )
{
    LOG((TL_TRACE, "get_Call[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppCallInfo, sizeof(ITCallInfo *)))
    {
        LOG((TL_ERROR, "get_Call - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppCallInfo = NULL;


    //
    // return call info if we have it
    //

    if (NULL != m_pCallInfo)
    {

        *ppCallInfo = m_pCallInfo;
        (*ppCallInfo)->AddRef();
    }


    LOG((TL_TRACE, "get_Call - finish"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CTTSTerminalEvent::get_Terminal(
        OUT ITTerminal **ppTerminal
        )
{
    LOG((TL_TRACE, "get_Terminal[%p] - enter", this));

    
    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(ppTerminal, sizeof(ITTerminal*)))
    {
        LOG((TL_ERROR, "get_Terminal - bad pointer passed in"));

        return E_POINTER;
    }

    
    //
    // no garbage out
    //

    *ppTerminal = NULL;


    //
    // return terminal if we have it
    //
    
    if (NULL != m_pTerminal)
    {

        *ppTerminal = m_pTerminal;
        (*ppTerminal)->AddRef();
    }


    LOG((TL_TRACE, "get_Terminal - finish"));

    return S_OK;
}



HRESULT STDMETHODCALLTYPE CTTSTerminalEvent::get_Error(
        OUT HRESULT *phrErrorCode
        )
{
    LOG((TL_TRACE, "get_Error[%p] - enter", this));


    //
    // check arguments
    //

    if (TAPIIsBadWritePtr(phrErrorCode, sizeof(HRESULT)))
    {
        LOG((TL_ERROR, "get_Error - bad pointer passed in"));

        return E_POINTER;
    }


    //
    // return error code
    //
    
    *phrErrorCode = m_hr;


    LOG((TL_TRACE, "get_Error - finish. hr = [%lx]", m_hr));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CTTSTerminalEvent::put_Terminal(
            IN ITTerminal *pTerminal
            )
{
    LOG((TL_TRACE, "put_Terminal[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pTerminal) && IsBadReadPtr(pTerminal, sizeof(ITTerminal)))
    {
        LOG((TL_ERROR, "put_Terminal - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pTerminal = pTerminal;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pTerminal)
    {
        m_pTerminal->AddRef();
    }


    LOG((TL_TRACE, "put_Terminal - finished"));

    return S_OK;
}


HRESULT STDMETHODCALLTYPE CTTSTerminalEvent::put_Call(
            IN ITCallInfo *pCallInfo
            )
{
    LOG((TL_TRACE, "put_Call[%p] - enter", this));

    
    //
    // check the argument
    //

    if ((NULL != pCallInfo) && IsBadReadPtr(pCallInfo, sizeof(ITCallInfo)))
    {
        LOG((TL_ERROR, "put_Call - bad pointer passed in"));


        //
        // if we get here, we have a bug. debug to see what happened.
        //

        _ASSERTE(FALSE);

        return E_POINTER;
    }

    

    //
    // keep the pointer
    //

    m_pCallInfo = pCallInfo;

    
    //
    // keep a reference if not null
    //

    if (NULL != m_pCallInfo)
    {
        m_pCallInfo->AddRef();
    }


    LOG((TL_TRACE, "put_Call - finished"));

    return S_OK;
}



HRESULT STDMETHODCALLTYPE CTTSTerminalEvent::put_ErrorCode(
            IN HRESULT hrErrorCode
            )
{
    
	LOG((TL_TRACE, "put_ErrorCode[%p] - enter. hr = [%lx]", this, hrErrorCode));
  

    //
    // keep the value
    //

    m_hr = hrErrorCode;

    
    LOG((TL_TRACE, "put_ErrorCode - finished"));

    return S_OK;
}