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.
 
 
 
 
 
 

582 lines
16 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 and29 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
//
/////////////////////////////////////////////////////////////////////////////////////////
////
// cpgen.c - conference properties general dialog box
////
#include "winlocal.h"
#include "res.h"
#include "wnd.h"
#include "DlgBase.h"
#include "confprop.h"
#include "cpgen.h"
#include "confinfo.h"
#include "ThreadPub.h"
////
// private
////
extern HINSTANCE g_hInstLib;
#define NAME_MAXLEN 64
#define DESCRIPTION_MAXLEN 256
#define OWNER_MAXLEN 64
static LRESULT ConfPropGeneral_DlgProcEx(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
static BOOL ConfPropGeneral_OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam);
static BOOL ConfPropGeneral_OnCommand(HWND hwndDlg, UINT id, HWND hwndCtl, UINT code);
static int ConfPropGeneral_OnNotify(HWND hwndDlg, UINT idFrom, LPNMHDR lpnmhdr);
#define ConfPropGeneral_DefProc(hwnd, msg, wParam, lParam) \
DefDlgProcEx(hwnd, msg, wParam, lParam, &g_bDefDlgEx)
static BOOL ConfPropGeneral_UpdateData(HWND hwndDlg, BOOL bSaveAndValidate);
static void ConfPropGeneral_SetDateTimeFormats( HWND hwndDlg );
DWORD WINAPI ThreadMDHCPScopeEnum( LPVOID pParam );
void ShowScopeInfo( HWND hwndDlg, int nShow, bool bInit );
static BOOL g_bDefDlgEx = FALSE;
////
// public
////
int DLLEXPORT WINAPI ConfPropGeneral_DoModal(HWND hwndOwner, DWORD dwUser)
{
return DialogBoxParam(g_hInstLib, MAKEINTRESOURCE(IDD_CONFPROP_GENERAL),
hwndOwner, ConfPropGeneral_DlgProc, (LPARAM) dwUser);
}
INT_PTR DLLEXPORT CALLBACK ConfPropGeneral_DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CheckDefDlgRecursion(&g_bDefDlgEx);
return SetDlgMsgResult(hwndDlg, uMsg, ConfPropGeneral_DlgProcEx(hwndDlg, uMsg, wParam, lParam));
}
////
// private
////
void EnableOkBtn( HWND hWnd, bool bEnable )
{
while ( hWnd )
{
HWND hWndOk = GetDlgItem( hWnd, IDOK );
if ( hWndOk )
{
EnableWindow( hWndOk, bEnable );
break;
}
hWnd = GetParent( hWnd );
}
}
static LRESULT ConfPropGeneral_DlgProcEx(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = 0;
switch (uMsg)
{
HANDLE_MSG(hwndDlg, WM_INITDIALOG, ConfPropGeneral_OnInitDialog);
case WM_COMMAND:
if ( (lRet = HANDLE_WM_COMMAND(hwndDlg, wParam, lParam, ConfPropGeneral_OnCommand)) != 0 )
return lRet;
break;
case WM_NOTIFY:
if ( (lRet = HANDLE_WM_NOTIFY(hwndDlg, wParam, lParam, ConfPropGeneral_OnNotify)) != 0 )
return lRet;
break;
case WM_HELP: return GeneralOnHelp( hwndDlg, wParam, lParam );
case WM_CONTEXTMENU: return GeneralOnContextMenu( hwndDlg, wParam, lParam );
case WM_SETTINGCHANGE:
ConfPropGeneral_SetDateTimeFormats( hwndDlg );
// do default processing as well
break;
}
return ConfPropGeneral_DefProc(hwndDlg, uMsg, wParam, lParam);
}
static BOOL ConfPropGeneral_OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
{
//_ASSERT( lParam && ((LPPROPSHEETPAGE) lParam)->lParam );
//
// We have to verify the arguments
//
if( NULL == ((LPPROPSHEETPAGE)lParam) )
{
return TRUE;
}
LPCONFPROP lpConfProp = (LPCONFPROP) ((LPPROPSHEETPAGE) lParam)->lParam;
//
// Validates lpConfProp
//
if( IsBadReadPtr( lpConfProp, sizeof( CONFPROP) ) )
{
return TRUE;
}
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, (LONG_PTR) lpConfProp );
// Reset content of listbox if necessary
ConfPropGeneral_UpdateData( hwndDlg, FALSE );
if ( lpConfProp->ConfInfo.IsNewConference() )
ShowScopeInfo( hwndDlg, SW_SHOW, true );
//WndCenterWindow( GetParent(hwndDlg), NULL, 0, 0 );
return TRUE; // let Windows decide who gets focus
}
static BOOL ConfPropGeneral_OnCommand(HWND hwndDlg, UINT id, HWND hwndCtl, UINT code)
{
BOOL bRet = false;
HWND hwndName = GetDlgItem(hwndDlg, IDC_EDIT_NAME);
switch (id)
{
case IDC_EDIT_NAME:
if (code == EN_CHANGE)
EnableOkBtn( hwndDlg, (bool) (Edit_GetTextLength(hwndName) != 0) );
break;
default:
break;
}
return bRet;
}
static int ConfPropGeneral_OnNotify(HWND hwndDlg, UINT idFrom, LPNMHDR lpnmhdr)
{
switch (lpnmhdr->code)
{
// page about to be activated and made visible, so initialize page
//
case PSN_SETACTIVE:
return 0; // ok
// return -1; // activate previous or next page
// return MAKEINTRESOURCE(id); // activate specific page
break;
// page about to lose activation, so validate page
//
case PSN_KILLACTIVE:
return FALSE; // ok
// return TRUE; // not ok
break;
// ok or apply button pushed, so apply properties to object
//
case PSN_APPLY:
return ConfPropGeneral_UpdateData( hwndDlg, TRUE );
break;
// cancel button pushed
//
case PSN_QUERYCANCEL:
return FALSE; // ok
// return TRUE; // not ok
break;
// page about to be destroyed after cancel button pushed
//
case PSN_RESET:
return FALSE; // return value ignored
break;
// help button pushed
//
case PSN_HELP:
// WinHelp(...); // $FIXUP - need to handle this
return FALSE; // return value ignored
break;
case DTN_DATETIMECHANGE:
// If this is not a new conference, post a message explaining that
// the scope information will need to be re-selected
if ( IsWindow(hwndDlg) )
{
LPCONFPROP lpConfProp = (LPCONFPROP) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
//
// We have to verify the lpConfProp
//
if( NULL == lpConfProp )
{
break;
}
if ( !lpConfProp->ConfInfo.m_bDateTimeChange )
{
lpConfProp->ConfInfo.m_bDateTimeChange = true;
if ( !lpConfProp->ConfInfo.m_bNewConference )
{
// We send the notification again even if the source is the combo
// and show MessageBox at that time
//MessageBox(hwndDlg, String(g_hInstLib, IDS_CONFPROP_DATECHANGE_MDHCP), NULL, MB_OK | MB_ICONINFORMATION );
ShowScopeInfo( hwndDlg, SW_SHOW, true );
PostMessage(hwndDlg, WM_NOTIFY, idFrom, (LPARAM)lpnmhdr);
}
}
else
{
//Here is the second notification
//I show here the Error message
if ( !lpConfProp->ConfInfo.m_bNewConference )
{
if(!lpConfProp->ConfInfo.m_bDateChangeMessage)
{
lpConfProp->ConfInfo.m_bDateChangeMessage = true;
MessageBox(hwndDlg, String(g_hInstLib, IDS_CONFPROP_DATECHANGE_MDHCP), NULL, MB_OK | MB_ICONINFORMATION );
}
}
}
}
break;
default:
break;
}
return FALSE;
}
static void ConfPropGeneral_SetDateTimeFormats( HWND hwndDlg )
{
HWND hwndDTPStartDate = GetDlgItem(hwndDlg, IDC_DTP_STARTDATE);
HWND hwndDTPStartTime = GetDlgItem(hwndDlg, IDC_DTP_STARTTIME);
HWND hwndDTPStopDate = GetDlgItem(hwndDlg, IDC_DTP_STOPDATE);
HWND hwndDTPStopTime = GetDlgItem(hwndDlg, IDC_DTP_STOPTIME);
// conference start time
TCHAR szFormat[255];
GetLocaleInfo( LOCALE_USER_DEFAULT,
LOCALE_SSHORTDATE,
szFormat,
ARRAYSIZE(szFormat) );
DateTime_SetFormat(hwndDTPStartDate, szFormat );
DateTime_SetFormat( hwndDTPStopDate, szFormat );
// conference stop time
GetLocaleInfo( LOCALE_USER_DEFAULT,
LOCALE_STIMEFORMAT,
szFormat,
ARRAYSIZE(szFormat) );
DateTime_SetFormat( hwndDTPStopTime, szFormat );
DateTime_SetFormat(hwndDTPStartTime, szFormat );
}
static int ConfPropGeneral_UpdateData(HWND hwndDlg, BOOL bSaveAndValidate)
{
HRESULT hr = S_OK;
LPCONFPROP lpConfProp;
HWND hwndName = GetDlgItem(hwndDlg, IDC_EDIT_NAME);
HWND hwndDescription = GetDlgItem(hwndDlg, IDC_EDIT_DESCRIPTION);
HWND hwndOwner = GetDlgItem(hwndDlg, IDC_EDIT_OWNER);
HWND hwndDTPStartDate = GetDlgItem(hwndDlg, IDC_DTP_STARTDATE);
HWND hwndDTPStartTime = GetDlgItem(hwndDlg, IDC_DTP_STARTTIME);
HWND hwndDTPStopDate = GetDlgItem(hwndDlg, IDC_DTP_STOPDATE);
HWND hwndDTPStopTime = GetDlgItem(hwndDlg, IDC_DTP_STOPTIME);
BSTR bstrName = NULL;
BSTR bstrDescription = NULL;
BSTR bstrOwner = NULL;
TCHAR szName[NAME_MAXLEN + 1];
TCHAR szDescription[DESCRIPTION_MAXLEN + 1] = _T("");
TCHAR szOwner[OWNER_MAXLEN + 1] = _T("");
SYSTEMTIME st;
USHORT nYear;
BYTE nMonth, nDay, nHour, nMinute;
USES_CONVERSION;
_ASSERT( IsWindow(hwndDlg) );
lpConfProp = (LPCONFPROP) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
//
// We have to verify lpConfProp
//
if( NULL == lpConfProp )
{
return PSNRET_INVALID_NOCHANGEPAGE;
}
if (!bSaveAndValidate) // initialization
{
// conference name
//
Edit_LimitText(hwndName, NAME_MAXLEN);
lpConfProp->ConfInfo.get_Name(&bstrName);
if (bstrName == NULL)
{
// Make up a default name for the conference
CComBSTR bstrTemp(L"");
if( bstrTemp.m_str == NULL )
{
// E_OUTOFMEMORY
_tcsncpy( szName, _T(""), NAME_MAXLEN );
}
else
{
lpConfProp->ConfInfo.GetPrimaryUser( &bstrTemp );
bstrTemp.Append( String(g_hInstLib, IDS_CONFPROP_UNTITLED_DEFAULT_APPEND) );
_tcsncpy( szName, OLE2CT(bstrTemp), NAME_MAXLEN );
}
}
else
{
_tcsncpy( szName, OLE2CT(bstrName), NAME_MAXLEN );
}
Edit_SetText(hwndName, szName);
// Don't allow name to be editted if this is an existing conference
if ( !lpConfProp->ConfInfo.IsNewConference() )
EnableWindow( hwndName, false );
// conference description
//
Edit_LimitText(hwndDescription, DESCRIPTION_MAXLEN);
lpConfProp->ConfInfo.get_Description(&bstrDescription);
if (bstrDescription )
_tcsncpy(szDescription, OLE2CT(bstrDescription), DESCRIPTION_MAXLEN);
Edit_SetText(hwndDescription, szDescription);
// conference owner
//
Edit_LimitText(hwndOwner, OWNER_MAXLEN);
lpConfProp->ConfInfo.get_Originator(&bstrOwner);
if (bstrOwner )
_tcsncpy(szOwner, OLE2CT(bstrOwner), OWNER_MAXLEN);
Edit_SetText(hwndOwner, szOwner);
ConfPropGeneral_SetDateTimeFormats( hwndDlg );
lpConfProp->ConfInfo.GetStartTime(&nYear, &nMonth, &nDay, &nHour, &nMinute);
st.wYear = nYear;
st.wMonth = nMonth;
st.wDayOfWeek = 0;
st.wDay = nDay;
st.wHour = nHour;
st.wMinute = nMinute;
st.wSecond = 0;
st.wMilliseconds = 0;
DateTime_SetSystemtime( hwndDTPStartDate, GDT_VALID, &st );
DateTime_SetSystemtime( hwndDTPStartTime, GDT_VALID, &st );
lpConfProp->ConfInfo.GetStopTime(&nYear, &nMonth, &nDay, &nHour, &nMinute);
st.wYear = nYear;
st.wMonth = nMonth;
st.wDayOfWeek = 0;
st.wDay = nDay;
st.wHour = nHour;
st.wMinute = nMinute;
st.wSecond = 0;
st.wMilliseconds = 0;
DateTime_SetSystemtime( hwndDTPStopDate, GDT_VALID, &st );
DateTime_SetSystemtime( hwndDTPStopTime, GDT_VALID, &st );
}
else // if (bSaveAndValidate)
{
// conference name
//
//
// We have to initialize szName
//
szName[0] = (TCHAR)0;
Edit_GetText(hwndName, szName, NAME_MAXLEN+1);
bstrName = SysAllocString(T2COLE(szName));
//
// We have to verify the allocation and
// initialize the szName
//
if( IsBadStringPtr( bstrName, (UINT)-1) )
{
return PSNRET_INVALID_NOCHANGEPAGE;
}
if ( !*szName )
{
// improper name
MessageBox(hwndDlg, String(g_hInstLib, IDS_CONFPROP_NONAME), NULL, MB_OK | MB_ICONEXCLAMATION);
}
else
{
lpConfProp->ConfInfo.put_Name(bstrName);
}
// conference description
//
Edit_GetText(hwndDescription, szDescription, DESCRIPTION_MAXLEN);
bstrDescription = SysAllocString(T2COLE(szDescription));
//
// We have to validate the allocation
//
if( IsBadStringPtr( bstrDescription, (UINT)-1) )
{
SysFreeString(bstrName);
return PSNRET_INVALID_NOCHANGEPAGE;
}
lpConfProp->ConfInfo.put_Description(bstrDescription);
// conference start time
//
if ( DateTime_GetSystemtime(hwndDTPStartDate, &st) == GDT_VALID )
{
nYear = (UINT) st.wYear;
nMonth = (BYTE) st.wMonth;
nDay = (BYTE) st.wDay;
if ( DateTime_GetSystemtime(hwndDTPStartTime, &st) == GDT_VALID )
{
nHour = (BYTE) st.wHour;
nMinute = (BYTE) st.wMinute;
lpConfProp->ConfInfo.SetStartTime(nYear, nMonth, nDay, nHour, nMinute);
}
}
// conference stop time
//
if ( DateTime_GetSystemtime(hwndDTPStopDate, &st) == GDT_VALID )
{
nYear = (UINT) st.wYear;
nMonth = (BYTE) st.wMonth;
nDay = (BYTE) st.wDay;
if ( DateTime_GetSystemtime(hwndDTPStopTime, &st) == GDT_VALID )
{
nHour = (BYTE) st.wHour;
nMinute = (BYTE) st.wMinute;
lpConfProp->ConfInfo.SetStopTime(nYear, nMonth, nDay, nHour, nMinute);
}
}
// MDHCP info
HWND hWndLst = GetDlgItem(hwndDlg, IDC_LST_SCOPE );
if ( hWndLst )
{
int nSel = SendMessage(hWndLst, LB_GETCURSEL, 0, 0);
lpConfProp->ConfInfo.m_bUserSelected = (nSel != LB_ERR);
lpConfProp->ConfInfo.m_lScopeID = SendMessage( hWndLst, LB_GETITEMDATA, nSel, 0 );
}
DWORD dwError;
hr = lpConfProp->ConfInfo.CommitGeneral( dwError );
if ( hr != S_OK )
{
//get proper message
UINT uId = IDS_CONFPROP_INVALIDTIME + dwError - 1;
MessageBox(hwndDlg, String(g_hInstLib, uId), NULL, MB_OK | MB_ICONEXCLAMATION );
}
}
SysFreeString(bstrName);
SysFreeString(bstrDescription);
SysFreeString(bstrOwner);
return (hr == S_OK) ? PSNRET_NOERROR : PSNRET_INVALID_NOCHANGEPAGE;
}
//////////////////////////////////////////////////////////////////
// This is the thread that goes out and enumerates the scopes
//
DWORD WINAPI ThreadMDHCPScopeEnum( LPVOID pParam )
{
ATLTRACE(_T(".enter.ThreadMDHCPScopeEnum().\n"));
HWND hWndDlg = (HWND) pParam;
if ( !IsWindow(hWndDlg) ) return E_ABORT;
HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED | COINIT_SPEED_OVER_MEMORY );
if ( SUCCEEDED(hr) )
{
HWND hWndList = GetDlgItem(hWndDlg, IDC_LST_SCOPE );
CConfInfo::PopulateListWithMDHCPScopeDescriptions( hWndList );
CoUninitialize();
}
ATLTRACE(_T(".exit.ThreadMDHCPScopeEnum(%ld).\n"), hr);
return hr;
}
void ShowScopeInfo( HWND hwndDlg, int nShow, bool bInit )
{
HWND hWndFrm = GetDlgItem( hwndDlg, IDC_FRM_SCOPE );
HWND hWndLbl = GetDlgItem( hwndDlg, IDC_LBL_SCOPE );
HWND hWndLst = GetDlgItem( hwndDlg, IDC_LST_SCOPE );
if ( hWndFrm ) ShowWindow( hWndFrm, nShow );
if ( hWndLbl ) ShowWindow( hWndLbl, nShow );
if ( hWndLst )
{
ShowWindow( hWndLst, nShow );
if ( bInit )
{
EnableWindow( hWndLst, FALSE );
SendMessage( hWndLst, LB_RESETCONTENT, 0, 0 );
SendMessage( hWndLst, LB_ADDSTRING, 0, (LPARAM) String(g_hInstLib, IDS_CONFPROP_ENUMERATING_SCOPES) );
DWORD dwID;
HANDLE hThread = CreateThread( NULL, 0, ThreadMDHCPScopeEnum, (void *) hwndDlg, NULL, &dwID );
if ( hThread ) CloseHandle( hThread );
}
}
}