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

1972 lines
44 KiB
C++

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
assoc.cxx
This file contains the definitions of
FILE_ASSOCIATION_DIALOG,
TYPE_CREATOR_LISTBOX,
TYPE_CREATOR_LBI,
EXTENSIONS_COMBOBOX,
EXTENSIONS_LBI
History:
NarenG 12/4/92 Created
*/
#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>
#define INCL_BLT_WINDOW
#define INCL_BLT_DIALOG
#define INCL_BLT_CONTROL
#define INCL_BLT_MISC
#define INCL_BLT_CLIENT
#define INCL_BLT_MSGPOPUP
#define INCL_BLT_SPIN_GROUP
#define INCL_BLT_GROUP
#include <blt.hxx>
#if defined(DEBUG)
static const CHAR szFileName[] = __FILE__;
#define _FILENAME_DEFINED_ONCE szFileName
#endif // DEBUG
#include <uiassert.hxx>
extern "C"
{
#include <afpmgr.h>
#include <search.h>
#include <macfile.h>
//
// Compare routine needed for qsort
//
int __cdecl CompareExtensions(
IN const void * pAfpExtension1,
IN const void * pAfpExtension2
);
}
#include <ellipsis.hxx>
#include <string.hxx>
#include <uitrace.hxx>
#include <dbgstr.hxx>
#include <netname.hxx>
#include "assoc.hxx"
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: FILE_ASSOCIATION_DIALOG
SYNOPSIS: FILE_ASSOCIATION_DIALOG class constructor.
ENTRY: hWndOwner - The owning window.
hServer - Handle used to make admin
API calls.
pszExtension - File extension of current selection.
EXIT: The object is constructed.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
FILE_ASSOCIATION_DIALOG :: FILE_ASSOCIATION_DIALOG(
HWND hWndOwner,
AFP_SERVER_HANDLE hServer,
const TCHAR * pszPath,
BOOL fIsFile )
: DIALOG_WINDOW ( MAKEINTRESOURCE( IDD_FILE_ASSOCIATION_DIALOG ), hWndOwner ),
_hServer( hServer ),
_cbExtensions( this, IDFA_CB_EXTENSIONS, AFP_EXTENSION_LEN ),
_lbTypeCreators( this, IDFA_LB_TYPE_CREATORS, hServer ),
_pbAssociate( this, IDFA_PB_ASSOCIATE ),
_pbAdd( this, IDFA_PB_ADD ),
_pbEdit( this, IDFA_PB_EDIT ),
_pbDelete( this, IDFA_PB_DELETE )
{
//
// Let's make sure everything constructed OK.
//
if( QueryError() != NERR_Success )
{
return;
}
APIERR err;
if ( (( err = _cbExtensions.QueryError() ) != NERR_Success ) ||
(( err = _lbTypeCreators.QueryError() ) != NERR_Success ) ||
(( err = _pbAssociate.QueryError() ) != NERR_Success ) ||
(( err = _pbAdd.QueryError() ) != NERR_Success ) ||
(( err = _pbEdit.QueryError() ) != NERR_Success ) ||
(( err = _pbDelete.QueryError() ) != NERR_Success ))
{
ReportError( err );
return;
}
//
// This may take a while
//
AUTO_CURSOR Cursor;
//
// If a path is supplied and the selection is a file, then extract
// the extension and set the SLE.
//
if ( pszPath != NULL && fIsFile )
{
//
// Extract the extension from the file
//
NLS_STR nlsExtension( pszPath );
if ( (err = nlsExtension.QueryError() ) != NERR_Success )
{
ReportError( err );
return;
}
ISTR istrExtension( nlsExtension );
if ( nlsExtension.strrchr( &istrExtension, TEXT('.') ))
{
const TCHAR * pszExtension =
(nlsExtension.QuerySubStr(++istrExtension))->QueryPch();
_cbExtensions.SetText( pszExtension );
}
}
err = BASE_ELLIPSIS::Init();
if( err != NO_ERROR )
{
ReportError( err );
return;
}
//
// Refresh the dialog and select the type/creator that the current
// extension, if there is one, is associated with.
//
err = RefreshAndSelectTC();
if( err != NO_ERROR )
{
ReportError( AFPERR_TO_STRINGID( err ));
return;
}
_cbExtensions.SelectString();
} // FILE_ASSOCIATION_DIALOG :: FILE_ASSOCIATION_DIALOG
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: ~FILE_ASSOCIATION_DIALOG
SYNOPSIS: FILE_ASSOCIATION_DIALOG class destructor.
EXIT: The object is destroyed.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
FILE_ASSOCIATION_DIALOG :: ~FILE_ASSOCIATION_DIALOG()
{
BASE_ELLIPSIS::Term();
}
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: QueryHelpContext
SYNOPSIS: This function returns the appropriate help context
value (HC_*) for this particular dialog.
RETURNS: ULONG - The help context for this
dialog.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
ULONG FILE_ASSOCIATION_DIALOG :: QueryHelpContext( void )
{
return HC_FILE_ASSOCIATION_DIALOG;
} // FILE_ASSOCIATION_DIALOG:: QueryHelpContext
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: EnableControls
SYNOPSIS: This function handles the enabling/disabling of
the edit and delete buttons.
RETURNS: none
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
VOID FILE_ASSOCIATION_DIALOG :: EnableControls( BOOL fEnable )
{
if ( fEnable )
{
_pbDelete.Enable( TRUE );
_pbEdit.Enable( TRUE );
_pbEdit.MakeDefault();
}
else
{
if ( _pbEdit.HasFocus() || _pbDelete.HasFocus() )
{
_lbTypeCreators.ClaimFocus();
}
_pbDelete.Enable( FALSE );
_pbEdit.Enable( FALSE );
}
} // FILE_ASSOCIATION_DIALOG :: EnableControls
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: SelectTypeCreator
SYNOPSIS: This function will call the SelectTypeCreator member
function of the TYPE_CREATOR_LISTBIX class and
enable/disable the delete and edit buttons appropriately.
RETURNS: none
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
VOID FILE_ASSOCIATION_DIALOG :: SelectTypeCreator( NLS_STR * pnlsType,
NLS_STR * pnlsCreator )
{
DWORD dwIdSelected = _lbTypeCreators.SelectTypeCreator( pnlsType,
pnlsCreator );
if ( ( dwIdSelected != AFP_DEF_TCID ) && ( dwIdSelected != (DWORD)-1 ) )
{
EnableControls( TRUE );
}
else
{
EnableControls( FALSE );
}
} // FILE_ASSOCIATION_DIALOG :: SelectTypeCreator
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: SelectTypeCreator
SYNOPSIS: This function will call the SelectTypeCreator member
function of the TYPE_CREATOR_LISTBIX class and
enable/disable the delete and edit buttons appropriately.
RETURNS: none
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
VOID FILE_ASSOCIATION_DIALOG :: SelectTypeCreator( DWORD dwId )
{
DWORD dwIdSelected = _lbTypeCreators.SelectTypeCreator( dwId );
if ( ( dwIdSelected != AFP_DEF_TCID ) && ( dwIdSelected != (DWORD)-1 ) )
{
EnableControls( TRUE );
}
else
{
EnableControls( FALSE );
}
} // FILE_ASSOCIATION_DIALOG :: SelectTypeCreator
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: OnCommand
SYNOPSIS: This method is called whenever a WM_COMMAND message
is sent to the dialog procedure.
ENTRY: cid - The control ID from the
generating control.
EXIT: The command has been handled.
RETURNS: BOOL - TRUE if we handled the command.
FALSE if we did not handle
the command.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
BOOL FILE_ASSOCIATION_DIALOG :: OnCommand( const CONTROL_EVENT & event )
{
if( event.QueryCid() == _cbExtensions.QueryCid() )
{
//
// The COMBOBOX is trying to tell us something...
//
if( event.QueryCode() == CBN_SELCHANGE )
{
//
// The user changed the selection in the COMBOBOX.
// So set focus on type/creator associated with this extension
//
SelectTypeCreator( _cbExtensions.QueryCurrentItemId() );
_pbAssociate.Enable( TRUE );
}
if( event.QueryCode() == CBN_EDITCHANGE )
{
APIERR err;
NLS_STR nlsItemText;
if ( (( err = nlsItemText.QueryError() ) != NERR_Success ) ||
(( err = _cbExtensions.QueryText( &nlsItemText ))
!= NERR_Success))
{
::MsgPopup( this, err );
return FALSE;
}
if ((nlsItemText.QueryPch() == NULL) || (nlsItemText.strlen() == 0))
{
_pbAssociate.Enable( FALSE );
}
else
{
_pbAssociate.Enable( TRUE );
}
//
// The user typed in something in the SLE. Find out if we have
// a match in the combobox.
//
INT Index = _cbExtensions.FindItemExact( nlsItemText );
DWORD dwId;
if ( Index < 0 )
{
dwId = AFP_DEF_TCID;
}
else
{
_cbExtensions.SetTopIndex( Index );
dwId = _cbExtensions.QueryItemId( Index );
}
SelectTypeCreator( dwId );
}
return TRUE;
}
if( event.QueryCid() == _lbTypeCreators.QueryCid() )
{
if( event.QueryCode() == LBN_SELCHANGE )
{
if ( _lbTypeCreators.QueryItem()->QueryId() == AFP_DEF_TCID )
{
EnableControls( FALSE );
}
else
{
EnableControls( TRUE );
}
}
}
if( event.QueryCid() == _pbAssociate.QueryCid() )
{
//
// This may take a while
//
AUTO_CURSOR Cursor;
//
// The user pressed the Associate button. So associate the currently
// selected Extension with the currently selected type/creator.
//
AFP_TYPE_CREATOR AfpTypeCreator;
AFP_EXTENSION AfpExtension;
DWORD err;
NLS_STR nlsItemText;
if ( (( err = nlsItemText.QueryError() ) != NERR_Success ) ||
(( err = _cbExtensions.QueryText(&nlsItemText) ) != NERR_Success))
{
::MsgPopup( this, err );
return FALSE;
}
::wcscpy( AfpExtension.afpe_extension, nlsItemText.QueryPch() );
TYPE_CREATOR_LBI * ptclbi = _lbTypeCreators.QueryItem();
::wcscpy( AfpTypeCreator.afptc_creator, ptclbi->QueryCreator() );
::wcscpy( AfpTypeCreator.afptc_type, ptclbi->QueryType() );
err = ::AfpAdminETCMapAssociate( _hServer,
&AfpTypeCreator,
&AfpExtension );
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
}
//
// Refresh the dialog
//
err = RefreshAndSelectTC();
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
return FALSE;
}
return TRUE;
}
if( event.QueryCid() == _pbAdd.QueryCid() )
{
//
// The user pressed the Add button. Bring up dialog to allow user
// to add a type/creator pair
//
return TypeCreatorAddDialog();
}
if( event.QueryCid() == _pbEdit.QueryCid() )
{
//
// The user pressed the Edit button. Bring up dialog to allow user
// to edit a type/creator pair.
//
return TypeCreatorEditDialog();
}
if ( event.QueryCid() == _lbTypeCreators.QueryCid() )
{
if ((event.QueryCode() == LBN_DBLCLK) &&
(_lbTypeCreators.QuerySelCount()>0))
{
//
// The user double-clicked on a type/creator. Bring up dialog to
// allow user to edit a type/creator pair.
//
return TypeCreatorEditDialog();
}
}
if( event.QueryCid() == _pbDelete.QueryCid() )
{
//
// This may take a while
//
AUTO_CURSOR Cursor;
//
// The user pressed the Delete button. Delete the currently
// selected type/creator pair
//
//
// First warn the user.
//
if ( ::MsgPopup( this,
IDS_DELETE_TC_CONFIRM,
MPSEV_WARNING,
MP_YESNO,
MP_YES ) == IDNO )
{
return FALSE;
}
AFP_TYPE_CREATOR AfpTypeCreator;
TYPE_CREATOR_LBI * ptclbi = _lbTypeCreators.QueryItem();
ZeroMemory( &AfpTypeCreator, sizeof( AfpTypeCreator ) );
::wcscpy( AfpTypeCreator.afptc_creator, ptclbi->QueryCreator() );
::wcscpy( AfpTypeCreator.afptc_type, ptclbi->QueryType() );
DWORD err = ::AfpAdminETCMapDelete( _hServer, &AfpTypeCreator );
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
}
//
// Refresh the dialog.
//
err = Refresh();
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
return FALSE;
}
return TRUE;
}
return DIALOG_WINDOW::OnCommand( event );
}
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: TypeCreatorAddDialog
SYNOPSIS: Bring up the dialog to add a type/creator
EXIT:
RETURNS: DWORD - Any errors encountered.
HISTORY:
NarenG 7-Dec-1992 Created
*******************************************************************/
BOOL FILE_ASSOCIATION_DIALOG :: TypeCreatorAddDialog( VOID )
{
NLS_STR nlsType;
NLS_STR nlsCreator;
DWORD err;
BOOL fOK = FALSE;
if ( ( ( err = nlsType.QueryError() ) != NERR_Success ) ||
( ( err = nlsCreator.QueryError() ) != NERR_Success ) )
{
::MsgPopup( this, err );
return FALSE;
}
TYPE_CREATOR_ADD * ptcadlg = new TYPE_CREATOR_ADD( QueryHwnd(),
_hServer,
&_lbTypeCreators,
&nlsType,
&nlsCreator );
err = ( ptcadlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: ptcadlg->Process( &fOK );
if ( ptcadlg != NULL )
{
delete ptcadlg;
}
if( err != NERR_Success )
{
MsgPopup( this, AFPERR_TO_STRINGID( err ));
return FALSE;
}
//
// Refresh the dialog
//
err = Refresh();
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
return FALSE;
}
if ( fOK )
{
SelectTypeCreator( &nlsType, &nlsCreator );
}
return TRUE;
}
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: TypeCreatorEditDialog
SYNOPSIS: Bring up the dialog to add a type/creator
EXIT:
RETURNS: DWORD - Any errors encountered.
HISTORY:
NarenG 7-Dec-1992 Created
*******************************************************************/
BOOL FILE_ASSOCIATION_DIALOG :: TypeCreatorEditDialog( VOID )
{
TYPE_CREATOR_LBI * ptclbi = _lbTypeCreators.QueryItem();
//
// Do not allow editing of the default type/creator
//
if ( ptclbi->QueryId() == AFP_DEF_TCID )
{
return FALSE;
}
TYPE_CREATOR_EDIT * ptcedlg = new TYPE_CREATOR_EDIT( QueryHwnd(),
_hServer,
ptclbi );
DWORD err = ( ptcedlg == NULL ) ? ERROR_NOT_ENOUGH_MEMORY
: ptcedlg->Process();
if( err != NERR_Success )
{
MsgPopup( this, AFPERR_TO_STRINGID( err ));
}
if ( ptcedlg != NULL )
{
delete ptcedlg;
}
//
// Refresh the dialog.
//
err = Refresh();
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
return FALSE;
}
return TRUE;
}
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: Refresh
SYNOPSIS: Refresh the dialog.
EXIT:
RETURNS: DWORD - Any errors encountered.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD FILE_ASSOCIATION_DIALOG :: Refresh( VOID )
{
//
// Find out the type creator that has the current focus.
//
TYPE_CREATOR_LBI * ptclbi = _lbTypeCreators.QueryItem();
DWORD dwId = ( ptclbi == NULL ) ? AFP_DEF_TCID : ptclbi->QueryId();
//
// Find out the extension that has the current focus
//
APIERR err;
NLS_STR nlsCurrentExtension;
if ( (( err = nlsCurrentExtension.QueryError() ) != NERR_Success ) ||
(( err = _cbExtensions.QueryText( &nlsCurrentExtension ))
!= NERR_Success))
{
return err;
}
if ( ( err = Update() ) != NO_ERROR )
{
return err;
}
SelectTypeCreator( dwId );
//
// Set the extension to what it was before
//
if ((nlsCurrentExtension.QueryPch() == NULL) ||
(nlsCurrentExtension.strlen() == 0))
{
_pbAssociate.Enable( FALSE );
}
else
{
_cbExtensions.SetText( nlsCurrentExtension );
_pbAssociate.Enable( TRUE );
}
return NO_ERROR;
}
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: RefreshAndSelectTC
SYNOPSIS: Refresh the dialog and then select the Type/Creator
item that the current extension is associated with..
EXIT:
RETURNS: DWORD - Any errors encountered.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD FILE_ASSOCIATION_DIALOG :: RefreshAndSelectTC( VOID )
{
APIERR err;
if ( ( err = Refresh() ) != NO_ERROR )
{
return err;
}
//
// Get the Type/creator id that the current extension is associated
// with
//
NLS_STR nlsCurrentExtension;
if ( (( err = nlsCurrentExtension.QueryError() ) != NERR_Success ) ||
(( err = _cbExtensions.QueryText( &nlsCurrentExtension ))
!= NERR_Success))
{
return err;
}
INT Index = _cbExtensions.FindItemExact( nlsCurrentExtension );
DWORD dwId = ( Index < 0 ) ? AFP_DEF_TCID
: _cbExtensions.QueryItemId( Index );
SelectTypeCreator( dwId );
return NO_ERROR;
}
/*******************************************************************
NAME: FILE_ASSOCIATION_DIALOG :: Update
SYNOPSIS: Updates the dialog with new date.
EXIT:
RETURNS: DWORD - Any errors encountered.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD FILE_ASSOCIATION_DIALOG :: Update( VOID )
{
APIERR err;
PAFP_ETCMAP_INFO pAfpEtcMapInfo = NULL;
//
// Just to be cool...
//
AUTO_CURSOR Cursor;
//
// This is not a loop
//
do {
//
// Get the new data
//
err = ::AfpAdminETCMapGetInfo( _hServer, (LPBYTE *)&pAfpEtcMapInfo );
if ( err != NO_ERROR )
{
break;
}
//
// Update the extensions COMBOBOX.
//
err = _cbExtensions.Update( pAfpEtcMapInfo->afpetc_num_extensions,
pAfpEtcMapInfo->afpetc_extension );
if ( err != NO_ERROR )
{
break;
}
//
// Update the type/creator listbox
//
err = _lbTypeCreators.Update( pAfpEtcMapInfo->afpetc_num_type_creators,
pAfpEtcMapInfo->afpetc_type_creator );
if ( err != NO_ERROR )
{
break;
}
EnableControls( _lbTypeCreators.QueryCount() > 0 );
} while( FALSE );
if ( pAfpEtcMapInfo != NULL )
{
::AfpAdminBufferFree( pAfpEtcMapInfo );
}
if ( err != NO_ERROR )
{
//
// There was an error refreshing the dialog
// so nuke everything in the TypeCreator & extension listboxes
// then disable the associate, edit and delete buttons.
//
_lbTypeCreators.DeleteAllItems();
_cbExtensions.DeleteAllItems();
EnableControls( FALSE );
}
return err;
} // FILE_ASSOCIATION_DIALOG :: Update
//
// EXTENSION_COMBOBOX methods.
//
/*******************************************************************
NAME: EXTENSION_COMBOBOX :: EXTENSION_COMBOBOX
SYNOPSIS: EXTENSION_COMBOBOX class constructor.
ENTRY: powOwner - The owning window.
cid - The listbox CID.
sleSize - Max. number of sle chars.
EXIT: The object is constructed.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
EXTENSION_COMBOBOX :: EXTENSION_COMBOBOX( OWNER_WINDOW * powOwner,
CID cid,
INT sleSize )
: COMBOBOX( powOwner, cid, sleSize ),
_pExtensions( NULL )
{
//
// Ensure we constructed properly.
//
if( QueryError() != NERR_Success )
{
return;
}
}
/*******************************************************************
NAME: EXTENSION_COMBOBOX :: ~EXTENSION_COMBOBOX
SYNOPSIS: EXTENSION_COMBOBOX class destructor.
ENTRY:
EXIT: The object is destroyed.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
EXTENSION_COMBOBOX :: ~EXTENSION_COMBOBOX()
{
//
// Delete cache of sorted extensions
//
if ( _pExtensions != NULL )
{
delete [] _pExtensions;
}
_pExtensions = NULL;
} // FEXTENSION_COMBOBOX :: ~EXTENSION_COMBOBOX
/*******************************************************************
NAME: EXTENSION_COMBOBOX :: Update
SYNOPSIS: Updates the combobox.
EXIT: The combobox is updated.
RETURNS: DWORD - Any errors we encounter.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD EXTENSION_COMBOBOX :: Update( DWORD nExtensions,
PAFP_EXTENSION pAfpExtensions )
{
if ( _pExtensions != NULL )
{
delete [] _pExtensions;
}
//
// Store and sort the extensions list.
//
_pExtensions = new AFP_EXTENSION[nExtensions];
if ( _pExtensions == NULL )
{
return ERROR_NOT_ENOUGH_MEMORY;
}
::CopyMemory( _pExtensions,
pAfpExtensions,
(UINT)(nExtensions * sizeof(AFP_EXTENSION)));
::qsort( _pExtensions,
(UINT)nExtensions,
sizeof(AFP_EXTENSION),
::CompareExtensions );
//
// OK, now update the combobox
//
SetRedraw( FALSE );
DeleteAllItems();
//
// For iterating the associated extensions.
//
PAFP_EXTENSION pExtensionIter = _pExtensions;
//
// Iterate the extensions, adding them to the combobox.
//
DWORD err = NO_ERROR;
while( ( err == NO_ERROR ) && ( nExtensions-- ) )
{
if ( AddItem( pExtensionIter->afpe_extension ) < 0 )
{
err = ERROR_NOT_ENOUGH_MEMORY;
break;
}
pExtensionIter++;
}
SetRedraw( TRUE );
Invalidate( TRUE );
return err;
}
/*******************************************************************
NAME: EXTENSION_COMBOBOX :: QueryCurrentItemId
SYNOPSIS: Will return the Type/Creator id the currently
selected extension item is associated with.
ENTRY: none
EXIT:
RETURNS: Type/Creator id
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD EXTENSION_COMBOBOX :: QueryCurrentItemId( VOID ) const
{
return QueryItemId( QueryCurrentItem() );
}
/*******************************************************************
NAME: EXTENSION_COMBOBOX :: QueryItemId
SYNOPSIS: Given and index into the extensions list, this will return
the Type/Creator id associated with the indexed extension.
ENTRY: Index - Index of the extension in the combobox
EXIT:
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD EXTENSION_COMBOBOX :: QueryItemId( INT Index ) const
{
if( ( Index < 0 ) || ( Index > QueryCount() ) )
{
return AFP_DEF_TCID;
}
else
{
return _pExtensions[Index].afpe_tcid;
}
}
//
// TYPE_CREATOR_LISTBOX methods.
//
/*******************************************************************
NAME: TYPE_CREATOR_LISTBOX :: TYPE_CREATOR_LISTBOX
SYNOPSIS: TYPE_CREATOR_LISTBOX class constructor.
ENTRY: powOwner - The owning window.
cid - The listbox CID.
hServer - The target server.
EXIT: The object is constructed.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
TYPE_CREATOR_LISTBOX :: TYPE_CREATOR_LISTBOX( OWNER_WINDOW * powOwner,
CID cid,
AFP_SERVER_HANDLE hServer )
: BLT_LISTBOX( powOwner, cid ),
_hServer( hServer )
{
//
// Ensure we constructed properly.
//
if( QueryError() != NERR_Success )
{
return;
}
//
// Build our column width table.
//
DISPLAY_TABLE::CalcColumnWidths( _adx,
COLS_FA_LB_TYPE_CREATORS,
powOwner,
cid,
FALSE );
} // TYPE_CREATOR_LISTBOX :: TYPE_CREATOR_LISTBOX
/*******************************************************************
NAME: TYPE_CREATOR_LISTBOX :: ~TYPE_CREATOR_LISTBOX
SYNOPSIS: TYPE_CREATOR_LISTBOX class destructor.
EXIT: The object is destroyed.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
TYPE_CREATOR_LISTBOX :: ~TYPE_CREATOR_LISTBOX()
{
//
// This space intentionally left blank.
//
} // TYPE_CREATOR_LISTBOX :: ~TYPE_CREATOR_LISTBOX
/*******************************************************************
NAME: TYPE_CREATOR_LISTBOX :: Update
SYNOPSIS: Fills the listbox.
EXIT:
RETURNS: DWORD - Any errors we encounter.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD TYPE_CREATOR_LISTBOX :: Update( DWORD nTypeCreators,
PAFP_TYPE_CREATOR pAfpTypeCreators )
{
//
// Will be set to point to the default type/creator
//
PAFP_TYPE_CREATOR pDefAfpTypeCreator;
//
// let's nuke everything in the listbox.
//
SetRedraw( FALSE );
DeleteAllItems();
//
// Iterate the volumes adding them to the listbox.
//
DWORD err = NO_ERROR;
while( ( err == NO_ERROR ) && ( nTypeCreators-- ) )
{
//
// If this is the default type/creator, do not add it now. It will
// be added as the first item in the end.
//
if ( pAfpTypeCreators->afptc_id == AFP_DEF_TCID )
{
pDefAfpTypeCreator = pAfpTypeCreators;
}
else
{
TYPE_CREATOR_LBI * ptclbi = new TYPE_CREATOR_LBI(pAfpTypeCreators);
if( AddItem( ptclbi ) < 0 )
{
err = ERROR_NOT_ENOUGH_MEMORY;
}
}
pAfpTypeCreators++;
}
//
// Now add the default if there were no errors.
//
if ( err == NO_ERROR )
{
TYPE_CREATOR_LBI * ptclbi = new TYPE_CREATOR_LBI(pDefAfpTypeCreator);
if ( InsertItemData( 0, ptclbi ) < 0 )
{
err = ERROR_NOT_ENOUGH_MEMORY;
}
}
SetRedraw( TRUE );
Invalidate( TRUE );
return err;
} // TYPE_CREATOR_LISBOX :: Refresh
/*******************************************************************
NAME: TYPE_CREATOR_LISTBOX :: SelectTypeCreator
SYNOPSIS: Given a Type/Creator this procedure will set focus on
that item.
EXIT:
RETURNS: DWORD - Any errors we encounter.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD TYPE_CREATOR_LISTBOX :: SelectTypeCreator( NLS_STR * pnlsType,
NLS_STR * pnlsCreator )
{
INT ItemCount = QueryCount();
INT Index;
TYPE_CREATOR_LBI * ptclbi;
if ( ItemCount == 0 )
{
return (DWORD)-1;
}
for( Index = 0; Index < ItemCount; Index++ )
{
ptclbi = QueryItem( Index );
if ( pnlsType->strcmp( ptclbi->QueryType() ) == 0 )
{
if ( pnlsCreator->strcmp( ptclbi->QueryCreator() ) == 0 )
{
SelectItem( Index );
return ptclbi->QueryId();
}
}
}
SelectItem( 0 );
return AFP_DEF_TCID;
}
/*******************************************************************
NAME: TYPE_CREATOR_LISTBOX :: SelectTypeCreator
SYNOPSIS: Given an extension id, this procedure will set focus on
that item in the type/creator listbox.
EXIT:
RETURNS: DWORD - Any errors we encounter.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
DWORD TYPE_CREATOR_LISTBOX :: SelectTypeCreator( DWORD dwId )
{
INT ItemCount = QueryCount();
INT Index;
TYPE_CREATOR_LBI * ptclbi;
if ( ItemCount == 0 )
{
return (DWORD)-1;
}
for( Index = 0; Index < ItemCount; Index++ )
{
ptclbi = QueryItem( Index );
if ( ptclbi->QueryId() == dwId )
{
SelectItem( Index );
return dwId;
}
}
SelectItem( 0 );
return AFP_DEF_TCID;
}
//
// TYPE_CREATOR_LBI methods.
//
/*******************************************************************
NAME: TYPE_CREATOR_LBI :: TYPE_CREATOR_LBI
SYNOPSIS: TYPE_CREATOR_LBI class constructor.
ENTRY: pszVolumeName - The sharepoint name.
pszPath - The path for this sharepoint.
cUses - Number of uses for this share.
EXIT: The object is constructed.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
TYPE_CREATOR_LBI :: TYPE_CREATOR_LBI( PAFP_TYPE_CREATOR pAfpTypeCreator )
: _nlsType( pAfpTypeCreator->afptc_type),
_nlsCreator(pAfpTypeCreator->afptc_creator),
_nlsComment(pAfpTypeCreator->afptc_comment),
_dwId( pAfpTypeCreator->afptc_id )
{
//
// Ensure we constructed properly.
//
if( QueryError() != NERR_Success )
{
return;
}
APIERR err;
if ((( err = _nlsType.QueryError() ) != NERR_Success ) ||
(( err = _nlsCreator.QueryError() ) != NERR_Success ) ||
(( err = _nlsComment.QueryError() ) != NERR_Success ) )
{
ReportError( err );
return;
}
} // TYPE_CREATOR_LBI :: TYPE_CREATOR_LBI
/*******************************************************************
NAME: TYPE_CREATOR_LBI :: ~TYPE_CREATOR_LBI
SYNOPSIS: TYPE_CREATOR_LBI class destructor.
EXIT: The object is destroyed.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
TYPE_CREATOR_LBI :: ~TYPE_CREATOR_LBI()
{
//
// Intentionally left blank
//
} // TYPE_CREATOR_LBI :: ~TYPE_CREATOR_LBI
/*******************************************************************
NAME: TYPE_CREATOR_LBI :: Paint
SYNOPSIS: Draw an entry in VOLUMES_LISTBOX.
ENTRY: plb - Pointer to a BLT_LISTBOX.
hdc - The DC to draw upon.
prect - Clipping rectangle.
pGUILTT - GUILTT info.
EXIT: The item is drawn.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
VOID TYPE_CREATOR_LBI :: Paint( LISTBOX * plb,
HDC hdc,
const RECT * prect,
GUILTT_INFO * pGUILTT ) const
{
STR_DTE dteCreator( _nlsCreator.QueryPch() );
STR_DTE dteType( _nlsType.QueryPch() );
STR_DTE_ELLIPSIS dteComment(_nlsComment.QueryPch(),plb,ELLIPSIS_RIGHT);
DISPLAY_TABLE dtab( COLS_FA_LB_TYPE_CREATORS,
((TYPE_CREATOR_LISTBOX *)plb)->QueryColumnWidths() );
dtab[0] = &dteCreator;
dtab[1] = &dteType;
dtab[2] = &dteComment;
dtab.Paint( plb, hdc, prect, pGUILTT );
} // TYPE_CREATOR_LBI :: Paint
/*******************************************************************
NAME: TYPE_CREATOR_LBI :: QueryLeadingChar
SYNOPSIS: Returns the first character in the resource name.
This is used for the listbox keyboard interface.
RETURNS: WCHAR - The first character in the
resource name.
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
WCHAR TYPE_CREATOR_LBI :: QueryLeadingChar( VOID ) const
{
ISTR istr( _nlsCreator );
return _nlsCreator.QueryChar( istr );
} // TYPE_CREATOR_LBI :: QueryLeadingChar
/*******************************************************************
NAME: TYPE_CREATOR_LBI :: Compare
SYNOPSIS: Compare two BASE_RES_LBI items.
ENTRY: plbi - The LBI to compare against.
RETURNS: INT - The result of the compare
( <0 , ==0 , >0 ).
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
INT TYPE_CREATOR_LBI :: Compare( const LBI * plbi ) const
{
INT Result = _nlsCreator._stricmp(
((const TYPE_CREATOR_LBI *)plbi)->_nlsCreator );
if ( Result == 0 )
{
return _nlsType._stricmp(
((const TYPE_CREATOR_LBI *)plbi)->_nlsType );
}
else
return Result;
} // TYPE_CREATOR_LBI :: Compare
/*******************************************************************
NAME: CompareExtensions
SYNOPSIS: Compare routine for qsort call.
ENTRY:
RETURNS: < 0 if pAfpExtension1 comes before pAfpExtension2
> 0 if pAfpExtension1 comes before pAfpExtension2
== 0 if pAfpExtension1 is equal to pAfpExtension2
HISTORY:
NarenG 7-Dec-1992 Created
********************************************************************/
int __cdecl
CompareExtensions(
IN const void * pAfpExtension1,
IN const void * pAfpExtension2
)
{
return( ::stricmpf(((PAFP_EXTENSION)pAfpExtension1)->afpe_extension,
((PAFP_EXTENSION)pAfpExtension2)->afpe_extension ));
}
/*******************************************************************
NAME: TYPE_CREATOR_ADD :: TYPE_CREATOR_ADD
SYNOPSIS: TYPE_CREATOR_ADD class constructor.
ENTRY: hWndOwner - The owning window.
hServer - Handle used to make admin
API calls.
ptclb * - Pointer to the list of type/creators
EXIT: The object is constructed.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
TYPE_CREATOR_ADD :: TYPE_CREATOR_ADD( HWND hWndOwner,
AFP_SERVER_HANDLE hServer,
TYPE_CREATOR_LISTBOX * ptclb,
NLS_STR * pnlsType,
NLS_STR * pnlsCreator )
: DIALOG_WINDOW( MAKEINTRESOURCE(IDD_TYPE_CREATOR_ADD_DIALOG), hWndOwner ),
_hServer( hServer ),
_sleComment( this, IDTA_SLE_DESCRIPTION, AFP_ETC_COMMENT_LEN ),
_cbTypes( this, IDTA_CB_TYPE , AFP_TYPE_LEN ),
_cbCreators( this, IDTA_CB_CREATOR, AFP_CREATOR_LEN ),
_pnlsType( pnlsType ),
_pnlsCreator( pnlsCreator )
{
//
// Let's make sure everything constructed OK.
//
if ( QueryError() != NERR_Success )
{
return;
}
DWORD err;
if ( (( err = _sleComment.QueryError() ) != NERR_Success ) ||
(( err = _cbTypes.QueryError() ) != NERR_Success ) ||
(( err = _cbCreators.QueryError() ) != NERR_Success ))
{
ReportError( err );
return;
}
//
// This may take a while
//
AUTO_CURSOR Cursor;
//
// Fill up the COMBOBOXes
//
DWORD nItems = ptclb->QueryCount();
DWORD Count;
for ( Count = 0; Count < nItems; Count++ )
{
TYPE_CREATOR_LBI * ptclbi = ptclb->QueryItem( (INT)Count );
if ( _cbTypes.AddItemIdemp( ptclbi->QueryType() ) < 0 )
{
err = ERROR_NOT_ENOUGH_MEMORY;
break;
}
if ( _cbCreators.AddItemIdemp( ptclbi->QueryCreator() ) < 0 )
{
err = ERROR_NOT_ENOUGH_MEMORY;
break;
}
}
if ( err != NERR_Success )
{
ReportError( err );
return;
}
_cbCreators.ClaimFocus();
}
/*******************************************************************
NAME: TYPE_CREATOR_ADD :: OnOK
SYNOPSIS: Gather all information and Add the type creator pair
ENTRY:
EXIT:
RETURNS:
NOTES:
HISTORY:
NarenG 12/14/92 Created
********************************************************************/
BOOL TYPE_CREATOR_ADD :: OnOK( VOID )
{
APIERR err;
NLS_STR nlsType;
NLS_STR nlsCreator;
NLS_STR nlsComment;
//
// This may take a while
//
AUTO_CURSOR Cursor;
if ( (( err = nlsType.QueryError() ) != NERR_Success ) ||
(( err = nlsCreator.QueryError() ) != NERR_Success ) ||
(( err = nlsComment.QueryError() ) != NERR_Success ) ||
(( err = _cbTypes.QueryText( &nlsType ) ) != NERR_Success ) ||
(( err = _cbCreators.QueryText( &nlsCreator ) ) != NERR_Success ) ||
(( err = _sleComment.QueryText( &nlsComment ) ) != NERR_Success ))
{
::MsgPopup( this, err );
Dismiss( FALSE );
return FALSE;
}
//
// Validate all the information
//
AFP_TYPE_CREATOR AfpTypeCreator;
if ( nlsCreator.strlen() == 0 )
{
::MsgPopup( this, IDS_NEED_TYPE_CREATOR );
_cbCreators.ClaimFocus();
return FALSE;
}
if ( nlsType.strlen() == 0 )
{
::MsgPopup( this, IDS_NEED_TYPE_CREATOR );
_cbTypes.ClaimFocus();
return FALSE;
}
::wcscpy( AfpTypeCreator.afptc_creator, nlsCreator.QueryPch() );
::wcscpy( AfpTypeCreator.afptc_type, nlsType.QueryPch() );
::wcscpy( AfpTypeCreator.afptc_comment, nlsComment.QueryPch() );
err = ::AfpAdminETCMapAdd( _hServer, &AfpTypeCreator );
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
return FALSE;
}
_pnlsType->CopyFrom( nlsType );
_pnlsCreator->CopyFrom( nlsCreator );
Dismiss( TRUE );
return TRUE;
}
/*******************************************************************
NAME: TYPE_CREATOR_ADD :: QueryHelpContext
SYNOPSIS: This function returns the appropriate help context
value (HC_*) for this particular dialog.
RETURNS: ULONG - The help context for this
dialog.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
ULONG TYPE_CREATOR_ADD :: QueryHelpContext( void )
{
return HC_TYPE_CREATOR_ADD;
} // TYPE_CREATOR_ADD:: QueryHelpContext
/*******************************************************************
NAME: TYPE_CREATOR_EDIT :: TYPE_CREATOR_EDIT
SYNOPSIS: TYPE_CREATOR_EDIT class constructor.
ENTRY: hWndOwner - The owning window.
hServer - Handle used to make admin
API calls.
ptclbi * - Pointer to the selected type/creator
EXIT: The object is constructed.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
TYPE_CREATOR_EDIT :: TYPE_CREATOR_EDIT( HWND hWndOwner,
AFP_SERVER_HANDLE hServer,
TYPE_CREATOR_LBI * ptclbi )
: DIALOG_WINDOW( MAKEINTRESOURCE(IDD_TYPE_CREATOR_EDIT_DIALOG), hWndOwner ),
_hServer( hServer ),
_sleComment( this, IDTE_SLE_DESCRIPTION, AFP_ETC_COMMENT_LEN ),
_sltType( this, IDTE_SLE_TYPE ),
_sltCreator( this, IDTE_SLE_CREATOR )
{
//
// Let's make sure everything constructed OK.
//
if ( QueryError() != NERR_Success )
{
return;
}
DWORD err;
NLS_STR nlsAmp( TEXT("&") );
NLS_STR nlsType( ptclbi->QueryType() );
NLS_STR nlsCreator( ptclbi->QueryCreator() );
if ( (( err = _sleComment.QueryError() ) != NERR_Success ) ||
(( err = _sltType.QueryError() ) != NERR_Success ) ||
(( err = nlsType.QueryError() ) != NERR_Success ) ||
(( err = nlsCreator.QueryError() ) != NERR_Success ) ||
(( err = nlsAmp.QueryError() ) != NERR_Success ) ||
(( err = _sltCreator.QueryError() ) != NERR_Success ))
{
ReportError( err );
return;
}
//
// Add an extra & for every & found in the type and creator,
// otherwise the character following the & will become a hotkey.
//
ISTR istrPosType( nlsType );
ISTR istrStartType( nlsType );
while ( nlsType.strstr( &istrPosType, nlsAmp, istrStartType ) )
{
nlsType.InsertStr( nlsAmp, ++istrPosType );
istrStartType = ++istrPosType;
}
_sltType.SetText( nlsType );
ISTR istrPosCreator( nlsCreator );
ISTR istrStartCreator( nlsCreator );
while ( nlsCreator.strstr( &istrPosCreator, nlsAmp, istrStartCreator ) )
{
nlsCreator.InsertStr( nlsAmp, ++istrPosCreator );
istrStartCreator = ++istrPosCreator;
}
_sltCreator.SetText( nlsCreator );
_sleComment.SetText( ptclbi->QueryComment() );
_sleComment.SelectString();
}
/*******************************************************************
NAME: TYPE_CREATOR_EDIT :: OnOK
SYNOPSIS: Gather all information and set the type/creator information.
ENTRY:
EXIT:
RETURNS:
NOTES:
HISTORY:
NarenG 12/14/92 Created
********************************************************************/
BOOL TYPE_CREATOR_EDIT :: OnOK( VOID )
{
APIERR err;
NLS_STR nlsType;
NLS_STR nlsCreator;
NLS_STR nlsComment;
//
// This may take a while
//
AUTO_CURSOR Cursor;
if ( (( err = nlsType.QueryError() ) != NERR_Success ) ||
(( err = nlsCreator.QueryError() ) != NERR_Success ) ||
(( err = nlsComment.QueryError() ) != NERR_Success ) ||
(( err = _sltType.QueryText( &nlsType ) ) != NERR_Success ) ||
(( err = _sltCreator.QueryText( &nlsCreator ) ) != NERR_Success ) ||
(( err = _sleComment.QueryText( &nlsComment ) ) != NERR_Success ))
{
::MsgPopup( this, err );
Dismiss( FALSE );
return FALSE;
}
//
// Validate all the information
//
AFP_TYPE_CREATOR AfpTypeCreator;
::wcscpy( AfpTypeCreator.afptc_creator, nlsCreator.QueryPch() );
::wcscpy( AfpTypeCreator.afptc_type, nlsType.QueryPch() );
::wcscpy( AfpTypeCreator.afptc_comment, nlsComment.QueryPch() );
err = ::AfpAdminETCMapSetInfo( _hServer, &AfpTypeCreator );
if ( err != NO_ERROR )
{
::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
Dismiss( FALSE );
return FALSE;
}
Dismiss( TRUE );
return TRUE;
}
/*******************************************************************
NAME: TYPE_CREATOR_EDIT :: QueryHelpContext
SYNOPSIS: This function returns the appropriate help context
value (HC_*) for this particular dialog.
RETURNS: ULONG - The help context for this
dialog.
HISTORY:
NarenG 12/4/92 Created
********************************************************************/
ULONG TYPE_CREATOR_EDIT :: QueryHelpContext( void )
{
return HC_TYPE_CREATOR_EDIT;
} // TYPE_CREATOR_EDIT:: QueryHelpContext