/**********************************************************************/ /** Microsoft Windows NT **/ /** Copyright(c) Microsoft Corp., 1991 **/ /**********************************************************************/ /* wnprop.cxx This file contains the following symbols: WNetGetPropertyText WNetPropertyDialog FILE HISTORY: rustanl 29-Apr-1991 Created rustanl 24-May-1991 Added calls to permission test program terryk 22-May-1991 add parent class name to constructor Yi-HsinS 15-Aug-1991 Added calls to share dialogs Yi-HsinS 31-Dec-1991 Unicode Work */ #include #define INCL_WINDOWS #define INCL_WINDOWS_GDI #define INCL_DOSERRORS #define INCL_NETERRORS #define INCL_NETFILE #define _WINNETWK_ #include #undef _WINNETWK_ extern "C" { #include #include } #define INCL_BLT_WINDOW #define INCL_BLT_DIALOG #define INCL_BLT_CONTROL #define INCL_BLT_MSGPOPUP #define INCL_BLT_MISC #include #include #include #include #include #include #include /* This array contains the button indices and the associated string IDs * for that button. */ MSGID aidsButtonNames[] = { IDS_PROP_BUTTON_FILEOPENS, 0 } ; RESOURCE_STR * PROPERTY_DIALOG::pnlsButtonName[] = { NULL, NULL } ; /******************************************************************* NAME: PROPERTY_DIALOG::Construct SYNOPSIS: Property Dialog pseudo constructor EXIT: Initializes the array of button names, should be called before the static QueryButtonName is called. NOTES: HISTORY: Johnl 04-Aug-1991 Created ********************************************************************/ APIERR PROPERTY_DIALOG::Construct( void ) { INT i = 0 ; while ( aidsButtonNames[i] != 0 ) { pnlsButtonName[i] = new RESOURCE_STR( aidsButtonNames[i] ) ; if ( pnlsButtonName[i]->QueryError() != NERR_Success ) { UIDEBUG( SZ("PROPERTY_DIALOG::Construct - Error loading button names")) ; return pnlsButtonName[i]->QueryError() ; } i++ ; } return NERR_Success ; } /******************************************************************* NAME: PROPERTY_DIALOG::Destruct SYNOPSIS: Pseudo Destructor. NOTES: HISTORY: Johnl 04-Aug-1991 Created ********************************************************************/ void PROPERTY_DIALOG::Destruct() { INT i = 0 ; while ( aidsButtonNames[i] != 0 ) { delete pnlsButtonName[i] ; pnlsButtonName[i] = NULL ; i++ ; } } /******************************************************************* NAME: PROPERTY_DIALOG::QueryButtonName SYNOPSIS: Returns the button name for a particular button ENTRY: EXIT: RETURNS: NOTES: The following notes described what *really* is to take place. The following table describes which buttons are used for which types of objects. F stands for File, and D for Directory. Note, no buttons are used for multiple selections. Permissions FD Auditing FD //Volume D Share D In use by F To check whether or not to display the Permission and Auditing buttons, the following is done. Call NetAccessGetInfo. If it returns success, more data, buf too small, or resource not found, display the button; otherwise, don't. //For Volume, call I_DfsCheckExitPoint. Display button iff //the directory is an exit point. For Share, use a DEVICE object on the drive letter. Then, call dev.IsRemote. If remote, then use dev.QueryRemoteName() and call NetShareGetInfo on that server and share. If return is success, more data, or buf too small, display the button; otherwise, don't. For In use by, call NetFileEnum2. To check whether a name is valid (maybe not in this function), use the following FSA: 0 1 2 3 4 5 6 ^ 4 2 1 4 3 6 6 " 1 5 1 6 3 6 6 other 3 1 1 3 3 6 6 where 0 is the initial state, and 3 and 5 are accepting states. HISTORY: rustanl 29-Apr-1991 Created rustanl 03-May-1991 Added notes Johnl 21-Jan-1992 Removed Permission/Auditting buttons ********************************************************************/ APIERR PROPERTY_DIALOG::QueryButtonName( UINT iButton, UINT nPropSel, const NLS_STR * * ppnlsName ) { INT i = -1; switch ( nPropSel ) { case WNPS_FILE: { switch ( iButton ) { /* Note: These numbers are the actual indices past to us by * the file manager (and not magic numbers). */ case 0: i = PROP_ID_FILEOPENS ; break ; default: break; } } break; case WNPS_DIR: break; case WNPS_MULT: break; } /* We are being asked for a button that we don't support */ if ( i == -1 ) { return WN_NOT_SUPPORTED ; } *ppnlsName = pnlsButtonName[ i ] ; return NERR_Success; } // PROPERTY_DIALOG::QueryButtonName /******************************************************************* NAME: WNetGetPropertyText SYNOPSIS: This function is used to determine the names of buttons added to a property dialog for some particular resources. It is called everytime such a dialog is brought up, and prior to displaying the dialog. If the user clicks a button added through this API by the Winnet driver, WNetPropertyDialog will be called with the appropriate parameters. In Windows 3.1, only File Manager calls this API. File Manager then calls it on files and directories. ENTRY: iButton Indicates the index (starting at 0) of the button. The Windows 3.1 File Manager will support at most 6 buttons. nPropSel Specifies what items the property dialog focuses on. In Windows 3.1, it can be one of the following values: WNPS_FILE single file WNPS_DIR single directory WNPS_MULT multiple selection of files and/or directories lpszName Specifies the names of the item or items to be viewed or edited by the dialog. In Windows 3.1, the items are files (and directories), so the item names are file names. These will be unambiguous, contain no wildcard characters and will be fully qualified (e.g., C:\LOCAL\FOO.BAR). Multiple filenames will be separated with spaces. Any filename may be quoted (e.g., "C:\My File") in which case it will be treated as a single name. The caret character '^' may also be used as the quotation mechanism for single characters (e.g., C:\My^"File, "C:\My^"File" both refer to the file C:\My"File). lpButtonName Points to a buffer where the Winnet driver should copy the name of the property button. cchButtonName Specifies the size of the lpButtonName buffer in count of characters for NT and is a byte count for Win 3.1. nType Specifies the item type. In Windows 3.1, only WNTYPE_FILE will be used. EXIT: On success, the buffer pointed to by lpButtonName will contain the name of the property button. If this buffer, on exit, contains the empty string, then the corresponding button and all succeeding buttons will be removed from the dialog box. The network driver cannot "skip" a button. RETURNS: A Winnet return code, including: WN_SUCCESS lpButtonName can be used. If it points to the empty string, no button corresponds to an index as high as iButton. WN_OUT_OF_MEMORY Couldn't load string from resources WN_MORE_DATA The given buffer is too small to fit the text of the button. WN_BAD_VALUE The lpszName parameter takes an unexpected form. WN_NOT_SUPPORTED Property dialogs are not supported for the given object type (nType). NOTES: The behavior, parameters, and return values of this function are specified in the Winnet 3.1 spec. HISTORY: rustanl 29-Apr-1991 Created Johnl 02-Sep-1991 Updated for real world. beng 06-Apr-1992 Unicode fixes ********************************************************************/ UINT /* FAR PASCAL */ WNetGetPropertyText( UINT iButton, UINT nPropSel, LPTSTR lpszName, LPTSTR lpButtonName, UINT cchButtonName, UINT nType ) { APIERR err ; if ( err = InitShellUI() ) { return err ; } UNREFERENCED( lpszName ); if ( nType != WNTYPE_FILE ) { // Note. Only WNTYPE_FILE is used in Windows 3.1. UIDEBUG( SZ("WNetGetPropertyText received unexpected nType value\r\n")); return ERROR_NOT_SUPPORTED; } const NLS_STR * pnlsButtonName; err = PROPERTY_DIALOG::QueryButtonName( iButton, nPropSel, &pnlsButtonName ); if ( err != NERR_Success ) { return err; } UINT nButtonNameLen = pnlsButtonName->QueryTextLength()+1 ; if ( cchButtonName < nButtonNameLen ) // dialog name { UIDEBUG( SZ("WNetGetPropertyText given too small a buffer\r\n") ); return ERROR_MORE_DATA; } /* Note: This is an NLS_STR strcpy. */ ::strcpy( (TCHAR *) lpButtonName, *pnlsButtonName ); return NERR_Success; } // WNetGetPropertyText /******************************************************************* NAME: WNetPropertyDialog SYNOPSIS: This function is called out to when the user clicks a button added through the WNetGetPropertyText API. In Windows 3.1, this will only be called for file and directory network properties. ENTRY: hwndParent Specifies the parent window which should own the file property dialog. iButton Indicates the index (starting at 0) of the button that was pressed. nPropSel Specifies what items the property dialog should act on. In Windows 3.1, it can be one of the following values: WNPS_FILE single file WNPS_DIR single directory WNPS_MULT multiple selection of files and/or directories lpszName Points to the names of the items that the property dialog should act on. See the WNetGetPropertyText API for a description of the format of what lpszName points to. nType Specifies the item type. For Windows 3.1, only WNTYPE_FILE will be used. RETURNS: A Winnet return code, including: WN_SUCCESS Success WN_BAD_VALUE Some parameter takes an unexpected form or value WN_OUT_OF_MEMORY Not enough memory to display the dialog WN_NET_ERROR Some other network error occurred NOTES: Note, this function is only called on sets of properties for which WNetGetPropertyText has assigned a button name. The behavior, parameters, and return values of this function are specified in the Winnet 3.1 spec. HISTORY: rustanl 29-Apr-1991 Created ********************************************************************/ UINT /* FAR PASCAL */ WNetPropertyDialog( HWND hwndParent, UINT iButton, UINT nPropSel, LPTSTR lpszName, UINT nType ) { APIERR err ; if ( err = InitShellUI() ) { return err ; } if ( nType != WNTYPE_FILE ) { // Note. Only WNTYPE_FILE is used in Windows 3.1. UIDEBUG( SZ("WNetPropertyDialog received unexpected nType value\r\n")); return ERROR_NOT_SUPPORTED; } const NLS_STR * pnlsButtonName; err = PROPERTY_DIALOG::QueryButtonName( iButton, nPropSel, &pnlsButtonName ); if ( err != NERR_Success ) { return err; } if ( *pnlsButtonName == *PROPERTY_DIALOG::QueryString( PROP_ID_FILEOPENS ) ) { err = DisplayOpenFiles( hwndParent, (WORD)nPropSel, lpszName ) ; } return err; } // WNetPropertyDialog /* Standard Init and Uninit calls. */ APIERR I_PropDialogInit( void ) { APIERR err ; //if ( err = MapError( PROPERTY_DIALOG::Construct())) if ( err = PROPERTY_DIALOG::Construct()) { return err ; } return NERR_Success ; } void I_PropDialogUnInit( void ) { PROPERTY_DIALOG::Destruct() ; }