@@ -12,10 +12,12 @@ class CZipExtract :
12
12
{
13
13
CStringW m_Filename;
14
14
CStringW m_Directory;
15
+ bool m_DirectoryChanged;
15
16
unzFile uf;
16
17
public:
17
18
CZipExtract (PCWSTR Filename)
18
- :uf(NULL )
19
+ :m_DirectoryChanged(false )
20
+ ,uf(NULL )
19
21
{
20
22
m_Filename = Filename;
21
23
m_Directory = m_Filename;
@@ -158,6 +160,7 @@ class CZipExtract :
158
160
int OnSetActive ()
159
161
{
160
162
SetDlgItemTextW (IDC_DIRECTORY, m_pExtract->m_Directory );
163
+ m_pExtract->m_DirectoryChanged = false ;
161
164
::EnableWindow (GetDlgItem(IDC_PASSWORD), FALSE); /* Not supported for now */
162
165
GetParent ().CenterWindow (::GetDesktopWindow ());
163
166
return 0 ;
@@ -169,6 +172,9 @@ class CZipExtract :
169
172
::EnableWindow (GetDlgItem(IDC_DIRECTORY), FALSE);
170
173
::EnableWindow (GetDlgItem(IDC_PASSWORD), FALSE);
171
174
175
+ if (m_pExtract->m_DirectoryChanged )
176
+ UpdateDirectory ();
177
+
172
178
if (!m_pExtract->Extract (m_hWnd, GetDlgItem (IDC_PROGRESS)))
173
179
{
174
180
/* Extraction failed, do not go to the next page */
@@ -211,6 +217,9 @@ class CZipExtract :
211
217
CStringW title (MAKEINTRESOURCEW (IDS_WIZ_BROWSE_TITLE));
212
218
bi.lpszTitle = title;
213
219
220
+ if (m_pExtract->m_DirectoryChanged )
221
+ UpdateDirectory ();
222
+
214
223
browse_info info = { m_hWnd, m_pExtract->m_Directory .GetString () };
215
224
bi.lParam = (LPARAM)&info;
216
225
@@ -222,21 +231,35 @@ class CZipExtract :
222
231
{
223
232
m_pExtract->m_Directory = tmpPath;
224
233
SetDlgItemTextW (IDC_DIRECTORY, m_pExtract->m_Directory );
234
+ m_pExtract->m_DirectoryChanged = false ;
225
235
}
226
236
return 0 ;
227
237
}
228
238
239
+ LRESULT OnEnChangeDirectory (WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
240
+ {
241
+ m_pExtract->m_DirectoryChanged = true ;
242
+ return 0 ;
243
+ }
244
+
229
245
LRESULT OnPassword (WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
230
246
{
231
247
return 0 ;
232
248
}
233
249
250
+ void UpdateDirectory ()
251
+ {
252
+ GetDlgItemText (IDC_DIRECTORY, m_pExtract->m_Directory );
253
+ m_pExtract->m_DirectoryChanged = false ;
254
+ }
255
+
234
256
public:
235
257
enum { IDD = IDD_PROPPAGEDESTINATION };
236
258
237
259
BEGIN_MSG_MAP (CCompleteSettingsPage)
238
260
COMMAND_ID_HANDLER (IDC_BROWSE, OnBrowse)
239
261
COMMAND_ID_HANDLER (IDC_PASSWORD, OnPassword)
262
+ COMMAND_HANDLER (IDC_DIRECTORY, EN_CHANGE, OnEnChangeDirectory)
240
263
CHAIN_MSG_MAP (CPropertyPageImpl<CExtractSettingsPage>)
241
264
END_MSG_MAP ()
242
265
};
@@ -319,13 +342,15 @@ class CZipExtract :
319
342
if (err != UNZ_OK)
320
343
{
321
344
DPRINT1 (" ERROR, unzGetGlobalInfo64: 0x%x\n " , err);
345
+ Close ();
322
346
return false ;
323
347
}
324
348
325
349
CZipEnumerator zipEnum;
326
350
if (!zipEnum.initialize (this ))
327
351
{
328
352
DPRINT1 (" ERROR, zipEnum.initialize\n " );
353
+ Close ();
329
354
return false ;
330
355
}
331
356
@@ -351,6 +376,7 @@ class CZipExtract :
351
376
HRESULT hr = SHPathPrepareForWriteA (hDlg, NULL , FullPath, dwFlags);
352
377
if (FAILED_UNEXPECTEDLY (hr))
353
378
{
379
+ Close ();
354
380
return false ;
355
381
}
356
382
CurrentFile++;
@@ -363,6 +389,7 @@ class CZipExtract :
363
389
if (err != UNZ_OK)
364
390
{
365
391
DPRINT1 (" ERROR, unzOpenCurrentFilePassword: 0x%x\n " , err);
392
+ Close ();
366
393
return false ;
367
394
}
368
395
@@ -386,6 +413,8 @@ class CZipExtract :
386
413
case CConfirmReplace::No:
387
414
break ;
388
415
case CConfirmReplace::Cancel:
416
+ unzCloseCurrentFile (uf);
417
+ Close ();
389
418
return false ;
390
419
}
391
420
}
@@ -408,6 +437,7 @@ class CZipExtract :
408
437
{
409
438
unzCloseCurrentFile (uf);
410
439
DPRINT1 (" ERROR, CreateFileA: 0x%x (%s)\n " , dwErr, bOverwriteAll ? " Y" : " N" );
440
+ Close ();
411
441
return false ;
412
442
}
413
443
}
@@ -454,6 +484,7 @@ class CZipExtract :
454
484
{
455
485
unzCloseCurrentFile (uf);
456
486
DPRINT1 (" ERROR, unzReadCurrentFile2: 0x%x\n " , err);
487
+ Close ();
457
488
return false ;
458
489
}
459
490
else
0 commit comments