handle FNERR_INVALIDFILENAME which happens if an invalid file name is passed to wxFileDialog (#9688)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54479 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -250,10 +250,10 @@ void wxFileDialog::MSWOnInitDone(WXHWND hDlg)
|
||||
SetHWND(NULL);
|
||||
}
|
||||
|
||||
// helper used below in ShowModal(): style is used to determine whether to show
|
||||
// the "Save file" dialog (if it contains wxFD_SAVE bit) or "Open file" one;
|
||||
// returns true on success or false on failure in which case err is filled with
|
||||
// the CDERR_XXX constant
|
||||
// helper used below in ShowCommFileDialog(): style is used to determine
|
||||
// whether to show the "Save file" dialog (if it contains wxFD_SAVE bit) or
|
||||
// "Open file" one; returns true on success or false on failure in which case
|
||||
// err is filled with the CDERR_XXX constant
|
||||
static bool DoShowCommFileDialog(OPENFILENAME *of, long style, DWORD *err)
|
||||
{
|
||||
if ( style & wxFD_SAVE ? GetSaveFileName(of) : GetOpenFileName(of) )
|
||||
@@ -308,6 +308,52 @@ static bool DoShowCommFileDialog(OPENFILENAME *of, long style, DWORD *err)
|
||||
static DWORD gs_ofStructSize = wxOPENFILENAME_V5_SIZE;
|
||||
#endif // __WXWINCE__ || __WIN64__/!...
|
||||
|
||||
static bool ShowCommFileDialog(OPENFILENAME *of, long style)
|
||||
{
|
||||
DWORD errCode;
|
||||
bool success = DoShowCommFileDialog(of, style, &errCode);
|
||||
|
||||
#ifdef wxTRY_SMALLER_OPENFILENAME
|
||||
// the system might be too old to support the new version file dialog
|
||||
// boxes, try with the old size
|
||||
if ( !success && errCode == CDERR_STRUCTSIZE &&
|
||||
of->lStructSize != wxOPENFILENAME_V4_SIZE )
|
||||
{
|
||||
of->lStructSize = wxOPENFILENAME_V4_SIZE;
|
||||
|
||||
success = DoShowCommFileDialog(of, style, &errCode);
|
||||
|
||||
if ( success || !errCode )
|
||||
{
|
||||
// use this struct size for subsequent dialogs
|
||||
gs_ofStructSize = of->lStructSize;
|
||||
}
|
||||
}
|
||||
#endif // wxTRY_SMALLER_OPENFILENAME
|
||||
|
||||
if ( !success && errCode == FNERR_INVALIDFILENAME && of->lpstrFile[0] )
|
||||
{
|
||||
// this can happen if the default file name is invalid, try without it
|
||||
// now
|
||||
of->lpstrFile[0] = _T('\0');
|
||||
success = DoShowCommFileDialog(of, style, &errCode);
|
||||
}
|
||||
|
||||
if ( !success )
|
||||
{
|
||||
// common dialog failed - why?
|
||||
if ( errCode != 0 )
|
||||
{
|
||||
wxLogError(_("File dialog failed with error code %0lx."), errCode);
|
||||
}
|
||||
//else: it was just cancelled
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int wxFileDialog::ShowModal()
|
||||
{
|
||||
HWND hWnd = 0;
|
||||
@@ -475,29 +521,9 @@ int wxFileDialog::ShowModal()
|
||||
|
||||
//== Execute FileDialog >>=================================================
|
||||
|
||||
DWORD errCode;
|
||||
bool success = DoShowCommFileDialog(&of, m_windowStyle, &errCode);
|
||||
if ( !ShowCommFileDialog(&of, m_windowStyle) )
|
||||
return wxID_CANCEL;
|
||||
|
||||
#ifdef wxTRY_SMALLER_OPENFILENAME
|
||||
// the system might be too old to support the new version file dialog
|
||||
// boxes, try with the old size
|
||||
if ( !success && errCode == CDERR_STRUCTSIZE &&
|
||||
of.lStructSize != wxOPENFILENAME_V4_SIZE )
|
||||
{
|
||||
of.lStructSize = wxOPENFILENAME_V4_SIZE;
|
||||
|
||||
success = DoShowCommFileDialog(&of, m_windowStyle, &errCode);
|
||||
|
||||
if ( success || !errCode )
|
||||
{
|
||||
// use this struct size for subsequent dialogs
|
||||
gs_ofStructSize = of.lStructSize;
|
||||
}
|
||||
}
|
||||
#endif // wxTRY_SMALLER_OPENFILENAME
|
||||
|
||||
if ( success )
|
||||
{
|
||||
// GetOpenFileName will always change the current working directory on
|
||||
// (according to MSDN) "Windows NT 4.0/2000/XP" because the flag
|
||||
// OFN_NOCHANGEDIR has no effect. If the user did not specify
|
||||
@@ -573,22 +599,8 @@ int wxFileDialog::ShowModal()
|
||||
m_fileNames.Add(m_fileName);
|
||||
m_dir = wxPathOnly(fileNameBuffer);
|
||||
}
|
||||
}
|
||||
#ifdef __WXDEBUG__
|
||||
else
|
||||
{
|
||||
// common dialog failed - why?
|
||||
if ( errCode != 0 )
|
||||
{
|
||||
// this msg is only for developers so don't translate it
|
||||
wxLogError(wxT("Common dialog failed with error code %0lx."),
|
||||
errCode);
|
||||
}
|
||||
//else: it was just cancelled
|
||||
}
|
||||
#endif // __WXDEBUG__
|
||||
|
||||
return success ? wxID_OK : wxID_CANCEL;
|
||||
return wxID_OK;
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user