source: trunk/dll/undel.c@ 201

Last change on this file since 201 was 161, checked in by root, 20 years ago

Comments

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