|
|
/**********************************************************************/ /** 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
|