FILTER.CPP
//**************************************************************************** 
// 
//  SKIPPY! sample for Microsoft NetMeeting SDK 
// 
//  File:       filter.cpp 
//  Content:    This file contains filter functions. 
// 
//  Copyright (c) Microsoft Corporation 1997 
//  All rights reserved 
// 
//**************************************************************************** 
 
#include "ilstest.h" 
 
void UpdateControls(HWND hwnd, BOOL fEnable); 
void InitFilterDlg(HWND hwnd, PFILTERINFO pfi); 
void GetFilterDlg(HWND hwnd, PFILTERINFO pfi); 
void AddUserStrings(HWND hwnd); 
void AddProtStrings(HWND hwnd); 
 
 
//**************************************************************************** 
// 
// HRESULT CreateFilterDialog(HWND hwnd, FILTER_TYPE fType) 
// 
//**************************************************************************** 
HRESULT CreateFilterDialog(HWND hwnd, FILTER_USAGE fUsage) 
{ 
HRESULT hr = E_FAIL; 
IIlsFilter *pf, *pf1, *pf2; 
BSTR bstrName = NULL; 
 
FILTERINFO fi; 
PFILTERINFO pfi; 
HMENU hMenu; 
 
pfi = &fi; 
pfi->fUsage = fUsage; 
pfi->fType = ILS_FILTERTYPE_SIMPLE; 
 
hMenu = GetMenu(hwnd); 
 
if(DialogBoxParam(ghInstance, MAKEINTRESOURCE(IDD_DLG_FILTER), 
hwnd, (DLGPROC)FilterDlgProc, (LPARAM)pfi) == IDOK) 
{ 
 
if(pfi->fType == ILS_FILTERTYPE_SIMPLE) 
{ 
 
if(!MyIsGoodString(pfi->szValue1)) 
{ 
MyTextOut(TEXT("Filter value is empty - no filter object created\r\n")); 
hr = E_FAIL; 
goto MyExit; 
} 
 
 
MyTextOut(TEXT("Creating simple filter.\r\n")); 
 
// Filter type is simple, create one 
hr = g_pIls->CreateFilter(ILS_FILTERTYPE_SIMPLE, pfi->fOp1, &pf); 
 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIls::CreateFilter fails."), hr); 
goto MyExit; 
}  
 
// Set the attribute name 
// 
hr = pf->SetStandardAttributeName(pfi->attName1); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::SetStandardAttributeName fails."), hr); 
goto MyExit; 
} 
 
// Set the attribute value 
LPTSTR_to_BSTR(&bstrName, pfi->szValue1); 
hr = pf->SetAttributeValue(bstrName); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::SetAttributeValue fails."), hr); 
goto MyExit; 
} 
 
MyTextOut(TEXT("Simple filter created.\r\n")); 
 
} 
else // ILS_FILTERTYPE_COMPOSITE 
{ 
if(!MyIsGoodString(pfi->szValue1) || !MyIsGoodString(pfi->szValue2)) 
{ 
MyTextOut(TEXT("Filter value is empty - no filter object created\r\n")); 
hr = E_FAIL; 
goto MyExit; 
} 
 
MyTextOut(TEXT("Creating composite filter.\r\n")); 
 
// Filter type is composite, create three 
// 
// create first simple 
hr = g_pIls->CreateFilter(ILS_FILTERTYPE_SIMPLE, pfi->fOp1, &pf1); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIls::CreateFilter fails."), hr); 
goto MyExit; 
} 
// Set the first attribute name 
// 
hr = pf1->SetStandardAttributeName(pfi->attName1); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::SetStandardAttributeName fails."), hr); 
goto MyExit; 
} 
 
// Set the first attribute value 
LPTSTR_to_BSTR(&bstrName, pfi->szValue1); 
hr = pf1->SetAttributeValue(bstrName); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::SetAttributeValue fails."), hr); 
goto MyExit; 
} 
 
