summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/odebug.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/libopie2/opiecore/odebug.cpp b/libopie2/opiecore/odebug.cpp
index b4eaf2d..b2a37bc 100644
--- a/libopie2/opiecore/odebug.cpp
+++ b/libopie2/opiecore/odebug.cpp
@@ -1,628 +1,632 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 (C) 2003 Michael 'Mickey' Lauer (mickey@tm.informatik.uni-frankfurt.de) 3 (C) 2003 Michael 'Mickey' Lauer (mickey@tm.informatik.uni-frankfurt.de)
4 Inspired by the KDE debug classes, which are 4 Inspired by the KDE debug classes, which are
5 (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) 5 (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org)
6 (C) 2002 Holger Freyther (freyther@kde.org) 6 (C) 2002 Holger Freyther (freyther@kde.org)
7 =. 7 =.
8 .=l. 8 .=l.
9           .>+-= 9           .>+-=
10 _;:,     .>    :=|. This program is free software; you can 10 _;:,     .>    :=|. This program is free software; you can
11.> <`_,   >  .   <= redistribute it and/or modify it under 11.> <`_,   >  .   <= redistribute it and/or modify it under
12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 12:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
13.="- .-=="i,     .._ License as published by the Free Software 13.="- .-=="i,     .._ License as published by the Free Software
14 - .   .-<_>     .<> Foundation; either version 2 of the License, 14 - .   .-<_>     .<> Foundation; either version 2 of the License,
15     ._= =}       : or (at your option) any later version. 15     ._= =}       : or (at your option) any later version.
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31*/ 31*/
32 32
33// Include this header without OPIE_NO_DEBUG defined to avoid having the oDebugInfo 33// Include this header without OPIE_NO_DEBUG defined to avoid having the oDebugInfo
34// functions inlined to noops (which would then conflict with their definition here). 34// functions inlined to noops (which would then conflict with their definition here).
35 35
36#include <opie2/odebug.h> 36#include <opie2/odebug.h>
37 37
38#ifdef OPIE_NO_DEBUG 38#ifdef OPIE_NO_DEBUG
39#undef odDebug 39#undef odDebug
40#undef odBacktrace 40#undef odBacktrace
41#endif 41#endif
42 42
43/* OPIE */ 43/* OPIE */
44 44
45#include <opie2/oapplication.h> 45#include <opie2/oapplication.h>
46#include <opie2/oglobalsettings.h> 46#include <opie2/oglobalsettings.h>
47#include <opie2/oconfig.h> 47#include <opie2/oconfig.h>
48 48
49/* QT */ 49/* QT */
50 50
51#include <qbrush.h> 51#include <qbrush.h>
52#include <qdatetime.h> 52#include <qdatetime.h>
53#include <qfile.h> 53#include <qfile.h>
54#include <qhostaddress.h> 54#include <qhostaddress.h>
55#include <qmessagebox.h> 55#include <qmessagebox.h>
56#include <qintdict.h> 56#include <qintdict.h>
57#include <qpoint.h> 57#include <qpoint.h>
58#include <qrect.h> 58#include <qrect.h>
59#include <qregion.h> 59#include <qregion.h>
60#include <qsize.h> 60#include <qsize.h>
61#include <qsocketdevice.h> 61#include <qsocketdevice.h>
62#include <qstring.h> 62#include <qstring.h>
63#include <qstringlist.h> 63#include <qstringlist.h>
64#include <qtextstream.h> 64#include <qtextstream.h>
65 65
66/* UNIX */ 66/* UNIX */
67 67
68#include <stdlib.h> // abort 68#include <stdlib.h> // abort
69#include <unistd.h> // getpid 69#include <unistd.h> // getpid
70#include <stdarg.h> // vararg stuff 70#include <stdarg.h> // vararg stuff
71#include <ctype.h> // isprint 71#include <ctype.h> // isprint
72#include <syslog.h> 72#include <syslog.h>
73#include <errno.h> 73#include <errno.h>
74#include <string.h> 74#include <string.h>
75 75
76#ifndef OPIE_NO_BACKTRACE 76#ifndef OPIE_NO_BACKTRACE
77#include <execinfo.h> 77#include <execinfo.h>
78#endif 78#endif
79 79
80 80
81/*====================================================================================== 81/*======================================================================================
82 * debug levels 82 * debug levels
83 *======================================================================================*/ 83 *======================================================================================*/
84 84
85enum DebugLevels { 85enum DebugLevels {
86 ODEBUG_INFO = 0, 86 ODEBUG_INFO = 0,
87 ODEBUG_WARN = 1, 87 ODEBUG_WARN = 1,
88 ODEBUG_ERROR = 2, 88 ODEBUG_ERROR = 2,
89 ODEBUG_FATAL = 3 89 ODEBUG_FATAL = 3
90}; 90};
91 91
92/*====================================================================================== 92/*======================================================================================
93 * oDebug private data 93 * oDebug private data
94 *======================================================================================*/ 94 *======================================================================================*/
95 95
96/*====================================================================================== 96/*======================================================================================
97 * the main debug function 97 * the main debug function
98 *======================================================================================*/ 98 *======================================================================================*/
99 99
100static void oDebugBackend( unsigned short level, unsigned int area, const char *data) 100static void oDebugBackend( unsigned short level, unsigned int area, const char *data)
101{ 101{
102 //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data ); 102 //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data );
103 103
104 // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an 104 // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an
105 // ML: example use. I think it's not necessary to implement such a strategy here. 105 // ML: example use. I think it's not necessary to implement such a strategy here.
106 // ML: Comments? 106 // ML: Comments?
107 107
108 int priority = 0; 108 int priority = 0;
109 QString caption; 109 QString caption;
110 QString lev; 110 QString lev;
111 switch( level ) 111 switch( level )
112 { 112 {
113 case ODEBUG_INFO: lev = "(Info)"; caption = "Info"; priority = LOG_INFO; break; 113 case ODEBUG_INFO: lev = "(Info)"; caption = "Info"; priority = LOG_INFO; break;
114 case ODEBUG_WARN: lev = "(Warn)"; caption = "Warning"; priority = LOG_WARNING; break; 114 case ODEBUG_WARN: lev = "(Warn)"; caption = "Warning"; priority = LOG_WARNING; break;
115 case ODEBUG_FATAL: lev = "(Fatal)"; caption = "Fatal Error"; priority = LOG_CRIT; break; 115 case ODEBUG_FATAL: lev = "(Fatal)"; caption = "Fatal Error"; priority = LOG_CRIT; break;
116 default: qDebug( "oDebugBackend: Warning: Unknown debug level! - defaulting to ODEBUG_ERROR." ); 116 default: qDebug( "oDebugBackend: Warning: Unknown debug level! - defaulting to ODEBUG_ERROR." );
117 case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break; 117 case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break;
118 } 118 }
119 119
120 short output = OGlobalSettings::debugMode(); 120 short output = OGlobalSettings::debugMode();
121 if (!oApp && (output == 1)) 121 if (!oApp && (output == 1))
122 { 122 {
123 qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" ); 123 qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" );
124 output = 2; // need an application object to use MsgBox 124 output = 2; // need an application object to use MsgBox
125 } 125 }
126 126
127 QString areaName = (oApp) ? oApp->appName() : "<unknown>"; 127 // gcc 2.9x is dumb and sucks... can you hear it?
128 //QString areaName = (oApp) ? oApp->appName() : "<unknown>";
129 QString areaName;
130 if ( oApp ) areaName = oApp->appName();
131 else areaName = "<unknown>";
128 132
129 // Output 133 // Output
130 switch( output ) 134 switch( output )
131 { 135 {
132 case -1: // ignore 136 case -1: // ignore
133 { 137 {
134 return; 138 return;
135 } 139 }
136 case 0: // File 140 case 0: // File
137 { 141 {
138 QString outputFilename = OGlobalSettings::debugOutput(); 142 QString outputFilename = OGlobalSettings::debugOutput();
139 143
140 const int BUFSIZE = 4096; 144 const int BUFSIZE = 4096;
141 char buf[BUFSIZE] = ""; 145 char buf[BUFSIZE] = "";
142 buf[BUFSIZE-1] = '\0'; 146 buf[BUFSIZE-1] = '\0';
143 int nSize; 147 int nSize;
144 148
145 nSize = snprintf( buf, BUFSIZE-1, "%s: %s", (const char*) areaName, data); 149 nSize = snprintf( buf, BUFSIZE-1, "%s: %s", (const char*) areaName, data);
146 150
147 QFile outputFile( outputFilename ); 151 QFile outputFile( outputFilename );
148 if ( outputFile.open( IO_WriteOnly | IO_Append ) ) 152 if ( outputFile.open( IO_WriteOnly | IO_Append ) )
149 { 153 {
150 if ( ( nSize == -1 ) || ( nSize >= BUFSIZE ) ) 154 if ( ( nSize == -1 ) || ( nSize >= BUFSIZE ) )
151 { 155 {
152 outputFile.writeBlock( buf, BUFSIZE-1 ); 156 outputFile.writeBlock( buf, BUFSIZE-1 );
153 } 157 }
154 else 158 else
155 { 159 {
156 outputFile.writeBlock( buf, nSize ); 160 outputFile.writeBlock( buf, nSize );
157 } 161 }
158 } 162 }
159 else 163 else
160 { 164 {
161 qDebug( "ODebug: can't write to file '%s' (%s)", (const char*) outputFilename, strerror(errno) ); 165 qDebug( "ODebug: can't write to file '%s' (%s)", (const char*) outputFilename, strerror(errno) );
162 } 166 }
163 break; 167 break;
164 } // automatic close of file here 168 } // automatic close of file here
165 169
166 case 1: // Message Box 170 case 1: // Message Box
167 { 171 {
168 // Since we are in opiecore here, we cannot use OMsgBox and use 172 // Since we are in opiecore here, we cannot use OMsgBox and use
169 // QMessageBox instead 173 // QMessageBox instead
170 174
171 caption += QString("(") + areaName + ")"; 175 caption += QString("(") + areaName + ")";
172 QMessageBox::warning( 0L, caption, data, ("&OK") ); // tr? 176 QMessageBox::warning( 0L, caption, data, ("&OK") ); // tr?
173 break; 177 break;
174 } 178 }
175 179
176 case 2: // Shell 180 case 2: // Shell
177 { 181 {
178 FILE *output = stderr; 182 FILE *output = stderr;
179 fprintf( output, "%s: ", (const char*) areaName ); 183 fprintf( output, "%s: ", (const char*) areaName );
180 fputs( data, output); 184 fputs( data, output);
181 break; 185 break;
182 } 186 }
183 187
184 case 3: // syslog 188 case 3: // syslog
185 { 189 {
186 syslog( priority, "%s", data); 190 syslog( priority, "%s", data);
187 break; 191 break;
188 } 192 }
189 193
190 case 4: // socket 194 case 4: // socket
191 { 195 {
192 QString destination = OGlobalSettings::debugOutput(); 196 QString destination = OGlobalSettings::debugOutput();
193 if ( destination && destination.find(":") != -1 ) 197 if ( destination && destination.find(":") != -1 )
194 { 198 {
195 QString host = destination.left( destination.find(":") ); 199 QString host = destination.left( destination.find(":") );
196 QString port = destination.right( destination.length()-host.length()-1 ); 200 QString port = destination.right( destination.length()-host.length()-1 );
197 QHostAddress addr; 201 QHostAddress addr;
198 addr.setAddress( host ); 202 addr.setAddress( host );
199 // TODO: sanity check the address 203 // TODO: sanity check the address
200 QString line; 204 QString line;
201 line.sprintf( "%s: %s", (const char*) areaName, (const char*) data ); 205 line.sprintf( "%s: %s", (const char*) areaName, (const char*) data );
202 QSocketDevice s( QSocketDevice::Datagram ); 206 QSocketDevice s( QSocketDevice::Datagram );
203 int result = s.writeBlock( (const char*) line, line.length(), addr, port.toInt() ); 207 int result = s.writeBlock( (const char*) line, line.length(), addr, port.toInt() );
204 if ( result == -1 ) 208 if ( result == -1 )
205 { 209 {
206 qDebug( "ODebug: can't send to address '%s:%d' (%s)", (const char*) host, port.toInt(), strerror(errno) ); 210 qDebug( "ODebug: can't send to address '%s:%d' (%s)", (const char*) host, port.toInt(), strerror(errno) );
207 } 211 }
208 } 212 }
209 break; 213 break;
210 } 214 }
211 } 215 }
212 216
213 // check if we should abort 217 // check if we should abort
214 218
215 /* 219 /*
216 220
217 if( ( nLevel == ODEBUG_FATAL ) 221 if( ( nLevel == ODEBUG_FATAL )
218 && ( !oDebug_data->config || oDebug_data->config->readNumEntry( "AbortFatal", 1 ) ) ) 222 && ( !oDebug_data->config || oDebug_data->config->readNumEntry( "AbortFatal", 1 ) ) )
219 abort(); 223 abort();
220 224
221 */ 225 */
222} 226}
223 227
224/*====================================================================================== 228/*======================================================================================
225 * odbgstream 229 * odbgstream
226 *======================================================================================*/ 230 *======================================================================================*/
227 231
228odbgstream& perror( odbgstream &s) 232odbgstream& perror( odbgstream &s)
229{ 233{
230 return s << QString::fromLocal8Bit(strerror(errno)); 234 return s << QString::fromLocal8Bit(strerror(errno));
231} 235}
232 236
233odbgstream odDebug(int area) 237odbgstream odDebug(int area)
234{ 238{
235 return odbgstream(area, ODEBUG_INFO); 239 return odbgstream(area, ODEBUG_INFO);
236} 240}
237odbgstream odDebug(bool cond, int area) 241odbgstream odDebug(bool cond, int area)
238{ 242{
239 if (cond) return odbgstream(area, ODEBUG_INFO); 243 if (cond) return odbgstream(area, ODEBUG_INFO);
240 else return odbgstream(0, 0, false); 244 else return odbgstream(0, 0, false);
241} 245}
242 246
243odbgstream odError(int area) 247odbgstream odError(int area)
244{ 248{
245 return odbgstream("ERROR: ", area, ODEBUG_ERROR); 249 return odbgstream("ERROR: ", area, ODEBUG_ERROR);
246} 250}
247 251
248odbgstream odError(bool cond, int area) 252odbgstream odError(bool cond, int area)
249{ 253{
250 if (cond) return odbgstream("ERROR: ", area, ODEBUG_ERROR); else return odbgstream(0,0,false); 254 if (cond) return odbgstream("ERROR: ", area, ODEBUG_ERROR); else return odbgstream(0,0,false);
251} 255}
252 256
253odbgstream odWarning(int area) 257odbgstream odWarning(int area)
254{ 258{
255 return odbgstream("WARNING: ", area, ODEBUG_WARN); 259 return odbgstream("WARNING: ", area, ODEBUG_WARN);
256} 260}
257 261
258odbgstream odWarning(bool cond, int area) 262odbgstream odWarning(bool cond, int area)
259{ 263{
260 if (cond) return odbgstream("WARNING: ", area, ODEBUG_WARN); else return odbgstream(0,0,false); 264 if (cond) return odbgstream("WARNING: ", area, ODEBUG_WARN); else return odbgstream(0,0,false);
261} 265}
262 266
263odbgstream odFatal(int area) 267odbgstream odFatal(int area)
264{ 268{
265 return odbgstream("FATAL: ", area, ODEBUG_FATAL); 269 return odbgstream("FATAL: ", area, ODEBUG_FATAL);
266} 270}
267 271
268odbgstream odFatal(bool cond, int area) 272odbgstream odFatal(bool cond, int area)
269{ 273{
270 if (cond) return odbgstream("FATAL: ", area, ODEBUG_FATAL); else return odbgstream(0,0,false); 274 if (cond) return odbgstream("FATAL: ", area, ODEBUG_FATAL); else return odbgstream(0,0,false);
271} 275}
272 276
273odbgstream::odbgstream(unsigned int _area, unsigned int _level, bool _print) 277odbgstream::odbgstream(unsigned int _area, unsigned int _level, bool _print)
274 :area(_area), level(_level), print(_print) 278 :area(_area), level(_level), print(_print)
275{ 279{
276} 280}
277 281
278 282
279odbgstream::odbgstream(const char * initialString, unsigned int _area, unsigned int _level, bool _print) 283odbgstream::odbgstream(const char * initialString, unsigned int _area, unsigned int _level, bool _print)
280 :output(QString::fromLatin1(initialString)), area(_area), level(_level), print(_print) 284 :output(QString::fromLatin1(initialString)), area(_area), level(_level), print(_print)
281{ 285{
282} 286}
283 287
284 288
285odbgstream::odbgstream(odbgstream &str) 289odbgstream::odbgstream(odbgstream &str)
286 :output(str.output), area(str.area), level(str.level), print(str.print) 290 :output(str.output), area(str.area), level(str.level), print(str.print)
287{ 291{
288 str.output.truncate(0); 292 str.output.truncate(0);
289} 293}
290 294
291 295
292odbgstream::odbgstream(const odbgstream &str) 296odbgstream::odbgstream(const odbgstream &str)
293 :output(str.output), area(str.area), level(str.level), print(str.print) 297 :output(str.output), area(str.area), level(str.level), print(str.print)
294{ 298{
295} 299}
296 300
297odbgstream& odbgstream::operator<<(bool i) 301odbgstream& odbgstream::operator<<(bool i)
298{ 302{
299 if (!print) return *this; 303 if (!print) return *this;
300 output += QString::fromLatin1(i ? "true" : "false"); 304 output += QString::fromLatin1(i ? "true" : "false");
301 return *this; 305 return *this;
302} 306}
303 307
304 308
305odbgstream& odbgstream::operator<<(short i) 309odbgstream& odbgstream::operator<<(short i)
306{ 310{
307 if (!print) return *this; 311 if (!print) return *this;
308 QString tmp; tmp.setNum(i); output += tmp; 312 QString tmp; tmp.setNum(i); output += tmp;
309 return *this; 313 return *this;
310} 314}
311 315
312 316
313odbgstream& odbgstream::operator<<(unsigned short i) 317odbgstream& odbgstream::operator<<(unsigned short i)
314{ 318{
315 if (!print) return *this; 319 if (!print) return *this;
316 QString tmp; tmp.setNum(i); output += tmp; 320 QString tmp; tmp.setNum(i); output += tmp;
317 return *this; 321 return *this;
318} 322}
319 323
320 324
321odbgstream& odbgstream::operator<<(unsigned char i) 325odbgstream& odbgstream::operator<<(unsigned char i)
322{ 326{
323 return operator<<( static_cast<char>( i ) ); 327 return operator<<( static_cast<char>( i ) );
324} 328}
325 329
326 330
327odbgstream& odbgstream::operator<<(int i) 331odbgstream& odbgstream::operator<<(int i)
328{ 332{
329 if (!print) return *this; 333 if (!print) return *this;
330 QString tmp; tmp.setNum(i); output += tmp; 334 QString tmp; tmp.setNum(i); output += tmp;
331 return *this; 335 return *this;
332} 336}
333 337
334 338
335odbgstream& odbgstream::operator<<(unsigned int i) 339odbgstream& odbgstream::operator<<(unsigned int i)
336{ 340{
337 if (!print) return *this; 341 if (!print) return *this;
338 QString tmp; tmp.setNum(i); output += tmp; 342 QString tmp; tmp.setNum(i); output += tmp;
339 return *this; 343 return *this;
340} 344}
341 345
342 346
343odbgstream& odbgstream::operator<<(long i) 347odbgstream& odbgstream::operator<<(long i)
344{ 348{
345 if (!print) return *this; 349 if (!print) return *this;
346 QString tmp; tmp.setNum(i); output += tmp; 350 QString tmp; tmp.setNum(i); output += tmp;
347 return *this; 351 return *this;
348} 352}
349 353
350 354
351odbgstream& odbgstream::operator<<(unsigned long i) 355odbgstream& odbgstream::operator<<(unsigned long i)
352{ 356{
353 if (!print) return *this; 357 if (!print) return *this;
354 QString tmp; tmp.setNum(i); output += tmp; 358 QString tmp; tmp.setNum(i); output += tmp;
355 return *this; 359 return *this;
356} 360}
357 361
358 362
359odbgstream& odbgstream::operator<<(const QString& string) 363odbgstream& odbgstream::operator<<(const QString& string)
360{ 364{
361 if (!print) return *this; 365 if (!print) return *this;
362 output += string; 366 output += string;
363 if (output.at(output.length() -1 ) == '\n') 367 if (output.at(output.length() -1 ) == '\n')
364 flush(); 368 flush();
365 return *this; 369 return *this;
366} 370}
367 371
368 372
369odbgstream& odbgstream::operator<<(const char *string) 373odbgstream& odbgstream::operator<<(const char *string)
370{ 374{
371 if (!print) return *this; 375 if (!print) return *this;
372 output += QString::fromUtf8(string); 376 output += QString::fromUtf8(string);
373 if (output.at(output.length() - 1) == '\n') 377 if (output.at(output.length() - 1) == '\n')
374 flush(); 378 flush();
375 return *this; 379 return *this;
376} 380}
377 381
378 382
379odbgstream& odbgstream::operator<<(const QCString& string) 383odbgstream& odbgstream::operator<<(const QCString& string)
380{ 384{
381 *this << string.data(); 385 *this << string.data();
382 return *this; 386 return *this;
383} 387}
384 388
385 389
386odbgstream& odbgstream::operator<<(const void * p) 390odbgstream& odbgstream::operator<<(const void * p)
387{ 391{
388 form("%p", p); 392 form("%p", p);
389 return *this; 393 return *this;
390} 394}
391 395
392odbgstream& odbgstream::operator<<(double d) 396odbgstream& odbgstream::operator<<(double d)
393{ 397{
394 QString tmp; tmp.setNum(d); output += tmp; 398 QString tmp; tmp.setNum(d); output += tmp;
395 return *this; 399 return *this;
396} 400}
397 401
398/* 402/*
399odbgstream::odbgstream &form(const char *format, ...) 403odbgstream::odbgstream &form(const char *format, ...)
400#ifdef __GNUC__ 404#ifdef __GNUC__
401 __attribute__ ( ( format ( printf, 2, 3 ) ) ) 405 __attribute__ ( ( format ( printf, 2, 3 ) ) )
402#endif 406#endif
403 ; 407 ;
404*/ 408*/
405 409
406void odbgstream::flush() 410void odbgstream::flush()
407{ 411{
408 if ( output.isEmpty() || !print ) 412 if ( output.isEmpty() || !print )
409 { 413 {
410 return; 414 return;
411 } 415 }
412 else 416 else
413 { 417 {
414 oDebugBackend( level, area, output.local8Bit().data() ); 418 oDebugBackend( level, area, output.local8Bit().data() );
415 output = QString::null; 419 output = QString::null;
416 } 420 }
417} 421}
418 422
419odbgstream& odbgstream::form(const char *format, ...) 423odbgstream& odbgstream::form(const char *format, ...)
420{ 424{
421 char buf[4096]; 425 char buf[4096];
422 va_list arguments; 426 va_list arguments;
423 va_start( arguments, format ); 427 va_start( arguments, format );
424 buf[sizeof(buf)-1] = '\0'; 428 buf[sizeof(buf)-1] = '\0';
425 vsnprintf( buf, sizeof(buf)-1, format, arguments ); 429 vsnprintf( buf, sizeof(buf)-1, format, arguments );
426 va_end(arguments); 430 va_end(arguments);
427 *this << buf; 431 *this << buf;
428 return *this; 432 return *this;
429} 433}
430 434
431odbgstream::~odbgstream() 435odbgstream::~odbgstream()
432{ 436{
433 if (!output.isEmpty()) 437 if (!output.isEmpty())
434 { 438 {
435 fprintf(stderr, "ASSERT: debug output not ended with \\n\n"); 439 fprintf(stderr, "ASSERT: debug output not ended with \\n\n");
436 *this << "\n"; 440 *this << "\n";
437 } 441 }
438} 442}
439 443
440odbgstream& odbgstream::operator<<(char ch) 444odbgstream& odbgstream::operator<<(char ch)
441{ 445{
442 if (!print) return *this; 446 if (!print) return *this;
443 if (!isprint(ch)) 447 if (!isprint(ch))
444 { 448 {
445 output += "\\x" + QString::number( static_cast<uint>( ch ) + 0x100, 16 ).right(2); 449 output += "\\x" + QString::number( static_cast<uint>( ch ) + 0x100, 16 ).right(2);
446 } 450 }
447 else 451 else
448 { 452 {
449 output += ch; 453 output += ch;
450 if (ch == '\n') flush(); 454 if (ch == '\n') flush();
451 } 455 }
452 return *this; 456 return *this;
453} 457}
454 458
455odbgstream& odbgstream::operator<<( QWidget* widget ) 459odbgstream& odbgstream::operator<<( QWidget* widget )
456{ 460{
457 QString string, temp; 461 QString string, temp;
458 // ----- 462 // -----
459 if(widget==0) 463 if(widget==0)
460 { 464 {
461 string=(QString)"[Null pointer]"; 465 string=(QString)"[Null pointer]";
462 } else 466 } else
463 { 467 {
464 temp.setNum((ulong)widget, 16); 468 temp.setNum((ulong)widget, 16);
465 string=(QString)"["+widget->className()+" pointer " + "(0x" + temp + ")"; 469 string=(QString)"["+widget->className()+" pointer " + "(0x" + temp + ")";
466 if(widget->name(0)==0) 470 if(widget->name(0)==0)
467 { 471 {
468 string += " to unnamed widget, "; 472 string += " to unnamed widget, ";
469 } else 473 } else
470 { 474 {
471 string += (QString)" to widget " + widget->name() + ", "; 475 string += (QString)" to widget " + widget->name() + ", ";
472 } 476 }
473 string += "geometry=" 477 string += "geometry="
474 + QString().setNum(widget->width()) 478 + QString().setNum(widget->width())
475 + "x"+QString().setNum(widget->height()) 479 + "x"+QString().setNum(widget->height())
476 + "+"+QString().setNum(widget->x()) 480 + "+"+QString().setNum(widget->x())
477 + "+"+QString().setNum(widget->y()) 481 + "+"+QString().setNum(widget->y())
478 + "]"; 482 + "]";
479 } 483 }
480 if (!print) return *this; 484 if (!print) return *this;
481 485
482 output += string; 486 output += string;
483 if (output.at(output.length()-1) == '\n') 487 if (output.at(output.length()-1) == '\n')
484 { 488 {
485 flush(); 489 flush();
486 } 490 }
487 return *this; 491 return *this;
488} 492}
489 493
490/* 494/*
491 * either use 'output' directly and do the flush if needed 495 * either use 'output' directly and do the flush if needed
492 * or use the QString operator which calls the char* operator 496 * or use the QString operator which calls the char* operator
493 * 497 *
494 */ 498 */
495odbgstream& odbgstream::operator<<( const QDateTime& time) 499odbgstream& odbgstream::operator<<( const QDateTime& time)
496{ 500{
497 *this << time.toString(); 501 *this << time.toString();
498 return *this; 502 return *this;
499} 503}
500 504
501 505
502odbgstream& odbgstream::operator<<( const QDate& date) 506odbgstream& odbgstream::operator<<( const QDate& date)
503{ 507{
504 *this << date.toString(); 508 *this << date.toString();
505 509
506 return *this; 510 return *this;
507} 511}
508 512
509 513
510odbgstream& odbgstream::operator<<( const QTime& time ) 514odbgstream& odbgstream::operator<<( const QTime& time )
511{ 515{
512 *this << time.toString(); 516 *this << time.toString();
513 return *this; 517 return *this;
514} 518}
515 519
516 520
517odbgstream& odbgstream::operator<<( const QPoint& p ) 521odbgstream& odbgstream::operator<<( const QPoint& p )
518{ 522{
519 *this << "(" << p.x() << ", " << p.y() << ")"; 523 *this << "(" << p.x() << ", " << p.y() << ")";
520 return *this; 524 return *this;
521} 525}
522 526
523 527
524odbgstream& odbgstream::operator<<( const QSize& s ) 528odbgstream& odbgstream::operator<<( const QSize& s )
525{ 529{
526 *this << "[" << s.width() << "x" << s.height() << "]"; 530 *this << "[" << s.width() << "x" << s.height() << "]";
527 return *this; 531 return *this;
528} 532}
529 533
530 534
531odbgstream& odbgstream::operator<<( const QRect& r ) 535odbgstream& odbgstream::operator<<( const QRect& r )
532{ 536{
533 *this << "[" << r.left() << ", " << r.top() << " - " << r.right() << ", " << r.bottom() << "]"; 537 *this << "[" << r.left() << ", " << r.top() << " - " << r.right() << ", " << r.bottom() << "]";
534 return *this; 538 return *this;
535} 539}
536 540
537 541
538odbgstream& odbgstream::operator<<( const QRegion& reg ) 542odbgstream& odbgstream::operator<<( const QRegion& reg )
539{ 543{
540 /* Qt2 doesn't have a QMemArray... :( 544 /* Qt2 doesn't have a QMemArray... :(
541 *this << "[ "; 545 *this << "[ ";
542 QMemArray<QRect>rs=reg.rects(); 546 QMemArray<QRect>rs=reg.rects();
543 for (uint i=0;i<rs.size();++i) 547 for (uint i=0;i<rs.size();++i)
544 *this << QString("[%1, %2 - %3, %4] ").arg(rs[i].left()).arg(rs[i].top()).arg(rs[i].right()).arg(rs[i].bottom() ) ; 548 *this << QString("[%1, %2 - %3, %4] ").arg(rs[i].left()).arg(rs[i].top()).arg(rs[i].right()).arg(rs[i].bottom() ) ;
545 *this <<"]"; 549 *this <<"]";
546 */ 550 */
547 return *this; 551 return *this;
548} 552}
549 553
550 554
551odbgstream& odbgstream::operator<<( const QStringList& l ) 555odbgstream& odbgstream::operator<<( const QStringList& l )
552{ 556{
553 *this << "("; 557 *this << "(";
554 *this << l.join(","); 558 *this << l.join(",");
555 *this << ")"; 559 *this << ")";
556 560
557 return *this; 561 return *this;
558} 562}
559 563
560 564
561odbgstream& odbgstream::operator<<( const QColor& c ) 565odbgstream& odbgstream::operator<<( const QColor& c )
562{ 566{
563 if ( c.isValid() ) 567 if ( c.isValid() )
564 *this << c.name(); 568 *this << c.name();
565 else 569 else
566 *this << "(invalid/default)"; 570 *this << "(invalid/default)";
567 return *this; 571 return *this;
568} 572}
569 573
570 574
571odbgstream& odbgstream::operator<<( const QBrush& b) 575odbgstream& odbgstream::operator<<( const QBrush& b)
572{ 576{
573 static const char* const s_brushStyles[] = { 577 static const char* const s_brushStyles[] = {
574 "NoBrush", "SolidPattern", "Dense1Pattern", "Dense2Pattern", "Dense3Pattern", 578 "NoBrush", "SolidPattern", "Dense1Pattern", "Dense2Pattern", "Dense3Pattern",
575 "Dense4Pattern", "Dense5Pattern", "Dense6Pattern", "Dense7Pattern", 579 "Dense4Pattern", "Dense5Pattern", "Dense6Pattern", "Dense7Pattern",
576 "HorPattern", "VerPattern", "CrossPattern", "BDiagPattern", "FDiagPattern", 580 "HorPattern", "VerPattern", "CrossPattern", "BDiagPattern", "FDiagPattern",
577 "DiagCrossPattern" }; 581 "DiagCrossPattern" };
578 582
579 *this <<"[ style: "; 583 *this <<"[ style: ";
580 *this <<s_brushStyles[ b.style() ]; 584 *this <<s_brushStyles[ b.style() ];
581 *this <<" color: "; 585 *this <<" color: ";
582 // can't use operator<<(str, b.color()) because that terminates a odbgstream (flushes) 586 // can't use operator<<(str, b.color()) because that terminates a odbgstream (flushes)
583 if ( b.color().isValid() ) 587 if ( b.color().isValid() )
584 *this <<b.color().name() ; 588 *this <<b.color().name() ;
585 else 589 else
586 *this <<"(invalid/default)"; 590 *this <<"(invalid/default)";
587 if ( b.pixmap() ) 591 if ( b.pixmap() )
588 *this <<" has a pixmap"; 592 *this <<" has a pixmap";
589 *this <<" ]"; 593 *this <<" ]";
590 return *this; 594 return *this;
591} 595}
592 596
593 597
594 598
595QString odBacktrace( int levels ) 599QString odBacktrace( int levels )
596{ 600{
597 QString s; 601 QString s;
598#ifndef OPIE_NO_BACKTRACE 602#ifndef OPIE_NO_BACKTRACE
599 void* trace[256]; 603 void* trace[256];
600 int n = backtrace(trace, 256); 604 int n = backtrace(trace, 256);
601 char** strings = backtrace_symbols (trace, n); 605 char** strings = backtrace_symbols (trace, n);
602 606
603 if ( levels != -1 ) 607 if ( levels != -1 )
604 n = QMIN( n, levels ); 608 n = QMIN( n, levels );
605 s = "[\n"; 609 s = "[\n";
606 610
607 for (int i = 0; i < n; ++i) 611 for (int i = 0; i < n; ++i)
608 s += QString::number(i) + 612 s += QString::number(i) +
609 QString::fromLatin1(": ") + 613 QString::fromLatin1(": ") +
610 QString::fromLatin1(strings[i]) + QString::fromLatin1("\n"); 614 QString::fromLatin1(strings[i]) + QString::fromLatin1("\n");
611 s += "]\n"; 615 s += "]\n";
612 free (strings); 616 free (strings);
613#endif 617#endif
614 return s; 618 return s;
615} 619}
616 620
617void odClearDebugConfig() 621void odClearDebugConfig()
618{ 622{
619 /* 623 /*
620 delete oDebug_data->config; 624 delete oDebug_data->config;
621 oDebug_data->config = 0; 625 oDebug_data->config = 0;
622 */ 626 */
623} 627}
624 628
625#ifdef OPIE_NO_DEBUG 629#ifdef OPIE_NO_DEBUG
626#define odDebug ondDebug 630#define odDebug ondDebug
627#define odBacktrace ondBacktrace 631#define odBacktrace ondBacktrace
628#endif 632#endif