Fixed a race-condition that blocked olsrd and prevented it from opening
[olsrd.git] / gui / win32 / Main / MyDialog1.cpp
1 /*\r
2  * $Id: MyDialog1.cpp,v 1.3 2004/11/18 18:02:37 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 "MyDialog1.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 MyDialog1::MyDialog1(CWnd* pParent)\r
34         : CDialog(MyDialog1::IDD, pParent)\r
35 {\r
36         //{{AFX_DATA_INIT(MyDialog1)\r
37         //}}AFX_DATA_INIT\r
38 }\r
39 \r
40 BOOL MyDialog1::Create(CWnd *Parent)\r
41 {\r
42         return CDialog::Create(MyDialog1::IDD, Parent);\r
43 }\r
44 \r
45 void MyDialog1::DoDataExchange(CDataExchange* pDX)\r
46 {\r
47         CDialog::DoDataExchange(pDX);\r
48         //{{AFX_DATA_MAP(MyDialog1)\r
49         DDX_Control(pDX, IDC_BUTTON4, m_SaveButton);\r
50         DDX_Control(pDX, IDC_BUTTON3, m_FreezeButton);\r
51         DDX_Control(pDX, IDC_BUTTON2, m_ContinueButton);\r
52         DDX_Control(pDX, IDC_BUTTON1, m_ClearButton);\r
53         DDX_Control(pDX, IDC_EDIT1, m_OutputWindow);\r
54         //}}AFX_DATA_MAP\r
55 }\r
56 \r
57 \r
58 BEGIN_MESSAGE_MAP(MyDialog1, CDialog)\r
59         //{{AFX_MSG_MAP(MyDialog1)\r
60         ON_BN_CLICKED(IDC_BUTTON1, OnClearButton)\r
61         ON_BN_CLICKED(IDC_BUTTON2, OnContinueButton)\r
62         ON_BN_CLICKED(IDC_BUTTON3, OnFreezeButton)\r
63         ON_WM_CTLCOLOR()\r
64         ON_BN_CLICKED(IDOK, OnOK)\r
65         ON_BN_CLICKED(IDCANCEL, OnCancel)\r
66         ON_BN_CLICKED(IDC_BUTTON4, OnSaveButton)\r
67         //}}AFX_MSG_MAP\r
68 END_MESSAGE_MAP()\r
69 \r
70 void MyDialog1::OnOK()\r
71 {\r
72 }\r
73 \r
74 void MyDialog1::OnCancel()\r
75 {\r
76 }\r
77 \r
78 void MyDialog1::AddOutputLine(CString Line)\r
79 {\r
80         CritSect.Lock();\r
81         Output += Line + "\r\n";\r
82         CritSect.Unlock();\r
83 \r
84         if (Frozen == 0)\r
85         {\r
86                 m_OutputWindow.SetWindowText(Output);\r
87                 m_OutputWindow.SetSel(Output.GetLength(), Output.GetLength());\r
88         }\r
89 }\r
90 \r
91 void MyDialog1::SetFrozen(int NewFrozen)\r
92 {\r
93         Frozen = NewFrozen;\r
94 }\r
95 \r
96 BOOL MyDialog1::OnInitDialog() \r
97 {\r
98         CDialog::OnInitDialog();\r
99         \r
100         CClientDC DevCont(&m_OutputWindow);\r
101 \r
102         EditFont.CreatePointFont(100, "Courier", NULL);\r
103         m_OutputWindow.SetFont(&EditFont);\r
104 \r
105         m_FreezeButton.EnableWindow(FALSE);\r
106         m_ContinueButton.EnableWindow(FALSE);\r
107 \r
108         Frozen = 0;\r
109 \r
110         WhiteBrush.CreateSolidBrush(RGB(255, 255, 255));\r
111 \r
112         return TRUE;\r
113 }\r
114 \r
115 void MyDialog1::OnClearButton() \r
116 {\r
117         CritSect.Lock();\r
118         Output.Empty();\r
119         CritSect.Unlock();\r
120 \r
121         m_OutputWindow.SetWindowText(Output);\r
122         m_OutputWindow.SetSel(0, 0);\r
123 }\r
124 \r
125 void MyDialog1::OnContinueButton()\r
126 {\r
127         CString Copy;\r
128         int Len;\r
129 \r
130         m_FreezeButton.EnableWindow(TRUE);\r
131         m_ContinueButton.EnableWindow(FALSE);\r
132 \r
133         Frozen = 0;\r
134 \r
135         CritSect.Lock();\r
136         Copy = Output;\r
137         Len = Output.GetLength();\r
138         CritSect.Unlock();\r
139 \r
140         m_OutputWindow.SetWindowText(Copy);\r
141         m_OutputWindow.SetSel(Len, Len);\r
142 }\r
143 \r
144 void MyDialog1::OnFreezeButton() \r
145 {\r
146         m_FreezeButton.EnableWindow(FALSE);\r
147         m_ContinueButton.EnableWindow(TRUE);\r
148 \r
149         Frozen = 1;\r
150 }\r
151 \r
152 void MyDialog1::HandleStart(void)\r
153 {\r
154         CString Copy;\r
155         int Len;\r
156 \r
157         m_FreezeButton.EnableWindow(TRUE);\r
158         m_ContinueButton.EnableWindow(FALSE);\r
159 \r
160         Frozen = 0;\r
161 \r
162         CritSect.Lock();\r
163         Copy = Output;\r
164         Len = Output.GetLength();\r
165         CritSect.Unlock();\r
166 \r
167         m_OutputWindow.SetWindowText(Copy);\r
168         m_OutputWindow.SetSel(Len, Len);\r
169 }\r
170 \r
171 void MyDialog1::HandleStop(void)\r
172 {\r
173         CString Copy;\r
174         int Len;\r
175 \r
176         m_FreezeButton.EnableWindow(FALSE);\r
177         m_ContinueButton.EnableWindow(FALSE);\r
178 \r
179         Frozen = 0;\r
180 \r
181         CritSect.Lock();\r
182         Copy = Output;\r
183         Len = Output.GetLength();\r
184         CritSect.Unlock();\r
185 \r
186         m_OutputWindow.SetWindowText(Copy);\r
187         m_OutputWindow.SetSel(Len, Len);\r
188 }\r
189 \r
190 HBRUSH MyDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) \r
191 {\r
192         HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);\r
193 \r
194         if (pWnd == &m_OutputWindow)\r
195         {\r
196                 pDC->SetBkColor(RGB(255, 255, 255));\r
197                 hbr = WhiteBrush;\r
198         }\r
199         \r
200         return hbr;\r
201 }\r
202 \r
203 void MyDialog1::OnSaveButton()\r
204 {\r
205         CString Copy;\r
206         int Len;\r
207         CFileDialog FileDialog(FALSE);\r
208         CString FileName = "OLSR log.txt";\r
209         CString PathName;\r
210         CFile File;\r
211 \r
212         CritSect.Lock();\r
213         Copy = Output;\r
214         Len = Output.GetLength();\r
215         CritSect.Unlock();\r
216 \r
217         FileDialog.m_ofn.lpstrFilter = "Text file (*.txt)\0*.txt\0";\r
218         FileDialog.m_ofn.nFilterIndex = 1;\r
219 \r
220         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);\r
221         FileDialog.m_ofn.nMaxFile = 500;\r
222 \r
223         if (FileDialog.DoModal() == IDOK)\r
224         {\r
225                 PathName = FileDialog.GetPathName();\r
226 \r
227                 if (File.Open(PathName, CFile::modeCreate | CFile::modeWrite |\r
228                         CFile::shareExclusive) == 0)\r
229                         AfxMessageBox("Cannot open logfile '" + PathName + "'.");\r
230 \r
231                 else\r
232                 {\r
233                         File.Write((const char *)Copy, Len);\r
234                         File.Close();\r
235                 }\r
236         }\r
237 \r
238         FileName.ReleaseBuffer();\r
239 }\r