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.
 
 
 
 
 
 

383 lines
12 KiB

/////////////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1997 Active Voice Corporation. All Rights Reserved.
//
// Active Agent(r) and Unified Communications(tm) are trademarks of Active Voice Corporation.
//
// Other brand and product names used herein are trademarks of their respective owners.
//
// The entire program and user interface including the structure, sequence, selection,
// and arrangement of the dialog, the exclusively "yes" and "no" choices represented
// by "1" and "2," and each dialog message are protected by copyrights registered in
// the United States and by international treaties.
//
// Protected by one or more of the following United States patents: 5,070,526, 5,488,650,
// 5,434,906, 5,581,604, 5,533,102, 5,568,540, 5,625,676, 5,651,054.
//
// Active Voice Corporation
// Seattle, Washington
// USA
//
/////////////////////////////////////////////////////////////////////////////////////////
// DlgJoinConference.cpp : Implementation of CDlgJoinConference
#include "stdafx.h"
#include <stdio.h>
#include "DlgJoin.h"
#include "TapiDialer.h"
#include "AVTapi.h"
#include "CEDetailsVw.h"
static UINT arCols[] = { IDS_EXPLORE_COLUMN_SERVER,
IDS_EXPLORE_COLUMN_NAME,
IDS_EXPLORE_COLUMN_STARTS,
IDS_EXPLORE_COLUMN_ORIGINATOR };
static int arColSort[] = { CConfExplorerDetailsView::COL_SERVER,
CConfExplorerDetailsView::COL_NAME,
CConfExplorerDetailsView::COL_STARTS,
CConfExplorerDetailsView::COL_ORIGINATOR };
static int CALLBACK CompareFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort )
{
CDlgJoinConference *p = (CDlgJoinConference *) lParamSort;
return ((CConfDetails *) lParam1)->Compare( (CConfDetails *) lParam2, p->IsSortAscending(), p->GetSortColumn(), p->GetSecondarySortColumn() );
}
/////////////////////////////////////////////////////////////////////////////
// CDlgJoinConference
IMPLEMENT_MY_HELP(CDlgJoinConference)
CDlgJoinConference::CDlgJoinConference()
{
m_bSortAscending = true;
m_nSortColumn = 1;
m_bstrSearchText = NULL;
}
CDlgJoinConference::~CDlgJoinConference()
{
DELETE_CRITLIST(m_lstConfs, m_critLstConfs);
SysFreeString( m_bstrSearchText );
}
LRESULT CDlgJoinConference::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
get_Columns(); // retrieve user's settings
ListView_SetExtendedListViewStyle( GetDlgItem(IDC_LST_CONFS), LVS_EX_FULLROWSELECT );
ShowWindow( SW_SHOW );
UpdateData( false );
return 1; // Let the system set the focus
}
LRESULT CDlgJoinConference::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
put_Columns(); // persist user's settings
// Retrieve the selected item
for ( int i = 0; i < ListView_GetItemCount(GetDlgItem(IDC_LST_CONFS)); i++ )
{
if ( ListView_GetItemState(GetDlgItem(IDC_LST_CONFS), i, LVIS_SELECTED) )
{
LV_ITEM lvi = {0};
lvi.iItem = i;
lvi.mask = LVIF_PARAM;
if ( ListView_GetItem(GetDlgItem(IDC_LST_CONFS), &lvi) && lvi.lParam )
{
m_confDetails = *((CConfDetails *) lvi.lParam);
break;
}
}
}
EndDialog(IDOK);
return 0;
}
LRESULT CDlgJoinConference::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
put_Columns(); // persist user's settings
EndDialog(wID);
return 0;
}
int CDlgJoinConference::GetSortColumn() const
{
return arColSort[m_nSortColumn];
}
int CDlgJoinConference::GetSecondarySortColumn() const
{
if ( arColSort[m_nSortColumn] == CConfExplorerDetailsView::COL_NAME )
return CConfExplorerDetailsView::COL_SERVER;
return CConfExplorerDetailsView::COL_NAME;
}
void CDlgJoinConference::get_Columns()
{
#define CONFJOIN_DEFAULT_WIDTH 120
// Load column settings from registry
USES_CONVERSION;
CRegKey regKey;
TCHAR szReg[255], szEntry[50];
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.pszText = szReg;
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_VIEW_KEY, szReg, ARRAYSIZE(szReg) );
regKey.Open( HKEY_CURRENT_USER, szReg, KEY_READ );
// Add the columns.
for ( int i = 0; i < ARRAYSIZE(arCols); i++ )
{
lvc.iSubItem = i;
lvc.cx = CONFJOIN_DEFAULT_WIDTH;
// Load registry stuff if exists
if ( regKey.m_hKey )
{
DWORD dwVal = 0;
// Get sort column and sort direction
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_SORT_COLUMN, szReg, ARRAYSIZE(szReg) );
regKey.QueryValue( dwVal, szReg );
m_nSortColumn = (int) max(0, ((int)min(dwVal,ARRAYSIZE(arCols))));
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_SORT_ASCENDING, szReg, ARRAYSIZE(szReg) );
regKey.QueryValue( dwVal, szReg );
m_bSortAscending = (bool) (dwVal > 0);
// Column Widths
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_ENTRY, szReg, ARRAYSIZE(szReg) );
_sntprintf( szEntry, ARRAYSIZE(szEntry), szReg, i );
szEntry[ARRAYSIZE(szEntry)-1] = _T('\0');
dwVal = 0;
if ( (regKey.QueryValue(dwVal, szEntry) == ERROR_SUCCESS) && (dwVal > 0) )
lvc.cx = (int) max( MIN_COL_WIDTH, min( 5000, dwVal ));
}
LoadString( _Module.GetResourceInstance(), arCols[i], szReg, ARRAYSIZE(szReg) );
ListView_InsertColumn( GetDlgItem(IDC_LST_CONFS), i, &lvc );
}
}
void CDlgJoinConference::put_Columns()
{
// Save column setting to registry
USES_CONVERSION;
CRegKey regKey;
TCHAR szReg[100], szEntry[50];
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_VIEW_KEY, szReg, ARRAYSIZE(szReg) );
if ( regKey.Create(HKEY_CURRENT_USER, szReg) == ERROR_SUCCESS )
{
// Save sort column and sort direction
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_SORT_COLUMN, szReg, ARRAYSIZE(szReg) );
regKey.SetValue( m_nSortColumn, szReg );
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_SORT_ASCENDING, szReg, ARRAYSIZE(szReg) );
regKey.SetValue( m_bSortAscending, szReg );
// Save column widths
int nWidth;
for ( int i = 0; i < ARRAYSIZE(arCols); i++ )
{
nWidth = ListView_GetColumnWidth( GetDlgItem(IDC_LST_CONFS), i );
LoadString( _Module.GetResourceInstance(), IDN_REG_DLGJOINCONF_ENTRY, szReg, ARRAYSIZE(szReg) );
_sntprintf( szEntry, ARRAYSIZE(szEntry), szReg, i );
szEntry[ARRAYSIZE(szEntry)-1] = _T('\0');
regKey.SetValue( nWidth, szEntry );
}
}
}
///////////////////////////////////////////////////////////////////////////
// Message handlers
//
LRESULT CDlgJoinConference::OnGetDispInfo(WPARAM wParam, LPNMHDR lpnmHdr, BOOL& bHandled)
{
if ( !lpnmHdr ) return 0;
USES_CONVERSION;
LV_DISPINFO *pInfo = (LV_DISPINFO *) lpnmHdr;
if ( (pInfo->hdr.code == LVN_GETDISPINFO) && pInfo->item.lParam && (pInfo->item.mask & LVIF_TEXT) )
{
BSTR bstrTemp = NULL;
CConfDetails *pDetails = (CConfDetails *) pInfo->item.lParam;
switch ( arColSort[pInfo->item.iSubItem] )
{
case CConfExplorerDetailsView::COL_SERVER: pDetails->get_bstrDisplayableServer( &bstrTemp ); break;
case CConfExplorerDetailsView::COL_NAME: bstrTemp = SysAllocString( pDetails->m_bstrName ); break;
case CConfExplorerDetailsView::COL_ORIGINATOR: bstrTemp = SysAllocString( pDetails->m_bstrOriginator ); break;
case CConfExplorerDetailsView::COL_STARTS: VarBstrFromDate( pDetails->m_dateStart, LOCALE_USER_DEFAULT, NULL, &bstrTemp ); break;
default: _ASSERT( false );
}
// Copy string
_tcsncpy( pInfo->item.pszText, (bstrTemp) ? OLE2CT(bstrTemp) : _T(""), pInfo->item.cchTextMax );
pInfo->item.pszText[pInfo->item.cchTextMax - 1] = 0;
SysFreeString( bstrTemp );
}
return 0;
}
LRESULT CDlgJoinConference::OnColumnClicked(WPARAM wParam, LPNMHDR lpnmHdr, BOOL& bHandled)
{
int nColumn = ((NM_LISTVIEW *) lpnmHdr)->iSubItem;
if ( ListView_GetColumnWidth(GetDlgItem(IDC_LST_CONFS), nColumn) == 0 ) return 0;
// Sort on column selected; if new column sort ascending
if ( m_nSortColumn == nColumn )
{
m_bSortAscending = !m_bSortAscending;
}
else
{
m_nSortColumn = nColumn;
m_bSortAscending = true;
}
ListView_SortItems( GetDlgItem(IDC_LST_CONFS), CompareFunc, (LPARAM) this );
return 0;
}
void CDlgJoinConference::UpdateData( bool bSaveAndValidate )
{
bool bEndDialog = false;
int nTries = (m_bstrSearchText) ? 1 : 2;
m_critLstConfs.Lock();
if ( !bSaveAndValidate )
{
CComPtr<IAVTapi> pAVTapi;
// Load listbox with conference information
if ( SUCCEEDED(_Module.get_AVTapi(&pAVTapi)) )
{
for ( int i = 0; i < nTries; i++ )
{
IConfExplorer *pConfExplorer;
if ( SUCCEEDED(pAVTapi->get_ConfExplorer(&pConfExplorer)) )
{
IConfExplorerTreeView *pTreeView;
if ( SUCCEEDED(pConfExplorer->get_TreeView(&pTreeView)) )
{
// first time through request only scheduled conferences
if ( m_bstrSearchText )
pTreeView->BuildJoinConfListText( (long *) &m_lstConfs, m_bstrSearchText );
else
pTreeView->BuildJoinConfList( (long *) &m_lstConfs, (bool) (i != 0) );
pTreeView->Release();
}
pConfExplorer->Release();
}
// Verify that we have some conferences to display
if ( !m_lstConfs.empty() )
{
// Add items to list
LV_ITEM lvi = {0};
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.pszText = LPSTR_TEXTCALLBACK;
::SendMessage( GetDlgItem(IDC_LST_CONFS), WM_SETREDRAW, false, 0 );
for ( CONFDETAILSLIST::iterator i = m_lstConfs.begin(); i != m_lstConfs.end(); i++ )
{
lvi.lParam = (LPARAM) (*i);
ListView_InsertItem( GetDlgItem(IDC_LST_CONFS), &lvi );
}
ListView_SortItems( GetDlgItem(IDC_LST_CONFS), CompareFunc, (LPARAM) this );
::SendMessage( GetDlgItem(IDC_LST_CONFS), WM_SETREDRAW, true, 0 );
::InvalidateRect( GetDlgItem(IDC_LST_CONFS), NULL, true );
break;
}
else
{
// Msg box user that there are no conferences presently
if ( !i )
{
if ( m_bstrSearchText )
{
_Module.DoMessageBox(IDS_MSG_NO_CONFS_MATCHED, MB_ICONINFORMATION, true );
bEndDialog = true;
break;
}
if ( _Module.DoMessageBox(IDS_MSG_NO_CONFS_SCHEDULED, MB_YESNO | MB_ICONQUESTION, true) == IDNO )
{
bEndDialog = true;
break;
}
// Change dialog title based on information shown
TCHAR szText[255];
LoadString( _Module.GetResourceInstance(), IDS_JOINCONF_SELECTALL, szText, ARRAYSIZE(szText) );
SetDlgItemText( IDC_LBL_WELCOME_JOIN, szText );
}
else
{
_Module.DoMessageBox(IDS_MSG_NO_CONFS, MB_ICONEXCLAMATION, true);
bEndDialog = true;
}
}
}
}
}
m_critLstConfs.Unlock();
UpdateJoinBtn();
if ( bEndDialog )
EndDialog(IDCANCEL);
}
LRESULT CDlgJoinConference::OnConfDblClk(WPARAM wParam, LPNMHDR lpnmHdr, BOOL& bHandled)
{
return OnOK( (WORD) NM_DBLCLK, (WORD) IDOK, GetDlgItem(IDC_LST_CONFS), bHandled );
}
LRESULT CDlgJoinConference::OnItemChanged(WPARAM wParam, LPNMHDR lpnmHdr, BOOL& bHandled)
{
UpdateJoinBtn();
return 0;
}
void CDlgJoinConference::UpdateJoinBtn()
{
bool bSelected = false;
HWND hWnd = GetDlgItem(IDC_LST_CONFS);
if ( hWnd )
{
for ( int i = 0; i < ListView_GetItemCount(hWnd); i++ )
{
if ( ListView_GetItemState(hWnd, i, LVIS_SELECTED) )
{
bSelected = true;
break;
}
}
}
::EnableWindow( GetDlgItem(IDC_BTN_JOIN_CONFERENCE), bSelected );
}