Initial import
[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                 m_InterfaceList.SetCheck(i, TRUE);\r
169 \r
170         m_ManualWindow.SetWindowText("");\r
171 }\r
172 \r
173 BOOL MyDialog2::OnInitDialog() \r
174 {\r
175         int i;\r
176 \r
177         CDialog::OnInitDialog();\r
178         \r
179         CClientDC DevCont(&m_ManualWindow);\r
180 \r
181         EditFont.CreatePointFont(100, "Courier", NULL);\r
182         m_ManualWindow.SetFont(&EditFont);\r
183 \r
184         m_DebugLevel.SetRange(0, 9, TRUE);\r
185 \r
186         m_InterfaceList.SetExtendedStyle(m_InterfaceList.GetExtendedStyle() |\r
187                         LVS_EX_CHECKBOXES);\r
188 \r
189         for (i = 0; i < Interfaces->GetSize(); i++)\r
190         {\r
191                 m_InterfaceList.InsertItem(i,\r
192                 (*Interfaces)[i] + " - " + (*Addresses)[i]);\r
193         }\r
194 \r
195         MIB_IPFORWARDROW IpFwdRow;\r
196 \r
197         if (::GetBestRoute(0, 0, &IpFwdRow) != NO_ERROR)\r
198                 m_InternetCheck.EnableWindow(FALSE);\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 \r
215 void MyDialog2::WriteParameter(CFile *File, CString Name, CString Value)\r
216 {\r
217         CString Line;\r
218 \r
219         Line = Name + " " + Value + "\r\n";\r
220 \r
221         File->Write(Line.GetBuffer(0), Line.GetLength());\r
222 \r
223         Line.ReleaseBuffer();\r
224 }\r
225 \r
226 int MyDialog2::OpenConfigFile(CString PathName)\r
227 {\r
228         CStdioFile File;\r
229         CString Line;\r
230         int Len;\r
231         CString Manual;\r
232         int NumInt = m_InterfaceList.GetItemCount();\r
233         int i;\r
234         CString Int;\r
235 \r
236         if (File.Open(PathName, CFile::modeRead | CFile::typeText |\r
237                 CFile::shareExclusive) == 0)\r
238                 return -1;\r
239 \r
240         m_InternetCheck.SetCheck(FALSE);\r
241 \r
242         for (i = 0; i < NumInt; i++)\r
243                 m_InterfaceList.SetCheck(i, FALSE);\r
244 \r
245         m_HystScaling.SetWindowText("0.5");\r
246         m_HystThresholdLow.SetWindowText("0.3");\r
247         m_HystThresholdHigh.SetWindowText("0.8");\r
248 \r
249         while (File.ReadString(Line))\r
250         {\r
251                 Len = Line.Find('#');\r
252 \r
253                 if (Len >= 0)\r
254                 {\r
255                         Line = Line.Mid(0, Len);\r
256                         Line.TrimRight();\r
257                 }\r
258 \r
259                 Len = Line.GetLength();\r
260 \r
261                 if (Len == 0)\r
262                         continue;\r
263 \r
264                 if (Len > 10 && Line.Mid(0, 10) == "IPVERSION " && Line.Mid(10) == "4")\r
265                         ;\r
266 \r
267                 else if (Len > 6 && Line.Mid(0, 6) == "DEBUG ")\r
268                         SetDebugLevel(Line.GetAt(6) - '0');\r
269 \r
270                 else if (Len > 9 && Line.Mid(0, 9) == "POLLRATE ")\r
271                         m_PollInt.SetWindowText(Line.Mid(9));\r
272                 \r
273                 else if (Len > 9 && Line.Mid(0, 9) == "HELLOINT ")\r
274                         m_HelloInt.SetWindowText(Line.Mid(9));\r
275                 \r
276                 else if (Len > 11 && Line.Mid(0, 11) == "HELLOMULTI ")\r
277                         m_HelloMult.SetWindowText(Line.Mid(11));\r
278                 \r
279                 else if (Len > 6 && Line.Mid(0, 6) == "TCINT ")\r
280                         m_TcInt.SetWindowText(Line.Mid(6));\r
281                 \r
282                 else if (Len > 8 && Line.Mid(0, 8) == "TCMULTI ")\r
283                         m_TcMult.SetWindowText(Line.Mid(8));\r
284                 \r
285                 else if (Len > 7 && Line.Mid(0, 7) == "MIDINT ")\r
286                         m_MidInt.SetWindowText(Line.Mid(7));\r
287                 \r
288                 else if (Len > 9 && Line.Mid(0, 9) == "MIDMULTI ")\r
289                         m_MidMult.SetWindowText(Line.Mid(9));\r
290                 \r
291                 else if (Len > 7 && Line.Mid(0, 7) == "HNAINT ")\r
292                         m_HnaInt.SetWindowText(Line.Mid(7));\r
293                 \r
294                 else if (Len > 9 && Line.Mid(0, 9) == "HNAMULTI ")\r
295                         m_HnaMult.SetWindowText(Line.Mid(9));\r
296 \r
297                 else if (Len > 15 && Line.Mid(0, 15) == "USE_HYSTERESIS " &&\r
298                         Line.Mid(15) == "yes")\r
299                         m_HystCheck.SetCheck(TRUE);\r
300 \r
301                 else if (Len > 15 && Line.Mid(0, 15) == "USE_HYSTERESIS " &&\r
302                         Line.Mid(15) == "no")\r
303                         m_HystCheck.SetCheck(FALSE);\r
304 \r
305                 else if (Len > 13 && Line.Mid(0, 13) == "HYST_SCALING ")\r
306                         m_HystScaling.SetWindowText(Line.Mid(13));\r
307 \r
308                 else if (Len > 13 && Line.Mid(0, 13) == "HYST_THR_LOW ")\r
309                         m_HystThresholdLow.SetWindowText(Line.Mid(13));\r
310                 \r
311                 else if (Len > 14 && Line.Mid(0, 14) == "HYST_THR_HIGH ")\r
312                         m_HystThresholdHigh.SetWindowText(Line.Mid(14));\r
313 \r
314                 else if (Len > 5 && Line.Mid(0, 5) == "HNA4 " &&\r
315                         Line.Mid(5) == "0.0.0.0 0.0.0.0")\r
316                 {\r
317                         if (m_InternetCheck.IsWindowEnabled())\r
318                                 m_InternetCheck.SetCheck(TRUE);\r
319                 }\r
320 \r
321                 else if (Len > 11 && Line.Mid(0, 11) == "INTERFACES ")\r
322                 {\r
323                         Line = Line.Mid(11);\r
324                         Line.MakeUpper();\r
325 \r
326                         for (;;)\r
327                         {\r
328                                 Int = Line.Mid(0, 4);\r
329 \r
330                                 for (i = 0; i < NumInt; i++)\r
331                                 {\r
332                                         if (m_InterfaceList.GetItemText(i, 0).Mid(0, 4) == Int)\r
333                                                 m_InterfaceList.SetCheck(i, TRUE);\r
334                                 }\r
335 \r
336                                 if (Line.GetLength() < 5)\r
337                                         break;\r
338 \r
339                                 Line = Line.Mid(5);\r
340                         }\r
341                 }\r
342                 \r
343                 else\r
344                 {\r
345                         Manual += Line + "\r\n";\r
346                         m_ManualWindow.SetWindowText(Manual);\r
347                 }\r
348         }\r
349 \r
350         File.Close();\r
351 \r
352         OnHystCheck();\r
353 \r
354         return 0;\r
355 }\r
356 \r
357 int MyDialog2::SaveConfigFile(CString PathName)\r
358 {\r
359         CFile File;\r
360         char *Prolog;\r
361         CString Para;\r
362         CString IntList;\r
363 \r
364         if (File.Open(PathName, CFile::modeCreate | CFile::modeWrite |\r
365                 CFile::shareExclusive) == 0)\r
366                 return -1;\r
367 \r
368         Prolog = "#\r\n# AUTOMATICALLY GENERATED FILE - DO NOT TOUCH!\r\n#\r\n\r\n";\r
369 \r
370         File.Write(Prolog, strlen(Prolog));\r
371 \r
372         WriteParameter(&File, "IPVERSION", "4");\r
373 \r
374         m_DebugLevelText.GetWindowText(Para);\r
375         WriteParameter(&File, "DEBUG", Para);\r
376 \r
377         GetInterfaceList(IntList);\r
378 \r
379         if (!IntList.IsEmpty())\r
380                 WriteParameter(&File, "INTERFACES", IntList);\r
381 \r
382         m_PollInt.GetWindowText(Para);\r
383         WriteParameter(&File, "POLLRATE", Para);\r
384 \r
385         m_HelloInt.GetWindowText(Para);\r
386         WriteParameter(&File, "HELLOINT", Para);\r
387 \r
388         m_HelloMult.GetWindowText(Para);\r
389         WriteParameter(&File, "HELLOMULTI", Para);\r
390 \r
391         m_TcInt.GetWindowText(Para);\r
392         WriteParameter(&File, "TCINT", Para);\r
393 \r
394         m_TcMult.GetWindowText(Para);\r
395         WriteParameter(&File, "TCMULTI", Para);\r
396 \r
397         m_MidInt.GetWindowText(Para);\r
398         WriteParameter(&File, "MIDINT", Para);\r
399 \r
400         m_MidMult.GetWindowText(Para);\r
401         WriteParameter(&File, "MIDMULTI", Para);\r
402 \r
403         m_HnaInt.GetWindowText(Para);\r
404         WriteParameter(&File, "HNAINT", Para);\r
405 \r
406         m_HnaMult.GetWindowText(Para);\r
407         WriteParameter(&File, "HNAMULTI", Para);\r
408 \r
409         if (m_HystCheck.GetCheck())\r
410         {\r
411                 WriteParameter(&File, "USE_HYSTERESIS", "yes");\r
412 \r
413                 m_HystScaling.GetWindowText(Para);\r
414                 WriteParameter(&File, "HYST_SCALING", Para);\r
415 \r
416                 m_HystThresholdLow.GetWindowText(Para);\r
417                 WriteParameter(&File, "HYST_THR_LOW", Para);\r
418 \r
419                 m_HystThresholdHigh.GetWindowText(Para);\r
420                 WriteParameter(&File, "HYST_THR_HIGH", Para);\r
421         }\r
422 \r
423         else\r
424                 WriteParameter(&File, "USE_HYSTERESIS", "no");\r
425 \r
426         if (m_InternetCheck.GetCheck())\r
427                 WriteParameter(&File, "HNA4", "0.0.0.0 0.0.0.0");\r
428 \r
429         m_ManualWindow.GetWindowText(Para);\r
430         File.Write(Para.GetBuffer(0), Para.GetLength());\r
431         Para.ReleaseBuffer();\r
432 \r
433         File.Close();\r
434         return 0;\r
435 }\r
436 \r
437 void MyDialog2::OnSaveButton()\r
438 {\r
439         CFileDialog FileDialog(FALSE);\r
440         CString FileName = "Default.olsr";\r
441         CString PathName;\r
442 \r
443         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";\r
444         FileDialog.m_ofn.nFilterIndex = 1;\r
445 \r
446         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
447         FileDialog.m_ofn.nMaxFile = 500;\r
448 \r
449         if (FileDialog.DoModal() == IDOK)\r
450         {\r
451                 PathName = FileDialog.GetPathName();\r
452 \r
453                 if (SaveConfigFile(PathName) < 0)\r
454                         AfxMessageBox("Cannot save configuration file '" + PathName + "'.");\r
455         }\r
456 \r
457         FileName.ReleaseBuffer();\r
458 }\r
459 \r
460 void MyDialog2::OnOpenButton() \r
461 {\r
462         CFileDialog FileDialog(TRUE);\r
463         CString FileName = "Default.olsr";\r
464         CString PathName;\r
465 \r
466         FileDialog.m_ofn.lpstrFilter = "Configuration file (*.olsr)\0*.olsr\0";\r
467         FileDialog.m_ofn.nFilterIndex = 1;\r
468 \r
469         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
470         FileDialog.m_ofn.nMaxFile = 500;\r
471 \r
472         if (FileDialog.DoModal() == IDOK)\r
473         {\r
474                 PathName = FileDialog.GetPathName();\r
475 \r
476                 if (OpenConfigFile(PathName) < 0)\r
477                         AfxMessageBox("Cannot open configuration file '" + PathName + "'.");\r
478         }\r
479 \r
480         FileName.ReleaseBuffer();\r
481 }\r
482 \r
483 void MyDialog2::OnResetButton() \r
484 {\r
485         Reset();\r
486 }\r