source: trunk/dll/objcnr.c@ 771

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

Increase subject to 1024 reduce DosSleep times

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