windows-nt/Source/XPSP1/NT/admin/netui/ftpmgr/ftpsmx/ftpsmx.cxx

582 lines
16 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1993 **/
/**********************************************************************/
/*
ftpsmx.cxx
This contains the main module for the FTP Server Manager
Extension. It contains "SMLoadMenuW",...
FILE HISTORY:
YiHsinS 25-Mar-1993 Templated from smxdebug.c
*/
#define INCL_NET
#define INCL_NETLIB
#define INCL_NETWKSTA
#define INCL_WINDOWS
#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_MSGPOPUP
#include <blt.hxx>
#include <dbgstr.hxx>
extern "C"
{
#include <smx.h> // Server Manager extension defs
#include <ftpmgr.h>
}
extern "C"
{
//
// Dll load/unload entry point
//
BOOL FAR PASCAL FtpSmxDllInitialize( HINSTANCE hInstance,
DWORD nReason,
LPVOID pReserved );
}
#include <lmowks.hxx> // WKSTA_10
#include <ftpmgr.hxx> // FTP_SVCMGR_DIALOG
//
// Constants
//
#define FTP_EXT_VERSION 0 // Version number for the extension interface
//
// Globals.
//
HINSTANCE _hInstance;
HWND _hwndMessage;
DWORD _dwVersion;
DWORD _dwDelta;
/*******************************************************************
NAME: InitializeDll
SYNOPSIS: Perform DLL initialiazation functions on a
once-per-process basis.
ENTRY: hInstance - Program instance of the caller.
EXIT: The DLL has been initialized.
RETURNS: BOOL - TRUE = Initialization OK.
FALSE = Initialization failed.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
BOOL InitializeDll( HINSTANCE hInstance )
{
//
// Save the instance handle.
//
_hInstance = hInstance;
APIERR err = BLT::Init( _hInstance,
IDRSRC_FTPMGR_BASE, IDRSRC_FTPMGR_LAST,
IDS_UI_FTPMGR_BASE, IDS_UI_FTPMGR_LAST );
if ( err == NERR_Success )
{
err = BLT::RegisterHelpFile( _hInstance,
IDS_FTPSMX_HELPFILENAME,
HC_UI_FTPMGR_BASE, HC_UI_FTPMGR_LAST );
}
if ( err != NERR_Success )
BLT::Term( _hInstance );
return ( err == NERR_Success );
} // InitializeDll
/*******************************************************************
NAME: TerminateDll
SYNOPSIS: Perform DLL termination functions on a
once-per-process basis.
EXIT: All necessary BLT terminators have been invoked.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
VOID TerminateDll( VOID )
{
//
// Kill the NetUI goodies.
//
BLT::DeregisterHelpFile( _hInstance, 0 );
BLT::Term( _hInstance );
//
// Just in case we try to do anything goofy.
//
_hInstance = NULL;
} // TerminateDll
/*******************************************************************
NAME: RunFtpSvcMgr
SYNOPSIS: Invoke the user session dialog of the FTP Server
Manager Extension
ENTRY: hWnd - Window handle of parent window.
pszServer - The name of the server to set focus to
RETURNS: APIERR
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
VOID RunFtpSvcMgr( HWND hWnd, const TCHAR *pszServer )
{
AUTO_CURSOR autocur;
//
// Get the help file name
//
RESOURCE_STR nlsHelpFileName( IDS_FTPSMX_HELPFILENAME );
APIERR err = nlsHelpFileName.QueryError();
//
// Invoke the user session dialog
//
if ( err == NERR_Success )
{
FTP_SVCMGR_DIALOG * pDlg = new FTP_SVCMGR_DIALOG( hWnd,
pszServer );
err = ( pDlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: pDlg->QueryError();
if ( err == NERR_Success )
err = pDlg->Process();
delete pDlg;
pDlg = NULL;
}
if( err != NERR_Success )
{
// Try to see why we get the rpc server unavailable error.
// Mainly, we want to distinguish between the case where
// the server is not found v.s. the ftp service is
// unavailable.
if ( err == RPC_S_SERVER_UNAVAILABLE )
{
WKSTA_10 wksta10( pszServer );
APIERR errTemp = wksta10.QueryError();
if ( errTemp == NERR_Success )
{
errTemp = wksta10.GetInfo();
if ( errTemp != NERR_Success )
{
// An error occurred while trying to do NetWorkstaGetInfo
// at level 10 ( no privilege needed). Hence, the problem
// might be bad path... We thus report the error
// from NetWkstaGetInfo ( level 10 ).
err = errTemp;
}
}
}
//
// At this point, either the remote computer exist
// or wksta10 object failed to construct. Hence, report that the
// FTP Service is unavailable.
//
if ( err == RPC_S_SERVER_UNAVAILABLE )
{
::MsgPopup( hWnd, IERR_FTP_SERVICE_UNAVAILABLE_ON_COMPUTER,
MPSEV_ERROR, MP_OK, pszServer );
}
else
{
::MsgPopup( hWnd, err );
}
}
} // RunFtpSvcMgr
/*******************************************************************
NAME: FtpSmxDllInitialize
SYNOPSIS: This DLL entry point is called when processes & threads
are initialized and terminated, or upon calls to
LoadLibrary() and FreeLibrary().
ENTRY: hInstance - A handle to the DLL.
nReason - Indicates why the DLL entry
point is being called.
pReserved - Reserved.
RETURNS: BOOL - TRUE = DLL init was successful.
FALSE = DLL init failed.
NOTES: The return value is only relevant during processing of
DLL_PROCESS_ATTACH notifications.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
BOOL FAR PASCAL FtpSmxDllInitialize( HINSTANCE hInstance,
DWORD nReason,
LPVOID pReserved )
{
UNREFERENCED( pReserved );
BOOL fResult = TRUE;
switch( nReason )
{
case DLL_PROCESS_ATTACH:
//
// This notification indicates that the DLL is attaching to
// the address space of the current process. This is either
// the result of the process starting up, or after a call to
// LoadLibrary(). The DLL should us this as a hook to
// initialize any instance data or to allocate a TLS index.
//
// This call is made in the context of the thread that
// caused the process address space to change.
//
fResult = InitializeDll( hInstance );
break;
case DLL_PROCESS_DETACH:
//
// This notification indicates that the calling process is
// detaching the DLL from its address space. This is either
// due to a clean process exit or from a FreeLibrary() call.
// The DLL should use this opportunity to return any TLS
// indexes allocated and to free any thread local data.
//
// Note that this notification is posted only once per
// process. Individual threads do not invoke the
// DLL_THREAD_DETACH notification.
//
TerminateDll();
break;
case DLL_THREAD_ATTACH:
//
// This notfication indicates that a new thread is being
// created in the current process. All DLLs attached to
// the process at the time the thread starts will be
// notified. The DLL should use this opportunity to
// initialize a TLS slot for the thread.
//
// Note that the thread that posts the DLL_PROCESS_ATTACH
// notification will not post a DLL_THREAD_ATTACH.
//
// Note also that after a DLL is loaded with LoadLibrary,
// only threads created after the DLL is loaded will
// post this notification.
//
break;
case DLL_THREAD_DETACH:
//
// This notification indicates that a thread is exiting
// cleanly. The DLL should use this opportunity to
// free any data stored in TLS indices.
//
break;
default:
//
// Who knows? Just ignore it.
//
break;
}
return fResult;
} // FtpSmxDllInitialize
/*******************************************************************
NAME: SMELoadMenuW
SYNOPSIS: This DLL entrypoint notifies the extension that it
is getting loaded by the application.
ENTRY: hwndMessage - The "owning" window.
psmsload - Points to an SMS_LOADMENU
structure containing load
parameters.
RETURNS: DWORD - Actually an APIERR, should be
0 if successful.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
DWORD PASCAL SMELoadMenuW( HWND hwndMessage,
PSMS_LOADMENU psmsload )
{
if ( psmsload == NULL )
return ERROR_INVALID_PARAMETER;
_hwndMessage = hwndMessage;
_dwDelta = psmsload->dwMenuDelta;
_dwVersion = FTP_EXT_VERSION;
if( psmsload->dwVersion > _dwVersion )
{
psmsload->dwVersion = _dwVersion;
}
else if( psmsload->dwVersion < _dwVersion )
{
_dwVersion = psmsload->dwVersion;
}
psmsload->dwServerType = 0; // Don't need special menu for View
APIERR err = NERR_Success;
if ( ( ::LoadString( _hInstance, IDS_FTPSMX_MENUNAME,
psmsload->szMenuName, MENU_TEXT_LEN ) == 0 )
|| ( ::LoadString( _hInstance, IDS_FTPSMX_HELPFILENAME,
psmsload->szHelpFileName, MAX_PATH-1 ) == 0 )
|| ( (psmsload->hMenu = ::LoadMenu( _hInstance,
MAKEINTRESOURCE( ID_FTPSMX_MENU ))) == NULL )
)
{
err = GetLastError();
}
return err;
} // SMELoadMenuW
/*******************************************************************
NAME: SMEGetExtendedErrorStringW
SYNOPSIS: If SMELoadW returns ERROR_EXTENDED_ERROR, then this
entrypoint should be called to retrieve the error
text associated with the failure condition.
RETURNS: LPTSTR - The extended error text.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
LPTSTR PASCAL SMEGetExtendedErrorStringW( VOID )
{
// This extension will never return ERROR_EXTENDED_ERROR when
// SMELoad fails.
return NULL;
} // SMEGetExtendedErrorStringW
/*******************************************************************
NAME: SMEMenuAction
SYNOPSIS: Notifies the extension DLL that one of its menu
items has been selected.
ENTRY: dwEventId - The menu ID being activated (should be 1-99).
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
VOID PASCAL SMEMenuAction( HWND hwndParent, DWORD dwEventId )
{
APIERR err = NERR_Success;
//
// Get the number of servers selected
//
SMS_GETSELCOUNT smsget;
if ( (::SendMessage(_hwndMessage, SM_GETSELCOUNT, 0, (LPARAM)&smsget) == 0)
|| (smsget.dwItems == 0 )
)
{
// No servers are selected
err = IDS_NO_SERVERS_SELECTED;
}
else
{
//
// Get the name of the selected server
// ( There should only be one since server manager is single select
// only ).
//
SMS_GETSERVERSEL smssel;
if ( !SendMessage( _hwndMessage, SM_GETSERVERSEL, 0, (LPARAM)&smssel ))
{
err = IDS_CANNOT_GET_SERVER_SELECTION;
}
else
{
switch( dwEventId )
{
case IDM_FTP_SERVICE:
RunFtpSvcMgr( hwndParent, smssel.szServerName );
break;
default:
//
// Who knows? Just ignore it.
//
break;
}
}
}
if ( err != NERR_Success )
{
::MsgPopup( hwndParent, err );
}
} // SMEMenuAction
/*******************************************************************
NAME: SMEUnloadMenu
SYNOPSIS: Notifies the extension DLL that it is getting unloaded.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
VOID PASCAL SMEUnloadMenu( VOID )
{
//
// Nothing to do
//
} // SMEUnloadMenu
/*******************************************************************
NAME: SMEInitializeMenu
SYNOPSIS: Notifies the extension DLL that the main menu is
getting activated. The extension should use this
opportunity to perform any menu manipulations.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
VOID PASCAL SMEInitializeMenu( VOID )
{
//
// Nothing to do
//
} // 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:
YiHsinS 25-Mar-1993 Created
********************************************************************/
VOID PASCAL SMERefresh( HWND hwndParent )
{
//
// Don't need to do refresh since this extension does
// not recognize additional servers.
//
} // SMERefresh
/*******************************************************************
NAME: SMEValidateW
SYNOPSIS: Tries to recognize the given server.
ENTRY: psmsvalidate - Points to an SMS_VALIDATE
structure.
RETURNS: BOOL - TRUE if recognized,
FALSE otherwise.
HISTORY:
YiHsinS 25-Mar-1993 Created
********************************************************************/
BOOL PASCAL SMEValidateW( PSMS_VALIDATE psmsvalidate )
{
UNREFERENCED( psmsvalidate );
//
// This extension does not recognize additional servers
//
return FALSE;
} // SMEValidateW