PTFILE.C

#include "PortTool.h" 
#include <string.h>

/* global file name variables */
char lpszFilePath[MAX_PATH];
charlpszFilterSpec[128] = ""; // pickup eventually from string table

charlpszPortIniFilePath[MAX_PATH];
charlpszPortIniFilterSpec[128] = ""; // pickup eventually from string table

/* call the OpenFile common dialog to get a porttool Information filename */


/* load file filter spec strings from resource */
VOID LoadFilterSpecString(LPTSTR lpDest, UINT StartID, UINT EndID)
{
CHAR szBuf[MAX_PATH];
UINT wID;
INT nOffset;
HMODULE hModule = GetModuleHandle(NULL);

if(!*lpDest) {
for(wID = StartID, nOffset = 0; wID <= EndID; wID++) {
LoadString((HANDLE)hModule, wID, szBuf, sizeof(szBuf));
lstrcpy(lpDest + nOffset, szBuf);
nOffset += lstrlen(szBuf) + 1;
}
}
return;
}


/* call the OpenFile common dialog to get a filename */
BOOL WINAPI GetFileName (
HWND hWnd,
char *lpszFileTitle,
char *lpszFilePath)
{
OPENFILENAME ofn;
char lpszFileOpen[25];
char lpszExt[10];

memset(&ofn, 0, sizeof(OPENFILENAME));
strcpy (lpszFileTitle, "");

LoadString ((HANDLE)GetModuleHandle (NULL),
IDS_DEFAULTFILEEXT,
lpszExt,
sizeof (lpszExt));

LoadString ((HANDLE)GetModuleHandle (NULL),
IDS_FILEOPENTITLE,
lpszFileOpen,
sizeof (lpszFileOpen));
LoadFilterSpecString(lpszFilterSpec, IDS_FILE_FILTER_SPEC1, IDS_EXT_FILTER_SPEC3);

/* fill in non-variant fields of OPENFILENAME struct. */
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = lpszFilterSpec;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = lpszFilePath;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrInitialDir = NULL;
ofn.lpstrFileTitle = lpszFileTitle;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrTitle = lpszFileOpen;
ofn.lpstrDefExt = lpszExt;
ofn.Flags = OFN_FILEMUSTEXIST;

/* call common open dialog and return result */
return (GetOpenFileName ((LPOPENFILENAME)&ofn));
}

BOOL WINAPI GetPortIniFileName (
HWND hWnd,
char *lpszFileTitle,
char *lpszFilePath)
{
OPENFILENAME ofn;
charlpszFileOpen[64];
char lpszExt[10];

memset(&ofn, 0, sizeof(OPENFILENAME));
strcpy (lpszFileTitle, "");

/* load strings from resource string table */
LoadString ((HANDLE)GetModuleHandle (NULL),
IDS_DEFAULTPORTEXT,
lpszExt,
sizeof (lpszExt));

LoadString ((HANDLE)GetModuleHandle (NULL),
IDS_PORTFILEOPENTITLE,
lpszFileOpen,
sizeof (lpszFileOpen));

LoadFilterSpecString(lpszPortIniFilterSpec, IDS_FILE_FILTER_SPEC4, IDS_EXT_FILTER_SPEC5);

/* fill in non-variant fields of OPENFILENAME struct. */
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = lpszPortIniFilterSpec;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = lpszFilePath;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrInitialDir = NULL;
ofn.lpstrFileTitle = lpszFileTitle;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrTitle = lpszFileOpen;
ofn.lpstrDefExt = lpszExt;
ofn.Flags = 0;

/* call common open dialog and return result */
return (GetOpenFileName ((LPOPENFILENAME)&ofn));
}


/* function retrieves the filename from the path */
BOOL WINAPI GetFileFromPath (
char *lpszFullPath,
char *lpszFile)
{
char *lpPtr = lpszFullPath + strlen (lpszFullPath);

/* file is at end of path, so search backwards to first \ or : char */
while (lpPtr > lpszFullPath)
{
if (*lpPtr == '\\' ||
*lpPtr == ':')
{
lpPtr++;
break;
}
lpPtr = CharPrev(lpszFullPath, lpPtr);
}

/* return filename if found, or full path passed in */
strcpy (lpszFile, lpPtr);

return (lpPtr > lpszFullPath);
}