// create second simple 
hr = g_pIls->CreateFilter(ILS_FILTERTYPE_SIMPLE, pfi->fOp2, &pf2); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIls::CreateFilter fails."), hr); 
goto MyExit; 
} 
 
// Set the second attribute name 
// 
hr = pf2->SetStandardAttributeName(pfi->attName2); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::SetStandardAttributeName fails."), hr); 
goto MyExit; 
} 
 
// Set the second attribute value 
LPTSTR_to_BSTR(&bstrName, pfi->szValue2); 
hr = pf2->SetAttributeValue(bstrName); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::SetAttributeValue fails."), hr); 
goto MyExit; 
} 
 
 
// Create the composite filter 
hr = g_pIls->CreateFilter(ILS_FILTERTYPE_COMPOSITE, pfi->fOpComp, &pf); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIls::CreateFilter fails."), hr); 
goto MyExit; 
} 
 
// add filter one 
hr = pf->AddSubFilter(pf1); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::AddSubFilter fails."), hr); 
goto MyExit; 
} 
 
// add filter two 
hr = pf->AddSubFilter(pf2); 
if(FAILED(hr)) 
{ 
ErrorMessage(hwnd, TEXT("IIlsFilter::AddSubFilter fails."), hr); 
goto MyExit; 
} 
 
MyTextOut(TEXT("Composite filter created.\r\n")); 
 
} 
 
// Set the global filter pointers 
// destroy existing ones, only allow one at a time 
if(fUsage == USERFILTER) 
{ 
if(g_pUserFilter) 
g_pUserFilter->Release(); 
 
g_pUserFilter = pf; 
EnableMenuItem(hMenu, IDM_DESTROY_USERFILTER, MF_BYCOMMAND | MF_ENABLED); 
} 
else if(fUsage == PROTFILTER) 
{ 
if(g_pProtFilter) 
g_pProtFilter->Release(); 
 
g_pProtFilter = pf; 
EnableMenuItem(hMenu, IDM_DESTROY_PROTFILTER, MF_BYCOMMAND | MF_ENABLED); 
} 
else 
ErrorMessage(hwnd, TEXT("filter usage is indeterminate.\r\n"), E_FAIL); 
 
} 
else 
{ 
//User cancelled 
MyTextOut(TEXT("Create Filter cancelled.\r\n")); 
} 
 
MyExit: 
 
// Cleanup 
// 
if(bstrName) 
SysFreeString(bstrName); 
 
return hr; 
} 
 
 
//**************************************************************************** 
// 
// int FilterDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
// 
// This function is the dialog proc that displays the current user objects 
// and returns the chosen item. 
// 
//**************************************************************************** 
int FilterDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
PFILTERINFO pfi; 
 
switch (msg) 
{ 
case WM_INITDIALOG: 
{ 
SetWindowLong (hwnd, DWL_USER, lParam); 
InitFilterDlg(hwnd, (PFILTERINFO)lParam); 
break; 
} 
 
case WM_COMMAND: 
{ 
switch (GET_WM_COMMAND_ID(wParam, lParam)) 
{ 
case IDOK: 
// return the filter info 
pfi = (FILTERINFO *)GetWindowLong(hwnd, DWL_USER); 
GetFilterDlg(hwnd, pfi); 
 
// FALL THROUGH !!! 
// 
case IDCANCEL: 
EndDialog(hwnd, GET_WM_COMMAND_ID(wParam, lParam)); 
break; 
 
case IDC_SIMPLE: 
{ 
// Turn on/off dialog controls 
// 
UpdateControls(hwnd, FALSE); 
break; 
} 
case IDC_COMPOSITE: 
{ 
// Turn on/off dialog controls 
// 
UpdateControls(hwnd, TRUE); 
break; 
} 
 
default: 
break; 
}; 
break; 
} 
 
case WM_ENABLE: 
return 1; 
break; 
 
default: 
break; 
}; 
 
