We can now tell WLAN interfaces from wired interfaces on Windows.
[olsrd.git] / gui / win32 / Main / MyDialog2.cpp
1 /*\r
2  * Windows GUI for olsr.org\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         //{{AFX_DATA_INIT(MyDialog2)\r
39         //}}AFX_DATA_INIT\r
40 }\r
41 \r
42 void MyDialog2::SetDebugLevel(int Level)\r
43 {\r
44         char LevelText[2];\r
45 \r
46         LevelText[0] = (char)(Level + '0');\r
47         LevelText[1] = 0;\r
48 \r
49         DebugLevel = Level;\r
50         m_DebugLevel.SetPos(Level);\r
51         m_DebugLevelText.SetWindowText(LevelText);\r
52 }\r
53 \r
54 void MyDialog2::GetInterfaceList(CString &Res)\r
55 {\r
56         int Num = m_InterfaceList.GetItemCount();\r
57         int i;\r
58         int AddSpace = 0;\r
59 \r
60         for (i = 0; i < Num; i++)\r
61                 if (m_InterfaceList.GetCheck(i))\r
62                 {\r
63                         if (AddSpace != 0)\r
64                                 Res += " ";\r
65 \r
66                         else\r
67                                 AddSpace = 1;\r
68 \r
69                         Res += m_InterfaceList.GetItemText(i, 0).Mid(0, 4);\r
70                 }\r
71 \r
72         Res.MakeLower();\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_CHECK4, m_TunnelCheck);\r
85         DDX_Control(pDX, IDC_CHECK3, m_Ipv6Check);\r
86         DDX_Control(pDX, IDC_CHECK2, m_InternetCheck);\r
87         DDX_Control(pDX, IDC_CHECK1, m_HystCheck);\r
88         DDX_Control(pDX, IDC_EDIT13, m_HystThresholdHigh);\r
89         DDX_Control(pDX, IDC_EDIT12, m_HystThresholdLow);\r
90         DDX_Control(pDX, IDC_EDIT11, m_HystScaling);\r
91         DDX_Control(pDX, IDC_EDIT10, m_HnaMult);\r
92         DDX_Control(pDX, IDC_EDIT9, m_MidMult);\r
93         DDX_Control(pDX, IDC_EDIT7, m_PollInt);\r
94         DDX_Control(pDX, IDC_EDIT6, m_TcMult);\r
95         DDX_Control(pDX, IDC_EDIT5, m_TcInt);\r
96         DDX_Control(pDX, IDC_EDIT4, m_HnaInt);\r
97         DDX_Control(pDX, IDC_EDIT3, m_MidInt);\r
98         DDX_Control(pDX, IDC_EDIT2, m_HelloMult);\r
99         DDX_Control(pDX, IDC_EDIT1, m_HelloInt);\r
100         DDX_Control(pDX, IDC_EDIT8, m_ManualWindow);\r
101         DDX_Control(pDX, IDC_LIST1, m_InterfaceList);\r
102         DDX_Control(pDX, IDC_TEXT1, m_DebugLevelText);\r
103         DDX_Control(pDX, IDC_SLIDER2, m_DebugLevel);\r
104         //}}AFX_DATA_MAP\r
105 }\r
106 \r
107 BEGIN_MESSAGE_MAP(MyDialog2, CDialog)\r
108         //{{AFX_MSG_MAP(MyDialog2)\r
109         ON_WM_HSCROLL()\r
110         ON_BN_CLICKED(IDC_CHECK1, OnHystCheck)\r
111         ON_BN_CLICKED(IDC_BUTTON4, OnOpenButton)\r
112         ON_BN_CLICKED(IDC_BUTTON5, OnSaveButton)\r
113         ON_BN_CLICKED(IDOK, OnOK)\r
114         ON_BN_CLICKED(IDCANCEL, OnCancel)\r
115         ON_BN_CLICKED(IDC_BUTTON1, OnResetButton)\r
116         //}}AFX_MSG_MAP\r
117 END_MESSAGE_MAP()\r
118 \r
119 void MyDialog2::OnOK()\r
120 {\r
121 }\r
122 \r
123 void MyDialog2::OnCancel()\r
124 {\r
125 }\r
126 \r
127 void MyDialog2::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) \r
128 {\r
129         if (pScrollBar == (CScrollBar *)&m_DebugLevel)\r
130                 SetDebugLevel(m_DebugLevel.GetPos());\r
131         \r
132         CDialog::OnHScroll(nSBCode, nPos, pScrollBar);\r
133 }\r
134 \r
135 void MyDialog2::Reset(void)\r
136 {\r
137         int i;\r
138 \r
139         SetDebugLevel(1);\r
140 \r
141         m_HelloInt.SetWindowText("2.0");\r
142         m_HelloMult.SetWindowText("3.0");\r
143 \r
144         m_TcInt.SetWindowText("5.0");\r
145         m_TcMult.SetWindowText("3.0");\r
146 \r
147         m_MidInt.SetWindowText("5.0");\r
148         m_MidMult.SetWindowText("3.0");\r
149 \r
150         m_HnaInt.SetWindowText("10.0");\r
151         m_HnaMult.SetWindowText("3.0");\r
152 \r
153         m_PollInt.SetWindowText("0.1");\r
154 \r
155         m_HystThresholdLow.SetWindowText("0.3");\r
156         m_HystThresholdHigh.SetWindowText("0.8");\r
157         m_HystScaling.SetWindowText("0.5");\r
158 \r
159         m_HystCheck.SetCheck(TRUE);\r
160 \r
161         OnHystCheck();\r
162 \r
163         m_InternetCheck.SetCheck(FALSE);\r
164         m_Ipv6Check.SetCheck(FALSE);\r
165         m_TunnelCheck.SetCheck(FALSE);\r
166 \r
167         for (i = 0; i < Interfaces->GetSize(); i++)\r
168         {\r
169                 if ((*IsWlan)[i] == "-")\r
170                         m_InterfaceList.SetCheck(i, FALSE);\r
171 \r
172                 else\r
173                         m_InterfaceList.SetCheck(i, TRUE);\r
174         }\r
175 \r
176         m_ManualWindow.SetWindowText("");\r
177 }\r
178 \r
179 BOOL MyDialog2::OnInitDialog() \r
180 {\r
181         int i;\r
182 \r
183         CDialog::OnInitDialog();\r
184         \r
185         CClientDC DevCont(&m_ManualWindow);\r
186 \r
187         EditFont.CreatePointFont(100, "Courier", NULL);\r
188         m_ManualWindow.SetFont(&EditFont);\r
189 \r
190         m_DebugLevel.SetRange(0, 9, TRUE);\r
191 \r
192         m_InterfaceList.SetExtendedStyle(m_InterfaceList.GetExtendedStyle() |\r
193                         LVS_EX_CHECKBOXES);\r
194 \r
195         for (i = 0; i < Interfaces->GetSize(); i++)\r
196         {\r
197                 m_InterfaceList.InsertItem(i,\r
198                 (*Interfaces)[i] + " - " + (*Addresses)[i]);\r
199         }\r
200 \r
201         MIB_IPFORWARDROW IpFwdRow;\r
202 \r
203         if (::GetBestRoute(0, 0, &IpFwdRow) != NO_ERROR)\r
204                 m_InternetCheck.EnableWindow(FALSE);\r
205 \r
206         Reset();\r
207 \r
208         return TRUE;\r
209 }\r
210 \r
211 void MyDialog2::OnHystCheck() \r
212 {\r
213         BOOL EnaDis = m_HystCheck.GetCheck();\r
214 \r
215         m_HystThresholdLow.EnableWindow(EnaDis);\r
216         m_HystThresholdHigh.EnableWindow(EnaDis);\r
217         m_HystScaling.EnableWindow(EnaDis);\r
218 }\r
219 \r
220 \r
221 void MyDialog2::WriteParameter(CFile *File, CString Name, CString Value)\r
222 {\r
223         CString Line;\r
224 \r
225         Line = Name + " " + Value + "\r\n";\r
226 \r
227         File->Write(Line.GetBuffer(0), Line.GetLength());\r
228 \r
229         Line.ReleaseBuffer();\r
230 }\r
231 \r
232 int MyDialog2::OpenConfigFile(CString PathName)\r
233 {\r
234         CStdioFile File;\r
235         CString Line;\r
236         int Len;\r
237         CString Manual;\r
238         int NumInt = m_InterfaceList.GetItemCount();\r
239         int i;\r
240         CString Int;\r
241 \r
242         if (File.Open(PathName, CFile::modeRead | CFile::typeText |\r
243                 CFile::shareExclusive) == 0)\r
244                 return -1;\r
245 \r
246         m_InternetCheck.SetCheck(FALSE);\r
247 \r
248         for (i = 0; i < NumInt; i++)\r
249                 m_InterfaceList.SetCheck(i, FALSE);\r
250 \r
251         m_HystScaling.SetWindowText("0.5");\r
252         m_HystThresholdLow.SetWindowText("0.3");\r
253         m_HystThresholdHigh.SetWindowText("0.8");\r
254 \r
255         while (File.ReadString(Line))\r
256         {\r
257                 Len = Line.Find('#');\r
258 \r
259                 if (Len >= 0)\r
260                 {\r
261                         Line = Line.Mid(0, Len);\r
262                         Line.TrimRight();\r
263                 }\r
264 \r
265                 Len = Line.GetLength();\r
266 \r
267                 if (Len == 0)\r
268                         continue;\r
269 \r
270                 if (Len > 10 && Line.Mid(0, 10) == "IPVERSION " && Line.Mid(10) == "4")\r
271                         ;\r
272 \r
273                 else if (Len > 6 && Line.Mid(0, 6) == "DEBUG ")\r
274                         SetDebugLevel(Line.GetAt(6) - '0');\r
275 \r
276                 else if (Len > 9 && Line.Mid(0, 9) == "POLLRATE ")\r
277                         m_PollInt.SetWindowText(Line.Mid(9));\r
278                 \r
279                 else if (Len > 9 && Line.Mid(0, 9) == "HELLOINT ")\r
280                         m_HelloInt.SetWindowText(Line.Mid(9));\r
281                 \r
282                 else if (Len > 11 && Line.Mid(0, 11) == "HELLOMULTI ")\r
283                         m_HelloMult.SetWindowText(Line.Mid(11));\r
284                 \r
285                 else if (Len > 6 && Line.Mid(0, 6) == "TCINT ")\r
286                         m_TcInt.SetWindowText(Line.Mid(6));\r
287                 \r
288                 else if (Len > 8 && Line.Mid(0, 8) == "TCMULTI ")\r
289                         m_TcMult.SetWindowText(Line.Mid(8));\r
290                 \r
291                 else if (Len > 7 && Line.Mid(0, 7) == "MIDINT ")\r
292                         m_MidInt.SetWindowText(Line.Mid(7));\r
293                 \r
294                 else if (Len > 9 && Line.Mid(0, 9) == "MIDMULTI ")\r
295                         m_MidMult.SetWindowText(Line.Mid(9));\r
296                 \r
297                 else if (Len > 7 && Line.Mid(0, 7) == "HNAINT ")\r
298                         m_HnaInt.SetWindowText(Line.Mid(7));\r
299                 \r
300                 else if (Len > 9 && Line.Mid(0, 9) == "HNAMULTI ")\r
301                         m_HnaMult.SetWindowText(Line.Mid(9));\r
302 \r
303                 else if (Len > 15 && Line.Mid(0, 15) == "USE_HYSTERESIS " &&\r
304                         Line.Mid(15) == "yes")\r
305                         m_HystCheck.SetCheck(TRUE);\r
306 \r
307                 else if (Len > 15 && Line.Mid(0, 15) == "USE_HYSTERESIS " &&\r
308                         Line.Mid(15) == "no")\r
309                         m_HystCheck.SetCheck(FALSE);\r
310 \r
311                 else if (Len > 13 && Line.Mid(0, 13) == "HYST_SCALING ")\r
312                         m_HystScaling.SetWindowText(Line.Mid(13));\r
313 \r
314                 else if (Len > 13 && Line.Mid(0, 13) == "HYST_THR_LOW ")\r
315                         m_HystThresholdLow.SetWindowText(Line.Mid(13));\r
316                 \r
317                 else if (Len > 14 && Line.Mid(0, 14) == "HYST_THR_HIGH ")\r
318                         m_HystThresholdHigh.SetWindowText(Line.Mid(14));\r
319 \r
320                 else if (Len > 5 && Line.Mid(0, 5) == "HNA4 " &&\r
321                         Line.Mid(5) == "0.0.0.0 0.0.0.0")\r
322                 {\r
323                         if (m_InternetCheck.IsWindowEnabled())\r
324                                 m_InternetCheck.SetCheck(TRUE);\r
325                 }\r
326 \r
327                 else if (Len > 11 && Line.Mid(0, 11) == "INTERFACES ")\r
328                 {\r
329                         Line = Line.Mid(11);\r
330                         Line.MakeUpper();\r
331 \r
332                         for (;;)\r
333                         {\r
334                                 Int = Line.Mid(0, 4);\r
335 \r
336                                 for (i = 0; i < NumInt; i++)\r
337                                 {\r
338                                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == Int)\r
339                                                 m_InterfaceList.SetCheck(i, TRUE);\r
340                                 }\r
341 \r
342                                 if (Line.GetLength() < 5)\r
343                                         break;\r
344 \r
345                                 Line = Line.Mid(5);\r
346                         }\r
347                 }\r
348                 \r
349                 else\r
350                 {\r
351                         Manual += Line + "\r\n";\r
352                         m_ManualWindow.SetWindowText(Manual);\r
353                 }\r
354         }\r
355 \r
356         File.Close();\r
357 \r
358         OnHystCheck();\r
359 \r
360         return 0;\r
361 }\r
362 \r
363 int MyDialog2::SaveConfigFile(CString PathName)\r
364 {\r
365         CFile File;\r
366         char *Prolog;\r
367         CString Para;\r
368         CString IntList;\r
369 \r
370         if (File.Open(PathName, CFile::modeCreate | CFile::modeWrite |\r
371                 CFile::shareExclusive) == 0)\r
372                 return -1;\r
373 \r
374         Prolog = "#\r\n# AUTOMATICALLY GENERATED FILE - DO NOT TOUCH!\r\n#\r\n\r\n";\r
375 \r
376         File.Write(Prolog, strlen(Prolog));\r
377 \r
378         WriteParameter(&File, "IPVERSION", "4");\r
379 \r
380         m_DebugLevelText.GetWindowText(Para);\r
381         WriteParameter(&File, "DEBUG", Para);\r
382 \r
383         GetInterfaceList(IntList);\r
384 \r
385         if (!IntList.IsEmpty())\r
386                 WriteParameter(&File, "INTERFACES", IntList);\r
387 \r
388         m_PollInt.GetWindowText(Para);\r
389         WriteParameter(&File, "POLLRATE", Para);\r
390 \r
391         m_HelloInt.GetWindowText(Para);\r
392         WriteParameter(&File, "HELLOINT", Para);\r
393 \r
394         m_HelloMult.GetWindowText(Para);\r
395         WriteParameter(&File, "HELLOMULTI", Para);\r
396 \r
397         m_TcInt.GetWindowText(Para);\r
398         WriteParameter(&File, "TCINT", Para);\r
399 \r
400         m_TcMult.GetWindowText(Para);\r
401         WriteParameter(&File, "TCMULTI", Para);\r
402 \r
403         m_MidInt.GetWindowText(Para);\r
404         WriteParameter(&File, "MIDINT", Para);\r
405 \r
406         m_MidMult.GetWindowText(Para);\r
407         WriteParameter(&File, "MIDMULTI", Para);\r
408 \r
409         m_HnaInt.GetWindowText(Para);\r
410         WriteParameter(&File, "HNAINT", Para);\r
411 \r
412         m_HnaMult.GetWindowText(Para);\r
413         WriteParameter(&File, "HNAMULTI", Para);\r
414 \r
415         if (m_HystCheck.GetCheck())\r
416         {\r
417                 WriteParameter(&File, "USE_HYSTERESIS", "yes");\r
418 \r
419                 m_HystScaling.GetWindowText(Para);\r
420                 WriteParameter(&File, "HYST_SCALING", Para);\r
421 \r
422                 m_HystThresholdLow.GetWindowText(Para);\r
423                 WriteParameter(&File, "HYST_THR_LOW", Para);\r
424 \r
425                 m_HystThresholdHigh.GetWindowText(Para);\r
426                 WriteParameter(&File, "HYST_THR_HIGH", Para);\r
427         }\r
428 \r
429         else\r
430                 WriteParameter(&File, "USE_HYSTERESIS", "no");\r
431 \r
432         if (m_InternetCheck.GetCheck())\r
433                 WriteParameter(&File, "HNA4", "0.0.0.0 0.0.0.0");\r
434 \r
435         m_ManualWindow.GetWindowText(Para);\r
436         File.Write(Para.GetBuffer(0), Para.GetLength());\r
437         Para.ReleaseBuffer();\r
438 \r
439         File.Close();\r
440         return 0;\r
441 }\r
442 \r
443 void MyDialog2::OnSaveButton()\r
444 {\r
445         CFileDialog FileDialog(FALSE);\r
446         CString FileName = "Default.olsr";\r
447         CString PathName;\r
448 \r
449         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";\r
450         FileDialog.m_ofn.nFilterIndex = 1;\r
451 \r
452         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
453         FileDialog.m_ofn.nMaxFile = 500;\r
454 \r
455         if (FileDialog.DoModal() == IDOK)\r
456         {\r
457                 PathName = FileDialog.GetPathName();\r
458 \r
459                 if (SaveConfigFile(PathName) < 0)\r
460                         AfxMessageBox("Cannot save configuration file '" + PathName + "'.");\r
461         }\r
462 \r
463         FileName.ReleaseBuffer();\r
464 }\r
465 \r
466 void MyDialog2::OnOpenButton() \r
467 {\r
468         CFileDialog FileDialog(TRUE);\r
469         CString FileName = "Default.olsr";\r
470         CString PathName;\r
471 \r
472         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";\r
473         FileDialog.m_ofn.nFilterIndex = 1;\r
474 \r
475         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
476         FileDialog.m_ofn.nMaxFile = 500;\r
477 \r
478         if (FileDialog.DoModal() == IDOK)\r
479         {\r
480                 PathName = FileDialog.GetPathName();\r
481 \r
482                 if (OpenConfigFile(PathName) < 0)\r
483                         AfxMessageBox("Cannot open configuration file '" + PathName + "'.");\r
484         }\r
485 \r
486         FileName.ReleaseBuffer();\r
487 }\r
488 \r
489 void MyDialog2::OnResetButton() \r
490 {\r
491         Reset();\r
492 }\r