MRESULT EXPENTRY OpenDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { static CHAR szCurrentPath [CCHMAXPATH], szBuffer [CCHMAXPATH] ; INT iSelect ; switch (msg) { case WM_INITDLG: FillDirListBox (hwnd, szCurrentPath) ; FillFileListBox (hwnd) ; WinSendDlgItemMsg (hwnd, IDD_FILEEDIT, EM_SETTEXTLIMIT, MPFROM2SHORT (CCHMAXPATH, 0), NULL) ; return 0 ; case WM_CONTROL: if (SHORT1FROMMP (mp1) == IDD_DIRLIST || SHORT1FROMMP (mp1) == IDD_FILELIST) { iSelect = (USHORT) WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1), LM_QUERYSELECTION, 0L, 0L) ; WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1), LM_QUERYITEMTEXT, MPFROM2SHORT (iSelect, sizeof szBuffer), MPFROMP (szBuffer)) ; } switch (SHORT1FROMMP (mp1)) // Control ID { case IDD_DIRLIST: switch (SHORT2FROMMP (mp1)) // notification code { case LN_ENTER: if (szBuffer [0] == ' ') DosSetDefaultDisk (szBuffer [1] - '@'); else DosSetCurrentDir (szBuffer) ; FillDirListBox (hwnd, szCurrentPath) ; FillFileListBox (hwnd) ; WinSetDlgItemText (hwnd, IDD_FILEEDIT, "") ; return 0 ; } break ; case IDD_FILELIST: switch (SHORT2FROMMP (mp1)) // notification code { case LN_SELECT: WinSetDlgItemText (hwnd, IDD_FILEEDIT, szBuffer) ; return 0 ; case LN_ENTER: ParseFileName (szFileName, szBuffer) ; WinDismissDlg (hwnd, TRUE) ; return 0 ; } break ; } break ; case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_OK: WinQueryDlgItemText (hwnd, IDD_FILEEDIT, sizeof szBuffer, szBuffer) ; switch (ParseFileName (szCurrentPath, szBuffer)) { case 0: WinAlarm (HWND_DESKTOP, WA_ERROR) ; FillDirListBox (hwnd, szCurrentPath) ; FillFileListBox (hwnd) ; return 0 ; case 1: FillDirListBox (hwnd, szCurrentPath) ; FillFileListBox (hwnd) ; WinSetDlgItemText (hwnd, IDD_FILEEDIT, "") ; return 0 ; case 2: strcpy (szFileName, szCurrentPath) ; WinDismissDlg (hwnd, TRUE) ; return 0 ; } break ; case DID_CANCEL: WinDismissDlg (hwnd, FALSE) ; return 0 ; } break ; } return WinDefDlgProc (hwnd, msg, mp1, mp2) ; }
INT ParseFileName (CHAR *pcOut, CHAR *pcIn) { /*---------------------------------------------------------------- Input: pcOut -- Pointer to parsed file specification. pcIn -- Pointer to raw file specification. Returns: 0 -- pcIn had invalid drive or directory. 1 -- pcIn was empty or had no filename. 2 -- pcOut points to drive, full dir, and file name. Changes current drive and directory per pcIn string. ----------------------------------------------------------------*/ CHAR *pcLastSlash, *pcFileOnly ; ULONG ulDriveNum, ulDriveMap, ulDirLen = CCHMAXPATH ; strupr (pcIn) ; // If input string is empty, return 1 if (pcIn [0] == '\0') return 1 ; // Get drive from input string or current drive if (pcIn [1] == ':') { if (DosSetDefaultDisk (pcIn [0] - '@')) return 0 ; pcIn += 2 ; } DosQueryCurrentDisk (&ulDriveNum, &ulDriveMap) ; *pcOut++ = (CHAR) ulDriveNum + '@' ; *pcOut++ = ':' ; *pcOut++ = '\\' ; // If rest of string is empty, return 1 if (pcIn [0] == '\0') return 1 ; // Search for last backslash. If none, could be directory. if (NULL == (pcLastSlash = strrchr (pcIn, '\\'))) { if (!DosSetCurrentDir (pcIn)) return 1 ; // Otherwise, get current dir & attach input filename DosQueryCurrentDir (0, pcOut, &ulDirLen) ; if (strlen (pcIn) > 12) return 0 ; if (*(pcOut + strlen (pcOut) - 1) != '\\') strcat (pcOut++, "\\") ; strcat (pcOut, pcIn) ; return 2 ; } // If the only backslash is at beginning, change to root if (pcIn == pcLastSlash) { DosSetCurrentDir ("\\") ; if (pcIn [1] == '\0') return 1 ; strcpy (pcOut, pcIn + 1) ; return 2 ; } // Attempt to change directory -- Get current dir if OK *pcLastSlash = '\0' ; if (DosSetCurrentDir (pcIn)) return 0 ; DosQueryCurrentDir (0, pcOut, &ulDirLen) ; // Append input filename, if any pcFileOnly = pcLastSlash + 1 ; if (*pcFileOnly == '\0') return 1 ; if (*(pcOut + strlen (pcOut) - 1) != '\\') strcat (pcOut++, "\\") ; strcat (pcOut, pcFileOnly) ; return 2 ; }
bool LocalInteractive( sys_handle fh ) /************************************/ { APIRET type; APIRET flags; //NYI: really should convert fh to sys_handle, but I know that it's // a one-to-one mapping #ifdef _M_I86 if( DosQHandType( fh, &type, &flags ) ) { #else if( DosQueryHType( fh, &type, &flags ) ) { #endif return( false ); } if( type == 1 ) { /* device type */ return( true ); } return( false ); } void LocalGetBuff( char *buff, unsigned size ) /********************************************/ { struct _STRINGINBUF length; if( size > UCHAR_MAX ) { size = UCHAR_MAX; } length.cb = size; length.cchIn = 0; if( KbdStringIn( buff, &length, 0, 0 ) ) { buff[0] = '\r'; buff[1] = NULLCHAR; return; } buff[length.cchIn] = NULLCHAR; } error_handle LocalRename( const char *from, const char *to ) /**********************************************************/ { #ifdef _M_I86 return( StashErrCode( DosMove( from, to, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosMove( from, to ), OP_LOCAL ) ); #endif } error_handle LocalMkDir( const char *name ) /*****************************************/ { #ifdef _M_I86 return( StashErrCode( DosMkDir( name, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosCreateDir( name, NULL ), OP_LOCAL ) ); #endif } error_handle LocalRmDir( const char *name ) /*****************************************/ { #ifdef _M_I86 return( StashErrCode( DosRmDir( name, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosDeleteDir( name ), OP_LOCAL ) ); #endif } error_handle LocalSetDrv( int drv ) /*********************************/ { #ifdef _M_I86 return( StashErrCode( DosSelectDisk( drv + 1 ), OP_LOCAL ) ); #else return( StashErrCode( DosSetDefaultDisk( drv + 1 ), OP_LOCAL ) ); #endif } int LocalGetDrv( void ) /*********************/ { APIRET drive; ULONG map; #ifdef _M_I86 if( DosQCurDisk( &drive, &map ) ) { #else if( DosQueryCurrentDisk( &drive, &map ) ) { #endif return( -1 ); } return( drive - 1 ); } error_handle LocalSetCWD( const char *name ) /******************************************/ { #ifdef _M_I86 return( StashErrCode( DosChDir( name, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosSetCurrentDir( name ), OP_LOCAL ) ); #endif } long LocalGetFileAttr( const char *name ) /***************************************/ { #ifdef _M_I86 USHORT attr; if( DosQFileMode( name, &attr, 0 ) ) { return( -1L ); } return( attr ); #else FILESTATUS3 fileinfo; if( DosQueryPathInfo( name, FIL_STANDARD, &fileinfo, sizeof( fileinfo ) ) ) { return( -1L ); } return( fileinfo.attrFile ); #endif }