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
RevLine 
[159]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
[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
[751]17 01 Aug 07 SHL Rework to sync with CNRITEM mods
[756]18 03 Aug 07 GKY Enlarged and made setable everywhere Findbuf (speed file loading)
[775]19 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
[159]20
[775]21
[159]22***********************************************************************/
23
[2]24#define INCL_DOS
25#define INCL_WIN
[349]26#include <os2.h>
[2]27
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <ctype.h>
[689]32#include <process.h> // _beginthread
[349]33
[2]34#include "fm3dll.h"
35#include "fm3dlg.h"
36#include "fm3str.h"
37
[551]38typedef struct
39{
[2]40 CHAR *filename;
[551]41 HWND hwndCnr;
[2]42 CHAR *stopflag;
[551]43}
44DIRSIZE;
[2]45
[551]46typedef struct
47{
[2]48 CHAR *dirname;
[551]49 CHAR stopflag;
50 BOOL dying;
51 BOOL working;
52}
53TEMP;
[2]54
[349]55#pragma data_seg(DATA1)
[2]56
[349]57static PSZ pszSrcFile = __FILE__;
[2]58
[349]59static HWND objcnrwnd;
[2]60
[531]61#pragma alloc_text(OBJCNR,ProcessDir,FillCnrsThread,ObjCnrDlgProc)
[349]62
[551]63static VOID ProcessDir(HWND hwndCnr, CHAR * filename, PCNRITEM pciParent,
64 CHAR * stopflag)
[349]65{
[551]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;
[2]73
[551]74 ffb = xmalloc(sizeof(FILEFINDBUF3), pszSrcFile, __LINE__);
75 if (!ffb)
[2]76 return;
[551]77 strcpy(maskstr, filename);
78 if (maskstr[strlen(maskstr) - 1] != '\\')
79 strcat(maskstr, "\\");
[2]80 endpath = &maskstr[strlen(maskstr)];
[551]81 strcat(maskstr, "*");
[2]82 hdir = HDIR_CREATE;
[771]83 nm = 1;
[2]84 rc = DosFindFirst(filename, &hdir,
[551]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)
[2]89 DosFindClose(hdir);
90
[551]91 if (rc) { /* work around furshluginer FAT bug... */
92 if (IsRoot(filename))
[2]93 rc = 0;
94 }
95
[551]96 if ((!rc && (ffb->attrFile & FILE_DIRECTORY))) {
[731]97 pciP = WinSendMsg(hwndCnr,
98 CM_ALLOCRECORD,
[751]99 MPFROMLONG(EXTRA_RECORD_BYTES),
[761]100 MPFROMLONG(1));
[551]101 if (!pciP) {
[2]102 free(ffb);
103 return;
104 }
[730]105 pciP->pszFileName = xstrdup(filename, pszSrcFile, __LINE__);
[751]106 pciP->pszDispAttr = NullStr;
107 pciP->pszSubject = NullStr;
[762]108 pciP->pszLongName = NullStr;
[551]109 if (strlen(filename) < 4)
[751]110 pciP->pszDisplayName = pciP->pszFileName;
[2]111 else {
[730]112 p = strrchr(pciP->pszFileName, '\\');
[551]113 if (!p)
[756]114 pciP->pszDisplayName = pciP->pszFileName;
[551]115 else if (*(p + 1))
116 p++;
[751]117 pciP->pszDisplayName = p;
[2]118 }
[751]119 pciP->rc.pszIcon = pciP->pszDisplayName;
[551]120 if (fForceUpper)
[730]121 strupr(pciP->pszFileName);
[551]122 else if (fForceLower)
[730]123 strlwr(pciP->pszFileName);
[2]124 pciP->rc.flRecordAttr |= CRA_RECORDREADONLY;
125 }
126 else {
127 free(ffb);
128 Dos_Error(MB_ENTER,
[551]129 rc,
130 HWND_DESKTOP,
131 pszSrcFile,
132 __LINE__, GetPString(IDS_CANTFINDDIRTEXT), filename);
[2]133 return;
134 }
135 {
136 HPOINTER hptr;
137
[730]138 hptr = WinLoadFileIcon(pciP->pszFileName, FALSE);
[551]139 if (hptr)
[2]140 pciP->rc.hptrIcon = hptr;
141 }
[551]142 if (!pciP->rc.hptrIcon || pciP->rc.hptrIcon == hptrFile) /* OS/2 bug bug bug bug */
[2]143 pciP->rc.hptrIcon = hptrDir;
[551]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;
[771]149 ri.cRecordsInsert = 1;
[551]150 ri.fInvalidateRecord = TRUE;
151 if (!WinSendMsg(hwndCnr, CM_INSERTRECORD, MPFROMP(pciP), MPFROMP(&ri))) {
[2]152 free(ffb);
153 return;
154 }
155 hdir = HDIR_CREATE;
[551]156 if (!isalpha(*maskstr) || maskstr[1] != ':' || maskstr[2] != '\\' ||
157 ((driveflags[toupper(*maskstr) - 'A'] & DRIVE_REMOTE) && fRemoteBug))
[761]158 ulM = 1;
[2]159 else
[752]160 ulM = FilesToGet;
[761]161 if (ulM > 1) {
[551]162 fft = xrealloc(ffb, sizeof(FILEFINDBUF3) * ulM, pszSrcFile, __LINE__);
163 if (!fft)
[761]164 ulM = 1;
[2]165 else
166 ffb = fft;
167 }
168 nm = ulM;
169 rc = DosFindFirst(maskstr, &hdir,
[551]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) {
[2]174
[551]175 register PBYTE fb = (PBYTE) ffb;
176 FILEFINDBUF3 *pffbFile;
177 ULONG x;
[2]178
[551]179 while (!rc) {
[761]180 for (x = 0; x < nm; x++) {
[551]181 pffbFile = (FILEFINDBUF3 *) fb;
182 if (*stopflag)
183 break;
184 if ((pffbFile->attrFile & FILE_DIRECTORY) &&
[517]185 // Skip . and ..
[551]186 (pffbFile->achName[0] != '.' ||
[517]187 (pffbFile->achName[1] &&
[551]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;
[2]195 }
[761]196 DosSleep(1);
[551]197 if (*stopflag)
198 break;
[2]199 nm = ulM;
[551]200 rc = DosFindNext(hdir, ffb, sizeof(FILEFINDBUF3) * ulM, &nm);
[2]201 }
202 DosFindClose(hdir);
203 }
204 free(ffb);
[551]205 WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPFROMP(&pciP),
206 MPFROM2SHORT(1, 0));
[2]207}
208
[551]209static VOID FillCnrsThread(VOID * args)
[349]210{
[551]211 HAB hab;
212 HMQ hmq;
213 DIRSIZE *dirsize = (DIRSIZE *) args;
[2]214
[551]215 if (!dirsize)
[2]216 return;
217
218 DosError(FERR_DISABLEHARDERR);
219
220 hab = WinInitialize(0);
[551]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);
[2]227 DosPostEventSem(CompactSem);
228 WinDestroyMsgQueue(hmq);
229 }
230 WinTerminate(hab);
231 }
[551]232 PostMsg(WinQueryWindow(dirsize->hwndCnr, QW_PARENT), UM_CONTAINER_FILLED,
233 MPVOID, MPVOID);
[2]234 free(dirsize);
235}
236
[551]237MRESULT EXPENTRY ObjCnrDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[349]238{
[2]239 TEMP *data;
240
[551]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;
[574]262 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) data);
[551]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;
[2]272 }
[551]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;
[349]283 }
[551]284 else
285 data->working = TRUE;
286 }
287 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
288 break;
[2]289
[551]290 case UM_SETUP:
291 // WinEnableWindowUpdate(WinWindowFromID(hwnd,OBJCNR_CNR),FALSE);
292 {
293 CNRINFO cnri;
[2]294
[551]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;
[2]311
[551]312 case UM_CONTAINER_FILLED:
313 WinSetDlgItemText(hwnd, OBJCNR_NOTE, NullStr);
[2]314// WinEnableWindowUpdate(WinWindowFromID(hwnd,OBJCNR_CNR),TRUE);
[551]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;
[2]325
[551]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 }
[2]346 }
[551]347 }
348 return 0;
[2]349
[551]350 case WM_CONTROL:
351 switch (SHORT1FROMMP(mp1)) {
352 case OBJCNR_CNR:
353 if (SHORT2FROMMP(mp1) == CN_ENTER) {
[2]354
[551]355 PCNRITEM pci = (PCNRITEM) ((PNOTIFYRECORDENTER) mp2)->pRecord;
[2]356
[551]357 if (pci && (INT) pci != -1)
358 WinSendDlgItemMsg(hwnd, DID_OK, BM_CLICK, MPVOID, MPVOID);
[2]359 }
[551]360 break;
361 }
362 return 0;
[2]363
[551]364 case WM_COMMAND:
365 switch (SHORT1FROMMP(mp1)) {
366 case IDM_HELP:
367 if (hwndHelp) {
[2]368
[551]369 USHORT id;
[2]370
[551]371 id = WinQueryWindowUShort(hwnd, QWS_ID);
[2]372
[551]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;
[2]383
[551]384 case OBJCNR_DESKTOP:
385 case DID_OK:
386 data = INSTDATA(hwnd);
387 if (data) {
[2]388
[551]389 PCNRITEM pci;
[2]390
[551]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)
[730]404 strcpy(data->dirname, pci->pszFileName);
[551]405 WinDismissDlg(hwnd, 1);
[2]406 }
[551]407 break;
[2]408
[551]409 case DID_CANCEL:
[2]410 data = INSTDATA(hwnd);
[551]411 if (data) {
412 if (data->working) {
[689]413 data->dying = (CHAR)TRUE;
414 data->stopflag = (CHAR)0xff;
[551]415 break;
416 }
417 WinDismissDlg(hwnd, 0);
418 }
[2]419 break;
[551]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;
[2]429 }
[551]430 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]431}
Note: See TracBrowser for help on using the repository browser.