-rw-r--r-- | libopie2/opiecore/odebug.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/libopie2/opiecore/odebug.cpp b/libopie2/opiecore/odebug.cpp index d8dfe26..45709dc 100644 --- a/libopie2/opiecore/odebug.cpp +++ b/libopie2/opiecore/odebug.cpp | |||
@@ -1,228 +1,232 @@ | |||
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 | (C) 2002 Holger Freyther (freyther@kde.org) | 4 | (C) 2002 Holger Freyther (freyther@kde.org) |
5 | (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) | 5 | (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) |
6 | =. | 6 | =. |
7 | .=l. | 7 | .=l. |
8 | .>+-= | 8 | .>+-= |
9 | _;:, .> :=|. This program is free software; you can | 9 | _;:, .> :=|. This program is free software; you can |
10 | .> <`_, > . <= redistribute it and/or modify it under | 10 | .> <`_, > . <= redistribute it and/or modify it under |
11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
12 | .="- .-=="i, .._ License as published by the Free Software | 12 | .="- .-=="i, .._ License as published by the Free Software |
13 | - . .-<_> .<> Foundation; either version 2 of the License, | 13 | - . .-<_> .<> Foundation; either version 2 of the License, |
14 | ._= =} : or (at your option) any later version. | 14 | ._= =} : or (at your option) any later version. |
15 | .%`+i> _;_. | 15 | .%`+i> _;_. |
16 | .i_,=:_. -<s. This program is distributed in the hope that | 16 | .i_,=:_. -<s. This program is distributed in the hope that |
17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
18 | : .. .:, . . . without even the implied warranty of | 18 | : .. .:, . . . without even the implied warranty of |
19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
21 | ..}^=.= = ; Library General Public License for more | 21 | ..}^=.= = ; Library General Public License for more |
22 | ++= -. .` .: details. | 22 | ++= -. .` .: details. |
23 | : = ...= . :.=- | 23 | : = ...= . :.=- |
24 | -. .:....=;==+<; You should have received a copy of the GNU | 24 | -. .:....=;==+<; You should have received a copy of the GNU |
25 | -_. . . )=. = Library General Public License along with | 25 | -_. . . )=. = Library General Public License along with |
26 | -- :-=` this library; see the file COPYING.LIB. | 26 | -- :-=` this library; see the file COPYING.LIB. |
27 | If not, write to the Free Software Foundation, | 27 | If not, write to the Free Software Foundation, |
28 | Inc., 59 Temple Place - Suite 330, | 28 | Inc., 59 Temple Place - Suite 330, |
29 | Boston, MA 02111-1307, USA. | 29 | Boston, MA 02111-1307, USA. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | // Include this header without OPIE_NO_DEBUG defined to avoid having the oDebugInfo | 32 | // Include this header without OPIE_NO_DEBUG defined to avoid having the oDebugInfo |
33 | // functions inlined to noops (which would then conflict with their definition here). | 33 | // functions inlined to noops (which would then conflict with their definition here). |
34 | 34 | ||
35 | #include <opie2/odebug.h> | 35 | #include <opie2/odebug.h> |
36 | 36 | ||
37 | #if defined(__UCLIBC__) | ||
38 | #define OPIE_NO_BACKTRACE | ||
39 | #endif | ||
40 | |||
37 | #ifdef OPIE_NO_DEBUG | 41 | #ifdef OPIE_NO_DEBUG |
38 | #undef odDebug | 42 | #undef odDebug |
39 | #undef odBacktrace | 43 | #undef odBacktrace |
40 | #endif | 44 | #endif |
41 | 45 | ||
42 | /* OPIE */ | 46 | /* OPIE */ |
43 | 47 | ||
44 | #include <opie2/oapplication.h> | 48 | #include <opie2/oapplication.h> |
45 | #include <opie2/oglobalsettings.h> | 49 | #include <opie2/oglobalsettings.h> |
46 | #include <opie2/oconfig.h> | 50 | #include <opie2/oconfig.h> |
47 | 51 | ||
48 | /* QT */ | 52 | /* QT */ |
49 | 53 | ||
50 | #include <qfile.h> | 54 | #include <qfile.h> |
51 | #include <qmessagebox.h> | 55 | #include <qmessagebox.h> |
52 | #include <qsocketdevice.h> | 56 | #include <qsocketdevice.h> |
53 | 57 | ||
54 | /* UNIX */ | 58 | /* UNIX */ |
55 | 59 | ||
56 | #include <stdlib.h> // abort | 60 | #include <stdlib.h> // abort |
57 | #include <unistd.h> // getpid | 61 | #include <unistd.h> // getpid |
58 | #include <stdarg.h> // vararg stuff | 62 | #include <stdarg.h> // vararg stuff |
59 | #include <ctype.h> // isprint | 63 | #include <ctype.h> // isprint |
60 | #include <syslog.h> | 64 | #include <syslog.h> |
61 | #include <errno.h> | 65 | #include <errno.h> |
62 | #include <string.h> | 66 | #include <string.h> |
63 | 67 | ||
64 | #ifndef OPIE_NO_BACKTRACE | 68 | #ifndef OPIE_NO_BACKTRACE |
65 | #include <execinfo.h> | 69 | #include <execinfo.h> |
66 | #endif | 70 | #endif |
67 | 71 | ||
68 | namespace Opie { | 72 | namespace Opie { |
69 | namespace Core { | 73 | namespace Core { |
70 | namespace Internal { | 74 | namespace Internal { |
71 | /*====================================================================================== | 75 | /*====================================================================================== |
72 | * debug levels | 76 | * debug levels |
73 | *======================================================================================*/ | 77 | *======================================================================================*/ |
74 | 78 | ||
75 | enum DebugLevels { | 79 | enum DebugLevels { |
76 | ODEBUG_INFO = 0, | 80 | ODEBUG_INFO = 0, |
77 | ODEBUG_WARN = 1, | 81 | ODEBUG_WARN = 1, |
78 | ODEBUG_ERROR = 2, | 82 | ODEBUG_ERROR = 2, |
79 | ODEBUG_FATAL = 3 | 83 | ODEBUG_FATAL = 3 |
80 | }; | 84 | }; |
81 | 85 | ||
82 | /*====================================================================================== | 86 | /*====================================================================================== |
83 | * oDebug private data | 87 | * oDebug private data |
84 | *======================================================================================*/ | 88 | *======================================================================================*/ |
85 | 89 | ||
86 | /*====================================================================================== | 90 | /*====================================================================================== |
87 | * the main debug function | 91 | * the main debug function |
88 | *======================================================================================*/ | 92 | *======================================================================================*/ |
89 | 93 | ||
90 | 94 | ||
91 | 95 | ||
92 | struct DebugBackend { | 96 | struct DebugBackend { |
93 | DebugBackend() : m_opened( false ), m_file( 0 ) ,m_port( -1 ),m_sock( 0 ) { | 97 | DebugBackend() : m_opened( false ), m_file( 0 ) ,m_port( -1 ),m_sock( 0 ) { |
94 | m_outp = OGlobalSettings::debugMode(); | 98 | m_outp = OGlobalSettings::debugMode(); |
95 | } | 99 | } |
96 | ~DebugBackend() { | 100 | ~DebugBackend() { |
97 | delete m_file; | 101 | delete m_file; |
98 | delete m_sock; | 102 | delete m_sock; |
99 | } | 103 | } |
100 | void debug( unsigned short level, unsigned int, const QString& data ); | 104 | void debug( unsigned short level, unsigned int, const QString& data ); |
101 | 105 | ||
102 | private: | 106 | private: |
103 | void debugFile( const QString&, const QString& data ); | 107 | void debugFile( const QString&, const QString& data ); |
104 | void debugMsgB( const QString&, const QString& data ); | 108 | void debugMsgB( const QString&, const QString& data ); |
105 | void debugShel( const QString&, const QString& data ); | 109 | void debugShel( const QString&, const QString& data ); |
106 | void debugSysl( int, const QString& ); | 110 | void debugSysl( int, const QString& ); |
107 | void debugSock( const QString&, const QString& data ); | 111 | void debugSock( const QString&, const QString& data ); |
108 | QCString line( const QString&, const QString& data ); | 112 | QCString line( const QString&, const QString& data ); |
109 | bool m_opened : 1; | 113 | bool m_opened : 1; |
110 | QFile *m_file; | 114 | QFile *m_file; |
111 | QHostAddress m_addr; | 115 | QHostAddress m_addr; |
112 | int m_port; | 116 | int m_port; |
113 | QSocketDevice *m_sock; | 117 | QSocketDevice *m_sock; |
114 | short m_outp; | 118 | short m_outp; |
115 | }; | 119 | }; |
116 | 120 | ||
117 | void DebugBackend::debug(unsigned short level, unsigned int, const QString& data) { | 121 | void DebugBackend::debug(unsigned short level, unsigned int, const QString& data) { |
118 | //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data ); | 122 | //qDebug( "oDebugBackend: Level=%d, Area=%d, Data=%s", level, area, data ); |
119 | 123 | ||
120 | // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an | 124 | // ML: OPIE doesn't use areacodes at the moment. See the KDE debug classes for an |
121 | // ML: example use. I think it's not necessary to implement such a strategy here. | 125 | // ML: example use. I think it's not necessary to implement such a strategy here. |
122 | // ML: Comments? | 126 | // ML: Comments? |
123 | 127 | ||
124 | int priority = 0; | 128 | int priority = 0; |
125 | QString caption; | 129 | QString caption; |
126 | QString lev; | 130 | QString lev; |
127 | switch( level ) | 131 | switch( level ) |
128 | { | 132 | { |
129 | case ODEBUG_INFO: lev = "(Info)"; caption = "Info"; priority = LOG_INFO; break; | 133 | case ODEBUG_INFO: lev = "(Info)"; caption = "Info"; priority = LOG_INFO; break; |
130 | case ODEBUG_WARN: lev = "(Warn)"; caption = "Warning"; priority = LOG_WARNING; break; | 134 | case ODEBUG_WARN: lev = "(Warn)"; caption = "Warning"; priority = LOG_WARNING; break; |
131 | case ODEBUG_FATAL: lev = "(Fatal)"; caption = "Fatal Error"; priority = LOG_CRIT; break; | 135 | case ODEBUG_FATAL: lev = "(Fatal)"; caption = "Fatal Error"; priority = LOG_CRIT; break; |
132 | default: qDebug( "oDebugBackend: Warning: Unknown debug level! - defaulting to ODEBUG_ERROR." ); | 136 | default: qDebug( "oDebugBackend: Warning: Unknown debug level! - defaulting to ODEBUG_ERROR." ); |
133 | case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break; | 137 | case ODEBUG_ERROR: lev = "(Error)"; caption = "Error"; priority = LOG_ERR; break; |
134 | } | 138 | } |
135 | 139 | ||
136 | if (!oApp && (m_outp == 1)) { | 140 | if (!oApp && (m_outp == 1)) { |
137 | qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" ); | 141 | qDebug( "oDebugBackend: Warning: no oapplication object - can't use MsgBox" ); |
138 | m_outp = 2; // need an application object to use MsgBox | 142 | m_outp = 2; // need an application object to use MsgBox |
139 | } | 143 | } |
140 | 144 | ||
141 | // gcc 2.9x is dumb and sucks... can you hear it? | 145 | // gcc 2.9x is dumb and sucks... can you hear it? |
142 | //QString areaName = (oApp) ? oApp->appName() : "<unknown>"; | 146 | //QString areaName = (oApp) ? oApp->appName() : "<unknown>"; |
143 | QString areaName; | 147 | QString areaName; |
144 | if ( oApp ) areaName = oApp->appName(); | 148 | if ( oApp ) areaName = oApp->appName(); |
145 | else areaName = "<unknown>"; | 149 | else areaName = "<unknown>"; |
146 | 150 | ||
147 | switch( m_outp ) { | 151 | switch( m_outp ) { |
148 | case ODEBUG_IGNORE: | 152 | case ODEBUG_IGNORE: |
149 | return; | 153 | return; |
150 | case ODEBUG_FILE: | 154 | case ODEBUG_FILE: |
151 | return debugFile( areaName, data ); | 155 | return debugFile( areaName, data ); |
152 | case ODEBUG_MSGBOX: | 156 | case ODEBUG_MSGBOX: |
153 | return debugMsgB( areaName, data ); | 157 | return debugMsgB( areaName, data ); |
154 | case ODEBUG_STDERR: | 158 | case ODEBUG_STDERR: |
155 | return debugShel( areaName,data ); | 159 | return debugShel( areaName,data ); |
156 | case ODEBUG_SYSLOG: | 160 | case ODEBUG_SYSLOG: |
157 | return debugSysl( priority, data ); | 161 | return debugSysl( priority, data ); |
158 | case ODEBUG_SOCKET: | 162 | case ODEBUG_SOCKET: |
159 | return debugSock( areaName, data ); | 163 | return debugSock( areaName, data ); |
160 | } | 164 | } |
161 | } | 165 | } |
162 | 166 | ||
163 | inline void DebugBackend::debugFile(const QString& area, const QString& data) { | 167 | inline void DebugBackend::debugFile(const QString& area, const QString& data) { |
164 | /* something went wrong with the file don't bother.. */ | 168 | /* something went wrong with the file don't bother.. */ |
165 | if ( m_opened && !m_file ) | 169 | if ( m_opened && !m_file ) |
166 | return; | 170 | return; |
167 | else if ( !m_opened ) { | 171 | else if ( !m_opened ) { |
168 | m_opened = true; | 172 | m_opened = true; |
169 | m_file = new QFile( OGlobalSettings::debugOutput() ); | 173 | m_file = new QFile( OGlobalSettings::debugOutput() ); |
170 | if (!m_file->open( IO_WriteOnly | IO_Append ) ) { | 174 | if (!m_file->open( IO_WriteOnly | IO_Append ) ) { |
171 | delete m_file; m_file = 0; | 175 | delete m_file; m_file = 0; |
172 | qDebug( "ODebug: can't write to file '%s' (%s)", (const char*)OGlobalSettings::debugOutput(), | 176 | qDebug( "ODebug: can't write to file '%s' (%s)", (const char*)OGlobalSettings::debugOutput(), |
173 | strerror(errno) ); | 177 | strerror(errno) ); |
174 | return; | 178 | return; |
175 | } | 179 | } |
176 | } | 180 | } |
177 | 181 | ||
178 | /* go to end of file */ | 182 | /* go to end of file */ |
179 | m_file->at( m_file->size() ); | 183 | m_file->at( m_file->size() ); |
180 | QCString li = line( area, data ); | 184 | QCString li = line( area, data ); |
181 | m_file->writeBlock(li.data(), li.length() ); | 185 | m_file->writeBlock(li.data(), li.length() ); |
182 | } | 186 | } |
183 | 187 | ||
184 | void DebugBackend::debugMsgB( const QString& area, const QString& data ) { | 188 | void DebugBackend::debugMsgB( const QString& area, const QString& data ) { |
185 | QMessageBox::warning( 0l, "("+area+")", data, ("Ok") ); | 189 | QMessageBox::warning( 0l, "("+area+")", data, ("Ok") ); |
186 | } | 190 | } |
187 | 191 | ||
188 | void DebugBackend::debugShel( const QString& are, const QString& data ) { | 192 | void DebugBackend::debugShel( const QString& are, const QString& data ) { |
189 | FILE *output = stderr; | 193 | FILE *output = stderr; |
190 | fprintf( output, "%s: %s", are.local8Bit().data(), | 194 | fprintf( output, "%s: %s", are.local8Bit().data(), |
191 | data.local8Bit().data() ); | 195 | data.local8Bit().data() ); |
192 | } | 196 | } |
193 | 197 | ||
194 | void DebugBackend::debugSysl( int prio, const QString& data ) { | 198 | void DebugBackend::debugSysl( int prio, const QString& data ) { |
195 | ::syslog( prio, "%s", data.local8Bit().data() ); | 199 | ::syslog( prio, "%s", data.local8Bit().data() ); |
196 | } | 200 | } |
197 | 201 | ||
198 | void DebugBackend::debugSock( const QString& are, const QString& data ) { | 202 | void DebugBackend::debugSock( const QString& are, const QString& data ) { |
199 | if ( m_opened && !m_sock ) | 203 | if ( m_opened && !m_sock ) |
200 | return; | 204 | return; |
201 | else if ( !m_opened ){ | 205 | else if ( !m_opened ){ |
202 | m_opened = true; | 206 | m_opened = true; |
203 | QString destination = OGlobalSettings::debugOutput(); | 207 | QString destination = OGlobalSettings::debugOutput(); |
204 | if ( destination && destination.find(":") != -1 ) { | 208 | if ( destination && destination.find(":") != -1 ) { |
205 | QString host = destination.left( destination.find(":") ); | 209 | QString host = destination.left( destination.find(":") ); |
206 | m_port = destination.right( destination.length()-host.length()-1 ).toInt(); | 210 | m_port = destination.right( destination.length()-host.length()-1 ).toInt(); |
207 | m_addr.setAddress( host ); | 211 | m_addr.setAddress( host ); |
208 | m_sock = new QSocketDevice( QSocketDevice::Datagram ); | 212 | m_sock = new QSocketDevice( QSocketDevice::Datagram ); |
209 | }else{ | 213 | }else{ |
210 | m_sock = 0; | 214 | m_sock = 0; |
211 | return; | 215 | return; |
212 | } | 216 | } |
213 | } | 217 | } |
214 | 218 | ||
215 | QCString li = line( are, data ); | 219 | QCString li = line( are, data ); |
216 | int result = m_sock->writeBlock(li.data(), li.length(), m_addr, m_port ); | 220 | int result = m_sock->writeBlock(li.data(), li.length(), m_addr, m_port ); |
217 | if ( result == -1 ) { | 221 | if ( result == -1 ) { |
218 | qDebug( "ODebug: can't send to address '"+ m_addr.toString() +":%d' (%s)", | 222 | qDebug( "ODebug: can't send to address '"+ m_addr.toString() +":%d' (%s)", |
219 | m_port, strerror(errno) ); | 223 | m_port, strerror(errno) ); |
220 | } | 224 | } |
221 | } | 225 | } |
222 | 226 | ||
223 | QCString DebugBackend::line( const QString& area, const QString& data ) { | 227 | QCString DebugBackend::line( const QString& area, const QString& data ) { |
224 | QString str = area +":"+data; | 228 | QString str = area +":"+data; |
225 | return str.local8Bit(); | 229 | return str.local8Bit(); |
226 | } | 230 | } |
227 | 231 | ||
228 | static DebugBackend *backEnd = 0; | 232 | static DebugBackend *backEnd = 0; |