396 lines
11 KiB
C++
396 lines
11 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
* sharefmx.cxx
|
|
* Contains dialogs called by FMExtensionProc/WinFile/Svrmgr for creating,
|
|
* deleting and managing shares.
|
|
*
|
|
* FILE HISTORY:
|
|
* Yi-HsinS 8/25/91 Created
|
|
* Yi-HsinS 11/25/91 Made sleShareDir in Create Share dialog
|
|
* accepts local full path name.
|
|
* Yi-HsinS 12/5/91 Uses NET_NAME
|
|
* Yi-HsinS 12/15/91 Uses SHARE_NET_NAME
|
|
* Yi-HsinS 12/31/91 Unicode work
|
|
* Yi-HsinS 1/8/92 Move dialogs to sharestp.cxx,
|
|
* sharecrt.cxx
|
|
* Yi-HsinS 8/10/92 Added ShareManage and got rid of
|
|
* WNetShareManagementW...
|
|
*
|
|
*/
|
|
|
|
#define INCL_WINDOWS_GDI
|
|
#define INCL_WINDOWS
|
|
#define INCL_DOSERRORS
|
|
#define INCL_NETERRORS
|
|
#define INCL_NETSHARE
|
|
#define INCL_NETUSE
|
|
#define INCL_NETSERVER
|
|
#define INCL_NETCONS
|
|
#define INCL_NETLIB
|
|
#include <lmui.hxx>
|
|
|
|
extern "C"
|
|
{
|
|
#include <mpr.h>
|
|
#include <helpnums.h>
|
|
#include <sharedlg.h>
|
|
}
|
|
#include <wfext.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 <lmoshare.hxx>
|
|
#include <lmoesh.hxx>
|
|
#include <lmoeconn.hxx>
|
|
#include <lmosrv.hxx>
|
|
#include <wnetdev.hxx>
|
|
|
|
#include <fmx.hxx>
|
|
|
|
#include <strchlit.hxx> // for string and character constants
|
|
#include "sharestp.hxx"
|
|
#include "sharecrt.hxx"
|
|
#include "sharemgt.hxx"
|
|
#include "sharefmx.hxx"
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: ShareCreate
|
|
|
|
SYNOPSIS: Get the item selected in FM and call the create share dialog
|
|
|
|
ENTRY: hwnd - hwnd of the parent window
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR ShareCreate( HWND hwnd )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
if ( err = ::InitShellUI() )
|
|
return err;
|
|
|
|
ULONG ulOldHelpContextBase = POPUP::SetHelpContextBase( HC_UI_SHELL_BASE );
|
|
//
|
|
// Get the first selected item in the file manager
|
|
//
|
|
NLS_STR nlsSelItem;
|
|
FMX fmx( hwnd );
|
|
SERVER_WITH_PASSWORD_PROMPT *psvr = NULL;
|
|
|
|
if ( ((err = nlsSelItem.QueryError()) == NERR_Success )
|
|
&& ((err = ::GetSelItem( hwnd, &nlsSelItem ) ) == NERR_Success )
|
|
)
|
|
{
|
|
|
|
BOOL fShared = FALSE;
|
|
|
|
//
|
|
// If a file/directory is selected, check to see if the directory
|
|
// (the directory the file is in if a file is selected)
|
|
// is shared or not. If we select a file/directory on a LM2.1
|
|
// share level server, a dialog will prompt for password to the
|
|
// ADMIN$ share if we don't already have a connection to it.
|
|
//
|
|
if ( nlsSelItem.QueryTextLength() != 0 )
|
|
{
|
|
AUTO_CURSOR autocur;
|
|
NET_NAME netname( nlsSelItem, TYPE_PATH_ABS );
|
|
NLS_STR nlsLocalPath;
|
|
NLS_STR nlsServer;
|
|
|
|
if ( ((err = netname.QueryError()) == NERR_Success )
|
|
&& ((err = nlsLocalPath.QueryError()) == NERR_Success )
|
|
&& ((err = nlsServer.QueryError()) == NERR_Success )
|
|
)
|
|
{
|
|
BOOL fLocal = netname.IsLocal( &err );
|
|
|
|
//
|
|
// Use better error code for non-LM device
|
|
//
|
|
if ( err == NERR_InvalidDevice )
|
|
err = IERR_NOT_SUPPORTED_ON_NON_LM_DRIVE;
|
|
|
|
if ( ( err == NERR_Success )
|
|
&& ( fLocal
|
|
|| ((err = netname.QueryComputerName(&nlsServer))
|
|
== NERR_Success)
|
|
)
|
|
)
|
|
|
|
{
|
|
psvr = new SERVER_WITH_PASSWORD_PROMPT( nlsServer,
|
|
hwnd,
|
|
HC_UI_SHELL_BASE );
|
|
if ( ( psvr != NULL )
|
|
&& ((err = psvr->QueryError()) == NERR_Success )
|
|
&& ((err = psvr->GetInfo()) == NERR_Success )
|
|
&& ((err = netname.QueryLocalPath(&nlsLocalPath))
|
|
==NERR_Success)
|
|
)
|
|
{
|
|
//
|
|
// Check to see if the directory is shared
|
|
//
|
|
SHARE2_ENUM sh2Enum( nlsServer );
|
|
if ( ((err = sh2Enum.QueryError()) == NERR_Success )
|
|
&& ((err = sh2Enum.GetInfo()) == NERR_Success )
|
|
)
|
|
{
|
|
SHARE_NAME_WITH_PATH_ENUM_ITER shPathEnum(sh2Enum,
|
|
nlsLocalPath);
|
|
|
|
if ((err = shPathEnum.QueryError()) == NERR_Success)
|
|
{
|
|
const TCHAR *pszShare;
|
|
while ((pszShare = shPathEnum()) != NULL )
|
|
{
|
|
fShared = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( psvr == NULL )
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( err == NERR_Success )
|
|
{
|
|
//
|
|
// If the directory is shared, popup the share properties
|
|
// dialog. If not, popup the new share dialog.
|
|
//
|
|
|
|
SHARE_DIALOG_BASE *pdlg;
|
|
if ( !fShared )
|
|
pdlg = new FILEMGR_NEW_SHARE_DIALOG( hwnd,
|
|
nlsSelItem,
|
|
HC_UI_SHELL_BASE );
|
|
else
|
|
pdlg = new FILEMGR_SHARE_PROP_DIALOG( hwnd,
|
|
nlsSelItem,
|
|
HC_UI_SHELL_BASE );
|
|
|
|
err = (APIERR) ( pdlg == NULL? ERROR_NOT_ENOUGH_MEMORY
|
|
: pdlg->QueryError());
|
|
|
|
if ( err == NERR_Success)
|
|
{
|
|
BOOL fSucceeded;
|
|
err = pdlg->Process( &fSucceeded );
|
|
|
|
//
|
|
// Refresh the file manager if successfully created a share
|
|
//
|
|
if (( err == NERR_Success ) && fSucceeded )
|
|
{
|
|
delete psvr;
|
|
psvr = NULL;
|
|
fmx.Refresh();
|
|
}
|
|
}
|
|
|
|
delete pdlg;
|
|
}
|
|
|
|
}
|
|
|
|
delete psvr;
|
|
psvr = NULL;
|
|
|
|
if ( err != NERR_Success )
|
|
{
|
|
if ( err == ERROR_INVALID_LEVEL )
|
|
err = ERROR_NOT_SUPPORTED;
|
|
else if (err == IERR_USER_CLICKED_CANCEL)
|
|
err = NERR_Success;
|
|
|
|
if ( err != NERR_Success )
|
|
::MsgPopup( hwnd, err );
|
|
}
|
|
|
|
POPUP::SetHelpContextBase( ulOldHelpContextBase );
|
|
return NERR_Success;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: ShareStop
|
|
|
|
SYNOPSIS: Get the item selected in FM and call the stop share dialog
|
|
|
|
ENTRY: hwnd - hwnd of the parent window
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/25/91 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR ShareStop( HWND hwnd )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
|
|
if ( err = ::InitShellUI() )
|
|
return err;
|
|
|
|
ULONG ulOldHelpContextBase = POPUP::SetHelpContextBase( HC_UI_SHELL_BASE );
|
|
|
|
//
|
|
// Get the first selected item in the file manager
|
|
//
|
|
NLS_STR nlsSelItem;
|
|
FMX fmx( hwnd );
|
|
if ( ((err = nlsSelItem.QueryError()) == NERR_Success )
|
|
&& ((err = ::GetSelItem( hwnd, &nlsSelItem ) ) == NERR_Success )
|
|
)
|
|
{
|
|
//
|
|
// Check to see if the selected item is on a LM drive,
|
|
// if not, pop an error.
|
|
//
|
|
NET_NAME netname( nlsSelItem, TYPE_PATH_ABS );
|
|
|
|
if ((err = netname.QueryError()) == NERR_Success )
|
|
{
|
|
BOOL fLocal = netname.IsLocal( &err );
|
|
|
|
//
|
|
// Use better error code for non-LM device
|
|
//
|
|
if ( err == NERR_InvalidDevice )
|
|
err = IERR_NOT_SUPPORTED_ON_NON_LM_DRIVE;
|
|
}
|
|
|
|
if ( err == NERR_Success )
|
|
{
|
|
//
|
|
// Show the stop sharing dialog
|
|
//
|
|
STOP_SHARING_DIALOG *pdlg = new STOP_SHARING_DIALOG( hwnd,
|
|
nlsSelItem,
|
|
HC_UI_SHELL_BASE );
|
|
|
|
err = (APIERR) ( pdlg == NULL? ERROR_NOT_ENOUGH_MEMORY
|
|
: pdlg->QueryError() );
|
|
BOOL fSucceeded;
|
|
if ( err == NERR_Success )
|
|
err = pdlg->Process( &fSucceeded );
|
|
|
|
delete pdlg;
|
|
|
|
//
|
|
// Refresh the file manager if successfully stopped sharing a share
|
|
//
|
|
if (( err == NERR_Success ) && fSucceeded )
|
|
fmx.Refresh();
|
|
}
|
|
}
|
|
|
|
if ( err != NERR_Success )
|
|
{
|
|
if (err == IERR_USER_CLICKED_CANCEL)
|
|
err = NERR_Success;
|
|
else
|
|
::MsgPopup( hwnd, err );
|
|
}
|
|
|
|
POPUP::SetHelpContextBase( ulOldHelpContextBase );
|
|
return NERR_Success;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: ShareManage
|
|
|
|
SYNOPSIS: Entry point for the share management dialog to be called
|
|
from the server manager.
|
|
|
|
|
|
ENTRY: hwnd - hwnd of the parent window
|
|
pszServer - The server to focus on
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 8/8/92 Created
|
|
|
|
********************************************************************/
|
|
|
|
VOID ShareManage( HWND hwnd, const TCHAR *pszServer )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
|
|
ULONG ulOldHelpContextBase = POPUP::SetHelpContextBase( HC_UI_SRVMGR_BASE);
|
|
|
|
if ( ( err = ::InitShellUI() )
|
|
|| ( pszServer == NULL )
|
|
)
|
|
{
|
|
err = err? err : ERROR_INVALID_PARAMETER ;
|
|
}
|
|
else
|
|
{
|
|
SHARE_MANAGEMENT_DIALOG *pdlg =
|
|
new SHARE_MANAGEMENT_DIALOG( hwnd, pszServer, HC_UI_SRVMGR_BASE );
|
|
|
|
err = (APIERR) ( pdlg == NULL? ERROR_NOT_ENOUGH_MEMORY
|
|
: pdlg->QueryError() );
|
|
if ( err == NERR_Success )
|
|
{
|
|
err = pdlg->Process();
|
|
}
|
|
|
|
delete pdlg;
|
|
}
|
|
|
|
if ( err != NERR_Success )
|
|
{
|
|
if ( err == ERROR_INVALID_LEVEL )
|
|
err = ERROR_NOT_SUPPORTED;
|
|
else if (err == IERR_USER_CLICKED_CANCEL)
|
|
err = NERR_Success;
|
|
|
|
if ( err != NERR_Success )
|
|
::MsgPopup( hwnd, err );
|
|
}
|
|
|
|
POPUP::SetHelpContextBase( ulOldHelpContextBase );
|
|
}
|
|
|