Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1164 lines
39 KiB

/*---------------------------------------------------------------------------
File: AgentDetailDlg.cpp
Comments: This dialog shows the status of the agent on a single machine:
It can work in one of 3 ways:
1) COM connection to the running agent on the local machine
2) DCOM connection to a running agent on another machine (this is done
with help from the agent service)
3) For a remote agent that has finished, it can show the final stats,
as recorded in the agent's result file.
(c) Copyright 1999, Mission Critical Software, Inc., All Rights Reserved
Proprietary and confidential to Mission Critical Software, Inc.
REVISION LOG ENTRY
Revision By: Christy Boles
---------------------------------------------------------------------------
*/// AgentDetail.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "DetDlg.h"
#include "Common.hpp"
#include "AgRpcUtl.h"
#include "Monitor.h"
#include "ResStr.h"
//#include "..\AgtSvc\AgSvc.h"
#include "AgSvc.h"
#include "AgSvc_c.c"
//#import "\bin\McsEADCTAgent.tlb" no_namespace , named_guids
//#import "\bin\McsVarSetMin.tlb" no_namespace
//#import "Engine.tlb" no_namespace, named_guids //already #imported via DetDlg.h
#import "VarSet.tlb" no_namespace rename("property", "aproperty")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
HWND gSubWnd = NULL;
BOOL bDetailDone = FALSE;
int detailInterval = 0;
extern BOOL gbCancelled;
TCHAR* GetSystemDirectoryHelper()
{
const DWORD iSize = GetSystemDirectory(NULL, 0);
TCHAR* buffer = NULL;
DWORD dwTemp = 0;
if(iSize == 0)
{
return NULL;
}
buffer = new TCHAR[iSize + _tcslen(__TEXT("\\"))]; // iSize includes the NULL terminiator
if(!buffer)
{
return NULL;
}
dwTemp = GetSystemDirectory(buffer, iSize);
if(dwTemp == 0)
{
if(buffer)
{
delete [] buffer;
return NULL;
}
}
_tcscat(buffer, __TEXT("\\"));
return buffer;
}
/////////////////////////////////////////////////////////////////////////////
// CAgentDetailDlg dialog
CAgentDetailDlg::CAgentDetailDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAgentDetailDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAgentDetailDlg)
m_Current = _T("");
m_Status = _T("");
m_FilesChanged = _T("0");
m_FilesExamined = _T("0");
m_FilesUnchanged = _T("0");
m_DirectoriesChanged = _T("0");
m_DirectoriesExamined = _T("0");
m_DirectoriesUnchanged = _T("0");
m_SharesChanged = _T("0");
m_SharesExamined = _T("0");
m_SharesUnchanged = _T("0");
m_Operation = _T("");
m_RefreshRate = _T("5");
//}}AFX_DATA_INIT
m_DirectoryLabelText.LoadString(IDS_DirectoriesLabel);
m_FilesLabelText.LoadString(IDS_FilesLabel);
m_SharesLabelText.LoadString(IDS_SharesLabel);
m_ChangedLabel.LoadString(IDS_ChangedLabel);
m_ExaminedLabel.LoadString(IDS_ExaminedLabel);
m_UnchangedLabel.LoadString(IDS_UnchangedLabel);
m_pNode = NULL;
detailInterval = _wtoi(m_RefreshRate);
m_bCoInitialized = FALSE;
m_format = 0;
m_AgentAlive = FALSE;
m_StatusUnknown = FALSE;
m_hBinding = 0;
m_pStats = NULL;
m_bGatheringInfo = FALSE;
m_bAutoHide = FALSE;
m_bAutoClose = FALSE;
m_bAlwaysEnableClose = TRUE;
m_LogFileIsValid = TRUE;
}
ULONG __stdcall RefreshThread(void * arg)
{
do {
PostMessage(gSubWnd,DCT_DETAIL_REFRESH,NULL,NULL);
Sleep(detailInterval*1000);
}
while (! bDetailDone);
return 0;
}
void CAgentDetailDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAgentDetailDlg)
DDX_Control(pDX, IDC_STOPAGENT, m_StopAgentButton);
DDX_Control(pDX, IDC_BTNREFRESH, m_RefreshButton);
DDX_Control(pDX, IDC_VIEW_LOG, m_ViewLogButton);
DDX_Control(pDX, IDC_PLUG_IN_RESULTS, m_PlugInButton);
DDX_Control(pDX, IDOK, m_OKButton);
DDX_Control(pDX, IDC_UnchangedLabel, m_UnchangedLabelStatic);
DDX_Control(pDX, IDC_SharesLabel, m_SharesStatic);
DDX_Control(pDX, IDC_FilesLabel, m_FilesStatic);
DDX_Control(pDX, IDC_ExaminedLabel, m_ExaminedStatic);
DDX_Control(pDX, IDC_DirectoriesLabel, m_DirStatic);
DDX_Control(pDX, IDC_ChangedLabel, m_ChangedStatic);
DDX_Text(pDX, IDC_CURRENT, m_Current);
DDX_Text(pDX, IDC_STATUS, m_Status);
DDX_Text(pDX, IDC_FilesChanged, m_FilesChanged);
DDX_Text(pDX, IDC_FilesExamined, m_FilesExamined);
DDX_Text(pDX, IDC_FilesU, m_FilesUnchanged);
DDX_Text(pDX, IDC_DirsChanged, m_DirectoriesChanged);
DDX_Text(pDX, IDC_DirsExamined, m_DirectoriesExamined);
DDX_Text(pDX, IDC_DirsU, m_DirectoriesUnchanged);
DDX_Text(pDX, IDC_SharesChanged, m_SharesChanged);
DDX_Text(pDX, IDC_SharesExamined, m_SharesExamined);
DDX_Text(pDX, IDC_SharesU, m_SharesUnchanged);
DDX_Text(pDX, IDC_DirectoriesLabel, m_DirectoryLabelText);
DDX_Text(pDX, IDC_FilesLabel, m_FilesLabelText);
DDX_Text(pDX, IDC_OPERATION, m_Operation);
DDX_Text(pDX, IDC_SharesLabel, m_SharesLabelText);
DDX_Text(pDX, IDC_ChangedLabel, m_ChangedLabel);
DDX_Text(pDX, IDC_ExaminedLabel, m_ExaminedLabel);
DDX_Text(pDX, IDC_UnchangedLabel, m_UnchangedLabel);
DDX_Text(pDX, IDC_EDIT2, m_RefreshRate);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAgentDetailDlg, CDialog)
//{{AFX_MSG_MAP(CAgentDetailDlg)
ON_WM_NCPAINT()
ON_BN_CLICKED(IDC_BTNREFRESH, OnRefresh)
ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2)
ON_BN_CLICKED(IDC_STOPAGENT, OnStopAgent)
ON_BN_CLICKED(IDC_VIEW_LOG, OnViewLog)
ON_BN_CLICKED(IDC_PLUG_IN_RESULTS, OnPlugInResults)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
ON_MESSAGE(DCT_DETAIL_REFRESH, DoRefresh)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAgentDetailDlg message handlers
BOOL CAgentDetailDlg::OnInitDialog()
{
CDialog::OnInitDialog();
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
m_bCoInitialized = TRUE;
CString title;
if ( m_JobGuid.length() )
{
// connect to local agent
title.LoadString(IDS_PROGRESS_TITLE);
}
else
{
// connect to agent service on remote machine
if ( ! m_pNode )
{
// if not auto closing display message box
if (!m_bAutoClose)
{
CString message;
message.LoadString(IDS_ServerNotFound);
MessageBox(message);
}
OnOK();
}
m_ServerName = m_pNode->GetServer();
title.FormatMessage(IDS_ServerAgentProgressTitle,m_ServerName);
}
SetWindowText(title);
UpdateData(FALSE);
//If not AR operation, set the flag to enable the close button
if (m_format != 1)
m_bAlwaysEnableClose = TRUE;
else
m_bAlwaysEnableClose = FALSE;
switch (m_format)
{
// set the format to -1 to force a change
case -1: m_format = -2; SetupOtherFormat(); break;
case 0: m_format = -2; SetupFSTFormat();break;
case 1: m_format = -2; SetupAcctReplFormat(); break;
case 2: m_format = -2; SetupESTFormat(); break;
};
gSubWnd = m_hWnd;
if ( m_pStats && (m_format>0) )
{
bDetailDone = TRUE;
GetDlgItem(IDC_BTNREFRESH)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
GetDlgItem(IDC_REFRESH_LABEL)->EnableWindow(FALSE);
GetDlgItem(IDC_STOPAGENT)->EnableWindow(FALSE);
m_OKButton.EnableWindow(TRUE);
// the agent has finished, show files, directories, and shares
m_FilesExamined.Format(L"%ld",m_pStats->filesExamined);
m_FilesChanged.Format(L"%ld",m_pStats->filesChanged);
m_FilesUnchanged.Format(L"%ld",m_pStats->filesUnchanged);
m_DirectoriesExamined.Format(L"%ld",m_pStats->directoriesExamined);
m_DirectoriesChanged.Format(L"%ld",m_pStats->directoriesChanged);
m_DirectoriesUnchanged.Format(L"%ld",m_pStats->directoriesUnchanged);
m_SharesExamined.Format(L"%ld",m_pStats->sharesExamined);
m_SharesChanged.Format(L"%ld",m_pStats->sharesChanged);
m_SharesUnchanged.Format(L"%ld",m_pStats->sharesUnchanged);
m_Status.LoadString(IDS_StatusCompleted);
if ( m_PlugInText.GetLength() )
{
//Permanently hide the plug-in button, since our plug-ins
// don't show any useful text
// m_PlugInButton.ShowWindow(SW_SHOW);
}
UpdateData(FALSE);
// if auto closing dialog
if (m_bAutoClose)
{
OnOK();
}
}
else
{
bDetailDone = FALSE;
m_hBinding = NULL;
DWORD threadID;
HANDLE h = CreateThread(NULL,0,&RefreshThread,NULL,0,&threadID);
CloseHandle(h);
//hide the close button until the agent is done or stopped unless the flag is set
//due to running this dialog for account replication
if (m_bAlwaysEnableClose)
m_OKButton.EnableWindow(TRUE);
else
m_OKButton.EnableWindow(FALSE);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
DWORD
DoRpcQuery(
HANDLE hBinding, // in - handle to RPC binding
LPUNKNOWN * ppUnk // out- pointer to remote agent COM object
)
{
DWORD rc = 0;
RpcTryExcept
{
rc = EaxcQueryInterface(hBinding,ppUnk);
}
RpcExcept(1)
{
rc = RpcExceptionCode();
}
RpcEndExcept
if ( rc )
{
(*ppUnk ) = NULL;
}
return rc;
}
void CAgentDetailDlg::SetupAcctReplFormat()
{
// Changes the labels to reflect pertinent information when copying accounts
UpdateData(TRUE);
if ( m_format != 1 )
{
m_ChangedLabel.LoadString(IDS_AccountCopiedLabel);
m_UnchangedLabel.LoadString(IDS_AccountErrorsLabel);
m_FilesLabelText.LoadString(IDS_AccountUsersLabel);
m_DirectoryLabelText.LoadString(IDS_AccountGroupsLabel);
m_SharesLabelText.LoadString(IDS_AccountComputersLabel);
m_format = 1;
}
UpdateData(FALSE);
}
void CAgentDetailDlg::SetupFSTFormat()
{
// Changes the labels to reflect pertinent information when translating security
UpdateData(TRUE);
if ( m_format != 0 )
{
if ( m_bGatheringInfo )
{
m_ChangedLabel.LoadString(IDS_Affected);
m_UnchangedLabel.LoadString(IDS_Unaffected);
}
else
{
m_ChangedLabel.LoadString(IDS_ChangedLabel);
m_UnchangedLabel.LoadString(IDS_UnchangedLabel);
}
m_FilesLabelText.LoadString(IDS_FilesLabel);
m_DirectoryLabelText.LoadString(IDS_DirectoriesLabel);
m_SharesLabelText.LoadString(IDS_SharesLabel);
m_format = 0;
}
UpdateData(FALSE);
}
void CAgentDetailDlg::SetupESTFormat()
{
// Changes the labels to reflect pertinent information when translating exchange security
UpdateData(TRUE);
if ( m_format != 2 )
{
m_ChangedLabel.LoadString(IDS_ChangedLabel);
m_UnchangedLabel.LoadString(IDS_UnchangedLabel);
m_FilesLabelText.LoadString(IDS_MailboxesLabel);
m_DirectoryLabelText.Empty();
m_SharesLabelText.Empty();
m_format = 2;
}
UpdateData(FALSE);
}
void CAgentDetailDlg::SetupOtherFormat()
{
// Changes the labels to reflect pertinent information when translating exchange security
UpdateData(TRUE);
if ( m_format != -1 )
{
m_ExaminedLabel.Empty();
m_ChangedLabel.Empty();
m_UnchangedLabel.Empty();
m_FilesLabelText.Empty();
m_DirectoryLabelText.Empty();
m_SharesLabelText.Empty();
m_FilesExamined.Empty();
m_DirectoriesExamined.Empty();
m_SharesExamined.Empty();
m_FilesChanged.Empty();
m_DirectoriesChanged.Empty();
m_SharesChanged.Empty();
m_FilesUnchanged.Empty();
m_DirectoriesUnchanged.Empty();
m_SharesUnchanged.Empty();
m_format = -1;
}
UpdateData(FALSE);
}
void CAgentDetailDlg::OnRefresh()
{
DWORD rc = 0;
HRESULT hr = S_OK;
WCHAR * sBinding = NULL;
IUnknown * pUnk = NULL;
IVarSetPtr pVarSet;
_bstr_t jobID;
if (m_bCoInitialized)
{
try {
if ( m_pNode )
{
jobID = m_pNode->GetJobID();
}
else
{
jobID = m_JobGuid;
}
m_AgentAlive = FALSE;
m_StatusUnknown = FALSE;
UpdateData(TRUE);
if ( m_pAgent == NULL )
{
if ( m_pNode )
{
WCHAR server[MAX_PATH];
server[0] = L'\\';
server[1] = L'\\';
UStrCpy(server+2,m_pNode->GetServer());
rc = EaxBindCreate(server,&m_hBinding,&sBinding,TRUE);
if ( ! rc )
{
pUnk = NULL;
rc = DoRpcQuery(m_hBinding,&pUnk);
if ( (!rc) && pUnk )
{
try {
m_pAgent = pUnk;
}
catch(_com_error * e)
{
m_StatusUnknown = TRUE;
// if not auto closing display message box
if (!m_bAutoClose)
{
MessageBox(e->Description());
}
}
catch(...)
{
pUnk = NULL;
}
if ( pUnk )
pUnk->Release();
}
else
{
if ( rc == RPC_S_SERVER_UNAVAILABLE )
{
m_Status.LoadString(IDS_AgentNotRunning);
}
else if ( rc == E_NOTIMPL )
{
m_StatusUnknown = TRUE;
m_Status.LoadString(IDS_CantMonitorOnNt351);
}
else
{
m_StatusUnknown = TRUE;
m_Status.LoadString(IDS_CannotConnectToAgent);
}
}
}
else
{
m_StatusUnknown = TRUE;
m_Status.LoadString(IDS_RPCBindFailed);
}
if ( m_StatusUnknown || rc )
{
// if we couldn't connect to the agent, check to see if there is a result file
// we can get our data from instead
BOOL bNoMoreRefresh = FALSE;
if (m_pNode->HasFailed() && !m_pNode->IsInstalled())
{
bNoMoreRefresh = TRUE;
m_Status.LoadString(IDS_Status_InstallFailed);
UpdateData(FALSE);
}
else if (m_pNode->IsInstalled() && m_pNode->HasFailed())
{
bNoMoreRefresh = TRUE;
m_Status.LoadString(IDS_Status_DidNotStart);
UpdateData(FALSE);
}
else if (m_pNode->IsFinished() && *m_pNode->GetJobFile() && m_pNode->IsResultPullingTried()
&& m_pNode->HasResult())
{
DetailStats detailStats;
WCHAR directory[MAX_PATH];
WCHAR filename[MAX_PATH];
CString plugInText;
gData.GetResultDir(directory);
memset(&detailStats,0,(sizeof detailStats));
swprintf(filename,GET_STRING(IDS_AgentResultFileFmt),m_pNode->GetJobFile());
if ( ReadResults(m_pNode,directory,filename,&detailStats,plugInText,FALSE) )
{
SetStats(&detailStats);
SetPlugInText(plugInText);
SetLogFile(m_pNode->GetLogPath());
SetLogFileValid(m_pNode->GetLogPathValid());
bNoMoreRefresh = TRUE;
// the agent has finished, show files, directories, and shares
if (m_format != -1)
{
m_FilesExamined.Format(L"%ld",m_pStats->filesExamined);
m_FilesChanged.Format(L"%ld",m_pStats->filesChanged);
m_FilesUnchanged.Format(L"%ld",m_pStats->filesUnchanged);
m_DirectoriesExamined.Format(L"%ld",m_pStats->directoriesExamined);
m_DirectoriesChanged.Format(L"%ld",m_pStats->directoriesChanged);
m_DirectoriesUnchanged.Format(L"%ld",m_pStats->directoriesUnchanged);
m_SharesExamined.Format(L"%ld",m_pStats->sharesExamined);
m_SharesChanged.Format(L"%ld",m_pStats->sharesChanged);
m_SharesUnchanged.Format(L"%ld",m_pStats->sharesUnchanged);
}
m_Status.LoadString(IDS_StatusCompleted);
if ( m_PlugInText.GetLength() )
{
// Permanently hide the plug-in button, because our plug-ins don't
// show any useful text.
// m_PlugInButton.ShowWindow(SW_SHOW);
}
UpdateData(FALSE);
}
}
else if (m_pNode->IsDoneMonitoring()) // we should let the main monitoring thread
// do the job
{
// if we have result, use the last logic
if (!m_pNode->HasResult())
{
bNoMoreRefresh = TRUE;
if (m_pNode->QueryFailed())
m_Status.LoadString(IDS_Status_Unknown);
else
m_Status = GET_WSTR(IDS_DCT_Status_Completed_With_Errors);
UpdateData(FALSE);
}
}
if (bNoMoreRefresh)
{
bDetailDone = TRUE;
GetDlgItem(IDC_BTNREFRESH)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
GetDlgItem(IDC_REFRESH_LABEL)->EnableWindow(FALSE);
GetDlgItem(IDC_STOPAGENT)->EnableWindow(FALSE);
}
}
}
else
{
hr = m_pAgent.GetActiveObject(CLSID_DCTAgent);
if ( FAILED(hr) )
{
if ( hr == MK_E_UNAVAILABLE )
{
m_Status.LoadString(IDS_AgentNotRunning);
}
else
{
m_Status.FormatMessage(IDS_NoActiveAgent,hr);
}
}
}
}
if ( m_pAgent != NULL )
{
hr = m_pAgent->raw_QueryJobStatus(jobID,&pUnk);
if ( SUCCEEDED(hr) && pUnk )
{
m_AgentAlive = TRUE;
pVarSet = pUnk;
pUnk->Release();
_bstr_t text = pVarSet->get(GET_BSTR(DCTVS_JobStatus));
m_Status = (LPCWSTR)text;
text = pVarSet->get(GET_BSTR(DCTVS_CurrentPath));
m_Current = (LPCWSTR)text;
text = pVarSet->get(GET_BSTR(DCTVS_CurrentOperation));
m_Operation = (LPCWSTR)text;
// Get the stats
LONG num1,num2,num3,num4;
UpdateData(FALSE);
if ( !UStrICmp(m_Operation,GET_STRING(IDS_ACCT_REPL_OPERATION_TEXT)) )
{
// Set up the labels for account replication
SetupAcctReplFormat();
}
else if ( !UStrICmp(m_Operation,GET_STRING(IDS_FST_OPERATION_TEXT)) )
{
SetupFSTFormat();
}
else if ( ! UStrICmp(m_Operation,GET_STRING(IDS_EST_OPERATION_TEXT)) )
{
SetupESTFormat();
}
else
{
if ( m_Current.GetLength() &&
( _wtoi(m_FilesExamined) + _wtoi(m_DirectoriesExamined) + _wtoi(m_SharesExamined)) == 0 )
{
// unless some stats have already been collected, hide the stats, if the operation
// is not one that we have detailed stats for.
SetupOtherFormat();
}
}
switch ( m_format )
{
case 0: // FST
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Files_Examined));
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Files_Changed));
m_FilesExamined.Format(L"%ld",num1);
if ( ! m_bGatheringInfo )
{
m_FilesChanged.Format(L"%ld",num2);
m_FilesUnchanged.Format(L"%ld",num1-num2);
}
else
{
m_FilesChanged.Empty();
m_FilesUnchanged.Empty();
}
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Directories_Examined));
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Directories_Changed));
m_DirectoriesExamined.Format(L"%ld",num1);
if ( ! m_bGatheringInfo )
{
m_DirectoriesChanged.Format(L"%ld",num2);
m_DirectoriesUnchanged.Format(L"%ld",num1-num2);
}
else
{
m_DirectoriesChanged.Empty();
m_DirectoriesUnchanged.Empty();
}
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Shares_Examined));
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Shares_Changed));
m_SharesExamined.Format(L"%ld",num1);
if ( ! m_bGatheringInfo )
{
m_SharesChanged.Format(L"%ld",num2);
m_SharesUnchanged.Format(L"%ld",num1-num2);
}
else
{
m_SharesChanged.Empty();
m_SharesUnchanged.Empty();
}
break;
case 1: // AcctRepl
// files = user accounts
// dirs = global groups + local groups
// shares = computer accounts
// examined = processed
// changed = created + replaced
// unchanged = errors
// User stats
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Examined));
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Created));
num3 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Replaced));
num4 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Errors));
m_FilesExamined.Format(L"%ld",num1);
m_FilesChanged.Format(L"%ld",num2+num3);
m_FilesUnchanged.Format(L"%ld",num4);
// Global group stats
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Examined));
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Created));
num3 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Replaced));
num4 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Errors));
// local group stats
LONG num5, num6,num7, num8;
num5 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Examined));
num6 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Created));
num7 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Replaced));
num8 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Errors));
m_DirectoriesExamined.Format(L"%ld",num1 + num5);
m_DirectoriesChanged.Format(L"%ld",num2+num3 + num6+num7);
m_DirectoriesUnchanged.Format(L"%ld",num4 + num8);
// computer account stats
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Examined));
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Created));
num3 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Replaced));
num4 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Errors));
m_SharesExamined.Format(L"%ld",num1);
m_SharesChanged.Format(L"%ld",num2+num3);
m_SharesUnchanged.Format(L"%ld",num4);
break;
case 2: // EST
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Mailboxes_Examined));
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Mailboxes_Changed));
m_FilesExamined.Format(L"%ld",num1);
m_FilesChanged.Format(L"%ld",num2);
m_FilesUnchanged.Format(L"%ld",num1-num2);
// since we are not doing anything with containers
// we empty those field as well
m_DirectoriesExamined.Empty();
m_DirectoriesChanged.Empty();
m_DirectoriesUnchanged.Empty();
m_SharesExamined.Empty();
m_SharesChanged.Empty();
m_SharesUnchanged.Empty();
break;
case -1: // default (empty)
m_FilesExamined.Empty();
m_FilesChanged.Empty();
m_FilesUnchanged.Empty();
m_DirectoriesExamined.Empty();
m_DirectoriesChanged.Empty();
m_DirectoriesUnchanged.Empty();
m_SharesExamined.Empty();
m_SharesChanged.Empty();
m_SharesUnchanged.Empty();
break;
}
}
else
{
if ( hr == DISP_E_UNKNOWNNAME )
{
m_StatusUnknown = TRUE;
m_Status.FormatMessage(IDS_AgentJobNotFound,(WCHAR*)jobID);
}
else if ( hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE) )
{
if (m_pNode && m_pNode->IsJoinDomainWithRename())
{
m_pAgent = NULL; // this way, we will use the logic for m_pAgent == NULL
}
else
m_Status.LoadString(IDS_AgentNoLongerRunning);
}
else
{
m_StatusUnknown = TRUE;
m_Status.FormatMessage(IDS_QueryJobStatusFailed,hr);
}
}
}
}
catch ( ... )
{
m_StatusUnknown = TRUE;
m_Status.FormatMessage(IDS_ExceptionConnectingToAgent);
//m_Current = step;
}
}
if ( m_PlugInText.GetLength() )
{
// permanently hide the plug-in button, because our plug-ins
// don't show any useful text
//m_PlugInButton.ShowWindow(SW_SHOW);
}
//get the job log file when agent is done
if ((!m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
&& (m_pNode))
{
SetLogFile(m_pNode->GetLogPath());
SetLogFileValid(m_pNode->GetLogPathValid());
}
if ( m_LogFile.GetLength() )
{
m_ViewLogButton.ShowWindow(SW_SHOW);
if ( ! m_AgentAlive || !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
{
m_ViewLogButton.EnableWindow(TRUE);
}
else
{
m_ViewLogButton.EnableWindow(FALSE);
}
}
else
{
m_ViewLogButton.ShowWindow(SW_HIDE);
}
if ( ! m_AgentAlive || !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
{
// Disable the refresh button when the status changes to Completed.
if ( !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
{
if ( GetDefID() == IDC_BTNREFRESH )
{
SetDefID(IDOK);
}
m_RefreshButton.EnableWindow(FALSE);
}
// disable the stop agent button any time the agent is not running
m_StopAgentButton.EnableWindow(FALSE);
//enable the close button any time the agent is not running
m_OKButton.EnableWindow(TRUE);
// if auto closing dialog
if (m_bAutoClose)
{
OnOK();
}
}
else
{
// enable the refresh and stop agent buttons when the agent is alive and running
m_RefreshButton.EnableWindow(TRUE);
m_StopAgentButton.EnableWindow(TRUE);
}
UpdateData(FALSE);
}
void CAgentDetailDlg::OnOK()
{
UpdateData(TRUE);
if (!m_bAutoClose)
{
CString str;
CString title;
str = GET_STRING(IDS_DCT_Status_InProgress);
title.LoadString(IDS_MessageTitle);
if ( ! m_hBinding ) // only show the warning for the local agent
{
if ( str == m_Status )
{
str.LoadString(IDS_CannotCloseWhileAgentIsRunning);
MessageBox(str,title,MB_ICONHAND | MB_OK);
return;
}
}
}
bDetailDone = TRUE;
if ( m_pAgent )
{
m_pAgent = NULL;
}
if (m_bCoInitialized)
{
CoUninitialize();
m_bCoInitialized = FALSE;
}
CDialog::OnOK();
}
void CAgentDetailDlg::OnChangeEdit2()
{
UpdateData(TRUE);
detailInterval = _wtoi(m_RefreshRate);
if ( detailInterval <= 0 )
{
detailInterval = 1;
}
}
LRESULT CAgentDetailDlg::DoRefresh(UINT nID, long x)
{
OnRefresh();
return 0;
}
void CAgentDetailDlg::OnStopAgent()
{
DWORD rc = 0;
HRESULT hr = S_OK;
CString message;
CString title;
if (!m_bCoInitialized)
return;
title.LoadString(IDS_MessageTitle);
if ( m_hBinding )
{
message.LoadString(IDS_ConfirmStopAgent);
if ( MessageBox(message,title,MB_ICONQUESTION | MB_YESNO) == IDYES )
{
_bstr_t jobID = m_pNode->GetJobID();
if ( m_pAgent )
{
hr = m_pAgent->raw_CancelJob(jobID);
m_pAgent = NULL;
}
else
{
message.LoadString(IDS_AgentNotRunning);
MessageBox(message,NULL,MB_OK);
}
if ( FAILED(hr) )
{
message.FormatMessage(IDS_CancelJobFailed,hr);
MessageBox(message,NULL,MB_ICONERROR | MB_OK);
}
if ( rc )
{
message.FormatMessage(IDS_StopAgentFailed,rc);
MessageBox(message,NULL,MB_ICONERROR|MB_OK);
}
if ( SUCCEEDED(hr) && !rc )
{
OnOK();
}
}
}
else
{
// Local agent here
if ( m_pAgent )
{
message.LoadString(IDS_ConfirmCancelJob);
if ( MessageBox(message,NULL,MB_ICONQUESTION | MB_YESNO) == IDYES )
{
hr = m_pAgent->raw_CancelJob(m_JobGuid);
if ( FAILED(hr) )
{
message.FormatMessage(IDS_StopAgentFailedHexResult,hr);
MessageBox(message,NULL,MB_ICONERROR | MB_OK);
}
else
{
gbCancelled = TRUE;
}
}
}
else
{
// TODO:error message
}
}
}
void CAgentDetailDlg::OnViewLog()
{
UpdateData(TRUE);
if ( ! m_LogFile.IsEmpty() )
{
if (m_LogFileIsValid)
{
// Launch the logfile
CString cmd;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo;
TCHAR* pszSystemDirectoryName = NULL;
CString message;
CString title;
pszSystemDirectoryName = GetSystemDirectoryHelper();
if(!pszSystemDirectoryName)
{
// we could not get the system directory name, we should bail out, otherwise we might launch
// malicious process
title.LoadString(IDS_MessageTitle);
message.LoadString(IDS_LaunchNotePadFailed);
MessageBox(message, title, MB_ICONERROR | MB_OK);
return;
}
memset(&startupInfo,0,(sizeof startupInfo));
startupInfo.cb = (sizeof startupInfo);
cmd.FormatMessage(IDS_NotepadCommandLine,pszSystemDirectoryName,m_LogFile);
delete [] pszSystemDirectoryName;
CreateProcess(NULL,cmd.GetBuffer(0),NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo);
}
else
{
CString title;
CString message;
title.LoadString(IDS_MessageTitle);
message.FormatMessage(IDS_LogfileIsInvalid,m_LogFile,m_ServerName);
MessageBox(message,title,MB_ICONERROR | MB_OK);
}
}
}
void CAgentDetailDlg::OnPlugInResults()
{
UpdateData(TRUE);
MessageBox(m_PlugInText);
}
void CAgentDetailDlg::OnClose()
{
UpdateData(TRUE);
CString str;
CString title;
str = GET_STRING(IDS_DCT_Status_InProgress);
title.LoadString(IDS_MessageTitle);
if ( ! m_hBinding ) // only show the warning for the local agent
{
if ( str == m_Status )
{
str.LoadString(IDS_ConfirmCloseWhileAgentIsRunning);
if ( IDYES != MessageBox(str,title,MB_ICONQUESTION | MB_YESNO) )
return;
}
}
bDetailDone = TRUE;
if ( m_pAgent )
{
m_pAgent = NULL;
}
if (m_bCoInitialized)
{
CoUninitialize();
m_bCoInitialized = FALSE;
}
CDialog::OnClose();
}
BOOL CAgentDetailDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
TRACE(L"Command(%lx,%lx)\n",wParam,lParam);
if ( wParam == WM_DESTROY )
{
CString str;
CString title;
CString str2;
str = GET_STRING(IDS_DCT_Status_InProgress);
str2 = GET_STRING(IDS_DCT_Status_NotStarted);
title.LoadString(IDS_MessageTitle);
if ( ! m_hBinding ) // only show the warning for the local agent
{
if ( str == m_Status )
{
str.LoadString(IDS_ConfirmCloseWhileAgentIsRunning);
if ( IDYES != MessageBox(str,title,MB_ICONQUESTION | MB_YESNO) )
return 0;
}
}
bDetailDone = TRUE;
if ( m_pAgent )
{
m_pAgent = NULL;
}
if (m_bCoInitialized)
{
CoUninitialize();
m_bCoInitialized = FALSE;
}
return CDialog::OnCommand(wParam, lParam);
}
else
{
return CDialog::OnCommand(wParam, lParam);
}
}
// OnNcPaint Handler
//
// This handler is being overridden to handle hiding of the dialog.
// This prevents initial painting of the dialog which causes a flash
// if the dialog is hidden after this message. This is the first message
// where the dialog can be hidden. Trying to hide the dialog before this
// point gets overridden.
void CAgentDetailDlg::OnNcPaint()
{
if (m_bAutoHide)
{
if (IsWindowVisible())
{
ShowWindow(SW_HIDE);
}
}
else
{
CDialog::OnNcPaint();
}
}