Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

357 lines
8.9 KiB

/*******************************************************************************
Module: work.cpp
Author: Qianbo Huai
Abstract:
implements the main function of the bridge test application
*******************************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include "work.h"
// command line
LPSTR glpCmdLine = NULL;
// dialog
HWND ghDlg = NULL;
// true: exit button on dialog was clicked
bool gfExitButton = false;
// bridge
CBridge *gpBridge = NULL;
// callback func in dialog
BOOL
CALLBACK
MainDialogProc (
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
// func to deal with TAPI events
HRESULT
OnTapiEvent (
TAPI_EVENT TapiEvent,
IDispatch *pEvent,
LPWSTR *ppszMessage
);
// set status message on dialog
void
SetStatusMessage (LPWSTR pszMessage);
/*//////////////////////////////////////////////////////////////////////////////
WinMain
////*/
int
WINAPI
WinMain (
HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR lpCmdLine,
int nShowCmd
)
{
// init com
if (FAILED (CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{
return 0;
}
// keep command line which determines which SDP to join
glpCmdLine = lpCmdLine;
// init CBridge
gpBridge = new CBridge ();
if (gpBridge==NULL)
{
printf ("Failed to init CBridge\n");
return 0;
}
// init TAPI and H323 call listen
if (FAILED(gpBridge->InitTapi()))
{
printf ("Failed to init TAPI\n");
return 0;
}
// start dialog box
if (!DialogBox (hInst, MAKEINTRESOURCE(IDD_MAINDLG), NULL, MainDialogProc))
{
printf ("Failed to init dialog\n");
}
// dialog finished
gpBridge->ShutdownTapi ();
delete gpBridge;
CoUninitialize ();
return 1;
}
/*//////////////////////////////////////////////////////////////////////////////
Callback for dialog
////*/
BOOL
CALLBACK
MainDialogProc (
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
LPWSTR pszMessage;
switch (uMsg)
{
case WM_INITDIALOG:
{
ghDlg = hDlg;
SetStatusMessage (L"Waiting for incoming H323 call");
// disable disconnect button
SendDlgItemMessage (
ghDlg,
IDC_DISCONNECT,
BM_SETSTYLE,
BS_PUSHBUTTON,
0
);
EnableWindow (
GetDlgItem (ghDlg, IDC_DISCONNECT),
FALSE
);
return 0;
}
case WM_PRIVATETAPIEVENT:
{
if (FAILED(OnTapiEvent ((TAPI_EVENT)wParam, (IDispatch *)lParam, &pszMessage)))
{
DoMessage (pszMessage);
}
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_EXIT:
{
gpBridge->Clear ();
gfExitButton = true;
// check if in connection
if (!IsWindowEnabled (GetDlgItem (ghDlg, IDC_DISCONNECT)))
{
// not in connection
EndDialog (ghDlg, 0);
}
// else
// remember exit button is clicked
// do not call EndDialog because a disconnect event is to come
return 1;
}
case IDC_DISCONNECT:
{
gpBridge->Clear ();
SetStatusMessage (L"Waiting for incoming H323 call");
// disable disconnect button
SendDlgItemMessage (
ghDlg,
IDC_DISCONNECT,
BM_SETSTYLE,
BS_PUSHBUTTON,
0
);
EnableWindow (
GetDlgItem (ghDlg, IDC_DISCONNECT),
FALSE
);
// check if exit button is clicked
if (gfExitButton)
EndDialog (ghDlg, 0);
return 1;
}
}
return 0;
}
default:
return 0;
}
}
/*//////////////////////////////////////////////////////////////////////////////
Popup message box
////*/
WCHAR gMsgBoxTitle[] = L"TAPI 3.0 Bridge Test Application";
void
DoMessage (LPWSTR pszMessage)
{
MessageBox (
ghDlg,
pszMessage,
gMsgBoxTitle,
MB_OK
);
}
/*//////////////////////////////////////////////////////////////////////////////
Status message
////*/
void
SetStatusMessage (LPWSTR pszMessage)
{
SetDlgItemText (ghDlg, IDC_STATUS, pszMessage);
}
/*//////////////////////////////////////////////////////////////////////////////
Deals with TAPI events
////*/
HRESULT OnTapiEvent (
TAPI_EVENT TapiEvent,
IDispatch *pEvent,
LPWSTR *ppszMessage
)
{
HRESULT hr = S_OK;
switch (TapiEvent)
{
case TE_CALLNOTIFICATION:
{
// if h323 call and to us, init h323 call
hr = gpBridge->CreateH323Call (pEvent);
if (FAILED(hr))
*ppszMessage = L"H323 not created";
break;
}
case TE_CALLSTATE:
{
CALL_STATE cs;
ITCallStateEvent *pCallStateEvent = NULL;
*ppszMessage = L"Call state failed";
// get call state event
hr = pEvent->QueryInterface (
IID_ITCallStateEvent,
(void **)&pCallStateEvent
);
if (FAILED(hr)) break;
// get call state
hr = pCallStateEvent->get_State (&cs);
pCallStateEvent->Release ();
if (FAILED(hr)) break;
// if offering, connect
if (CS_OFFERING == cs)
{
// check if h323 call created successful
if (!gpBridge->HasH323Call ())
{
hr = S_OK;
break;
}
// create sdp call
hr = gpBridge->CreateSDPCall ();
if (FAILED(hr)) {
gpBridge->Clear ();
*ppszMessage = L"Failed to create SDP call";
break;
}
// bridge call
hr = gpBridge->BridgeCalls ();
if (FAILED(hr)) {
gpBridge->Clear ();
*ppszMessage = L"Failed to bridge calls";
break;
}
SetStatusMessage (L"In call ...");
// enable disconnect button
SendDlgItemMessage (
ghDlg,
IDC_DISCONNECT,
BM_SETSTYLE,
BS_DEFPUSHBUTTON,
0
);
EnableWindow (
GetDlgItem (ghDlg, IDC_DISCONNECT),
TRUE
);
SetFocus (GetDlgItem (ghDlg, IDC_DISCONNECT));
}
// if disconnect
else if (CS_DISCONNECTED == cs)
{
PostMessage (ghDlg, WM_COMMAND, IDC_DISCONNECT, 0);
hr = S_OK;
}
break;
}
case TE_CALLMEDIA:
{
CALL_MEDIA_EVENT cme;
ITCallMediaEvent *pCallMediaEvent;
// get call media event
hr = pEvent->QueryInterface (
IID_ITCallMediaEvent,
(void **)&pCallMediaEvent
);
if (FAILED(hr)) break;
// get the event
hr = pCallMediaEvent->get_Event (&cme);
if (FAILED(hr)) break;
// check media event
switch (cme)
{
case CME_STREAM_FAIL:
hr = E_FAIL;
DoMessage( L"Stream failed");
break;
case CME_TERMINAL_FAIL:
hr = E_FAIL;
DoMessage( L"Terminal failed");
break;
default:
break;
}
// we no longer need this interface.
pCallMediaEvent->Release();
break;
}
default:
break;
}
pEvent->Release(); // we addrefed it CTAPIEventNotification::Event()
return hr;
}