Mercurial > vba-linux
comparison src/win32/Logging.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:8ced16adf2e1 | 1:f9f4f1b99eed |
---|---|
1 // Logging.cpp : implementation file | |
2 // | |
3 | |
4 #include "stdafx.h" | |
5 #include "resource.h" | |
6 #include "Logging.h" | |
7 #include "FileDlg.h" | |
8 | |
9 #include "../common/System.h" | |
10 | |
11 ///////////////////////////////////////////////////////////////////////////// | |
12 // Logging dialog | |
13 | |
14 Logging *Logging::instance = NULL; | |
15 CString Logging:: text; | |
16 | |
17 Logging::Logging(CWnd*pParent /*=NULL*/) | |
18 : ResizeDlg(Logging::IDD, pParent) | |
19 { | |
20 //{{AFX_DATA_INIT(Logging) | |
21 m_swi = FALSE; | |
22 m_unaligned_access = FALSE; | |
23 m_illegal_write = FALSE; | |
24 m_illegal_read = FALSE; | |
25 m_dma0 = FALSE; | |
26 m_dma1 = FALSE; | |
27 m_dma2 = FALSE; | |
28 m_dma3 = FALSE; | |
29 m_agbprint = FALSE; | |
30 m_undefined = FALSE; | |
31 //}}AFX_DATA_INIT | |
32 } | |
33 | |
34 void Logging::DoDataExchange(CDataExchange*pDX) | |
35 { | |
36 CDialog::DoDataExchange(pDX); | |
37 //{{AFX_DATA_MAP(Logging) | |
38 DDX_Control(pDX, IDC_LOG, m_log); | |
39 DDX_Check(pDX, IDC_VERBOSE_SWI, m_swi); | |
40 DDX_Check(pDX, IDC_VERBOSE_UNALIGNED_ACCESS, m_unaligned_access); | |
41 DDX_Check(pDX, IDC_VERBOSE_ILLEGAL_WRITE, m_illegal_write); | |
42 DDX_Check(pDX, IDC_VERBOSE_ILLEGAL_READ, m_illegal_read); | |
43 DDX_Check(pDX, IDC_VERBOSE_DMA0, m_dma0); | |
44 DDX_Check(pDX, IDC_VERBOSE_DMA1, m_dma1); | |
45 DDX_Check(pDX, IDC_VERBOSE_DMA2, m_dma2); | |
46 DDX_Check(pDX, IDC_VERBOSE_DMA3, m_dma3); | |
47 DDX_Check(pDX, IDC_VERBOSE_AGBPRINT, m_agbprint); | |
48 DDX_Check(pDX, IDC_VERBOSE_UNDEFINED, m_undefined); | |
49 //}}AFX_DATA_MAP | |
50 } | |
51 | |
52 BEGIN_MESSAGE_MAP(Logging, CDialog) | |
53 //{{AFX_MSG_MAP(Logging) | |
54 ON_BN_CLICKED(ID_OK, OnOk) | |
55 ON_BN_CLICKED(IDC_CLEAR, OnClear) | |
56 ON_BN_CLICKED(IDC_VERBOSE_AGBPRINT, OnVerboseAgbprint) | |
57 ON_BN_CLICKED(IDC_VERBOSE_DMA0, OnVerboseDma0) | |
58 ON_BN_CLICKED(IDC_VERBOSE_DMA1, OnVerboseDma1) | |
59 ON_BN_CLICKED(IDC_VERBOSE_DMA2, OnVerboseDma2) | |
60 ON_BN_CLICKED(IDC_VERBOSE_DMA3, OnVerboseDma3) | |
61 ON_BN_CLICKED(IDC_VERBOSE_ILLEGAL_READ, OnVerboseIllegalRead) | |
62 ON_BN_CLICKED(IDC_VERBOSE_ILLEGAL_WRITE, OnVerboseIllegalWrite) | |
63 ON_BN_CLICKED(IDC_VERBOSE_SWI, OnVerboseSwi) | |
64 ON_BN_CLICKED(IDC_VERBOSE_UNALIGNED_ACCESS, OnVerboseUnalignedAccess) | |
65 ON_BN_CLICKED(IDC_VERBOSE_UNDEFINED, OnVerboseUndefined) | |
66 ON_BN_CLICKED(IDC_SAVE, OnSave) | |
67 ON_EN_ERRSPACE(IDC_LOG, OnErrspaceLog) | |
68 ON_EN_MAXTEXT(IDC_LOG, OnMaxtextLog) | |
69 ON_WM_CLOSE() | |
70 //}}AFX_MSG_MAP | |
71 END_MESSAGE_MAP() | |
72 | |
73 ///////////////////////////////////////////////////////////////////////////// | |
74 // Logging message handlers | |
75 | |
76 void Logging::OnOk() | |
77 { | |
78 EndDialog(TRUE); | |
79 | |
80 instance = NULL; | |
81 } | |
82 | |
83 void Logging::OnClear() | |
84 { | |
85 text = ""; | |
86 m_log.SetWindowText(""); | |
87 } | |
88 | |
89 void Logging::OnVerboseAgbprint() | |
90 { | |
91 systemVerbose ^= 512; | |
92 } | |
93 | |
94 void Logging::OnVerboseDma0() | |
95 { | |
96 systemVerbose ^= 16; | |
97 } | |
98 | |
99 void Logging::OnVerboseDma1() | |
100 { | |
101 systemVerbose ^= 32; | |
102 } | |
103 | |
104 void Logging::OnVerboseDma2() | |
105 { | |
106 systemVerbose ^= 64; | |
107 } | |
108 | |
109 void Logging::OnVerboseDma3() | |
110 { | |
111 systemVerbose ^= 128; | |
112 } | |
113 | |
114 void Logging::OnVerboseIllegalRead() | |
115 { | |
116 systemVerbose ^= 8; | |
117 } | |
118 | |
119 void Logging::OnVerboseIllegalWrite() | |
120 { | |
121 systemVerbose ^= 4; | |
122 } | |
123 | |
124 void Logging::OnVerboseSwi() | |
125 { | |
126 systemVerbose ^= 1; | |
127 } | |
128 | |
129 void Logging::OnVerboseUnalignedAccess() | |
130 { | |
131 systemVerbose ^= 2; | |
132 } | |
133 | |
134 void Logging::OnVerboseUndefined() | |
135 { | |
136 systemVerbose ^= 256; | |
137 } | |
138 | |
139 void Logging::OnSave() | |
140 { | |
141 int len = m_log.GetWindowTextLength(); | |
142 | |
143 char *mem = (char *)malloc(len); | |
144 | |
145 if (mem) | |
146 { | |
147 LPCTSTR exts[] = { ".txt", NULL }; | |
148 m_log.GetWindowText(mem, len); | |
149 CString filter = "All Files|*.*||"; | |
150 FileDlg dlg(this, "", filter, 0, | |
151 NULL, exts, NULL, "Save output", true); | |
152 | |
153 if (dlg.DoModal() == IDOK) | |
154 { | |
155 FILE *f = fopen(dlg.GetPathName(), "w"); | |
156 if (f) | |
157 { | |
158 fwrite(mem, 1, len, f); | |
159 fclose(f); | |
160 } | |
161 } | |
162 } | |
163 | |
164 free(mem); | |
165 } | |
166 | |
167 void Logging::OnErrspaceLog() | |
168 { | |
169 systemMessage(0, "Error allocating space"); | |
170 } | |
171 | |
172 void Logging::OnMaxtextLog() | |
173 { | |
174 systemMessage(0, "Max text length reached %d", m_log.GetLimitText()); | |
175 } | |
176 | |
177 void Logging::PostNcDestroy() | |
178 { | |
179 delete this; | |
180 } | |
181 | |
182 BOOL Logging::OnInitDialog() | |
183 { | |
184 CDialog::OnInitDialog(); | |
185 | |
186 DIALOG_SIZER_START(sz) | |
187 DIALOG_SIZER_ENTRY(IDC_LOG, DS_SizeY|DS_SizeX) | |
188 DIALOG_SIZER_ENTRY(ID_OK, DS_MoveY) | |
189 DIALOG_SIZER_ENTRY(IDC_CLEAR, DS_MoveY) | |
190 DIALOG_SIZER_ENTRY(IDC_SAVE, DS_MoveY) | |
191 DIALOG_SIZER_END() | |
192 SetData(sz, | |
193 TRUE, | |
194 HKEY_CURRENT_USER, | |
195 "Software\\Emulators\\VisualBoyAdvance\\Viewer\\LogView", | |
196 NULL); | |
197 | |
198 m_swi = (systemVerbose & 1) != 0; | |
199 m_unaligned_access = (systemVerbose & 2) != 0; | |
200 m_illegal_write = (systemVerbose & 4) != 0; | |
201 m_illegal_read = (systemVerbose & 8) != 0; | |
202 m_dma0 = (systemVerbose & 16) != 0; | |
203 m_dma1 = (systemVerbose & 32) != 0; | |
204 m_dma2 = (systemVerbose & 64) != 0; | |
205 m_dma3 = (systemVerbose & 128) != 0; | |
206 m_undefined = (systemVerbose & 256) != 0; | |
207 m_agbprint = (systemVerbose & 256) != 0; | |
208 UpdateData(FALSE); | |
209 | |
210 m_log.LimitText(-1); | |
211 m_log.SetWindowText(text); | |
212 | |
213 return TRUE; // return TRUE unless you set the focus to a control | |
214 // EXCEPTION: OCX Property Pages should return FALSE | |
215 } | |
216 | |
217 void Logging::log(const char *s) | |
218 { | |
219 int size = ::SendMessage(m_log, WM_GETTEXTLENGTH, 0, 0); | |
220 m_log.SetSel(size, size); | |
221 m_log.ReplaceSel(s); | |
222 } | |
223 | |
224 void Logging::OnClose() | |
225 { | |
226 EndDialog(FALSE); | |
227 | |
228 instance = NULL; | |
229 | |
230 CDialog::OnClose(); | |
231 } | |
232 | |
233 void toolsLogging() | |
234 { | |
235 if (Logging::instance == NULL) | |
236 { | |
237 Logging::instance = new Logging(); | |
238 Logging::instance->Create(IDD_LOGGING, AfxGetApp()->m_pMainWnd); | |
239 Logging::instance->ShowWindow(SW_SHOW); | |
240 } | |
241 else | |
242 { | |
243 Logging::instance->SetForegroundWindow(); | |
244 } | |
245 } | |
246 | |
247 void toolsLog(const char *s) | |
248 { | |
249 CString str; | |
250 int state = 0; | |
251 if (s) | |
252 { | |
253 char c = *s++; | |
254 while (c) | |
255 { | |
256 if (c == '\n' && state == 0) | |
257 str += '\r'; | |
258 else if (c == '\r') | |
259 state = 1; | |
260 else | |
261 state = 0; | |
262 str += c; | |
263 c = *s++; | |
264 } | |
265 } | |
266 | |
267 Logging::text += str; | |
268 if (Logging::instance != NULL) | |
269 { | |
270 Logging::instance->log(str); | |
271 } | |
272 } | |
273 |