mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 12:26:32 +00:00
256 lines
9.9 KiB
C
256 lines
9.9 KiB
C
/*
|
||
* 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"
|
||
#include "comctl32supp.h"
|
||
#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:
|
||
{
|
||
LPWSTR szCabPathFileName, szFileName, szDestDir;
|
||
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);
|
||
|
||
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;
|
||
}
|