source: trunk/dll/objcnr.c@ 551

Last change on this file since 551 was 551, checked in by Gregg Young, 19 years ago

Indentation cleanup

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