source: trunk/dll/assoc.c@ 433

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

Use xfgets, xfgets_bstripcr

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