return 0; 
} 
 
 
 
//**************************************************************************** 
// 
// int InitFilterDlg (HWND hwnd, PFILTERINFO pfi) 
// 
//**************************************************************************** 
void InitFilterDlg(HWND hwnd, PFILTERINFO pfi) 
{ 
 
// select the correct radio buttons 
// 
CheckRadioButton( hwnd, IDC_SIMPLE, IDC_COMPOSITE, IDC_SIMPLE); 
CheckRadioButton( hwnd, IDC_OP_EQUAL1, IDC_OP_EXIST1, IDC_OP_EQUAL1); 
CheckRadioButton( hwnd, IDC_OP_EQUAL2, IDC_OP_EXIST2, IDC_OP_EQUAL2); 
CheckRadioButton( hwnd, IDC_AND, IDC_NOT, IDC_AND); 
 
if(pfi->fUsage == USERFILTER) 
{ 
AddUserStrings(GetDlgItem(hwnd, IDC_ATT_LIST1)); 
AddUserStrings(GetDlgItem(hwnd, IDC_ATT_LIST2)); 
} 
else // PROTFILTER 
{ 
AddProtStrings(GetDlgItem(hwnd, IDC_ATT_LIST1)); 
AddProtStrings(GetDlgItem(hwnd, IDC_ATT_LIST2)); 
} 
 
 
// send a message to disable controls 
// 
SendMessage(hwnd, WM_COMMAND, IDC_SIMPLE, 0); 
} 
 
 
//**************************************************************************** 
// 
// int UpdateControls (HWND hwnd, BOOL fEnable) 
// 
//**************************************************************************** 
void UpdateControls(HWND hwnd, BOOL fEnable) 
{ 
EnableWindow(GetDlgItem(hwnd, IDC_COMP_FRAME), fEnable); 
 
EnableWindow(GetDlgItem(hwnd, IDC_AND), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_NOT), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_OR), fEnable); 
 
EnableWindow(GetDlgItem(hwnd, IDC_STD_TXT2), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_ATT_LIST2), fEnable); 
 
EnableWindow(GetDlgItem(hwnd, IDC_ATT_TXT2), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_VALUE2), fEnable); 
 
EnableWindow(GetDlgItem(hwnd, IDC_FIL_OP2), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_OP_EQUAL2), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_OP_APPROX2), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_OP_LESSTHAN2), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_OP_GREATERTHAN2), fEnable); 
EnableWindow(GetDlgItem(hwnd, IDC_OP_EXIST2), fEnable); 
} 
 
