[ZIPFLDR] Improve error reporting

- Restore status text on failure
- Show errors on folder and file creation failures
- Allow to retry extraction attempt

CORE-17796
This commit is contained in:
Stanislav Motylkov
2021-10-06 02:48:03 +03:00
parent fd441aaae7
commit e27acff649
16 changed files with 110 additions and 2 deletions

View File

@@ -75,6 +75,7 @@ public:
CZipExtract* m_pExtract;
CStringA* m_pPassword;
CStringW m_OldStatus;
public:
CExtractSettingsPage(CZipExtract* extract, CStringA* password)
@@ -127,6 +128,8 @@ public:
::EnableWindow(GetDlgItem(IDC_PASSWORD), FALSE);
SetWizardButtons(0);
::GetWindowTextW(GetDlgItem(IDC_STATUSTEXT), m_OldStatus.GetBuffer(MAX_PATH), MAX_PATH);
m_OldStatus.ReleaseBuffer();
CStringW strExtracting(MAKEINTRESOURCEW(IDS_EXTRACTING));
SetDlgItemTextW(IDC_STATUSTEXT, strExtracting);
@@ -156,6 +159,11 @@ public:
return TRUE;
}
void WizardReset()
{
SetDlgItemTextW(IDC_STATUSTEXT, m_OldStatus);
}
static DWORD WINAPI ExtractEntry(LPVOID lpParam)
{
CExtractSettingsPage* pPage = (CExtractSettingsPage*)lpParam;
@@ -175,6 +183,7 @@ public:
CWindow Progress(pPage->GetDlgItem(IDC_PROGRESS));
Progress.SendMessage(PBM_SETRANGE32, 0, 1);
Progress.SendMessage(PBM_SETPOS, 0, 0);
pPage->WizardReset();
}
SendMessageCallback(pPage->GetParent().m_hWnd, PSM_PRESSBUTTON, PSBTN_NEXT, 0, NULL, NULL);
@@ -571,6 +580,7 @@ public:
PathCombineA(CombinedPath, BaseDirectory, Name);
CStringA FullPath = CombinedPath;
FullPath.Replace('/', '\\'); /* SHPathPrepareForWriteA does not handle '/' */
Retry:
eZipExtractError Result = ExtractSingle(hDlg, FullPath, is_dir, &Info, Name, Password, &bOverwriteAll, bCancel, &err);
if (Result != eDirectoryError)
CurrentFile++;
@@ -580,12 +590,43 @@ public:
break;
case eExtractAbort:
case eDirectoryError:
case eFileError:
case eOpenError:
case eUnpackError:
{
Close();
return false;
}
case eDirectoryError:
{
char StrippedPath[MAX_PATH] = { 0 };
StrCpyNA(StrippedPath, FullPath, _countof(StrippedPath));
if (!is_dir)
PathRemoveFileSpecA(StrippedPath);
PathStripPathA(StrippedPath);
if (ShowExtractError(hDlg, (LPCSTR)&StrippedPath, err, eDirectoryError) == IDRETRY)
goto Retry;
Close();
return false;
}
case eFileError:
{
int Result = ShowExtractError(hDlg, FullPath, err, eFileError);
switch (Result)
{
case IDABORT:
Close();
return false;
case IDRETRY:
CurrentFile--;
goto Retry;
case IDIGNORE:
break;
}
break;
}
}
if (Result == eNoError && is_dir)
continue;
@@ -595,6 +636,43 @@ public:
Close();
return true;
}
int ShowExtractError(HWND hDlg, LPCSTR path, int Error, eZipExtractError ErrorType)
{
CStringA strTitle(MAKEINTRESOURCEW(IDS_ERRORTITLE));
CStringA strErr, strText;
PSTR Win32ErrorString;
if (ErrorType == eFileError)
strText.LoadString(IDS_CANTEXTRACTFILE);
else
strText.LoadString(GetModuleHandleA("shell32.dll"), 128); // IDS_CREATEFOLDER_DENIED
strText.FormatMessage(strText.GetString(), path);
if (ErrorType == eFileError || HRESULT_FACILITY(Error) == FACILITY_WIN32)
{
if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, ErrorType == eFileError ? Error : HRESULT_CODE(Error), 0,
(PSTR)&Win32ErrorString, 0, NULL) != 0)
{
strErr.SetString(Win32ErrorString);
LocalFree(Win32ErrorString);
}
}
if (strErr.GetLength() == 0)
strErr.Format(IDS_UNKNOWNERROR, Error);
strText.Append("\r\n\r\n" + strErr);
UINT mbFlags = MB_ICONWARNING;
if (ErrorType == eDirectoryError)
mbFlags |= MB_RETRYCANCEL;
else if (ErrorType == eFileError)
mbFlags |= MB_ABORTRETRYIGNORE;
return MessageBoxA(hDlg, strText, strTitle, mbFlags);
}
};

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Fehler beim Erstellen des Archivs '%s' (Fehler Code: %d)."
IDS_CANTREADFILE "Datei '%s' konnte nicht gelesen werden."
IDS_EXTRACTING "Extrahieren..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Extrahier-Assistent"
IDS_WIZ_DEST_TITLE "Ziel auswählen"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "Extracting..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Extraction Wizard"
IDS_WIZ_DEST_TITLE "Select a Destination"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "Ekstraktimine..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Ekstraktimise visard"
IDS_WIZ_DEST_TITLE "Vali sihtkoht"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "Extraction..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Assistant d'extraction"
IDS_WIZ_DEST_TITLE "Choisir une destination"

