source: trunk/dll/undel.c@ 433

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

Use xfgets_bstripcr

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: undel.c 406 2006-07-29 20:02:17Z root $
5
6 Copyright (c) 1993-98 M. Kimes
7 Copyright (c) 2004, 2006 Steven H. Levine
8
9 01 Aug 04 SHL Rework lstrip/rstrip usage
10 24 May 05 SHL Rework Win_Error usage
11 17 Jul 06 SHL Use Runtime_Error
12 29 Jul 06 SHL Use xfgets_bstripcr
13
14***********************************************************************/
15
16#define INCL_DOSERRORS
17#define INCL_DOS
18#define INCL_WIN
19#include <os2.h>
20
21#include <stdlib.h>
22#include <stdio.h>
23#include <string.h>
24#include <time.h>
25#include <ctype.h>
26
27#include "fm3dll.h"
28#include "fm3dlg.h"
29#include "fm3str.h"
30
31#pragma data_seg(DATA2)
32
33static PSZ pszSrcFile = __FILE__;
34
35#pragma alloc_text(UNDELETE,FillUndelList,UndeleteDlgProc)
36
37struct tempstruct {
38 HWND hwnd;
39 CHAR path[CCHMAXPATH];
40 BOOL inclsubdirs;
41};
42
43
44VOID FillUndelList (VOID *arg)
45{
46 HWND hwnd;
47 CHAR s[CCHMAXPATH * 2];
48 CHAR *path;
49 HAB thab;
50 HMQ thmq;
51 FILE *fp;
52 HFILE oldstdout,newstdout;
53 struct tempstruct *undelinfo;
54 BOOL killme = FALSE;
55 FILESTATUS3 fsa;
56
57 undelinfo = (struct tempstruct *)arg;
58 hwnd = undelinfo->hwnd;
59 path = undelinfo->path;
60 DosError(FERR_DISABLEHARDERR);
61
62 thab = WinInitialize(0);
63 thmq = WinCreateMsgQueue(thab,0);
64 WinCancelShutdown(thmq,TRUE);
65 if(thab && thmq) {
66 WinSendDlgItemMsg(hwnd,UNDEL_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
67 unlinkf("%s","$UDELETE.#$#");
68 fp = xfopen("$UDELETE.#$#","w",pszSrcFile,__LINE__);
69 if (!fp) {
70 Win_Error(NULLHANDLE,hwnd,pszSrcFile,__LINE__,
71 GetPString(IDS_REDIRECTERRORTEXT));
72 killme = TRUE;
73 goto Abort;
74 }
75 else {
76 newstdout = -1;
77 if (DosDupHandle(fileno(stdout),&newstdout)) {
78 saymsg(MB_CANCEL,
79 hwnd,
80 GetPString(IDS_MAYDAYTEXT),
81 GetPString(IDS_REDIRECTERRORTEXT));
82 fclose(fp);
83 killme = TRUE;
84 goto Abort;
85 }
86 oldstdout = fileno(stdout);
87 DosDupHandle(fileno(fp),&oldstdout);
88 runemf2(SEPARATE | INVISIBLE | WINDOWED | BACKGROUND | WAIT,
89 hwnd,
90 NULL,
91 NULL,
92 "UNDELETE.COM %s /L%s",
93 path,
94 (undelinfo->inclsubdirs) ? " /S" : NullStr);
95 oldstdout = fileno(stdout);
96 DosDupHandle(newstdout,&oldstdout);
97 DosClose(newstdout);
98 fclose(fp);
99 }
100 fp = xfopen("$UDELETE.#$#","r",pszSrcFile,__LINE__);
101 if (fp) {
102 xfgets(s,sizeof(s),fp,pszSrcFile,__LINE__); // Skip 1st line
103 while (!feof(fp)) {
104 strset(s,0);
105 if (!xfgets_bstripcr(s,CCHMAXPATH + 2,fp,pszSrcFile,__LINE__))
106 break;
107 if(*s) {
108 if(!strnicmp(s,"SYS3194: ",9)) {
109
110 APIRET temp;
111
112 strcat(s," ");
113 xfgets(&s[strlen(s)],CCHMAXPATH + 128 - strlen(s),fp,pszSrcFile,__LINE__);
114 fclose(fp);
115 s[CCHMAXPATH + 128] = 0;
116 stripcr(s);
117 rstrip(s);
118 strcat(s,GetPString(IDS_ASKABOUTUNDELETEHELPTEXT));
119 temp = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
120 hwnd,
121 GetPString(IDS_ERRORTEXT),
122 "%s",
123 s);
124 if(temp == MBID_YES)
125 runemf2(BACKGROUND | INVISIBLE | SEPARATE | WINDOWED,
126 hwnd,
127 NULL,
128 NULL,
129 "%s /C HELP UNDELETE",
130 GetCmdSpec(FALSE));
131 if(temp == MBID_CANCEL)
132 killme = TRUE;
133 goto Abort;
134 }
135 else if(s[1] != ':')
136 continue;
137 else if((SHORT)WinSendDlgItemMsg(hwnd,UNDEL_LISTBOX,LM_SEARCHSTRING,
138 MPFROM2SHORT(0,LIT_FIRST),
139 MPFROMP(s)) < 0 &&
140 DosQueryPathInfo(s,FIL_STANDARD,&fsa,(ULONG)sizeof(fsa)))
141 WinSendDlgItemMsg(hwnd,
142 UNDEL_LISTBOX,
143 LM_INSERTITEM,
144 MPFROM2SHORT(LIT_SORTASCENDING,0),
145 MPFROMP(s));
146 }
147 }
148 fclose(fp);
149 }
150Abort:
151 WinDestroyMsgQueue(thmq);
152 WinTerminate(thab);
153 }
154 DosForceDelete("$UDELETE.#$#");
155 PostMsg(hwnd,
156 UM_CONTAINER_FILLED,
157 MPVOID,
158 MPVOID);
159 if(killme)
160 PostMsg(hwnd,
161 WM_CLOSE,
162 MPVOID,
163 MPVOID);
164 if(undelinfo)
165 free(undelinfo);
166}
167
168
169MRESULT EXPENTRY UndeleteDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
170{
171 SHORT sSelect;
172 static BOOL listdone,changed = FALSE,refresh = FALSE;
173 static HPOINTER hptrIcon = (HPOINTER)0;
174
175 switch(msg) {
176 case WM_INITDLG:
177 listdone = TRUE;
178 if(!mp2 || !*(CHAR *)mp2) {
179 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
180 WinDismissDlg(hwnd,0);
181 break;
182 }
183 hptrIcon = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,UNDEL_FRAME);
184 WinDefDlgProc(hwnd,WM_SETICON,MPFROMLONG(hptrIcon),MPVOID);
185 WinSendDlgItemMsg(hwnd,UNDEL_ENTRY,EM_SETTEXTLIMIT,
186 MPFROM2SHORT(CCHMAXPATH,0),MPVOID);
187 {
188 CHAR s[CCHMAXPATH];
189
190 strcpy(s,(CHAR *)mp2);
191 if(s[strlen(s) - 1] != '\\')
192 strcat(s,"\\");
193 strcat(s,"*");
194 WinSetDlgItemText(hwnd,UNDEL_ENTRY,s);
195 WinCheckButton(hwnd,UNDEL_SUBDIRS,TRUE);
196 FillPathListBox(hwnd,WinWindowFromID(hwnd,UNDEL_DRIVELIST),(HWND)0,s,
197 TRUE);
198 }
199 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
200 break;
201
202 case UM_SETUP:
203 if(listdone) {
204
205 struct tempstruct *undelinfo;
206 CHAR s[CCHMAXPATH];
207
208 listdone = FALSE;
209 undelinfo = xmallocz(sizeof(struct tempstruct),pszSrcFile,__LINE__);
210 if (!undelinfo) {
211 listdone = TRUE;
212 WinDismissDlg(hwnd,0);
213 }
214 else {
215 undelinfo->hwnd = hwnd;
216 WinQueryDlgItemText(hwnd,
217 UNDEL_ENTRY,
218 sizeof(undelinfo->path),
219 undelinfo->path);
220 bstrip(undelinfo->path);
221 MakeFullName(undelinfo->path);
222 undelinfo->inclsubdirs = WinQueryButtonCheckstate(hwnd,
223 UNDEL_SUBDIRS);
224 sprintf(s,
225 GetPString(IDS_UNDELETETITLETEXT),
226 toupper(*undelinfo->path));
227 WinSetWindowText(hwnd,s);
228 if (_beginthread(FillUndelList,NULL,65536,(PVOID)undelinfo) == -1)
229 {
230 Runtime_Error(pszSrcFile, __LINE__,GetPString(IDS_COULDNTSTARTTHREADTEXT));
231 free(undelinfo);
232 listdone = TRUE;
233 WinDismissDlg(hwnd,0);
234 }
235 else
236 DosSleep(500L);
237 }
238 refresh = FALSE;
239 }
240 else
241 refresh = TRUE;
242 changed = FALSE;
243 return 0;
244
245 case UM_CONTAINER_FILLED:
246 listdone = TRUE;
247 {
248 CHAR s[33];
249
250 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
251 UNDEL_LISTBOX,
252 LM_QUERYITEMCOUNT,
253 MPVOID,MPVOID);
254 sprintf(s,"%d",sSelect);
255 WinSetDlgItemText(hwnd,UNDEL_COUNT,s);
256 if(refresh)
257 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
258 refresh = FALSE;
259 }
260 return 0;
261
262 case WM_CONTROL:
263 switch(SHORT1FROMMP(mp1)) {
264 case UNDEL_SUBDIRS:
265 PostMsg(hwnd,
266 UM_SETUP,
267 MPVOID,
268 MPVOID);
269 break;
270
271 case UNDEL_ENTRY:
272 switch(SHORT2FROMMP(mp1)) {
273 case EN_CHANGE:
274 changed = TRUE;
275 break;
276 case EN_KILLFOCUS:
277 if(changed)
278 PostMsg(hwnd,
279 UM_SETUP,
280 MPVOID,
281 MPVOID);
282 break;
283 }
284 break;
285
286 case UNDEL_DRIVELIST:
287 if(!listdone) {
288 Runtime_Error(pszSrcFile, __LINE__, "not listdone");
289 break;
290 }
291 switch(SHORT2FROMMP(mp1)) {
292 case CBN_ENTER:
293 {
294 CHAR s[CCHMAXPATH],drive,*p;
295
296 strset(s,0);
297 WinQueryDlgItemText(hwnd,
298 UNDEL_DRIVELIST,
299 3,
300 s);
301 if (!isalpha(*s)) {
302 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
303 }
304 else {
305 drive = toupper(*s);
306 WinQueryDlgItemText(hwnd,
307 UNDEL_ENTRY,
308 sizeof(s),
309 s);
310 *s = drive;
311 s[1] = ':';
312 s[2] = '\\';
313 p = strrchr(s + 2,'\\');
314 if(p) {
315 p++;
316 if(*p)
317 memmove(s + 3,p,strlen(p) + 1);
318 else {
319 s[3] = '*';
320 s[4] = 0;
321 }
322 }
323 else {
324 s[3] = '*';
325 s[4] = 0;
326 }
327 s[CCHMAXPATH - 1] = 0;
328 WinSetDlgItemText(hwnd,UNDEL_ENTRY,s);
329 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
330 }
331 }
332 break;
333 }
334 break;
335
336 case UNDEL_LISTBOX:
337 switch(SHORT2FROMMP(mp2)) {
338 case LN_ENTER:
339 WinSendDlgItemMsg(hwnd,DID_OK,BM_CLICK,MPFROMSHORT(TRUE),MPVOID);
340 break;
341 }
342 break;
343
344 default:
345 break;
346 }
347 return 0;
348
349 case WM_ADJUSTWINDOWPOS:
350 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
351 break;
352
353 case UM_STRETCH:
354 {
355 SWP swpC,swp,swpM,swpD,swpL,swpE;
356
357 WinQueryWindowPos(hwnd,&swp);
358 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
359 WinQueryWindowPos(WinWindowFromID(hwnd,UNDEL_LISTBOX),&swpC);
360 WinQueryWindowPos(WinWindowFromID(hwnd,UNDEL_MASKHDR),&swpM);
361 WinQueryWindowPos(WinWindowFromID(hwnd,UNDEL_DRVHDR),&swpD);
362 WinQueryWindowPos(WinWindowFromID(hwnd,UNDEL_DRIVELIST),&swpL);
363 WinQueryWindowPos(WinWindowFromID(hwnd,UNDEL_ENTRY),&swpE);
364 WinSetWindowPos(WinWindowFromID(hwnd,UNDEL_LISTBOX),HWND_TOP,
365 SysVal(SV_CXSIZEBORDER),
366 swpC.y,
367 swp.cx - (SysVal(SV_CXSIZEBORDER) * 2),
368 (swp.cy - swpC.y) - (SysVal(SV_CYTITLEBAR) +
369 SysVal(SV_CYSIZEBORDER) +
370 swpM.cy + 16),
371 SWP_MOVE | SWP_SIZE);
372 WinSetWindowPos(WinWindowFromID(hwnd,UNDEL_MASKHDR),HWND_TOP,
373 swpM.x,
374 (swp.cy - swpM.cy) - (SysVal(SV_CYTITLEBAR) +
375 SysVal(SV_CYSIZEBORDER) + 8),
376 swpM.cx,
377 swpM.cy,
378 SWP_MOVE | SWP_SIZE);
379 WinSetWindowPos(WinWindowFromID(hwnd,UNDEL_DRVHDR),HWND_TOP,
380 swpD.x,
381 (swp.cy - swpM.cy) - (SysVal(SV_CYTITLEBAR) +
382 SysVal(SV_CYSIZEBORDER) + 8),
383 swpD.cx,
384 swpM.cy,
385 SWP_MOVE | SWP_SIZE);
386 WinSetWindowPos(WinWindowFromID(hwnd,UNDEL_DRIVELIST),HWND_TOP,
387 swpL.x,
388 SysVal(SV_CYSIZEBORDER),
389 swpL.cx,
390 swp.cy - (SysVal(SV_CYTITLEBAR) +
391 (SysVal(SV_CYSIZEBORDER) * 2) + 6),
392 SWP_MOVE | SWP_SIZE);
393 WinSetWindowPos(WinWindowFromID(hwnd,UNDEL_ENTRY),HWND_TOP,
394 swpM.x + swpM.cx + 4,
395 (swp.cy - swpM.cy) - (SysVal(SV_CYTITLEBAR) +
396 SysVal(SV_CYSIZEBORDER) + 8),
397 swp.cx - ((swpM.x + swpM.cx + 4) +
398 (SysVal(SV_CXSIZEBORDER) + 8)),
399 swpM.cy + 2,
400 SWP_MOVE | SWP_SIZE);
401 WinInvalidateRect(WinWindowFromID(hwnd,UNDEL_ENTRY),NULL,FALSE);
402 }
403 }
404 return 0;
405
406 case WM_COMMAND:
407 switch(SHORT1FROMMP(mp1)) {
408 case UNDEL_DEL:
409 case DID_OK:
410 if (changed || !listdone) {
411 Runtime_Error(pszSrcFile, __LINE__, "not done");
412 }
413 else {
414 sSelect = (USHORT)WinSendDlgItemMsg(hwnd,UNDEL_LISTBOX,
415 LM_QUERYSELECTION,MPFROMSHORT(LIT_FIRST),
416 MPVOID);
417 if(sSelect >= 0) {
418
419 FILE *fp;
420 CHAR s[CCHMAXPATH + 1];
421
422 DosForceDelete("\\FMUNDEL.CMD");
423 fp = xfopen("\\FMUNDEL.CMD","w",pszSrcFile,__LINE__);
424 if (fp) {
425 while(sSelect >= 0) {
426 *s = 0;
427 WinSendDlgItemMsg(hwnd,UNDEL_LISTBOX,LM_QUERYITEMTEXT,
428 MPFROM2SHORT(sSelect,CCHMAXPATH),MPFROMP(s));
429 if(SHORT1FROMMP(mp1) == UNDEL_DEL)
430 WinSendDlgItemMsg(hwnd,UNDEL_LISTBOX,LM_DELETEITEM,
431 MPFROM2SHORT(sSelect,0),MPVOID);
432 if(*s) {
433 if(SHORT1FROMMP(mp1) == DID_OK)
434 fprintf(fp,
435 "IF NOT EXIST \"%s\" UNDELETE.COM \"%s\" /A\n",
436 s,
437 s);
438 else
439 fprintf(fp,
440 "UNDELETE.COM \"%s\" /F /A\n",
441 s);
442 }
443 sSelect = (USHORT)WinSendDlgItemMsg(hwnd,
444 UNDEL_LISTBOX,
445 LM_QUERYSELECTION,
446 (SHORT1FROMMP(mp1) == DID_OK) ?
447 MPFROMSHORT(sSelect) :
448 MPFROMSHORT(LIT_FIRST),
449 MPVOID);
450 }
451 fprintf(fp,
452 "DEL \\FMUNDEL.CMD /F\n");
453 fclose(fp);
454 runemf2(WINDOWED | BACKGROUND | SEPARATE | INVISIBLE,
455 hwnd,
456 NULL,
457 NULL,
458 "%s /C \\FMUNDEL.CMD",
459 GetCmdSpec(FALSE));
460 }
461 }
462 if(SHORT1FROMMP(mp1) == DID_OK)
463 WinDismissDlg(hwnd,0);
464 {
465 CHAR s[33];
466
467 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
468 UNDEL_LISTBOX,
469 LM_QUERYITEMCOUNT,
470 MPVOID,MPVOID);
471 sprintf(s,
472 "%d",
473 sSelect);
474 WinSetDlgItemText(hwnd,
475 UNDEL_COUNT,
476 s);
477 }
478 }
479 break;
480
481 case DID_CANCEL:
482 if (!listdone)
483 Runtime_Error(pszSrcFile, __LINE__, "is busy");
484 else
485 WinDismissDlg(hwnd,0);
486 break;
487
488 case IDM_HELP:
489 saymsg(MB_ENTER | MB_ICONASTERISK,
490 hwnd,
491 GetPString(IDS_UNDELETEHELPTITLETEXT),
492 GetPString(IDS_UNDELETEHELPTEXT));
493 break;
494 }
495 return 0;
496
497 case WM_CLOSE:
498 if (!listdone) {
499 Runtime_Error(pszSrcFile, __LINE__, "not listdone");
500 return 0;
501 }
502 break;
503
504 case WM_DESTROY:
505 if(hptrIcon)
506 WinDestroyPointer(hptrIcon);
507 hptrIcon = (HPOINTER)0;
508 break;
509 }
510 return WinDefDlgProc(hwnd,msg,mp1,mp2);
511}
512
Note: See TracBrowser for help on using the repository browser.