windows-nt/Source/XPSP1/NT/shell/osshell/accesory/terminal/fileopen.c
2020-09-26 16:20:57 +08:00

1022 lines
31 KiB
C

/*===========================================================================*/
/* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */
/* Houston, Texas */
/*===========================================================================*/
#define NOGDICAPMASKS TRUE
#define NOICONS TRUE
#define NOKEYSTATES TRUE
#define NOSYSCOMMANDS TRUE
#define NOATOM TRUE
#define NOCLIPBOARD TRUE
#define NODRAWTEXT TRUE
#define NOMINMAX TRUE
#define NOOPENFILE TRUE
#define NOSCROLL TRUE
#define NOHELP TRUE
#define NOPROFILER TRUE
#define NODEFERWINDOWPOS TRUE
#define NOPEN TRUE
#define NO_TASK_DEFINES TRUE
#define NOLSTRING TRUE
#define WIN31 TRUE
#include <windows.h>
#include <port1632.h>
#include <dcrc.h> /* mbbx 2.00 ... */
#include "commdlg.h"
#include <dynacomm.h>
#include <fileopen.h>
#include "dlgs.h"
#include <direct.h> /* adding this for chdir prototype -sdj*/
/*---------------------------------------------------------------------------*/
/* FileOpen() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID NEAR PASCAL PoundToNull(LPSTR str)
{
while(*str)
{
if(*str == '#')
*str = 0x00;
str++;
}
}
VOID NEAR PASCAL LoadFilterString(HANDLE hInst,WORD ResID,LPSTR szFilter,
INT len,DWORD *FilterIndex)
{
switch(ResID)
{
case FO_DBSNDTEXT:
case FO_DBRCVTEXT:
LoadString(hInst,STR_FILTERALL,
&szFilter[LoadString(hInst,STR_FILTERTXT,szFilter,len)],len);
*FilterIndex = 1;
break;
case FO_DBSNDFILE:
case FO_DBRCVFILE:
LoadString(hInst,STR_FILTERALL,szFilter,len);
*FilterIndex = 1;
break;
default:
LoadString(hInst,STR_FILTERTRM,szFilter,len);
*FilterIndex = 1;
}
PoundToNull(szFilter);
}
VOID NEAR PASCAL AddDirMod(CHAR *path)
{
INT len=0;
while(path[len]){
if(path[len] == '.')
return;
if(++len == (FO_MAXPATHLENGTH-1)){
*path = 0;
return;
}
}
path[len] = '\\';
path[len+1] = 0;
}
BOOL FileOpen(BYTE *filePath, BYTE *fileName1,BYTE *fileName2, BYTE *fileExt,BYTE * titleText,WORD wResID,DLGPROC lpFilter, WORD wMode)
{
BOOL FileOpen = FALSE;
// -sdj was unreferenced local var: LPDTA saveDTA;
BYTE savePath[FO_MAXPATHLENGTH];
FILEOPENDATA FOData;
// -sdj was unreferenced local var: BYTE work[80];
HWND whichParent;
CHAR szFilter[75]; /* default filter text/spec. for above */
CHAR szFileName[STR255]; /* Fully qualified name of file */
OPENFILENAME OFN;
INT rc;
#ifndef BUGBYPASS
if (TRUE)
#else
if(setPath(filePath, FALSE, savePath))
#endif
{
setFilePath(fileName1);
strcpy(FOData.file1, fileName1);
strcpy(FOData.file2, (fileName2 != NULL) ? fileName2 : NULL_STR);
strcpy(FOData.extent, fileExt);
strcpy(FOData.title, (titleText != NULL) ? titleText : NULL_STR);
FOData.wResID = ((wResID != 0) ? wResID : (!(wMode & FO_PUTFILE) ? FO_DBFILEOPEN : FO_DBFILESAVE)); /* mbbx 1.10: CUA... */
FOData.lpFilter = lpFilter;
FOData.wMode = wMode;
pFOData = &FOData;
whichParent = GetActiveWindow();
if ( (whichParent == NULL) || (!IsChild(hItWnd,whichParent)) )
whichParent = hItWnd; /* jtf 3.15 */
/* OFN structure intialization for common open dialog. 02/19/91*/
LoadFilterString(hInst,FOData.wResID,szFilter,sizeof(szFilter),&OFN.nFilterIndex);
szFileName[0] = '\0';
OFN.lStructSize = sizeof(OPENFILENAME);
OFN.lpstrTitle = NULL; /* Address later to whichever dialog*/
OFN.lpstrCustomFilter = NULL;
OFN.nMaxCustFilter = 0L;
OFN.lpstrDefExt = NULL; /* ?? address later forcing trm. */
OFN.lpstrInitialDir = NULL;
OFN.lpstrFile = szFileName;
OFN.nMaxFile = sizeof(szFileName);
OFN.lpfnHook = dbFileOpen;
OFN.lCustData = 0L;
OFN.lpTemplateName = MAKEINTRESOURCE(FOData.wResID);
OFN.hInstance = hInst;
OFN.hwndOwner = whichParent;
OFN.Flags = OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_ENABLEHOOK;
OFN.lpstrFileTitle = NULL;
OFN.nMaxFileTitle = 0L;
OFN.lpstrFilter = szFilter;
if((FOData.wResID == FO_DBFILESAVE) ||
(FOData.wResID == FO_DBRCVFILE) ||
(FOData.wResID == FO_DBRCVTEXT))
{
FileOpen = GetSaveFileName(&OFN);
}
else
{
FileOpen = GetOpenFileName(&OFN);
}
if(rc = CommDlgExtendedError())
{
testBox(whichParent,-(MB_ICONHAND|MB_SYSTEMMODAL|MB_OK),STR_ERRCAPTION,NoMemStr);
FileOpen = FALSE;
}
#ifdef ORGCODE
_getcwd(filePath);
#else
_getcwd(filePath,PATHLEN);
#endif
if(FileOpen)
{
// sdj: the way this code is working right now, terminal
// sdj: calls the commdlg fileopen with a dbFileOpen hook
// sdj: function which saves FOData.file with just the name
// sdj: part of the file, and the called of FileOpen does
// sdj: the cat of getcwd with this filename. This is broken
// sdj: in case where terminal sets chdir to c:\ and commdlg
// sdj: while exiting sets the dir back to where it was so
// sdj: instead of c:\boot.ini user views d:\...\boot.ini!
// sdj: solution is to set filename1 to FileName part of szfilename
// sdj: which is what comdlg gives as a FQN and set filePath to
// sdj: the path part of this. it is very unlikely that commdlg
// sdj: will return szFileName with no '\\' in it but if strrchr
// sdj: fails, stick with the original pathrelated bug!
if (strrchr(szFileName,'\\'))
{
strcpy(fileName1,(strrchr(szFileName,'\\')+1));
*(strrchr(szFileName,'\\')) = 0;
strcpy(filePath,szFileName);
}
else{
switch(FOData.wResID)
{
case FO_DBRCVFILE:
case FO_DBRCVTEXT:
strcpy(fileName1, FOData.file);
break;
case FO_DBFILESAVE:
strcpy(fileName1, szFileName);
break;
default:
strcpy(fileName1, FOData.file1);
break;
}/* switch(resID) */
}// end of if{!strrchr}else{sw:original stuff}
if(fileName2 != NULL)
strcpy(fileName2, FOData.file2);
if(!OFN.nFileExtension)
{
if(!strchr(fileName1, '.'))
strcat(fileName1, ".");
}
else if(FOData.wMode & FO_FORCEEXTENT)
{
if(strchr(fileExt, '.'))
strcpy(fileExt, strchr(fileExt, '.') + 1);
if(strchr(fileName1, '.'))
{
strcpy(strchr(fileName1, '.') + 1, fileExt);
}
else
{
strcat(fileName1, ".");
strcat(fileName1, fileExt);
}
}
else
strcpy(fileExt, FOData.extent);
if(wResID == FO_DBFILETYPE)
FileOpen = FOData.nType;
}
setPath(savePath, FALSE, NULL);
}
SetFocus(hTermWnd);
return(FileOpen);
}
/*---------------------------------------------------------------------------*/
/* dbFileOpen() - [mbb] */
/*---------------------------------------------------------------------------*/
INT_PTR APIENTRY dbFileOpen(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL result;
BYTE OEMname[STR255]; /* jtf 3.20 */
BYTE savePath[STR255]; /* rjs bugs 018 */
updateTimer(); /* code specific to DynaComm!!! */
switch(message)
{
case WM_INITDIALOG:
// use the OFN stuct to set this
if(*(pFOData->title) != 0)
SetWindowText(hDlg, pFOData->title); /* jtf terminal */
SendDlgItemMessage(hDlg, edt1, EM_LIMITTEXT, FO_MAXPATHLENGTH, 0L);
SendDlgItemMessage(hDlg, edt1, EM_SETSEL, GET_EM_SETSEL_MPS(0, MAKELONG(0,32767)));
if(pFOData->wResID == FO_DBFILETYPE) /* mbbx 1.10: CUA... */
(*(pFOData->lpFilter)) (hDlg, message, wParam, lParam); /* mbbx 2.00: new FO hook scheme... */
switch(pFOData->wResID) /* mbbx 2.00: new FO hook scheme... */
{
case FO_DBFILETYPE:
break;
case FO_DBSNDFILE:
case FO_DBRCVFILE:
ShowWindow(GetDlgItem(hDlg, FO_IDPROMPT2), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, FO_IDFILENAME2), SW_HIDE);
SendDlgItemMessage(hDlg, FO_IDFILENAME2, EM_LIMITTEXT, FO_MAXPATHLENGTH, 0L);
break;
default:
if(pFOData->lpFilter != NULL)
(*(pFOData->lpFilter)) (hDlg, message, wParam, lParam);
break;
}
if((pFOData->wMode & FO_PUTFILE) && !FO_SaveFileName(hDlg)) /* mbbx 2.00 ... */
{
SetDlgItemText(hDlg, edt1, pFOData->file1);
strcpy(pFOData->title, pFOData->file1);
}
if(pFOData->lpFilter != NULL) /* jtf 3.22 */
(*(pFOData->lpFilter)) (hDlg, message, wParam, lParam);
return(TRUE); /* Bug 7115, let dlgmgr set focus. clarkc */
case WM_COMMAND:
switch(GET_WM_COMMAND_ID(wParam, lParam))
{
case IDOK:
{
HWND focus = GetFocus();
if(focus == GetDlgItem(hDlg,edt1) ||
focus == GetDlgItem(hDlg,lst1) ||
focus == GetDlgItem(hDlg,IDOK))
{
if((pFOData->wMode & FO_GETFILENAME2) && (pFOData->wMode & FO_NONDOSFILE))
{
if(!GetDlgItemText(hDlg, edt1, pFOData->file2, FO_MAXPATHLENGTH))
pFOData->wMode &= ~FO_GETFILENAME2;
if(!GetDlgItemText(hDlg, FO_IDFILENAME2, pFOData->file, FO_MAXPATHLENGTH))
strcpy(pFOData->file, (pFOData->wMode & FO_GETFILENAME2) ? pFOData->file2 : pFOData->file1);
}
else
{
if(!GetDlgItemText(hDlg, edt1, pFOData->file, FO_MAXPATHLENGTH))
strcpy(pFOData->file, pFOData->file1);
if(pFOData->wMode & FO_GETFILENAME2)
if(!GetDlgItemText(hDlg, FO_IDFILENAME2, pFOData->file2, FO_MAXPATHLENGTH))
pFOData->wMode &= ~FO_GETFILENAME2;
}
result = TRUE;
break;
}
else
return(FALSE);
}
case IDCANCEL:
*(pFOData->file2) = 0;
pFOData->wMode &= ~FO_GETFILENAME2;
result = FALSE;
break;
case edt1:
if(GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE)
{
if(!((pFOData->wMode & FO_BATCHMODE) && (pFOData->wMode & FO_PUTFILE))) /* mbbx 1.01: ymodem */
EnableWindow(GetDlgItem(hDlg, IDOK), (BOOL)SendDlgItemMessage(hDlg, edt1, WM_GETTEXTLENGTH, 0, 0L));
if(pFOData->wMode & FO_GETFILENAME2)
{
*(pFOData->file2) = 0;
pFOData->wMode &= ~FO_GETFILENAME2;
ShowWindow(GetDlgItem(hDlg, FO_IDPROMPT2), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, FO_IDFILENAME2), SW_HIDE);
}
if(pFOData->lpFilter != NULL) /* mbbx 2.00: new FO hook scheme... */
(*(pFOData->lpFilter)) (hDlg, message, wParam, lParam);
}
return(FALSE);
case lst1:
if(GET_WM_COMMAND_CMD(wParam, lParam) == LBN_SELCHANGE)
{
FO_SetListItem(hDlg, lst1, FALSE);
if(pFOData->lpFilter != NULL) /* mbbx 2.00: new FO hook scheme... */
(*(pFOData->lpFilter)) (hDlg, message, wParam, lParam);
return(FALSE);
}
result = TRUE;
if(GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK)
break;
return(FALSE);
break;
default:
switch(pFOData->wResID) /* mbbx 2.00: new FO hook scheme... */
{
case FO_DBFILETYPE: /* mbbx 1.10: CUA... */
/* BUG BUG, what does this call, wParam/lParam may need fixing!*/
if(!(*(pFOData->lpFilter)) (hDlg, message, wParam, lParam))
{
SetDlgItemText(hDlg, FO_IDFILENAME, pFOData->file1);
}
break;
default:
if(pFOData->lpFilter != NULL)
(*(pFOData->lpFilter)) (hDlg, message, wParam, lParam);
break;
}
return(FALSE);
}
break;
default:
return(FALSE);
}
if(result)
{
if(!setPath(pFOData->file, TRUE, savePath))
{
FO_ErrProc(STRDRIVEDIR, MB_OK | MB_ICONHAND, hDlg);
return(FO_SetCtrlFocus(hDlg, GetFocus()));
}
if(!((pFOData->wMode & FO_BATCHMODE) && (GetKeyState(VK_CONTROL) & 0x8000))) /* mbbx 1.01: ymodem */
{
AnsiUpper(pFOData->file);
strcpy(pFOData->file1, pFOData->file);
if(FO_AddFileType(pFOData->file, pFOData->extent))
return(FALSE);
if(!FO_IsLegalDOSFN(pFOData->file)) /* mbbx 2.00: no forced extents... */
{
if(((pFOData->wMode & FO_NONDOSFILE) && (pFOData->wMode & FO_GETFILENAME2)) ||
(!(pFOData->wMode & FO_NONDOSFILE) && !(pFOData->wMode & FO_GETFILENAME2)) ||
!FO_IsLegalFN(pFOData->file))
{
FO_ErrProc(FO_STR_BADFILENAME, MB_OK | MB_ICONHAND,hDlg);
return(FO_SetCtrlFocus(hDlg, GetFocus()));
}
else if(!(pFOData->wMode & FO_GETFILENAME2))
{
pFOData->wMode |= FO_GETFILENAME2;
ShowWindow(GetDlgItem(hDlg, FO_IDPROMPT2), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, FO_IDFILENAME2), SW_SHOW);
return(FO_SetCtrlFocus(hDlg, GetFocus()));
}
}
if(!getFileType(pFOData->file, pFOData->extent)) /* mbbx 2.00 ... */
{
forceExtension(pFOData->file, pFOData->extent+2, FALSE); /* mbbx 2.00: no forced extents... */
}
// JYF -- replace these two lines with the below if() to remove the use of AnsiToOem()
//
//AnsiToOem(pFOData->file, (LPSTR) OEMname); /* jtf 3.20 */
//if((pFOData->wMode & FO_FILEEXIST) && !fileExist(OEMname)) /* jtf 3.20 */
if ((pFOData->wMode & FO_FILEEXIST) && !fileExist(pFOData->file))
{
/* rjs bugs 018 */
if(!(pFOData->wMode & FO_PUTFILE)) /* mbbx 1.10: CUA... */
DlgDirList(hDlg, pFOData->file, lst1, 0, FO_LBFILE);
else
strcpy(pFOData->file, pFOData->title);
SetDlgItemText(hDlg, ((pFOData->wMode & FO_GETFILENAME2) && (pFOData->wMode & FO_NONDOSFILE)) ?
FO_IDFILENAME2 : FO_IDFILENAME, pFOData->file);
setFilePath(savePath);
/* end of rjs bugs 018 */
FO_ErrProc(FO_STR_FILENOTFOUND, MB_OK | MB_ICONHAND,hDlg);
return(FO_SetCtrlFocus(hDlg, GetFocus()));
}
if((pFOData->wMode & FO_REMOTEFILE) && !(pFOData->wMode & FO_GETFILENAME2))
{
pFOData->wMode |= FO_GETFILENAME2;
SetDlgItemText(hDlg, FO_IDFILENAME2, pFOData->file);
ShowWindow(GetDlgItem(hDlg, FO_IDPROMPT2), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, FO_IDFILENAME2), SW_SHOW);
return(FO_SetCtrlFocus(hDlg, GetDlgItem(hDlg, FO_IDFILENAME2)));
}
// JYF -- replace these two lines with following if() to remove the use of AnsiToOem()
//
//AnsiToOem(pFOData->file, (LPSTR) OEMname); /* jtf 3.20 */
//if(((pFOData->wMode & (FO_PUTFILE | FO_FILEEXIST)) == FO_PUTFILE) && fileExist(OEMname)) /* jtf 3.20 */
if (((pFOData->wMode & (FO_PUTFILE | FO_FILEEXIST)) == FO_PUTFILE) && fileExist(pFOData->file))
{
if(FO_ErrProc(FO_STR_REPLACEFILE, MB_YESNO | MB_ICONEXCLAMATION,hDlg) == IDNO)
return(FO_SetCtrlFocus(hDlg, GetFocus()));
}
}
AnsiUpper(pFOData->file); /* mbbx 2.00: new FO hook scheme... */
strcpy(pFOData->file1, pFOData->file);
AnsiUpper(pFOData->file2);
}
if(pFOData->lpFilter != NULL) /* mbbx 2.00: new FO hook scheme... */
(*(pFOData->lpFilter)) (hDlg, WM_NULL, result, 0L);
return(FALSE);
}
/*---------------------------------------------------------------------------*/
/* FO_SaveFileName() - [mbb] */
/*---------------------------------------------------------------------------*/
BOOL NEAR FO_SaveFileName(HWND hDlg)
{
register BYTE *pch;
GetDlgItemText(hDlg, ((pFOData->wMode & FO_GETFILENAME2) && (pFOData->wMode & FO_NONDOSFILE)) ?
FO_IDFILENAME2 : edt1, pFOData->file, 32);
for(pch = pFOData->file; *pch != 0; pch += 1)
if((*pch == '*') || (*pch == '?') || (*pch == '\\') || (*pch == ':'))
return(FALSE);
strcpy(pFOData->title, pFOData->file);
return(TRUE);
}
/*---------------------------------------------------------------------------*/
/* FO_SetListItem() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID NEAR FO_SetListItem(HWND hDlg,WORD wCtrlID,BOOL bSetSel)
{
if(bSetSel)
SendDlgItemMessage(hDlg, wCtrlID, LB_SETCURSEL, 0, 0L);
if(SendDlgItemMessage(hDlg, wCtrlID, LB_GETCURSEL, 0, 0L) != LB_ERR)
{
MDlgDirSelect(hDlg, pFOData->file, FO_MAXFILELENGTH, wCtrlID);
if(wCtrlID == lst2)
{
FO_NewFilePath(hDlg, ((pFOData->wMode & FO_GETFILENAME2) && (pFOData->wMode & FO_NONDOSFILE)) ?
FO_IDFILENAME2 : edt1, pFOData->file, pFOData->extent);
}
SetDlgItemText(hDlg, ((pFOData->wMode & FO_GETFILENAME2) && (pFOData->wMode & FO_NONDOSFILE)) ?
FO_IDFILENAME2 : edt1, pFOData->file);
}
}
/*---------------------------------------------------------------------------*/
/* FO_NewFilePath() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID NEAR FO_NewFilePath(HWND hDlg, WORD wCtrlID,BYTE *fileName,BYTE *fileExt)
{
register BYTE *pch;
BOOL bWild;
BYTE tempName[FO_MAXPATHLENGTH];
GetDlgItemText(hDlg, wCtrlID, tempName, FO_MAXPATHLENGTH);
pch = tempName+(strlen(tempName)-1);
bWild = ((*pch == '*') || (*pch == ':'));
while(pch > tempName)
{
pch--;
if((*pch == '*') || (*pch == '?'))
bWild = TRUE;
if((*pch == '\\') || (*pch == ':'))
{
pch++;
break;
}
}
if(bWild)
strcpy(fileName+strlen(fileName), pch);
else
strcpy(fileName+strlen(fileName), fileExt+1);
}
/*---------------------------------------------------------------------------*/
/* FO_AddFileType() - [mbb] */
/*---------------------------------------------------------------------------*/
BOOL NEAR FO_AddFileType(BYTE *fileName, BYTE *fileExt)
{
register BYTE *pch;
INT j;
BOOL bWild;
if((pch = fileName+strlen(fileName)) == fileName)
j = 1;
else if((pch == fileName+2) && (fileName[0] == '.') && (fileName[1] == '.'))
j = 0;
else
{
bWild = FALSE; /* mbbx 2.00: no forced extents... */
while(--pch >= fileName)
{
if((*pch == '*') || (*pch == '?'))
{
bWild = TRUE;
break;
}
}
if(getFileType(fileName, fileExt))
return(bWild);
pch = fileName+strlen(fileName);
j = ((*(pch-1) == '\\') ? 1 : (bWild ? 2 : 0));
}
//sdj: if the extention is "\*.*" which it would be if someone is doing
//sdj: recvfile open with "test" as name, why add \*.* to test?
//sdj: it is ok to do this for open/save/saveas where you can force .trm
//sdj: not not in other cases of opening the file
if (*fileExt == '\\' && *(fileExt+1) == '*' && *(fileExt+2) == '.')
{
return FALSE;
}
strcpy(pch, fileExt+j);
return(TRUE);
}
/*---------------------------------------------------------------------------*/
/* FO_StripFileType() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID NEAR FO_StripFileType(BYTE *fileName)
{
register BYTE *pch;
for(pch = fileName+(strlen(fileName)-1); pch > fileName; pch--)
{
if(*pch == '\\')
{
*pch = 0;
break;
}
}
}
/*---------------------------------------------------------------------------*/
/* FO_IsLegalDOSFN() - [mbb] */
/*---------------------------------------------------------------------------*/
#define FO_MAXDOSFILELEN FO_MAXFILELENGTH //-sdj bug#4587 fix
// -sdj this was 8 to check for dosfilename length. with ntfs filenames
// -sdj being >8 this test used to fail. made maxdosfilelen to fo_maxfilelength
// -sdj which is 16 at present. This will let users use prefix name upto
// -sdj 16 chars, but still force them to have .trm extension, AND by
// -sdj restricting the name to FO_MAXFILELENGTH, ensure that no other
// -sdj global buffer overflows (most of the buffers use this define)
// -sdj eventually, right solution is to set fo_maxfilelength to ntfs max
// -sdj name, but this is an intermediate solution which is safe, and still
// -sdj allow users upto 16 chars of trmfilenames.
// -sdj along with this change the other change needed is to increase
// -sdj the termData element sizes to > 12 which was a pain! this define
// -sdj in dynacomm.h is increased to 32 for the time being.
#define FO_MAXDOSEXTLEN 3
BOOL NEAR FO_IsLegalDOSFN(BYTE *fileName)
{
register INT i;
INT j;
for(i = 0; fileName[i] == ' '; i++);
if(i > 0)
strcpy(fileName, fileName+i);
for(i = 0; fileName[i] != 0; i++)
{
if(fileName[i] == '.')
{
for(j = 1; fileName[i+j] != 0; j++)
{
if((j > FO_MAXDOSEXTLEN) || !FO_IsLegalDOSCH(fileName[i+j]) || (fileName[i+j]=='.') ) /* jtf 3.31 */
return(FALSE);
}
break;
}
if((i >= FO_MAXDOSFILELEN) || !FO_IsLegalDOSCH(fileName[i]))
return(FALSE);
}
return(i != 0);
}
/*---------------------------------------------------------------------------*/
/* FO_IsLegalDOSCH() - */
/*---------------------------------------------------------------------------*/
#define FO_NONDOSFNCHARS "\\/[]:|<>+=;,\""
BOOL NEAR FO_IsLegalDOSCH(BYTE ch)
{
register BYTE *pch;
if(ch <= ' ')
return(FALSE);
for(pch = FO_NONDOSFNCHARS; *pch != '\0'; pch++)
{
if(*pch == ch)
return(FALSE);
}
return(TRUE);
}
/*---------------------------------------------------------------------------*/
/* FO_IsLegalFN() - [scf] */
/*---------------------------------------------------------------------------*/
BOOL NEAR FO_IsLegalFN(BYTE *fileName)
{
return(TRUE);
}
/*---------------------------------------------------------------------------*/
/* FO_ErrProc() - */
/*---------------------------------------------------------------------------*/
INT NEAR FO_ErrProc(WORD errMess, WORD errType, HWND hDlg)
{
BYTE temp1[STR255];
BYTE temp2[STR255];
GetWindowText(hItWnd, temp1, 254); /* mbbx 2.00: new FO hook scheme... */
sscanf(temp1, "%s", temp2);
LoadString(hInst, (errType & MB_ICONHAND) ? FO_STR_ERRCAPTION : FO_STR_WARNCAPTION, temp1, 80);
strcpy(temp2+strlen(temp2), temp1);
LoadString(hInst, errMess, temp1, 254);
MessageBeep(0);
return(MessageBox(hDlg, temp1, temp2, errType)); /* jtf 3.14 */
}
/*---------------------------------------------------------------------------*/
/* FO_SetCtrlFocus() - [mbb] */
/*---------------------------------------------------------------------------*/
BOOL NEAR FO_SetCtrlFocus(HWND hDlg, HWND hCtrl)
{
if(hCtrl == NULL) /* mbbx 2.00 ... */
hCtrl = GetDlgItem(hDlg, (pFOData->wMode & FO_GETFILENAME2) ? FO_IDFILENAME2 : edt1);
#ifdef ORGCODE
switch(GetWindowWord(hCtrl, GWW_ID))
#else
switch(GetWindowLong(hCtrl, GWL_ID))
#endif
{
case edt1:
case FO_IDFILENAME2:
SendMessage(hCtrl, EM_SETSEL, GET_EM_SETSEL_MPS(0, 0x7FFF));
break;
case lst2:
break;
case lst1:
if(SendMessage(hCtrl, LB_GETCURSEL, 0, 0L) != LB_ERR)
break;
case IDOK:
if(pFOData->wMode & FO_PUTFILE)
{
hCtrl = GetDlgItem(hDlg, (pFOData->wMode & FO_GETFILENAME2) ? FO_IDFILENAME2 : edt1);
SendMessage(hCtrl, EM_SETSEL, GET_EM_SETSEL_MPS(0, 0x7FFF));
}
else
{
hCtrl = GetDlgItem(hDlg, lst1);
if(SendMessage(hCtrl, LB_GETCOUNT, 0, 0L) > 0)
FO_SetListItem(hDlg, lst1, TRUE);
else
hCtrl = GetDlgItem(hDlg, lst2); /* mbbx 1.10: CUA... */
}
break;
}
SetFocus(hCtrl);
return(TRUE);
}
/*---------------------------------------------------------------------------*/
/* setPath() - [mbb] */
/*---------------------------------------------------------------------------*/
BOOL setPath(BYTE *newPath, BOOL bFileName, BYTE *oldPath)
{
BYTE work[FO_MAXPATHLENGTH];
DEBOUT("Enter setPath: with newpath=%lx\n",newPath);
DEBOUT(" setPath: with bFileName=%lx\n",bFileName);
DEBOUT(" setPath: with oldPath=%lx\n",oldPath);
if(oldPath)
#ifdef ORGCODE
{ _getcwd(oldPath); }
#else
{
_getcwd(oldPath,PATHLEN);
DEBOUT("setPath: getcwd returned %s\n",oldPath);
}
#endif
if(bFileName)
{
if(!setFilePath(newPath)){
DEBOUT("setPath: setFilePath(newPath) returned 0, calling sFP(%lx) and ret FALSE\n",oldPath);
setFilePath(oldPath);
return(FALSE);
}
}
else
{
strcpy(work, newPath);
DEBOUT("setPath: bFil=0,call setfp and chdir with work as %s\n",work);
if(!setFilePath(work) || ((work[0] != 0) && (_chdir(work) == -1))){
DEBOUT("setPath: setFP(work) ret0||somethingelse, calling sFP(%lx) and ret FALSE\n",oldPath);
setFilePath(oldPath);
return(FALSE);
}
}
return(TRUE);
}
/*---------------------------------------------------------------------------*/
/* setFilePath() - [mbb] */
/*---------------------------------------------------------------------------*/
BOOL setFilePath(BYTE *fileName)
{
INT ndx;
BYTE temp[FO_MAXPATHLENGTH];
//sdj: just added to debug if chdir is working BYTE tmpgetcwd[PATHLEN];
DEBOUT("Enter setFilePath with filename=%lx\n",fileName);
#ifdef ORGCODE
#else
if (!fileName)
{
DEBOUT("setFilePath: HACK %s\n","called with 0 as filename");
DEBOUT("setFilePath: HACK %s\n","setting chdir to c:\\nt");
_chdir("C:\\NT");
return TRUE;
}
#endif
ndx = strlen(fileName);
#ifdef ORGCODE
if((ndx >= 2) && (fileName[1] == ':')) /* mbbx 2.00 ... */
{
if(fileName[0] > 'Z')
fileName[0] -= ' ';
if(!setdrive(fileName[0]))
return(FALSE);
strcpy(fileName, fileName+2);
ndx -= 2; /* mbbx 2.00 */
}
#else
/* in NT there is no concept of currentdrive AND currentWorkDir -sdj
so dont do any setdrive, and keep the fileName as a fully -sdj
qualified path name including the drive letter -sdj*/
#endif
while(--ndx >= 0) /* mbbx 2.00 ... */
{
if(fileName[ndx] == '\\')
break;
}
if(ndx >= 0)
{
// sdj: 11may93: FileOpen
strcpy(temp, fileName+ndx+1);
if(ndx == 0)
ndx += 1;
fileName[ndx] = '\0';
// -sdj fix for readcmdline not opening .trm file 03jun92
//
// if filename was c:\scratch\foo.trm, do chdir(c:\) not chdir(c:)
// if chdir(c:) is done,later getcwd will not give c:\ but something else
if (fileName[ndx-1] == ':')
{
fileName[ndx] = '\\';
fileName[ndx+1] = '\0';
}
// end of fix
if(_chdir(fileName) == -1)
return(FALSE);
//getcwd(tmpgetcwd,PATHLEN);
strcpy(fileName, temp);
}
return(TRUE);
}
/*---------------------------------------------------------------------------*/
/* forceExtension() - [mbb] */
/*---------------------------------------------------------------------------*/
VOID forceExtension(BYTE *fileName, BYTE *fileExt, BOOL bReplace)
{
register BYTE *pch;
WORD len;
for(pch = fileName+((len = strlen(fileName))-1); pch > fileName; pch -= 1)
{
if((*pch == '.') || (*pch == '\\'))
break;
}
if((pch <= fileName) || (*pch != '.'))
pch = fileName + len;
else if(!bReplace)
return;
strcpy(pch, fileExt);
while(*(++pch) != 0)
if((*pch == '*') || (*pch == '?'))
{
*pch = 0;
break;
}
}
/*---------------------------------------------------------------------------*/
/* getFileType() - [mbb] */
/*---------------------------------------------------------------------------*/
BOOL getFileType(BYTE *fileName, BYTE *fileExt)
{
register BYTE *pch;
for(pch = fileName+(strlen(fileName)-1); pch > fileName; pch -= 1)
{
if(*pch == '.')
{
AnsiUpper(pch);
forceExtension(fileExt, pch, TRUE); /* mbbx 2.00: no forced extents */
return(TRUE);
}
else if(*pch == '\\')
break;
}
return(FALSE);
}
#ifdef ORGCODE
#else
BOOL fileExist(LPSTR lpfilename)
{
HANDLE hFile;
CHAR chCurDir[FO_MAXPATHLENGTH+1];
DWORD dwRc;
dwRc = GetCurrentDirectory(FO_MAXPATHLENGTH,chCurDir);
DEBOUT("Rc of getcdir = %lx\n",dwRc);
DEBOUT("Current Dir in which file is being opened=%s\n",chCurDir);
DEBOUT("Existence being checked for the file=%s\n",lpfilename);
hFile = CreateFile(lpfilename,
GENERIC_READ, /* no access desired please */
FILE_SHARE_READ|FILE_SHARE_WRITE, /* dont be greedy */
NULL, /* no security */
OPEN_EXISTING, /* open only if existing */
FILE_ATTRIBUTE_NORMAL, /* who cares what attr it is */
NULL); /* why do we need template here */
if( (hFile == (HANDLE)-1) || (hFile == NULL) )
{
/* cant open this one, so return false, looks like doesnt exist */
DEBOUT("fileExist FALSE: %s does not exit\n",lpfilename);
return FALSE;
}
DEBOUT("fileExist TRUE: %s does exit\n",lpfilename);
CloseHandle(hFile);
return TRUE;
}
#endif