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