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