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