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