win32: use #ifdef _WIN32
[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 #ifdef _WIN32
42
43 #include "stdafx.h"
44 #include "Frontend.h"
45 #include "MyDialog2.h"
46
47 #ifdef _DEBUG
48 #define new DEBUG_NEW
49 #undef THIS_FILE
50 static char THIS_FILE[] = __FILE__;
51 #endif /* _DEBUG */
52
53 #define MAXIF 100
54
55 MyDialog2::MyDialog2(CWnd* pParent)
56         : CDialog(MyDialog2::IDD, pParent)
57 {
58         Conf = NULL;
59
60         //{{AFX_DATA_INIT(MyDialog2)
61         //}}AFX_DATA_INIT\r
62 }
63
64 void MyDialog2::SetDebugLevel(int Level)
65 {
66         char LevelText[2];
67
68         LevelText[0] = (char)(Level + '0');
69         LevelText[1] = 0;
70
71         DebugLevel = Level;
72         m_DebugLevel.SetPos(Level);
73         m_DebugLevelText.SetWindowText(LevelText);
74 }
75
76 BOOL MyDialog2::Create(CWnd *Parent)
77 {
78         return CDialog::Create(MyDialog2::IDD, Parent);
79 }
80
81 void MyDialog2::DoDataExchange(CDataExchange* pDX)
82 {
83         CDialog::DoDataExchange(pDX);
84         //{{AFX_DATA_MAP(MyDialog2)
85         DDX_Control(pDX, IDC_COMBO3, m_LqAlgo);\r
86         DDX_Control(pDX, IDC_COMBO1, m_TcRed);\r
87         DDX_Control(pDX, IDC_EDIT15, m_MprCov);\r
88         DDX_Control(pDX, IDC_RADIO2, m_EtxRadio2);\r
89         DDX_Control(pDX, IDC_RADIO1, m_EtxRadio1);\r
90         DDX_Control(pDX, IDC_CHECK4, m_EtxCheck);\r
91         DDX_Control(pDX, IDC_CHECK3, m_Ipv6Check);\r
92         DDX_Control(pDX, IDC_CHECK2, m_InternetCheck);\r
93         DDX_Control(pDX, IDC_CHECK1, m_HystCheck);\r
94         DDX_Control(pDX, IDC_CHECK5, m_FishEyeCheck);\r
95         DDX_Control(pDX, IDC_EDIT13, m_HystThresholdHigh);\r
96         DDX_Control(pDX, IDC_EDIT12, m_HystThresholdLow);\r
97         DDX_Control(pDX, IDC_EDIT11, m_HystScaling);\r
98         DDX_Control(pDX, IDC_EDIT10, m_HnaHold);\r
99         DDX_Control(pDX, IDC_EDIT9, m_MidHold);\r
100         DDX_Control(pDX, IDC_EDIT7, m_PollInt);\r
101         DDX_Control(pDX, IDC_EDIT6, m_TcHold);\r
102         DDX_Control(pDX, IDC_EDIT5, m_TcInt);\r
103         DDX_Control(pDX, IDC_EDIT4, m_HnaInt);\r
104         DDX_Control(pDX, IDC_EDIT3, m_MidInt);\r
105         DDX_Control(pDX, IDC_EDIT2, m_HelloHold);\r
106         DDX_Control(pDX, IDC_EDIT1, m_HelloInt);\r
107         DDX_Control(pDX, IDC_LIST1, m_InterfaceList);\r
108         DDX_Control(pDX, IDC_TEXT1, m_DebugLevelText);\r
109         DDX_Control(pDX, IDC_SLIDER2, m_DebugLevel);\r
110         //}}AFX_DATA_MAP\r
111 }
112
113 BEGIN_MESSAGE_MAP(MyDialog2, CDialog)
114         //{{AFX_MSG_MAP(MyDialog2)
115         ON_WM_HSCROLL()
116         ON_BN_CLICKED(IDC_CHECK1, OnHystCheck)
117         ON_BN_CLICKED(IDC_BUTTON4, OnOpenButton)
118         ON_BN_CLICKED(IDC_BUTTON5, OnSaveButton)
119         ON_BN_CLICKED(IDC_BUTTON1, OnResetButton)
120         ON_BN_CLICKED(IDC_CHECK4, OnEtxCheck)
121         ON_BN_CLICKED(IDC_RADIO1, OnEtxRadio1)
122         ON_BN_CLICKED(IDC_RADIO2, OnEtxRadio2)
123         ON_BN_CLICKED(IDOK, OnOK)
124         ON_BN_CLICKED(IDCANCEL, OnCancel)
125         //}}AFX_MSG_MAP
126 END_MESSAGE_MAP()
127
128 void MyDialog2::OnOK()
129 {
130 }
131
132 void MyDialog2::OnCancel()
133 {
134 }
135
136 void MyDialog2::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
137 {
138         if (pScrollBar == (CScrollBar *)&m_DebugLevel)
139                 SetDebugLevel(m_DebugLevel.GetPos());
140         
141         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
142 }
143
144 void MyDialog2::Reset(void)
145 {
146         char PathName[MAX_PATH + 50];
147         char *Walker;
148         int i;
149
150         ::GetModuleFileName(NULL, PathName, MAX_PATH);
151
152         for (Walker = PathName; *Walker != 0; Walker++);
153         
154         while (*Walker != '\\')
155                 Walker--;
156
157         lstrcpy(Walker + 1, "Default.olsr");
158
159         if (OpenConfigFile(PathName) < 0)
160                 return;
161
162         m_Ipv6Check.SetCheck(FALSE);
163
164         if (Conf->interfaces == NULL)
165         {
166                 for (i = 0; i < Interfaces->GetSize(); i++)
167                 {
168                         if ((*IsWlan)[i] == "-")
169                                 m_InterfaceList.SetCheck(i, FALSE);
170
171                         else
172                                 m_InterfaceList.SetCheck(i, TRUE);
173                 }
174         }
175 }
176
177 BOOL MyDialog2::OnInitDialog() 
178 {
179         int i;
180
181         CDialog::OnInitDialog();
182         
183         m_DebugLevel.SetRange(0, 9, TRUE);
184
185         m_InterfaceList.SetExtendedStyle(m_InterfaceList.GetExtendedStyle() |
186                         LVS_EX_CHECKBOXES);
187
188         for (i = 0; i < Interfaces->GetSize(); i++)
189         {
190                 m_InterfaceList.InsertItem(i,
191                 (*Interfaces)[i] + " - " + (*Addresses)[i]);
192         }
193
194         MIB_IPFORWARDROW IpFwdRow;
195
196         if (::GetBestRoute(0, 0, &IpFwdRow) != NO_ERROR)
197                 m_InternetCheck.EnableWindow(FALSE);
198
199         m_MprCov.LimitText(1);
200
201         Reset();
202
203         return TRUE;
204 }
205
206 void MyDialog2::OnHystCheck() 
207 {
208         BOOL EnaDis = m_HystCheck.GetCheck();
209
210         m_HystThresholdLow.EnableWindow(EnaDis);
211         m_HystThresholdHigh.EnableWindow(EnaDis);
212         m_HystScaling.EnableWindow(EnaDis);
213 }
214
215 void MyDialog2::OnEtxCheckWorker() 
216 {
217         BOOL EnaDis = m_EtxCheck.GetCheck();
218
219         m_EtxRadio1.EnableWindow(EnaDis);
220         m_EtxRadio2.EnableWindow(EnaDis);
221         m_FishEyeCheck.EnableWindow(EnaDis);
222 }
223
224 void MyDialog2::OnEtxCheck()
225 {
226         OnEtxCheckWorker();
227
228         AfxMessageBox("WARNING - This parameter breaks compliance with the OLSR standard.\n\n"
229                 "Make sure that either all nodes in your network use ETX or all nodes in your network don't use ETX.\n\n"
230                 "DO NOT MIX NODES WITH DIFFERENT ETX SETTINGS!");
231 }
232
233 int MyDialog2::OpenConfigFile(CString PathName)
234 {
235         struct ip_prefix_list *Hna;
236         struct olsr_if *Int, *PrevInt;
237         struct olsr_msg_params *MsgPar;
238         int NumInt = m_InterfaceList.GetItemCount();
239         int i;
240         CString IntName;
241         CString Conv;
242
243         if (Conf != NULL)
244                 olsrd_free_cnf(Conf);
245
246         if (olsrd_parse_cnf(PathName) < 0)
247                 return -1;
248
249         Conf = olsr_cnf;
250
251         for (i = 0; i < NumInt; i++)
252                 m_InterfaceList.SetCheck(i, FALSE);
253
254         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)
255         {
256                 IntName = Int->name;
257                 IntName.MakeUpper();
258
259                 for (i = 0; i < NumInt; i++)
260                 {
261                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName)
262                                 m_InterfaceList.SetCheck(i, TRUE);
263                 }
264         }
265
266         Int = Conf->interfaces;
267
268         MsgPar = &Int->cnf->hello_params;
269
270         Conv.Format("%.2f", MsgPar->emission_interval);
271         m_HelloInt.SetWindowText(Conv);
272
273         Conv.Format("%.2f", MsgPar->validity_time);
274         m_HelloHold.SetWindowText(Conv);
275
276         MsgPar = &Int->cnf->tc_params;
277         
278         Conv.Format("%.2f", MsgPar->emission_interval);
279         m_TcInt.SetWindowText(Conv);
280
281         Conv.Format("%.2f", MsgPar->validity_time);
282         m_TcHold.SetWindowText(Conv);
283
284         MsgPar = &Int->cnf->mid_params;
285         
286         Conv.Format("%.2f", MsgPar->emission_interval);
287         m_MidInt.SetWindowText(Conv);
288
289         Conv.Format("%.2f", MsgPar->validity_time);
290         m_MidHold.SetWindowText(Conv);
291
292         MsgPar = &Int->cnf->hna_params;
293         
294         Conv.Format("%.2f", MsgPar->emission_interval);
295         m_HnaInt.SetWindowText(Conv);
296
297         Conv.Format("%.2f", MsgPar->validity_time);
298         m_HnaHold.SetWindowText(Conv);
299
300         SetDebugLevel(Conf->debug_level);
301
302         Conv.Format("%.2f", Conf->pollrate);
303         m_PollInt.SetWindowText(Conv);
304
305         Conv.Format("%d", Conf->mpr_coverage);
306         m_MprCov.SetWindowText(Conv);
307
308         m_TcRed.SetCurSel(Conf->tc_redundancy);\r
309 \r
310         m_LqAlgo.SetCurSel(m_LqAlgo.FindStringExact(-1, Conf->lq_algorithm));
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 = 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         i = m_LqAlgo.GetCurSel();\r
517         Conf->lq_algorithm = NULL;\r
518         if (0 <= i)\r
519         {\r
520                 CString str;\r
521                 m_LqAlgo.GetLBText(i, str);\r
522                 Conf->lq_algorithm = strdup((LPCTSTR)str);\r
523         }\r
524 \r
525         m_MprCov.GetWindowText(Conv);
526         Conf->mpr_coverage = (unsigned char)atoi(Conv);
527
528         Conf->use_hysteresis = m_HystCheck.GetCheck() ? true : false;
529
530         m_HystScaling.GetWindowText(Conv);
531         Conf->hysteresis_param.scaling = (float)atof(Conv);
532
533         m_HystThresholdHigh.GetWindowText(Conv);
534         Conf->hysteresis_param.thr_high = (float)atof(Conv);
535
536         m_HystThresholdLow.GetWindowText(Conv);
537         Conf->hysteresis_param.thr_low = (float)atof(Conv);
538
539         if (!m_EtxCheck.GetCheck())
540                 Conf->lq_level = 0;
541
542         else if (m_EtxRadio1.GetCheck())
543                 Conf->lq_level = 1;
544
545         else
546                 Conf->lq_level = 2;
547
548         if (!m_FishEyeCheck.GetCheck())
549                 Conf->lq_fish = 0;
550
551         else
552                 Conf->lq_fish = 1;
553
554         PrevHna = NULL;
555
556         // check for a default gateway HNA4 entry
557
558         for (Hna = Conf->hna_entries; Hna != NULL; Hna = Hna->next)
559         {
560                 if (0 == Hna->net.prefix_len)
561                         break;
562
563                 PrevHna = Hna;
564         }
565
566         // add default gateway HNA entry
567
568         if (m_InternetCheck.GetCheck() && Hna == NULL)
569         {
570                 NewHna = (struct ip_prefix_list * )
571                         win32_olsrd_malloc(sizeof (struct ip_prefix_list));
572
573                 if (NewHna == NULL)
574                 {
575                         AfxMessageBox("Cannot allocate memory.");
576                         return -1;
577                 }
578
579                 memset(NewHna, 0, sizeof (struct ip_prefix_list));
580
581                 NewHna->next = Conf->hna_entries;
582                 Conf->hna_entries = NewHna;
583         }
584
585         // remove default gateway HNA4 entry
586
587         if (!m_InternetCheck.GetCheck() && Hna != NULL)
588         {
589                 if (PrevHna == NULL)
590                         Conf->hna_entries = Hna->next;
591
592                 else
593                         PrevHna->next = Hna->next;
594
595                 win32_olsrd_free(Hna);
596         }
597
598         if (AF_INET == Conf->ip_version)
599         {
600                 Local.v4.s_addr = ::inet_addr("127.0.0.1");
601         }
602         else
603         {
604                 memset(&Local, 0, sizeof(Local));
605                 Local.v6.u.Byte[15] = 1;
606         }
607
608         for (IpcHost = Conf->ipc_nets; IpcHost != NULL; IpcHost = IpcHost->next)
609                 if (0 == memcmp(&IpcHost->net.prefix, &Local, Conf->ipsize))
610                         break;
611
612         if (IpcHost == NULL && Real == 0)
613         {
614                 IpcHost = (struct ip_prefix_list *)
615                         win32_olsrd_malloc(sizeof (struct ip_prefix_list));
616
617                 if (IpcHost == NULL)
618                 {
619                         AfxMessageBox("Cannot allocate memory.");
620                         return -1;
621                 }
622
623                 IpcHost->net.prefix = Local;
624                 IpcHost->net.prefix_len = (uint8_t)Conf->ipsize;
625
626                 IpcHost->next = Conf->ipc_nets;
627                 Conf->ipc_nets = IpcHost;
628
629                 Conf->ipc_connections++;
630         }
631
632         // write configuration file
633
634         if (olsrd_write_cnf(Conf, PathName) < 0)
635                 return -1;
636
637         return 0;
638 }
639
640 void MyDialog2::OnSaveButton()
641 {
642         CFileDialog FileDialog(FALSE);
643         CString FileName = "Default.olsr";
644         CString PathName;
645
646         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";
647         FileDialog.m_ofn.nFilterIndex = 1;
648
649         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);
650         FileDialog.m_ofn.nMaxFile = 500;
651
652         if (FileDialog.DoModal() == IDOK)
653         {
654                 PathName = FileDialog.GetPathName();
655
656                 if (SaveConfigFile(PathName, 1) < 0)
657                         AfxMessageBox("Cannot save configuration file '" + PathName + "'.");
658         }
659
660         FileName.ReleaseBuffer();
661 }
662
663 void MyDialog2::OnOpenButton()
664 {
665         CFileDialog FileDialog(TRUE);
666         CString FileName = "Default.olsr";
667         CString PathName;
668
669         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";
670         FileDialog.m_ofn.nFilterIndex = 1;
671
672         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);
673         FileDialog.m_ofn.nMaxFile = 500;
674
675         if (FileDialog.DoModal() == IDOK)
676         {
677                 PathName = FileDialog.GetPathName();
678
679                 if (OpenConfigFile(PathName) < 0)
680                         AfxMessageBox("Cannot open configuration file '" + PathName + "'.");
681         }
682
683         FileName.ReleaseBuffer();
684 }
685
686 void MyDialog2::OnResetButton() 
687 {
688         Reset();
689 }
690
691 void MyDialog2::OnEtxRadio1() 
692 {
693         m_EtxRadio2.SetCheck(FALSE);
694 }
695
696 void MyDialog2::OnEtxRadio2() 
697 {
698         m_EtxRadio1.SetCheck(FALSE);
699 }
700
701 #endif /* _WIN32 */