windows-nt/Source/XPSP1/NT/base/fs/utils/dfrg/dfrgui/postmsgc.cpp
2020-09-26 16:20:57 +08:00

513 lines
17 KiB
C++

//=============================================================================*
// COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
//=============================================================================*
// File: PostMsgC.cpp
//=============================================================================*
// System Include files
#include "stdafx.h"
#ifndef SNAPIN
#ifndef NOWINDOWSH
#include <windows.h>
#endif
#endif
// ESI Common Include files
#include "ErrMacro.h"
extern "C" {
#include "SysStruc.h"
}
#include "DfrgCmn.h"
#include "DfrgEngn.h"
#include "DiskDisp.h"
#include "DfrgUI.h"
#include "DfrgCtl.h"
#include "GetDfrgRes.h"
#include "DataIo.h"
#include "DataIoCl.h"
#include "Graphix.h"
#include "PostMsgC.h"
#include "DlgAnl.h"
#include "DlgDfrg.h"
#include "DfrgRes.h"
#include "VolList.h"
#include "FraggedFileList.h"
/****************************************************************************************************************
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
This routines handles the 're-routed' window posted command messages. The general DataIo (DCOM)
routines that we use would normally call the PostMessage() routine to handle incoming data requests.
But for console applications, there is NO windows application to handle the PostMessage() commands,
so in DataIo.cpp (SetData() routine), it was modified to call a locally define PostMessageConsole()
routine instead if the user defines "ConsoleApplication" at build time.
GLOBAL DATA:
None
INPUT:
hWnd - Handle to the window - always NULL
uMsg - The message.
wParam - The word parameter for the message.
lParam - the long parameter for the message.
Note: These are the same inputs that the WndProc() routine would handle for PostMessage() commands.
RETURN:
TRUE
*/
BOOL
CVolume::PostMessageLocal (
IN HWND hWnd,
IN UINT Msg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
DATA_IO* pDataIo;
switch (LOWORD(wParam)) {
// says that the engine is instantiated, but not defragging or analyzing
case ID_ENGINE_START:
{
Message(TEXT("ID_ENGINE_START"), -1, NULL);
// The engine sends a startup block to identify the volume
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
ENGINE_START_DATA *pEngineStartData = (ENGINE_START_DATA*) &(pDataIo->cData);
EF_ASSERT(pDataIo->ulDataSize == sizeof(ENGINE_START_DATA));
// the engine is running, unlock the buttons
EngineState(ENGINE_STATE_RUNNING);
Locked(FALSE);
m_pVolList->Locked(FALSE);
Paused(FALSE);
StoppedByUser(FALSE);
// make sure the startup volume is the current volume in the UI
EF_ASSERT(!lstrcmp(FileSystem(), pEngineStartData->cFileSystem));
// set the defrag mode to what the engine says
DefragMode(pEngineStartData->dwAnalyzeOrDefrag);
// set the UI buttons for the current state
m_pDfrgCtl->SetButtonState();
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// defrag or analyze has actually started
case ID_BEGIN_SCAN:
{
Message(TEXT("ID_BEGIN_SCAN"), -1, NULL);
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
BEGIN_SCAN_INFO* pScanInfo = (BEGIN_SCAN_INFO*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize == sizeof(BEGIN_SCAN_INFO));
//Make sure the engine agrees which file system it's running on.
EF_ASSERT(!lstrcmp(FileSystem(), pScanInfo->cFileSystem));
// the engine is running, unlock the buttons
EngineState(ENGINE_STATE_RUNNING);
m_pVolList->Locked(FALSE);
Locked(FALSE);
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// user pressed Pause button, engine acknowledges
case ID_PAUSE_ON_SNAPSHOT:
{
Message(TEXT("ID_PAUSE"), -1, NULL);
NOT_DATA* pNotData;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pNotData = (NOT_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(NOT_DATA));
PausedBySnapshot(TRUE);
Paused(TRUE);
Locked(FALSE);
m_pDfrgCtl->SetButtonState();
m_pDfrgCtl->RefreshListViewRow( this );
m_pDfrgCtl->InvalidateGraphicsWindow();
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
case ID_PAUSE:
{
Message(TEXT("ID_PAUSE"), -1, NULL);
NOT_DATA* pNotData;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pNotData = (NOT_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(NOT_DATA));
Paused(TRUE);
Locked(FALSE);
m_pDfrgCtl->SetButtonState();
m_pDfrgCtl->RefreshListViewRow( this );
m_pDfrgCtl->InvalidateGraphicsWindow();
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// user pressed Resume button, engine acknowledges
case ID_CONTINUE:
{
Message(TEXT("ID_CONTINUE"), -1, NULL);
NOT_DATA* pNotData;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pNotData = (NOT_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(NOT_DATA));
Paused(FALSE);
PausedBySnapshot(FALSE);
Locked(FALSE);
m_pDfrgCtl->SetButtonState();
m_pDfrgCtl->RefreshListViewRow( this );
m_pDfrgCtl->InvalidateGraphicsWindow();
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// defrag or analyze has ended
case ID_END_SCAN:
{
BOOL bFragmented = FALSE;
Message(TEXT("ID_END_SCAN"), -1, NULL);
END_SCAN_DATA* pEndScanData;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pEndScanData = (END_SCAN_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(END_SCAN_DATA));
// did the file system somehow magically change?
EF_ASSERT(!lstrcmp(FileSystem(), pEndScanData->cFileSystem));
bFragmented = ((pEndScanData->dwAnalyzeOrDefrag & DEFRAG_FAILED ) ? TRUE: FALSE);
pEndScanData->dwAnalyzeOrDefrag = DWORD(LOWORD(pEndScanData->dwAnalyzeOrDefrag));
// i'm not sure how this could change, but i'll set it anyway
DefragMode(pEndScanData->dwAnalyzeOrDefrag);
// the engine is now idle
EngineState(ENGINE_STATE_IDLE);
// set the progress bar to zero
PercentDone(0,TEXT(""));
// unlock the buttons
Locked(FALSE);
m_pDfrgCtl->InvalidateGraphicsWindow();
m_pDfrgCtl->RefreshListViewRow(this);
#ifdef ESI_PROGRESS_BAR
m_pDfrgCtl->InvalidateProgressBar();
#endif
// Did the user ask it to stop - if so no pop-ups.
if(!StoppedByUser()){
// Note whether this was an analyze or defrag that finished.
switch(DefragMode()) {
case ANALYZE:
RaiseAnalyzeDoneDialog(this);
break;
case DEFRAG:
RaiseDefragDoneDialog(this, bFragmented);
break;
default:
EF_ASSERT(FALSE);
break;
}
}
Paused(FALSE);
m_pDfrgCtl->SetButtonState();
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// engine died
case ID_TERMINATING:
{
Message(TEXT("ID_TERMINATING"), -1, NULL);
NOT_DATA* pNotData;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pNotData = (NOT_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(NOT_DATA));
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
// get rid of the graphics data
Reset();
// was this engine aborted so that it could be restarted?
if(Restart()){
// turn the restart state off
Restart(FALSE);
// send an ANALYZE or DEFRAG message to restart the engine
if (DefragMode() == DEFRAG){
Defragment();
}
else {
Analyze();
}
}
break;
}
// engine error data
case ID_ERROR:
{
ERROR_DATA* pErrorData;
// Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pErrorData = (ERROR_DATA*)&(pDataIo->cData);
// Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(ERROR_DATA));
if (_tcslen(pErrorData->cErrText) > 0) {
VString title(IDS_DK_TITLE, GetDfrgResHandle());
m_pDfrgCtl->MessageBox(pErrorData->cErrText, title.GetBuffer(), MB_OK|MB_ICONSTOP);
}
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// sends the progress bar setting and the status that is
// displayed in the list view
case ID_STATUS:
{
Message(TEXT("ID_STATUS"), -1, NULL);
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
STATUS_DATA *pStatusData = (STATUS_DATA*) &(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize == sizeof(STATUS_DATA));
if (!StoppedByUser()){
//Get the percent dones for the status bar
//acs// Get the Pass we are on.
Pass(pStatusData->dwPass);
// if (PercentDone() != pStatusData->dwPercentDone){
PercentDone(pStatusData->dwPercentDone,pStatusData->vsFileName);
#ifdef ESI_PROGRESS_BAR
m_pDfrgCtl->InvalidateProgressBar();
#endif
// }
if (DefragState() != pStatusData->dwEngineState){
Message(TEXT("DefragState changed"), -1, NULL);
DefragState(pStatusData->dwEngineState);
m_pDfrgCtl->RefreshListViewRow(this);
m_pDfrgCtl->InvalidateGraphicsWindow();
}
}
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// sends the list of most fragged files
case ID_FRAGGED_DATA:{
Message(TEXT("ID_FRAGGED_DATA"), -1, NULL);
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
EF_ASSERT(pDataIo);
PTCHAR pTransferBuffer = &(pDataIo->cData);
// parse the transfer buffer and build the
// fragged file list list in the container
m_FraggedFileList.ParseTransferBuffer(pTransferBuffer);
//Make sure this is a valid size packet.
DWORD transBufSize = m_FraggedFileList.GetTransferBufferSize();
EF_ASSERT(pDataIo->ulDataSize == transBufSize);
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// sends the data displayed in the graphic wells (cluster maps)
case ID_DISP_DATA:
{
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
DISPLAY_DATA* pDispData = (DISPLAY_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(DISPLAY_DATA));
if (!StoppedByUser()){
Message(TEXT("ID_DISP_DATA received analyze data."), -1, NULL);
m_AnalyzeDisplay.SetLineArray(
(char*)&(pDispData->LineArray),
pDispData->dwAnalyzeNumLines);
Message(TEXT("ID_DISP_DATA received defrag data."), -1, NULL);
m_DefragDisplay.SetLineArray(
(char*)((BYTE*)&pDispData->LineArray) + pDispData->dwAnalyzeNumLines,
pDispData->dwDefragNumLines);
//Repaint graphics area
m_pDfrgCtl->InvalidateGraphicsWindow();
}
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
// sends the text data that is displayed on the report
case ID_REPORT_TEXT_DATA:
{
Message(TEXT("ID_REPORT_TEXT_DATA"), -1, NULL);
TEXT_DATA* pTextData = NULL;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pTextData = (TEXT_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(TEXT_DATA));
//Copy over the text display information.
CopyMemory(&m_TextData, pTextData, sizeof(TEXT_DATA));
//Check for not enough disk space
if (!WasFutilityChecked()){
// check futility
if (WarnFutility()){
StoppedByUser(TRUE);
AbortEngine(TRUE); // abort
DefragState(DEFRAG_STATE_NONE); // defrag state is now NONE
Reset();
}
// set futility checked
WasFutilityChecked(TRUE);
}
Message(TEXT("ID_REPORT_TEXT_DATA - end"), -1, NULL);
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
case ID_NO_GRAPHICS_MEMORY:
{
Message(TEXT("ID_NO_GRAPHICS_MEMORY"), -1, NULL);
NOT_DATA* pNotData;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pNotData = (NOT_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(NOT_DATA));
//Set no graphics flag
NoGraphicsMemory(TRUE);
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
case ID_PING:
// Do nothing.
// This is just a ping sent by the engine to make sure the UI is still up.
{
Message(TEXT("ID_PING"), -1, NULL);
NOT_DATA* pNotData;
//Get a pointer to the data sent via DCOM.
pDataIo = (DATA_IO*)GlobalLock((void*)lParam);
pNotData = (NOT_DATA*)&(pDataIo->cData);
//Make sure this is a valid size packet.
EF_ASSERT(pDataIo->ulDataSize >= sizeof(NOT_DATA));
EH_ASSERT(GlobalUnlock((void*)lParam) == FALSE);
EH_ASSERT(GlobalFree((void*)lParam) == NULL);
break;
}
default:
EF_ASSERT(FALSE);
break;
}
return TRUE;
}