source: trunk/dll/undel.c@ 2

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