windows-nt/Source/XPSP1/NT/net/sfm/afp/ui/afpmgr/smx.cxx
2020-09-26 16:20:57 +08:00

521 lines
11 KiB
C++

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
smx.cxx
This module contains all the entry points for the Server Manager
extension.
FILE HISTORY:
NarenG 6-Oct-1992 Created.
*/
#define INCL_NET
#define INCL_NETLIB
#define INCL_NETSERVICE
#define INCL_WINDOWS
#define INCL_WINDOWS_GDI
#define INCL_NETERRORS
#define INCL_DOSERRORS
#include <lmui.hxx>
#if defined(DEBUG)
static const CHAR szFileName[] = __FILE__;
#define _FILENAME_DEFINED_ONCE szFileName
#endif
#include <uiassert.hxx>
#include <uitrace.hxx>
#define INCL_BLT_WINDOW
#define INCL_BLT_DIALOG
#define INCL_BLT_CONTROL
#define INCL_BLT_CLIENT
#define INCL_BLT_MSGPOPUP
#define INCL_BLT_EVENT
#define INCL_BLT_MISC
#define INCL_BLT_TIMER
#define INCL_BLT_CC
#include <blt.hxx>
#include <dbgstr.hxx>
extern "C"
{
#include <smx.h>
#include <afpmgr.h>
#include <macfile.h>
}
#include <startafp.hxx>
#include <senddlg.hxx>
#include <srvprop.hxx>
#include <volmgt.hxx>
extern "C"
{
//
// Globals.
//
extern HINSTANCE _hInstance;// Exported by the afpmgr.cxx module.
static HWND _hWnd; // Handle to the owner window.
static DWORD _dwVersion; // Will contain the SMX version being used.
static DWORD _dwDelta; // Used to manipulate menu items.
static HMENU _hMenu; // Created at load time.
} // extern "C"
/*******************************************************************
NAME: SMELoadMenu
SYNOPSIS: This entrypoint is to notify the DLL that it
is getting loaded by the Server Manager.
ENTRY: hWnd - The "owning" window.
psmsload - Points to an SMS_LOADMENU
structure containing load
parameters.
RETURNS: DWORD - Actually an APIERR, should be
0 if successful.
HISTORY:
NarenG 5-Nov-1992 Created.
********************************************************************/
DWORD PASCAL SMELoadMenuW( HWND hWnd,
PSMS_LOADMENU psmsload )
{
if( psmsload == NULL )
{
return ERROR_INVALID_PARAMETER;
}
//
// Save the handle to the owner window
//
_hWnd = hWnd;
//
// Set the version field to the lower of the our version and the
// Server manager version
//
_dwVersion = SME_VERSION;
if( psmsload->dwVersion > _dwVersion )
{
psmsload->dwVersion = _dwVersion;
}
else
if( psmsload->dwVersion < _dwVersion )
{
_dwVersion = psmsload->dwVersion;
}
//
// Delta to be added to the menu ID before trying to manipulate
// any menu item
//
_dwDelta = psmsload->dwMenuDelta;
//
// Only enumerate AFP type servers
//
psmsload->dwServerType = SV_TYPE_AFP;
RESOURCE_STR nlsMenuName( IDS_AFPMGR_MENU_NAME );
APIERR err;
if ( ( err = nlsMenuName.QueryError() ) != NERR_Success )
{
return err;
}
if ( err = nlsMenuName.MapCopyTo( psmsload->szMenuName,
sizeof(psmsload->szMenuName)))
{
return err;
}
_hMenu = ::LoadMenu(::_hInstance,MAKEINTRESOURCE(ID_SRVMGR_MENU));
if ( _hMenu == NULL )
{
return ::GetLastError();
}
psmsload->hMenu = _hMenu;
RESOURCE_STR nlsHelpFileName( IDS_AFPMGR_HELPFILENAME );
if ( ( err = nlsHelpFileName.QueryError() ) != NERR_Success )
{
return err;
}
if ( err = nlsHelpFileName.MapCopyTo( psmsload->szHelpFileName,
sizeof(psmsload->szHelpFileName)))
{
return err;
}
return NO_ERROR;
} // SMELoadMenu
/*******************************************************************
NAME: SMEGetExtendedErrorString
SYNOPSIS: If SMELoad returns ERROR_EXTENDED_ERROR, then this
entrypoint will be called to retrieve the error
text associated with the failure condition.
RETURNS: LPTSTR - The extended error text.
HISTORY:
NarenG 5-Nov-1992 Created.
********************************************************************/
LPTSTR PASCAL SMEGetExtendedErrorStringW( VOID )
{
return (TCHAR*)TEXT("");
} // SMEGetExtendedErrorString
/*******************************************************************
NAME: SMEUnloadMenu
SYNOPSIS: Notifies the extension DLL that it is getting unloaded.
HISTORY:
NarenG 5-Nov-1992 Created.
********************************************************************/
VOID PASCAL SMEUnloadMenu( VOID )
{
//
// This space intentionally left blank.
//
} // SMEUnload
/*******************************************************************
NAME: SMEInitializeMenu
SYNOPSIS: Notifies the DLL that the main menu is
getting activated. Do all menu manipulations here.
HISTORY:
NarenG 5-Nov-1992 Created.
********************************************************************/
VOID PASCAL SMEInitializeMenu( VOID )
{
//
// If there was no server selected. Disable all the menu items
//
SMS_GETSELCOUNT smsSelCount;
if( ( !SendMessage( _hWnd,
SM_GETSELCOUNT,
0,
(LPARAM)&smsSelCount ) )
||
( smsSelCount.dwItems == 0 ) )
{
EnableMenuItem( _hMenu,
(UINT)(IDM_SEND_MESSAGE+_dwDelta),
(UINT)MF_GRAYED);
EnableMenuItem( _hMenu,
(UINT)(IDM_PROPERTIES+_dwDelta),
(UINT)MF_GRAYED);
EnableMenuItem( _hMenu,
(UINT)(IDM_VOLUME_MGT+_dwDelta),
(UINT)MF_GRAYED);
}
else
{
EnableMenuItem( _hMenu,
(UINT)(IDM_SEND_MESSAGE+_dwDelta),
(UINT)MF_ENABLED);
EnableMenuItem( _hMenu,
(UINT)(IDM_PROPERTIES+_dwDelta),
(UINT)MF_ENABLED);
EnableMenuItem( _hMenu,
(UINT)(IDM_VOLUME_MGT+_dwDelta),
(UINT)MF_ENABLED);
}
return;
} // SMEInitializeMenu
/*******************************************************************
NAME: SMERefresh
SYNOPSIS: Notifies the extension DLL that the user has requested
a refresh. The extension should use this opportunity
to update any cached data.
HISTORY:
NarenG 5-Nov-1992 Created.
********************************************************************/
VOID PASCAL SMERefresh( HWND hWnd )
{
//
// This space intentionally left blank.
//
} // SMERefresh
/*******************************************************************
NAME: SMEValidate
SYNOPSIS: Called to validate a server that the server manager
does not recognize. We ignore these servers.
HISTORY:
NarenG 5-Nov-1992 Created.
********************************************************************/
BOOL PASCAL SMEValidateW( PSMS_VALIDATE psmsValidate )
{
return FALSE;
} // SMEValidate
/*******************************************************************
NAME: SMEMenuAction
SYNOPSIS: Notifies the DLL that one of its menu
items has been selected.
ENTRY: dwEventId - The menu ID being activated
(should be 1-99).
HISTORY:
NarenG 5-Nov-1992 Created.
********************************************************************/
VOID PASCAL SMEMenuAction( HWND hWnd, DWORD dwEventId )
{
DWORD err;
AFP_SERVER_HANDLE hServer = NULL;
AUTO_CURSOR Cursor;
//
// Get the current server selection
//
SMS_GETSERVERSEL2 smsSel;
if( !SendMessage( _hWnd, SM_GETSERVERSEL2, 0, (LPARAM)&smsSel ) )
{
//
// Tell the user the bad news
//
::MsgPopup( _hWnd,
IDS_COULD_NOT_GET_CURRENT_SEL,
MPSEV_WARNING,
MP_OK );
return;
}
//
// Check if the server focus of the current selection is running AFP
//
BOOL fIsAfpRunning;
if ( ( err = IsAfpServiceRunning( smsSel.szServerName,
&fIsAfpRunning ) ) != NERR_Success )
{
if ( err == IDS_MACFILE_NOT_INSTALLED )
{
::MsgPopup( _hWnd,
err,
MPSEV_ERROR,
MP_OKCANCEL,
smsSel.szServerName,
MP_OK );
}
else
{
::MsgPopup( _hWnd, err );
}
return;
}
if ( !fIsAfpRunning )
{
//
// Ask the user if he/she wants to start it.
//
if ( MsgPopup( hWnd,
IDS_START_AFPSERVER_NOW,
MPSEV_WARNING,
MP_YESNO,
MP_YES ) == IDNO )
{
//
// User does not want to start the afpserver so simply return.
//
return;
}
//
// Start the AFP Service
//
err = StartAfpService( hWnd, smsSel.szServerName );
if ( err != NERR_Success )
{
::MsgPopup( _hWnd, err );
return;
}
}
//
// Set up an RPC conenction with the server
//
if( (err = ::AfpAdminConnect( smsSel.szServerName, &hServer )) != NO_ERROR)
{
::MsgPopup( _hWnd, err );
return;
}
//
// What does the user want to do with the server ?
//
switch( dwEventId )
{
case IDM_SEND_MESSAGE:
{
//
// Invoke the send message Dialog.
//
SEND_MSG_SERVER_DIALOG * pSendMsgDlg = new SEND_MSG_SERVER_DIALOG(
_hWnd,
hServer,
smsSel.szServerName );
err = ( pSendMsgDlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: pSendMsgDlg->Process();
delete pSendMsgDlg;
break;
}
case IDM_PROPERTIES:
{
//
// Invoke the Main Property Dialog.
//
SERVER_PROPERTIES * pPropDlg = new SERVER_PROPERTIES(
_hWnd,
hServer,
smsSel.szServerName );
err = ( pPropDlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: pPropDlg->Process();
delete pPropDlg;
break;
}
case IDM_VOLUME_MGT:
{
//
// Invoke the volume management dialog
//
VOLUME_MANAGEMENT_DIALOG * pVolMgtDlg = new VOLUME_MANAGEMENT_DIALOG(
_hWnd,
hServer,
smsSel.szServerName );
err = ( pVolMgtDlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: pVolMgtDlg->Process();
delete pVolMgtDlg;
break;
}
default :
{
return;
}
}
if( err != NERR_Success )
{
::MsgPopup( _hWnd, AFPERR_TO_STRINGID(err) );
}
if ( hServer != NULL )
{
::AfpAdminDisconnect( hServer );
}
} // SMEMenuAction