source: trunk/Launcher/LauncherDlg.cpp @ 6

Revision 6, 13.0 KB checked in by lowjoel, 7 years ago (diff)

Added the source files from Launcher (SVN migration commit 4)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1// LauncherDlg.cpp
2//
3// Eraser. Secure data removal. For Windows.
4// Copyright © 1997-2001  Sami Tolvanen (sami@tolvanen.com).
5//
6// This program is free software; you can redistribute it and/or
7// modify it under the terms of the GNU General Public License
8// as published by the Free Software Foundation; either version 2
9// of the License, or (at your option) any later version.
10//
11// This program is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with this program; if not, write to the Free Software
18// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19// 02111-1307, USA.
20
21#include "stdafx.h"
22#include "..\EraserDll\EraserDll.h"
23#include "..\shared\FitFileNameToScrn.h"
24#include "..\shared\FileHelper.h"
25#include "Launcher.h"
26#include "LauncherDlg.h"
27#include "..\shared\DriveCombo.h"
28
29#ifdef _DEBUG
30#define new DEBUG_NEW
31#undef THIS_FILE
32static char THIS_FILE[] = __FILE__;
33#endif
34
35/////////////////////////////////////////////////////////////////////////////
36// CLauncherDlg dialog
37
38CLauncherDlg::CLauncherDlg(CWnd* pParent /*=NULL*/) :
39CDialog(CLauncherDlg::IDD, pParent),
40m_bUseFiles(FALSE),
41m_bFolders(FALSE),
42m_bSubFolders(FALSE),
43m_bKeepFolder(FALSE),
44m_bUseEmptySpace(FALSE),
45m_bResults(FALSE),
46m_bResultsOnError(FALSE),
47m_bRecycled(FALSE),
48m_emMethod(ERASER_METHOD_PSEUDORANDOM /*ERASER_METHOD_LIBRARY*/),
49m_uPasses(1),
50m_ehContext(ERASER_INVALID_CONTEXT)
51{
52    //{{AFX_DATA_INIT(CLauncherDlg)
53    m_strData = _T("");
54    m_strErasing = _T("");
55    m_strMessage = _T("");
56    m_strPass = _T("");
57    m_strPercent = _T("0%");
58    m_strPercentTotal = _T("0%");
59    m_strTime = _T("");
60    //}}AFX_DATA_INIT
61    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
62    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
63}
64
65void CLauncherDlg::DoDataExchange(CDataExchange* pDX)
66{
67    CDialog::DoDataExchange(pDX);
68    //{{AFX_DATA_MAP(CLauncherDlg)
69    DDX_Control(pDX, IDC_PROGRESS, m_pcProgress);
70    DDX_Control(pDX, IDC_PROGRESS_TOTAL, m_pcProgressTotal);
71    DDX_Text(pDX, IDC_STATIC_DATA, m_strData);
72    DDX_Text(pDX, IDC_STATIC_ERASING, m_strErasing);
73    DDX_Text(pDX, IDC_STATIC_MESSAGE, m_strMessage);
74    DDX_Text(pDX, IDC_STATIC_PASS, m_strPass);
75    DDX_Text(pDX, IDC_STATIC_PERCENT, m_strPercent);
76    DDX_Text(pDX, IDC_STATIC_PERCENT_TOTAL, m_strPercentTotal);
77    DDX_Text(pDX, IDC_STATIC_TIME, m_strTime);
78    //}}AFX_DATA_MAP
79}
80
81BEGIN_MESSAGE_MAP(CLauncherDlg, CDialog)
82    //{{AFX_MSG_MAP(CLauncherDlg)
83    ON_WM_PAINT()
84    ON_WM_QUERYDRAGICON()
85    ON_WM_DESTROY()
86    //}}AFX_MSG_MAP
87    ON_MESSAGE(WM_ERASERNOTIFY, OnEraserNotify)
88END_MESSAGE_MAP()
89
90/////////////////////////////////////////////////////////////////////////////
91// CLauncherDlg message handlers
92
93BOOL CLauncherDlg::OnInitDialog()
94{
95    CDialog::OnInitDialog();
96
97    // Set the icon for this dialog.  The framework does this automatically
98    //  when the application's main window is not a dialog
99    SetIcon(m_hIcon, TRUE);         // Set big icon
100    SetIcon(m_hIcon, FALSE);        // Set small icon
101
102    m_pcProgress.SetRange(0, 100);
103    m_pcProgress.SetStep(1);
104    m_pcProgress.SetPos(0);
105
106    m_pcProgressTotal.SetRange(0, 100);
107    m_pcProgressTotal.SetStep(1);
108    m_pcProgressTotal.SetPos(0);
109
110    return TRUE;  // return TRUE  unless you set the focus to a control
111}
112
113// If you add a minimize button to your dialog, you will need the code below
114//  to draw the icon.  For MFC applications using the document/view model,
115//  this is automatically done for you by the framework.
116
117void CLauncherDlg::OnPaint()
118{
119    if (IsIconic())
120    {
121        CPaintDC dc(this); // device context for painting
122
123        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
124
125        // Center icon in client rectangle
126        int cxIcon = GetSystemMetrics(SM_CXICON);
127        int cyIcon = GetSystemMetrics(SM_CYICON);
128        CRect rect;
129        GetClientRect(&rect);
130        int x = (rect.Width() - cxIcon + 1) / 2;
131        int y = (rect.Height() - cyIcon + 1) / 2;
132
133        // Draw the icon
134        dc.DrawIcon(x, y, m_hIcon);
135    }
136    else
137    {
138        CDialog::OnPaint();
139    }
140}
141
142// The system calls this to obtain the cursor to display while the user drags
143//  the minimized window.
144HCURSOR CLauncherDlg::OnQueryDragIcon()
145{
146    return (HCURSOR) m_hIcon;
147}
148
149void CLauncherDlg::Options()
150{
151    eraserShowOptions(GetSafeHwnd(), ERASER_PAGE_FILES);
152}
153
154BOOL CLauncherDlg::Erase()
155{
156    BOOL bReturn = FALSE;
157
158    if (eraserError(eraserIsValidContext(m_ehContext)))
159    {
160        if (eraserOK(eraserCreateContextEx(&m_ehContext, convEraseMethod(m_emMethod), m_uPasses, 0)))
161        {
162            if (m_bUseFiles)
163            {
164                VERIFY(eraserOK(eraserSetDataType(m_ehContext, ERASER_DATA_FILES)));
165
166                if (m_bFolders)
167                {
168                    m_strMessage = "Searching...";
169                    UpdateData(FALSE);
170
171                    CString strTemp(m_saFiles[0]);
172                    m_saFiles.RemoveAll();
173
174                    parseDirectory((LPCTSTR)strTemp,
175                                   m_saFiles,
176                                   m_saFolders,
177                                   m_bSubFolders);
178
179                    if (m_bKeepFolder)
180                    {
181                        // remove the last folder from the list
182                        // since the user does not want to remove it
183                        if (m_saFolders.GetSize() > 0)
184                            m_saFolders.SetSize(m_saFolders.GetSize() - 1);
185                    }
186                }
187            }
188            else
189            {
190                VERIFY(eraserOK(eraserSetDataType(m_ehContext, ERASER_DATA_DRIVES)));
191
192                if (m_saFiles[0] == szDiskAll)
193                    GetLocalHardDrives(m_saFiles);
194            }
195
196            int iSize = m_saFiles.GetSize();
197
198            if (iSize > 0)
199            {
200                for (int i = 0; i < iSize; i++)
201                {
202                    VERIFY(eraserOK(eraserAddItem(m_ehContext,
203                        (LPVOID)(LPCTSTR)m_saFiles[i], (E_UINT16)m_saFiles[i].GetLength())));
204                }
205                m_saFiles.RemoveAll();
206
207                // set notification window & message
208                VERIFY(eraserOK(eraserSetWindow(m_ehContext, GetSafeHwnd())));
209                VERIFY(eraserOK(eraserSetWindowMessage(m_ehContext, WM_ERASERNOTIFY)));
210
211                // start erasing (the library will launch a new thread for this)
212                bReturn = eraserOK(eraserStart(m_ehContext));
213            }
214            else
215            {
216                bReturn = TRUE;
217                EraserWipeDone();
218            }
219        }
220    }
221
222    if (!bReturn)
223        DestroyWindow();
224
225    return bReturn;
226}
227
228void CLauncherDlg::OnCancel()
229{
230    m_strMessage = "Terminating...";
231    m_strPercent.Empty();
232    m_strPercentTotal.Empty();
233    m_strPass.Empty();
234    m_strTime.Empty();
235    m_strData.Empty();
236    m_pcProgress.SetPos(0);
237    m_pcProgressTotal.SetPos(0);
238    UpdateData(FALSE);
239
240    GetDlgItem(IDCANCEL)->EnableWindow(FALSE);
241
242    // this will take care of stopping the thread as well
243    eraserDestroyContext(m_ehContext);
244    m_ehContext = ERASER_INVALID_CONTEXT;
245}
246
247LRESULT CLauncherDlg::OnEraserNotify(WPARAM wParam, LPARAM)
248{
249    switch (wParam)
250    {
251    case ERASER_WIPE_BEGIN:
252        EraserWipeBegin();
253        break;
254    case ERASER_WIPE_UPDATE:
255        EraserWipeUpdate();
256        break;
257    case ERASER_WIPE_DONE:
258        EraserWipeDone();
259        break;
260    }
261
262    return TRUE;
263}
264
265BOOL CLauncherDlg::EraserWipeBegin()
266{
267    if (m_bUseFiles)
268    {
269        if (!m_bRecycled)
270            m_strErasing = "Files";
271        else
272            m_strErasing = "Recycle Bin";
273    }
274    else
275        m_strErasing = "Unused disk space";
276
277    TCHAR    szValue[255];
278    E_UINT16 uSize = 255;
279    E_UINT8  uValue = 0;
280
281    // data
282    if (eraserOK(eraserProgGetCurrentDataString(m_ehContext, (LPVOID)szValue, &uSize)))
283        m_strData = szValue;
284    fitFileNameToScrn(GetDlgItem(IDC_STATIC_DATA), m_strData);
285
286    // message
287    if (eraserOK(eraserProgGetMessage(m_ehContext, (LPVOID)szValue, &uSize)))
288        m_strMessage = szValue;
289
290    // progress
291    if (eraserOK(eraserDispFlags(m_ehContext, &uValue)))
292    {
293        if (bitSet(uValue, eraserDispInit))
294        {
295            m_pcProgress.SetPos(0);
296            m_strPercent = "0%";
297        }
298
299        // pass
300        if (!bitSet(uValue, eraserDispPass))
301            m_strPass.Empty();
302
303        // time
304        if (!bitSet(uValue, eraserDispTime))
305            m_strTime.Empty();
306    }
307
308    UpdateData(FALSE);
309
310    return TRUE;
311}
312
313BOOL CLauncherDlg::EraserWipeUpdate()
314{
315    TCHAR    szValue[255];
316    E_UINT16 uSize = 255;
317    E_UINT8  uValue = 0;
318    CString  strPercent, strPercentTotal, strTime, strPass, strMessage;
319
320    // percent
321    if (eraserOK(eraserProgGetPercent(m_ehContext, &uValue)))
322    {
323        strPercent.Format("%u%%", uValue);
324        m_pcProgress.SetPos(uValue);
325    }
326
327    // total percent
328    if (eraserOK(eraserProgGetTotalPercent(m_ehContext, &uValue)))
329    {
330        strPercentTotal.Format("%u%%", uValue);
331        m_pcProgressTotal.SetPos(uValue);
332    }
333
334    // pass
335    if (eraserOK(eraserDispFlags(m_ehContext, &uValue)))
336    {
337        if (bitSet(uValue, eraserDispPass))
338        {
339            E_UINT16 current = 0, passes = 0;
340            if (eraserOK(eraserProgGetCurrentPass(m_ehContext, &current)) &&
341                eraserOK(eraserProgGetPasses(m_ehContext, &passes)))
342            {
343                strPass.Format("%u of %u", current, passes);
344            }
345        }
346
347        // show time?
348        if (bitSet(uValue, eraserDispTime))
349        {
350            // time left
351            E_UINT32 uTimeLeft = 0;
352            if (eraserOK(eraserProgGetTimeLeft(m_ehContext, &uTimeLeft)))
353            {
354                if (uTimeLeft > 120)
355                {
356                    uTimeLeft = (uTimeLeft / 60) + 1;
357                    strTime.Format("%u minutes left", uTimeLeft);
358                }
359                else if (uTimeLeft > 0)
360                {
361                    if (uTimeLeft % 5)
362                        strTime = m_strTime;
363                    else
364                        strTime.Format("%u seconds left", uTimeLeft);
365                }
366            }
367        }
368    }
369
370    // message
371    if (eraserOK(eraserProgGetMessage(m_ehContext, (LPVOID)szValue, &uSize)))
372        strMessage = szValue;
373
374    // update only if necessary to minimize flickering
375    if (m_strPercent != strPercent || m_strPercentTotal != strPercentTotal ||
376        m_strPass != strPass || m_strTime != strTime || m_strMessage != strMessage)
377    {
378        m_strPercent = strPercent;
379        m_strPercentTotal = strPercentTotal;
380        m_strPass = strPass;
381        m_strTime = strTime;
382        m_strMessage = strMessage;
383
384        UpdateData(FALSE);
385    }
386
387    return TRUE;
388}
389
390BOOL CLauncherDlg::EraserWipeDone()
391{
392    // clear display
393    m_strMessage.Empty();
394    m_strPercent.Empty();
395    m_strPercentTotal.Empty();
396    m_strPass.Empty();
397    m_strTime.Empty();
398    m_strData.Empty();
399    m_pcProgress.SetPos(0);
400    m_pcProgressTotal.SetPos(0);
401    UpdateData(FALSE);
402
403    // remove folders
404    int iSize = m_saFolders.GetSize();
405    if (iSize > 0)
406    {
407        for (int i = 0; i < iSize; i++)
408        {
409            if (eraserOK(eraserRemoveFolder((LPVOID)(LPCTSTR)m_saFolders[i],
410                    (E_UINT16)m_saFolders[i].GetLength(), ERASER_REMOVE_FOLDERONLY)))
411            {
412                SHChangeNotify(SHCNE_RMDIR, SHCNF_PATH, (LPCTSTR)m_saFolders[i], NULL);
413            }
414        }
415
416        m_saFolders.RemoveAll();
417    }
418
419    E_UINT8 uTerminated = 0;
420    BOOL bTerminated = eraserOK(eraserTerminated(m_ehContext, &uTerminated)) && uTerminated;
421
422    // empty recycle bin
423    if (!bTerminated && m_bRecycled)
424    {
425        HINSTANCE hShell = AfxLoadLibrary(szShell32);
426
427        if (hShell)
428        {
429            try
430            {
431                SHEMPTYRECYCLEBIN pSHEmptyRecycleBin =
432                    (SHEMPTYRECYCLEBIN)GetProcAddress(hShell, szSHEmptyRecycleBin);
433
434                if (pSHEmptyRecycleBin)
435                    pSHEmptyRecycleBin(NULL, NULL,
436                        SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI | SHERB_NOSOUND );
437            }
438            catch (CException *e)
439            {
440                e->ReportError(MB_ICONERROR);
441                e->Delete();
442            }
443
444            AfxFreeLibrary(hShell);
445        }
446    }
447
448    // show results
449    E_UINT32 uFailed = 0;
450    E_UINT16 uErrors = 0;
451    eraserFailedCount(m_ehContext, &uFailed);
452    eraserErrorStringCount(m_ehContext, &uErrors);
453
454    if (m_bResults && (!m_bResultsOnError || (uFailed > 0 || uErrors > 0)))
455        eraserShowReport(m_ehContext, GetSafeHwnd());
456
457    // and we're done
458    DestroyWindow();
459    return TRUE;
460}
461
462void CLauncherDlg::OnDestroy()
463{
464    // this will take care of stopping the thread if needed
465    eraserDestroyContext(m_ehContext);
466    m_ehContext = ERASER_INVALID_CONTEXT;
467    // shut down
468    CDialog::OnDestroy();
469    PostQuitMessage(0);
470}
Note: See TracBrowser for help on using the repository browser.