mirror of
https://github.com/reactos/reactos.git
synced 2026-05-27 19:33:55 +08:00
[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:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 "एक गंतव्य चुनें"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 "展開先を選んで下さい"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 "Укажите путь"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 "选择一个目标文件夹"
|
||||
|
||||
@@ -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 "選擇一個目標資料夾"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user