source: trunk/dll/objcnr.c@ 775

Last change on this file since 775 was 775, checked in by Gregg Young, 18 years ago

Minor clean up add comments re recent changes

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