Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

333 lines
7.0 KiB

//
// usersess.cpp : implementation file
//
#include "stdafx.h"
#include "catscfg.h"
#include "usersess.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
//
// Catapult user object
//
CCatUserInfo::CCatUserInfo(
LPGATEWAY_USER_INFO lpUserInfo
)
#ifdef GATEWAY
: m_strUser(lpUserInfo->Username),
m_strHostName(lpUserInfo->Hostname),
#else
: m_strUser(lpUserInfo->szUser),
m_strHostName(lpUserInfo->inetHost),
#endif
m_tConnect(lpUserInfo->tConnect)
{
}
//
// Sorting helper function. The CObjectPlus pointer
// really refers to another CFtpUserInfo
//
int
CCatUserInfo::OrderByName (
const CObjectPlus * pobCatUser
) const
{
const CCatUserInfo * pob = (CCatUserInfo *) pobCatUser;
return QueryUserName().CompareNoCase(pob->QueryUserName());
}
/////////////////////////////////////////////////////////////////////////////
//
// CCatUsersListBox - a listbox of Catapult user objects
//
IMPLEMENT_DYNAMIC(CCatUsersListBox, CListBoxEx);
const int CCatUsersListBox::nBitmaps = 1;
CCatUsersListBox::CCatUsersListBox (
int nTab1,
int nTab2
)
{
SetTabs(nTab1, nTab2);
}
void
CCatUsersListBox::SetTabs(
int nTab1,
int nTab2
)
{
m_nTab1 = nTab1;
m_nTab2 = nTab2;
}
void
CCatUsersListBox::DrawItemEx(
CListBoxExDrawStruct& ds
)
{
CCatUserInfo * p = (CCatUserInfo *)ds.m_ItemData;
ASSERT(p != NULL);
CDC * pBmpDC = (CDC *)&ds.m_pResources->DcBitMap();
int bmh = ds.m_pResources->BitmapHeight();
int bmw = ds.m_pResources->BitmapWidth();
//
// Display a user bitmap
//
int nOffset = 0;
int bm_h = (ds.m_Sel) ? 0 : bmh;
int bm_w = bmw * nOffset;
ds.m_pDC->BitBlt( ds.m_Rect.left+1, ds.m_Rect.top, bmw, bmh,
pBmpDC, bm_w, bm_h, SRCCOPY );
ColumnText(ds.m_pDC, ds.m_Rect.left + bmw + 3, ds.m_Rect.top, m_nTab1,
ds.m_Rect.bottom, p->QueryUserName());
ColumnText(ds.m_pDC, ds.m_Rect.left + m_nTab1, ds.m_Rect.top, m_nTab2,
ds.m_Rect.bottom, p->QueryHostName());
//
// BUGBUG: Shouldn't hardcode the colon
//
CString strTime;
DWORD dwTime = p->QueryConnectTime();
DWORD dwHours = dwTime / (60L * 60L);
DWORD dwMinutes = (dwTime / 60L) % 60L;
DWORD dwSeconds = dwTime % 60L;
strTime.Format(_T("%d:%02d:%02d"),
dwHours, dwMinutes, dwSeconds);
ColumnText(ds.m_pDC, ds.m_Rect.left + m_nTab2, ds.m_Rect.top,
ds.m_Rect.right, ds.m_Rect.bottom, strTime);
}
/////////////////////////////////////////////////////////////////////////////
//
// CUserSessionsDlg dialog
//
CUserSessionsDlg::CUserSessionsDlg(
LPCTSTR lpstrServerName,
CWnd* pParent /*=NULL*/
)
: m_list_Users(),
m_ListBoxRes(
IDB_USERS,
m_list_Users.nBitmaps
),
m_oblCatUsers(),
m_strServerName(lpstrServerName),
m_cUsers(0),
m_cSessions(0),
CDialog(CUserSessionsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUserSessionsDlg)
//}}AFX_DATA_INIT
m_list_Users.AttachResources( &m_ListBoxRes );
VERIFY(m_strTotalConnected.LoadString(IDS_USERS_TOTAL));
}
void
CUserSessionsDlg::DoDataExchange(
CDataExchange* pDX
)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUserSessionsDlg)
DDX_Control(pDX, IDC_STATIC_TOTAL, m_static_Total);
DDX_Control(pDX, IDC_STATIC_USERS, m_static_Users);
DDX_Control(pDX, IDC_STATIC_TIME, m_static_Time);
DDX_Control(pDX, IDC_STATIC_FROM, m_static_From);
//}}AFX_DATA_MAP
DDX_Control(pDX, IDC_LIST_USERS, m_list_Users);
}
BEGIN_MESSAGE_MAP(CUserSessionsDlg, CDialog)
//{{AFX_MSG_MAP(CUserSessionsDlg)
ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnButtonRefresh)
ON_LBN_SELCHANGE(IDC_LIST_USERS, OnSelchangeListUsers)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Sort the list of ftp users by user name
//
LONG
CUserSessionsDlg::SortUsersList()
{
if (m_oblCatUsers.GetCount() < 2)
{
//
// Don't bother
//
return 0;
}
BeginWaitCursor();
LONG l = m_oblCatUsers.Sort( (CObjectPlus::PCOBJPLUS_ORDER_FUNC) &CCatUserInfo::OrderByName);
EndWaitCursor();
return l;
}
//
// Call the CatEnum api and build the list of currently
// connected users
//
NET_API_STATUS
CUserSessionsDlg::BuildUserList()
{
NET_API_STATUS err = 0;
LPGATEWAY_USER_INFO lpUserInfo;
LPGATEWAY_USER_ENUM_LIST lpEnumList = NULL;
m_oblCatUsers.RemoveAll();
BeginWaitCursor();
err = ENUM_USERS(
(LPTSTR)(LPCTSTR)m_strServerName,
&lpEnumList
);
EndWaitCursor();
TRACEEOLID(_T("GatewayEnumUserConnect returned ") << err);
if (err != ERROR_SUCCESS)
{
return err;
}
TRY
{
TRACEEOLID(_T("Number of users found ") << lpEnumList->dwEntriesRead);
lpUserInfo = lpEnumList->lpUsers;
m_cSessions = 0;
for (DWORD i = 0; i < lpEnumList->dwEntriesRead; ++i)
{
#ifdef GATEWAY
ASSERT(lpUserInfo->OpenConn >= 1);
m_cSessions += lpUserInfo->OpenConn;
#else
m_cSessions++;
#endif
m_oblCatUsers.AddTail(new CCatUserInfo(lpUserInfo++));
}
SortUsersList();
}
CATCH_ALL(e)
{
err = ::GetLastError();
}
END_CATCH_ALL
FREE_MEMORY((LPTSTR)(LPCTSTR)m_strServerName, lpEnumList);
m_cUsers = m_oblCatUsers.GetCount();
return err;
}
//
// Show the users in the listbox
//
void
CUserSessionsDlg::FillListBox()
{
CObListIter obli( m_oblCatUsers );
CCatUserInfo * pUserEntry;
//
// Remember the selection.
//
int nCurSel = m_list_Users.GetCurSel();
m_list_Users.SetRedraw(FALSE);
m_list_Users.ResetContent();
int cItems = 0;
for ( /**/ ; pUserEntry = (CCatUserInfo *) obli.Next() ; cItems++ )
{
m_list_Users.AddItem( pUserEntry );
}
m_list_Users.SetRedraw(TRUE);
m_list_Users.SetCurSel(nCurSel);
//
// Update the count text on the dialog
//
CString str;
str.Format(m_strTotalConnected, m_cUsers, m_cSessions);
m_static_Total.SetWindowText(str);
}
//
// CUserSessionsDlg message handlers
//
//
// Refresh user list
//
NET_API_STATUS
CUserSessionsDlg::RefreshUsersList()
{
NET_API_STATUS err = BuildUserList();
if (err != ERROR_SUCCESS)
{
::DisplayMessage(err);
}
FillListBox();
return err;
}
void
CUserSessionsDlg::OnButtonRefresh()
{
RefreshUsersList();
}
void
CUserSessionsDlg::OnSelchangeListUsers()
{
}
BOOL
CUserSessionsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
// Set tabs in listbox
//
RECT rc1, rc2, rc3;
m_static_Users.GetWindowRect(&rc1);
m_static_From.GetWindowRect(&rc2);
m_static_Time.GetWindowRect(&rc3);
m_list_Users.SetTabs(rc2.left - rc1.left - 1, rc3.left - rc1.left - 1);
if (ERROR_SUCCESS != RefreshUsersList())
{
EndDialog(IDCANCEL);
return FALSE;
}
FillListBox();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}