source: trunk/dll/undel.c@ 144

Last change on this file since 144 was 123, checked in by root, 21 years ago

Rework lstrip/rstrip usage

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