Exemplo n.º 1
0
int __cdecl main(int argc, char* argv[])
{

    LogMessage("main: started");


    //
    // this event be signalled when it's time to exit
    //

    g_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    if (NULL == g_hExitEvent)
    {
        LogError("main: Failed to create exit event");

        return 1;
    }

   

    //
    // we want to handle ctrl+c and ctrl+break events so we can cleanup on exit
    // proceed even in case of failure
    //

    SetConsoleCtrlHandler( (PHANDLER_ROUTINE)CtrlHandler, TRUE);


    //
    // initialize COM
    //

    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

    if ( FAILED(hr))
    {
        LogError("main: Failed to CoInitialize");

        CloseHandle(g_hExitEvent);
        g_hExitEvent = NULL;

        return 1;
    }


    //
    // start worker thread for tapi message processing
    //

    hr = g_WorkerThread.Initialize();

    if (FAILED(hr))
    {
        LogError("main: Failed to initialize worker thread");
        
        CoUninitialize();

        CloseHandle(g_hExitEvent);
        g_hExitEvent = NULL;

        return 1;
    }


    //
    // initialize critical section used to serialize access to global
    // current call
    //
    // note: InitializeCriticalSection can raise STATUS_NO_MEMORY exception
    //

    InitializeCriticalSection(&g_CurrentCallCritSection);

    //
    // create and initialize tapi object, register the callback object 
    // and start listening
    //
    
    hr = InitializeTAPI();

    if (FAILED(hr))
    {
        
        g_WorkerThread.Shutdown();


        CloseHandle(g_hExitEvent);
        g_hExitEvent = NULL;

        DeleteCriticalSection(&g_CurrentCallCritSection);

        CoUninitialize();
        return 1;
    }

    
    //
    // wait until ctrl+break handler or CS_DISCONNECT handler signal exit event
    //

    LogMessage("main: waiting for exit event");

    DWORD nWaitResult = WaitForSingleObject(g_hExitEvent, INFINITE);
    
    LogMessage("main: exit event signaled");


    //
    // disconnect and release call, if it exists
    //

    DisconnectAndReleaseCall();


    //
    // cleanup tapi
    //

    ShutdownTapi();


    //
    // stop the worker thread
    //

    g_WorkerThread.Shutdown();


    //
    // no longer need the critical section
    //

    DeleteCriticalSection(&g_CurrentCallCritSection);


    //
    // release com
    //
    
    CoUninitialize();


    //
    // no longer need the event
    //

    CloseHandle(g_hExitEvent);
    g_hExitEvent = NULL;


    //
    // exiting... we no longer want to handle ctrl+c and ctrl+break
    //
    
    SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, FALSE);


    //
    // was the event signaled, or wait failed?
    //

    if (WAIT_OBJECT_0 != nWaitResult)
    {
        LogError("main: Failed to wait for exit event");
        return 1;
    }


    LogMessage("main: exiting");

	return 0;
}
Exemplo n.º 2
0
/**********************************************************
* COperator::~COperator *
*-----------------------*
*   Description:
*       Destructor for the COperator class.
*       Cleans up SAPI and TAPI objects.
***********************************************************/
COperator::~COperator()
{
    ShutdownSapi();
    ShutdownTapi();
}   /* COperator::~COperator */