Support for the new configuration file format and for link quality.
[olsrd.git] / gui / win32 / Main / MyDialog2.cpp
1 /*\r
2  * $Id: MyDialog2.cpp,v 1.4 2004/11/20 22:52:49 tlopatic Exp $\r
3  * Copyright (C) 2004 Thomas Lopatic (thomas@lopatic.de)\r
4  *\r
5  * This file is part of olsr.org.\r
6  *\r
7  * olsr.org is free software; you can redistribute it and/or modify\r
8  * it under the terms of the GNU General Public License as published by\r
9  * the Free Software Foundation; either version 2 of the License, or\r
10  * (at your option) any later version.\r
11  *\r
12  * olsr.org is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15  * GNU General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU General Public License\r
18  * along with olsr.org; if not, write to the Free Software\r
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
20  *\r
21  */\r
22 \r
23 #include "stdafx.h"\r
24 #include "Frontend.h"\r
25 #include "MyDialog2.h"\r
26 \r
27 #ifdef _DEBUG\r
28 #define new DEBUG_NEW\r
29 #undef THIS_FILE\r
30 static char THIS_FILE[] = __FILE__;\r
31 #endif\r
32 \r
33 #define MAXIF 100\r
34 \r
35 MyDialog2::MyDialog2(CWnd* pParent)\r
36         : CDialog(MyDialog2::IDD, pParent)\r
37 {\r
38         Conf = NULL;\r
39 \r
40         //{{AFX_DATA_INIT(MyDialog2)\r
41         //}}AFX_DATA_INIT\r
42 }\r
43 \r
44 void MyDialog2::SetDebugLevel(int Level)\r
45 {\r
46         char LevelText[2];\r
47 \r
48         LevelText[0] = (char)(Level + '0');\r
49         LevelText[1] = 0;\r
50 \r
51         DebugLevel = Level;\r
52         m_DebugLevel.SetPos(Level);\r
53         m_DebugLevelText.SetWindowText(LevelText);\r
54 }\r
55 \r
56 BOOL MyDialog2::Create(CWnd *Parent)\r
57 {\r
58         return CDialog::Create(MyDialog2::IDD, Parent);\r
59 }\r
60 \r
61 void MyDialog2::DoDataExchange(CDataExchange* pDX)\r
62 {\r
63         CDialog::DoDataExchange(pDX);\r
64         //{{AFX_DATA_MAP(MyDialog2)\r
65         DDX_Control(pDX, IDC_RADIO2, m_EtxRadio2);\r
66         DDX_Control(pDX, IDC_RADIO1, m_EtxRadio1);\r
67         DDX_Control(pDX, IDC_EDIT14, m_EtxWindowSize);\r
68         DDX_Control(pDX, IDC_CHECK4, m_EtxCheck);\r
69         DDX_Control(pDX, IDC_CHECK3, m_Ipv6Check);\r
70         DDX_Control(pDX, IDC_CHECK2, m_InternetCheck);\r
71         DDX_Control(pDX, IDC_CHECK1, m_HystCheck);\r
72         DDX_Control(pDX, IDC_EDIT13, m_HystThresholdHigh);\r
73         DDX_Control(pDX, IDC_EDIT12, m_HystThresholdLow);\r
74         DDX_Control(pDX, IDC_EDIT11, m_HystScaling);\r
75         DDX_Control(pDX, IDC_EDIT10, m_HnaHold);\r
76         DDX_Control(pDX, IDC_EDIT9, m_MidHold);\r
77         DDX_Control(pDX, IDC_EDIT7, m_PollInt);\r
78         DDX_Control(pDX, IDC_EDIT6, m_TcHold);\r
79         DDX_Control(pDX, IDC_EDIT5, m_TcInt);\r
80         DDX_Control(pDX, IDC_EDIT4, m_HnaInt);\r
81         DDX_Control(pDX, IDC_EDIT3, m_MidInt);\r
82         DDX_Control(pDX, IDC_EDIT2, m_HelloHold);\r
83         DDX_Control(pDX, IDC_EDIT1, m_HelloInt);\r
84         DDX_Control(pDX, IDC_LIST1, m_InterfaceList);\r
85         DDX_Control(pDX, IDC_TEXT1, m_DebugLevelText);\r
86         DDX_Control(pDX, IDC_SLIDER2, m_DebugLevel);\r
87         //}}AFX_DATA_MAP\r
88 }\r
89 \r
90 BEGIN_MESSAGE_MAP(MyDialog2, CDialog)\r
91         //{{AFX_MSG_MAP(MyDialog2)\r
92         ON_WM_HSCROLL()\r
93         ON_BN_CLICKED(IDC_CHECK1, OnHystCheck)\r
94         ON_BN_CLICKED(IDC_BUTTON4, OnOpenButton)\r
95         ON_BN_CLICKED(IDC_BUTTON5, OnSaveButton)\r
96         ON_BN_CLICKED(IDC_BUTTON1, OnResetButton)\r
97         ON_BN_CLICKED(IDC_CHECK4, OnEtxCheck)\r
98         ON_BN_CLICKED(IDC_RADIO1, OnEtxRadio1)\r
99         ON_BN_CLICKED(IDC_RADIO2, OnEtxRadio2)\r
100         ON_BN_CLICKED(IDOK, OnOK)\r
101         ON_BN_CLICKED(IDCANCEL, OnCancel)\r
102         ON_EN_KILLFOCUS(IDC_EDIT14, OnKillfocusEtxWinSize)\r
103         //}}AFX_MSG_MAP\r
104 END_MESSAGE_MAP()\r
105 \r
106 void MyDialog2::OnOK()\r
107 {\r
108 }\r
109 \r
110 void MyDialog2::OnCancel()\r
111 {\r
112 }\r
113 \r
114 void MyDialog2::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) \r
115 {\r
116         if (pScrollBar == (CScrollBar *)&m_DebugLevel)\r
117                 SetDebugLevel(m_DebugLevel.GetPos());\r
118         \r
119         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);\r
120 }\r
121 \r
122 void MyDialog2::Reset(void)\r
123 {\r
124         char PathName[MAX_PATH + 50];\r
125         char *Walker;\r
126         int i;\r
127 \r
128         ::GetModuleFileName(NULL, PathName, MAX_PATH);\r
129 \r
130         for (Walker = PathName; *Walker != 0; Walker++);\r
131         \r
132         while (*Walker != '\\')\r
133                 Walker--;\r
134 \r
135         lstrcpy(Walker + 1, "Default.olsr");\r
136 \r
137         if (OpenConfigFile(PathName) < 0)\r
138                 return;\r
139 \r
140         m_Ipv6Check.SetCheck(FALSE);\r
141 \r
142         if (Conf->interfaces == NULL)\r
143         {\r
144                 for (i = 0; i < Interfaces->GetSize(); i++)\r
145                 {\r
146                         if ((*IsWlan)[i] == "-")\r
147                                 m_InterfaceList.SetCheck(i, FALSE);\r
148 \r
149                         else\r
150                                 m_InterfaceList.SetCheck(i, TRUE);\r
151                 }\r
152         }\r
153 }\r
154 \r
155 BOOL MyDialog2::OnInitDialog() \r
156 {\r
157         int i;\r
158 \r
159         CDialog::OnInitDialog();\r
160         \r
161         m_DebugLevel.SetRange(0, 9, TRUE);\r
162 \r
163         m_InterfaceList.SetExtendedStyle(m_InterfaceList.GetExtendedStyle() |\r
164                         LVS_EX_CHECKBOXES);\r
165 \r
166         for (i = 0; i < Interfaces->GetSize(); i++)\r
167         {\r
168                 m_InterfaceList.InsertItem(i,\r
169                 (*Interfaces)[i] + " - " + (*Addresses)[i]);\r
170         }\r
171 \r
172         MIB_IPFORWARDROW IpFwdRow;\r
173 \r
174         if (::GetBestRoute(0, 0, &IpFwdRow) != NO_ERROR)\r
175                 m_InternetCheck.EnableWindow(FALSE);\r
176 \r
177         Reset();\r
178 \r
179         return TRUE;\r
180 }\r
181 \r
182 void MyDialog2::OnHystCheck() \r
183 {\r
184         BOOL EnaDis = m_HystCheck.GetCheck();\r
185 \r
186         m_HystThresholdLow.EnableWindow(EnaDis);\r
187         m_HystThresholdHigh.EnableWindow(EnaDis);\r
188         m_HystScaling.EnableWindow(EnaDis);\r
189 }\r
190 \r
191 void MyDialog2::OnEtxCheck() \r
192 {\r
193         BOOL EnaDis = m_EtxCheck.GetCheck();\r
194 \r
195         m_EtxWindowSize.EnableWindow(EnaDis);\r
196         m_EtxRadio1.EnableWindow(EnaDis);\r
197         m_EtxRadio2.EnableWindow(EnaDis);\r
198 }\r
199 \r
200 int MyDialog2::OpenConfigFile(CString PathName)\r
201 {\r
202         struct hna4_entry *Hna4;\r
203         struct olsr_if *Int, *PrevInt;\r
204         struct olsr_msg_params *MsgPar;\r
205         int NumInt = m_InterfaceList.GetItemCount();\r
206         int i;\r
207         CString IntName;\r
208         CString Conv;\r
209 \r
210         if (Conf != NULL)\r
211                 olsrd_free_cnf(Conf);\r
212 \r
213         Conf = olsrd_parse_cnf(PathName);\r
214 \r
215         if (Conf == NULL)\r
216                 return -1;\r
217 \r
218         for (i = 0; i < NumInt; i++)\r
219                 m_InterfaceList.SetCheck(i, FALSE);\r
220 \r
221         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
222         {\r
223                 IntName = Int->name;\r
224                 IntName.MakeUpper();\r
225 \r
226                 for (i = 0; i < NumInt; i++)\r
227                 {\r
228                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName)\r
229                                 m_InterfaceList.SetCheck(i, TRUE);\r
230                 }\r
231         }\r
232 \r
233         Int = Conf->interfaces;\r
234 \r
235         MsgPar = &Int->cnf->hello_params;\r
236 \r
237         Conv.Format("%.2f", MsgPar->emission_interval);\r
238         m_HelloInt.SetWindowText(Conv);\r
239 \r
240         Conv.Format("%.2f", MsgPar->validity_time);\r
241         m_HelloHold.SetWindowText(Conv);\r
242 \r
243         MsgPar = &Int->cnf->tc_params;\r
244         \r
245         Conv.Format("%.2f", MsgPar->emission_interval);\r
246         m_TcInt.SetWindowText(Conv);\r
247 \r
248         Conv.Format("%.2f", MsgPar->validity_time);\r
249         m_TcHold.SetWindowText(Conv);\r
250 \r
251         MsgPar = &Int->cnf->mid_params;\r
252         \r
253         Conv.Format("%.2f", MsgPar->emission_interval);\r
254         m_MidInt.SetWindowText(Conv);\r
255 \r
256         Conv.Format("%.2f", MsgPar->validity_time);\r
257         m_MidHold.SetWindowText(Conv);\r
258 \r
259         MsgPar = &Int->cnf->hna_params;\r
260         \r
261         Conv.Format("%.2f", MsgPar->emission_interval);\r
262         m_HnaInt.SetWindowText(Conv);\r
263 \r
264         Conv.Format("%.2f", MsgPar->validity_time);\r
265         m_HnaHold.SetWindowText(Conv);\r
266 \r
267         SetDebugLevel(Conf->debug_level);\r
268 \r
269         Conv.Format("%.2f", Conf->pollrate);\r
270         m_PollInt.SetWindowText(Conv);\r
271 \r
272         m_HystCheck.SetCheck(Conf->use_hysteresis);\r
273 \r
274         Conv.Format("%.2f", Conf->hysteresis_param.scaling);\r
275         m_HystScaling.SetWindowText(Conv);\r
276 \r
277         Conv.Format("%.2f", Conf->hysteresis_param.thr_high);\r
278         m_HystThresholdHigh.SetWindowText(Conv);\r
279 \r
280         Conv.Format("%.2f", Conf->hysteresis_param.thr_low);\r
281         m_HystThresholdLow.SetWindowText(Conv);\r
282 \r
283         OnHystCheck();\r
284 \r
285         m_EtxCheck.SetCheck(Conf->lq_level > 0);\r
286 \r
287         Conv.Format("%d", Conf->lq_wsize);\r
288         m_EtxWindowSize.SetWindowText(Conv);\r
289 \r
290         m_EtxRadio1.SetCheck(Conf->lq_level == 1);\r
291         m_EtxRadio2.SetCheck(Conf->lq_level == 2);\r
292 \r
293         m_InternetCheck.SetCheck(FALSE);\r
294 \r
295         for (Hna4 = Conf->hna4_entries; Hna4 != NULL; Hna4 = Hna4->next)\r
296                 if (Hna4->net.v4 == 0 && Hna4->netmask.v4 == 0 &&\r
297                         m_InternetCheck.IsWindowEnabled())\r
298                 m_InternetCheck.SetCheck(TRUE);\r
299 \r
300         PrevInt = NULL;\r
301 \r
302         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
303         {\r
304                 IntName = Int->name;\r
305 \r
306                 if (IntName.CompareNoCase("GUI") == 0)\r
307                         break;\r
308 \r
309                 PrevInt = Int;\r
310         }\r
311 \r
312         if (Int != NULL)\r
313         {\r
314                 if (PrevInt == NULL)\r
315                         Conf->interfaces = Int->next;\r
316 \r
317                 else\r
318                         PrevInt->next = Int->next;\r
319 \r
320                 olsrd_cnf_free(Int);\r
321         }\r
322 \r
323         return 0;\r
324 }\r
325 \r
326 static struct olsr_if *AddInterface(struct olsrd_config **Conf, CString Name)\r
327 {\r
328         struct olsr_if *Int;\r
329 \r
330         Int = (struct olsr_if *)olsrd_cnf_malloc(sizeof (struct olsr_if));\r
331 \r
332         if (Int == NULL)\r
333         {\r
334                 AfxMessageBox("Cannot allocate memory.");\r
335                 return NULL;\r
336         }\r
337 \r
338         Int->name = (char *)olsrd_cnf_malloc(Name.GetLength() + 1);\r
339 \r
340         if (Int->name == NULL)\r
341         {\r
342                 olsrd_cnf_free(Int);\r
343 \r
344                 AfxMessageBox("Cannot allocate memory.");\r
345                 return NULL;\r
346         }\r
347 \r
348         ::lstrcpy(Int->name, Name);\r
349 \r
350         Int->config = NULL;\r
351         Int->index = 0;\r
352         Int->configured = OLSR_FALSE;\r
353         Int->interf = NULL;\r
354 \r
355         Int->cnf = get_default_if_config();\r
356 \r
357         Int->next = (*Conf)->interfaces;\r
358         (*Conf)->interfaces = Int;\r
359 \r
360         return Int;\r
361 }\r
362 \r
363 int MyDialog2::SaveConfigFile(CString PathName, int Real)\r
364 {\r
365         struct olsr_if *Int, *PrevInt;\r
366         struct olsr_msg_params *MsgPar;\r
367         CString Conv;\r
368         struct hna4_entry *Hna4, *NewHna4, *PrevHna4;\r
369         int NumInt = m_InterfaceList.GetItemCount();\r
370         int i;\r
371         CString IntName, IntName2;\r
372         struct ipc_host *IpcHost;\r
373         unsigned int Local;\r
374 \r
375         PrevInt = NULL;\r
376 \r
377         // remove interfaces that we do not want\r
378         \r
379         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
380         {\r
381                 IntName = Int->name;\r
382                 IntName.MakeUpper();\r
383 \r
384                 for (i = 0; i < NumInt; i++)\r
385                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName)\r
386                                 break;\r
387 \r
388                 if (i == NumInt || !m_InterfaceList.GetCheck(i))\r
389                 {\r
390                         if (PrevInt != NULL)\r
391                                 PrevInt->next = Int->next;\r
392 \r
393                         else\r
394                                 Conf->interfaces = Int->next;\r
395                 }\r
396         }\r
397         \r
398         // add missing interfaces\r
399         \r
400         for (i = 0; i < NumInt; i++)\r
401         {\r
402                 if (!m_InterfaceList.GetCheck(i))\r
403                         continue;\r
404 \r
405                 IntName2 = m_InterfaceList.GetItemText(i, 0).Mid(0, 4);\r
406 \r
407                 for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
408                 {\r
409                         IntName = Int->name;\r
410                         IntName.MakeUpper();\r
411 \r
412                         if (IntName2 == IntName)\r
413                                 break;\r
414                 }\r
415 \r
416                 if (Int == NULL)\r
417                         AddInterface(&Conf, m_InterfaceList.GetItemText(i, 0).Mid(0, 4));\r
418         }\r
419 \r
420         // add dummy interface, if there aren't any real interfaces\r
421 \r
422         if (Conf->interfaces == NULL && Real != 0)\r
423                 AddInterface(&Conf, "GUI");\r
424 \r
425         // per-interface settings\r
426 \r
427         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
428         {\r
429                 MsgPar = &Int->cnf->hello_params;\r
430 \r
431                 m_HelloInt.GetWindowText(Conv);\r
432                 MsgPar->emission_interval = (float)atof(Conv);\r
433 \r
434                 m_HelloHold.GetWindowText(Conv);\r
435                 MsgPar->validity_time = (float)atof(Conv);\r
436 \r
437                 MsgPar = &Int->cnf->tc_params;\r
438 \r
439                 m_TcInt.GetWindowText(Conv);\r
440                 MsgPar->emission_interval = (float)atof(Conv);\r
441 \r
442                 m_TcHold.GetWindowText(Conv);\r
443                 MsgPar->validity_time = (float)atof(Conv);\r
444 \r
445                 MsgPar = &Int->cnf->mid_params;\r
446 \r
447                 m_MidInt.GetWindowText(Conv);\r
448                 MsgPar->emission_interval = (float)atof(Conv);\r
449 \r
450                 m_MidHold.GetWindowText(Conv);\r
451                 MsgPar->validity_time = (float)atof(Conv);\r
452 \r
453                 MsgPar = &Int->cnf->hna_params;\r
454 \r
455                 m_HnaInt.GetWindowText(Conv);\r
456                 MsgPar->emission_interval = (float)atof(Conv);\r
457 \r
458                 m_HnaHold.GetWindowText(Conv);\r
459                 MsgPar->validity_time = (float)atof(Conv);\r
460         }\r
461 \r
462         // global settings\r
463 \r
464         Conf->debug_level = DebugLevel;\r
465 \r
466         m_PollInt.GetWindowText(Conv);\r
467         Conf->pollrate = (float)atof(Conv);\r
468 \r
469         Conf->use_hysteresis = m_HystCheck.GetCheck() ? OLSR_TRUE : OLSR_FALSE;\r
470 \r
471         m_HystScaling.GetWindowText(Conv);\r
472         Conf->hysteresis_param.scaling = (float)atof(Conv);\r
473 \r
474         m_HystThresholdHigh.GetWindowText(Conv);\r
475         Conf->hysteresis_param.thr_high = (float)atof(Conv);\r
476 \r
477         m_HystThresholdLow.GetWindowText(Conv);\r
478         Conf->hysteresis_param.thr_low = (float)atof(Conv);\r
479 \r
480         if (!m_EtxCheck.GetCheck())\r
481                 Conf->lq_level = 0;\r
482 \r
483         else if (m_EtxRadio1.GetCheck())\r
484                 Conf->lq_level = 1;\r
485 \r
486         else\r
487                 Conf->lq_level = 2;\r
488 \r
489         m_EtxWindowSize.GetWindowText(Conv);\r
490         Conf->lq_wsize = atoi(Conv);\r
491 \r
492         PrevHna4 = NULL;\r
493 \r
494         // check for a default gateway HNA4 entry\r
495 \r
496         for (Hna4 = Conf->hna4_entries; Hna4 != NULL; Hna4 = Hna4->next)\r
497         {\r
498                 if (Hna4->net.v4 == 0 && Hna4->netmask.v4 == 0)\r
499                         break;\r
500 \r
501                 PrevHna4 = Hna4;\r
502         }\r
503 \r
504         // add default gateway HNA4 entry\r
505 \r
506         if (m_InternetCheck.GetCheck() && Hna4 == NULL)\r
507         {\r
508                 NewHna4 = (struct hna4_entry * )\r
509                         olsrd_cnf_malloc(sizeof (struct hna4_entry));\r
510 \r
511                 if (NewHna4 == NULL)\r
512                 {\r
513                         AfxMessageBox("Cannot allocate memory.");\r
514                         return -1;\r
515                 }\r
516 \r
517                 NewHna4->net.v4 = 0;\r
518                 NewHna4->netmask.v4 = 0;\r
519 \r
520                 NewHna4->next = Conf->hna4_entries;\r
521                 Conf->hna4_entries = NewHna4;\r
522         }\r
523 \r
524         // remove default gateway HNA4 entry\r
525 \r
526         if (!m_InternetCheck.GetCheck() && Hna4 != NULL)\r
527         {\r
528                 if (PrevHna4 == NULL)\r
529                         Conf->hna4_entries = Hna4->next;\r
530 \r
531                 else\r
532                         PrevHna4->next = Hna4->next;\r
533 \r
534                 olsrd_cnf_free(Hna4);\r
535         }\r
536 \r
537         Local = inet_addr("127.0.0.1");\r
538 \r
539         for (IpcHost = Conf->ipc_hosts; IpcHost != NULL; IpcHost = IpcHost->next)\r
540                 if (IpcHost->host.v4 == Local)\r
541                         break;\r
542 \r
543         if (IpcHost == NULL && Real == 0)\r
544         {\r
545                 IpcHost = (struct ipc_host *)\r
546                         olsrd_cnf_malloc(sizeof (struct ipc_host));\r
547 \r
548                 if (IpcHost == NULL)\r
549                 {\r
550                         AfxMessageBox("Cannot allocate memory.");\r
551                         return -1;\r
552                 }\r
553 \r
554                 IpcHost->host.v4 = Local;\r
555 \r
556                 IpcHost->next = Conf->ipc_hosts;\r
557                 Conf->ipc_hosts = IpcHost;\r
558 \r
559                 Conf->ipc_connections++;\r
560                 Conf->open_ipc = OLSR_TRUE;\r
561         }\r
562 \r
563         // write configuration file\r
564 \r
565         if (olsrd_write_cnf(Conf, PathName) < 0)\r
566                 return -1;\r
567 \r
568         return 0;\r
569 }\r
570 \r
571 void MyDialog2::OnSaveButton()\r
572 {\r
573         CFileDialog FileDialog(FALSE);\r
574         CString FileName = "Default.olsr";\r
575         CString PathName;\r
576 \r
577         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";\r
578         FileDialog.m_ofn.nFilterIndex = 1;\r
579 \r
580         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
581         FileDialog.m_ofn.nMaxFile = 500;\r
582 \r
583         if (FileDialog.DoModal() == IDOK)\r
584         {\r
585                 PathName = FileDialog.GetPathName();\r
586 \r
587                 if (SaveConfigFile(PathName, 1) < 0)\r
588                         AfxMessageBox("Cannot save configuration file '" + PathName + "'.");\r
589         }\r
590 \r
591         FileName.ReleaseBuffer();\r
592 }\r
593 \r
594 void MyDialog2::OnOpenButton()\r
595 {\r
596         CFileDialog FileDialog(TRUE);\r
597         CString FileName = "Default.olsr";\r
598         CString PathName;\r
599 \r
600         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";\r
601         FileDialog.m_ofn.nFilterIndex = 1;\r
602 \r
603         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
604         FileDialog.m_ofn.nMaxFile = 500;\r
605 \r
606         if (FileDialog.DoModal() == IDOK)\r
607         {\r
608                 PathName = FileDialog.GetPathName();\r
609 \r
610                 if (OpenConfigFile(PathName) < 0)\r
611                         AfxMessageBox("Cannot open configuration file '" + PathName + "'.");\r
612         }\r
613 \r
614         FileName.ReleaseBuffer();\r
615 }\r
616 \r
617 void MyDialog2::OnResetButton() \r
618 {\r
619         Reset();\r
620 }\r
621 \r
622 void MyDialog2::OnEtxRadio1() \r
623 {\r
624         m_EtxRadio2.SetCheck(FALSE);\r
625 }\r
626 \r
627 void MyDialog2::OnEtxRadio2() \r
628 {\r
629         m_EtxRadio1.SetCheck(FALSE);\r
630 }\r
631 \r
632 void MyDialog2::OnKillfocusEtxWinSize() \r
633 {\r
634         CString Conv;\r
635         int WinSize;\r
636 \r
637         m_EtxWindowSize.GetWindowText(Conv);\r
638         WinSize = atoi(Conv);\r
639 \r
640         if (WinSize < 3)\r
641                 WinSize = 3;\r
642 \r
643         else if (WinSize > 128)\r
644                 WinSize = 128;\r
645 \r
646         Conv.Format("%d", WinSize);\r
647         m_EtxWindowSize.SetWindowText(Conv);\r
648 }\r