source: trunk/dll/assoc.c@ 342

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

Use Runtime_Error

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.7 KB
Line 
1
2/***********************************************************************
3
4 $Id: assoc.c 342 2006-07-26 02:00:11Z 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 14 Jul 06 SHL Use Runtime_Error
11
12***********************************************************************/
13
14#define INCL_DOS
15#define INCL_WIN
16
17#include <os2.h>
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21#include <ctype.h>
22#include <share.h>
23#include "fm3dll.h"
24#include "fm3dlg.h"
25#include "fm3str.h"
26
27#pragma data_seg(DATA1)
28
29typedef struct {
30 CHAR mask[CCHMAXPATH];
31 CHAR cl[1001];
32 CHAR sig[CCHMAXPATH];
33 LONG offset;
34 ULONG flags;
35} ASSOC;
36
37typedef struct LINKASSOC {
38 CHAR *mask;
39 CHAR *cl;
40 CHAR *sig;
41 LONG offset;
42 ULONG flags;
43 struct LINKASSOC *prev;
44 struct LINKASSOC *next;
45} LINKASSOC;
46
47static LINKASSOC *asshead = NULL,*asstail = NULL;
48static BOOL assloaded = FALSE;
49
50static PSZ pszSrcFile = __FILE__;
51
52#pragma alloc_text(ASSOC2,free_commands,load_associations,save_associations)
53#pragma alloc_text(ASSOC2,ExecAssociation,AssocTextProc)
54
55MRESULT EXPENTRY AssocTextProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
56{
57 PFNWP oldproc = (PFNWP)WinQueryWindowPtr(hwnd,QWL_USER);
58 static BOOL emphasized = FALSE;
59
60 switch(msg) {
61 case DM_DRAGOVER:
62 if(!emphasized) {
63 emphasized = TRUE;
64 DrawTargetEmphasis(hwnd,emphasized);
65 }
66 if(AcceptOneDrop(mp1,mp2))
67 return MRFROM2SHORT(DOR_DROP,
68 DO_MOVE);
69 return MRFROM2SHORT(DOR_NEVERDROP,0);
70
71 case DM_DRAGLEAVE:
72 if(emphasized) {
73 emphasized = FALSE;
74 DrawTargetEmphasis(hwnd,emphasized);
75 }
76 break;
77
78 case DM_DROPHELP:
79 DropHelp(mp1,mp2,hwnd,GetPString(IDS_ASSOCDROPHELPTEXT));
80 return 0;
81
82 case DM_DROP:
83 {
84 char szFrom[CCHMAXPATH + 5];
85
86 if(emphasized) {
87 emphasized = FALSE;
88 DrawTargetEmphasis(hwnd,emphasized);
89 }
90 if(GetOneDrop(mp1,mp2,szFrom,CCHMAXPATH)) {
91 strcat(szFrom," %a");
92 WinSetWindowText(hwnd,szFrom);
93 }
94 }
95 return 0;
96 }
97 return (oldproc) ? oldproc(hwnd,msg,mp1,mp2) :
98 WinDefWindowProc(hwnd,msg,mp1,mp2);
99}
100
101
102VOID free_associations (VOID)
103{
104 LINKASSOC *info,*next;
105
106 info = asshead;
107 while(info) {
108 next = info->next;
109 free(info->mask);
110 free(info->cl);
111 if(info->sig)
112 free(info->sig);
113 free(info);
114 info = next;
115 }
116 asshead = asstail = NULL;
117}
118
119
120VOID load_associations (VOID)
121{
122 FILE *fp;
123 LINKASSOC *info;
124 CHAR cl[1024];
125 CHAR mask[CCHMAXPATH + 24];
126 CHAR sig[CCHMAXPATH + 24];
127 CHAR offset[72];
128 CHAR flags[72];
129
130 if(asshead)
131 free_associations();
132 assloaded = TRUE;
133 save_dir2(mask);
134 if(mask[strlen(mask) - 1] != '\\')
135 strcat(mask,"\\");
136 strcat(mask,"ASSOC.DAT");
137 fp = _fsopen(mask,"r",SH_DENYWR);
138 if (fp) {
139 while(!feof(fp)) {
140 if(!fgets(mask,CCHMAXPATH + 24,fp))
141 break;
142 mask[CCHMAXPATH] = 0;
143 bstripcr(mask);
144 if(!*mask || *mask == ';')
145 continue;
146 if(!fgets(cl,1024,fp) ||
147 !fgets(sig,CCHMAXPATH + 24,fp) ||
148 !fgets(offset,72,fp) ||
149 !fgets(flags,72,fp))
150 break; /* error! */
151 cl[1000] = 0;
152 sig[CCHMAXPATH] = 0;
153 offset[34] = 0;
154 flags[34] = 0;
155 bstripcr(cl);
156 bstripcr(sig);
157 bstripcr(offset);
158 bstripcr(flags);
159 if(!*cl)
160 continue;
161 info = xmallocz(sizeof(LINKASSOC),pszSrcFile,__LINE__);
162 if (info) {
163 info->cl = xstrdup(cl,pszSrcFile,__LINE__);
164 info->mask = xstrdup(mask,pszSrcFile,__LINE__);
165 if(*sig)
166 info->sig = xstrdup(sig,pszSrcFile,__LINE__);
167 info->offset = atol(offset);
168 info->flags = atol(flags);
169 if (!info->cl || !info->mask) {
170 if (info->cl)
171 free(info->cl);
172 if (info->mask)
173 free(info->mask);
174 free (info);
175 break;
176 }
177 if(!asshead)
178 asshead = info;
179 else {
180 asstail->next = info;
181 info->prev = asstail;
182 }
183 asstail = info;
184 }
185 }
186 fclose(fp);
187 }
188}
189
190
191VOID save_associations (VOID)
192{
193 LINKASSOC *info;
194 FILE *fp;
195 CHAR s[CCHMAXPATH + 14];
196
197 if(!assloaded || !asshead)
198 return;
199 info = asshead;
200#ifdef NEVER
201 while(info) {
202 next = info->next;
203 if(!strcmp("*",info->mask)) {
204 if(info != asshead) { /* already top record */
205 if(info->prev)
206 (info->prev)->next = info->next;
207 if(info->next)
208 (info->next)->prev = info->prev;
209 if(info == asstail)
210 asstail = info->prev;
211 info->next = asshead->next;
212 info->prev = NULL;
213 asshead = info;
214 }
215 }
216 info = next;
217 }
218#endif
219 save_dir2(s);
220 if(s[strlen(s) - 1] != '\\')
221 strcat(s,"\\");
222 strcat(s,"ASSOC.DAT");
223 fp = xfopen(s,"w",pszSrcFile,__LINE__);
224 if (fp) {
225 fputs(GetPString(IDS_ASSOCFILETEXT),fp);
226 info = asshead;
227 while(info) {
228 fprintf(fp,
229 ";\n%0.*s\n%0.1000s\n%0.*s\n%lu\n%lu\n",
230 CCHMAXPATH,
231 info->mask,
232 info->cl,
233 CCHMAXPATH,
234 (info->sig) ? info->sig : NullStr,
235 info->offset,
236 info->flags);
237 info = info->next;
238 }
239 fclose(fp);
240 }
241}
242
243
244#pragma alloc_text(ASSOC,add_association,kill_association,AssocDlgProc,EditAssociations)
245
246
247LINKASSOC * add_association (ASSOC *addme)
248{
249 LINKASSOC *info;
250
251 if(addme && *addme->cl && *addme->mask) {
252 info = asshead;
253 while(info) {
254 if(!stricmp(info->mask,addme->mask) &&
255 ((!info->sig && !*addme->sig) ||
256 (info->sig && !strcmp(addme->sig,info->sig))))
257 return NULL;
258 info = info->next;
259 }
260 if(!info) {
261 info = xmallocz(sizeof(LINKASSOC),pszSrcFile,__LINE__);
262 if(info) {
263 info->cl = xstrdup(addme->cl,pszSrcFile,__LINE__);
264 info->mask = xstrdup(addme->mask,pszSrcFile,__LINE__);
265 if(*addme->sig)
266 info->sig = xstrdup(addme->sig,pszSrcFile,__LINE__);
267 if(addme->offset)
268 info->offset = addme->offset;
269 if(addme->flags)
270 info->flags = addme->flags;
271 if(!info->cl || !info->mask) {
272 if(info->cl)
273 free(info->cl);
274 if(info->mask)
275 free(info->mask);
276 free(info);
277 }
278 else {
279 if(!asshead) /* only item in list */
280 asshead = asstail = info;
281 else {
282 if(asstail) { /* place at tail */
283 asstail->next = info;
284 info->prev = asstail;
285 }
286 asstail = info;
287 }
288 return info;
289 }
290 }
291 }
292 }
293 return NULL;
294}
295
296
297BOOL kill_association (ASSOC *killme)
298{
299 LINKASSOC *info;
300
301 if(killme && *killme->mask) {
302 info = asshead;
303 while(info) {
304 if(!stricmp(info->mask,killme->mask) &&
305 info->offset == killme->offset &&
306 (((!info->sig || !*info->sig) && !*killme->sig) ||
307 (info->sig && !strcmp(killme->sig,info->sig)))) {
308 if(info == asshead) {
309 asshead = info->next;
310 if(info == asstail)
311 asstail = info->prev;
312 }
313 else {
314 if(info->next)
315 (info->next)->prev = info->prev;
316 if(info->prev)
317 (info->prev)->next = info->next;
318 if(info == asstail)
319 asstail = info->prev;
320 }
321 free(info->cl);
322 free(info->mask);
323 if(info->sig)
324 free(info->sig);
325 free(info);
326 return TRUE;
327 }
328 info = info->next;
329 }
330 }
331 return FALSE;
332}
333
334
335INT ExecAssociation (HWND hwnd, CHAR *datafile)
336{
337 CHAR *file,sig[CCHMAXPATH],sigl[CCHMAXPATH],mask[CCHMAXPATH],*p;
338 FILE *fp;
339 BOOL didmatch,exclude;
340 ULONG offset;
341 LINKASSOC *info;
342
343 if(!assloaded)
344 load_associations();
345 if(!asshead)
346 return -1;
347 if(!datafile ||
348 !*datafile)
349 return -1;
350 file = strrchr(datafile,'\\');
351 if(!file)
352 file = strrchr(datafile,':');
353 if(file)
354 file++;
355 else
356 file = datafile;
357 info = asshead;
358 while(info) {
359 strcpy(mask,
360 info->mask);
361 p = strtok(mask,";");
362 while(p) {
363 if(*p == '/') {
364 p++;
365 exclude = TRUE;
366 }
367 else
368 exclude = FALSE;
369 didmatch = wildcard((strchr(p,'\\') ||
370 strchr(p,':')) ?
371 datafile :
372 file,
373 p,
374 FALSE);
375 if(exclude &&
376 didmatch)
377 didmatch = FALSE;
378 if(didmatch) {
379 if(info->sig &&
380 *info->sig) {
381 strcpy(sigl,
382 info->sig);
383 literal(sigl);
384 fp = _fsopen(datafile,"rb",SH_DENYNO);
385 if (fp) {
386 if(info->offset < 0L) {
387 fseek(fp,
388 0L,
389 SEEK_END);
390 offset = ftell(fp) + info->offset;
391 }
392 else
393 offset = info->offset;
394 fseek(fp,
395 offset,
396 SEEK_SET);
397 if(fread(sig,
398 1,
399 strlen(sigl),
400 fp) !=
401 strlen(sigl) ||
402 strncmp(sigl,
403 sig,
404 strlen(sigl)))
405 didmatch = FALSE;
406 fclose(fp);
407 }
408 }
409 }
410 if(didmatch) { /* got a match; do it... */
411
412 CHAR *list[2];
413 INT flags,rc;
414 BOOL dieafter = FALSE;
415
416 if(fAmAV2) {
417 if(stristr(info->cl,"AV2.EXE") ||
418 stristr(info->cl,"AV2.CMD") ||
419 stristr(info->cl,"<>"))
420 return -1;
421 }
422 if(!strcmp(info->cl,"<>")) {
423 OpenObject(datafile,
424 Default,
425 hwnd);
426 return 0;
427 }
428 list[0] = datafile;
429 list[1] = NULL;
430 flags = info->flags;
431 if(!(flags & FULLSCREEN))
432 flags |= WINDOWED;
433 if(flags & KEEP)
434 flags |= SEPARATEKEEP;
435 else
436 flags |= SEPARATE;
437 flags &= (~KEEP);
438 if(flags & DIEAFTER)
439 dieafter = TRUE;
440 flags &= (~DIEAFTER);
441 rc = ExecOnList(hwnd,
442 info->cl,
443 flags,
444 NULL,
445 list,
446 GetPString(IDS_EXECASSOCTITLETEXT));
447 if(rc != -1 &&
448 dieafter)
449 PostMsg((HWND)0,
450 WM_QUIT,
451 MPVOID,
452 MPVOID);
453 return rc;
454 }
455 p = strtok(0,";");
456 }
457 info = info->next;
458 }
459 return -1;
460}
461
462
463MRESULT EXPENTRY AssocDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
464{
465 LINKASSOC *info;
466 SHORT x;
467
468 switch(msg) {
469 case WM_INITDLG:
470 WinSendDlgItemMsg(hwnd,ASS_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
471 WinSendDlgItemMsg(hwnd,ASS_MASK,EM_SETTEXTLIMIT,
472 MPFROM2SHORT(CCHMAXPATH,0),MPVOID);
473 WinSendDlgItemMsg(hwnd,ASS_CL,EM_SETTEXTLIMIT,
474 MPFROM2SHORT(1000,0),MPVOID);
475 WinSendDlgItemMsg(hwnd,ASS_SIG,EM_SETTEXTLIMIT,
476 MPFROM2SHORT(CCHMAXPATH,0),MPVOID);
477 WinSendDlgItemMsg(hwnd,ASS_OFFSET,EM_SETTEXTLIMIT,
478 MPFROM2SHORT(34,0),MPVOID);
479 WinSetDlgItemText(hwnd,ASS_MASK,NullStr);
480 WinSetDlgItemText(hwnd,ASS_CL,NullStr);
481 WinSetDlgItemText(hwnd,ASS_SIG,NullStr);
482 WinSetDlgItemText(hwnd,ASS_OFFSET,"0");
483 WinCheckButton(hwnd,ASS_DEFAULT,TRUE);
484 WinCheckButton(hwnd,ASS_PROMPT,FALSE);
485 WinCheckButton(hwnd,ASS_KEEP,FALSE);
486 WinCheckButton(hwnd,ASS_DIEAFTER,FALSE);
487 PostMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
488 {
489 PFNWP oldproc;
490
491 oldproc = WinSubclassWindow(WinWindowFromID(hwnd,ASS_CL),
492 (PFNWP)AssocTextProc);
493 if(oldproc)
494 WinSetWindowPtr(WinWindowFromID(hwnd,ASS_CL),QWL_USER,(PVOID)oldproc);
495 }
496 break;
497
498 case UM_UNDO:
499 {
500 CHAR s[1002 + CCHMAXPATH + 6];
501
502 WinSendDlgItemMsg(hwnd,
503 ASS_LISTBOX,
504 LM_DELETEALL,
505 MPVOID,
506 MPVOID);
507 info = asshead;
508 while(info) {
509 sprintf(s,
510 "%-12s \x1a %-24s %s%s%s",
511 info->mask,
512 info->cl,
513 (info->sig && *info->sig) ?
514 "[" : NullStr,
515 (info->sig && *info->sig) ? info->sig : NullStr,
516 (info->sig && *info->sig) ? "]" : NullStr);
517 x = (SHORT)WinSendDlgItemMsg(hwnd,
518 ASS_LISTBOX,
519 LM_INSERTITEM,
520 MPFROM2SHORT(LIT_END,0),
521 MPFROMP(s));
522 if(x >= 0)
523 WinSendDlgItemMsg(hwnd,
524 ASS_LISTBOX,
525 LM_SETITEMHANDLE,
526 MPFROMSHORT(x),
527 MPFROMP(info));
528 info = info->next;
529 }
530 WinSendDlgItemMsg(hwnd,
531 ASS_LISTBOX,
532 LM_SELECTITEM,
533 MPFROMSHORT(0),
534 MPFROMSHORT(TRUE));
535 }
536 return 0;
537
538 case WM_CONTROL:
539 if(SHORT1FROMMP(mp1) == ASS_LISTBOX) {
540 switch(SHORT2FROMMP(mp1)) {
541 case LN_ENTER:
542 case LN_SELECT:
543 x = (SHORT)WinSendDlgItemMsg(hwnd,
544 ASS_LISTBOX,
545 LM_QUERYSELECTION,
546 MPFROMSHORT(LIT_FIRST),
547 MPVOID);
548 if(x >= 0) {
549
550 CHAR s[36];
551
552 info = (LINKASSOC *)WinSendDlgItemMsg(hwnd,
553 ASS_LISTBOX,
554 LM_QUERYITEMHANDLE,
555 MPFROMSHORT(x),
556 MPVOID);
557 if(!info) {
558 Runtime_Error(pszSrcFile, __LINE__, "Query item handle failed");
559 break;
560 }
561 WinSetDlgItemText(hwnd,ASS_MASK,info->mask);
562 WinSetDlgItemText(hwnd,ASS_CL,info->cl);
563 WinSetDlgItemText(hwnd,ASS_SIG,
564 (info->sig && *info->sig) ? info->sig : NullStr);
565 sprintf(s,"%ld",info->offset);
566 WinSetDlgItemText(hwnd,ASS_OFFSET,s);
567 if(!(info->flags & 1023))
568 WinCheckButton(hwnd,ASS_DEFAULT,TRUE);
569 else {
570 if(info->flags & FULLSCREEN)
571 WinCheckButton(hwnd,ASS_FULLSCREEN,TRUE);
572 else if(info->flags & MINIMIZED)
573 WinCheckButton(hwnd,ASS_MINIMIZED,TRUE);
574 else if(info->flags & MAXIMIZED)
575 WinCheckButton(hwnd,ASS_MAXIMIZED,TRUE);
576 else if(info->flags & INVISIBLE)
577 WinCheckButton(hwnd,ASS_INVISIBLE,TRUE);
578 }
579 WinCheckButton(hwnd,ASS_KEEP,((info->flags & KEEP) != 0));
580 WinCheckButton(hwnd,ASS_DIEAFTER,((info->flags & DIEAFTER) != 0));
581 WinCheckButton(hwnd,ASS_PROMPT,((info->flags & PROMPT) != 0));
582 {
583 CHAR env[1002];
584 ULONG size;
585
586 *env = 0;
587 size = sizeof(env) - 1;
588 if(PrfQueryProfileData(fmprof,
589 FM3Str,
590 info->cl,
591 env,
592 &size) &&
593 *env)
594 WinSetDlgItemText(hwnd,
595 ASS_ENVIRON,
596 env);
597 else
598 WinSetDlgItemText(hwnd,
599 ASS_ENVIRON,
600 NullStr);
601 }
602 }
603 break;
604 }
605 }
606 return 0;
607
608 case WM_COMMAND:
609 switch(SHORT1FROMMP(mp1)) {
610 case ASS_TOP:
611 x = (SHORT)WinSendDlgItemMsg(hwnd,ASS_LISTBOX,
612 LM_QUERYSELECTION,
613 MPFROMSHORT(LIT_FIRST),
614 MPVOID);
615 if(x >= 0) {
616 info = (LINKASSOC *)WinSendDlgItemMsg(hwnd,ASS_LISTBOX,
617 LM_QUERYITEMHANDLE,
618 MPFROMSHORT(x),
619 MPVOID);
620 if(info) {
621 if(info != asshead) {
622 if(info->prev)
623 info->prev->next = info->next;
624 if(info->next)
625 info->next->prev = info->prev;
626 if(info == asstail)
627 asstail = info->prev;
628 info->prev = NULL;
629 info->next = asshead;
630 asshead->prev = info;
631 asshead = info;
632 WinSendMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
633 }
634 }
635 }
636 break;
637
638 case ASS_FIND:
639 {
640 CHAR filename[CCHMAXPATH + 9];
641
642 *filename = 0;
643 if(insert_filename(hwnd,filename,2,FALSE) && *filename) {
644 strcat(filename," %a");
645 WinSetDlgItemText(hwnd,ASS_CL,filename);
646 }
647 }
648 break;
649
650 case DID_OK:
651 WinDismissDlg(hwnd,1);
652 break;
653
654 case DID_CANCEL:
655 WinDismissDlg(hwnd,0);
656 break;
657
658 case IDM_HELP:
659 if(hwndHelp)
660 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
661 MPFROM2SHORT(HELP_ASSOC,0),
662 MPFROMSHORT(HM_RESOURCEID));
663 break;
664
665 case ASS_ADD:
666 {
667 ASSOC temp;
668 CHAR dummy[34];
669
670 memset(&temp,0,sizeof(ASSOC));
671 WinQueryDlgItemText(hwnd,ASS_MASK,sizeof(temp.mask),temp.mask);
672 WinQueryDlgItemText(hwnd,ASS_CL,sizeof(temp.cl),temp.cl);
673 WinQueryDlgItemText(hwnd,ASS_SIG,sizeof(temp.sig),temp.sig);
674 rstrip(temp.sig);
675 if(*temp.sig) {
676 WinQueryDlgItemText(hwnd,ASS_OFFSET,sizeof(dummy),dummy);
677 temp.offset = atol(dummy);
678 }
679 bstrip(temp.mask);
680 bstrip(temp.cl);
681 if(WinQueryButtonCheckstate(hwnd,ASS_DEFAULT))
682 temp.flags = 0;
683 else if(WinQueryButtonCheckstate(hwnd,ASS_FULLSCREEN))
684 temp.flags = FULLSCREEN;
685 else if(WinQueryButtonCheckstate(hwnd,ASS_MINIMIZED))
686 temp.flags = MINIMIZED;
687 else if(WinQueryButtonCheckstate(hwnd,ASS_MAXIMIZED))
688 temp.flags = MAXIMIZED;
689 else if(WinQueryButtonCheckstate(hwnd,ASS_INVISIBLE))
690 temp.flags = INVISIBLE;
691 if(WinQueryButtonCheckstate(hwnd,ASS_KEEP))
692 temp.flags |= KEEP;
693 if(WinQueryButtonCheckstate(hwnd,ASS_DIEAFTER))
694 temp.flags |= DIEAFTER;
695 if(WinQueryButtonCheckstate(hwnd,ASS_PROMPT))
696 temp.flags |= PROMPT;
697 info = add_association(&temp);
698 if(!info)
699 Runtime_Error(pszSrcFile, __LINE__, "add_association");
700 else {
701
702 CHAR s[1002 + CCHMAXPATH + 6];
703
704 *s = 0;
705 WinQueryDlgItemText(hwnd,ASS_ENVIRON,1000,s);
706 bstripcr(s);
707 if(*s)
708 PrfWriteProfileString(fmprof,FM3Str,temp.cl,s);
709 sprintf(s,"%-12s \x1a %-24s %s%s%s",temp.mask,
710 temp.cl,(*temp.sig) ?
711 "[" : NullStr,(*temp.sig) ? temp.sig : NullStr,
712 (*temp.sig) ? "]" : NullStr);
713 x = (SHORT)WinSendDlgItemMsg(hwnd,
714 ASS_LISTBOX,
715 LM_INSERTITEM,
716 MPFROM2SHORT(LIT_END,0),
717 MPFROMP(s));
718 if(x >= 0) {
719 WinSendDlgItemMsg(hwnd,
720 ASS_LISTBOX,
721 LM_SETITEMHANDLE,
722 MPFROMSHORT(x),
723 MPFROMP(info));
724 WinSendDlgItemMsg(hwnd,
725 ASS_LISTBOX,
726 LM_SELECTITEM,
727 MPFROMSHORT(x),
728 MPFROMSHORT(TRUE));
729 }
730 save_associations();
731 }
732 }
733 break;
734
735 case ASS_DELETE:
736 {
737 ASSOC temp;
738 CHAR dummy[34];
739
740 memset(&temp,0,sizeof(ASSOC));
741 WinQueryDlgItemText(hwnd,ASS_MASK,sizeof(temp.mask),temp.mask);
742 WinQueryDlgItemText(hwnd,ASS_SIG,sizeof(temp.sig),temp.sig);
743 rstrip(temp.sig);
744 if(*temp.sig) {
745 WinQueryDlgItemText(hwnd,ASS_OFFSET,sizeof(dummy),dummy);
746 temp.offset = atol(dummy);
747 }
748 bstrip(temp.mask);
749 PrfWriteProfileData(fmprof,
750 FM3Str,
751 temp.mask,
752 NULL,
753 0L);
754 if(!kill_association(&temp))
755 Runtime_Error(pszSrcFile, __LINE__, "kill_association");
756 else {
757 x = (SHORT)WinSendDlgItemMsg(hwnd,
758 ASS_LISTBOX,
759 LM_QUERYSELECTION,
760 MPFROMSHORT(LIT_FIRST),
761 MPVOID);
762 if(x >= 0) {
763 WinSendDlgItemMsg(hwnd,
764 ASS_LISTBOX,
765 LM_DELETEITEM,
766 MPFROMSHORT(x),
767 MPVOID);
768 WinSendDlgItemMsg(hwnd,ASS_LISTBOX,LM_SELECTITEM,
769 MPFROMSHORT(LIT_NONE),
770 MPFROMSHORT(FALSE));
771 }
772 save_associations();
773 }
774 }
775 break;
776 }
777 return 0;
778 }
779 return WinDefDlgProc(hwnd,msg,mp1,mp2);
780}
781
782
783VOID EditAssociations (HWND hwnd)
784{
785 static CHAR stop = 0;
786
787 if(stop)
788 return;
789 stop++;
790 if(!assloaded)
791 load_associations();
792 WinDlgBox(HWND_DESKTOP,hwnd,AssocDlgProc,FM3ModHandle,ASS_FRAME,NULL);
793 stop = 0;
794}
Note: See TracBrowser for help on using the repository browser.