mirror of https://github.com/tongzx/nt5src
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.
1537 lines
38 KiB
1537 lines
38 KiB
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
* sharestp.cxx
|
|
* Contain the dialog for deleting shares.
|
|
*
|
|
* FILE HISTORY:
|
|
* Yi-HsinS 8/25/91 Created
|
|
* Yi-HsinS 12/15/91 Uses SHARE_NET_NAME
|
|
* Yi-HsinS 12/31/91 Unicode work
|
|
* Yi-HsinS 1/6/92 Renamed to sharestp.cxx and separated
|
|
* the create share dialogs to sharecrt.cxx
|
|
* Yi-HsinS 3/12/92 Added STOP_SHARING_GROUP
|
|
* Yi-HsinS 4/2/92 Added MayRun
|
|
* Yi-HsinS 8/6/92 Reorganize to match Winball
|
|
* Yi-HsinS 11/20/92 Added support for sticky shares
|
|
*/
|
|
|
|
#define INCL_WINDOWS_GDI
|
|
#define INCL_WINDOWS
|
|
#define INCL_DOSERRORS
|
|
#define INCL_NETERRORS
|
|
#define INCL_NETSHARE
|
|
#define INCL_NETSERVER
|
|
#define INCL_NETCONS
|
|
#define INCL_NETLIB
|
|
#include <lmui.hxx>
|
|
|
|
extern "C"
|
|
{
|
|
#include <sharedlg.h>
|
|
#include <helpnums.h>
|
|
#include <winlocal.h>
|
|
#include <mnet.h>
|
|
}
|
|
|
|
#define INCL_BLT_DIALOG
|
|
#define INCL_BLT_CONTROL
|
|
#define INCL_BLT_MSGPOPUP
|
|
#define INCL_BLT_SPIN_GROUP
|
|
#include <blt.hxx>
|
|
|
|
#include <string.hxx>
|
|
#include <uitrace.hxx>
|
|
|
|
#include <strnumer.hxx>
|
|
|
|
#include <lmoshare.hxx>
|
|
#include <lmoesh.hxx>
|
|
#include <lmoeconn.hxx>
|
|
#include <lmosrv.hxx>
|
|
|
|
#include <ctime.hxx>
|
|
#include <intlprof.hxx>
|
|
|
|
#include <strchlit.hxx> // for string and character constants
|
|
#include "sharestp.hxx"
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LBI::SHARE_LBI
|
|
|
|
SYNOPSIS: Listbox items used in the SHARE_LISTBOX
|
|
|
|
ENTRY: s2 - object returned by SHARE2_ENUM_ITER
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/8/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
SHARE_LBI::SHARE_LBI( const SHARE2_ENUM_OBJ &s2, UINT nType )
|
|
: _nlsShareName( s2.QueryName()),
|
|
_nlsSharePath( s2.QueryPath()),
|
|
_nType ( nType )
|
|
{
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
|
|
APIERR err;
|
|
if ( (( err = _nlsShareName.QueryError()) != NERR_Success )
|
|
|| (( err = _nlsSharePath.QueryError()) != NERR_Success )
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LBI::~SHARE_LBI
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/6/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
SHARE_LBI::~SHARE_LBI()
|
|
{
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LBI::QueryLeadingChar
|
|
|
|
SYNOPSIS: Returns the leading character of the listbox item.
|
|
The enables shortcut keys in the listbox
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: Returns the first char of the share name
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/6/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
WCHAR SHARE_LBI::QueryLeadingChar( VOID ) const
|
|
{
|
|
ISTR istr( _nlsShareName );
|
|
return _nlsShareName.QueryChar( istr );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LBI::Paint
|
|
|
|
SYNOPSIS: Redefine Paint() method of LBI class
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/8/92 Created
|
|
beng 22-Apr-1992 Change to LBI::Paint
|
|
|
|
********************************************************************/
|
|
|
|
VOID SHARE_LBI::Paint( LISTBOX *plb,
|
|
HDC hdc,
|
|
const RECT *prect,
|
|
GUILTT_INFO *pGUILTT ) const
|
|
{
|
|
|
|
STR_DTE strdteShareName( _nlsShareName );
|
|
STR_DTE strdteSharePath( _nlsSharePath );
|
|
|
|
DISPLAY_TABLE dt(3, ((SHARE_LISTBOX *) plb)->QueryColumnWidths() );
|
|
dt[0] = _nType == DISKSHARE_TYPE
|
|
? ((SHARE_LISTBOX *) plb)->QueryShareBitmap()
|
|
: ( _nType == STICKYSHARE_TYPE
|
|
? ((SHARE_LISTBOX *) plb)->QueryStickyShareBitmap()
|
|
: ((SHARE_LISTBOX *) plb)->QueryIPCShareBitmap());
|
|
dt[1] = &strdteShareName;
|
|
dt[2] = &strdteSharePath;
|
|
|
|
dt.Paint( plb, hdc, prect, pGUILTT );
|
|
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LBI::Compare
|
|
|
|
SYNOPSIS: Redefine Compare() method of LBI class
|
|
We compare the share names of two LBIs.
|
|
|
|
ENTRY: plbi - pointer to the LBI to compare with
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/8/92 Created
|
|
|
|
********************************************************************/
|
|
INT SHARE_LBI::Compare( const LBI *plbi ) const
|
|
{
|
|
return( _nlsShareName._stricmp( ((const SHARE_LBI *) plbi)->_nlsShareName ));
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LISTBOX::SHARE_LISTBOX
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY: powin - owner window
|
|
cid - resource id of the share listbox
|
|
nShareType - The type of shares to be displayed in the listbox
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/20/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
SHARE_LISTBOX::SHARE_LISTBOX( OWNER_WINDOW *powin, CID cid, UINT nShareType )
|
|
: BLT_LISTBOX ( powin, cid ),
|
|
_pdmdte ( NULL ),
|
|
_pdmdteSticky( NULL ),
|
|
_pdmdteIPC ( NULL ),
|
|
_nShareType ( nShareType )
|
|
{
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
|
|
APIERR err = ERROR_NOT_ENOUGH_MEMORY;
|
|
if ( ((_pdmdte = new DMID_DTE( BMID_SHARE )) == NULL )
|
|
|| ((_pdmdteSticky = new DMID_DTE( BMID_STICKYSHARE )) == NULL )
|
|
|| ((_pdmdteIPC = new DMID_DTE( BMID_IPCSHARE )) == NULL )
|
|
|| ((err = _pdmdte->QueryError()) != NERR_Success )
|
|
|| ((err = _pdmdteSticky->QueryError()) != NERR_Success )
|
|
|| ((err = DISPLAY_TABLE::CalcColumnWidths( _adx, 3, powin, cid, TRUE))
|
|
!= NERR_Success )
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LISTBOX::~SHARE_LISTBOX
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/20/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
SHARE_LISTBOX::~SHARE_LISTBOX()
|
|
{
|
|
// Delete the share bitmap
|
|
delete _pdmdte;
|
|
_pdmdte = NULL;
|
|
|
|
delete _pdmdteSticky;
|
|
_pdmdteSticky = NULL;
|
|
|
|
delete _pdmdteIPC;
|
|
_pdmdteIPC = NULL;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: SHARE_LISTBOX::Update
|
|
|
|
SYNOPSIS: Update (refresh) the shares in the listbox
|
|
|
|
ENTRY: pszComputer - The computer to set focus to, will be an
|
|
empty string if the computer is local.
|
|
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/7/92 Created
|
|
|
|
*******************************************************************/
|
|
|
|
APIERR SHARE_LISTBOX::Update( SERVER_WITH_PASSWORD_PROMPT *psvr )
|
|
{
|
|
|
|
APIERR err = NERR_Success;
|
|
ALIAS_STR nlsServer( psvr->QueryName() );
|
|
|
|
DeleteAllItems();
|
|
SetRedraw( FALSE );
|
|
|
|
do // Not a loop, just a way to break out in case error occurred
|
|
{
|
|
|
|
SHARE2_ENUM sh2Enum( nlsServer );
|
|
if ( ((err = sh2Enum.QueryError()) != NERR_Success )
|
|
|| ((err = sh2Enum.GetInfo()) != NERR_Success )
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// First, add the shares that are created
|
|
//
|
|
SHARE2_ENUM_ITER shi2( sh2Enum );
|
|
const SHARE2_ENUM_OBJ *pshi2 = NULL;
|
|
|
|
while ( (pshi2 = shi2() ) != NULL )
|
|
{
|
|
|
|
UINT nCurrentShareType = pshi2->QueryType() & ~STYPE_SPECIAL;
|
|
|
|
//
|
|
// Filter out unwanted shares
|
|
//
|
|
if ( _nShareType != STYPE_ALL_SHARE )
|
|
{
|
|
if (!( ( ( _nShareType & STYPE_DISK_SHARE )
|
|
&& ( nCurrentShareType == STYPE_DISKTREE ))
|
|
|| ( ( _nShareType & STYPE_PRINT_SHARE )
|
|
&& ( nCurrentShareType == STYPE_PRINTQ ))
|
|
|| ( ( _nShareType & STYPE_IPC_SHARE )
|
|
&& ( nCurrentShareType == STYPE_IPC ))))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Add the share to the listbox
|
|
//
|
|
SHARE_LBI *psharelbi = new SHARE_LBI( *pshi2,
|
|
nCurrentShareType == STYPE_IPC?
|
|
IPCSHARE_TYPE : DISKSHARE_TYPE );
|
|
if ( ( psharelbi == NULL )
|
|
|| ( ( err = psharelbi->QueryError() ) != NERR_Success )
|
|
|| ( AddItem( psharelbi ) < 0 )
|
|
)
|
|
{
|
|
err = err? err : (APIERR) ERROR_NOT_ENOUGH_MEMORY;
|
|
delete psharelbi;
|
|
psharelbi = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !psvr->IsNT() )
|
|
break;
|
|
|
|
//
|
|
// If we are focusing on NT, add the sticky shares.
|
|
// AddItemIdemp will delete the item if it already exist in the listbox.
|
|
//
|
|
SHARE2_ENUM sh2EnumSticky( nlsServer, STICKYSHARE_TYPE );
|
|
if ( ((err = sh2EnumSticky.QueryError()) != NERR_Success )
|
|
|| ((err = sh2EnumSticky.GetInfo()) != NERR_Success )
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
SHARE2_ENUM_ITER shi2Sticky( sh2EnumSticky );
|
|
|
|
while ( (pshi2 = shi2Sticky()) != NULL )
|
|
{
|
|
//
|
|
// Filter out unwanted shares
|
|
//
|
|
if ( _nShareType != STYPE_ALL_SHARE )
|
|
{
|
|
UINT nCurrentShareType = pshi2->QueryType() & ~STYPE_SPECIAL;
|
|
|
|
if (!( ( ( _nShareType & STYPE_DISK_SHARE )
|
|
&& ( nCurrentShareType == STYPE_DISKTREE ))
|
|
|| ( ( _nShareType & STYPE_PRINT_SHARE )
|
|
&& ( nCurrentShareType == STYPE_PRINTQ ))
|
|
|| ( ( _nShareType & STYPE_IPC_SHARE )
|
|
&& ( nCurrentShareType == STYPE_IPC ))))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Add the sticky share to the listbox
|
|
//
|
|
SHARE_LBI *psharelbi = new SHARE_LBI( *pshi2, TRUE );
|
|
if ( ( psharelbi == NULL )
|
|
|| ( ( err = psharelbi->QueryError() ) != NERR_Success )
|
|
|| ( AddItemIdemp( psharelbi ) < 0 )
|
|
)
|
|
{
|
|
err = err? err : (APIERR) ERROR_NOT_ENOUGH_MEMORY;
|
|
delete psharelbi;
|
|
psharelbi = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
while ( FALSE );
|
|
|
|
Invalidate( TRUE );
|
|
SetRedraw( TRUE );
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: VIEW_SHARE_DIALOG_BASE::VIEW_SHARE_DIALOG_BASE
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY: pszDlgResource - name of the dialog
|
|
hwndParent - handle of the parent
|
|
nShareType - the type of share to display
|
|
ulHelpContextBase - the base help context
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
VIEW_SHARE_DIALOG_BASE::VIEW_SHARE_DIALOG_BASE( const TCHAR *pszDlgResource,
|
|
HWND hwndParent,
|
|
ULONG ulHelpContextBase,
|
|
UINT nShareType )
|
|
: DIALOG_WINDOW ( pszDlgResource, hwndParent ),
|
|
_sltShareTitle( this, SLT_SHARETITLE ),
|
|
_lbShare ( this, LB_SHARE, nShareType ),
|
|
_psvr ( NULL ),
|
|
_ulHelpContextBase( ulHelpContextBase )
|
|
{
|
|
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: VIEW_SHARE_DIALOG_BASE::~VIEW_SHARE_DIALOG_BASE
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/8/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
VIEW_SHARE_DIALOG_BASE::~VIEW_SHARE_DIALOG_BASE()
|
|
{
|
|
delete _psvr;
|
|
_psvr = NULL;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: VIEW_SHARE_DIALOG_BASE::InitComputer
|
|
|
|
SYNOPSIS: Initialize the dialog and internal variables
|
|
to focus on the selected computer
|
|
|
|
ENTRY: pszComputer - name of the computer to set focus on
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/8/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR VIEW_SHARE_DIALOG_BASE::InitComputer( const TCHAR *pszComputer )
|
|
{
|
|
|
|
APIERR err;
|
|
|
|
do { // not a loop
|
|
|
|
//
|
|
// Display the title of the listbox
|
|
//
|
|
|
|
LOCATION loc( pszComputer, FALSE );
|
|
NLS_STR nlsComputer;
|
|
|
|
if ( ((err = nlsComputer.QueryError()) != NERR_Success )
|
|
|| ((err = loc.QueryDisplayName( &nlsComputer)) != NERR_Success )
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
const NLS_STR *apnlsParams[2];
|
|
apnlsParams[0] = (NLS_STR *) &nlsComputer;
|
|
apnlsParams[1] = NULL;
|
|
|
|
RESOURCE_STR nlsTitle( IDS_SHARE_LB_TITLE_TEXT );
|
|
|
|
if ( ((err = nlsTitle.QueryError()) != NERR_Success )
|
|
|| ((err = nlsTitle.InsertParams( apnlsParams )) != NERR_Success )
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
_sltShareTitle.SetText( nlsTitle );
|
|
|
|
//
|
|
// Initialize the SERVER_WITH_PASSWORD_PROMPT object
|
|
//
|
|
|
|
LOCATION locLocal; // local computer
|
|
NLS_STR nlsLocalComputer;
|
|
|
|
if ( (err = locLocal.QueryDisplayName( &nlsLocalComputer))
|
|
!= NERR_Success )
|
|
break;
|
|
|
|
if( !::I_MNetComputerNameCompare( nlsLocalComputer, nlsComputer ) )
|
|
nlsComputer = EMPTY_STRING;
|
|
|
|
_psvr = new SERVER_WITH_PASSWORD_PROMPT( nlsComputer,
|
|
QueryRobustHwnd(),
|
|
QueryHelpContextBase());
|
|
|
|
if ( ( _psvr == NULL )
|
|
|| ((err = _psvr->QueryError() ) != NERR_Success )
|
|
|| ((err = _psvr->GetInfo() ) != NERR_Success )
|
|
)
|
|
{
|
|
err = err? err: (APIERR) ERROR_NOT_ENOUGH_MEMORY;
|
|
delete _psvr;
|
|
_psvr = NULL;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Update the listbox and disable it if the number of items is zero
|
|
//
|
|
err = err? err : _lbShare.Update( _psvr );
|
|
_lbShare.Enable( _lbShare.QueryCount() > 0 );
|
|
_sltShareTitle.Enable( _lbShare.QueryCount() > 0 );
|
|
if ( _lbShare.QueryCount() > 0 )
|
|
_lbShare.ClaimFocus();
|
|
|
|
} while ( FALSE );
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: VIEW_SHARE_DIALOG_BASE::Refresh
|
|
|
|
SYNOPSIS: Refresh the share listbox
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/8/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR VIEW_SHARE_DIALOG_BASE::Refresh( VOID )
|
|
{
|
|
AUTO_CURSOR autocur;
|
|
UIASSERT( _psvr != NULL );
|
|
|
|
APIERR err = _lbShare.Update( _psvr );
|
|
_lbShare.Enable( _lbShare.QueryCount() > 0 );
|
|
_sltShareTitle.Enable( _lbShare.QueryCount() > 0 );
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: VIEW_SHARE_DIALOG_BASE::OnCommand
|
|
|
|
SYNOPSIS: Check if the user double clicks on a share
|
|
|
|
ENTRY: event - the event that occurred
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/8/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL VIEW_SHARE_DIALOG_BASE::OnCommand( const CONTROL_EVENT &event )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
|
|
switch ( event.QueryCid() )
|
|
{
|
|
|
|
case LB_SHARE:
|
|
if ( ( event.QueryCode() == LBN_DBLCLK )
|
|
&& ( _lbShare.QuerySelCount() > 0 )
|
|
)
|
|
{
|
|
return OnShareLbDblClk();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return DIALOG_WINDOW::OnCommand( event );
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: VIEW_SHARE_DIALOG_BASE::StopShare
|
|
|
|
SYNOPSIS: Helper method to delete a share and popup any
|
|
warning if some users are connected to the share
|
|
|
|
ENTRY: pszShare - the share to be deleted
|
|
|
|
EXIT: pfCancel - pointer to a BOOLEAN indicating whether
|
|
the user decided to cancel deleting the share
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/8/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR VIEW_SHARE_DIALOG_BASE::StopShare( const TCHAR *pszShare, BOOL *pfCancel)
|
|
{
|
|
|
|
UIASSERT( pfCancel != NULL );
|
|
*pfCancel = FALSE;
|
|
|
|
ALIAS_STR nlsShare( pszShare );
|
|
ALIAS_STR nlsComputer( _psvr->QueryName() );
|
|
|
|
APIERR err = NERR_Success;
|
|
|
|
SHARE_2 sh2( nlsShare, nlsComputer, FALSE );
|
|
|
|
|
|
//
|
|
// Check if there are any users connected to the share
|
|
//
|
|
if ( (( err = sh2.QueryError()) == NERR_Success )
|
|
&& (( err = sh2.GetInfo()) == NERR_Success )
|
|
&& ( sh2.QueryCurrentUses() > 0 )
|
|
)
|
|
{
|
|
|
|
//
|
|
// There are users currently connected to the share to be deleted,
|
|
// hence, popup a dialog displaying all uses to the share.
|
|
//
|
|
|
|
BOOL fOK = TRUE;
|
|
CURRENT_USERS_WARNING_DIALOG *pdlg =
|
|
new CURRENT_USERS_WARNING_DIALOG( QueryRobustHwnd(),
|
|
nlsComputer,
|
|
nlsShare,
|
|
QueryHelpContextBase() );
|
|
|
|
|
|
if ( ( pdlg == NULL )
|
|
|| ((err = pdlg->QueryError()) != NERR_Success )
|
|
|| ((err = pdlg->Process( &fOK )) != NERR_Success )
|
|
)
|
|
{
|
|
err = err? err : (APIERR) ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
// User clicked CANCEL for the pdlg
|
|
if ( !err && !fOK )
|
|
{
|
|
*pfCancel = TRUE;
|
|
}
|
|
|
|
delete pdlg;
|
|
}
|
|
|
|
if ( !err && !*pfCancel )
|
|
err = sh2.Delete();
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
|
|
NAME: STOP_SHARING_DIALOG::STOP_SHARING_DIALOG
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY: hwndParent - handle of parent window
|
|
pszSelectedDir - the directory selected in the
|
|
file manager. This will be used
|
|
to determine which computer the
|
|
user is currently focusing on.
|
|
ulHelpContextBase - the base help context
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
STOP_SHARING_DIALOG::STOP_SHARING_DIALOG( HWND hwndParent,
|
|
const TCHAR *pszSelectedDir,
|
|
ULONG ulHelpContextBase )
|
|
: VIEW_SHARE_DIALOG_BASE( MAKEINTRESOURCE(IDD_SHARESTOPDLG),
|
|
hwndParent,
|
|
ulHelpContextBase,
|
|
STYPE_DISK_SHARE ),
|
|
_buttonOK ( this, IDOK ),
|
|
_buttonCancel( this, IDCANCEL ),
|
|
_stpShareGrp ( QueryLBShare(), &_buttonOK, &_buttonCancel )
|
|
{
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
|
|
APIERR err;
|
|
if ( ((err = _stpShareGrp.QueryError() ) != NERR_Success )
|
|
|| ((err = Init( pszSelectedDir ) ) != NERR_Success )
|
|
)
|
|
{
|
|
if ( err == ERROR_INVALID_LEVEL ) // winball machine
|
|
err = ERROR_NOT_SUPPORTED;
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: STOP_SHARING_DIALOG::Init
|
|
|
|
SYNOPSIS: 2nd stage constructor
|
|
|
|
ENTRY: pszSelectedDir - the directory selected in the
|
|
file manager. This will be used
|
|
to determine which computer the
|
|
user is currently focusing on.
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES: If no directory is selected, then the focus is
|
|
set to the local computer.
|
|
|
|
HISTORY:
|
|
Yi-HsinS 4/2/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR STOP_SHARING_DIALOG::Init( const TCHAR *pszSelectedDir )
|
|
{
|
|
AUTO_CURSOR autocur;
|
|
|
|
APIERR err;
|
|
|
|
do { // Not a loop
|
|
|
|
ALIAS_STR nlsSelectedDir( pszSelectedDir );
|
|
|
|
NLS_STR nlsServerString;
|
|
if ((err = nlsServerString.QueryError()) != NERR_Success )
|
|
break;
|
|
|
|
//
|
|
// If no file is selected, set the focus to the local computer.
|
|
//
|
|
|
|
if ( nlsSelectedDir.QueryTextLength() == 0 )
|
|
{
|
|
err = InitComputer( nlsServerString );
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Get the computer the selected file/dir is on
|
|
//
|
|
|
|
SHARE_NET_NAME netName( pszSelectedDir, TYPE_PATH_ABS );
|
|
|
|
if ( ((err = netName.QueryError()) != NERR_Success )
|
|
|| ((err = netName.QueryComputerName( &nlsServerString ))
|
|
!= NERR_Success )
|
|
|| ((err = InitComputer( nlsServerString )) != NERR_Success )
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Search for share names that have paths that are the same
|
|
// as the selected directory and then select them in the share listbox.
|
|
//
|
|
|
|
NLS_STR nlsPath;
|
|
if ( (( err = nlsPath.QueryError()) != NERR_Success )
|
|
|| (( err = netName.QueryLocalPath( &nlsPath )) != NERR_Success )
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
SHARE_LISTBOX *plbShare = QueryLBShare();
|
|
INT ilbCount = plbShare->QueryCount();
|
|
INT iFirstSelected = -1;
|
|
|
|
for ( INT i = 0; i < ilbCount; i++ )
|
|
{
|
|
SHARE_LBI *pshlbi = plbShare->QueryItem(i);
|
|
|
|
if ( nlsPath._stricmp( *(pshlbi->QuerySharePath())) == 0 )
|
|
{
|
|
if ( iFirstSelected < 0 )
|
|
iFirstSelected = i;
|
|
plbShare->SelectItem(i);
|
|
}
|
|
}
|
|
|
|
if ( iFirstSelected >= 0 )
|
|
plbShare->SetTopIndex( iFirstSelected );
|
|
|
|
// Falls through if error occurs
|
|
|
|
} while ( FALSE );
|
|
|
|
if ( err == NERR_Success )
|
|
{
|
|
//
|
|
// Make OK the default button if shares are selected in the listbox
|
|
// and Cancel the default button otherwise.
|
|
//
|
|
SHARE_LISTBOX *plbShare = QueryLBShare();
|
|
if ( plbShare->QuerySelCount() > 0 )
|
|
_buttonOK.MakeDefault();
|
|
else
|
|
_buttonCancel.MakeDefault();
|
|
|
|
if ( plbShare->QueryCount() == 0 )
|
|
{
|
|
err = IERR_NO_SHARES_ON_SERVER;
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: STOP_SHARING_DIALOG::OnShareLbDblClk
|
|
|
|
SYNOPSIS: When the user double clicks on the share,
|
|
it's as if the user is clicking the OK button.
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL STOP_SHARING_DIALOG::OnShareLbDblClk( VOID )
|
|
{
|
|
return OnOK();
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: STOP_SHARING_DIALOG::OnOK
|
|
|
|
SYNOPSIS: Gather information and delete the shares selected
|
|
in the listbox.
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL STOP_SHARING_DIALOG::OnOK( VOID )
|
|
{
|
|
AUTO_CURSOR autocur;
|
|
|
|
APIERR err = NERR_Success;
|
|
|
|
SHARE_LISTBOX *plbShare = QueryLBShare();
|
|
INT ciMax = plbShare->QuerySelCount();
|
|
|
|
//
|
|
// If there are no items selected in the listbox,
|
|
// just dismiss the dialog.
|
|
//
|
|
if ( ciMax == 0 )
|
|
{
|
|
Dismiss( FALSE );
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Get all the items selected in the listbox
|
|
//
|
|
INT *paSelItems = (INT *) new BYTE[ sizeof(INT) * ciMax ];
|
|
|
|
if ( paSelItems == NULL )
|
|
{
|
|
::MsgPopup( this, ERROR_NOT_ENOUGH_MEMORY);
|
|
return TRUE;
|
|
}
|
|
|
|
// JonN 01/27/00: PREFIX bug 444909
|
|
::ZeroMemory( paSelItems, sizeof(INT)*ciMax );
|
|
|
|
err = plbShare->QuerySelItems( paSelItems, ciMax );
|
|
UIASSERT( err == NERR_Success );
|
|
|
|
//
|
|
// Loop through each share that the user selects in the listbox
|
|
// and stop sharing the share. We will break out of the loop
|
|
// if any error occurred in stopping a share or if the user
|
|
// decides not stop sharing any share that some user is connected to.
|
|
//
|
|
BOOL fCancel = FALSE;
|
|
BOOL fDeleted = FALSE;
|
|
SHARE_LBI *pshlbi = NULL;
|
|
for ( INT i = 0; i < ciMax; i++ )
|
|
{
|
|
pshlbi = plbShare->QueryItem( paSelItems[i] );
|
|
if (NULL == pshlbi) continue; // JonN 01/27/00: PREFIX bug 444910
|
|
if ( pshlbi->IsSticky() )
|
|
{
|
|
err = ::MNetShareDelSticky( QueryComputerName(),
|
|
pshlbi->QueryShareName()->QueryPch(),
|
|
0 ); // Reserved
|
|
}
|
|
else
|
|
{
|
|
err = StopShare( pshlbi->QueryShareName()->QueryPch(), &fCancel );
|
|
}
|
|
|
|
if (( err != NERR_Success ) || fCancel )
|
|
break;
|
|
fDeleted = TRUE;
|
|
}
|
|
|
|
delete paSelItems;
|
|
paSelItems = NULL;
|
|
|
|
//
|
|
// Dismiss the dialog only if everything went on smoothly or if
|
|
// we get an NERR_BadTransactConfig error.
|
|
//
|
|
if ( err != NERR_Success )
|
|
{
|
|
if ( err == NERR_NetNameNotFound )
|
|
{
|
|
::MsgPopup( this, IERR_SHARE_NOT_FOUND, MPSEV_ERROR, MP_OK,
|
|
pshlbi->QueryShareName()->QueryPch());
|
|
}
|
|
else if ( err == NERR_BadTransactConfig )
|
|
{
|
|
DismissMsg( err );
|
|
}
|
|
else
|
|
{
|
|
::MsgPopup( this, err );
|
|
}
|
|
|
|
}
|
|
else if ( !fCancel )
|
|
{
|
|
Dismiss( TRUE );
|
|
}
|
|
|
|
//
|
|
// Refresh the listbox if some shares have already been deleted or if
|
|
// the error NERR_NetNameNotFound occurred.
|
|
//
|
|
if (( fDeleted) || ( err == NERR_NetNameNotFound) )
|
|
{
|
|
err = Refresh();
|
|
if ( err != NERR_Success )
|
|
{
|
|
::MsgPopup( this, err );
|
|
}
|
|
else
|
|
{
|
|
_buttonOK.Enable( plbShare->QueryCount() > 0 );
|
|
if ( plbShare->QueryCount() > 0 )
|
|
plbShare->ClaimFocus();
|
|
else
|
|
_buttonCancel.ClaimFocus();
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: STOP_SHARING_DIALOG::QueryHelpContext
|
|
|
|
SYNOPSIS: Get the help context of the dialog
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: Returns the help context
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
ULONG STOP_SHARING_DIALOG::QueryHelpContext( VOID )
|
|
{
|
|
return QueryHelpContextBase() + HC_FILEMGRSTOPSHARE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: STOP_SHARING_GROUP::STOP_SHARING_GROUP
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY: plbShareName - pointer to share name combo box
|
|
pbuttonOK - pointer to the OK push button
|
|
pbuttonCancel- pointer to the CANCEL push button
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 3/12/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
STOP_SHARING_GROUP::STOP_SHARING_GROUP( SHARE_LISTBOX *plbShare,
|
|
PUSH_BUTTON *pbuttonOK,
|
|
PUSH_BUTTON *pbuttonCancel )
|
|
: _plbShare ( plbShare ),
|
|
_pbuttonOK ( pbuttonOK ),
|
|
_pbuttonCancel( pbuttonCancel )
|
|
{
|
|
UIASSERT( _plbShare );
|
|
UIASSERT( _pbuttonOK );
|
|
UIASSERT( _pbuttonCancel );
|
|
|
|
_plbShare->SetGroup( this );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: STOP_SHARING_GROUP::~STOP_SHARING_GROUP
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 3/12/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
STOP_SHARING_GROUP::~STOP_SHARING_GROUP()
|
|
{
|
|
_plbShare = NULL;
|
|
_pbuttonOK = NULL;
|
|
_pbuttonCancel = NULL;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: STOP_SHARING_GROUP::OnUserAction
|
|
|
|
SYNOPSIS: If share name listbox box is empty, set the default button
|
|
to CANCEL, else set the default button to OK.
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 3/12/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR STOP_SHARING_GROUP::OnUserAction( CONTROL_WINDOW *pcw,
|
|
const CONTROL_EVENT &e )
|
|
{
|
|
if ( pcw == QueryLBShare() )
|
|
{
|
|
if ( e.QueryCode() == LBN_SELCHANGE )
|
|
{
|
|
if ( QueryLBShare()->QuerySelCount() > 0 )
|
|
_pbuttonOK->MakeDefault();
|
|
else
|
|
_pbuttonCancel->MakeDefault();
|
|
}
|
|
}
|
|
|
|
return GROUP_NO_CHANGE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CURRENT_USERS_WARNING_DIALOG::CURRENT_USERS_WARNING_DIALOG
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY: hwndParent - hwnd of Parent Window
|
|
pszServer - Server Name
|
|
pszShare - Share Name
|
|
ulHelpContextBase - the base help context
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
CURRENT_USERS_WARNING_DIALOG::CURRENT_USERS_WARNING_DIALOG( HWND hwndParent,
|
|
const TCHAR *pszServer,
|
|
const TCHAR *pszShare,
|
|
ULONG ulHelpContextBase )
|
|
: DIALOG_WINDOW( IDD_SHAREUSERSWARNINGDLG, hwndParent ),
|
|
_sltShareText( this, SLT_SHARE_TEXT ),
|
|
_lbUsers( this, LB_USERS ),
|
|
_ulHelpContextBase( ulHelpContextBase )
|
|
{
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
|
|
UIASSERT( pszShare );
|
|
|
|
APIERR err;
|
|
|
|
ALIAS_STR nlsShare( pszShare );
|
|
RESOURCE_STR nlsShareText( IDS_SHARE_CURRENT_USERS_TEXT );
|
|
if (( err = nlsShareText.InsertParams( nlsShare )) != NERR_Success )
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
|
|
_sltShareText.SetText( nlsShareText );
|
|
|
|
//
|
|
// Gather all connections to the share that the user wants to delete.
|
|
//
|
|
CONN1_ENUM c1( (TCHAR *) pszServer, (TCHAR *) pszShare );
|
|
if ( ((err = c1.QueryError()) != NERR_Success )
|
|
|| ((err = c1.GetInfo()) != NERR_Success )
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
|
|
CONN1_ENUM_ITER ci1( c1 );
|
|
const CONN1_ENUM_OBJ *pci1;
|
|
|
|
_lbUsers.SetRedraw( FALSE );
|
|
|
|
while ( ( pci1 = ci1() ) != NULL)
|
|
{
|
|
USERS_LBI *puserslbi = new USERS_LBI( *pci1 );
|
|
if ( ( puserslbi == NULL )
|
|
|| ( (err = puserslbi->QueryError()) != NERR_Success )
|
|
|| ( _lbUsers.AddItem( puserslbi ) < 0 )
|
|
)
|
|
{
|
|
//
|
|
// If err is still NERR_Success, set it to ERROR_NOT_ENOUGH_MEMORY
|
|
// ( either allocation failed or failed to add it in list box )
|
|
//
|
|
err = err? err: (APIERR) ERROR_NOT_ENOUGH_MEMORY;
|
|
delete puserslbi;
|
|
puserslbi = NULL;
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
}
|
|
|
|
_lbUsers.Invalidate( TRUE );
|
|
_lbUsers.SetRedraw( TRUE );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CURRENT_USERS_WARNING_DIALOG::QueryHelpContext
|
|
|
|
SYNOPSIS: Get the help context of the dialog
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: Returns the help context
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
ULONG CURRENT_USERS_WARNING_DIALOG::QueryHelpContext( VOID )
|
|
{
|
|
return _ulHelpContextBase + HC_CURRENTUSERSWARNING;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: USERS_LISTBOX::USERS_LISTBOX
|
|
|
|
SYNOPSIS: Constructor - list box used in CURRENT_USERS_WARNING_DIALOG
|
|
|
|
ENTRY: powin - owner window
|
|
cid - resource id of the listbox
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES: This is a read-only listbox.
|
|
|
|
HISTORY:
|
|
Yi-HsinS 1/21/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
USERS_LISTBOX::USERS_LISTBOX( OWNER_WINDOW *powin, CID cid )
|
|
: BLT_LISTBOX( powin, cid, TRUE ) // ReadOnly Listbox
|
|
{
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
|
|
APIERR err;
|
|
if ( (err = DISPLAY_TABLE::CalcColumnWidths( _adx, 3, powin, cid, FALSE))
|
|
!= NERR_Success )
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: USERS_LBI::USERS_LBI
|
|
|
|
SYNOPSIS: List box items used in CURRENT_USERS_WARNING_DIALOG
|
|
|
|
ENTRY: c1 - connection_info_1 returned by NetConnectionEnum
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
USERS_LBI::USERS_LBI( const CONN1_ENUM_OBJ &c1 )
|
|
: _nlsUserName( c1.QueryUserName() ),
|
|
_usNumOpens( c1.QueryNumOpens() ),
|
|
_ulTime( c1.QueryTime() )
|
|
{
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
|
|
APIERR err;
|
|
if ( ( err = _nlsUserName.QueryError()) != NERR_Success )
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: USERS_LBI::~USERS_LBI
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
USERS_LBI::~USERS_LBI()
|
|
{
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: USERS_LBI::Paint
|
|
|
|
SYNOPSIS: Redefine Paint() method of LBI class
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
beng 6-Apr-1992 Removed wsprintf
|
|
beng 22-Apr-1992 Change to LBI::Paint
|
|
|
|
********************************************************************/
|
|
|
|
VOID USERS_LBI::Paint( LISTBOX *plb,
|
|
HDC hdc,
|
|
const RECT *prect,
|
|
GUILTT_INFO *pGUILTT ) const
|
|
{
|
|
|
|
APIERR err;
|
|
DEC_STR nlsNumOpens( _usNumOpens );
|
|
NLS_STR nlsTime;
|
|
|
|
if ( ((err = nlsNumOpens.QueryError()) != NERR_Success )
|
|
|| ((err = nlsTime.QueryError()) != NERR_Success )
|
|
|| ((err = ConvertTime( _ulTime, &nlsTime )) != NERR_Success )
|
|
)
|
|
{
|
|
::MsgPopup( plb->QueryOwnerHwnd(), err);
|
|
return;
|
|
}
|
|
|
|
|
|
STR_DTE strdteUserName( _nlsUserName );
|
|
STR_DTE strdteNumOpens( nlsNumOpens );
|
|
STR_DTE strdteTime( nlsTime );
|
|
|
|
DISPLAY_TABLE dt(3, ((USERS_LISTBOX *) plb)->QueryColumnWidths() );
|
|
dt[0] = &strdteUserName;
|
|
dt[1] = &strdteNumOpens;
|
|
dt[2] = &strdteTime;
|
|
|
|
dt.Paint( plb, hdc, prect, pGUILTT );
|
|
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: USERS_LBI::ConvertTime
|
|
|
|
SYNOPSIS: Convert the time given from ULONG (seconds) to a string
|
|
to be shown. It complies with the internationalization
|
|
of time using INTL_PROFILE.
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
#define SECONDS_PER_DAY 86400
|
|
#define SECONDS_PER_HOUR 3600
|
|
#define SECONDS_PER_MINUTE 60
|
|
|
|
APIERR USERS_LBI::ConvertTime( ULONG ulTime, NLS_STR *pnlsTime) const
|
|
{
|
|
INTL_PROFILE intlProf;
|
|
|
|
INT nDay = (INT) ulTime / SECONDS_PER_DAY;
|
|
ulTime %= SECONDS_PER_DAY;
|
|
INT nHour = (INT) ulTime / SECONDS_PER_HOUR;
|
|
ulTime %= SECONDS_PER_HOUR;
|
|
INT nMinute = (INT) ulTime / SECONDS_PER_MINUTE;
|
|
INT nSecond = (INT) ulTime % SECONDS_PER_MINUTE;
|
|
|
|
|
|
return intlProf.QueryDurationStr( nDay, nHour, nMinute,
|
|
nSecond, pnlsTime);
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: USERS_LBI::Compare
|
|
|
|
SYNOPSIS: Redefine Compare() method of LBI class
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
INT USERS_LBI::Compare( const LBI *plbi ) const
|
|
{
|
|
return( _nlsUserName._stricmp( ((const USERS_LBI *) plbi)->_nlsUserName ));
|
|
}
|
|
|