source: trunk/dll/objcnr.c@ 144

Last change on this file since 144 was 2, checked in by root, 23 years ago

Initial revision

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