View File

@@ -63,6 +63,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "Extracting..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "निष्कर्षण विज़ार्ड"
IDS_WIZ_DEST_TITLE "एक गंतव्य चुनें"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "Estrazione..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Estrazione Guidata"
IDS_WIZ_DEST_TITLE "Seleziona una Destinazione"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "圧縮フォルダ '%s' を作るのに失敗しました (エラーコード: %d) 。"
IDS_CANTREADFILE "ファイル '%s' が読めません。"
IDS_EXTRACTING "展開中..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "展開ウィザード"
IDS_WIZ_DEST_TITLE "展開先を選んで下さい"

View File

@@ -77,6 +77,8 @@ BEGIN
IDS_CANTCREATEZIP "Nie można utworzyć folderu skompresowanego '%s' (kod błędu: %d)."
IDS_CANTREADFILE "Błąd podczas czytania pliku '%s'."
IDS_EXTRACTING "Trwa wyodrębnianie..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Kreator wyodrębniania"
IDS_WIZ_DEST_TITLE "Wybierz miejsce docelowe"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Falha ao criar a pasta compactada '%s' (Erro: %d)."
IDS_CANTREADFILE "Não é possível ler o arquivo '%s'."
IDS_EXTRACTING "A extrair..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Assistente de extração"
IDS_WIZ_DEST_TITLE "Seleccione um destino"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "Extragere..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Asistent de extracție"
IDS_WIZ_DEST_TITLE "Selectați o Destinație"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Не удалось создать сжатую папку '%s' (код ошибки: %d)."
IDS_CANTREADFILE "Не удалось прочитать файл '%s'."
IDS_EXTRACTING "Извлечение..."
IDS_CANTEXTRACTFILE "Не удалось извлечь файл '%1'."
IDS_UNKNOWNERROR "Неизвестная ошибка 0x%08x."
IDS_WIZ_TITLE "Мастер извлечения архивов"
IDS_WIZ_DEST_TITLE "Укажите путь"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "Extraherar..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "Extraheringsguiden"
IDS_WIZ_DEST_TITLE "Välj ett mål"

View File

@@ -76,6 +76,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "Cannot read file '%s'."
IDS_EXTRACTING "正在解压..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "解压向导"
IDS_WIZ_DEST_TITLE "选择一个目标文件夹"

View File

@@ -79,6 +79,8 @@ BEGIN
IDS_CANTCREATEZIP "Failed to create a compressed folder '%s' (Error Code: %d)."
IDS_CANTREADFILE "無法讀取檔案 '%s'."
IDS_EXTRACTING "正在解壓縮..."
IDS_CANTEXTRACTFILE "Cannot extract file '%1'."
IDS_UNKNOWNERROR "Unknown error 0x%08x."
IDS_WIZ_TITLE "解壓縮精靈"
IDS_WIZ_DEST_TITLE "選擇一個目標資料夾"

View File

@@ -47,6 +47,8 @@
#define IDS_CANTCREATEZIP 112
#define IDS_CANTREADFILE 113
#define IDS_EXTRACTING 114
#define IDS_CANTEXTRACTFILE 115
#define IDS_UNKNOWNERROR 116
/* Wizard titles */
#define IDS_WIZ_TITLE 8000