2015-10-20 23:59:28 +00:00
|
|
|
|
/*
|
|
|
|
|
* PROJECT: ReactOS Applications
|
|
|
|
|
* LICENSE: LGPL - See COPYING in the top level directory
|
|
|
|
|
* FILE: base/applications/msconfig_new/fileextractdialog.c
|
|
|
|
|
* PURPOSE: File Extract Dialog
|
|
|
|
|
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
|
|
|
|
#include <wingdi.h>
|
|
|
|
|
#include <commdlg.h> // It needs stuff defined in wingdi.h ...
|
|
|
|
|
#undef LF_FACESIZE // but wingdi.h defines LF_FACESIZE, and if LF_FACESIZE is defined ...
|
|
|
|
|
#include <shlobj.h> // shlobj.h wants to define NT_CONSOLE_PROPS which needs COORD structure
|
|
|
|
|
// to be declared, this means, including wincon.h in a GUI app!!
|
|
|
|
|
// WTF!! I don't want that!!
|
|
|
|
|
|
|
|
|
|
// #include <setupapi.h>
|
|
|
|
|
#include "fileextractdialog.h"
|
2015-10-31 21:00:32 +00:00
|
|
|
|
#include "comctl32supp.h"
|
2015-10-20 23:59:28 +00:00
|
|
|
|
#include "utils.h"
|
|
|
|
|
|
|
|
|
|
// #include "callbacks.h"
|
|
|
|
|
|
|
|
|
|
// FIXME: This should be present in PSDK commdlg.h
|
|
|
|
|
//
|
|
|
|
|
// FlagsEx Values
|
|
|
|
|
#if (_WIN32_WINNT >= 0x0500)
|
|
|
|
|
#define OFN_EX_NOPLACESBAR 0x00000001
|
|
|
|
|
#endif // (_WIN32_WINNT >= 0x0500)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VOID
|
|
|
|
|
AddStringToComboList(HWND hWnd,
|
|
|
|
|
LPCWSTR lpszString)
|
|
|
|
|
{
|
|
|
|
|
/* Try to find an already existing occurrence of the string in the list */
|
|
|
|
|
LRESULT hPos = ComboBox_FindStringExact(hWnd, -1, lpszString);
|
|
|
|
|
|
|
|
|
|
if (hPos == CB_ERR)
|
|
|
|
|
{
|
|
|
|
|
/* The string doesn't exist, so add it to the list and select it */
|
|
|
|
|
ComboBox_InsertString(hWnd, 0, lpszString);
|
|
|
|
|
ComboBox_SetCurSel(hWnd, 0);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* The string exists, so select it */
|
|
|
|
|
ComboBox_SetCurSel(hWnd, hPos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
INT_PTR CALLBACK
|
|
|
|
|
FileExtractDialogWndProc(HWND hDlg,
|
|
|
|
|
UINT message,
|
|
|
|
|
WPARAM wParam,
|
|
|
|
|
LPARAM lParam)
|
|
|
|
|
{
|
|
|
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
|
|
|
|
|
|
|
|
switch (message)
|
|
|
|
|
{
|
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
case WM_COMMAND:
|
|
|
|
|
{
|
|
|
|
|
switch (LOWORD(wParam))
|
|
|
|
|
{
|
|
|
|
|
case IDOK:
|
|
|
|
|
{
|
2015-10-21 23:43:26 +00:00
|
|
|
|
LPWSTR szCabPathFileName, szFileName, szDestDir;
|
2015-10-20 23:59:28 +00:00
|
|
|
|
size_t cabPathNum, fileNameNum, destDirNum;
|
|
|
|
|
|
|
|
|
|
cabPathNum = GetWindowTextLengthW(GetDlgItem(hDlg, IDC_DRP_CAB_FILE)) + 1;
|
|
|
|
|
szCabPathFileName = (LPWSTR)MemAlloc(0, cabPathNum * sizeof(WCHAR));
|
|
|
|
|
GetDlgItemText(hDlg, IDC_DRP_CAB_FILE, szCabPathFileName, (int)cabPathNum);
|
2015-10-26 23:03:21 +00:00
|
|
|
|
|
2015-10-20 23:59:28 +00:00
|
|
|
|
fileNameNum = GetWindowTextLengthW(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE)) + 1;
|
|
|
|
|
szFileName = (LPWSTR)MemAlloc(0, fileNameNum * sizeof(WCHAR));
|
|
|
|
|
GetDlgItemText(hDlg, IDC_TXT_FILE_TO_RESTORE, szFileName, (int)fileNameNum);
|
|
|
|
|
|
|
|
|
|
destDirNum = GetWindowTextLengthW(GetDlgItem(hDlg, IDC_DRP_DEST_DIR)) + 1;
|
|
|
|
|
szDestDir = (LPWSTR)MemAlloc(0, destDirNum * sizeof(WCHAR));
|
|
|
|
|
GetDlgItemText(hDlg, IDC_DRP_DEST_DIR, szDestDir, (int)destDirNum);
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
if (!ExtractFromCabinet(szCabPathFileName, szFileName, szDestDir))
|
|
|
|
|
{
|
|
|
|
|
MessageBoxW(NULL, L"An error has occurred!!", L"Error", MB_ICONERROR | MB_OK);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
MessageBoxW(NULL, L"All the files were uncompressed successfully.", L"Info", MB_ICONINFORMATION | MB_OK);
|
|
|
|
|
|
|
|
|
|
// TODO: Save the extraction paths into the registry.
|
|
|
|
|
|
|
|
|
|
/* Quit */
|
|
|
|
|
EndDialog(hDlg, LOWORD(wParam));
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
MessageBoxW(NULL, L"File extraction is unimplemented!", L"Info", MB_ICONINFORMATION | MB_OK);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
MemFree(szDestDir);
|
|
|
|
|
MemFree(szFileName);
|
|
|
|
|
MemFree(szCabPathFileName);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case IDCANCEL:
|
|
|
|
|
EndDialog(hDlg, LOWORD(wParam));
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
case IDC_BTN_BROWSE_ALL_FILES:
|
|
|
|
|
{
|
|
|
|
|
unsigned int nMaxFilesNum = 255;
|
|
|
|
|
size_t newSize = (nMaxFilesNum * (MAX_PATH + 1)) + 1;
|
|
|
|
|
LPWSTR szPath = (LPWSTR)MemAlloc(HEAP_ZERO_MEMORY, newSize * sizeof(WCHAR));
|
|
|
|
|
OPENFILENAMEW ofn;
|
|
|
|
|
|
|
|
|
|
SecureZeroMemory(&ofn, sizeof(ofn));
|
|
|
|
|
ofn.lStructSize = sizeof(ofn);
|
|
|
|
|
ofn.hwndOwner = hDlg;
|
|
|
|
|
ofn.lpstrTitle = L"Files to be restored"; // L"Fichiers <20> restaurer"; // FIXME: Localize!
|
|
|
|
|
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_LONGNAMES;
|
|
|
|
|
// ofn.FlagsEx = OFN_EX_NOPLACESBAR;
|
|
|
|
|
ofn.lpstrFilter = L"All files (*.*)\0*.*\0";
|
|
|
|
|
ofn.nFilterIndex = 0;
|
|
|
|
|
ofn.lpstrFile = szPath;
|
|
|
|
|
ofn.nMaxFile = (DWORD)newSize; // TODO: size_t to DWORD conversion...
|
|
|
|
|
|
|
|
|
|
if (GetSaveFileName(&ofn))
|
|
|
|
|
{
|
|
|
|
|
if ( (ofn.Flags & OFN_EXPLORER) &&
|
|
|
|
|
(ofn.Flags & OFN_ALLOWMULTISELECT) ) // Must be always true...
|
|
|
|
|
{
|
|
|
|
|
LPWSTR lpszFiles = szPath + ofn.nFileOffset;
|
|
|
|
|
LPWSTR lpszFilePatterns = NULL;
|
|
|
|
|
|
|
|
|
|
LPWSTR lpszTmp = lpszFiles;
|
|
|
|
|
unsigned int n = 0;
|
|
|
|
|
size_t numOfChars = 0;
|
|
|
|
|
|
|
|
|
|
/* Truncate the path, if needed */
|
|
|
|
|
szPath[ofn.nFileOffset - 1] = L'\0';
|
|
|
|
|
|
|
|
|
|
while (*lpszTmp)
|
|
|
|
|
{
|
|
|
|
|
++n;
|
|
|
|
|
numOfChars += wcslen(lpszTmp)+1 + 3; // 3 = 2 quotation marks + 1 space.
|
|
|
|
|
lpszTmp += wcslen(lpszTmp)+1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lpszFilePatterns = (LPWSTR)MemAlloc(HEAP_ZERO_MEMORY, numOfChars*sizeof(WCHAR));
|
|
|
|
|
|
|
|
|
|
if (n >= 2)
|
|
|
|
|
{
|
|
|
|
|
while (*lpszFiles)
|
|
|
|
|
{
|
|
|
|
|
wcscat(lpszFilePatterns, L"\"");
|
|
|
|
|
wcscat(lpszFilePatterns, lpszFiles);
|
|
|
|
|
wcscat(lpszFilePatterns, L"\"");
|
|
|
|
|
|
|
|
|
|
lpszFiles += wcslen(lpszFiles)+1;
|
|
|
|
|
if (*lpszFiles)
|
|
|
|
|
wcscat(lpszFilePatterns, L" ");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
wcscpy(lpszFilePatterns, lpszFiles);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Edit_SetText(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE), lpszFilePatterns);
|
|
|
|
|
AddStringToComboList(GetDlgItem(hDlg, IDC_DRP_DEST_DIR), szPath);
|
|
|
|
|
|
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE));
|
|
|
|
|
Edit_SetSel(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE), 0, -1);
|
|
|
|
|
|
|
|
|
|
MemFree(lpszFilePatterns);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MemFree(szPath);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case IDC_BTN_BROWSE_CAB_FILES:
|
|
|
|
|
{
|
|
|
|
|
OPENFILENAMEW ofn;
|
|
|
|
|
WCHAR szPath[MAX_PATH] = L"";
|
|
|
|
|
|
|
|
|
|
SecureZeroMemory(&ofn, sizeof(ofn));
|
|
|
|
|
ofn.lStructSize = sizeof(ofn);
|
|
|
|
|
ofn.hwndOwner = hDlg;
|
|
|
|
|
ofn.lpstrTitle = L"Open an archive file"; // L"Ouvrir un fichier archive"; // FIXME: Localize!
|
|
|
|
|
ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_READONLY;
|
|
|
|
|
// ofn.FlagsEx = OFN_EX_NOPLACESBAR;
|
|
|
|
|
ofn.lpstrFilter = L"Cabinet files (*.cab)\0*.cab\0";
|
|
|
|
|
ofn.lpstrDefExt = L"cab";
|
|
|
|
|
ofn.nFilterIndex = 0;
|
|
|
|
|
ofn.lpstrFile = szPath;
|
|
|
|
|
ofn.nMaxFile = ARRAYSIZE(szPath);
|
|
|
|
|
|
|
|
|
|
if (GetOpenFileName(&ofn))
|
|
|
|
|
{
|
|
|
|
|
AddStringToComboList(GetDlgItem(hDlg, IDC_DRP_CAB_FILE), szPath);
|
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_DRP_CAB_FILE));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case IDC_BTN_BROWSE_DIRS:
|
|
|
|
|
{
|
|
|
|
|
BROWSEINFOW bi;
|
|
|
|
|
WCHAR szPath[MAX_PATH] = L"";
|
|
|
|
|
|
|
|
|
|
SecureZeroMemory(&bi, sizeof(bi));
|
|
|
|
|
bi.hwndOwner = hDlg;
|
|
|
|
|
bi.pidlRoot = NULL;
|
|
|
|
|
bi.lpszTitle = L"Select the directory where the restored files should be stored:";
|
|
|
|
|
// L"Choisissez le r<>pertoire dans lequel doivent <20>tre enregistr<74>s les fichiers restaur<75>s :"; // FIXME: Localize!
|
|
|
|
|
bi.ulFlags = BIF_USENEWUI | BIF_RETURNONLYFSDIRS | BIF_SHAREABLE | BIF_VALIDATE /* | BIF_BROWSEFILEJUNCTIONS <--- only in Windows 7+ */;
|
|
|
|
|
|
|
|
|
|
if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
|
|
|
|
|
{
|
|
|
|
|
/*PIDLIST_ABSOLUTE*/ LPITEMIDLIST pidl = SHBrowseForFolderW(&bi);
|
|
|
|
|
if (SHGetPathFromIDListW(pidl, szPath))
|
|
|
|
|
{
|
|
|
|
|
AddStringToComboList(GetDlgItem(hDlg, IDC_DRP_DEST_DIR), szPath);
|
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_DRP_DEST_DIR));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CoTaskMemFree(pidl);
|
|
|
|
|
CoUninitialize();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
//break;
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|