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.
397 lines
11 KiB
397 lines
11 KiB
#include "stdafx.h"
|
|
#include "FaxMMCUtils.h"
|
|
#include <faxres.h>
|
|
|
|
/*
|
|
- GetFaxServerErrorMsg
|
|
-
|
|
* Purpose:
|
|
* Translate Error Code to IDS.
|
|
*
|
|
* Arguments:
|
|
* dwEc - error code DWORD
|
|
*
|
|
* Return:
|
|
* integer represents the IDS of error message
|
|
* for this ec.
|
|
*
|
|
*/
|
|
int GetFaxServerErrorMsg(DWORD dwEc)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("GetFaxServerErrorMsg"));
|
|
|
|
int iIDS = IDS_GENERAL_FAILURE;
|
|
|
|
if (IsNetworkError(dwEc))
|
|
{
|
|
iIDS = IDS_NETWORK_PROBLEMS;
|
|
}
|
|
else
|
|
{
|
|
switch (dwEc)
|
|
{
|
|
case ERROR_NOT_ENOUGH_MEMORY:
|
|
iIDS = IDS_MEMORY;
|
|
break;
|
|
|
|
case ERROR_INVALID_PARAMETER:
|
|
iIDS = IDS_INVALID_PARAMETER;
|
|
break;
|
|
|
|
case ERROR_ACCESS_DENIED:
|
|
iIDS = IDS_ACCESS_DENIED;
|
|
break;
|
|
|
|
case ERROR_INVALID_HANDLE:
|
|
//
|
|
// ERROR_INVALID_HANDLE should not been
|
|
// retreived except of FaxOpenPort while
|
|
// handle sharing corruption was occoured.
|
|
// This case treated without calling this
|
|
// function.
|
|
//
|
|
|
|
ATLASSERT(FALSE);
|
|
|
|
//
|
|
// iIDS stays IDS_GENERAL_FAILURE due to
|
|
// the fact that we are not going report
|
|
// to the user on an invalid handle issue.
|
|
// This peace of code here should not been reached
|
|
// ever and this is the reason to the assert.
|
|
//
|
|
|
|
break;
|
|
|
|
case ERROR_BAD_UNIT:
|
|
iIDS = IDS_CANNOT_FIND_DEVICE;
|
|
break;
|
|
|
|
case ERROR_DIRECTORY: // The directory name is invalid.
|
|
iIDS = IDS_ERROR_DIRECTORY;
|
|
break;
|
|
|
|
case ERROR_BAD_PATHNAME:
|
|
iIDS = IDS_ERROR_BAD_PATHNAME;
|
|
break;
|
|
|
|
case ERROR_EAS_NOT_SUPPORTED:
|
|
iIDS = IDS_ERROR_EAS_NOT_SUPPORTED;
|
|
break;
|
|
|
|
case ERROR_REGISTRY_CORRUPT:
|
|
iIDS = IDS_ERROR_REGISTRY_CORRUPT;
|
|
break;
|
|
|
|
case ERROR_PATH_NOT_FOUND:
|
|
iIDS = IDS_ERROR_PATH_NOT_FOUND;
|
|
break;
|
|
|
|
case FAX_ERR_DIRECTORY_IN_USE:
|
|
iIDS = IDS_FAX_ERR_DIRECTORY_IN_USE;
|
|
break;
|
|
|
|
case FAX_ERR_RULE_NOT_FOUND:
|
|
iIDS = IDS_FAX_ERR_RULE_NOT_FOUND;
|
|
break;
|
|
|
|
case FAX_ERR_BAD_GROUP_CONFIGURATION:
|
|
iIDS = IDS_FAX_ERR_BAD_GROUP_CONFIGURATION;
|
|
break;
|
|
|
|
case FAX_ERR_GROUP_NOT_FOUND:
|
|
iIDS = IDS_FAX_ERR_GROUP_NOT_FOUND;
|
|
break;
|
|
|
|
case FAX_ERR_SRV_OUTOFMEMORY:
|
|
iIDS = IDS_FAX_ERR_SRV_OUTOFMEMORY;
|
|
break;
|
|
|
|
case FAXUI_ERROR_INVALID_CSID:
|
|
iIDS = IDS_FAX_ERR_INVALID_CSID;
|
|
break;
|
|
|
|
case FAXUI_ERROR_INVALID_TSID:
|
|
iIDS = IDS_FAX_ERR_INVALID_TSID;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return iIDS;
|
|
}
|
|
|
|
/*
|
|
- IsNetworkError
|
|
-
|
|
* Purpose:
|
|
* Verify if Error Code represents a network error.
|
|
*
|
|
* Arguments:
|
|
* dwEc - error code DWORD
|
|
*
|
|
* Return:
|
|
* Boolean TRUE if the dwEc represents a
|
|
* network error, and FALSE if not.
|
|
*
|
|
*/
|
|
BOOL IsNetworkError(DWORD dwEc)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("IsNetworkError"));
|
|
|
|
BOOL bIsNetworkError = FALSE;
|
|
//Initialized to avoid an option to future mistakes
|
|
|
|
switch (dwEc)
|
|
{
|
|
case RPC_S_INVALID_BINDING:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case EPT_S_CANT_PERFORM_OP:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_ADDRESS_ERROR:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_CALL_CANCELLED:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_CALL_FAILED:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_CALL_FAILED_DNE:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_COMM_FAILURE:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_NO_BINDINGS:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_SERVER_TOO_BUSY:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
case RPC_S_SERVER_UNAVAILABLE:
|
|
bIsNetworkError = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bIsNetworkError = FALSE;
|
|
break;
|
|
}
|
|
return (bIsNetworkError);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
- Routine Description:
|
|
-
|
|
* Invokes the browse dialog
|
|
*
|
|
* Arguments:
|
|
*
|
|
* lpszBrowseItem [in/out] folder path
|
|
* dwMaxPath [in] max length of lpszBrowseItem
|
|
* lpszBrowseDlgTitle [in] browse dialog title
|
|
* ulBrowseFlags [in] browse dialog flags
|
|
* pParentWin [in] parent window
|
|
*
|
|
* Return Value:
|
|
*
|
|
* TRUE if successful, FALSE if the user presses Cancel
|
|
*/
|
|
BOOL
|
|
InvokeBrowseDialog( LPTSTR lpszBrowseItem,
|
|
DWORD dwMaxPath,
|
|
LPCTSTR lpszBrowseDlgTitle,
|
|
unsigned long ulBrowseFlags,
|
|
CWindow* pParentWin)
|
|
{
|
|
|
|
DEBUG_FUNCTION_NAME( _T("InvokeBrowseDialog"));
|
|
|
|
BOOL fResult = FALSE;
|
|
|
|
BROWSEINFO bi;
|
|
LPITEMIDLIST pidl;
|
|
LPMALLOC pMalloc;
|
|
VOID SHFree(LPVOID);
|
|
|
|
ATLASSERT( pParentWin != NULL);
|
|
//
|
|
// Preparing the BROWSEINFO structure.
|
|
//
|
|
bi.hwndOwner = (HWND)(*pParentWin); //Parents hWndDlg
|
|
bi.pidlRoot = NULL;
|
|
bi.pszDisplayName = lpszBrowseItem;
|
|
bi.lpszTitle = lpszBrowseDlgTitle;
|
|
bi.ulFlags = ulBrowseFlags;
|
|
bi.lpfn = BrowseCallbackProc;
|
|
bi.lParam = (LPARAM) (lpszBrowseItem);
|
|
bi.iImage = 0;
|
|
|
|
//
|
|
// Memory check
|
|
//
|
|
if (FAILED(SHGetMalloc(&pMalloc)))
|
|
{
|
|
DlgMsgBox(pParentWin, IDS_MEMORY);
|
|
return fResult;
|
|
}
|
|
|
|
//
|
|
// Calling to the BrowseForFolder dialog
|
|
//
|
|
if(pidl = SHBrowseForFolder(&bi)) //pidl != NULL
|
|
{
|
|
TCHAR szPath[MAX_PATH+1] = {0};
|
|
//
|
|
// Retrieving the New Path
|
|
//
|
|
if(SHGetPathFromIDList(pidl, szPath))
|
|
{
|
|
if(wcslen(szPath) >= dwMaxPath)
|
|
{
|
|
DlgMsgBox(pParentWin, IDS_ERR_DIR_TOO_LONG, MB_OK | MB_ICONERROR);
|
|
}
|
|
else
|
|
{
|
|
DebugPrintEx(DEBUG_MSG, _T("Succeeded to Retrieve the path from browse dialog."));
|
|
|
|
_tcsncpy(lpszBrowseItem, szPath, dwMaxPath);
|
|
|
|
// Now the path was retreived successfully to
|
|
// the back parameter lpszBrowseItem
|
|
// and this is the only case in which the calling
|
|
// function gets TRUE as return value.
|
|
|
|
fResult = TRUE;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Free using shell allocator
|
|
//
|
|
pMalloc->Free(pidl);
|
|
pMalloc->Release();
|
|
}
|
|
|
|
return fResult;
|
|
}
|
|
|
|
|
|
/*++
|
|
Routine Description:
|
|
|
|
Callback function for the folder browser
|
|
|
|
Arguments:
|
|
|
|
hwnd : Handle to the browse dialog box. The callback function can
|
|
send the following messages to this window:
|
|
|
|
BFFM_ENABLEOK Enables the OK button if the wParam parameter
|
|
is nonzero or disables it if wParam is zero.
|
|
BFFM_SETSELECTION Selects the specified folder. The lParam
|
|
parameter is the PIDL of the folder to select
|
|
if wParam is FALSE, or it is the path of the
|
|
folder otherwise.
|
|
BFFM_SETSTATUSTEXT Sets the status text to the null-terminated
|
|
string specified by the lParam parameter.
|
|
|
|
uMsg : Value identifying the event. This parameter can be one of the
|
|
following values:
|
|
|
|
0 Initialize dir path. lParam is the path.
|
|
|
|
BFFM_INITIALIZED The browse dialog box has finished
|
|
initializing. lpData is NULL.
|
|
BFFM_SELCHANGED The selection has changed. lpData
|
|
is a pointer to the item identifier list for
|
|
the newly selected folder.
|
|
|
|
lParam : Message-specific value. For more information, see the
|
|
description of uMsg.
|
|
|
|
lpData : Application-defined value that was specified in the lParam
|
|
member of the BROWSEINFO structure.
|
|
|
|
Return Value:
|
|
|
|
0 (1)
|
|
|
|
--*/
|
|
int CALLBACK BrowseCallbackProc(
|
|
HWND hWnd,
|
|
UINT uMsg,
|
|
LPARAM lParam,
|
|
LPARAM lpData)
|
|
{
|
|
int iRet = 0;
|
|
|
|
switch(uMsg)
|
|
{
|
|
|
|
case BFFM_INITIALIZED:
|
|
// LParam is TRUE since you are passing a path.
|
|
// It would be FALSE if you were passing a pidl.
|
|
|
|
// the lpData points to the folder path.
|
|
// It must contain a path.
|
|
// ASSERT(lpData && _T('\0') != *((LPTSTR)lpData));
|
|
|
|
SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
|
|
break;
|
|
|
|
case BFFM_SELCHANGED:
|
|
{
|
|
BOOL bFolderIsOK = FALSE;
|
|
TCHAR szPath [MAX_PATH + 1] = {0};
|
|
|
|
if (SHGetPathFromIDList ((LPITEMIDLIST) lParam, szPath))
|
|
{
|
|
DWORD dwFileAttr = GetFileAttributes(szPath);
|
|
|
|
::SendMessage(hWnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)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;
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
case BFFM_VALIDATEFAILED:
|
|
break;
|
|
|
|
default:
|
|
ATLTRACE2(atlTraceWindowing, 0, _T("Unknown message received in CFolderDialogImpl::BrowseCallbackProc\n"));
|
|
break;
|
|
}
|
|
|
|
return iRet;
|
|
}
|
|
|