/* open a file and load into edit control */
int WINAPI LoadFile (
HWND hWnd,
char *lpszName)
{
LONG lLength;
HWND hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
HANDLE hEditData;
char *lpEditData;
HFILEhFile;

/* open file for read & write */
if ((hFile = (HFILE)CreateFile (lpszName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL))
== (HFILE)INVALID_HANDLE_VALUE) {
/* return error */
return 0-IDS_OPENFAILED;
}

/* get file length */
if (lLength = _llseek(hFile, 0L, 2))
_llseek(hFile, 0L, 0);
else
{
/* close file and return error */
CloseHandle ((HANDLE)hFile);
return 0-IDS_NOSIZE;
}

#if !defined (WIN32)

/* get the edit control's memory handle */
if (!(hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0L)))
{
/* close file and return error */
CloseHandle ((HANDLE)hFile);
return 0-IDS_GETHANDLEFAILED;
}

/* realloc the memory to fit the new file size */
if (((hEditData = LocalReAlloc(hEditData, lLength+1, LHND)) == NULL) ||

#else

if (((hEditData = LocalAlloc (LHND, lLength+1)) == NULL) ||

#endif

(!(lpEditData = (char *)LocalLock (hEditData))))
{
/* close file and return error */
CloseHandle ((HANDLE)hFile);
return 0-IDS_REALLOCFAILED;
}


/* read the file into hEditData buffer */
if (_lread(hFile, lpEditData, lLength) == -1)
{
/* close file and return error */
CloseHandle ((HANDLE)hFile);
return 0-IDS_READFAILED;
}

/* null terminate edit buffer */
lpEditData[lLength] = 0;
LocalUnlock (hEditData);

/* load buffer into edit control and close file */

#if !defined(WIN32)

SendMessage (hWndEdit, EM_SETHANDLE, (UINT)hEditData, 0L);

#else

lpEditData = LocalLock (hEditData);
SendMessage (hWndEdit, WM_SETTEXT, 0, (LPARAM)lpEditData);
GetLastError();
LocalUnlock (hEditData);
// LocalFree (hEditData); // Isn't there a synchronization issue with this?

#endif

CloseHandle ((HANDLE)hFile);

/* return success */
return TRUE;
}



/* save file to disk */
int WINAPI SaveFile (
HWND hWnd,
char *lpszFile)
{
HANDLE hEditData;
int nLength;
DWORD dwWritten;
HANDLE hFile;
HWND hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
char *lpEditData;


/* open the file for writing */
hFile = CreateFile (lpszFile,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

/* validate file handle */
if (!hFile)
return IDS_WRITEOPENFAILED;

/* find out the length of the text in the edit control */
nLength = GetWindowTextLength (hWndEdit);

#if !defined (WIN32)

/* get handle to Edit text and lock pointer */
hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
lpEditData = (char *)LocalLock (hEditData);

#else

hEditData = LocalAlloc (LHND, nLength+1);
lpEditData = (char *) LocalLock (hEditData);
GetWindowText (hWndEdit, lpEditData, nLength+1);

#endif

/* write edit data to file. */
if (!WriteFile(hFile, lpEditData, nLength, &dwWritten, NULL))
{
/* unlock memory, restore edit handle, close file and return error */
LocalUnlock (hEditData);
CloseHandle (hFile);
return IDS_WRITEFAILED;
}

/* clean up and go away */
LocalUnlock (hEditData);
CloseHandle (hFile);

return TRUE;
}


/* invokes the saveas common dialog to retrieve a file name */
BOOL WINAPI SaveAsFileName (
HWND hWnd,
char *lpszFileTitle,
char *lpszFilePath)
{
OPENFILENAME ofn;
char lpszSaveAs[25];
char lpszExt[10];
BOOL nResult;

memset(&ofn, 0, sizeof(OPENFILENAME));
*lpszFileTitle = 0;
*lpszFilePath = 0;

/* load strings from resource string table */
LoadString ((HANDLE)GetModuleHandle (NULL),
IDS_DEFAULTFILEEXT,
lpszExt,
sizeof (lpszExt));
LoadString ((HANDLE)GetModuleHandle (NULL),
IDS_SAVEASTITLE,
lpszSaveAs,
sizeof (lpszSaveAs));
LoadFilterSpecString(lpszFilterSpec, IDS_FILE_FILTER_SPEC1, IDS_EXT_FILTER_SPEC3);

/* fill in non-variant fields of OPENFILENAME struct. */
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = lpszFilterSpec;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = lpszFilePath;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrInitialDir = NULL;
ofn.lpstrFileTitle = lpszFileTitle;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrTitle = lpszSaveAs;
ofn.lpstrDefExt = lpszExt;
ofn.Flags = 0;

/* call common saveas dialog and return success */
if(nResult = GetSaveFileName ((LPOPENFILENAME)&ofn)) {
lstrcpy(lpszFileTitle,ofn.lpstrFileTitle); // save File Title
}
return nResult;
}