|
|
1.1 ! root 1: /*==============================================================*\ ! 2: * img_util.c - Utility routines for the IMAGE sample ! 3: * ! 4: * Created 1989, 1990 IBM, Microsoft Corp. ! 5: *--------------------------------------------------------------* ! 6: * ! 7: * This module contains the code for allocating/freeing memory ! 8: * for the image data, and for image file-related options ! 9: * ! 10: *--------------------------------------------------------------* ! 11: * ! 12: * This source file contains the following functions: ! 13: * ! 14: * UtilMemoryAllocate() ! 15: * UtilMemoryFree() ! 16: * UtilFindFileSize() ! 17: * UtilGetFileHandle() ! 18: * UtilUpdateTitleText() ! 19: * ! 20: \*==============================================================*/ ! 21: ! 22: /*--------------------------------------------------------------*\ ! 23: * Include files, macros, defined constants, and externs * ! 24: \*--------------------------------------------------------------*/ ! 25: ! 26: #define INCL_DOSERRORS ! 27: #define INCL_WINFRAMEMGR ! 28: #define INCL_WINSWITCHLIST ! 29: #include <os2.h> ! 30: #include <string.h> ! 31: #include "img_main.h" ! 32: #include "img_xtrn.h" ! 33: ! 34: #ifdef PORT_S116 ! 35: LONG FAR pascal UtilFindFileSize(PSZ pszFilename); ! 36: BOOL FAR pascal UtilMemoryAllocate(USHORT cbSize, PBYTE FAR *ppByte); ! 37: BOOL FAR pascal UtilGetFileHandle(PSZ pszFilename, PHFILE phfile); ! 38: VOID FAR pascal UtilUpdateTitleText(HAB hab, HWND hwnd, PSZ pszFullFile); ! 39: VOID FAR pascal UtilMemoryFree(SEL sel); ! 40: #endif ! 41: /****************************************************************\ ! 42: * Allocate memory routine * ! 43: *--------------------------------------------------------------* ! 44: * * ! 45: * Name: UtilMemoryAllocate(usBufSiz, ppByte) * ! 46: * * ! 47: * Purpose: To allocate memory for the image * ! 48: * * ! 49: * Usage: Routine is called whenever memory needs to be * ! 50: * allocated to store a new image. * ! 51: * * ! 52: * Method: * ! 53: * * ! 54: * Returns: * ! 55: * TRUE - if memory successfully allocated * ! 56: * FALSE - if failed to allocate memory * ! 57: \****************************************************************/ ! 58: #if (defined(PORT_16) || defined(PORT_32)) ! 59: BOOL UtilMemoryAllocate(usBufSiz, ppByte) ! 60: #else ! 61: BOOL FAR pascal UtilMemoryAllocate(usBufSiz, ppByte) ! 62: #endif ! 63: USHORT usBufSiz; ! 64: PBYTE FAR *ppByte; ! 65: { ! 66: #if (defined(PORT_16) || defined(PORT_S116)) ! 67: SEL sel; ! 68: ! 69: if (DosAllocSeg(usBufSiz, &sel, SEG_NONSHARED) == NO_ERROR) { ! 70: *ppByte = (BYTE *)MAKEP(sel, 0); ! 71: return TRUE; ! 72: } else ! 73: return FALSE; ! 74: #else ! 75: ! 76: return DosAllocMem(ppByte, ! 77: usBufSiz, ! 78: PAG_READ | PAG_WRITE | PAG_COMMIT) == NO_ERROR; ! 79: #endif ! 80: ! 81: } /* UtilMemoryAllocate() */ ! 82: ! 83: /****************************************************************\ ! 84: * Free up allocated memory ! 85: *-------------------------------------------------------------- ! 86: * ! 87: * Name: UtilMemoryFree() ! 88: * ! 89: * Purpose: Releases the memory held for the image ! 90: * ! 91: * Usage: called at cleanup time during the processing of the ! 92: * WM_DESTROY message & during loading of new image ! 93: * ! 94: * Method: ! 95: * ! 96: * Returns: ! 97: * ! 98: \****************************************************************/ ! 99: ! 100: #ifdef PORT_32 ! 101: VOID UtilMemoryFree(pByte) ! 102: PBYTE pByte; ! 103: { ! 104: DosFreeMem(pByte); ! 105: ! 106: } /* UtilMemoryFree() */ ! 107: #else ! 108: #ifdef PORT_16 ! 109: VOID UtilMemoryFree(sel) ! 110: #else ! 111: VOID FAR pascal UtilMemoryFree(sel) ! 112: #endif ! 113: SEL sel; ! 114: { ! 115: DosFreeSeg(sel); ! 116: ! 117: } /* UtilMemoryFree() */ ! 118: #endif ! 119: ! 120: /****************************************************************\ ! 121: * Find File Size ! 122: *-------------------------------------------------------------- ! 123: * ! 124: * Name: UtilFindFileSize() ! 125: * ! 126: * Purpose: To find the size of the file passed in ! 127: * ! 128: * Usage: Called to determine the size of the image in order ! 129: * to allocate sufficient storage for it ! 130: * ! 131: * Method: filesize = min(0xFFFF, filesize) ! 132: * ! 133: * Returns: ! 134: * ! 135: \****************************************************************/ ! 136: #if (defined(PORT_16) || defined(PORT_32)) ! 137: LONG UtilFindFileSize(pszFilename) ! 138: #else ! 139: LONG FAR pascal UtilFindFileSize(pszFilename) ! 140: #endif ! 141: PSZ pszFilename; ! 142: { ! 143: FILEFINDBUF ffb; /* DOS file-search results buffer */ ! 144: HDIR hdir = 0xffff; /* allocate a handle to caller */ ! 145: #if (defined(PORT_16) || defined(PORT_S116)) ! 146: USHORT usAttrib = 0; ! 147: USHORT cSearch = 1; ! 148: if (DosFindFirst(pszFilename, /* filename from Open Dialog */ ! 149: &hdir, ! 150: usAttrib, ! 151: &ffb, ! 152: (USHORT)(sizeof(ffb) * cSearch), ! 153: &cSearch, ! 154: 0L) == NO_ERROR) /* reserved must be NULL */ ! 155: #else ! 156: ULONG ulAttrib = 0; ! 157: ULONG cSearch = 1; ! 158: if (DosFindFirst(pszFilename, /* filename from Open Dialog */ ! 159: &hdir, ! 160: ulAttrib, ! 161: &ffb, ! 162: (USHORT)(sizeof(ffb) * cSearch), ! 163: &cSearch, ! 164: 1L) == NO_ERROR) /* no of files to locate */ ! 165: #endif ! 166: /* ! 167: * Obtain the size of the image. The amount of storage ! 168: * required depends on the size of the image, which is ! 169: * recorded in the image-file header. ! 170: * If the image is greater than 64KB, then only the first 64KB of ! 171: * image data is loaded. ! 172: */ ! 173: return (ffb.cbFile > 0xFFFFL) ? 0xFFFFL : ffb.cbFile; ! 174: else ! 175: return 0L; ! 176: ! 177: } /* UtilFindFileSize() */ ! 178: ! 179: /****************************************************************\ ! 180: * Get File Handle ! 181: *-------------------------------------------------------------- ! 182: * ! 183: * Name: UtilGetFileHandle(pszFilename, phfile) ! 184: * ! 185: * Purpose: To open the file passed in and return the file handle ! 186: * ! 187: * Usage: Called in order the read in the image data from a file ! 188: * so that it can be displayed ! 189: * ! 190: * Method: ! 191: * ! 192: * Returns: ! 193: * ! 194: \****************************************************************/ ! 195: #if (defined(PORT_16) || defined(PORT_32)) ! 196: BOOL UtilGetFileHandle(pszFilename, phfile) ! 197: #else ! 198: BOOL FAR pascal UtilGetFileHandle(pszFilename, phfile) ! 199: #endif ! 200: PSZ pszFilename; ! 201: PHFILE phfile; ! 202: { ! 203: #if (defined(PORT_16) || defined(PORT_S116)) ! 204: USHORT usAction; ! 205: return DosOpen(pszFilename, /* filename from open dialog */ ! 206: phfile, /* file handle returned */ ! 207: (PUSHORT)&usAction, ! 208: 0L, ! 209: FILE_NORMAL, ! 210: FILE_OPEN, ! 211: OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, ! 212: 0L) == NO_ERROR; /* must be zero */ ! 213: #else ! 214: ULONG ulAction; ! 215: return DosOpen(pszFilename, /* filename from open dialog */ ! 216: phfile, /* file handle returned */ ! 217: (PULONG)&ulAction, ! 218: 0L, ! 219: FILE_NORMAL, ! 220: FILE_OPEN, ! 221: OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, ! 222: 0L) == NO_ERROR; /* must be zero */ ! 223: #endif ! 224: ! 225: } /* UtilGetFileHandle() */ ! 226: ! 227: /****************************************************************\ ! 228: * Appends the app name to the title bar text ! 229: *-------------------------------------------------------------- ! 230: * ! 231: * Name: UtilUpdateTitleText(hab, hwnd, pszFullFile) ! 232: * ! 233: * Purpose: Updates the text in the main window's title bar to ! 234: * display the app name, followed by the separator, ! 235: * followed by the file name ! 236: * ! 237: * Usage: called at init time and when the text file is changed ! 238: * ! 239: * Method: gets the program name, appends the separator, and ! 240: * appends the file name. ! 241: * ! 242: * Returns: ! 243: * ! 244: \****************************************************************/ ! 245: #if (defined(PORT_16) || defined(PORT_32)) ! 246: VOID UtilUpdateTitleText(hab, hwnd, pszFullFile) ! 247: #else ! 248: VOID FAR pascal UtilUpdateTitleText(hab, hwnd, pszFullFile) ! 249: #endif ! 250: HAB hab; ! 251: HWND hwnd; ! 252: PSZ pszFullFile; ! 253: { ! 254: CHAR szBuf[MAXNAMEL]; ! 255: CHAR szSeparator[TITLESEPARATORLEN+1]; ! 256: CHAR szUntitled[MESSAGELEN]; ! 257: PSZ pszFileName; ! 258: #ifdef PORT_S116 ! 259: PCHAR pch; ! 260: USHORT cch; ! 261: #endif ! 262: ! 263: /* get current task title */ ! 264: WinQueryTaskTitle(NULL, szBuf, MAXNAMEL); /* szBuf = IMAGE.EXE */ ! 265: ! 266: WinLoadString(hab, NULL, IDS_TITLEBARSEPARATOR, ! 267: TITLESEPARATORLEN, szSeparator); ! 268: ! 269: strcat(szBuf, szSeparator); /* szBuf = IMAGE.EXE - */ ! 270: /* ! 271: * ??? ADG comment here ??? ! 272: */ ! 273: #if (defined(PORT_16) || defined(PORT_32)) ! 274: /* ! 275: * if filename is valid it will be F.Q so search for ! 276: * final backslash, otherwise use the Untitled string. ! 277: */ ! 278: if (pszFileName = strrchr(pszFullFile, '\\')) ! 279: pszFileName++; ! 280: #else ! 281: /* set pointer to end of string and count characters in string */ ! 282: pch = pszFullFile; ! 283: cch = 0; ! 284: while (*pch++) ! 285: cch++; ! 286: ! 287: /* must cater for the null string in this test */ ! 288: if (cch > 0) ! 289: pch--; ! 290: ! 291: /* search for final backslash in F.Q name if it exists */ ! 292: while (*--pch && *pch != '\\' && cch-- >= 0); ! 293: ! 294: /* ! 295: * if filename is valid (ie '\' is found in F.Q name, ! 296: * then use filename, otherwise use the Untitled string. ! 297: */ ! 298: if (*pch == '\\') ! 299: pszFileName = ++pch; ! 300: #endif ! 301: else { ! 302: /* load "untitled" string */ ! 303: WinLoadString(hab, NULL, IDS_UNTITLED, MESSAGELEN, szUntitled); ! 304: pszFileName = (PSZ)szUntitled; ! 305: } ! 306: strcat(szBuf, pszFileName); /* szBuf = IMAGE.EXE - IMAGE.IMG */ ! 307: WinSetWindowText(WinWindowFromID(hwnd, FID_TITLEBAR), szBuf); ! 308: ! 309: } /* UtilUpdateTitleText() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.