Category : Windows 3.X Files
Archive   : MULTIPAD.ZIP
Filename : MPFILE.C

 
Output of file : MPFILE.C contained in archive : MULTIPAD.ZIP
/***************************************************************************
* *
* MODULE : MpFile.c *
* *
* PURPOSE : Contains the code for File i/o for Multipad. *
* *
* FUNCTIONS : *
* AddFile() - Creates a new MDI window. Given an *
* option, it loads a file into it. *
* *
* LoadFile () - Loads a file into the MDI window. *
* *
* ReadFile () - In response to File/Open menu, *
* calls AddFile() *
* *
* SaveFile () - Saves contents of an edit control to *
* a file. *
* *
* SetSavefrom() - Formats the "Save 'file' to" string. *
* *
* SaveAsDlgProc() - Dialog function for File/SaveAs. *
* *
* ChangeFile() - Calls File/SaveAs dialog. *
* *
***************************************************************************/
#include "multipad.h"

VOID NEAR PASCAL GetFileName(PSTR);
int FAR PASCAL DialogBoxParam(HANDLE,LPSTR,HWND,FARPROC,LONG);

/****************************************************************************
* *
* FUNCTION : AddFile (lpName) *
* *
* PURPOSE : Creates a new MDI window. If the lpName parameter is not *
* NULL, it loads a file into the window. *
* *
* RETURNS : HWND - A handle to the new window. *
* *
****************************************************************************/

HWND FAR PASCAL AddFile ( lpName )
LPSTR lpName;
{
HWND hwnd;

char sz[160];
MDICREATESTRUCT mcs;

if (!lpName){
/* If the lpName parameter is NULL, load the "Untitled" string
* from STRINGTABLE and set the title field of the MDI CreateStruct.
*/
LoadString (hInst, IDS_UNTITLED, sz, sizeof(sz));
mcs.szTitle = (LPSTR)sz;
}
else{
/* Title the window with the supplied filename */
AnsiUpper (lpName);
mcs.szTitle = lpName;
}

mcs.szClass = szChild;
mcs.hOwner = hInst;

/* Use the default size for the window */
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;

/* Set the style DWORD of the window to default */
mcs.style = styleDefault;

/* tell the MDI Client to create the child */
hwnd = (WORD)SendMessage (hwndMDIClient,
WM_MDICREATE,
0,
(LONG)(LPMDICREATESTRUCT)&mcs);

/* Did we get a file? Read it into the window */
if (lpName)
LoadFile (hwnd, lpName);

return hwnd;

}

/****************************************************************************
* *
* FUNCTION : LoadFile (lpName) *
* *
* PURPOSE : Given the handle to a MDI window and a filename, reads the *
* file into the window's edit control child. *
* *
* RETURNS : TRUE - If file is sucessfully loaded. *
* FALSE - Otherwise. *
* *
****************************************************************************/
int FAR PASCAL LoadFile (hwnd, lpName)
HWND hwnd;
LPSTR lpName;
{
WORD wLength;
HANDLE hT;
LPSTR lpB;
HWND hwndEdit;
int fh;

hwndEdit = GetWindowWord (hwnd, GWW_HWNDEDIT);

/* The file has a title, so mark the appropriate flag. */
SetWindowWord(hwnd, GWW_UNTITLED, 0);

fh = _lopen (lpName, 0);

/* Make sure file has been opened correctly */
if ( fh < 0 )
goto error;

/* Find the length of the file */
wLength = (WORD)_llseek (fh, 0L, 2);
_llseek (fh, 0L, 0);

/* Attempt to reallocate the edit control's buffer to the file size */
hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L);
if (!LocalReAlloc (hT, wLength+1, LHND)){
LocalUnlock (hT);
_lclose (fh);
goto error;
}

/* read the file into the buffer */
if (wLength != _lread (fh, (lpB = (LPSTR)LocalLock (hT)), wLength))

MPError (hwnd, MB_OK|MB_ICONHAND, IDS_CANTREAD, lpName);

/* Zero terminate the edit buffer */
lpB [wLength] = 0;
LocalUnlock (hT);

SendMessage (hwndEdit, EM_SETHANDLE, hT, 0L);
_lclose (fh);

return TRUE;

/* Report the error and quit */
error:
MPError(hwnd,MB_OK|MB_ICONHAND,IDS_CANTOPEN,lpName);
return FALSE;

}

/****************************************************************************
* *
* FUNCTION : ReadFile (hwnd) *
* *
* PURPOSE : Called in response to a File/Open menu selection. It calls *
* AddFile () to load the file into the control. *
* *
****************************************************************************/
VOID FAR PASCAL ReadFile( hwnd )
HWND hwnd;
{
char szFile[128];

GetFileName (szFile);
if ( *szFile )
AddFile (szFile);

}
/****************************************************************************
* *
* FUNCTION : SaveFile (hwnd) *
* *
* PURPOSE : Saves contents of current edit control to disk. *
* *
****************************************************************************/
VOID FAR PASCAL SaveFile( hwnd )

HWND hwnd;
{
HANDLE hT;
LPSTR lpT;
char szFile[64];
WORD cch;
int fh;
OFSTRUCT of;
HWND hwndEdit;

hwndEdit = GetWindowWord ( hwnd, GWW_HWNDEDIT);
GetWindowText (hwnd, szFile, sizeof(szFile));

/* If there is no extension (control is 'Untitled') add .TXT as extension */
for (cch = FALSE, lpT = szFile; *lpT; lpT++)
switch (*lpT){
case '.':
cch = TRUE;
break;

case '\\':
case ':' :
cch = FALSE;
break;
}
if (!cch)
LoadString (hInst, IDS_ADDEXT, lpT, lpT - (LPSTR)szFile);

fh = OpenFile (szFile, &of, OF_WRITE | OF_CREATE);

/* If file could not be opened, quit */
if (fh < 0){
MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTCREATE, (LPSTR)szFile);
return;
}

