1 /*
2 * PROJECT: ReactOS Applications
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/msconfig_new/fileextractdialog.c
5 * PURPOSE: File Extract Dialog
6 * COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
7 */
8
9 #include "precomp.h"
10
11 #include <wingdi.h>
12 #include <commdlg.h> // It needs stuff defined in wingdi.h ...
13 #undef LF_FACESIZE // but wingdi.h defines LF_FACESIZE, and if LF_FACESIZE is defined ...
14 #include <shlobj.h> // shlobj.h wants to define NT_CONSOLE_PROPS which needs COORD structure
15 // to be declared, this means, including wincon.h in a GUI app!!
16 // WTF!! I don't want that!!
17
18 // #include <setupapi.h>
19 #include "fileextractdialog.h"
20 #include "comctl32supp.h"
21 #include "utils.h"
22
23 // #include "callbacks.h"
24
25 // FIXME: This should be present in PSDK commdlg.h
26 //
27 // FlagsEx Values
28 #if (_WIN32_WINNT >= 0x0500)
29 #define OFN_EX_NOPLACESBAR 0x00000001
30 #endif // (_WIN32_WINNT >= 0x0500)
31
32
33 VOID
AddStringToComboList(HWND hWnd,LPCWSTR lpszString)34 AddStringToComboList(HWND hWnd,
35 LPCWSTR lpszString)
36 {
37 /* Try to find an already existing occurrence of the string in the list */
38 LRESULT hPos = ComboBox_FindStringExact(hWnd, -1, lpszString);
39
40 if (hPos == CB_ERR)
41 {
42 /* The string doesn't exist, so add it to the list and select it */
43 ComboBox_InsertString(hWnd, 0, lpszString);
44 ComboBox_SetCurSel(hWnd, 0);
45 }
46 else
47 {
48 /* The string exists, so select it */
49 ComboBox_SetCurSel(hWnd, hPos);
50 }
51
52 return;
53 }
54
55 INT_PTR CALLBACK
FileExtractDialogWndProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)56 FileExtractDialogWndProc(HWND hDlg,
57 UINT message,
58 WPARAM wParam,
59 LPARAM lParam)
60 {
61 UNREFERENCED_PARAMETER(lParam);
62
63 switch (message)
64 {
65 case WM_INITDIALOG:
66 return TRUE;
67
68 case WM_COMMAND:
69 {
70 switch (LOWORD(wParam))
71 {
72 case IDOK:
73 {
74 LPWSTR szCabPathFileName, szFileName, szDestDir;
75 size_t cabPathNum, fileNameNum, destDirNum;
76
77 cabPathNum = GetWindowTextLengthW(GetDlgItem(hDlg, IDC_DRP_CAB_FILE)) + 1;
78 szCabPathFileName = (LPWSTR)MemAlloc(0, cabPathNum * sizeof(WCHAR));
79 GetDlgItemText(hDlg, IDC_DRP_CAB_FILE, szCabPathFileName, (int)cabPathNum);
80
81 fileNameNum = GetWindowTextLengthW(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE)) + 1;
82 szFileName = (LPWSTR)MemAlloc(0, fileNameNum * sizeof(WCHAR));
83 GetDlgItemText(hDlg, IDC_TXT_FILE_TO_RESTORE, szFileName, (int)fileNameNum);
84
85 destDirNum = GetWindowTextLengthW(GetDlgItem(hDlg, IDC_DRP_DEST_DIR)) + 1;
86 szDestDir = (LPWSTR)MemAlloc(0, destDirNum * sizeof(WCHAR));
87 GetDlgItemText(hDlg, IDC_DRP_DEST_DIR, szDestDir, (int)destDirNum);
88
89 #if 0
90 if (!ExtractFromCabinet(szCabPathFileName, szFileName, szDestDir))
91 {
92 MessageBoxW(NULL, L"An error has occurred!!", L"Error", MB_ICONERROR | MB_OK);
93 }
94 else
95 {
96 MessageBoxW(NULL, L"All the files were uncompressed successfully.", L"Info", MB_ICONINFORMATION | MB_OK);
97
98 // TODO: Save the extraction paths into the registry.
99
100 /* Quit */
101 EndDialog(hDlg, LOWORD(wParam));
102 }
103 #else
104 MessageBoxW(NULL, L"File extraction is unimplemented!", L"Info", MB_ICONINFORMATION | MB_OK);
105 #endif
106
107 MemFree(szDestDir);
108 MemFree(szFileName);
109 MemFree(szCabPathFileName);
110
111 return TRUE;
112 }
113
114 case IDCANCEL:
115 EndDialog(hDlg, LOWORD(wParam));
116 return TRUE;
117
118 case IDC_BTN_BROWSE_ALL_FILES:
119 {
120 unsigned int nMaxFilesNum = 255;
121 size_t newSize = (nMaxFilesNum * (MAX_PATH + 1)) + 1;
122 LPWSTR szPath = (LPWSTR)MemAlloc(HEAP_ZERO_MEMORY, newSize * sizeof(WCHAR));
123 OPENFILENAMEW ofn;
124
125 SecureZeroMemory(&ofn, sizeof(ofn));
126 ofn.lStructSize = sizeof(ofn);
127 ofn.hwndOwner = hDlg;
128 ofn.lpstrTitle = L"Files to be restored"; // L"Fichiers � restaurer"; // FIXME: Localize!
129 ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_LONGNAMES;
130 // ofn.FlagsEx = OFN_EX_NOPLACESBAR;
131 ofn.lpstrFilter = L"All files (*.*)\0*.*\0";
132 ofn.nFilterIndex = 0;
133 ofn.lpstrFile = szPath;
134 ofn.nMaxFile = (DWORD)newSize; // TODO: size_t to DWORD conversion...
135
136 if (GetSaveFileName(&ofn))
137 {
138 if ( (ofn.Flags & OFN_EXPLORER) &&
139 (ofn.Flags & OFN_ALLOWMULTISELECT) ) // Must be always true...
140 {
141 LPWSTR lpszFiles = szPath + ofn.nFileOffset;
142 LPWSTR lpszFilePatterns = NULL;
143
144 LPWSTR lpszTmp = lpszFiles;
145 unsigned int n = 0;
146 size_t numOfChars = 0;
147
148 /* Truncate the path, if needed */
149 szPath[ofn.nFileOffset - 1] = L'\0';
150
151 while (*lpszTmp)
152 {
153 ++n;
154 numOfChars += wcslen(lpszTmp)+1 + 3; // 3 = 2 quotation marks + 1 space.
155 lpszTmp += wcslen(lpszTmp)+1;
156 }
157
158 lpszFilePatterns = (LPWSTR)MemAlloc(HEAP_ZERO_MEMORY, numOfChars*sizeof(WCHAR));
159
160 if (n >= 2)
161 {
162 while (*lpszFiles)
163 {
164 wcscat(lpszFilePatterns, L"\"");
165 wcscat(lpszFilePatterns, lpszFiles);
166 wcscat(lpszFilePatterns, L"\"");
167
168 lpszFiles += wcslen(lpszFiles)+1;
169 if (*lpszFiles)
170 wcscat(lpszFilePatterns, L" ");
171 }
172 }
173 else
174 {
175 wcscpy(lpszFilePatterns, lpszFiles);
176 }
177
178 Edit_SetText(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE), lpszFilePatterns);
179 AddStringToComboList(GetDlgItem(hDlg, IDC_DRP_DEST_DIR), szPath);
180
181 SetFocus(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE));
182 Edit_SetSel(GetDlgItem(hDlg, IDC_TXT_FILE_TO_RESTORE), 0, -1);
183
184 MemFree(lpszFilePatterns);
185 }
186 }
187
188 MemFree(szPath);
189
190 break;
191 }
192
193 case IDC_BTN_BROWSE_CAB_FILES:
194 {
195 OPENFILENAMEW ofn;
196 WCHAR szPath[MAX_PATH] = L"";
197
198 SecureZeroMemory(&ofn, sizeof(ofn));
199 ofn.lStructSize = sizeof(ofn);
200 ofn.hwndOwner = hDlg;
201 ofn.lpstrTitle = L"Open an archive file"; // L"Ouvrir un fichier archive"; // FIXME: Localize!
202 ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_READONLY;
203 // ofn.FlagsEx = OFN_EX_NOPLACESBAR;
204 ofn.lpstrFilter = L"Cabinet files (*.cab)\0*.cab\0";
205 ofn.lpstrDefExt = L"cab";
206 ofn.nFilterIndex = 0;
207 ofn.lpstrFile = szPath;
208 ofn.nMaxFile = ARRAYSIZE(szPath);
209
210 if (GetOpenFileName(&ofn))
211 {
212 AddStringToComboList(GetDlgItem(hDlg, IDC_DRP_CAB_FILE), szPath);
213 SetFocus(GetDlgItem(hDlg, IDC_DRP_CAB_FILE));
214 }
215
216 break;
217 }
218
219 case IDC_BTN_BROWSE_DIRS:
220 {
221 BROWSEINFOW bi;
222 WCHAR szPath[MAX_PATH] = L"";
223
224 SecureZeroMemory(&bi, sizeof(bi));
225 bi.hwndOwner = hDlg;
226 bi.pidlRoot = NULL;
227 bi.lpszTitle = L"Select the directory where the restored files should be stored:";
228 // L"Choisissez le r�pertoire dans lequel doivent �tre enregistr�s les fichiers restaur�s :"; // FIXME: Localize!
229 bi.ulFlags = BIF_USENEWUI | BIF_RETURNONLYFSDIRS | BIF_SHAREABLE | BIF_VALIDATE /* | BIF_BROWSEFILEJUNCTIONS <--- only in Windows 7+ */;
230
231 if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
232 {
233 /*PIDLIST_ABSOLUTE*/ LPITEMIDLIST pidl = SHBrowseForFolderW(&bi);
234 if (SHGetPathFromIDListW(pidl, szPath))
235 {
236 AddStringToComboList(GetDlgItem(hDlg, IDC_DRP_DEST_DIR), szPath);
237 SetFocus(GetDlgItem(hDlg, IDC_DRP_DEST_DIR));
238 }
239
240 CoTaskMemFree(pidl);
241 CoUninitialize();
242 }
243
244 break;
245 }
246
247 default:
248 //break;
249 return FALSE;
250 }
251 }
252 }
253
254 return FALSE;
255 }
256