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
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);
|
|
}
|
|
|
|
|