|
|
1.1 root 1: /*
2: FILE1.C -- Dialog Directory Listbox and Open File functions
3: Created by Microsoft Corporation, 1989
4: */
5:
6: #define INCL_DOS
7: #include "tool.h"
8:
9: /****************************************************************************\
10: * This function builds a directory list in a list box.
11: \****************************************************************************/
12:
13: int FAR PASCAL DlgDirList(hwnd, lpszPath, idDirList, idFileList,
14: idStaticPath, attr)
15: HWND hwnd;
16: PSZ lpszPath;
17: int idDirList;
18: int idFileList;
19: int idStaticPath;
20: USHORT attr;
21: {
22: CHAR szPath[MAX_FNAME_LEN];
23: CHAR chTmp;
24: PSZ lpszFile, lpszNull;
25: HPOINTER hPointer;
26:
27: /* ensure path is legal and expand to full search path */
28: if (!DlgParseFile(lpszPath, (PSZ)szPath, FALSE, TRUE))
29: return FALSE;
30:
31: /* set pointer to hours glass */
32: hPointer = WinQueryPointer(HWND_DESKTOP);
33: WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE));
34:
35: /* set current drive */
36: DosSelectDisk(*szPath - 'A' + 1);
37:
38: /* temporarily put zero after directory spec and set current directory */
39: lpszFile = FileInPath((PSZ)szPath);
40: lpszNull = lpszFile;
41: if (lpszNull > (PSZ)szPath + 3)
42: lpszNull--;
43: chTmp = *lpszNull;
44: *lpszNull = '\0';
45: DosChDir((PSZ)szPath, 0l);
46: if (idStaticPath)
47: WinSetWindowText(WinWindowFromID(hwnd, idStaticPath),
48: DlgFitPathToBox(hwnd, idStaticPath, (PSZ)szPath));
49: *lpszNull = chTmp;
50:
51: /* fill list box with file names */
52: if (idDirList && idFileList)
53: {
54: /* fill them up with new entries */
55: DlgFillListBoxes(hwnd, idDirList, idFileList, attr, lpszFile);
56: }
57:
58: /* reset pointer to previous figure */
59: WinSetPointer(HWND_DESKTOP, hPointer);
60:
61: return TRUE;
62: }
63:
64:
65:
66:
67: /****************************************************************************\
68: * This function gets the file name selected by the user.
69: \****************************************************************************/
70:
71: int FAR PASCAL DlgDirSelect(hwnd, lpszIn, idListBox)
72: HWND hwnd;
73: PSZ lpszIn;
74: int idListBox;
75: {
76: CHAR sz[MAX_FNAME_LEN];
77: int item;
78: PSZ lpsz, lpszFile;
79: BOOL fDir;
80:
81: /* get currently selected list entry */
82: item = (int) WinSendDlgItemMsg(hwnd, idListBox, LM_QUERYSELECTION, 0L, 0L);
83: if (item == LIT_NONE)
84: return FALSE;
85: WinSendDlgItemMsg(hwnd, idListBox, LM_QUERYITEMTEXT,
86: MPFROM2SHORT(item, MAX_FNAME_LEN), (MPARAM)(PSZ)sz);
87: lpszFile = sz;
88:
89: /* extract name */
90: if (fDir = (*sz == '['))
91: {
92: lpszFile = NextChar(lpszFile);
93: if (*lpszFile == '-')
94: {
95: /* drive selection */
96: lpszFile = NextChar(lpszFile);
97: *(lpszFile+1) = ':';
98: *(lpszFile+2) = '\0';
99: }
100: else
101: {
102: /* directory selection */
103: lpsz = lpszFile;
104: while (*lpsz != ']')
105: lpsz = NextChar(lpsz);
106: *lpsz = '\\';
107: }
108: }
109:
110: lstrcpy(lpszIn, lpszFile);
111: return (fDir);
112: }
113:
114:
115:
116:
117: /****************************************************************************\
118: * This function tries to open pdlf=>szFileName. If the file does not
119: * exist, the function asks to create it.
120: *
121: * Returns:
122: * TDF_NOOPEN - Illegal Filename or user didn't want to create
123: * TDF_OLDOPEN - Existing file
124: * TDF_NEWOPEN - File was created
125: \****************************************************************************/
126:
127: USHORT PASCAL DlgOpenFile(pdlf, hwnd)
128: PDLF pdlf;
129: HWND hwnd;
130: {
131: /* check for legal dos name */
132: if (!DlgParseFile((PSZ)pdlf->szFileName, (PSZ)pdlf->szOpenFile,
133: FALSE, FALSE))
134: {
135: DlgAlertBox(hwnd, IDS_IFN, pdlf, MB_OK | MB_ICONEXCLAMATION);
136: return (TDF_NOOPEN);
137: }
138: /* see if file already exists */
139: if (DlgParseFile((PSZ)pdlf->szFileName, (PSZ)pdlf->szOpenFile,
140: TRUE, FALSE))
141: {
142: if (OpenFile((PSZ)pdlf->szFileName, pdlf->phFile,
143: (PSZ)pdlf->szOpenFile, OF_READ))
144: return (TDF_OLDOPEN);
145: else
146: {
147: DlgAlertBox(hwnd, IDS_EOF, pdlf, MB_OK | MB_ICONEXCLAMATION);
148: return (TDF_NOOPEN);
149: }
150: }
151: /* file doesn't exist: create new one? */
152: else if (DlgAlertBox(hwnd, IDS_FNF, pdlf, MB_YESNO | MB_ICONQUESTION) == MBID_YES)
153: {
154: if (OpenFile((PSZ)pdlf->szFileName, pdlf->phFile,
155: (PSZ)pdlf->szOpenFile, OF_CREATE))
156: return (TDF_NEWOPEN);
157: else
158: DlgAlertBox(hwnd, IDS_ECF, pdlf, MB_OK | MB_ICONEXCLAMATION);
159: }
160: return(TDF_NOOPEN);
161: }
162:
163:
164:
165:
166: /****************************************************************************\
167: * This function returns the OS/2 file handle if operation is successful,
168: * 0 otherwise.
169: *
170: * Effects: Depend on wMode:
171: * OF_READ: open file for reading only
172: * OF_WRITE: open file for writing only
173: * OF_READWRITE: open file for reading and writing
174: * OF_CREATE: create the file if it does not exist
175: * OF_REOPEN: open file using info in the reopen buffer
176: * OF_EXIST: test file existence
177: * OF_PARSE: fill reopen buffer, with no other action
178: \****************************************************************************/
179:
180:
181: BOOL CALLBACK OpenFile(lpszFile, lpHandle, lpszOpenFile, wMode)
182: PSZ lpszFile;
183: PHFILE lpHandle;
184: PSZ lpszOpenFile;
185: USHORT wMode;
186: {
187: HFILE hFile = NULL;
188: USHORT wAction = NULL;
189: USHORT wAttrs = NULL;
190: USHORT wOpenFlag, wOpenMode;
191: CHAR sz[MAX_FNAME_LEN];
192:
193: /* if reopen specified, use earlier pathname */
194: if (wMode & OF_REOPEN)
195: {
196: lstrcpy((PSZ)sz, lpszOpenFile);
197: lpszFile = (PSZ)sz;
198: }
199:
200: /* parse file */
201: if (!DlgParseFile(lpszFile, lpszOpenFile, wMode&OF_EXIST, FALSE))
202: {
203: *lpszOpenFile = '\0';
204: return FALSE;
205: }
206: /* return if implementing boolean test OF_PARSE or OF_EXIST */
207: if (wMode & (OF_PARSE | OF_EXIST))
208: {
209: return TRUE;
210: }
211:
212: if (wMode & OF_READ)
213: {
214: wOpenFlag = 0x01; /* fail if it doesn't exist */
215: wOpenMode = 0x20; /* read only */
216: }
217: else if (wMode & OF_WRITE)
218: {
219: wOpenFlag = 0x11; /* create if necessary */
220: wOpenMode = 0x11; /* write only */
221: }
222: else if (wMode & OF_READWRITE)
223: {
224: wOpenFlag = 0x11; /* create if necessary */
225: wOpenMode = 0x12; /* read-write */
226: }
227: else if (wMode & OF_CREATE)
228: {
229: /* create and close file */
230: wOpenFlag = 0x10; /* fail if exists */
231: wOpenMode = 0x10; /* read only */
232: }
233: else
234: {
235: return FALSE;
236: }
237:
238: if (DosOpen(lpszFile, (PHFILE)&hFile, &wAction,
239: (ULONG) 0, 0, wOpenFlag, wOpenMode, (ULONG) 0))
240: return FALSE;
241:
242: if (wMode & OF_CREATE)
243: {
244: if (DosClose(hFile))
245: return FALSE;
246: }
247: else
248: *lpHandle = hFile;
249:
250: return TRUE;
251: }
252:
253:
254:
255:
256: /****************************************************************************\
257: * This function puts a path string into a static box.
258: \****************************************************************************/
259:
260: PSZ PASCAL DlgFitPathToBox(hwnd, idStatic, lpch)
261: HWND hwnd;
262: int idStatic;
263: PSZ lpch;
264: {
265: WRECT rc;
266: int cxField;
267: char chDrive;
268: HPS hps;
269:
270: /* get length of static field */
271: WinQueryWindowRect(WinWindowFromID(hwnd, idStatic), (PRECTL)&rc);
272: cxField = rc.xRight - rc.xLeft;
273:
274: hps = WinGetPS(hwnd);
275: if (cxField < LOUSHORT(GetTextExtent(hps, lpch,
276: lstrlen(lpch))))
277: {
278: chDrive = *lpch;
279: /* chop characters off front of string until text is short enough */
280: do
281: do
282: lpch = NextChar(lpch);
283: while (*(lpch+6) != '\\' &&
284: *(lpch+6) != '\0');
285: while (cxField < LOUSHORT(GetTextExtent(hps, lpch,
286: lstrlen(lpch))));
287: /* insert header */
288: *lpch++ = chDrive;
289: *lpch++ = ':';
290: *lpch++ = '\\';
291: *lpch++ = '.';
292: *lpch++ = '.';
293: *lpch++ = '.';
294: lpch -= 6;
295: }
296: WinReleasePS(hps);
297: return (lpch);
298: }
299:
300:
301:
302:
303: /****************************************************************************\
304: * This function fills a list box with appropriate file names from the
305: * current directory.
306: \****************************************************************************/
307:
308: int PASCAL DlgFillListBoxes(hwnd, idDirList, idFileList, attr, lpszFileSpec)
309: HWND hwnd;
310: int idDirList;
311: int idFileList;
312: USHORT attr;
313: PSZ lpszFileSpec;
314: {
315: USHORT usFiles, usDrive;
316: int i;
317: PSZ lpsz;
318: HDIR hDir;
319: ULONG lrgfDrives;
320: FILEFINDBUF ffb;
321: CHAR sz[20];
322: int cDrives;
323: int result = -1;
324: HWND hwndFiles, hwndDirs;
325:
326: /* get listbox window handles */
327: hwndFiles = WinWindowFromID(hwnd, idFileList);
328: hwndDirs = WinWindowFromID(hwnd, idDirList);
329:
330: /* disable updates to listboxes */
331: WinEnableWindowUpdate(hwndFiles, FALSE);
332: WinEnableWindowUpdate(hwndDirs, FALSE);
333:
334: /* empty list boxes of any old entries */
335: WinSendMsg(hwndFiles, LM_DELETEALL, 0L, 0L);
336: WinSendMsg(hwndDirs, LM_DELETEALL, 0L, 0L);
337:
338: /* put files that lMatch search spec in file listbox */
339: usFiles = 1;
340: hDir = 0xFFFF;
341: if (!DosFindFirst(lpszFileSpec, (PHDIR)&hDir,
342: attr&~(BITATTRDIR|BITATTRDRIVE), (PFILEFINDBUF)&ffb, sizeof(FILEFINDBUF),
343: &usFiles, 0L))
344: {
345: do
346: {
347: /* add string to list box */
348: result = (int) WinSendMsg(hwndFiles, LM_INSERTITEM,
349: MPFROM2SHORT(LIT_SORTASCENDING, 0),
350: (MPARAM)(PSZ)&(ffb.achName[0]));
351: usFiles = 1;
352: }
353: while (result >= 0 && !DosFindNext(hDir,
354: (PFILEFINDBUF)&ffb,
355: sizeof(FILEFINDBUF),
356: &usFiles));
357: DosFindClose(hDir);
358: }
359:
360: if (result != LIT_MEMERROR && (attr & BITATTRDIR))
361: {
362: /* get directories */
363: usFiles = 1;
364: hDir = 0xFFFF;
365: if (!DosFindFirst((PSZ)szStarStar, (PHDIR)&hDir, BITATTRDIR,
366: (PFILEFINDBUF)&ffb, sizeof(FILEFINDBUF), &usFiles, 0l))
367: {
368: do
369: {
370: /* extract file name */
371: if (ffb.attrFile & BITATTRDIR)
372: {
373: /* put brackets around directory */
374: lpsz = (PSZ)&(ffb.achName[0]);
375: if (*lpsz == '.' && *(lpsz+1) == '\0')
376: /* forget about current directory name '.' */
377: continue;
378: sz[0] = '[';
379: lstrcpy((PSZ)&sz[1], lpsz);
380: sz[ffb.cchName + 1] = ']';
381: sz[ffb.cchName + 2] = '\0';
382: lpsz = (PSZ)sz;
383: /* add string to list box */
384: result = (int) WinSendMsg(hwndDirs, LM_INSERTITEM,
385: MPFROM2SHORT(LIT_SORTASCENDING, 0),
386: (MPARAM)lpsz);
387: }
388: usFiles = 1;
389: }
390: while (result >= -1 && !DosFindNext(hDir,
391: (PFILEFINDBUF)&ffb,
392: sizeof(FILEFINDBUF),
393: &usFiles));
394: DosFindClose(hDir);
395: }
396: }
397:
398: if (result != LIT_MEMERROR && (attr & BITATTRDRIVE))
399: /* get drives */
400: {
401: sz[0] = '[';
402: sz[1] = sz[3] = '-';
403: sz[4] = ']';
404: sz[5] = '\0';
405:
406: DosQCurDisk(&usDrive, (unsigned long far *)&lrgfDrives);
407: cDrives = 0;
408: for (i=0; 'A' + i <= 'Z'; i++)
409: {
410: if (lrgfDrives & 1L)
411: {
412: sz[2] = (char)('A' + i);
413: /* add drive to list */
414: result = (int) WinSendMsg(hwndDirs, LM_INSERTITEM,
415: MPFROM2SHORT(LIT_END, 0),
416: (MPARAM)(PSZ)sz);
417: cDrives++;
418: }
419: lrgfDrives >>= 1;
420: }
421: }
422:
423: /* enable and show updated listboxes */
424: WinShowWindow(hwndFiles, TRUE);
425: WinShowWindow(hwndDirs, TRUE);
426:
427: return result;
428: }
429:
430:
431:
432:
433: /****************************************************************************\
434: * This function parses a string into an fully expanded file name or search
435: * path. If fExist is true then the file must exist or the search path must
436: * correspond to at least one existing file. In all cases, the corresponding
437: * directory must exist. The string must be a file name, ie. no wildcards,
438: * unless fWildOkay is true. Returns TRUE if string is parsed correctly.
439: \****************************************************************************/
440:
441: BOOL PASCAL DlgParseFile(lpszIn, lpszExp, fExist, fWildOkay)
442: PSZ lpszIn, lpszExp;
443: BOOL fExist, fWildOkay;
444: {
445: CHAR szPath[MAX_FNAME_LEN];
446: PSZ lpszFile, lpsz;
447:
448: /* go past any path spec to first char in file name */
449: lpszFile = FileInPath(lpszIn);
450:
451: /* check validity of file name */
452: if (!fExist && !DlgValidName(lpszFile, fWildOkay))
453: {
454: *lpszExp = '\0';
455: return FALSE;
456: }
457:
458: /* copy path part to path string */
459: lpsz = (PSZ)szPath;
460: if (lpszIn == lpszFile)
461: *lpsz++ = '.';
462: else
463: {
464: while (lpszIn < lpszFile && lpsz < ((PSZ)szPath + MAX_FNAME_LEN - 1))
465: *lpsz++ = *lpszIn++;
466: }
467: *lpsz = '\0';
468:
469: /* let DOS do the dirty work */
470: if (fExist)
471: {
472: /* test existence of file while parsing path */
473: if (DosSearchPath(0, (PSZ)szPath, lpszFile, lpszExp, MAX_FNAME_LEN))
474: {
475: *lpszExp = '\0';
476: return FALSE;
477: }
478: }
479: else
480: {
481: /* use dummy wild card while parsing path */
482: if (DosSearchPath(0, (PSZ)szPath, (PSZ)szStarStar, lpszExp, MAX_FNAME_LEN))
483: {
484: *lpszExp = '\0';
485: return FALSE;
486: }
487: /* replace wild card part with true file name converted to CAPS */
488: lpsz = lpszExp;
489: while (*lpsz != '?' && *lpsz != '*' && *lpsz != '\0')
490: lpsz++;
491: while (*lpszFile != '\0')
492: {
493: *lpsz++ = *lpszFile++;
494: }
495: *lpsz = '\0';
496: Upper(lpszExp);
497: }
498: return TRUE;
499: }
500:
501:
502:
503:
504: /****************************************************************************\
505: * This function determines if a string forms a legal file name or search
506: * path. Wildcard characters are acceptable if fWildOkay is true. Returns
507: * TRUE if string is legal.
508: \****************************************************************************/
509:
510: BOOL PASCAL DlgValidName(lpszName, fWildOkay)
511: PSZ lpszName;
512: BOOL fWildOkay;
513: {
514: int cLen;
515: PSZ lpsz;
516:
517: /* check file name */
518: if (*lpszName == '\0')
519: return FALSE;
520: cLen = 0;
521: lpsz = lpszName;
522: while (*lpsz != '\0' && *lpsz != '.')
523: {
524: if (++cLen > 8 || *lpsz < 0x20)
525: return FALSE;
526: switch (*lpsz++)
527: {
528: case '*':
529: case '?':
530: if (fWildOkay)
531: break;
532: case '\"':
533: case '\\':
534: case '/':
535: case '[':
536: case ']':
537: case ':':
538: case '|':
539: case '<':
540: case '>':
541: case '+':
542: case '=':
543: case ';':
544: case ',':
545: return FALSE;
546: }
547: }
548:
549: /* check extension */
550: if (*lpsz++ == '\0')
551: return TRUE;
552: cLen = 0;
553: while (*lpsz != '\0')
554: {
555: if (++cLen > 3 || *lpsz < 0x20)
556: return FALSE;
557: switch (*lpsz++)
558: {
559: case '*':
560: case '?':
561: if (fWildOkay)
562: break;
563: case '.':
564: case '\"':
565: case '\\':
566: case '/':
567: case '[':
568: case ']':
569: case ':':
570: case '|':
571: case '<':
572: case '>':
573: case '+':
574: case '=':
575: case ';':
576: case ',':
577: return FALSE;
578: }
579: }
580: return TRUE;
581: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.