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.
 
 
 
 
 
 

368 lines
9.3 KiB

#include "stdafx.h"
#include "RoutingMethodProp.h"
#include "RoutingMethodConfig.h"
#include <shlobj.h>
#include <faxutil.h>
#include <faxreg.h>
#include <faxres.h>
#include <StoreConfigPage.h>
#include <Util.h>
HRESULT
CStoreConfigPage::Init(
LPCTSTR lpctstrServerName,
DWORD dwDeviceId
)
{
DEBUG_FUNCTION_NAME(TEXT("CStoreConfigPage::Init"));
DWORD ec = ERROR_SUCCESS;
m_bstrServerName = lpctstrServerName;
m_dwDeviceId = dwDeviceId;
if (!m_bstrServerName)
{
ec = ERROR_NOT_ENOUGH_MEMORY;
DebugPrintEx(DEBUG_ERR, TEXT("Out of memory while copying server name (ec: %ld)"), ec);
DisplayRpcErrorMessage(ERROR_NOT_ENOUGH_MEMORY, IDS_STORE_TITLE, m_hWnd);
goto exit;
}
if (!FaxConnectFaxServer(lpctstrServerName, &m_hFax))
{
ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
TEXT("FaxConnectFaxServer failed (ec: %ld)"),
ec);
DisplayRpcErrorMessage(ec, IDS_STORE_TITLE, m_hWnd);
goto exit;
}
//
// Retrieve the data
//
ec = ReadExtStringData (
m_hFax,
m_dwDeviceId,
REGVAL_RM_FOLDER_GUID,
m_bstrFolder,
TEXT(""),
IDS_STORE_TITLE,
m_hWnd);
exit:
if ((ERROR_SUCCESS != ec) && m_hFax)
{
if (!FaxClose(m_hFax))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("FaxClose() failed on fax handle (0x%08X : %s). (ec: %ld)"),
m_hFax,
m_bstrServerName,
GetLastError());
}
m_hFax = NULL;
}
return HRESULT_FROM_WIN32(ec);
} // CStoreConfigPage::Init
LRESULT CStoreConfigPage::OnInitDialog(
UINT uiMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& fHandled
)
{
DEBUG_FUNCTION_NAME( _T("CStoreConfigPage::OnInitDialog"));
//
// An edit control should be LTR
//
SetLTREditDirection (m_hWnd,IDC_EDIT_FOLDER);
//
// Attach and set values to the controls
//
m_edtFolder.Attach (GetDlgItem (IDC_EDIT_FOLDER));
m_edtFolder.SetWindowText (m_bstrFolder);
m_edtFolder.SetLimitText (MAX_PATH);
SHAutoComplete (GetDlgItem (IDC_EDIT_FOLDER), SHACF_FILESYSTEM);
m_fIsDialogInitiated = TRUE;
if ( 0 != m_bstrServerName.Length()) //not a local server
{
::EnableWindow(GetDlgItem(IDC_BUT_BROWSE), FALSE);
}
return 1;
}
BOOL
DirectoryExists(
LPTSTR pDirectoryName
)
/*++
Routine Description:
Check the existancy of given folder name
Arguments:
pDirectoryName - point to folder name
Return Value:
if the folder exists, return TRUE; else, return FALSE.
--*/
{
DWORD dwFileAttributes;
if(!pDirectoryName || lstrlen(pDirectoryName) == 0)
{
return FALSE;
}
dwFileAttributes = GetFileAttributes(pDirectoryName);
if ( dwFileAttributes != 0xffffffff &&
dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
return TRUE;
}
return FALSE;
}
BOOL
CStoreConfigPage::OnApply()
{
DEBUG_FUNCTION_NAME(TEXT("CStoreConfigPage::OnApply"));
if (!m_fIsDirty)
{
return TRUE;
}
//
// Collect data from the controls
//
m_edtFolder.GetWindowText (m_bstrFolder.m_str);
if (!m_bstrFolder.Length())
{
DisplayErrorMessage (IDS_STORE_TITLE, IDS_FOLDER_EMPTY, FALSE, m_hWnd);
return FALSE;
}
if(!FaxCheckValidFaxFolder(m_hFax, m_bstrFolder))
{
DWORD dwRes = ::GetLastError();
DebugPrintEx(DEBUG_ERR, TEXT("FaxCheckValidFaxFolder failed (ec: %ld)"), dwRes);
//
// Try to adjust folder
//
PropSheet_SetCurSelByID( GetParent(), IDD);
GotoDlgCtrl(GetDlgItem(IDC_EDIT_FOLDER));
dwRes = AskUserAndAdjustFaxFolder(m_hWnd, m_bstrServerName, m_bstrFolder, dwRes);
if(ERROR_SUCCESS != dwRes)
{
if(ERROR_BAD_PATHNAME != dwRes)
{
//
// The error message has not been shown by AskUserAndAdjustFaxFolder
//
DisplayErrorMessage (IDS_STORE_TITLE, IDS_FOLDER_INVALID, FALSE, m_hWnd);
}
return FALSE;
}
}
//
// Validation passed. Now write the data using RPC
//
if (ERROR_SUCCESS != WriteExtData (m_hFax,
m_dwDeviceId,
REGVAL_RM_FOLDER_GUID,
(LPBYTE)(LPCWSTR)m_bstrFolder,
sizeof (WCHAR) * (1 + m_bstrFolder.Length()),
IDS_STORE_TITLE,
m_hWnd))
{
return FALSE;
}
//Success
m_fIsDirty = FALSE;
return TRUE;
} // CStoreConfigPage::OnApply
CComBSTR CStoreConfigPage::m_bstrFolder;
int CALLBACK
BrowseCallbackProc(
HWND hwnd,
UINT uMsg,
LPARAM lp,
LPARAM pData
)
{
switch(uMsg)
{
case BFFM_INITIALIZED:
{
LPCWSTR lpcwstrCurrentFolder = CStoreConfigPage::GetFolder();
::SendMessage (hwnd,
BFFM_SETSELECTION,
TRUE, // Passing a path string and not a pidl.
(LPARAM)(lpcwstrCurrentFolder));
break;
}
case BFFM_SELCHANGED:
{
BOOL bFolderIsOK = FALSE;
TCHAR szPath [MAX_PATH + 1];
if (SHGetPathFromIDList ((LPITEMIDLIST) lp, szPath))
{
DWORD dwFileAttr = GetFileAttributes(szPath);
if (-1 != dwFileAttr && (dwFileAttr & FILE_ATTRIBUTE_DIRECTORY))
{
//
// The directory exists - enable the 'Ok' button
//
bFolderIsOK = TRUE;
}
}
//
// Enable / disable the 'ok' button
//
::SendMessage(hwnd, BFFM_ENABLEOK , 0, (LPARAM)bFolderIsOK);
break;
}
default:
break;
}
return 0;
} // BrowseCallbackProc
LRESULT
CStoreConfigPage::OnBrowseForFolder(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
DEBUG_FUNCTION_NAME(TEXT("CStoreConfigPage::OnBrowseForFolder"));
CComBSTR bstrSelectedFolder;
BROWSEINFO bi = {0};
HRESULT hr = NOERROR;
TCHAR szDisplayName[MAX_PATH + 1];
bi.hwndOwner = hWndCtl;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = AllocateAndLoadString (_pModule->m_hInstResource, IDS_SELECT_FOLDER);
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_NONEWFOLDERBUTTON;
bi.lpfn = BrowseCallbackProc;
m_edtFolder.GetWindowText (m_bstrFolder.m_str);
LPITEMIDLIST pItemIdList = SHBrowseForFolder (&bi);
MemFree ((LPVOID)bi.lpszTitle);
if (NULL == pItemIdList)
{
//
// User pressed cancel
//
return hr;
}
if(!::SHGetPathFromIDList(pItemIdList, szDisplayName))
{
hr = HRESULT_FROM_WIN32(ERROR_CAN_NOT_COMPLETE);
DebugPrintEx(
DEBUG_ERR,
TEXT("SHGetPathFromIDList() failed. (hr = 0x%08X)"),
hr);
}
else
{
m_edtFolder.SetWindowText (szDisplayName);
SetModified(TRUE);
}
//
// free pItemIdList
//
LPMALLOC pMalloc;
HRESULT hRes = ::SHGetMalloc(&pMalloc);
if(E_FAIL == hRes)
{
hr = HRESULT_FROM_WIN32(ERROR_CAN_NOT_COMPLETE);
DebugPrintEx(
DEBUG_ERR,
TEXT("SHGetMalloc() failed. (hr = 0x%08X)"),
hr);
}
else
{
pMalloc->Free(pItemIdList);
pMalloc->Release();
}
return hr;
} // CStoreConfigPage::OnBrowseForFolder
//////////////////////////////////////////////////////////////////////////////
/*++
CStoreConfigPage::OnHelpRequest
This is called in response to the WM_HELP Notify
message and to the WM_CONTEXTMENU Notify message.
WM_HELP Notify message.
This message is sent when the user presses F1 or <Shift>-F1
over an item or when the user clicks on the ? icon and then
presses the mouse over an item.
WM_CONTEXTMENU Notify message.
This message is sent when the user right clicks over an item
and then clicks "What's this?"
--*/
/////////////////////////////////////////////////////////////////////////////
LRESULT
CStoreConfigPage::OnHelpRequest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
DEBUG_FUNCTION_NAME(_T("CStoreConfigPage::OnHelpRequest"));
switch (uMsg)
{
case WM_HELP:
WinContextHelp(((LPHELPINFO)lParam)->dwContextId, m_hWnd);
break;
case WM_CONTEXTMENU:
WinContextHelp(::GetWindowContextHelpId((HWND)wParam), m_hWnd);
break;
}
return TRUE;
}