Added new plugins to the Windows distribution. Modified the default
[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.8 2005/03/02 00:13:23 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_COMBO1, m_TcRed);\r
85         DDX_Control(pDX, IDC_EDIT15, m_MprCov);\r
86         DDX_Control(pDX, IDC_RADIO2, m_EtxRadio2);\r
87         DDX_Control(pDX, IDC_RADIO1, m_EtxRadio1);\r
88         DDX_Control(pDX, IDC_EDIT14, m_EtxWindowSize);\r
89         DDX_Control(pDX, IDC_CHECK4, m_EtxCheck);\r
90         DDX_Control(pDX, IDC_CHECK3, m_Ipv6Check);\r
91         DDX_Control(pDX, IDC_CHECK2, m_InternetCheck);\r
92         DDX_Control(pDX, IDC_CHECK1, m_HystCheck);\r
93         DDX_Control(pDX, IDC_EDIT13, m_HystThresholdHigh);\r
94         DDX_Control(pDX, IDC_EDIT12, m_HystThresholdLow);\r
95         DDX_Control(pDX, IDC_EDIT11, m_HystScaling);\r
96         DDX_Control(pDX, IDC_EDIT10, m_HnaHold);\r
97         DDX_Control(pDX, IDC_EDIT9, m_MidHold);\r
98         DDX_Control(pDX, IDC_EDIT7, m_PollInt);\r
99         DDX_Control(pDX, IDC_EDIT6, m_TcHold);\r
100         DDX_Control(pDX, IDC_EDIT5, m_TcInt);\r
101         DDX_Control(pDX, IDC_EDIT4, m_HnaInt);\r
102         DDX_Control(pDX, IDC_EDIT3, m_MidInt);\r
103         DDX_Control(pDX, IDC_EDIT2, m_HelloHold);\r
104         DDX_Control(pDX, IDC_EDIT1, m_HelloInt);\r
105         DDX_Control(pDX, IDC_LIST1, m_InterfaceList);\r
106         DDX_Control(pDX, IDC_TEXT1, m_DebugLevelText);\r
107         DDX_Control(pDX, IDC_SLIDER2, m_DebugLevel);\r
108         //}}AFX_DATA_MAP\r
109 }\r
110 \r
111 BEGIN_MESSAGE_MAP(MyDialog2, CDialog)\r
112         //{{AFX_MSG_MAP(MyDialog2)\r
113         ON_WM_HSCROLL()\r
114         ON_BN_CLICKED(IDC_CHECK1, OnHystCheck)\r
115         ON_BN_CLICKED(IDC_BUTTON4, OnOpenButton)\r
116         ON_BN_CLICKED(IDC_BUTTON5, OnSaveButton)\r
117         ON_BN_CLICKED(IDC_BUTTON1, OnResetButton)\r
118         ON_BN_CLICKED(IDC_CHECK4, OnEtxCheck)\r
119         ON_BN_CLICKED(IDC_RADIO1, OnEtxRadio1)\r
120         ON_BN_CLICKED(IDC_RADIO2, OnEtxRadio2)\r
121         ON_BN_CLICKED(IDOK, OnOK)\r
122         ON_BN_CLICKED(IDCANCEL, OnCancel)\r
123         ON_EN_KILLFOCUS(IDC_EDIT14, OnKillfocusEtxWinSize)\r
124         //}}AFX_MSG_MAP\r
125 END_MESSAGE_MAP()\r
126 \r
127 void MyDialog2::OnOK()\r
128 {\r
129 }\r
130 \r
131 void MyDialog2::OnCancel()\r
132 {\r
133 }\r
134 \r
135 void MyDialog2::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) \r
136 {\r
137         if (pScrollBar == (CScrollBar *)&m_DebugLevel)\r
138                 SetDebugLevel(m_DebugLevel.GetPos());\r
139         \r
140         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);\r
141 }\r
142 \r
143 void MyDialog2::Reset(void)\r
144 {\r
145         char PathName[MAX_PATH + 50];\r
146         char *Walker;\r
147         int i;\r
148 \r
149         ::GetModuleFileName(NULL, PathName, MAX_PATH);\r
150 \r
151         for (Walker = PathName; *Walker != 0; Walker++);\r
152         \r
153         while (*Walker != '\\')\r
154                 Walker--;\r
155 \r
156         lstrcpy(Walker + 1, "Default.olsr");\r
157 \r
158         if (OpenConfigFile(PathName) < 0)\r
159                 return;\r
160 \r
161         m_Ipv6Check.SetCheck(FALSE);\r
162 \r
163         if (Conf->interfaces == NULL)\r
164         {\r
165                 for (i = 0; i < Interfaces->GetSize(); i++)\r
166                 {\r
167                         if ((*IsWlan)[i] == "-")\r
168                                 m_InterfaceList.SetCheck(i, FALSE);\r
169 \r
170                         else\r
171                                 m_InterfaceList.SetCheck(i, TRUE);\r
172                 }\r
173         }\r
174 }\r
175 \r
176 BOOL MyDialog2::OnInitDialog() \r
177 {\r
178         int i;\r
179 \r
180         CDialog::OnInitDialog();\r
181         \r
182         m_DebugLevel.SetRange(0, 9, TRUE);\r
183 \r
184         m_InterfaceList.SetExtendedStyle(m_InterfaceList.GetExtendedStyle() |\r
185                         LVS_EX_CHECKBOXES);\r
186 \r
187         for (i = 0; i < Interfaces->GetSize(); i++)\r
188         {\r
189                 m_InterfaceList.InsertItem(i,\r
190                 (*Interfaces)[i] + " - " + (*Addresses)[i]);\r
191         }\r
192 \r
193         MIB_IPFORWARDROW IpFwdRow;\r
194 \r
195         if (::GetBestRoute(0, 0, &IpFwdRow) != NO_ERROR)\r
196                 m_InternetCheck.EnableWindow(FALSE);\r
197 \r
198         m_MprCov.LimitText(1);\r
199 \r
200         Reset();\r
201 \r
202         return TRUE;\r
203 }\r
204 \r
205 void MyDialog2::OnHystCheck() \r
206 {\r
207         BOOL EnaDis = m_HystCheck.GetCheck();\r
208 \r
209         m_HystThresholdLow.EnableWindow(EnaDis);\r
210         m_HystThresholdHigh.EnableWindow(EnaDis);\r
211         m_HystScaling.EnableWindow(EnaDis);\r
212 }\r
213 \r
214 void MyDialog2::OnEtxCheckWorker() \r
215 {\r
216         BOOL EnaDis = m_EtxCheck.GetCheck();\r
217 \r
218         m_EtxWindowSize.EnableWindow(EnaDis);\r
219         m_EtxRadio1.EnableWindow(EnaDis);\r
220         m_EtxRadio2.EnableWindow(EnaDis);\r
221 }\r
222 \r
223 void MyDialog2::OnEtxCheck()\r
224 {\r
225         OnEtxCheckWorker();\r
226 \r
227         AfxMessageBox("WARNING - This parameter breaks compliance with the OLSR standard.\n\n"\r
228                 "Make sure that either all nodes in your network use ETX or all nodes in your network don't use ETX.\n\n"\r
229                 "DO NOT MIX NODES WITH DIFFERENT ETX SETTINGS!");\r
230 }\r
231 \r
232 int MyDialog2::OpenConfigFile(CString PathName)\r
233 {\r
234         struct hna4_entry *Hna4;\r
235         struct olsr_if *Int, *PrevInt;\r
236         struct olsr_msg_params *MsgPar;\r
237         int NumInt = m_InterfaceList.GetItemCount();\r
238         int i;\r
239         CString IntName;\r
240         CString Conv;\r
241 \r
242         if (Conf != NULL)\r
243                 olsrd_free_cnf(Conf);\r
244 \r
245         Conf = olsrd_parse_cnf(PathName);\r
246 \r
247         if (Conf == NULL)\r
248                 return -1;\r
249 \r
250         for (i = 0; i < NumInt; i++)\r
251                 m_InterfaceList.SetCheck(i, FALSE);\r
252 \r
253         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
254         {\r
255                 IntName = Int->name;\r
256                 IntName.MakeUpper();\r
257 \r
258                 for (i = 0; i < NumInt; i++)\r
259                 {\r
260                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName)\r
261                                 m_InterfaceList.SetCheck(i, TRUE);\r
262                 }\r
263         }\r
264 \r
265         Int = Conf->interfaces;\r
266 \r
267         MsgPar = &Int->cnf->hello_params;\r
268 \r
269         Conv.Format("%.2f", MsgPar->emission_interval);\r
270         m_HelloInt.SetWindowText(Conv);\r
271 \r
272         Conv.Format("%.2f", MsgPar->validity_time);\r
273         m_HelloHold.SetWindowText(Conv);\r
274 \r
275         MsgPar = &Int->cnf->tc_params;\r
276         \r
277         Conv.Format("%.2f", MsgPar->emission_interval);\r
278         m_TcInt.SetWindowText(Conv);\r
279 \r
280         Conv.Format("%.2f", MsgPar->validity_time);\r
281         m_TcHold.SetWindowText(Conv);\r
282 \r
283         MsgPar = &Int->cnf->mid_params;\r
284         \r
285         Conv.Format("%.2f", MsgPar->emission_interval);\r
286         m_MidInt.SetWindowText(Conv);\r
287 \r
288         Conv.Format("%.2f", MsgPar->validity_time);\r
289         m_MidHold.SetWindowText(Conv);\r
290 \r
291         MsgPar = &Int->cnf->hna_params;\r
292         \r
293         Conv.Format("%.2f", MsgPar->emission_interval);\r
294         m_HnaInt.SetWindowText(Conv);\r
295 \r
296         Conv.Format("%.2f", MsgPar->validity_time);\r
297         m_HnaHold.SetWindowText(Conv);\r
298 \r
299         SetDebugLevel(Conf->debug_level);\r
300 \r
301         Conv.Format("%.2f", Conf->pollrate);\r
302         m_PollInt.SetWindowText(Conv);\r
303 \r
304         Conv.Format("%d", Conf->mpr_coverage);\r
305         m_MprCov.SetWindowText(Conv);\r
306 \r
307         m_TcRed.SetCurSel(Conf->tc_redundancy);\r
308 \r
309         m_HystCheck.SetCheck(Conf->use_hysteresis);\r
310 \r
311         Conv.Format("%.2f", Conf->hysteresis_param.scaling);\r
312         m_HystScaling.SetWindowText(Conv);\r
313 \r
314         Conv.Format("%.2f", Conf->hysteresis_param.thr_high);\r
315         m_HystThresholdHigh.SetWindowText(Conv);\r
316 \r
317         Conv.Format("%.2f", Conf->hysteresis_param.thr_low);\r
318         m_HystThresholdLow.SetWindowText(Conv);\r
319 \r
320         OnHystCheck();\r
321 \r
322         m_EtxCheck.SetCheck(Conf->lq_level > 0);\r
323 \r
324         Conv.Format("%d", Conf->lq_wsize);\r
325         m_EtxWindowSize.SetWindowText(Conv);\r
326 \r
327         m_EtxRadio1.SetCheck(Conf->lq_level == 1);\r
328         m_EtxRadio2.SetCheck(Conf->lq_level == 0 || Conf->lq_level == 2);\r
329 \r
330         OnEtxCheckWorker();\r
331 \r
332         m_InternetCheck.SetCheck(FALSE);\r
333 \r
334         for (Hna4 = Conf->hna4_entries; Hna4 != NULL; Hna4 = Hna4->next)\r
335                 if (Hna4->net.v4 == 0 && Hna4->netmask.v4 == 0 &&\r
336                         m_InternetCheck.IsWindowEnabled())\r
337                 m_InternetCheck.SetCheck(TRUE);\r
338 \r
339         PrevInt = NULL;\r
340 \r
341         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
342         {\r
343                 IntName = Int->name;\r
344 \r
345                 if (IntName.CompareNoCase("GUI") == 0)\r
346                         break;\r
347 \r
348                 PrevInt = Int;\r
349         }\r
350 \r
351         if (Int != NULL)\r
352         {\r
353                 if (PrevInt == NULL)\r
354                         Conf->interfaces = Int->next;\r
355 \r
356                 else\r
357                         PrevInt->next = Int->next;\r
358 \r
359                 olsrd_cnf_free(Int);\r
360         }\r
361 \r
362         return 0;\r
363 }\r
364 \r
365 static struct olsr_if *AddInterface(struct olsrd_config **Conf, CString Name)\r
366 {\r
367         struct olsr_if *Int;\r
368 \r
369         Int = (struct olsr_if *)olsrd_cnf_malloc(sizeof (struct olsr_if));\r
370 \r
371         if (Int == NULL)\r
372         {\r
373                 AfxMessageBox("Cannot allocate memory.");\r
374                 return NULL;\r
375         }\r
376 \r
377         Int->name = (char *)olsrd_cnf_malloc(Name.GetLength() + 1);\r
378 \r
379         if (Int->name == NULL)\r
380         {\r
381                 olsrd_cnf_free(Int);\r
382 \r
383                 AfxMessageBox("Cannot allocate memory.");\r
384                 return NULL;\r
385         }\r
386 \r
387         ::lstrcpy(Int->name, Name);\r
388 \r
389         Int->config = NULL;\r
390         Int->index = 0;\r
391         Int->configured = OLSR_FALSE;\r
392         Int->interf = NULL;\r
393 \r
394         Int->cnf = get_default_if_config();\r
395 \r
396         Int->next = (*Conf)->interfaces;\r
397         (*Conf)->interfaces = Int;\r
398 \r
399         return Int;\r
400 }\r
401 \r
402 int MyDialog2::SaveConfigFile(CString PathName, int Real)\r
403 {\r
404         struct olsr_if *Int, *PrevInt;\r
405         struct olsr_msg_params *MsgPar;\r
406         CString Conv;\r
407         struct hna4_entry *Hna4, *NewHna4, *PrevHna4;\r
408         int NumInt = m_InterfaceList.GetItemCount();\r
409         int i;\r
410         CString IntName, IntName2;\r
411         struct ipc_host *IpcHost;\r
412         unsigned int Local;\r
413 \r
414         PrevInt = NULL;\r
415 \r
416         // remove interfaces that we do not want\r
417         \r
418         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
419         {\r
420                 IntName = Int->name;\r
421                 IntName.MakeUpper();\r
422 \r
423                 for (i = 0; i < NumInt; i++)\r
424                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == IntName)\r
425                                 break;\r
426 \r
427                 if (i == NumInt || !m_InterfaceList.GetCheck(i))\r
428                 {\r
429                         if (PrevInt != NULL)\r
430                                 PrevInt->next = Int->next;\r
431 \r
432                         else\r
433                                 Conf->interfaces = Int->next;\r
434                 }\r
435         }\r
436         \r
437         // add missing interfaces\r
438         \r
439         for (i = 0; i < NumInt; i++)\r
440         {\r
441                 if (!m_InterfaceList.GetCheck(i))\r
442                         continue;\r
443 \r
444                 IntName2 = m_InterfaceList.GetItemText(i, 0).Mid(0, 4);\r
445 \r
446                 for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
447                 {\r
448                         IntName = Int->name;\r
449                         IntName.MakeUpper();\r
450 \r
451                         if (IntName2 == IntName)\r
452                                 break;\r
453                 }\r
454 \r
455                 if (Int == NULL)\r
456                         AddInterface(&Conf, m_InterfaceList.GetItemText(i, 0).Mid(0, 4));\r
457         }\r
458 \r
459         // add dummy interface, if there aren't any real interfaces\r
460 \r
461         if (Conf->interfaces == NULL && Real != 0)\r
462                 AddInterface(&Conf, "GUI");\r
463 \r
464         // per-interface settings\r
465 \r
466         for (Int = Conf->interfaces; Int != NULL; Int = Int->next)\r
467         {\r
468                 MsgPar = &Int->cnf->hello_params;\r
469 \r
470                 m_HelloInt.GetWindowText(Conv);\r
471                 MsgPar->emission_interval = (float)atof(Conv);\r
472 \r
473                 m_HelloHold.GetWindowText(Conv);\r
474                 MsgPar->validity_time = (float)atof(Conv);\r
475 \r
476                 MsgPar = &Int->cnf->tc_params;\r
477 \r
478                 m_TcInt.GetWindowText(Conv);\r
479                 MsgPar->emission_interval = (float)atof(Conv);\r
480 \r
481                 m_TcHold.GetWindowText(Conv);\r
482                 MsgPar->validity_time = (float)atof(Conv);\r
483 \r
484                 MsgPar = &Int->cnf->mid_params;\r
485 \r
486                 m_MidInt.GetWindowText(Conv);\r
487                 MsgPar->emission_interval = (float)atof(Conv);\r
488 \r
489                 m_MidHold.GetWindowText(Conv);\r
490                 MsgPar->validity_time = (float)atof(Conv);\r
491 \r
492                 MsgPar = &Int->cnf->hna_params;\r
493 \r
494                 m_HnaInt.GetWindowText(Conv);\r
495                 MsgPar->emission_interval = (float)atof(Conv);\r
496 \r
497                 m_HnaHold.GetWindowText(Conv);\r
498                 MsgPar->validity_time = (float)atof(Conv);\r
499         }\r
500 \r
501         // global settings\r
502 \r
503         Conf->debug_level = DebugLevel;\r
504 \r
505         m_PollInt.GetWindowText(Conv);\r
506         Conf->pollrate = (float)atof(Conv);\r
507 \r
508         Conf->tc_redundancy = (unsigned char)m_TcRed.GetCurSel();\r
509 \r
510         m_MprCov.GetWindowText(Conv);\r
511         Conf->mpr_coverage = (unsigned char)atoi(Conv);\r
512 \r
513         Conf->use_hysteresis = m_HystCheck.GetCheck() ? OLSR_TRUE : OLSR_FALSE;\r
514 \r
515         m_HystScaling.GetWindowText(Conv);\r
516         Conf->hysteresis_param.scaling = (float)atof(Conv);\r
517 \r
518         m_HystThresholdHigh.GetWindowText(Conv);\r
519         Conf->hysteresis_param.thr_high = (float)atof(Conv);\r
520 \r
521         m_HystThresholdLow.GetWindowText(Conv);\r
522         Conf->hysteresis_param.thr_low = (float)atof(Conv);\r
523 \r
524         if (!m_EtxCheck.GetCheck())\r
525                 Conf->lq_level = 0;\r
526 \r
527         else if (m_EtxRadio1.GetCheck())\r
528                 Conf->lq_level = 1;\r
529 \r
530         else\r
531                 Conf->lq_level = 2;\r
532 \r
533         m_EtxWindowSize.GetWindowText(Conv);\r
534         Conf->lq_wsize = atoi(Conv);\r
535 \r
536         PrevHna4 = NULL;\r
537 \r
538         // check for a default gateway HNA4 entry\r
539 \r
540         for (Hna4 = Conf->hna4_entries; Hna4 != NULL; Hna4 = Hna4->next)\r
541         {\r
542                 if (Hna4->net.v4 == 0 && Hna4->netmask.v4 == 0)\r
543                         break;\r
544 \r
545                 PrevHna4 = Hna4;\r
546         }\r
547 \r
548         // add default gateway HNA4 entry\r
549 \r
550         if (m_InternetCheck.GetCheck() && Hna4 == NULL)\r
551         {\r
552                 NewHna4 = (struct hna4_entry * )\r
553                         olsrd_cnf_malloc(sizeof (struct hna4_entry));\r
554 \r
555                 if (NewHna4 == NULL)\r
556                 {\r
557                         AfxMessageBox("Cannot allocate memory.");\r
558                         return -1;\r
559                 }\r
560 \r
561                 NewHna4->net.v4 = 0;\r
562                 NewHna4->netmask.v4 = 0;\r
563 \r
564                 NewHna4->next = Conf->hna4_entries;\r
565                 Conf->hna4_entries = NewHna4;\r
566         }\r
567 \r
568         // remove default gateway HNA4 entry\r
569 \r
570         if (!m_InternetCheck.GetCheck() && Hna4 != NULL)\r
571         {\r
572                 if (PrevHna4 == NULL)\r
573                         Conf->hna4_entries = Hna4->next;\r
574 \r
575                 else\r
576                         PrevHna4->next = Hna4->next;\r
577 \r
578                 olsrd_cnf_free(Hna4);\r
579         }\r
580 \r
581         Local = inet_addr("127.0.0.1");\r
582 \r
583         for (IpcHost = Conf->ipc_hosts; IpcHost != NULL; IpcHost = IpcHost->next)\r
584                 if (IpcHost->host.v4 == Local)\r
585                         break;\r
586 \r
587         if (IpcHost == NULL && Real == 0)\r
588         {\r
589                 IpcHost = (struct ipc_host *)\r
590                         olsrd_cnf_malloc(sizeof (struct ipc_host));\r
591 \r
592                 if (IpcHost == NULL)\r
593                 {\r
594                         AfxMessageBox("Cannot allocate memory.");\r
595                         return -1;\r
596                 }\r
597 \r
598                 IpcHost->host.v4 = Local;\r
599 \r
600                 IpcHost->next = Conf->ipc_hosts;\r
601                 Conf->ipc_hosts = IpcHost;\r
602 \r
603                 Conf->ipc_connections++;\r
604                 Conf->open_ipc = OLSR_TRUE;\r
605         }\r
606 \r
607         // write configuration file\r
608 \r
609         if (olsrd_write_cnf(Conf, PathName) < 0)\r
610                 return -1;\r
611 \r
612         return 0;\r
613 }\r
614 \r
615 void MyDialog2::OnSaveButton()\r
616 {\r
617         CFileDialog FileDialog(FALSE);\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 (SaveConfigFile(PathName, 1) < 0)\r
632                         AfxMessageBox("Cannot save configuration file '" + PathName + "'.");\r
633         }\r
634 \r
635         FileName.ReleaseBuffer();\r
636 }\r
637 \r
638 void MyDialog2::OnOpenButton()\r
639 {\r
640         CFileDialog FileDialog(TRUE);\r
641         CString FileName = "Default.olsr";\r
642         CString PathName;\r
643 \r
644         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";\r
645         FileDialog.m_ofn.nFilterIndex = 1;\r
646 \r
647         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
648         FileDialog.m_ofn.nMaxFile = 500;\r
649 \r
650         if (FileDialog.DoModal() == IDOK)\r
651         {\r
652                 PathName = FileDialog.GetPathName();\r
653 \r
654                 if (OpenConfigFile(PathName) < 0)\r
655                         AfxMessageBox("Cannot open configuration file '" + PathName + "'.");\r
656         }\r
657 \r
658         FileName.ReleaseBuffer();\r
659 }\r
660 \r
661 void MyDialog2::OnResetButton() \r
662 {\r
663         Reset();\r
664 }\r
665 \r
666 void MyDialog2::OnEtxRadio1() \r
667 {\r
668         m_EtxRadio2.SetCheck(FALSE);\r
669 }\r
670 \r
671 void MyDialog2::OnEtxRadio2() \r
672 {\r
673         m_EtxRadio1.SetCheck(FALSE);\r
674 }\r
675 \r
676 void MyDialog2::OnKillfocusEtxWinSize() \r
677 {\r
678         CString Conv;\r
679         int WinSize;\r
680 \r
681         m_EtxWindowSize.GetWindowText(Conv);\r
682         WinSize = atoi(Conv);\r
683 \r
684         if (WinSize < 3)\r
685                 WinSize = 3;\r
686 \r
687         else if (WinSize > 128)\r
688                 WinSize = 128;\r
689 \r
690         Conv.Format("%d", WinSize);\r
691         m_EtxWindowSize.SetWindowText(Conv);\r
692 }\r