summaryrefslogtreecommitdiff
path: root/libopie2/opiecore/odebug.cpp
Unidiff
Diffstat (limited to 'libopie2/opiecore/odebug.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/odebug.cpp229
1 files changed, 120 insertions, 109 deletions
diff --git a/libopie2/opiecore/odebug.cpp b/libopie2/opiecore/odebug.cpp
index f258faa..3bffdd0 100644
--- a/libopie2/opiecore/odebug.cpp
+++ b/libopie2/opiecore/odebug.cpp
@@ -68,14 +68,6 @@
68namespace Opie { 68namespace Opie {
69namespace Core { 69namespace Core {
70namespace Internal { 70namespace Internal {
71class DebugBackend {
72};
73
74static DebugBackend *backEnd = 0;
75}
76static void clean_up_routine() {
77 delete Internal::backEnd;
78}
79/*====================================================================================== 71/*======================================================================================
80 * debug levels 72 * debug levels
81 *======================================================================================*/ 73 *======================================================================================*/
@@ -95,8 +87,34 @@ enum DebugLevels {
95 * the main debug function 87 * the main debug function
96 *======================================================================================*/ 88 *======================================================================================*/
97 89
98static void oDebugBackend( unsigned short level, unsigned int area, const char *data) 90
99{ 91
92struct DebugBackend {
93 DebugBackend() : m_opened( false ), m_file( 0 ) ,m_port( -1 ),m_sock( 0 ) {
94 m_outp = OGlobalSettings::debugMode();
95 }
96 ~DebugBackend() {
97 delete m_file;
98 delete m_sock;
99 }
100 void debug( unsigned short level, unsigned int, const QString& data );
101
102private:
103 void debugFile( const QString&, const QString& data );
104 void debugMsgB( const QString&, const QString& data );
105 void debugShel( const QString&, const QString& data );
106 void debugSysl( int, const QString& );
107 void debugSock( const QString&, const QString& data );
108 QCString line( const QString&, const QString& data );
109 bool m_opened : 1;
110 QFile *m_file;
111 QHostAddress m_addr;
112 int m_port;
113 QSocketDevice *m_sock;
114 short m_outp;
115};
116
117void DebugBackend::debug(unsigned short level, unsigned int, const QString& data) {
100 //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data ); 118 //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data );
101 119
102 // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an 120 // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an
@@ -115,11 +133,9 @@ static void oDebugBackend( unsigned short level, unsigned int area, const char *
115 case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break; 133 case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break;
116 } 134 }
117 135
118 short output = OGlobalSettings::debugMode(); 136 if (!oApp && (m_outp == 1)) {
119 if (!oApp && (output == 1))
120 {
121 qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" ); 137 qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" );
122 output = 2; // need an application object to use MsgBox 138 m_outp = 2; // need an application object to use MsgBox
123 } 139 }
124 140
125 // gcc 2.9x is dumb and sucks... can you hear it? 141 // gcc 2.9x is dumb and sucks... can you hear it?
@@ -128,101 +144,94 @@ static void oDebugBackend( unsigned short level, unsigned int area, const char *
128 if ( oApp ) areaName = oApp->appName(); 144 if ( oApp ) areaName = oApp->appName();
129 else areaName = "<unknown>"; 145 else areaName = "<unknown>";
130 146
131 // Output 147 switch( m_outp ) {
132 switch( output ) 148 case -1: // ignore
133 { 149 return;
134 case -1: // ignore 150 case 0: // File
135 { 151 return debugFile( areaName, data );
152 case 1: // Message Box
153 return debugMsgB( areaName, data );
154 case 2:
155 return debugShel( areaName,data );
156 case 3: // syslog
157 return debugSysl( priority, data );
158 case 4: // socket
159 return debugSock( areaName, data );
160 }
161}
162
163inline void DebugBackend::debugFile(const QString& area, const QString& data) {
164 /* something went wrong with the file don't bother.. */
165 if ( m_opened && !m_file )
166 return;
167 else if ( !m_opened ) {
168 m_opened = true;
169 m_file = new QFile( OGlobalSettings::debugOutput() );
170 if (!m_file->open( IO_WriteOnly | IO_Append ) ) {
171 delete m_file; m_file = 0;
172 qDebug( "ODebug: can't write to file '%s' (%s)", (const char*)OGlobalSettings::debugOutput(),
173 strerror(errno) );
136 return; 174 return;
137 } 175 }
138 case 0: // File 176 }
139 {
140 QString outputFilename = OGlobalSettings::debugOutput();
141
142 const int BUFSIZE = 4096;
143 char buf[BUFSIZE] = "";
144 buf[BUFSIZE-1] = '\0';
145 int nSize;
146
147 nSize = snprintf( buf, BUFSIZE-1, "%s: %s", (const char*) areaName, data);
148
149 QFile outputFile( outputFilename );
150 if ( outputFile.open( IO_WriteOnly | IO_Append ) )
151 {
152 if ( ( nSize == -1 ) || ( nSize >= BUFSIZE ) )
153 {
154 outputFile.writeBlock( buf, BUFSIZE-1 );
155 }
156 else
157 {
158 outputFile.writeBlock( buf, nSize );
159 }
160 }
161 else
162 {
163 qDebug( "ODebug: can't write to file '%s' (%s)", (const char*) outputFilename, strerror(errno) );
164 }
165 break;
166 } // automatic close of file here
167
168 case 1: // Message Box
169 {
170 // Since we are in opiecore here, we cannot use OMsgBox and use
171 // QMessageBox instead
172 177
173 caption += QString("(") + areaName + ")"; 178 /* go to end of file */
174 QMessageBox::warning( 0L, caption, data, ("&OK") ); // tr? 179 m_file->at( m_file->size() );
175 break; 180 QCString li = line( area, data );
176 } 181 m_file->writeBlock(li.data(), li.length() );
182}
177 183
178 case 2: // Shell 184void DebugBackend::debugMsgB( const QString& area, const QString& data ) {
179 { 185 QMessageBox::warning( 0l, "("+area+")", data, ("Ok") );
180 FILE *output = stderr; 186}
181 fprintf( output, "%s: ", (const char*) areaName );
182 fputs( data, output);
183 break;
184 }
185 187
186 case 3: // syslog 188void DebugBackend::debugShel( const QString& are, const QString& data ) {
187 { 189 FILE *output = stderr;
188 syslog( priority, "%s", data); 190 fprintf( output, "%s: %s", are.local8Bit().data(),
189 break; 191 data.local8Bit().data() );
190 } 192}
191 193
192 case 4: // socket 194void DebugBackend::debugSysl( int prio, const QString& data ) {
193 { 195 ::syslog( prio, "%s", data.local8Bit().data() );
194 QString destination = OGlobalSettings::debugOutput(); 196}
195 if ( destination && destination.find(":") != -1 ) 197
196 { 198void DebugBackend::debugSock( const QString& are, const QString& data ) {
197 QString host = destination.left( destination.find(":") ); 199 if ( m_opened && !m_sock )
198 QString port = destination.right( destination.length()-host.length()-1 ); 200 return;
199 QHostAddress addr; 201 else if ( !m_opened ){
200 addr.setAddress( host ); 202 m_opened = true;
201 // TODO: sanity check the address 203 QString destination = OGlobalSettings::debugOutput();
202 QString line; 204 if ( destination && destination.find(":") != -1 ) {
203 line.sprintf( "%s: %s", (const char*) areaName, (const char*) data ); 205 QString host = destination.left( destination.find(":") );
204 QSocketDevice s( QSocketDevice::Datagram ); 206 m_port = destination.right( destination.length()-host.length()-1 ).toInt();
205 int result = s.writeBlock( (const char*) line, line.length(), addr, port.toInt() ); 207 m_addr.setAddress( host );
206 if ( result == -1 ) 208 m_sock = new QSocketDevice( QSocketDevice::Datagram );
207 { 209 }else{
208 qDebug( "ODebug: can't send to address '%s:%d' (%s)", (const char*) host, port.toInt(), strerror(errno) ); 210 m_sock = 0;
209 } 211 return;
210 }
211 break;
212 } 212 }
213 } 213 }
214 214
215 // check if we should abort 215 QCString li = line( are, data );
216 216 int result = m_sock->writeBlock(li.data(), li.length(), m_addr, m_port );
217 /* 217 if ( result == -1 ) {
218 218 qDebug( "ODebug: can't send to address '"+ m_addr.toString() +":%d' (%s)",
219 if( ( nLevel == ODEBUG_FATAL ) 219 m_port, strerror(errno) );
220 && ( !oDebug_data->config || oDebug_data->config->readNumEntry( "AbortFatal", 1 ) ) ) 220 }
221 abort(); 221}
222 222
223 */ 223QCString DebugBackend::line( const QString& area, const QString& data ) {
224 QString str = area +":"+data;
225 return str.local8Bit();
224} 226}
225 227
228static DebugBackend *backEnd = 0;
229}
230static void clean_up_routine() {
231 qWarning( "Clean up Debug" );
232 delete Internal::backEnd;
233 Internal::backEnd = 0;
234}
226/*====================================================================================== 235/*======================================================================================
227 * odbgstream 236 * odbgstream
228 *======================================================================================*/ 237 *======================================================================================*/
@@ -234,42 +243,42 @@ odbgstream& perror( odbgstream &s)
234 243
235odbgstream odDebug(int area) 244odbgstream odDebug(int area)
236{ 245{
237 return odbgstream(area, ODEBUG_INFO); 246 return odbgstream(area, Internal::ODEBUG_INFO);
238} 247}
239odbgstream odDebug(bool cond, int area) 248odbgstream odDebug(bool cond, int area)
240{ 249{
241 if (cond) return odbgstream(area, ODEBUG_INFO); 250 if (cond) return odbgstream(area, Internal::ODEBUG_INFO);
242 else return odbgstream(0, 0, false); 251 else return odbgstream(0, 0, false);
243} 252}
244 253
245odbgstream odError(int area) 254odbgstream odError(int area)
246{ 255{
247 return odbgstream("ERROR: ", area, ODEBUG_ERROR); 256 return odbgstream("ERROR: ", area, Internal::ODEBUG_ERROR);
248} 257}
249 258
250odbgstream odError(bool cond, int area) 259odbgstream odError(bool cond, int area)
251{ 260{
252 if (cond) return odbgstream("ERROR: ", area, ODEBUG_ERROR); else return odbgstream(0,0,false); 261 if (cond) return odbgstream("ERROR: ", area, Internal::ODEBUG_ERROR); else return odbgstream(0,0,false);
253} 262}
254 263
255odbgstream odWarning(int area) 264odbgstream odWarning(int area)
256{ 265{
257 return odbgstream("WARNING: ", area, ODEBUG_WARN); 266 return odbgstream("WARNING: ", area, Internal::ODEBUG_WARN);
258} 267}
259 268
260odbgstream odWarning(bool cond, int area) 269odbgstream odWarning(bool cond, int area)
261{ 270{
262 if (cond) return odbgstream("WARNING: ", area, ODEBUG_WARN); else return odbgstream(0,0,false); 271 if (cond) return odbgstream("WARNING: ", area, Internal::ODEBUG_WARN); else return odbgstream(0,0,false);
263} 272}
264 273
265odbgstream odFatal(int area) 274odbgstream odFatal(int area)
266{ 275{
267 return odbgstream("FATAL: ", area, ODEBUG_FATAL); 276 return odbgstream("FATAL: ", area, Internal::ODEBUG_FATAL);
268} 277}
269 278
270odbgstream odFatal(bool cond, int area) 279odbgstream odFatal(bool cond, int area)
271{ 280{
272 if (cond) return odbgstream("FATAL: ", area, ODEBUG_FATAL); else return odbgstream(0,0,false); 281 if (cond) return odbgstream("FATAL: ", area, Internal::ODEBUG_FATAL); else return odbgstream(0,0,false);
273} 282}
274 283
275odbgstream::odbgstream(unsigned int _area, unsigned int _level, bool _print) 284odbgstream::odbgstream(unsigned int _area, unsigned int _level, bool _print)
@@ -413,7 +422,11 @@ void odbgstream::flush()
413 } 422 }
414 else 423 else
415 { 424 {
416 oDebugBackend( level, area, output.local8Bit().data() ); 425 if ( !Internal::backEnd ) {
426 Internal::backEnd = new Internal::DebugBackend;
427 qAddPostRoutine( clean_up_routine );
428 }
429 Internal::backEnd->debug( level, area, output );
417 output = QString::null; 430 output = QString::null;
418 } 431 }
419} 432}
@@ -539,13 +552,11 @@ odbgstream& odbgstream::operator<<( const QRect& r )
539 552
540odbgstream& odbgstream::operator<<( const QRegion& reg ) 553odbgstream& odbgstream::operator<<( const QRegion& reg )
541{ 554{
542 /* Qt2 doesn't have a QMemArray... :(
543 *this << "[ "; 555 *this << "[ ";
544 QMemArray<QRect>rs=reg.rects(); 556 QArray<QRect>rs=reg.rects();
545 for (uint i=0;i<rs.size();++i) 557 for (uint i=0;i<rs.size();++i)
546 *this << QString("[%1, %2 - %3, %4] ").arg(rs[i].left()).arg(rs[i].top()).arg(rs[i].right()).arg(rs[i].bottom() ) ; 558 *this << QString("[%1, %2 - %3, %4] ").arg(rs[i].left()).arg(rs[i].top()).arg(rs[i].right()).arg(rs[i].bottom() ) ;
547 *this <<"]"; 559 *this <<"]";
548 */
549 return *this; 560 return *this;
550} 561}
551 562