8989fa9cac2593cbbb364dcc4eb4d74cbfd65536
[olsrd.git] / gui / win32 / Main / MyDialog2.cpp
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #include "stdafx.h"
42 #include "Frontend.h"
43 #include "MyDialog2.h"
44
45 #ifdef _DEBUG
46 #define new DEBUG_NEW
47 #undef THIS_FILE
48 static char THIS_FILE[] = __FILE__;
49 #endif
50
51 #define MAXIF 100
52
53 MyDialog2::MyDialog2(CWnd* pParent)
54         : CDialog(MyDialog2::IDD, pParent)
55 {
56         Conf = NULL;
57
58         //{{AFX_DATA_INIT(MyDialog2)
59         //}}AFX_DATA_INIT
60 }
61
62 void MyDialog2::SetDebugLevel(int Level)
63 {
64         char LevelText[2];
65
66         LevelText[0] = (char)(Level + '0');
67         LevelText[1] = 0;
68
69         DebugLevel = Level;
70         m_DebugLevel.SetPos(Level);
71         m_DebugLevelText.SetWindowText(LevelText);
72 }
73
74 BOOL MyDialog2::Create(CWnd *Parent)
75 {
76         return CDialog::Create(MyDialog2::IDD, Parent);
77 }
78
79 void MyDialog2::DoDataExchange(CDataExchange* pDX)
80 {
81         CDialog::DoDataExchange(pDX);
82         //{{AFX_DATA_MAP(MyDialog2)
83         DDX_Control(pDX, IDC_COMBO1, m_TcRed);
84         DDX_Control(pDX, IDC_EDIT15, m_MprCov);
85         DDX_Control(pDX, IDC_RADIO2, m_EtxRadio2);
86         DDX_Control(pDX, IDC_RADIO1, m_EtxRadio1);
87 //      DDX_Control(pDX, IDC_EDIT14, m_EtxWindowSize);
88         DDX_Control(pDX, IDC_CHECK5, m_FishEyeCheck);
89         DDX_Control(pDX, IDC_CHECK4, m_EtxCheck);
90         DDX_Control(pDX, IDC_CHECK3, m_Ipv6Check);
91         DDX_Control(pDX, IDC_CHECK2, m_InternetCheck);
92         DDX_Control(pDX, IDC_CHECK1, m_HystCheck);
93         DDX_Control(pDX, IDC_EDIT13, m_HystThresholdHigh);
94         DDX_Control(pDX, IDC_EDIT12, m_HystThresholdLow);
95         DDX_Control(pDX, IDC_EDIT11, m_HystScaling);
96         DDX_Control(pDX, IDC_EDIT10, m_HnaHold);
97         DDX_Control(pDX, IDC_EDIT9, m_MidHold);
98         DDX_Control(pDX, IDC_EDIT7, m_PollInt);
99         DDX_Control(pDX, IDC_EDIT6, m_TcHold);
100         DDX_Control(pDX, IDC_EDIT5, m_TcInt);
101         DDX_Control(pDX, IDC_EDIT4, m_HnaInt);
102         DDX_Control(pDX, IDC_EDIT3, m_MidInt);
103         DDX_Control(pDX, IDC_EDIT2, m_HelloHold);
104         DDX_Control(pDX, IDC_EDIT1, m_HelloInt);
105         DDX_Control(pDX, IDC_LIST1, m_InterfaceList);
106         DDX_Control(pDX, IDC_TEXT1, m_DebugLevelText);
107         DDX_Control(pDX, IDC_SLIDER2, m_DebugLevel);
108         //}}AFX_DATA_MAP
109 }
110
111 BEGIN_MESSAGE_MAP(MyDialog2, CDialog)
112         //{{AFX_MSG_MAP(MyDialog2)
113         ON_WM_HSCROLL()
114         ON_BN_CLICKED(IDC_CHECK1, OnHystCheck)
115         ON_BN_CLICKED(IDC_BUTTON4, OnOpenButton)
116         ON_BN_CLICKED(IDC_BUTTON5, OnSaveButton)
117         ON_BN_CLICKED(IDC_BUTTON1, OnResetButton)
118         ON_BN_CLICKED(IDC_CHECK4, OnEtxCheck)
119         ON_BN_CLICKED(IDC_RADIO1, OnEtxRadio1)
120         ON_BN_CLICKED(IDC_RADIO2, OnEtxRadio2)
121         ON_BN_CLICKED(IDOK, OnOK)
122         ON_BN_CLICKED(IDCANCEL, OnCancel)
123 //      ON_EN_KILLFOCUS(IDC_EDIT14, OnKillfocusEtxWinSize)
124         //}}AFX_MSG_MAP
125 END_MESSAGE_MAP()
126
127 void MyDialog2::OnOK()
128 {
129 }
130
131 void MyDialog2::OnCancel()
132 {
133 }
134
135 void MyDialog2::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
136 {
137         if (pScrollBar == (CScrollBar *)&m_DebugLevel)
138                 SetDebugLevel(m_DebugLevel.GetPos());
139         
140         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
141 }
142
143 void MyDialog2::Reset(void)
144 {
145         char PathName[MAX_PATH + 50];
146         char *Walker;
147         int i;
148
149         ::GetModuleFileName(NULL, PathName, MAX_PATH);
150
151         for (Walker = PathName; *Walker != 0; Walker++);
152         
153         while (*Walker != '\\')
154                 Walker--;
155
156         lstrcpy(Walker + 1, "Default.olsr");
157
158         if (OpenConfigFile(PathName) < 0)
159                 return;
160
161         m_Ipv6Check.SetCheck(FALSE);
162
163         if (Conf->interfaces == NULL)
164         {
165                 for (i = 0; i < Interfaces->GetSize(); i++)
166                 {
167                         if ((*IsWlan)[i] == "-")
168                                 m_InterfaceList.SetCheck(i, FALSE);
169
170                         else
171                                 m_InterfaceList.SetCheck(i, TRUE);
172                 }
173         }
174 }
175
176 BOOL MyDialog2::OnInitDialog() 
177 {
178         int i;
179
180         CDialog::OnInitDialog();
181         
182         m_DebugLevel.SetRange(0, 9, TRUE);
183
184         m_InterfaceList.SetExtendedStyle(m_InterfaceList.GetExtendedStyle() |
185                         LVS_EX_CHECKBOXES);
186
187         for (i = 0; i < Interfaces->GetSize(); i++)
188         {
189                 m_InterfaceList.InsertItem(i,
190                 (*Interfaces)[i] + " - " + (*Addresses)[i]);
191         }
192
193         MIB_IPFORWARDROW IpFwdRow;
194
195         if (::GetBestRoute(0, 0, &IpFwdRow) != NO_ERROR)
196                 m_InternetCheck.EnableWindow(FALSE);
197
198         m_MprCov.LimitText(1);
199
200         Reset();
201
202         return TRUE;
203 }
204
205 void MyDialog2::OnHystCheck() 
206 {
207         BOOL EnaDis = m_HystCheck.GetCheck();
208
209         m_HystThresholdLow.EnableWindow(EnaDis);
210         m_HystThresholdHigh.EnableWindow(EnaDis);
211         m_HystScaling.EnableWindow(EnaDis);
212 }
213
214 void MyDialog2::OnEtxCheckWorker() 
215 {
216         BOOL EnaDis = m_EtxCheck.GetCheck();
217
218 #if 0\r
219         m_EtxWindowSize.EnableWindow(EnaDis);\r
220 #endif
221         m_EtxRadio1.EnableWindow(EnaDis);
222         m_EtxRadio2.EnableWindow(EnaDis);
223         m_FishEyeCheck.EnableWindow(EnaDis);
224 }
225
226 void MyDialog2::OnEtxCheck()
227 {
228         OnEtxCheckWorker();
229
230         AfxMessageBox("WARNING - This parameter breaks compliance with the OLSR standard.\n\n"
231                 "Make sure that either all nodes in your network use ETX or all nodes in your network don't use ETX.\n\n"
232                 "DO NOT MIX NODES WITH DIFFERENT ETX SETTINGS!");
233 }
234
235 int MyDialog2::OpenConfigFile(CString PathName)
236 {
237         struct ip_prefix_list *Hna;
238         struct olsr_if *Int, *PrevInt;
239         struct olsr_msg_params *MsgPar;
240         int NumInt = m_InterfaceList.GetItemCount();
241         int i;
242         CString IntName;
243         CString Conv;
244
245         if (Conf != NULL)
246                 olsrd_free_cnf(Conf);
247
248         Conf = olsrd_parse_cnf(PathName);
249
250         if (Conf == NULL)
251                 return -1;
252
253         for (i = 0; i < NumInt; i++)
254                 m_InterfaceList.SetCheck(i, FALSE);
255
256         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)
257         {
258                 IntName = Int->name;
259                 IntName.MakeUpper();
260
261                 for (i = 0; i < NumInt; i++)
262                 {
263                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName)
264                                 m_InterfaceList.SetCheck(i, TRUE);
265                 }
266         }
267
268         Int = Conf->interfaces;
269
270         MsgPar = &Int->cnf->hello_params;
271
272         Conv.Format("%.2f", MsgPar->emission_interval);
273         m_HelloInt.SetWindowText(Conv);
274
275         Conv.Format("%.2f", MsgPar->validity_time);
276         m_HelloHold.SetWindowText(Conv);
277
278         MsgPar = &Int->cnf->tc_params;
279         
280         Conv.Format("%.2f", MsgPar->emission_interval);
281         m_TcInt.SetWindowText(Conv);
282
283         Conv.Format("%.2f", MsgPar->validity_time);
284         m_TcHold.SetWindowText(Conv);
285
286         MsgPar = &Int->cnf->mid_params;
287         
288         Conv.Format("%.2f", MsgPar->emission_interval);
289         m_MidInt.SetWindowText(Conv);
290
291         Conv.Format("%.2f", MsgPar->validity_time);
292         m_MidHold.SetWindowText(Conv);
293
294         MsgPar = &Int->cnf->hna_params;
295         
296         Conv.Format("%.2f", MsgPar->emission_interval);
297         m_HnaInt.SetWindowText(Conv);
298
299         Conv.Format("%.2f", MsgPar->validity_time);
300         m_HnaHold.SetWindowText(Conv);
301
302         SetDebugLevel(Conf->debug_level);
303
304         Conv.Format("%.2f", Conf->pollrate);
305         m_PollInt.SetWindowText(Conv);
306
307         Conv.Format("%d", Conf->mpr_coverage);
308         m_MprCov.SetWindowText(Conv);
309
310         m_TcRed.SetCurSel(Conf->tc_redundancy);
311
312         m_HystCheck.SetCheck(Conf->use_hysteresis);
313
314         Conv.Format("%.2f", Conf->hysteresis_param.scaling);
315         m_HystScaling.SetWindowText(Conv);
316
317         Conv.Format("%.2f", Conf->hysteresis_param.thr_high);
318         m_HystThresholdHigh.SetWindowText(Conv);
319
320         Conv.Format("%.2f", Conf->hysteresis_param.thr_low);
321         m_HystThresholdLow.SetWindowText(Conv);
322
323         OnHystCheck();
324
325         m_FishEyeCheck.SetCheck(Conf->lq_fish > 0);
326
327         m_EtxCheck.SetCheck(Conf->lq_level > 0);
328
329 #if 0\r
330         Conv.Format("%d", Conf->lq_wsize);\r
331         m_EtxWindowSize.SetWindowText(Conv);\r
332 #endif
333
334         m_EtxRadio1.SetCheck(Conf->lq_level == 1);
335         m_EtxRadio2.SetCheck(Conf->lq_level == 0 || Conf->lq_level == 2);
336
337         OnEtxCheckWorker();
338
339         m_InternetCheck.SetCheck(FALSE);
340
341         for (Hna = Conf->hna_entries; Hna != NULL; Hna = Hna->next)
342                 if (0 == Hna->net.prefix_len &&
343                         m_InternetCheck.IsWindowEnabled())
344                 m_InternetCheck.SetCheck(TRUE);
345
346         PrevInt = NULL;
347
348         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)
349         {
350                 IntName = Int->name;
351
352                 if (IntName.CompareNoCase("GUI") == 0)
353                         break;
354
355                 PrevInt = Int;
356         }
357
358         if (Int != NULL)
359         {
360                 if (PrevInt == NULL)
361                         Conf->interfaces = Int->next;
362
363                 else
364                         PrevInt->next = Int->next;
365
366                 win32_olsrd_free(Int);
367         }
368
369         return 0;
370 }
371
372 static struct olsr_if *AddInterface(struct olsrd_config **Conf, CString Name)
373 {
374         struct olsr_if *Int;
375
376         Int = (struct olsr_if *)win32_olsrd_malloc(sizeof (struct olsr_if));
377
378         if (Int == NULL)
379         {
380                 AfxMessageBox("Cannot allocate memory.");
381                 return NULL;
382         }
383
384         Int->name = (char *)win32_olsrd_malloc(Name.GetLength() + 1);
385
386         if (Int->name == NULL)
387         {
388                 win32_olsrd_free(Int);
389
390                 AfxMessageBox("Cannot allocate memory.");
391                 return NULL;
392         }
393
394         ::lstrcpy(Int->name, Name);
395
396         Int->config = NULL;
397         Int->configured = OLSR_FALSE;
398         Int->interf = NULL;
399
400         Int->cnf = get_default_if_config();
401
402         Int->next = (*Conf)->interfaces;
403         (*Conf)->interfaces = Int;
404
405         return Int;
406 }
407
408 int MyDialog2::SaveConfigFile(CString PathName, int Real)
409 {
410         struct olsr_if *Int, *PrevInt;
411         struct olsr_msg_params *MsgPar;
412         CString Conv;
413         struct ip_prefix_list *Hna, *NewHna, *PrevHna;
414         int NumInt = m_InterfaceList.GetItemCount();
415         int i;
416         CString IntName, IntName2;
417         struct ip_prefix_list *IpcHost;
418         union olsr_ip_addr Local;
419
420         PrevInt = NULL;
421
422         // remove interfaces that we do not want
423         
424         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)
425         {
426                 IntName = Int->name;
427                 IntName.MakeUpper();
428
429                 for (i = 0; i < NumInt; i++)
430                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName)
431                                 break;
432
433                 if (i == NumInt || !m_InterfaceList.GetCheck(i))
434                 {
435                         if (PrevInt != NULL)
436                                 PrevInt->next = Int->next;
437
438                         else
439                                 Conf->interfaces = Int->next;
440                 }
441         }
442         
443         // add missing interfaces
444         
445         for (i = 0; i < NumInt; i++)
446         {
447                 if (!m_InterfaceList.GetCheck(i))
448                         continue;
449
450                 IntName2 = m_InterfaceList.GetItemText(i, 0).Mid(0, 4);
451
452                 for (Int = Conf->interfaces; Int != NULL; Int = Int->next)
453                 {
454                         IntName = Int->name;
455                         IntName.MakeUpper();
456
457                         if (IntName2 == IntName)
458                                 break;
459                 }
460
461                 if (Int == NULL)
462                         AddInterface(&Conf, m_InterfaceList.GetItemText(i, 0).Mid(0, 4));
463         }
464
465         // add dummy interface, if there aren't any real interfaces
466
467         if (Conf->interfaces == NULL && Real != 0)
468                 AddInterface(&Conf, "GUI");
469
470         // per-interface settings
471
472         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)
473         {
474                 MsgPar = &Int->cnf->hello_params;
475
476                 m_HelloInt.GetWindowText(Conv);
477                 MsgPar->emission_interval = (float)atof(Conv);
478
479                 m_HelloHold.GetWindowText(Conv);
480                 MsgPar->validity_time = (float)atof(Conv);
481
482                 MsgPar = &Int->cnf->tc_params;
483
484                 m_TcInt.GetWindowText(Conv);
485                 MsgPar->emission_interval = (float)atof(Conv);
486
487                 m_TcHold.GetWindowText(Conv);
488                 MsgPar->validity_time = (float)atof(Conv);
489
490                 MsgPar = &Int->cnf->mid_params;
491
492                 m_MidInt.GetWindowText(Conv);
493                 MsgPar->emission_interval = (float)atof(Conv);
494
495                 m_MidHold.GetWindowText(Conv);
496                 MsgPar->validity_time = (float)atof(Conv);
497
498                 MsgPar = &Int->cnf->hna_params;
499
500                 m_HnaInt.GetWindowText(Conv);
501                 MsgPar->emission_interval = (float)atof(Conv);
502
503                 m_HnaHold.GetWindowText(Conv);
504                 MsgPar->validity_time = (float)atof(Conv);
505         }
506
507         // global settings
508
509         Conf->debug_level = DebugLevel;
510
511         m_PollInt.GetWindowText(Conv);
512         Conf->pollrate = (float)atof(Conv);
513
514         Conf->tc_redundancy = (unsigned char)m_TcRed.GetCurSel();
515
516         m_MprCov.GetWindowText(Conv);
517         Conf->mpr_coverage = (unsigned char)atoi(Conv);
518
519         Conf->use_hysteresis = m_HystCheck.GetCheck() ? OLSR_TRUE : OLSR_FALSE;
520
521         m_HystScaling.GetWindowText(Conv);
522         Conf->hysteresis_param.scaling = (float)atof(Conv);
523
524         m_HystThresholdHigh.GetWindowText(Conv);
525         Conf->hysteresis_param.thr_high = (float)atof(Conv);
526
527         m_HystThresholdLow.GetWindowText(Conv);
528         Conf->hysteresis_param.thr_low = (float)atof(Conv);
529
530         if (!m_EtxCheck.GetCheck())
531                 Conf->lq_level = 0;
532
533         else if (m_EtxRadio1.GetCheck())
534                 Conf->lq_level = 1;
535
536         else
537                 Conf->lq_level = 2;
538
539         if (!m_FishEyeCheck.GetCheck())
540                 Conf->lq_fish = 0;
541
542         else
543                 Conf->lq_fish = 1;
544
545 #if 0\r
546         m_EtxWindowSize.GetWindowText(Conv);
547         Conf->lq_wsize = atoi(Conv);\r
548 #endif
549
550         PrevHna = NULL;
551
552         // check for a default gateway HNA4 entry
553
554         for (Hna = Conf->hna_entries; Hna != NULL; Hna = Hna->next)
555         {
556                 if (0 == Hna->net.prefix_len)
557                         break;
558
559                 PrevHna = Hna;
560         }
561
562         // add default gateway HNA entry
563
564         if (m_InternetCheck.GetCheck() && Hna == NULL)
565         {
566                 NewHna = (struct ip_prefix_list * )
567                         win32_olsrd_malloc(sizeof (struct ip_prefix_list));
568
569                 if (NewHna == NULL)
570                 {
571                         AfxMessageBox("Cannot allocate memory.");
572                         return -1;
573                 }
574
575                 memset(NewHna, 0, sizeof (struct ip_prefix_list));
576
577                 NewHna->next = Conf->hna_entries;
578                 Conf->hna_entries = NewHna;
579         }
580
581         // remove default gateway HNA4 entry
582
583         if (!m_InternetCheck.GetCheck() && Hna != NULL)
584         {
585                 if (PrevHna == NULL)
586                         Conf->hna_entries = Hna->next;
587
588                 else
589                         PrevHna->next = Hna->next;
590
591                 win32_olsrd_free(Hna);
592         }
593
594         if (AF_INET == Conf->ip_version)
595         {
596                 Local.v4.s_addr = ::inet_addr("127.0.0.1");
597         }
598         else
599         {
600                 memset(&Local, 0, sizeof(Local));
601                 Local.v6.u.Byte[15] = 1;
602         }
603
604         for (IpcHost = Conf->ipc_nets; IpcHost != NULL; IpcHost = IpcHost->next)
605                 if (0 == memcmp(&IpcHost->net.prefix, &Local, Conf->ipsize))
606                         break;
607
608         if (IpcHost == NULL && Real == 0)
609         {
610                 IpcHost = (struct ip_prefix_list *)
611                         win32_olsrd_malloc(sizeof (struct ip_prefix_list));
612
613                 if (IpcHost == NULL)
614                 {
615                         AfxMessageBox("Cannot allocate memory.");
616                         return -1;
617                 }
618
619                 IpcHost->net.prefix = Local;
620                 IpcHost->net.prefix_len = (olsr_u8_t)Conf->ipsize;
621
622                 IpcHost->next = Conf->ipc_nets;
623                 Conf->ipc_nets = IpcHost;
624
625                 Conf->ipc_connections++;
626         }
627
628         // write configuration file
629
630         if (olsrd_write_cnf(Conf, PathName) < 0)
631                 return -1;
632
633         return 0;
634 }
635
636 void MyDialog2::OnSaveButton()
637 {
638         CFileDialog FileDialog(FALSE);
639         CString FileName = "Default.olsr";
640         CString PathName;
641
642         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";
643         FileDialog.m_ofn.nFilterIndex = 1;
644
645         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);
646         FileDialog.m_ofn.nMaxFile = 500;
647
648         if (FileDialog.DoModal() == IDOK)
649         {
650                 PathName = FileDialog.GetPathName();
651
652                 if (SaveConfigFile(PathName, 1) < 0)
653                         AfxMessageBox("Cannot save configuration file '" + PathName + "'.");
654         }
655
656         FileName.ReleaseBuffer();
657 }
658
659 void MyDialog2::OnOpenButton()
660 {
661         CFileDialog FileDialog(TRUE);
662         CString FileName = "Default.olsr";
663         CString PathName;
664
665         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";
666         FileDialog.m_ofn.nFilterIndex = 1;
667
668         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);
669         FileDialog.m_ofn.nMaxFile = 500;
670
671         if (FileDialog.DoModal() == IDOK)
672         {
673                 PathName = FileDialog.GetPathName();
674
675                 if (OpenConfigFile(PathName) < 0)
676                         AfxMessageBox("Cannot open configuration file '" + PathName + "'.");
677         }
678
679         FileName.ReleaseBuffer();
680 }
681
682 void MyDialog2::OnResetButton() 
683 {
684         Reset();
685 }
686
687 void MyDialog2::OnEtxRadio1() 
688 {
689         m_EtxRadio2.SetCheck(FALSE);
690 }
691
692 void MyDialog2::OnEtxRadio2() 
693 {
694         m_EtxRadio1.SetCheck(FALSE);
695 }
696
697 #if 0\r
698 void MyDialog2::OnKillfocusEtxWinSize() 
699 {
700         CString Conv;
701         int WinSize;
702
703         m_EtxWindowSize.GetWindowText(Conv);
704         WinSize = atoi(Conv);
705
706         if (WinSize < 3)
707                 WinSize = 3;
708
709         else if (WinSize > 128)
710                 WinSize = 128;
711
712         Conv.Format("%d", WinSize);
713         m_EtxWindowSize.SetWindowText(Conv);
714 }
715 #endif\r