📄 voipdemo.cpp
字号:
{
dwReturnvalueGetNetworkParams = GetNetworkParams( pNetworkParams, &uSizeNetworkParams );
if ( dwReturnvalueGetNetworkParams != ERROR_SUCCESS )
{
DEBUGMSG( 1, ( L"VoIPDemo: Could not get network info: using default values\r\n" ) );
g_pLocalUserInfo->put_Name(L"My Name");
g_pLocalUserInfo->put_Addr(L"My Address");
}
else
{
wsprintf( szHost, L"%S", pNetworkParams->HostName );
g_pLocalUserInfo->put_Name(szHost);
g_pLocalUserInfo->put_Addr(szHost);
DEBUGMSG( 1, ( L"VoIPDemo: local name is %s\r\n", g_pLocalUserInfo->get_Name() ) );
}
if ( pAdapterInfo )
free( pAdapterInfo );
if ( pNetworkParams )
free( pNetworkParams );
}
// store the name and info into the registry
UpdateLocalUserRegistry(g_pLocalUserInfo->get_Name(), g_pLocalUserInfo->get_Addr(), NULL);
}
} // end InitializeLocalUser()
/************************************************************************************************
WndProc
Process messages for the main window.
WM_COMMAND - process the application menu / toolbar buttons
WM_NOTIFY - process listview message notifications
LVN_ITEMCHANGING - Update m_cSelectedBuddy to determine who is selected, etc.
LVN_DELETEITEM - Release IRTCBuddy reference stored inside the listview
WM_INITMENUPOPUP - enable / disable the appropriate menu options depending on m_cSelectedBuddy
WM_MOUSEMOVE - call DoMainMouseMove() to check if the cursor goes over one of the toolbar
buttons
WM_PAINT - Paint the main window
WM_DESTROY - post a quit message and return
************************************************************************************************/
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
int wmId, wmEvent, nB;
switch (message)
{
case WM_PAINT:
return DoMainPaint( hWnd, message, wParam, lParam );
case WM_MOUSEMOVE:
return DoMainMouseMove( hWnd, message, wParam, lParam );
case WM_LBUTTONUP:
{
nB = m_nButtonPointed;
// Deselect the buttons (m_nButtonPointed is invalid from now)
DoMainMouseMove( hWnd, 0, 0, 0 );
switch( m_sButtons[ nB ].r[0] )
{
case IDB_ADDBTN:
if ( DialogBox( m_hInstance, (LPCTSTR)IDD_ADDBUDDYBOX, hWnd, ( DLGPROC )Proc_AddBuddy ) == IDOK )
InvalidateRect( m_hWndMain, NULL, FALSE );
return 0;
case IDB_SENDBTN:
SendMessage( m_hWndMain, WM_COMMAND, ID_TOOLS_SENDINSTANTMESSAGE, 0 );
return 0;
case IDB_CALLBTN:
SendMessage( m_hWndMain, WM_COMMAND, ID_TOOLS_CALL, 0 );
return 0;
}
// Figure out if clicked on mystatus o
POINT ptClick = { LOWORD(lParam), HIWORD(lParam) };
if (PtInRect(&m_rMyStatus, ptClick)) {
SendMessage( m_hWndMain, WM_COMMAND, ID_FILE_MYSTATUS, 0 );
}
break;
} // end WM_LBUTTONUP
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_HELP_ABOUT:
DialogBox( m_hInstance, (LPCTSTR)IDD_ABOUTBOX, hWnd, ( DLGPROC )Proc_About );
break;
case IDM_FILE_EXIT:
DestroyWindow(hWnd);
break;
case ID_FILE_ADDACONTACT:
if ( DialogBox( m_hInstance, (LPCTSTR)IDD_ADDBUDDYBOX, hWnd, ( DLGPROC )Proc_AddBuddy ) == IDOK )
InvalidateRect( m_hWndMain, NULL, FALSE );
break;
case ID_FILE_EDITCONTACT:
if ( DialogBox( m_hInstance, (LPCTSTR)IDD_ADDBUDDYBOX, hWnd, ( DLGPROC )Proc_EditBuddy ) == IDOK )
InvalidateRect( m_hWndMain, NULL, FALSE );
break;
case ID_FILE_DELETECONTACT:
if ( MessageBox( NULL, L"Are you sure you want to permanently delete the currently selected contact?", L"Warning", MB_YESNO ) == IDYES )
{
RemoveBuddyRTC(m_cSelectedBuddy.pBuddy, m_cSelectedBuddy.btBuddyType, TRUE, m_hInstance);
// Delete the listview item, which owns m_cSelectedBuddy & last pBuddy reference
FindAndRemoveBuddyListView(m_cSelectedBuddy.pBuddy, m_cSelectedBuddy.eStat);
InvalidateRect( m_hWndMain, NULL, FALSE );
}
break;
case ID_FILE_MYSTATUS:
if ( DialogBox( m_hInstance, (LPCTSTR)IDD_MYSTATUSBOX, hWnd, ( DLGPROC )Proc_MyStatus ) == IDOK )
InvalidateRect( m_hWndMain, NULL, FALSE );
break;
case ID_FILE_EDITMYINFO:
// don't want to be able to change my status while a session is active
if (pSessionWndContainer && pSessionWndContainer->get_ActiveSessionWindow()) {
break;
}
if ( DialogBox( m_hInstance, (LPCTSTR) IDD_MYINFOBOX, hWnd, ( DLGPROC )Proc_EditMyInfo ) == IDOK )
InvalidateRect( m_hWndMain, NULL, FALSE);
break;
case ID_VIEW_TOOLBAR:
m_sProp.bToolbar = !m_sProp.bToolbar;
InvalidateRect( m_hWndMain, NULL, FALSE );
break;
case ID_VIEW_STATUSBAR:
m_sProp.bStatusbar = !m_sProp.bStatusbar;
InvalidateRect( m_hWndMain, NULL, TRUE );
break;
case ID_VIEW_ALWAYSONTOP:
m_sProp.bAlwaysOnTop = !m_sProp.bAlwaysOnTop;
SetWindowPos( m_hWndMain, ( m_sProp.bAlwaysOnTop )?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE );
break;
case ID_TOOLS_SENDINSTANTMESSAGE:
case ID_TOOLS_CALL:
// ensure that a session isn't already running
if (pSessionWndContainer && pSessionWndContainer->get_ActiveSessionWindow()) {
break;
}
// If no buddy is selected, use the pop-up windows to make the calls
if ( m_cSelectedBuddy.pBuddy )
{
// get the information for the selected buddy
PARTICIPANT_INFO cPart;
PARTICIPANT_INFO** ppPart = NULL;
BSTR bstrName = NULL;
BSTR bstrAddr = NULL;
m_cSelectedBuddy.pBuddy->get_Name(&bstrName);
cPart.put_Name(bstrName, NO_ALLOC);
m_cSelectedBuddy.pBuddy->get_PresentityURI(&bstrAddr);
cPart.put_Addr(bstrAddr, NO_ALLOC);
cPart.pBuddy = m_cSelectedBuddy.pBuddy;
cPart.btBuddyType = m_cSelectedBuddy.btBuddyType;
switch ( wmId )
{
case ID_TOOLS_SENDINSTANTMESSAGE:
if (!m_cSelectedBuddy.IMCapable())
break;
CSessionWndContainer::SessionWndCallback( SWCBM_IM_INITIATING_OUTGOING, &cPart, NULL );
break;
case ID_TOOLS_CALL:
// ensure online
if (!m_cSelectedBuddy.CallCapable())
break;
#ifdef NO_PHONE_TO_PHONE
CSessionWndContainer::SessionWndCallback( SWCBM_CALL_INITIATING_OUTGOING, &cPart, NULL );
#else
// handle Phone-to-phone calls
if (m_cSelectedBuddy.btBuddyType == BT_PHONE && g_pLocalUserInfo->get_LocalPhoneURI() != NULL) {
if (m_cSelectedBuddy.iSelectedBuddies == 1) {
// could be a phone to phone call or regular phone call
if (MessageBox(m_hWndMain,
L"Would you like to place this call from the phone you have designated in your preferences?",
L"Call Type?", MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON1) == IDYES) {
// P2P handle it
ppPart = new PARTICIPANT_INFO*[1];
*ppPart = new PARTICIPANT_INFO(cPart.get_Name(), cPart.get_Addr(), NULL, BT_PHONE);
CSessionWndContainer::SessionWndCallback( SWCBM_P2P_CALL_INITIATING_OUTGOING, &ppPart, (VOID*) 1 );
} else {
CSessionWndContainer::SessionWndCallback( SWCBM_CALL_INITIATING_OUTGOING, &cPart, NULL );
}
} else {
// more than one selected buddy, must be a P2P call
int numParticipants = 0;
if (!FormCalleeAryListView(&ppPart, &numParticipants)) {
// error making the list of callee's
break;
} else {
CSessionWndContainer::SessionWndCallback( SWCBM_P2P_CALL_INITIATING_OUTGOING, &ppPart, (VOID*) numParticipants);
}
}
} else {
CSessionWndContainer::SessionWndCallback( SWCBM_CALL_INITIATING_OUTGOING, &cPart, NULL );
}
#endif //NO_PHONE_TO_PHONE
break;
}
cPart.Clear();
} else {
// no buddy selected, make a call to a user-specified destination
switch ( wmId )
{
case ID_TOOLS_SENDINSTANTMESSAGE:
DialogBox( m_hInstance, (LPCTSTR)IDD_SENDMESSAGE, hWnd, ( DLGPROC )Proc_SendIM );
break;
case ID_TOOLS_CALL:
DialogBox( m_hInstance, (LPCTSTR)IDD_MAKEVOICECALL, hWnd, ( DLGPROC )Proc_MakeCall );
break;
default:
break;
}
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
} // end WM_COMMAND
break;
case WM_CREATE:
hwndCB = CommandBar_Create( m_hInstance, hWnd, 1 );
CommandBar_InsertMenubar( hwndCB, m_hInstance, IDM_MENU, 0 );
// Close button (X) is on the title bar -> do not put it on the command bar as well
// CommandBar_AddAdornments( hwndCB, 0, 0 );
break;
case WM_DESTROY:
{
// kill any open windows / dialogs that are not children
if (pSessionWndContainer) {
DestroyWindow( pSessionWndContainer->get_ActiveSessionWindowHWnd());
}
CommandBar_Destroy(hwndCB);
CleanupListViews();
PostQuitMessage(0);
break;
} // end WM_DESTROY
case WM_INITMENUPOPUP:
{
HMENU hmenuPopup = ( HMENU )wParam;
CheckMenuItem( hmenuPopup, ID_VIEW_TOOLBAR, MF_BYCOMMAND|( m_sProp.bToolbar )?MF_CHECKED:MF_UNCHECKED );
CheckMenuItem( hmenuPopup, ID_VIEW_STATUSBAR, MF_BYCOMMAND|( m_sProp.bStatusbar )?MF_CHECKED:MF_UNCHECKED );
CheckMenuItem( hmenuPopup, ID_VIEW_ALWAYSONTOP, MF_BYCOMMAND|( m_sProp.bAlwaysOnTop )?MF_CHECKED:MF_UNCHECKED );
EnableMenuItem( hmenuPopup, ID_FILE_EDITMYINFO, MF_BYCOMMAND|MF_ENABLED );
if ( m_cSelectedBuddy.iSelectedBuddies != 1)
{
EnableMenuItem( hmenuPopup, ID_FILE_EDITCONTACT, MF_BYCOMMAND|MF_GRAYED );
EnableMenuItem( hmenuPopup, ID_FILE_DELETECONTACT, MF_BYCOMMAND|MF_GRAYED );
if (m_cSelectedBuddy.iSelectedBuddies > 1 && m_cSelectedBuddy.btBuddyType == BT_PHONE ||
m_cSelectedBuddy.iSelectedBuddies == 0)
{ // for phone to phone sessions, or non-buddy calls
EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_ENABLED );
} else {
EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_GRAYED );
}
if (m_cSelectedBuddy.iSelectedBuddies == 0) {
EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_ENABLED );
} else {
EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_GRAYED );
}
}
else
{
EnableMenuItem( hmenuPopup, ID_FILE_EDITCONTACT, MF_BYCOMMAND|MF_ENABLED );
EnableMenuItem( hmenuPopup, ID_FILE_DELETECONTACT, MF_BYCOMMAND|MF_ENABLED );
if (m_cSelectedBuddy.CallCapable()) {
EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_ENABLED );
} else {
EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_GRAYED );
}
if (m_cSelectedBuddy.IMCapable()) {
EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_ENABLED );
} else {
EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_GRAYED );
}
}
}
break;
case WM_NOTIFY:
{
int idCtrl = (int) wParam;
if (idCtrl != IDC_OFFLINEBUDDYLIST && idCtrl != IDC_ONLINEBUDDYLIST || !lParam)
break;
LPNMLISTVIEW pnmlv = (LPNMLISTVIEW) lParam;
switch(pnmlv->hdr.code)
{
case LVN_ITEMCHANGING:
{
IRTCBuddy* pBuddy = (IRTCBuddy*) pnmlv->lParam;
// item has been selected, determine if any other items should be de-selected, set
if (pnmlv->uChanged != LVIF_STATE) {
// for now we only care if the state has changed (selected or de-selected)
return FALSE; // accept the change
}
if (pnmlv->uOldState & LVIS_SELECTED && !(pnmlv->uNewState & LVIS_SELECTED)
|| pnmlv->uOldState & LVIS_FOCUSED && !(pnmlv->uNewState & LVIS_FOCUSED)) {
m_cSelectedBuddy.iSelectedBuddies--;
if (m_cSelectedBuddy.iSelectedBuddies == 0) {
m_cSelectedBuddy.Clear();
}
InvalidateButton(-100);
return FALSE;
} else if (!(pnmlv->uOldState & LVIS_SELECTED) && pnmlv->uNewState & LVIS_SELECTED) {
// changing from de-selected to selected
// if a buddy is selected on a different list, de-select that buddy first
// pull down the information for the buddy who's status is changing
BSTR bstrName = NULL;
BUDDYTYPE enBt = DetermineBuddyType(pBuddy, EXISTING_BUDDY);
ESTATUS esStat = GetBuddyStatus(pBuddy, enBt);
if (m_cSelectedBuddy.iSelectedBuddies > 0 && m_idActiveListView != idCtrl) {
// check if the selected buddy is on this list, if not, de-select him
HWND hwndList = (pnmlv->hdr.hwndFrom == m_hwndOnlineView) ? m_hwndOfflineView : m_hwndOnlineView;
int iMax = ListView_GetSelectedCount(hwndList);
int iItem = -1;
int i = 0;
for (i = 0; i < iMax; i++) {
if ((iItem = ListView_GetNextItem(hwndList, iItem, LVNI_SELECTED)) == -1)
break;
ListView_SetItemState(hwndList, iItem, 0, LVIS_SELECTED);
}
InvalidateButton(-100);
}
if (m_cSelectedBuddy.iSelectedBuddies < 1) {
// go ahead (no-one else selected)
m_idActiveListView = idCtrl;
m_cSelectedBuddy.iSelectedBuddies = 1;
m_cSelectedBuddy.eStat = esStat;
m_cSelectedBuddy.btBuddyType = enBt;
m_cSelectedBuddy.pBuddy = pBuddy;
InvalidateButton(-100);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -