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.
 
 
 
 
 
 

1026 lines
28 KiB

///////////////////////////////////////////////////////////////////////////////
//
// AplyRule.cpp
//
///////////////////////////////////////////////////////////////////////////////
#include <pch.hxx>
#include "aplyrule.h"
#include "ruledesc.h"
#include "rulesui.h"
#include "ruleutil.h"
#include "rulesmgr.h"
#include "rule.h"
#include "reutil.h"
#include <rulesdlg.h>
#include <imagelst.h>
#include <newfldr.h>
#include <storutil.h>
#include "shlwapip.h"
#include <xpcomm.h>
#include <demand.h>
// Global data
const static HELPMAP g_rgCtxMapApplyMail[] = {
{idlvRulesApplyList, idhRulesList},
{idcApplyRulesAll, idhApplyRulesAll},
{idcApplyRulesNone, idhApplyRulesNone},
{idredtApplyDescription, idhApplyDescription},
{idcApplyFolder, idhApplyFolder},
{idcBrowseApplyFolder, idhBrowseApplyFolder},
{idcRulesApplySubfolder, idhApplySubfolder},
{idcRulesApply, idhApplyNow},
{0, 0}};
COEApplyRulesUI::~COEApplyRulesUI()
{
RULENODE * prnodeWalk = NULL;
if (NULL != m_pDescriptUI)
{
delete m_pDescriptUI;
}
// Free up any rules
while (NULL != m_prnodeList)
{
prnodeWalk = m_prnodeList;
if (NULL != prnodeWalk->pIRule)
{
prnodeWalk->pIRule->Release();
}
m_prnodeList = m_prnodeList->pNext;
delete prnodeWalk; // MemFree(prnodeWalk);
}
}
HRESULT COEApplyRulesUI::HrInit(HWND hwndOwner, DWORD dwFlags, RULE_TYPE typeRule, RULENODE * prnode, IOERule * pIRuleDef)
{
HRESULT hr = S_OK;
// Check incoming params
if (NULL == hwndOwner)
{
hr = E_INVALIDARG;
goto exit;
}
if (0 != (m_dwState & STATE_INITIALIZED))
{
hr = E_UNEXPECTED;
goto exit;
}
m_hwndOwner = hwndOwner;
m_dwFlags = dwFlags;
m_typeRule = typeRule;
m_pIRuleDef = pIRuleDef;
// Setup the description field
m_pDescriptUI = new CRuleDescriptUI;
if (NULL == m_pDescriptUI)
{
hr = E_OUTOFMEMORY;
goto exit;
}
// We own the list now...
m_prnodeList = prnode;
m_dwState |= STATE_INITIALIZED;
hr = S_OK;
exit:
return hr;
}
HRESULT COEApplyRulesUI::HrShow(VOID)
{
HRESULT hr = S_OK;
int iRet = 0;
if (0 == (m_dwState & STATE_INITIALIZED))
{
hr = E_UNEXPECTED;
goto exit;
}
// We need to load richedit
if (FALSE == FInitRichEdit(TRUE))
{
hr = E_FAIL;
goto exit;
}
iRet = (INT) DialogBoxParam(g_hLocRes, MAKEINTRESOURCE(iddRuleApplyTo),
m_hwndOwner, COEApplyRulesUI::FOEApplyRulesDlgProc,
(LPARAM) this);
if (-1 == iRet)
{
hr = E_FAIL;
goto exit;
}
// Set the proper return code
hr = (IDOK == iRet) ? S_OK : S_FALSE;
exit:
return hr;
}
INT_PTR CALLBACK COEApplyRulesUI::FOEApplyRulesDlgProc(HWND hwndDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fRet = FALSE;
COEApplyRulesUI * pApplyRulesUI = NULL;
HWND hwndRE = 0;
pApplyRulesUI = (COEApplyRulesUI *) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (uiMsg)
{
case WM_INITDIALOG:
// Grab the UI object pointer
pApplyRulesUI = (COEApplyRulesUI *) lParam;
// Set it into the dialog so we can get it back
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LPARAM) pApplyRulesUI);
hwndRE = CreateREInDialogA(hwndDlg, idredtApplyDescription);
if (!hwndRE || (FALSE == pApplyRulesUI->FOnInitDialog(hwndDlg)))
{
EndDialog(hwndDlg, -1);
fRet = TRUE;
goto exit;
}
// We set the focus
fRet = FALSE;
break;
case WM_COMMAND:
fRet = pApplyRulesUI->FOnCommand((UINT) HIWORD(wParam), (INT) LOWORD(wParam), (HWND) lParam);
break;
case WM_DESTROY:
fRet = pApplyRulesUI->FOnDestroy();
break;
case WM_HELP:
case WM_CONTEXTMENU:
fRet = OnContextHelp(hwndDlg, uiMsg, wParam, lParam, g_rgCtxMapApplyMail);
break;
}
exit:
return fRet;
}
///////////////////////////////////////////////////////////////////////////////
//
// FOnInitDialog
//
// This handles the WM_INITDIALOG message for the mail rules UI dialog
//
// hwndDlg - the handle to the dialog window
//
// Returns: TRUE, if it was successfully initialized
// FALSE, otherwise
//
///////////////////////////////////////////////////////////////////////////////
BOOL COEApplyRulesUI::FOnInitDialog(HWND hwndDlg)
{
BOOL fRet = FALSE;
HRESULT hr = S_OK;
TCHAR szRes[CCHMAX_STRINGRES];
FOLDERID idDefault;
FOLDERINFO fldinfo = {0};
BOOL fEnable = FALSE;
IEnumerateFolders * pChildren=NULL;
// Check incoming params
if (NULL == hwndDlg)
{
fRet = FALSE;
goto exit;
}
// If we haven't been initialized yet...
if (0 == (m_dwState & STATE_INITIALIZED))
{
fRet = FALSE;
goto exit;
}
// Save off the dialog window handle
m_hwndDlg = hwndDlg;
// Set the default font onto the dialog
SetIntlFont(m_hwndDlg);
// Save off some of the controls
m_hwndList = GetDlgItem(hwndDlg, idlvRulesApplyList);
m_hwndDescript = GetDlgItem(hwndDlg, idredtApplyDescription);
if ((NULL == m_hwndList) || (NULL == m_hwndDescript))
{
fRet = FALSE;
goto exit;
}
if (FAILED(m_pDescriptUI->HrInit(m_hwndDescript, RDF_READONLY | RDF_APPLYDLG)))
{
fRet = FALSE;
goto exit;
}
// Figure out the default folder to select
if (RULE_TYPE_MAIL == m_typeRule)
{
if (SUCCEEDED(g_pStore->GetSpecialFolderInfo(FOLDERID_LOCAL_STORE, FOLDER_INBOX, &fldinfo)))
{
idDefault = fldinfo.idFolder;
}
else
{
idDefault = FOLDERID_LOCAL_STORE;
}
}
else
{
// Get default news server from accoutn manager
if (FAILED(GetDefaultServerId(ACCT_NEWS, &idDefault)))
{
idDefault = FOLDERID_ROOT;
m_dwState |= STATE_NONEWSACCT;
}
else
{
if ((SUCCEEDED(g_pStore->EnumChildren(idDefault, TRUE, &pChildren))) &&
(S_OK == pChildren->Next(1, &fldinfo, NULL)))
{
idDefault = fldinfo.idFolder;
}
}
}
if (FAILED(InitFolderPickerEdit(GetDlgItem(m_hwndDlg, idcApplyFolder), idDefault)))
{
fRet = FALSE;
goto exit;
}
// What should the default subfolder state be?
fEnable = TRUE;
if ((FOLDERID_ROOT == idDefault) || (FOLDERID_LOCAL_STORE == idDefault) || (0 != (fldinfo.dwFlags & FOLDER_SERVER)))
{
CheckDlgButton(m_hwndDlg, idcRulesApplySubfolder, BST_CHECKED);
fEnable = FALSE;
}
else if (0 == (fldinfo.dwFlags & FOLDER_HASCHILDREN))
{
CheckDlgButton(m_hwndDlg, idcRulesApplySubfolder, BST_UNCHECKED);
fEnable = FALSE;
}
// Should the subfolder button be enabled?
RuleUtil_FEnDisDialogItem(m_hwndDlg, idcRulesApplySubfolder, fEnable);
// Load the list view
fRet = _FLoadListCtrl();
if (FALSE == fRet)
{
goto exit;
}
// Get the proper title string
AthLoadString((RULE_TYPE_MAIL == m_typeRule) ? idsRulesApplyMail : idsRulesApplyNews, szRes, ARRAYSIZE(szRes));
// Set the proper window text
SetWindowText(m_hwndDlg, szRes);
// Note that we've been loaded
m_dwState |= STATE_LOADED;
// Everything's AOK
fRet = TRUE;
exit:
g_pStore->FreeRecord(&fldinfo);
SafeRelease(pChildren);
return fRet;
}
///////////////////////////////////////////////////////////////////////////////
//
// FOnCommand
//
// This handles the WM_COMMAND message for the mail rules UI dialog
//
// Returns: TRUE, if it was successfully handled
// FALSE, otherwise
//
///////////////////////////////////////////////////////////////////////////////
BOOL COEApplyRulesUI::FOnCommand(UINT uiNotify, INT iCtl, HWND hwndCtl)
{
BOOL fRet = FALSE;
FOLDERINFO fldinfo;
HWND hwndFolder = NULL;
FOLDERID idFolder;
BOOL fEnable;
FOLDERDIALOGFLAGS dwFlags = 0;
INT cItems = 0;
INT iSelected = 0;
CHAR rgchTitle[CCHMAX_STRINGRES];
switch (iCtl)
{
case IDCANCEL:
if (FALSE != _FOnClose())
{
EndDialog(m_hwndDlg, IDOK);
fRet = TRUE;
}
break;
case idcBrowseApplyFolder:
if (BN_CLICKED == uiNotify )
{
dwFlags = TREEVIEW_NOIMAP | TREEVIEW_NOHTTP | FD_NONEWFOLDERS;
if (RULE_TYPE_MAIL == m_typeRule)
{
dwFlags |= TREEVIEW_NONEWS;
}
else
{
dwFlags |= TREEVIEW_NOLOCAL;
}
AthLoadString(idsApplyRuleTitle, rgchTitle, sizeof(rgchTitle));
if (SUCCEEDED(PickFolderInEdit(m_hwndDlg, GetDlgItem(m_hwndDlg, idcApplyFolder), dwFlags, rgchTitle, NULL, &idFolder)))
{
if (SUCCEEDED(g_pStore->GetFolderInfo(idFolder, &fldinfo)))
{
if ((0 != (fldinfo.dwFlags & FOLDER_SERVER)) || (FOLDERID_ROOT == fldinfo.idFolder))
{
SendDlgItemMessage(m_hwndDlg, idcRulesApplySubfolder,
BM_SETCHECK, (WPARAM) BST_CHECKED, (LPARAM) 0);
}
else if (0 == (fldinfo.dwFlags & FOLDER_HASCHILDREN))
{
SendDlgItemMessage(m_hwndDlg, idcRulesApplySubfolder,
BM_SETCHECK, (WPARAM) BST_UNCHECKED, (LPARAM) 0);
}
fEnable = (0 != (fldinfo.dwFlags & FOLDER_HASCHILDREN)) &&
(0 == (fldinfo.dwFlags & FOLDER_SERVER)) && (FOLDERID_ROOT != fldinfo.idFolder);
RuleUtil_FEnDisDialogItem(m_hwndDlg, idcRulesApplySubfolder, fEnable);
g_pStore->FreeRecord(&fldinfo);
fRet = TRUE;
}
}
}
break;
case idcRulesApply:
// Check to see if we should handle this
if (0 != (m_dwState & STATE_NONEWSACCT))
{
AthMessageBoxW(m_hwndDlg, MAKEINTRESOURCEW(idsAthena),
MAKEINTRESOURCEW(idsApplyRulesNoNewsFolders), NULL, MB_OK | MB_ICONERROR);
fRet = FALSE;
}
else
{
fRet = _FOnApplyRules();
}
break;
case idcApplyRulesAll:
case idcApplyRulesNone:
if (NULL != m_hwndList)
{
cItems = (INT) SendMessage(m_hwndList, LB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
if (LB_ERR != cItems)
{
fEnable = (idcApplyRulesAll == iCtl);
SendMessage(m_hwndList, LB_SELITEMRANGE, (WPARAM) fEnable, (LPARAM) MAKELPARAM(0, cItems));
// Set the focus on the first item
SendMessage(m_hwndList, LB_SETCARETINDEX, (WPARAM) 0, (LPARAM) MAKELPARAM(FALSE, 0));
// Enable the buttons
_EnableButtons(0);
}
}
break;
case idlvRulesApplyList:
if (LBN_SELCHANGE == uiNotify)
{
iSelected = (INT) SendMessage(hwndCtl, LB_GETCARETINDEX, (WPARAM) 0, (LPARAM) 0);
// Enable the buttons
_EnableButtons(iSelected);
}
break;
}
return fRet;
}
///////////////////////////////////////////////////////////////////////////////
//
// FOnDestroy
//
// This handles the WM_DESTROY message for the mail rules UI dialog
//
// Returns: TRUE, if it was successfully destroyed
// FALSE, otherwise
//
///////////////////////////////////////////////////////////////////////////////
BOOL COEApplyRulesUI::FOnDestroy(VOID)
{
BOOL fRet = FALSE;
INT cRules = 0;
INT iIndex = 0;
DWORD_PTR dwData = 0;
Assert(m_hwndList);
// Get the number of rules in the list view
cRules = (INT) SendMessage(m_hwndList, LB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
if (LB_ERR == cRules)
{
fRet = FALSE;
goto exit;
}
// Release each of the rules from the list view
for (iIndex = 0; iIndex < cRules; iIndex++)
{
// Get the rule interface
dwData = SendMessage(m_hwndList, LB_GETITEMDATA, (WPARAM) iIndex, (LPARAM) 0);
if ((LB_ERR == dwData) || (NULL == dwData))
{
continue;
}
// Release the rule
((IOERule *) (dwData))->Release();
}
exit:
return fRet;
}
BOOL COEApplyRulesUI::_FOnClose(VOID)
{
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//
// _FLoadListCtrl
//
// This loads the list view with the current Mail rules
//
// Returns: TRUE, if it was successfully loaded
// FALSE, otherwise
//
///////////////////////////////////////////////////////////////////////////////
BOOL COEApplyRulesUI::_FLoadListCtrl(VOID)
{
BOOL fRet = FALSE;
HRESULT hr = S_OK;
DWORD dwListIndex = 0;
RULENODE * prnodeWalk = NULL;
INT iDefault = 0;
Assert(NULL != m_hwndList);
// Remove all the items from the list control
SendMessage(m_hwndList, LB_RESETCONTENT, (WPARAM) 0, (LPARAM) 0);
// Add each filter to the list
dwListIndex = 0;
while (NULL != m_prnodeList)
{
// Add rule to the list
if (NULL != m_prnodeList->pIRule)
{
if (FALSE != _FAddRuleToList(dwListIndex, m_prnodeList->pIRule))
{
if (m_pIRuleDef == m_prnodeList->pIRule)
{
iDefault = dwListIndex;
}
dwListIndex++;
}
m_prnodeList->pIRule->Release();
}
prnodeWalk = m_prnodeList;
m_prnodeList = m_prnodeList->pNext;
delete prnodeWalk; // MemFree(prnodeWalk);
}
if (0 != dwListIndex)
{
// Select the default
SendMessage(m_hwndList, LB_SETSEL, (WPARAM) TRUE, (LPARAM) iDefault);
// Set the focus on the item also
SendMessage(m_hwndList, LB_SETCARETINDEX, (WPARAM) iDefault, (LPARAM) MAKELPARAM(FALSE, 0));
}
// Enable the dialog buttons.
_EnableButtons((0 != dwListIndex) ? iDefault : -1);
fRet = TRUE;
return fRet;
}
///////////////////////////////////////////////////////////////////////////////
//
// _FAddRuleToList
//
// This adds the filter passed in to the list view
//
// dwIndex - the index on where to add the filter to into the list
// pIRule - the actual rule
//
// Returns: TRUE, if it was successfully added
// FALSE, otherwise
//
///////////////////////////////////////////////////////////////////////////////
BOOL COEApplyRulesUI::_FAddRuleToList(DWORD dwIndex, IOERule * pIRule)
{
BOOL fRet = FALSE;
HRESULT hr = S_OK;
PROPVARIANT propvar = {0};
Assert(NULL != m_hwndList);
// If there's nothing to do...
if (NULL == pIRule)
{
fRet = FALSE;
goto exit;
}
// Find out the name of the filter
hr = pIRule->GetProp(RULE_PROP_NAME , 0, &propvar);
if (FAILED(hr))
{
fRet = FALSE;
goto exit;
}
// Insert the rule name
dwIndex = (DWORD) SendMessage(m_hwndList, LB_INSERTSTRING, (WPARAM) dwIndex, (LPARAM) propvar.pszVal);
if (LB_ERR == dwIndex)
{
fRet = FALSE;
goto exit;
}
// Set the rule into the item
if (LB_ERR == SendMessage(m_hwndList, LB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) pIRule))
{
fRet = FALSE;
goto exit;
}
// Hold a reference to the rule object
pIRule->AddRef();
fRet = TRUE;
exit:
PropVariantClear(&propvar);
return fRet;
}
///////////////////////////////////////////////////////////////////////////////
//
// _EnableButtons
//
// This enables or disables the buttons in the Mail rules UI dialog
// depending on what is selected.
//
// iSelected - the item that was selected,
// -1 means that nothing was selected
//
// Returns: NONE
//
///////////////////////////////////////////////////////////////////////////////
VOID COEApplyRulesUI::_EnableButtons(INT iSelected)
{
BOOL fRet = FALSE;
INT cRules = 0;
INT cRulesSel = 0;
// How many rules do we have?
cRules = (INT) SendMessage(m_hwndList, LB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
if (LB_ERR == cRules)
{
fRet = TRUE;
goto exit;
}
if (0 != cRules)
{
// How many rules are selected?
cRulesSel = (INT) SendMessage(m_hwndList, LB_GETSELCOUNT, (WPARAM) 0, (LPARAM) 0);
if (LB_ERR == cRulesSel)
{
fRet = TRUE;
goto exit;
}
}
// Load the description field
_LoadRule(iSelected);
// Enable the rule action buttons
RuleUtil_FEnDisDialogItem(m_hwndDlg, idcRulesApply, cRulesSel != 0);
// Enable the selection buttons
RuleUtil_FEnDisDialogItem(m_hwndDlg, idcApplyRulesNone, cRules != 0);
RuleUtil_FEnDisDialogItem(m_hwndDlg, idcApplyRulesAll, cRules != 0);
// Set the return value
fRet = TRUE;
exit:
return;
}
///////////////////////////////////////////////////////////////////////////////
//
// _LoadRule
//
// This loads the selected rule into the description field.
// If there isn't a selected rule, then the description field is cleared.
//
// iSelected - the item that was selected,
// -1 means that nothing was selected
//
// Returns: NONE
//
///////////////////////////////////////////////////////////////////////////////
void COEApplyRulesUI::_LoadRule(INT iSelected)
{
DWORD_PTR dwData = 0;
IOERule * pIRule = NULL;
Assert(NULL != m_hwndList);
Assert(NULL != m_pDescriptUI);
// Grab the rule from the list view
if (-1 != iSelected)
{
dwData = SendMessage(m_hwndList, LB_GETITEMDATA, (WPARAM) iSelected, (LPARAM) 0);
if (LB_ERR != dwData)
{
pIRule = (IOERule *) (dwData);
}
}
// Have the description field load this rule
m_pDescriptUI->HrSetRule(m_typeRule, pIRule);
// Display the new rule
m_pDescriptUI->ShowDescriptionString();
return;
}
///////////////////////////////////////////////////////////////////////////////
//
// FOnApplyTo
//
// This applies the rules into a folder
//
// Returns: NONE
//
///////////////////////////////////////////////////////////////////////////////
BOOL COEApplyRulesUI::_FOnApplyRules(VOID)
{
BOOL fRet = FALSE;
FOLDERID idFolder = 0;
INT cRulesAlloc = 0;
INT * piItems = NULL;
INT cRules = 0;
INT iIndex = 0;
DWORD_PTR dwData = 0;
RULENODE * prnodeList = NULL;
RULENODE * prnodeWalk = NULL;
RULENODE * prnodeNew = NULL;
CExecRules * pExecRules = NULL;
IOEExecRules * pIExecRules = NULL;
RECURSEAPPLY rapply;
DWORD dwFlags;
CProgress * pProgress = NULL;
ULONG cMsgs = 0;
FOLDERINFO infoFolder = {0};
CHAR rgchTmpl[CCHMAX_STRINGRES];
LPSTR pszText = NULL;
HRESULT hr = S_OK;
#ifdef DEBUG
DWORD dwTime = 0;
#endif // DEBUG
Assert(NULL != m_hwndList);
idFolder = _FldIdGetFolderSel();
// Get the count of rules
cRulesAlloc = (INT) SendMessage(m_hwndList, LB_GETSELCOUNT, (WPARAM) 0, (LPARAM) 0);
if (LB_ERR == cRulesAlloc)
{
fRet = FALSE;
goto exit;
}
// Is there anything to do?
if (0 == cRulesAlloc)
{
fRet = TRUE;
goto exit;
}
// Allocate space tp hold the list of items
if (FAILED(HrAlloc((VOID **) &piItems, sizeof(*piItems) * cRulesAlloc)))
{
fRet = FALSE;
goto exit;
}
// Grab the list of items
cRules = (INT) SendMessage(m_hwndList, LB_GETSELITEMS, (WPARAM) cRulesAlloc, (LPARAM) piItems);
if (LB_ERR == cRules)
{
fRet = FALSE;
goto exit;
}
// Grab each of the enabled rules
for (iIndex = 0; iIndex < cRules; iIndex++)
{
// Get the rule from the list
dwData = SendMessage(m_hwndList, LB_GETITEMDATA, (WPARAM) piItems[iIndex], (LPARAM) 0);
if ((LB_ERR == dwData) || (NULL == dwData))
{
continue;
}
// Save the rule
prnodeNew = new RULENODE;
if (NULL == prnodeNew)
{
continue;
}
prnodeNew->pIRule = (IOERule *) dwData;
prnodeNew->pIRule->AddRef();
if (NULL == prnodeWalk)
{
prnodeList = prnodeNew;
prnodeWalk = prnodeList;
}
else
{
prnodeWalk->pNext = prnodeNew;
prnodeWalk = prnodeWalk->pNext;
}
prnodeNew = NULL;
prnodeWalk->pNext = NULL;
}
// If we don't have any rules then just return
if (NULL == prnodeList)
{
fRet = TRUE;
goto exit;
}
// Create the executor object
pExecRules = new CExecRules;
if (NULL == pExecRules)
{
fRet = FALSE;
goto exit;
}
// Initialize it with the list of rules
if (FAILED(pExecRules->_HrInitialize(0, prnodeList)))
{
fRet = FALSE;
goto exit;
}
// Grab the executor interface
if (FAILED(pExecRules->QueryInterface(IID_IOEExecRules, (void **) &pIExecRules)))
{
fRet = FALSE;
goto exit;
}
pExecRules = NULL;
// Apply to rule to the folder
rapply.pIExecRules = pIExecRules;
dwFlags = RECURSE_INCLUDECURRENT;
if (RULE_TYPE_MAIL == m_typeRule)
{
dwFlags |= RECURSE_ONLYLOCAL;
}
else
{
dwFlags |= RECURSE_ONLYNEWS;
}
if (BST_CHECKED == SendDlgItemMessage(m_hwndDlg, idcRulesApplySubfolder, BM_GETCHECK, (WPARAM) 0, (LPARAM) 0))
{
dwFlags |= RECURSE_SUBFOLDERS;
}
if (FAILED(RecurseFolderHierarchy(idFolder, dwFlags, 0, (DWORD_PTR)&cMsgs, (PFNRECURSECALLBACK)RecurseFolderCounts)))
{
fRet = FALSE;
goto exit;
}
pProgress = new CProgress;
if (NULL == pProgress)
{
fRet = FALSE;
goto exit;
}
pProgress->Init(m_hwndDlg, MAKEINTRESOURCE(idsAthena),
MAKEINTRESOURCE(idsApplyingRules), cMsgs, 0, TRUE, FALSE);
// Show the progress dialog
pProgress->Show(0);
rapply.pProgress = pProgress;
rapply.hwndOwner = pProgress->GetHwnd();
#ifdef DEBUG
dwTime = GetTickCount();
#endif // DEBUG
// Set up the timer
hr = RecurseFolderHierarchy(idFolder, dwFlags, 0, (DWORD_PTR) &rapply, (PFNRECURSECALLBACK)_HrRecurseApplyFolder);
#ifdef DEBUG
// Time to Apply Rules
TraceInfo(_MSG("Applying Rules Time: %d Milli-Seconds", GetTickCount() - dwTime));
#endif // DEBUG
// Close the progress window
pProgress->Close();
if (FAILED(hr))
{
fRet = FALSE;
goto exit;
}
// Get the template string
AthLoadString(idsApplyRulesFinished, rgchTmpl, sizeof(rgchTmpl));
// Get the name of the folder
if (SUCCEEDED(g_pStore->GetFolderInfo(idFolder, &infoFolder)))
{
// Allocate space to hold the final string
DWORD cchSize = (sizeof(rgchTmpl) * lstrlen(infoFolder.pszName));
if (SUCCEEDED(HrAlloc((VOID **) &pszText, cchSize * sizeof(*pszText))))
{
// Build up the final string
wnsprintf(pszText, cchSize, rgchTmpl, infoFolder.pszName);
// Show confirmation dialog
AthMessageBox(m_hwndDlg, MAKEINTRESOURCE(idsAthena), pszText, NULL, MB_OK | MB_ICONINFORMATION);
}
}
fRet = TRUE;
exit:
SafeMemFree(pszText);
g_pStore->FreeRecord(&infoFolder);
SafeRelease(pProgress);
SafeRelease(pIExecRules);
if (NULL != pExecRules)
{
delete pExecRules;
}
while (NULL != prnodeList)
{
prnodeWalk = prnodeList;
if (NULL != prnodeWalk->pIRule)
{
prnodeWalk->pIRule->Release();
}
prnodeList = prnodeList->pNext;
delete prnodeWalk; // MemFree(prnodeWalk);
}
if (NULL != prnodeNew)
{
if (NULL != prnodeNew->pIRule)
{
prnodeNew->pIRule->Release();
}
delete prnodeNew; //MemFree(prnodeNew);
}
SafeMemFree(piItems);
if (FALSE == fRet)
{
AthMessageBoxW(m_hwndDlg, MAKEINTRESOURCEW(idsAthena),
MAKEINTRESOURCEW(idsRulesApplyFail), NULL, MB_OK | MB_ICONERROR);
}
return fRet;
}
FOLDERID COEApplyRulesUI::_FldIdGetFolderSel(VOID)
{
return(GetFolderIdFromEdit(GetDlgItem(m_hwndDlg, idcApplyFolder)));
}
// --------------------------------------------------------------------------------
HRESULT COEApplyRulesUI::_HrRecurseApplyFolder(FOLDERINFO * pfldinfo, BOOL fSubFolders,
DWORD cIndent, DWORD_PTR dwpCookie)
{
HRESULT hr = S_OK;
RECURSEAPPLY * prapply = NULL;
IMessageFolder * pFolder = NULL;
prapply = (RECURSEAPPLY *) dwpCookie;
if (NULL == prapply)
{
goto exit;
}
// If not hidden
if ((0 != (pfldinfo->dwFlags & FOLDER_HIDDEN)) || (FOLDERID_ROOT == pfldinfo->idFolder))
{
goto exit;
}
// Not Subscribed
if (0 == (pfldinfo->dwFlags & FOLDER_SUBSCRIBED))
{
goto exit;
}
// Server node
if (0 != (pfldinfo->dwFlags & FOLDER_SERVER))
{
goto exit;
}
hr = g_pStore->OpenFolder(pfldinfo->idFolder, NULL, NOFLAGS, &pFolder);
if (FAILED(hr))
{
goto exit;
}
// Create the struct to insert
hr = RuleUtil_HrApplyRulesToFolder(RULE_APPLY_SHOWUI, (FOLDER_LOCAL != pfldinfo->tyFolder) ? DELETE_MESSAGE_NOTRASHCAN : 0,
prapply->pIExecRules, pFolder, prapply->hwndOwner, prapply->pProgress);
if (FAILED(hr))
{
goto exit;
}
// If the user hit cancel then we're done
if (S_FALSE == hr)
{
hr = E_FAIL;
}
exit:
SafeRelease(pFolder);
return(hr);
}