home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
dos2ib.zip
/
dos2ibm.c
next >
Wrap
Text File
|
1993-11-01
|
21KB
|
665 lines
#define INCL_PM
#define INCL_DOS
#include <os2.h>
#include <stdio.h>
#include <memory.h>
#include <stddef.h>
#include <errno.h>
#include <malloc.h>
#include <string.h>
#include <process.h>
#include "dos2pm.h"
#define DEFAULT_VIEW ID_VIEW_TREE
#define FINDBUFF_ENTRIES 10
#define CNRREC_SIZE (sizeof(CNRREC)-sizeof(MINIRECORDCORE))
typedef struct _CNRREC
{
MINIRECORDCORE mrc;
char szFileName[CCHMAXPATH];
ULONG ulSize;
CDATE Date;
CTIME Time;
ULONG ulAttr;
}CNRREC;
typedef struct _GLOBALDATA
{
HAB hab;
HMQ hmq;
HWND hFrame, hClient, hMenu, hContainer;
RECTL rclUpdate;
char *pszText[MAXLINES];
short sLineCount, sCharHeight, sTopLine;
char szFileName[CCHMAXPATH];
short sCloseFile;
char szCurrDir[CCHMAXPATH];
USHORT usView;
}GLOBALDATA;
int main(int, char **);
static HWND CreateWindow(GLOBALDATA *);
static MRESULT EXPENTRY ClientWndProc(HWND, ULONG, MPARAM, MPARAM);
static MRESULT ClientWndInit(HWND, GLOBALDATA *);
static void FileOpen(HWND, GLOBALDATA *, char *);
static void FileClose(HWND, GLOBALDATA *);
static void ReadFileThread(void *);
static void FillContainerThread(void *);
static void CalcLinePosition(HWND, GLOBALDATA *, short, RECTL *);
static HWND CreateContainer(HWND, GLOBALDATA *);
static ULONG FillContainer(HWND, CNRREC *, char *);
static void SetView(HWND, GLOBALDATA *, USHORT);
static HWND CreateWindow(GLOBALDATA *pGlobalData)
{
FRAMECDATA fcdata;
HWND hFrame, hClient;
SWP swp;
WinQueryTaskSizePos(pGlobalData->hab, 0 ,&swp);
memset(&fcdata, 0, sizeof(fcdata));
fcdata.cb = sizeof(fcdata);
fcdata.idResources = ID_FRAME;
fcdata.flCreateFlags=FCF_SIZEBORDER | FCF_SYSMENU | FCF_MENU | FCF_MINMAX | FCF_TITLEBAR | FCF_TASKLIST;
hFrame = WinCreateWindow(HWND_DESKTOP, WC_FRAME, NULL, FS_TASKLIST | FS_SIZEBORDER,
0, 0, 0, 0, HWND_DESKTOP, HWND_TOP, ID_FRAME, &fcdata, NULL);
pGlobalData->hFrame = hFrame;
pGlobalData->hMenu = WinWindowFromID(hFrame, FID_MENU);
hClient=WinCreateWindow(hFrame, CLASSNAME, NULL, 0, 0, 0, 0, 0, hFrame, HWND_BOTTOM, FID_CLIENT, pGlobalData, NULL);
pGlobalData->hClient = hClient;
WinSetWindowPos(hFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy, SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER);
return (hFrame);
}
static MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
int i;
short sError;
char *psz, szErrBuff[128];
GLOBALDATA *pGlobalData;
HPS hps;
RECTL rcl, rclText;
MRESULT mr;
USHORT id;
CNRREC *pcr;
CNRINFO cnri;
NOTIFYRECORDENTER *pnre;
switch (msg) {
case WM_CREATE:
pGlobalData = (GLOBALDATA *)PVOIDFROMMP(mp1);
return (ClientWndInit(hwnd, pGlobalData));
case WM_CLOSE:
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
mr=WinSendMsg(WinWindowFromID(pGlobalData->hFrame, FID_MENU), MM_QUERYITEMATTR,
MPFROM2SHORT(ID_FILE_CLOSE, TRUE), MPFROMSHORT(MIA_DISABLED));
if (LONGFROMMR(mr) != MIA_DISABLED) {
if (WinMessageBox(HWND_DESKTOP, hwnd, "Close file and exit?", "File is open", 0, MB_YESNO | MB_ICONQUESTION) == MBID_YES) {
FileClose(hwnd, pGlobalData);
} else {
return (MRFROMSHORT(0));
} /* endif (WinMessageBox(... */
} /* endif (LONGFROMMR(mr) != MIA_DISABLED) */
WinPostMsg(hwnd, WM_QUIT, 0l, 0l);
return (MRFROMSHORT(0));
case WM_PAINT:
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
hps = WinBeginPaint(hwnd, NULLHANDLE, &rcl);
WinFillRect(hps, &rcl, SYSCLR_WINDOW);
CalcLinePosition(hwnd, pGlobalData, pGlobalData->sTopLine, &rclText);
for (i=pGlobalData->sTopLine; i<pGlobalData->sLineCount; i++) {
WinDrawText(hps, -1, pGlobalData->pszText[i], &rclText, SYSCLR_WINDOWTEXT, SYSCLR_WINDOW, DT_LEFT);
rclText.yBottom -= pGlobalData->sCharHeight;
rclText.yTop -= pGlobalData->sCharHeight;
} /* endfor (i=pGlobalData->sTopLine; i<pGlobalData->sLineCount; i++) */
pGlobalData->rclUpdate = rclText;
pGlobalData->rclUpdate.yTop = pGlobalData->sCharHeight;
pGlobalData->rclUpdate.yBottom = 0;
WinEndPaint(hps);
return (MRFROMSHORT(0));
case WM_SIZE:
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
if (pGlobalData->hContainer)
WinSetWindowPos(pGlobalData->hContainer, NULLHANDLE, 0, 0, SHORT1FROMMP(mp2), SHORT2FROMMP(mp2), SWP_MOVE | SWP_SIZE);
break;
case UM_LINEOFTEXT:
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
if (pGlobalData->sLineCount < MAXLINES) {
pGlobalData->sLineCount++;
} else {
free(pGlobalData->pszText[0]);
for ( i=0; i<pGlobalData->sLineCount-1 ; i++) {
pGlobalData->pszText[i]=pGlobalData->pszText[i+1];
} /* endfor */
} /* endif */
pGlobalData->pszText[pGlobalData->sLineCount-1]=(char *)PVOIDFROMMP(mp1);
CalcLinePosition(hwnd, pGlobalData, pGlobalData->sLineCount-1, &rclText);
if (rclText.yBottom <= 0) {
if (pGlobalData->sLineCount < MAXLINES) {
pGlobalData->sTopLine++;
} /* endif */
WinScrollWindow(hwnd, 0, pGlobalData->sCharHeight, NULL, NULL, NULLHANDLE, NULL, 0);
pGlobalData->rclUpdate.yTop += pGlobalData->sCharHeight;
} else {
pGlobalData->rclUpdate = rclText;
} /* endif */
WinInvalidateRect(hwnd, &pGlobalData->rclUpdate, FALSE);
return (MRFROMSHORT(0));
case UM_ENDOFFILE:
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
sError = SHORT1FROMMP(mp1);
if (sError) {
sprintf(szErrBuff, "Error %d accessing %s.", sError, pGlobalData->szFileName);
WinMessageBox(HWND_DESKTOP, hwnd, szErrBuff, "ERROR!", 0, MB_OK | MB_ICONEXCLAMATION);
FileClose(hwnd, pGlobalData);
} /* endif */
return (MRFROMSHORT(0));
case UM_CNRFILLDONE:
if (mp1) {
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
SetView(pGlobalData->hContainer, pGlobalData, DEFAULT_VIEW);
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_VIEW, TRUE),MPFROM2SHORT(MIA_DISABLED, FALSE));
WinShowWindow(pGlobalData->hContainer, TRUE);
WinSetFocus(HWND_DESKTOP, pGlobalData->hContainer);
} /* endif */
return (MRFROMSHORT(0));
case WM_CONTROL:
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
switch (SHORT1FROMMP(mp1)) {
case ID_CONTAINER:
switch (SHORT2FROMMP(mp1)) {
case CN_ENTER:
pnre = (NOTIFYRECORDENTER *)PVOIDFROMMP(mp2);
pcr = (CNRREC *)pnre->pRecord;
if (!(pcr->ulAttr & FILE_DIRECTORY)) {
FileOpen(hwnd, pGlobalData, pcr->szFileName);
WinDestroyWindow(pGlobalData->hContainer);
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_VIEW,TRUE),MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
pGlobalData->hContainer=NULLHANDLE;
} /* endif */
break;
default:
break;
} /* endswitch (SHORT2FROMMP(mp1)) */
break;
default:
break;
} /* endswitch (SHORT1FROMMP(mp1)) */
break;
case WM_COMMAND:
pGlobalData = (GLOBALDATA *)WinQueryWindowPtr(hwnd, 0);
switch ((id = SHORT1FROMMP(mp1))) {
case ID_FILE_OPEN:
FileOpen(hwnd, pGlobalData, NULL);
break;
case ID_FILE_CLOSE:
FileClose(hwnd, pGlobalData);
break;
case ID_FILE_EXIT:
WinPostMsg(hwnd, WM_CLOSE, 0l, 0l);
break;
case ID_VIEW_TREE:
case ID_VIEW_DETAILS:
case ID_VIEW_ICON:
case ID_VIEW_NAME:
case ID_VIEW_TEXT:
SetView(pGlobalData->hContainer, pGlobalData, id);
break;
} /* endswitch ((id = SHORT1FROMMP(mp1))) */
return (MRFROMSHORT(0));
default:
break;
} /* endswitch */
return (WinDefWindowProc(hwnd, msg, mp1, mp2));
}
static MRESULT ClientWndInit(HWND hwnd, GLOBALDATA *pGlobalData)
{
FONTMETRICS fm;
WinSetWindowPtr(hwnd, 0, (void *)pGlobalData);
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_FILE_OPEN, TRUE), MPFROM2SHORT(MIA_DISABLED, FALSE));
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_FILE_CLOSE, TRUE), MPFROM2SHORT(MIA_DISABLED, FALSE));
GpiQueryFontMetrics(WinGetPS(hwnd), sizeof(fm), &fm);
pGlobalData->sCharHeight = (short)fm.lMaxBaselineExt;
pGlobalData->sTopLine=0;
pGlobalData->sLineCount=0;
memset(&pGlobalData->rclUpdate, 0, sizeof(pGlobalData->rclUpdate));
return (MRFROMSHORT(FALSE));
}
static HWND CreateContainer(HWND hwnd, GLOBALDATA *pGlobalData)
{
HWND hContainer;
FIELDINFO *pfi, *pfiRoot;
FIELDINFOINSERT fii;
CNRINFO cnri;
SWP swp;
ULONG ulLength;
WinQueryWindowPos(hwnd, &swp);
hContainer = WinCreateWindow(hwnd, WC_CONTAINER, NULL, CCS_MINIRECORDCORE, 0, 0, swp.cx, swp.cy, hwnd, HWND_TOP, ID_CONTAINER, NULL, NULL);
if (!hContainer) {
return (NULLHANDLE);
} /* endif */
pfi = WinSendMsg(hContainer, CM_ALLOCDETAILFIELDINFO, MPFROMLONG(5), NULL);
pfiRoot = pfi;
/* Icon column field */
pfi->pTitleData = "Icon";
pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
pfi->flData = CFA_BITMAPORICON | CFA_CENTER | CFA_HORZSEPARATOR | CFA_SEPARATOR | CFA_FITITLEREADONLY;
pfi->offStruct = FIELDOFFSET(CNRREC, mrc.hptrIcon);
/* File column Field */
pfi = pfi->pNextFieldInfo;
pfi->pTitleData = "File Name";
pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
pfi->flData = CFA_STRING | CFA_LEFT | CFA_HORZSEPARATOR;
pfi->offStruct = FIELDOFFSET(CNRREC, mrc.pszIcon);
memset(&cnri, 0, sizeof(cnri));
cnri.cb = sizeof(cnri);
cnri.pFieldInfoLast = pfi;
cnri.xVertSplitbar = 220;
/* file size column */
pfi = pfi->pNextFieldInfo;
pfi->pTitleData = "Size";
pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
pfi->flData = CFA_ULONG | CFA_RIGHT | CFA_HORZSEPARATOR | CFA_SEPARATOR;
pfi->offStruct = FIELDOFFSET(CNRREC, ulSize);
/* file date column */
pfi = pfi->pNextFieldInfo;
pfi->pTitleData = "Date";
pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
pfi->flData = CFA_DATE | CFA_LEFT | CFA_HORZSEPARATOR | CFA_SEPARATOR;
pfi->offStruct = FIELDOFFSET(CNRREC, Date);
/* file time column */
pfi = pfi->pNextFieldInfo;
pfi->pTitleData = "Time";
pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
pfi->flData = CFA_TIME | CFA_LEFT | CFA_HORZSEPARATOR;
pfi->offStruct = FIELDOFFSET(CNRREC, Time);
memset(&fii, 0, sizeof(fii));
fii.cb = sizeof(fii);
fii.pFieldInfoOrder = (FIELDINFO *)CMA_FIRST;
fii.cFieldInfoInsert = 5;
fii.fInvalidateFieldInfo = TRUE;
WinSendMsg(hContainer, CM_INSERTDETAILFIELDINFO, MPFROMP(pfiRoot), MPFROMP(&fii));
WinSendMsg(hContainer, CM_SETCNRINFO, MPFROMP(&cnri), MPFROMLONG(CMA_PFIELDINFOLAST | CMA_XVERTSPLITBAR));
ulLength = sizeof(pGlobalData->szCurrDir) - 1;
pGlobalData->szCurrDir[0] = '\\';
DosQCurDir(0, &pGlobalData->szCurrDir[1], &ulLength);
#ifdef __IBMC__
if (_beginthread(FillContainerThread, NULL, 4000, pGlobalData) == -1) {
#endif
#ifdef __BORLANDC__
if (_beginthread(FillContainerThread, 4000, pGlobalData) == -1) {
#endif
WinMessageBox(HWND_DESKTOP, hwnd, "Can't start container fill thread.", "ERROR!", 0, MB_OK | MB_ICONEXCLAMATION);
WinDestroyWindow(hContainer);
hContainer = NULLHANDLE;
} /* endif */
return (hContainer);
}
static void FillContainerThread(void *pv)
{
GLOBALDATA *pGlobalData;
HAB hab;
HMQ hmq;
ULONG ulFileCount;
pGlobalData = (GLOBALDATA *)pv;
ulFileCount = 0;
if ((hab=WinInitialize(0))) {
if ((hmq = WinCreateMsgQueue(hab, 0))) {
ulFileCount = FillContainer(pGlobalData->hContainer, NULL, pGlobalData->szCurrDir);
WinDestroyMsgQueue(hmq);
} /* endif */
WinTerminate(hab);
} /* endif */
WinPostMsg(pGlobalData->hClient, UM_CNRFILLDONE, MPFROMLONG(ulFileCount), 0);
_endthread();
}
static ULONG FillContainer(HWND hwnd, CNRREC *pcrRoot, char *pszDir)
{
ULONG i, ulMaxFiles, ulFindBuffSize, ulFileCount;
long rc;
HDIR hdir;
char *pszFileSpec, *pszFullName;
CNRREC *pcr, *pcrFirst;
FILEFINDBUF3 *pffb, *pffbFirst;
RECORDINSERT ri;
HPOINTER hptr;
ulFileCount = 0;
ulFindBuffSize = sizeof(*pffb) * FINDBUFF_ENTRIES;
if (!(pffbFirst = malloc(ulFindBuffSize))) {
return (0);
} /* endif */
if (!(pszFileSpec = malloc(CCHMAXPATH * 2))) {
free(pffbFirst);
return(0);
} /* endif */
pszFullName = pszFileSpec + CCHMAXPATH;
strcpy(pszFileSpec, pszDir);
strcat(pszFileSpec, "\\*.*");
hdir = HDIR_CREATE;
ulMaxFiles = FINDBUFF_ENTRIES;
rc = DosFindFirst(pszFileSpec, &hdir, FILE_NORMAL | FILE_DIRECTORY, pffbFirst, ulFindBuffSize, &ulMaxFiles, FIL_STANDARD);
while (!rc) {
pcrFirst = WinSendMsg(hwnd, CM_ALLOCRECORD, MPFROMLONG(CNRREC_SIZE), MPFROMLONG(ulMaxFiles));
if (!pcrFirst) {
break;
} /* endif */
for (i=0, pcr=pcrFirst, pffb=pffbFirst; i<ulMaxFiles; i++) {
strcpy(pszFullName, pszDir);
strcat(pszFullName, "\\");
strcat(pszFullName, pffb->achName);
if (!(hptr = WinLoadFileIcon(pszFullName, FALSE))) {
hptr = WinQuerySysPointer(HWND_DESKTOP, SPTR_ICONERROR, FALSE);
} /* endif */
strcpy(pcr->szFileName, pszFullName);
pcr->Date.day = pffb->fdateLastWrite.day;
pcr->Date.month = pffb->fdateLastWrite.month;
pcr->Date.year = pffb->fdateLastWrite.year;
pcr->Time.seconds = pffb->ftimeLastWrite.twosecs;
pcr->Time.minutes = pffb->ftimeLastWrite.minutes;
pcr->Time.hours = pffb->ftimeLastWrite.hours;
pcr->ulSize = pffb->cbFile;
pcr->ulAttr = pffb->attrFile;
pcr->mrc.pszIcon = strrchr(pcr->szFileName, '\\') + 1;
pcr->mrc.hptrIcon = hptr;
#ifdef __IBMC__
(pffb) += pffb->oNextEntryOffset;
#endif
#ifdef __BORLANDC__
((char *)pffb) += pffb->oNextEntryOffset;
#endif
pcr = (CNRREC *)pcr->mrc.preccNextRecord;
} /* endfor */
memset(&ri, 0, sizeof(ri));
ri.cb = sizeof(ri);
ri.pRecordOrder = (PRECORDCORE)CMA_END;
ri.pRecordParent = (PRECORDCORE)pcrRoot;
ri.zOrder = (USHORT)CMA_TOP;
ri.cRecordsInsert = ulMaxFiles;
ri.fInvalidateRecord = TRUE;
if (WinSendMsg(hwnd, CM_INSERTRECORD, MPFROMP(pcrFirst), MPFROMP(&ri))) {
ulFileCount += ulMaxFiles;
} /* endif */
for (i=0, pcr=pcrFirst, pffb=pffbFirst; i<ulMaxFiles; i++) {
if ((pffb->attrFile & FILE_DIRECTORY) && strcmp(pffb->achName, ".") && strcmp(pffb->achName, "..")) {
strcpy(pszFullName, pszDir);
strcat(pszFullName, "\\");
strcat(pszFullName, pffb->achName);
ulFileCount += FillContainer(hwnd, pcr, pszFullName);
} /* endif */
#ifdef __IBMC__
(pffb) += pffb->oNextEntryOffset;
#endif
#ifdef __BORLANDC__
((char *)pffb) += pffb->oNextEntryOffset;
#endif
pcr = (CNRREC *)pcr->mrc.preccNextRecord;
} /* endfor */
ulMaxFiles = FINDBUFF_ENTRIES;
rc = DosFindNext(hdir, pffbFirst, ulFindBuffSize, &ulMaxFiles);
} /* endwhile */
DosFindClose(hdir);
free(pffbFirst);
free(pszFileSpec);
return (ulFileCount);
}
static void SetView(HWND hwnd, GLOBALDATA *pGlobalData, USHORT usView)
{
CNRINFO cnri;
memset(&cnri, 0, sizeof(cnri));
cnri.cb = sizeof(cnri);
cnri.flWindowAttr = CA_CONTAINERTITLE | CA_TITLESEPARATOR;
cnri.pszCnrTitle = pGlobalData->szCurrDir;
switch (usView) {
case ID_VIEW_TREE:
cnri.flWindowAttr |= CV_TREE | CV_ICON | CA_TREELINE;
break;
case ID_VIEW_ICON:
cnri.flWindowAttr |= CV_ICON | CV_FLOW;
break;
case ID_VIEW_NAME:
cnri.flWindowAttr |= CV_NAME | CV_FLOW;
break;
case ID_VIEW_DETAILS:
cnri.flWindowAttr |= CV_DETAIL | CA_DETAILSVIEWTITLES;
break;
case ID_VIEW_TEXT:
cnri.flWindowAttr |= CV_TEXT | CV_FLOW;
break;
} /* endswitch */
if (WinSendMsg(hwnd, CM_SETCNRINFO, MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR | CMA_CNRTITLE))) {
if (cnri.flWindowAttr & CV_ICON) {
WinSendMsg(hwnd, CM_ARRANGE, NULL,NULL);
} /* endif */
if (pGlobalData->usView) {
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(pGlobalData->usView, TRUE), MPFROM2SHORT(MIA_CHECKED, FALSE));
} /* endif */
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(usView, TRUE), MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
pGlobalData->usView = usView;
} /* endif */
return;
}
static void FileOpen (HWND hwnd, GLOBALDATA *pGlobalData, char *pszFileName)
{
if (!pszFileName) {
pGlobalData->hContainer = CreateContainer(hwnd, pGlobalData);
return;
} /* endif */
strcpy(pGlobalData->szFileName, pszFileName);
pGlobalData->sCloseFile=FALSE;
#ifdef __IBMC__
if (_beginthread(ReadFileThread, NULL, 4000, pGlobalData) == -1) {
#endif
#ifdef __BORLANDC__
if (_beginthread(ReadFileThread, 4000, pGlobalData) == -1) {
#endif
WinMessageBox(HWND_DESKTOP, hwnd, "Can't start file input thread.", "ERROR!", 0 , MB_OK | MB_ICONEXCLAMATION);
return;
} /* endif */
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_FILE_OPEN, TRUE), MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_FILE_CLOSE, TRUE), MPFROM2SHORT(MIA_DISABLED, FALSE));
return;
}
static void FileClose(HWND hwnd, GLOBALDATA *pGlobalData)
{
int i;
pGlobalData->sCloseFile = TRUE;
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_FILE_OPEN, TRUE), MPFROM2SHORT(MIA_DISABLED, FALSE));
WinSendMsg(pGlobalData->hMenu, MM_SETITEMATTR, MPFROM2SHORT(ID_FILE_CLOSE, TRUE), MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
for (i=0; i < pGlobalData->sLineCount; i++) {
free(pGlobalData->pszText[i]);
} /* endfor */
pGlobalData->sTopLine=0;
pGlobalData->sLineCount=0;
memset(&pGlobalData->rclUpdate, 0, sizeof(pGlobalData->rclUpdate));
WinInvalidateRect(hwnd, NULL, FALSE);
return;
}
static void CalcLinePosition(HWND hwnd, GLOBALDATA *pGlobalData, short sLineIndex, RECTL *prcl)
{
WinQueryWindowRect(hwnd, prcl);
prcl->yTop -= (sLineIndex - pGlobalData->sTopLine) * pGlobalData->sCharHeight;
prcl->yBottom = prcl->yTop - pGlobalData->sCharHeight;
return;
}
static void ReadFileThread(void *pv)
{
GLOBALDATA *pGlobalData;
FILE *fp;
char *psz, szBuff[256];
pGlobalData = (GLOBALDATA *)pv;
if (!(fp = fopen(pGlobalData->szFileName, "r"))) {
WinPostMsg(pGlobalData->hClient, UM_ENDOFFILE, MPFROMSHORT(errno), 0);
_endthread();
} /* endif */
while (fgets(szBuff, sizeof(szBuff), fp)) {
if (pGlobalData->sCloseFile) {
break;
} /* endif */
if ((psz = strchr(szBuff, '\n'))) {
*psz = '\0';
} /* endif */
psz = malloc(strlen(szBuff)+1);
strcpy(psz, szBuff);
WinPostMsg(pGlobalData->hClient, UM_LINEOFTEXT, MPFROMP(psz), 0);
DosSleep(0);
} /* endwhile */
fclose(fp);
WinPostMsg(pGlobalData->hClient, UM_ENDOFFILE, MPFROMSHORT(errno), 0);
_endthread();
}
int main(int argc, char **argv)
{
QMSG qmsg;
GLOBALDATA GlobalData;
memset(&GlobalData, 0 , sizeof(GlobalData));
GlobalData.hab = WinInitialize(0);
GlobalData.hmq = WinCreateMsgQueue(GlobalData.hab, 0);
if (WinRegisterClass(GlobalData.hab, CLASSNAME, ClientWndProc, CS_SIZEREDRAW, sizeof(GLOBALDATA *))){
if (CreateWindow(&GlobalData)) {
while (WinGetMsg(GlobalData.hab, &qmsg, NULLHANDLE, 0 , 0)) {
WinDispatchMsg(GlobalData.hab, &qmsg);
} /* endwhile */
} /* endif */
} /* endif */
WinDestroyMsgQueue(GlobalData.hmq);
WinTerminate(GlobalData.hab);
return(0);
}