source: trunk/dll/objcnr.c@ 689

Last change on this file since 689 was 689, checked in by Steven Levine, 18 years ago

Commit OpenWatcom compatibility updates

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 KB
RevLine 
[159]1
2/***********************************************************************
3
4 $Id: objcnr.c 689 2007-06-15 06:33:24Z stevenhl $
5
6 Object containers
7
8 Copyright (c) 1993-98 M. Kimes
[574]9 Copyright (c) 2005, 2007 Steven H. Levine
[159]10
11 24 May 05 SHL Rework for CNRITEM.szSubject
[349]12 13 Jul 06 SHL Use Runtime_Error
[488]13 01 Sep 06 SHL Do not complain for normal cancel
[517]14 19 Oct 06 SHL Correct . and .. detect
[531]15 03 Nov 06 SHL Renames
[574]16 22 Mar 07 GKY Use QWL_USER
[159]17
18***********************************************************************/
19
[2]20#define INCL_DOS
21#define INCL_WIN
[349]22#include <os2.h>
[2]23
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <ctype.h>
[689]28#include <process.h> // _beginthread
[349]29
[2]30#include "fm3dll.h"
31#include "fm3dlg.h"
32#include "fm3str.h"
33
[551]34typedef struct
35{
[2]36 CHAR *filename;
[551]37 HWND hwndCnr;
[2]38 CHAR *stopflag;
[551]39}
40DIRSIZE;
[2]41
[551]42typedef struct
43{
[2]44 CHAR *dirname;
[551]45 CHAR stopflag;
46 BOOL dying;
47 BOOL working;
48}
49TEMP;
[2]50
[349]51#pragma data_seg(DATA1)
[2]52
[349]53static PSZ pszSrcFile = __FILE__;
[2]54
[349]55static HWND objcnrwnd;
[2]56
[531]57#pragma alloc_text(OBJCNR,ProcessDir,FillCnrsThread,ObjCnrDlgProc)
[349]58
[551]59static VOID ProcessDir(HWND hwndCnr, CHAR * filename, PCNRITEM pciParent,
60 CHAR * stopflag)
[349]61{
[551]62 CHAR maskstr[CCHMAXPATH], *endpath, *p;
63 ULONG nm, ulM;
64 HDIR hdir;
65 FILEFINDBUF3 *ffb, *fft;
66 APIRET rc;
67 RECORDINSERT ri;
68 PCNRITEM pciP;
[2]69
[551]70 ffb = xmalloc(sizeof(FILEFINDBUF3), pszSrcFile, __LINE__);
71 if (!ffb)
[2]72 return;
[551]73 strcpy(maskstr, filename);
74 if (maskstr[strlen(maskstr) - 1] != '\\')
75 strcat(maskstr, "\\");
[2]76 endpath = &maskstr[strlen(maskstr)];
[551]77 strcat(maskstr, "*");
[2]78 hdir = HDIR_CREATE;
79 nm = 1L;
80 rc = DosFindFirst(filename, &hdir,
[551]81 FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
82 FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY,
83 ffb, sizeof(FILEFINDBUF3), &nm, FIL_STANDARD);
84 if (!rc)
[2]85 DosFindClose(hdir);
86
[551]87 if (rc) { /* work around furshluginer FAT bug... */
88 if (IsRoot(filename))
[2]89 rc = 0;
90 }
91
[551]92 if ((!rc && (ffb->attrFile & FILE_DIRECTORY))) {
93 pciP =
94 WinSendMsg(hwndCnr, CM_ALLOCRECORD, MPFROMLONG(EXTRA_RECORD_BYTES2),
95 MPFROMLONG(1L));
96 if (!pciP) {
[2]97 free(ffb);
98 return;
99 }
[551]100 strcpy(pciP->szFileName, filename);
[2]101 pciP->pszDispAttr = pciP->szDispAttr;
[159]102 pciP->pszSubject = pciP->szSubject;
103 pciP->pszLongname = pciP->szLongname;
[2]104 pciP->pszDispAttr = pciP->szDispAttr;
[159]105 *pciP->szDispAttr = *pciP->szLongname = *pciP->szSubject = 0;
[551]106 if (strlen(filename) < 4)
[2]107 pciP->pszFileName = pciP->szFileName;
108 else {
[551]109 p = strrchr(pciP->szFileName, '\\');
110 if (!p)
111 pciP->pszFileName = pciP->szFileName;
112 else if (*(p + 1))
113 p++;
[2]114 pciP->pszFileName = p;
115 }
116 pciP->rc.pszIcon = pciP->pszFileName;
[551]117 if (fForceUpper)
[2]118 strupr(pciP->szFileName);
[551]119 else if (fForceLower)
[2]120 strlwr(pciP->szFileName);
121 pciP->rc.flRecordAttr |= CRA_RECORDREADONLY;
122 }
123 else {
124 free(ffb);
125 Dos_Error(MB_ENTER,
[551]126 rc,
127 HWND_DESKTOP,
128 pszSrcFile,
129 __LINE__, GetPString(IDS_CANTFINDDIRTEXT), filename);
[2]130 return;
131 }
132 {
133 HPOINTER hptr;
134
135 hptr = WinLoadFileIcon(pciP->szFileName, FALSE);
[551]136 if (hptr)
[2]137 pciP->rc.hptrIcon = hptr;
138 }
[551]139 if (!pciP->rc.hptrIcon || pciP->rc.hptrIcon == hptrFile) /* OS/2 bug bug bug bug */
[2]140 pciP->rc.hptrIcon = hptrDir;
[551]141 memset(&ri, 0, sizeof(RECORDINSERT));
142 ri.cb = sizeof(RECORDINSERT);
143 ri.pRecordOrder = (PRECORDCORE) CMA_END;
144 ri.pRecordParent = (PRECORDCORE) pciParent;
145 ri.zOrder = (USHORT) CMA_TOP;
146 ri.cRecordsInsert = 1L;
147 ri.fInvalidateRecord = TRUE;
148 if (!WinSendMsg(hwndCnr, CM_INSERTRECORD, MPFROMP(pciP), MPFROMP(&ri))) {
[2]149 free(ffb);
150 return;
151 }
152 hdir = HDIR_CREATE;
[551]153 if (!isalpha(*maskstr) || maskstr[1] != ':' || maskstr[2] != '\\' ||
154 ((driveflags[toupper(*maskstr) - 'A'] & DRIVE_REMOTE) && fRemoteBug))
[2]155 ulM = 1L;
156 else
[551]157 ulM = min(FilesToGet, 225);
158 if (ulM > 1L) {
159 fft = xrealloc(ffb, sizeof(FILEFINDBUF3) * ulM, pszSrcFile, __LINE__);
160 if (!fft)
[2]161 ulM = 1L;
162 else
163 ffb = fft;
164 }
165 nm = ulM;
166 rc = DosFindFirst(maskstr, &hdir,
[551]167 FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
168 FILE_SYSTEM | FILE_HIDDEN | MUST_HAVE_DIRECTORY, ffb,
169 sizeof(FILEFINDBUF3) * ulM, &nm, FIL_STANDARD);
170 if (!rc) {
[2]171
[551]172 register PBYTE fb = (PBYTE) ffb;
173 FILEFINDBUF3 *pffbFile;
174 ULONG x;
[2]175
[551]176 while (!rc) {
177 for (x = 0L; x < nm; x++) {
178 pffbFile = (FILEFINDBUF3 *) fb;
179 if (*stopflag)
180 break;
181 if ((pffbFile->attrFile & FILE_DIRECTORY) &&
[517]182 // Skip . and ..
[551]183 (pffbFile->achName[0] != '.' ||
[517]184 (pffbFile->achName[1] &&
[551]185 (pffbFile->achName[1] != '.' || pffbFile->achName[2])))) {
186 strcpy(endpath, pffbFile->achName);
187 ProcessDir(hwndCnr, maskstr, pciP, stopflag);
188 }
189 if (!pffbFile->oNextEntryOffset)
190 break;
191 fb += pffbFile->oNextEntryOffset;
[2]192 }
193 DosSleep(0L);
[551]194 if (*stopflag)
195 break;
[2]196 nm = ulM;
[551]197 rc = DosFindNext(hdir, ffb, sizeof(FILEFINDBUF3) * ulM, &nm);
[2]198 }
199 DosFindClose(hdir);
200 }
201 free(ffb);
[551]202 WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPFROMP(&pciP),
203 MPFROM2SHORT(1, 0));
[2]204}
205
[551]206static VOID FillCnrsThread(VOID * args)
[349]207{
[551]208 HAB hab;
209 HMQ hmq;
210 DIRSIZE *dirsize = (DIRSIZE *) args;
[2]211
[551]212 if (!dirsize)
[2]213 return;
214
215 DosError(FERR_DISABLEHARDERR);
216
217 hab = WinInitialize(0);
[551]218 if (hab) {
219 hmq = WinCreateMsgQueue(hab, 0);
220 if (hmq) {
221 WinCancelShutdown(hmq, TRUE);
222 ProcessDir(dirsize->hwndCnr, dirsize->filename, (PCNRITEM) NULL,
223 dirsize->stopflag);
[2]224 DosPostEventSem(CompactSem);
225 WinDestroyMsgQueue(hmq);
226 }
227 WinTerminate(hab);
228 }
[551]229 PostMsg(WinQueryWindow(dirsize->hwndCnr, QW_PARENT), UM_CONTAINER_FILLED,
230 MPVOID, MPVOID);
[2]231 free(dirsize);
232}
233
[551]234MRESULT EXPENTRY ObjCnrDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[349]235{
[2]236 TEMP *data;
237
[551]238 switch (msg) {
239 case WM_INITDLG:
240 if (objcnrwnd) {
241 Runtime_Error(pszSrcFile, __LINE__, "objcnrwnd set");
242 WinSetWindowPos(objcnrwnd, HWND_TOP, 0, 0, 0, 0,
243 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER);
244 WinDismissDlg(hwnd, 0);
245 break;
246 }
247 if (!mp2) {
248 Runtime_Error(pszSrcFile, __LINE__, "mp2 NULL");
249 WinDismissDlg(hwnd, 0);
250 break;
251 }
252 objcnrwnd = hwnd;
253 data = xmallocz(sizeof(TEMP), pszSrcFile, __LINE__);
254 if (!data) {
255 WinDismissDlg(hwnd, 0);
256 break;
257 }
258 data->dirname = (CHAR *) mp2;
[574]259 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) data);
[551]260 if (*data->dirname)
261 WinSetDlgItemText(hwnd, OBJCNR_DIR, data->dirname);
262 {
263 DIRSIZE *dirsize;
264
265 dirsize = xmalloc(sizeof(DIRSIZE), pszSrcFile, __LINE__);
266 if (!dirsize) {
267 WinDismissDlg(hwnd, 0);
268 break;
[2]269 }
[551]270 dirsize->stopflag = (CHAR *) & data->stopflag;
271 dirsize->filename = data->dirname;
272 dirsize->hwndCnr = WinWindowFromID(hwnd, OBJCNR_CNR);
273 if (_beginthread(FillCnrsThread, NULL, 65536 * 8, (PVOID) dirsize) ==
274 -1) {
275 Runtime_Error(pszSrcFile, __LINE__,
276 GetPString(IDS_COULDNTSTARTTHREADTEXT));
277 free(dirsize);
278 WinDismissDlg(hwnd, 0);
279 break;
[349]280 }
[551]281 else
282 data->working = TRUE;
283 }
284 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
285 break;
[2]286
[551]287 case UM_SETUP:
288 // WinEnableWindowUpdate(WinWindowFromID(hwnd,OBJCNR_CNR),FALSE);
289 {
290 CNRINFO cnri;
[2]291
[551]292 memset(&cnri, 0, sizeof(CNRINFO));
293 cnri.cb = sizeof(CNRINFO);
294 WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_QUERYCNRINFO,
295 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)));
296 cnri.cyLineSpacing = 0;
297 cnri.cxTreeIndent = 12L;
298 cnri.pszCnrTitle = GetPString(IDS_WORKINGTEXT);
299 cnri.flWindowAttr = CV_TREE | CV_FLOW |
300 CA_CONTAINERTITLE | CA_TITLESEPARATOR | CA_TREELINE;
301 if (WinQueryWindowUShort(hwnd, QWS_ID) == QTREE_FRAME)
302 cnri.flWindowAttr |= CV_MINI;
303 WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_SETCNRINFO, MPFROMP(&cnri),
304 MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING |
305 CMA_CXTREEINDENT));
306 }
307 return 0;
[2]308
[551]309 case UM_CONTAINER_FILLED:
310 WinSetDlgItemText(hwnd, OBJCNR_NOTE, NullStr);
[2]311// WinEnableWindowUpdate(WinWindowFromID(hwnd,OBJCNR_CNR),TRUE);
[551]312 WinSendDlgItemMsg(hwnd, OBJCNR_CNR, CM_INVALIDATERECORD, MPVOID,
313 MPFROM2SHORT(0, CMA_ERASE | CMA_INVALIDATE));
314 data = INSTDATA(hwnd);
315 if (data) {
316 data->working = FALSE;
317 if (data->dying)
318 WinDismissDlg(hwnd, 0);
319 {
320 PCNRITEM pci;
321 USHORT id;
[2]322
[551]323 id = WinQueryWindowUShort(hwnd, QWS_ID);
324 pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
325 CM_QUERYRECORD,
326 MPVOID,
327 MPFROM2SHORT(CMA_FIRST,
328 CMA_ITEMORDER));
329 if (pci && (INT) pci != -1) {
330 ExpandAll(WinWindowFromID(hwnd, OBJCNR_CNR), TRUE, pci);
331 if (id == QTREE_FRAME)
332 pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
333 CM_QUERYRECORD,
334 MPFROMP(pci),
335 MPFROM2SHORT(CMA_FIRSTCHILD,
336 CMA_ITEMORDER));
337 }
338 if ((!pci || (INT) pci == -1) && id == QTREE_FRAME) {
339 Notify(GetPString(IDS_NODIRSUNDERTEXT));
340 WinDismissDlg(hwnd, 0);
341 break;
342 }
[2]343 }
[551]344 }
345 return 0;
[2]346
[551]347 case WM_CONTROL:
348 switch (SHORT1FROMMP(mp1)) {
349 case OBJCNR_CNR:
350 if (SHORT2FROMMP(mp1) == CN_ENTER) {
[2]351
[551]352 PCNRITEM pci = (PCNRITEM) ((PNOTIFYRECORDENTER) mp2)->pRecord;
[2]353
[551]354 if (pci && (INT) pci != -1)
355 WinSendDlgItemMsg(hwnd, DID_OK, BM_CLICK, MPVOID, MPVOID);
[2]356 }
[551]357 break;
358 }
359 return 0;
[2]360
[551]361 case WM_COMMAND:
362 switch (SHORT1FROMMP(mp1)) {
363 case IDM_HELP:
364 if (hwndHelp) {
[2]365
[551]366 USHORT id;
[2]367
[551]368 id = WinQueryWindowUShort(hwnd, QWS_ID);
[2]369
[551]370 if (id == QTREE_FRAME)
371 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
372 MPFROM2SHORT(HELP_QUICKTREE, 0),
373 MPFROMSHORT(HM_RESOURCEID));
374 else
375 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
376 MPFROM2SHORT(HELP_OBJECTPATH, 0),
377 MPFROMSHORT(HM_RESOURCEID));
378 }
379 break;
[2]380
[551]381 case OBJCNR_DESKTOP:
382 case DID_OK:
383 data = INSTDATA(hwnd);
384 if (data) {
[2]385
[551]386 PCNRITEM pci;
[2]387
[551]388 if (data->working) {
389 Runtime_Error(pszSrcFile, __LINE__, "working unexpected");
390 break;
391 }
392 if (SHORT1FROMMP(mp1) == OBJCNR_DESKTOP) {
393 WinDismissDlg(hwnd, 2);
394 break;
395 }
396 pci = (PCNRITEM) WinSendDlgItemMsg(hwnd, OBJCNR_CNR,
397 CM_QUERYRECORDEMPHASIS,
398 MPFROMLONG(CMA_FIRST),
399 MPFROMSHORT(CRA_CURSORED));
400 if (pci && (INT) pci != -1)
401 strcpy(data->dirname, pci->szFileName);
402 WinDismissDlg(hwnd, 1);
[2]403 }
[551]404 break;
[2]405
[551]406 case DID_CANCEL:
[2]407 data = INSTDATA(hwnd);
[551]408 if (data) {
409 if (data->working) {
[689]410 data->dying = (CHAR)TRUE;
411 data->stopflag = (CHAR)0xff;
[551]412 break;
413 }
414 WinDismissDlg(hwnd, 0);
415 }
[2]416 break;
[551]417 }
418 return 0;
419
420 case WM_DESTROY:
421 objcnrwnd = (HWND) 0;
422 data = INSTDATA(hwnd);
423 if (data)
424 free(data);
425 break;
[2]426 }
[551]427 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]428}
Note: See TracBrowser for help on using the repository browser.