source: trunk/dll/objcnr.c@ 517

Last change on this file since 517 was 517, checked in by root, 19 years ago

Correct . and .. detect

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