/* Find out the length of the text in the edit control */
cch = GetWindowTextLength (hwndEdit);

/* Obtain a handle to the text buffer */
hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L);
lpT = (LPSTR)LocalLock (hT);

/* Write out the contents of the buffer to the file. */
if (cch != _lwrite (fh, lpT, cch))
MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTWRITE, (LPSTR)szFile);

/* Clean up */
LocalUnlock (hT);
SendMessage (hwndEdit, EM_SETHANDLE, hT, 0L);

_lclose (fh);

return;
}
/****************************************************************************
* *
* FUNCTION : SetSaveFrom () *
* *
* PURPOSE : Formats the "Save 'file' to .." string. *
* *
****************************************************************************/

VOID NEAR PASCAL SetSaveFrom ( hwnd , psz)
HWND hwnd;
PSTR psz;
{
char szFmt[32];
char szText[160];

/* The text string in the .RC file contains the format string... */
GetDlgItemText( hwnd, IDD_SAVEFROM, szFmt, sizeof(szFmt));

/* NOTE: this (LPSTR) cast MUST be here... wsprintf() is a cdecl
* (C calling conventions) function with varying args... there is
* no way for the compiler to know that all strings must be LPSTR's
* and do the conversion, so we have to be careful about wsprintf()'s.
*/
wsprintf ( szText, szFmt, (LPSTR)psz);

/* set the text in the static control */
SetDlgItemText (hwnd, IDD_SAVEFROM, szText);
}

/****************************************************************************
* *
* FUNCTION : SaveAsDlgProc(hwnd, message, wParam, lParam) *
* *
* PURPOSE : Dialog function File/SaveAs. It waits for a filename, and *
* then calls SaveFile or cancels the operation. *
* *
****************************************************************************/
BOOL FAR PASCAL SaveAsDlgProc( hwnd, message, wParam, lParam)
HWND hwnd;
WORD message;
WORD wParam;
LONG lParam;
{
char sz[64];
char *pch;
BOOL fExt;
HWND hwndSave;

switch (message){

case WM_INITDIALOG:

/* Identify the window whose contents we're saving */
hwndSave = LOWORD (lParam);

/* Set it's name in the property list */
SetProp (hwnd, PROP_FILENAME, hwndSave);

GetWindowText (hwndSave, sz, sizeof(sz));

/* Set the save from string... */
SetSaveFrom (hwnd,sz);

/* Generate a filename complete with extension */
AnsiUpper (sz);
for (fExt = FALSE, pch = sz; *pch; pch++)
if (*pch == '.')
fExt = TRUE;
else if (*pch == '\\')
fExt = FALSE;
if (!fExt)
LoadString (hInst, IDS_ADDEXT, (LPSTR)pch, pch - sz);

/* Display the filename in the edit control */
SetDlgItemText (hwnd, IDD_SAVETO, sz);

/* Select the entire range of text */
SendDlgItemMessage (hwnd, IDD_SAVETO, EM_SETSEL, 0, MAKELONG (0,100));

DlgDirList (hwnd, "*.*", IDD_DIRS, IDD_PATH, ATTR_DIRS);

/* enable OK butto iff edit control is nonempty */
if (!*sz)
EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);
break;

case WM_COMMAND:
switch (wParam){
case IDCANCEL:
/* Abort operation */
EndDialog(hwnd,1);
break;

case IDOK:
/* Just change the title of the MDI child. The calling
* function of ChangeFile(), which uses the title text
* for the filename, will do the actual save.
*/
hwndSave = GetProp (hwnd, PROP_FILENAME);
GetDlgItemText (hwnd, IDD_SAVETO, sz, sizeof(sz));
AnsiUpper ((LPSTR)sz);
SetWindowText (hwndSave, sz);
EndDialog (hwnd, 0);
break;

case IDD_SAVETO:
/* If the edit control changes, check to see if its empty.
* enable OK if it contains something
*/
if (HIWORD (lParam) != EN_CHANGE)
return FALSE;
EnableWindow (GetDlgItem (hwnd, IDOK),
(WORD) SendDlgItemMessage (hwnd,
IDD_SAVETO,
WM_GETTEXTLENGTH,
0,
0L));
break;

case IDD_DIRS:
if (HIWORD(lParam)==LBN_DBLCLK){
char szT[64];

DlgDirSelect ( hwnd, szT, IDD_DIRS);
lstrcat ( szT, "*.*");
DlgDirList (hwnd, szT, IDD_DIRS, IDD_PATH, ATTR_DIRS);
break;
}
return FALSE;

default:
return FALSE;
}

default:
return FALSE;
}
return TRUE;
}
/****************************************************************************
* *
* FUNCTION : ChangeFile (hwnd) *
* *
* PURPOSE : Invokes the File/SaveAs dialog. *
* *
* RETURNS : TRUE - if user selected OK or NO. *
* FALSE - otherwise. *
* *
****************************************************************************/
BOOL FAR PASCAL ChangeFile (hwnd)
HWND hwnd;
{
FARPROC lpfn;
int i;

lpfn = MakeProcInstance (SaveAsDlgProc, hInst);
i = DialogBoxParam (hInst, IDD_SAVEAS, hwnd, lpfn, MAKELONG (hwnd, 0));
FreeProcInstance (lpfn);
if (!i)
SetWindowWord (hwnd, GWW_UNTITLED, 0);
return !i;
}


  3 Responses to “Category : Windows 3.X Files
Archive   : MULTIPAD.ZIP
Filename : MPFILE.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/