//**************************************************************************** 
// 
// int GetFilterDlg(HWND hwnd, PFILTERINFO pfi) 
// 
// Fill in the FILTERINFO structure 
// 
//**************************************************************************** 
void GetFilterDlg(HWND hwnd, PFILTERINFO pfi) 
{ 
TCHAR szTemp[MAX_NAME]; 
HWND hwndCombo; 
 
// Get standard attribute name for first simple filter 
// 
hwndCombo = GetDlgItem(hwnd, IDC_ATT_LIST1); 
pfi->attName1 = (ILS_STD_ATTR_NAME)(SendMessage(hwndCombo, CB_GETCURSEL, 0, 0) + 1); 
 
// Get standard attribute value for first simple filter 
// 
GetDlgItemText(hwnd, IDC_VALUE1, szTemp, MAX_NAME); 
pfi->szValue1 = AllocLPTSTR(lstrlen(szTemp) + 1); 
strcpy(pfi->szValue1, szTemp); 
 
 
// Get standard attribute name for second simple filter 
// 
hwndCombo = GetDlgItem(hwnd, IDC_ATT_LIST2); 
pfi->attName2 = (ILS_STD_ATTR_NAME)(SendMessage(hwnd, CB_GETCURSEL, 0, 0) + 1); 
 
// Get standard attribute value for second simple filter 
// 
GetDlgItemText(hwnd, IDC_VALUE2, szTemp, MAX_NAME); 
pfi->szValue2 = AllocLPTSTR(lstrlen(szTemp) + 1); 
strcpy(pfi->szValue2, szTemp); 
 
 
// some fancy arithmetic to calculate filter operations 
// 
pfi->fOp1 = (ILS_FILTER_OP)((int)ILS_FILTEROP_EQUAL + GetRadioButton(hwnd, IDC_OP_EQUAL1, IDC_OP_EXIST1) - IDC_OP_EQUAL1); 
pfi->fOp2 = (ILS_FILTER_OP)((int)ILS_FILTEROP_EQUAL + GetRadioButton(hwnd, IDC_OP_EQUAL2, IDC_OP_EXIST2) - IDC_OP_EQUAL2); 
 
pfi->fOpComp = (ILS_FILTER_OP)((int)ILS_FILTEROP_AND + GetRadioButton(hwnd, IDC_AND, IDC_NOT) - IDC_AND); 
 
pfi->fType = ((GetRadioButton(hwnd, IDC_SIMPLE, IDC_COMPOSITE) == IDC_SIMPLE) ? ILS_FILTERTYPE_SIMPLE : ILS_FILTERTYPE_COMPOSITE); 
 
} 
 
 
 
//**************************************************************************** 
// 
// void AddUserStrings(HWND hwnd) 
// 
//**************************************************************************** 
void AddUserStrings(HWND hwnd) 
{ 
// Add USER atttibute strings to the combo box 
// 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"USER_ID"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"IP_ADDRESS"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"EMAIL_NAME"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"FIRST_NAME"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"LAST_NAME"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"CITY_NAME"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"COUNTRY_NAME"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"COMMENT"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"FLAGS"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"APP_NAME"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"APP_MIME_TYPE"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"APP_GUID"); 
 
// set default 
SendMessage(hwnd, CB_SETCURSEL, 0, 0); 
 
 
} 
 
 
//**************************************************************************** 
// 
// void AddProtStrings(HWND hwnd) 
// 
//**************************************************************************** 
void AddProtStrings(HWND hwnd) 
{ 
// Add PROTOCOL atttibute strings to the combo box 
// 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"PROTOCOL_NAME"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"PROTOCOL_MIME_TYPE"); 
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)"PROTOCOL_PORT"); 
 
// set default 
SendMessage(hwnd, CB_SETCURSEL, 0, 0); 
 
 
} 
 
 
//**************************************************************************** 
// 
// void DestroyFilter(HWND hwnd, FILTER_TYPE fType) 
// 
//  Free the global filters 
// 
//**************************************************************************** 
HRESULT DestroyFilter(HWND hwnd, FILTER_USAGE fUsage) 
{ 
HMENU hMenu; 
 
hMenu = GetMenu(hwnd); 
 
if(fUsage == USERFILTER) 
{ 
if(g_pUserFilter) 
{ 
g_pUserFilter->Release(); 
g_pUserFilter = NULL; 
EnableMenuItem(hMenu, IDM_DESTROY_USERFILTER, MF_BYCOMMAND | MF_GRAYED); 
MyTextOut(TEXT("User filter destroyed.\r\n")); 
} 
 
} 
else if(fUsage == PROTFILTER) 
{ 
if(g_pProtFilter) 
{ 
g_pProtFilter->Release(); 
g_pProtFilter = NULL; 
EnableMenuItem(hMenu, IDM_DESTROY_PROTFILTER, MF_BYCOMMAND | MF_GRAYED); 
MyTextOut(TEXT("Protocol filter destroyed.\r\n")); 
} 
} 
else 
ErrorMessage(hwnd, TEXT("DestroyFilter: usage is indeterminate.\r\n"), E_FAIL); 
 
return S_OK; 
 
}