// -----------------------------------------------------------------------------
// prpLstCb.cpp: Implements methods for the Queue Viewer's List box and Combo Box.
//
// Copyright (C) Microsoft Corp. 1986-1996. All Rights Reserved.
// -----------------------------------------------------------------------------
#include "edkafx.h"
#include "prplstcb.h"
#include "helpers.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
// $--CProps::CProps()----------------------------------------------------------
// CONSTRUCTOR
// -----------------------------------------------------------------------------
CProps::CProps( ULONG cbEID, BYTE* pEID, DWORD dwFlags)
{
m_cbEID = cbEID;
if( m_cbEID == 0)
m_pEID = NULL;
else
{
m_pEID = new BYTE[ m_cbEID];
memcpy( m_pEID, pEID, m_cbEID);
}
m_dwFlags = dwFlags;
}
// $--CProps::~CProps()---------------------------------------------------------
// DESTRUCTOR
// -----------------------------------------------------------------------------
CProps::~CProps()
{
if( m_pEID)
delete [] m_pEID;
}
// $--CPropsListBox::CPropsListBox()------------------------------------------------
// CONSTRUCTOR
// -----------------------------------------------------------------------------
CPropsListBox::CPropsListBox()
{
static SizedSPropTagArray(5L,sPropColumns) = { 5L, {PR_GW_ADMIN_OPERATIONS, PR_ENTRYID, PR_ORIGINATOR_NAME, PR_SUBJECT, PR_MESSAGE_SIZE}};
static SizedSSortOrderSet(1L,sSortPrioSet) = { 1L, 0L, 0L, { PR_CLIENT_SUBMIT_TIME, TABLE_SORT_ASCEND}};
m_psPropColumns = (LPSPropTagArray) &sPropColumns;
m_psSortPrioSet = (LPSSortOrderSet) &sSortPrioSet;
}
// $--CPropsListBox::HrAddItem()--------------------------------------------------
// This virtual member function is called from HrFillBox(). It extracts the
// properties from pProps into useable objects, formats them, and then add them
// to the list box.
// -----------------------------------------------------------------------------
HRESULT CPropsListBox::HrAddItem( // Returns HRESULT
CProperty& Properties) // Ptr to properties of EID, sender, subject, & size.
{
CString sFlags;
if( !m_pProps)
sFlags = "\t\t";
else
{
if( m_pProps->bIsDelete())
sFlags += "d";
if( m_pProps->bIsNDR())
sFlags += "\tn\t";
else
sFlags += "\t\t";
}
// Take only the mailbox name of the sender distinguished name.
CString sSenderName = Properties.szGetPrValue();
sSenderName.MakeLower();
CHAR szStrToFind[] = "/cn=recipients/cn=";
int ii = sSenderName.Find( szStrToFind);
sSenderName = Properties.szGetPrValue();
if( ii > 0)
// Take only the name.
sSenderName = sSenderName.Mid( ii + sizeof( szStrToFind) - 1);
// Subject.
Properties.Next();
CString sSubject = Properties.szGetPrValue();
// Size.
Properties.Next();
CString sSize = Properties.szGetPrValue();
// Display the originator, subject, and size by adding to list box.
CString sBuffer;
sBuffer.Format( "%s%-.12s\t%-.42s\t%.14s", sFlags.GetBuffer(0), sSenderName.GetBuffer(0),
sSubject.GetBuffer(0), sSize.GetBuffer(0));
AddString( sBuffer);
return( NOERROR);
}
// $--CPropsComboBox::CPropsComboBox()------------------------------------------
// CONSTRUCTOR
// -----------------------------------------------------------------------------
CPropsComboBox::CPropsComboBox() : m_sCurFolderName( TEXT("MTS-OUT"))
{
static SizedSPropTagArray(4L,sPropColumns) = { 4L, {PR_GW_ADMIN_OPERATIONS, PR_ENTRYID, PR_DISPLAY_NAME, PR_CONTENT_COUNT}};
static SizedSSortOrderSet(1L,sSortPrioSet) = { 1L, 0L, 0L, { PR_DISPLAY_NAME, TABLE_SORT_ASCEND}};
m_psPropColumns = (LPSPropTagArray) &sPropColumns;
m_psSortPrioSet = (LPSSortOrderSet) &sSortPrioSet;
m_iFolder = -1;
m_pFolder = NULL;
m_pMDB = NULL;
}
// $--CPropsComboBox::HrInitialize()----------------------------------------------
// Find all folders and open default folder.
// -----------------------------------------------------------------------------
HRESULT CPropsComboBox::HrInitialize(
LPMDB pMDB) // Ptr to MDB that contain gateway folders.
{
DEBUGPUBLIC( "CPropsComboBox::HrInitialize()");
CHRESULT hr = CHK_CPropsComboBox_HrInitialize( pMDB);
if(FAILED(hr))
RETURN( hr);
// Make sure we have a valid pMDB, even in retail builds
if( !pMDB)
RETURN( E_FAIL);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Find the current selection and if there is one save the display
// name in m_sCurFolderName
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int iCurSel = GetCurSel();
if( iCurSel != CB_ERR)
{ // Something is selected.
GetLBText( iCurSel, m_sCurFolderName);
int nLen = m_sCurFolderName.Find( TEXT(" -- "));
m_sCurFolderName.GetBufferSetLength( nLen);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Remember the MDB ptr and open the root folder.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
m_pMDB = pMDB;
ULONG ulObjType = 0;
CMAPIInterface< LPMAPIFOLDER> pRootFolder;
hr = m_pMDB->OpenEntry(
0, NULL, NULL, MAPI_DEFERRED_ERRORS, &ulObjType, (LPUNKNOWN FAR *) &pRootFolder);
if(FAILED(hr))
RETURN( hr);
ASSERTERROR(ulObjType == MAPI_FOLDER, "ulObjType is not a MAPI_FOLDER");
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Using the root folder we can initialize a hierarchy table and use it to fill
// the combo box with a list of folders. Also open the default folder.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Get the contents table for the folder.
CMAPIInterface< LPMAPITABLE> pHierarchTbl;
hr = pRootFolder->GetHierarchyTable( MAPI_DEFERRED_ERRORS, &pHierarchTbl);
if( FAILED( hr))
RETURN( hr);
// Fill Combo Box with a list of folders.
hr = HrFillBox( pHierarchTbl);
if( FAILED( hr))
RETURN( hr);
// Select the first folder if non are selected yet.
if( GetCurSel() == CB_ERR)
SetCurSel( 0);
// Open the default folder.
hr = HrOpenFolder();
if( FAILED( hr))
RETURN( hr);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return( NOERROR);
}
// -----------------------------------------------------------------------------
// This releases the old folder and opens the newly selected one.
// -----------------------------------------------------------------------------
BOOL CPropsComboBox::HrOpenFolder()
{
DEBUGPUBLIC( "CPropsComboBox::HrOpenFolder()");
int iFolder = GetCurSel();
m_iFolder = -1; // In case we fail.
// Release the old folder.
ULRELEASE( m_pFolder);
// Open the folder.
ULONG ulObjType = 0;
CHRESULT hr = m_pMDB->OpenEntry( GetByteCnt( iFolder), GetEID( iFolder),
NULL, MAPI_DEFERRED_ERRORS, &ulObjType, (LPUNKNOWN FAR *) &m_pFolder);
if( FAILED( hr))
RETURN( hr);
if( ulObjType != MAPI_FOLDER)
RETURN( E_FAIL);
m_iFolder = iFolder;
return( NOERROR);
}
// $--CPropsComboBox::HrAddItem()-------------------------------------------------
// This virtual member function is called from HrFillBox(). It extracts the
// properties from pProps into useable objects, formats them, and then add them
// to the combo box.
// -----------------------------------------------------------------------------
HRESULT CPropsComboBox::HrAddItem( // Returns HRESULT
CProperty& Properties) // Ptr to properties of Entry Id and Folder name.
{
BOOL bIsCurrent = FALSE;
// Folder name.
CString sFolderName = Properties.szGetPrValue();
// Explicitly clear the DEFER flag of the MTS-IN folder.
if( sFolderName == TEXT( "MTS-IN") && m_pProps)
m_pProps->SetDefer( FALSE);
// Is this the current one?
if( sFolderName == m_sCurFolderName)
bIsCurrent = TRUE; // Yes
// Count of messages in folder.
Properties.Next();
sFolderName += " -- " + Properties.szGetPrValue();
// Add the folder name to the combo box.
int ii = AddString( sFolderName);
// If this is the current folder set the combo box selection.
if( bIsCurrent)
SetCurSel( ii);
return( NOERROR);
}
// $--CPropsComboBox::CleanUp()---------------------------------------------------
// Called when the window has been destroyed.
// -----------------------------------------------------------------------------
void CPropsComboBox::Destruct()
{
CPropsListComboBox<CComboBox>::Destruct();
m_iFolder = -1;
ULRELEASE( m_pFolder);
}
// -----------------------------------------------------------------------------