-rw-r--r-- | library/backend/stringutil.cpp | 414 | ||||
-rw-r--r-- | library/backend/timeconversion.cpp | 237 |
2 files changed, 651 insertions, 0 deletions
diff --git a/library/backend/stringutil.cpp b/library/backend/stringutil.cpp new file mode 100644 index 0000000..b5fbd3e --- a/dev/null +++ b/library/backend/stringutil.cpp | |||
@@ -0,0 +1,414 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of the Qtopia Environment. | ||
5 | ** | ||
6 | ** This file may be distributed and/or modified under the terms of the | ||
7 | ** GNU General Public License version 2 as published by the Free Software | ||
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
9 | ** packaging of this file. | ||
10 | ** | ||
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
13 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
15 | ** | ||
16 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
17 | ** not clear to you. | ||
18 | ** | ||
19 | **********************************************************************/ | ||
20 | |||
21 | #include <qtopia/stringutil.h> | ||
22 | #include <qregexp.h> | ||
23 | #include <qstringlist.h> | ||
24 | |||
25 | namespace Qtopia | ||
26 | { | ||
27 | |||
28 | |||
29 | |||
30 | /* | ||
31 | Very, very simple Latin-1 only collation guaranteed to displease anyone | ||
32 | who actually uses the non-ASCII characters. | ||
33 | */ | ||
34 | |||
35 | static const char collationHack[] = { | ||
36 | 0x00, //C-@ | ||
37 | 0x01, //C-A | ||
38 | 0x02, //C-B | ||
39 | 0x03, //C-C | ||
40 | 0x04, //C-D | ||
41 | 0x05, //C-E | ||
42 | 0x06, //C-F | ||
43 | 0x07, //C-G | ||
44 | 0x08, //C-H | ||
45 | 0x09, //C-I | ||
46 | 0x0a, //C-J | ||
47 | 0x0b, //C-K | ||
48 | 0x0c, //C-L | ||
49 | 0x0d, //C-M | ||
50 | 0x0e, //C-N | ||
51 | 0x0f, //C-O | ||
52 | 0x10, //C-P | ||
53 | 0x11, //C-Q | ||
54 | 0x12, //C-R | ||
55 | 0x13, //C-S | ||
56 | 0x14, //C-T | ||
57 | 0x15, //C-U | ||
58 | 0x16, //C-V | ||
59 | 0x17, //C-W | ||
60 | 0x18, //C-X | ||
61 | 0x19, //C-Y | ||
62 | 0x1a, //C-Z | ||
63 | 0x1b, //C-[ | ||
64 | 0x1c, //C-\ | ||
65 | 0x1d, //C-] | ||
66 | 0x1e, //C-^ | ||
67 | 0x1f, //C-_ | ||
68 | ' ', // | ||
69 | '!', //! | ||
70 | '"', //" | ||
71 | '#', //# | ||
72 | '$', //$ | ||
73 | '%', //% | ||
74 | '&', //& | ||
75 | '\'', //' | ||
76 | '(', //( | ||
77 | ')', //) | ||
78 | '*', //* | ||
79 | '+', //+ | ||
80 | ',', //, | ||
81 | '-', //- | ||
82 | '.', //. | ||
83 | '/', /// | ||
84 | 0x80, //0 | ||
85 | 0x81, //1 | ||
86 | 0x82, //2 | ||
87 | 0x83, //3 | ||
88 | 0x84, //4 | ||
89 | 0x85, //5 | ||
90 | 0x86, //6 | ||
91 | 0x87, //7 | ||
92 | 0x88, //8 | ||
93 | 0x89, //9 | ||
94 | ':', //: | ||
95 | ';', //; | ||
96 | '<', //< | ||
97 | '=', //= | ||
98 | '>', //> | ||
99 | '?', //? | ||
100 | '@', //@ | ||
101 | 'A', //A | ||
102 | 'B', //B | ||
103 | 'C', //C | ||
104 | 'D', //D | ||
105 | 'E', //E | ||
106 | 'F', //F | ||
107 | 'G', //G | ||
108 | 'H', //H | ||
109 | 'I', //I | ||
110 | 'J', //J | ||
111 | 'K', //K | ||
112 | 'L', //L | ||
113 | 'M', //M | ||
114 | 'N', //N | ||
115 | 'O', //O | ||
116 | 'P', //P | ||
117 | 'Q', //Q | ||
118 | 'R', //R | ||
119 | 'S', //S | ||
120 | 'T', //T | ||
121 | 'U', //U | ||
122 | 'V', //V | ||
123 | 'W', //W | ||
124 | 'X', //X | ||
125 | 'Y', //Y | ||
126 | 'Z', //Z | ||
127 | '[', //[ | ||
128 | '\\', //\ | ||
129 | ']', //] | ||
130 | '^', //^ | ||
131 | '_', //_ | ||
132 | '`', //` | ||
133 | 'A', //a | ||
134 | 'B', //b | ||
135 | 'C', //c | ||
136 | 'D', //d | ||
137 | 'E', //e | ||
138 | 'F', //f | ||
139 | 'G', //g | ||
140 | 'H', //h | ||
141 | 'I', //i | ||
142 | 'J', //j | ||
143 | 'K', //k | ||
144 | 'L', //l | ||
145 | 'M', //m | ||
146 | 'N', //n | ||
147 | 'O', //o | ||
148 | 'P', //p | ||
149 | 'Q', //q | ||
150 | 'R', //r | ||
151 | 'S', //s | ||
152 | 'T', //t | ||
153 | 'U', //u | ||
154 | 'V', //v | ||
155 | 'W', //w | ||
156 | 'X', //x | ||
157 | 'Y', //y | ||
158 | 'Z', //z | ||
159 | '{', //{ | ||
160 | '|', //| | ||
161 | '}', //} | ||
162 | '~', //~ | ||
163 | '', // | ||
164 | 0x80, //C-M-@ | ||
165 | 0x81, //C-M-A | ||
166 | 0x82, //C-M-B | ||
167 | 0x83, //C-M-C | ||
168 | 0x84, //C-M-D | ||
169 | 0x85, //C-M-E | ||
170 | 0x86, //C-M-F | ||
171 | 0x87, //C-M-G | ||
172 | 0x88, //C-M-H | ||
173 | 0x89, //C-M-I | ||
174 | 0x8a, //C-M-J | ||
175 | 0x8b, //C-M-K | ||
176 | 0x8c, //C-M-L | ||
177 | 0x8d, //C-M-M | ||
178 | 0x8e, //C-M-N | ||
179 | 0x8f, //C-M-O | ||
180 | 0x90, //C-M-P | ||
181 | 0x91, //C-M-Q | ||
182 | 0x92, //C-M-R | ||
183 | 0x93, //C-M-S | ||
184 | 0x94, //C-M-T | ||
185 | 0x95, //C-M-U | ||
186 | 0x96, //C-M-V | ||
187 | 0x97, //C-M-W | ||
188 | 0x98, //C-M-X | ||
189 | 0x99, //C-M-Y | ||
190 | 0x9a, //C-M-Z | ||
191 | 0x9b, //C-M-[ | ||
192 | 0x9c, //C-M-\ | ||
193 | 0x9d, //C-M-] | ||
194 | 0x9e, //C-M-^ | ||
195 | 0x9f, //C-M-_ | ||
196 | ' ', // | ||
197 | '¡', //¡ | ||
198 | '¢', //¢ | ||
199 | '£', //£ | ||
200 | '¤', //¤ | ||
201 | '¥', //¥ | ||
202 | '¦', //¦ | ||
203 | '§', //§ | ||
204 | '¨', //¨ | ||
205 | '©', //© | ||
206 | 'A', //ª | ||
207 | '«', //« | ||
208 | '¬', //¬ | ||
209 | '', // | ||
210 | '®', //® | ||
211 | '¯', //¯ | ||
212 | 'O', //° | ||
213 | '±', //± | ||
214 | '²', //² | ||
215 | '³', //³ | ||
216 | '´', //´ | ||
217 | 'µ', //µ | ||
218 | 'P', //¶ | ||
219 | '·', //· | ||
220 | '¸', //¸ | ||
221 | '¹', //¹ | ||
222 | 'O', //º | ||
223 | '»', //» | ||
224 | '¼', //¼ | ||
225 | '½', //½ | ||
226 | '¾', //¾ | ||
227 | '¿', //¿ | ||
228 | 'A', //À | ||
229 | 'A', //Á | ||
230 | 'A', //Â | ||
231 | 'A', //Ã | ||
232 | 'A', //Ä | ||
233 | 'A', //Å | ||
234 | 'A', //Æ | ||
235 | 'C', //Ç | ||
236 | 'E', //È | ||
237 | 'E', //É | ||
238 | 'E', //Ê | ||
239 | 'E', //Ë | ||
240 | 'I', //Ì | ||
241 | 'I', //Í | ||
242 | 'I', //Î | ||
243 | 'I', //Ï | ||
244 | 'D', //Ð | ||
245 | 'N', //Ñ | ||
246 | 'O', //Ò | ||
247 | 'O', //Ó | ||
248 | 'O', //Ô | ||
249 | 'O', //Õ | ||
250 | 'O', //Ö | ||
251 | '×', //× | ||
252 | 'O', //Ø | ||
253 | 'U', //Ù | ||
254 | 'U', //Ú | ||
255 | 'U', //Û | ||
256 | 'U', //Ü | ||
257 | 'Y', //Ý | ||
258 | 'T', //Þ | ||
259 | 'S', //ß | ||
260 | 'A', //à | ||
261 | 'A', //á | ||
262 | 'A', //â | ||
263 | 'A', //ã | ||
264 | 'A', //ä | ||
265 | 'A', //å | ||
266 | 'A', //æ | ||
267 | 'C', //ç | ||
268 | 'E', //è | ||
269 | 'E', //é | ||
270 | 'E', //ê | ||
271 | 'E', //ë | ||
272 | 'I', //ì | ||
273 | 'I', //í | ||
274 | 'I', //î | ||
275 | 'I', //ï | ||
276 | 'D', //ð | ||
277 | 'N', //ñ | ||
278 | 'O', //ò | ||
279 | 'O', //ó | ||
280 | 'O', //ô | ||
281 | 'O', //õ | ||
282 | 'O', //ö | ||
283 | '÷', //÷ | ||
284 | 'O', //ø | ||
285 | 'U', //ù | ||
286 | 'U', //ú | ||
287 | 'U', //û | ||
288 | 'U', //ü | ||
289 | 'Y', //ý | ||
290 | 'T', //þ | ||
291 | 'Y', //ÿ | ||
292 | }; | ||
293 | |||
294 | |||
295 | |||
296 | |||
297 | |||
298 | static void hackString ( QString &s ) | ||
299 | { | ||
300 | int len = s.length(); | ||
301 | const QChar* uc = s.unicode(); | ||
302 | for ( int i = 0; i < len; i++ ) { | ||
303 | if ( !uc++->row() ) | ||
304 | s[i] = collationHack[s[i].cell()]; | ||
305 | } | ||
306 | } | ||
307 | |||
308 | QString buildSortKey( const QString & s ) | ||
309 | { | ||
310 | QString res = s; | ||
311 | hackString( res ); | ||
312 | return res; | ||
313 | } | ||
314 | |||
315 | QString buildSortKey( const QString & s1, const QString & s2 ) | ||
316 | { | ||
317 | QString res = s1 + QChar( '\0' ) + s2; | ||
318 | hackString( res ); | ||
319 | return res; | ||
320 | } | ||
321 | |||
322 | QString buildSortKey( const QString & s1, const QString & s2, | ||
323 | const QString & s3 ) | ||
324 | { | ||
325 | QString res = s1 + QChar( '\0' ) + s2 + QChar( '\0' ) + s3; | ||
326 | hackString( res ); | ||
327 | return res; | ||
328 | } | ||
329 | |||
330 | static inline QChar coll( QChar u ) | ||
331 | { | ||
332 | return u.row() ? u : QChar(collationHack[ u.cell() ]); | ||
333 | } | ||
334 | |||
335 | |||
336 | int compare( const QString & s1, const QString & s2 ) | ||
337 | { | ||
338 | const QChar* u1 = s1.unicode(); | ||
339 | const QChar* u2 = s2.unicode(); | ||
340 | |||
341 | if ( u1 == u2 ) | ||
342 | return 0; | ||
343 | if ( u1 == 0 ) | ||
344 | return 1; | ||
345 | if ( u2 == 0 ) | ||
346 | return -1; | ||
347 | int l=QMIN(s1.length(),s2.length()); | ||
348 | while ( l-- && coll(*u1) == coll(*u2) ) | ||
349 | u1++,u2++; | ||
350 | if ( l==-1 ) | ||
351 | return ( s1.length()-s2.length() ); | ||
352 | return u1->unicode() - u2->unicode(); | ||
353 | } | ||
354 | |||
355 | QString simplifyMultiLineSpace( const QString &multiLine ) | ||
356 | { | ||
357 | QString result; | ||
358 | QStringList lines = QStringList::split("\n", multiLine); | ||
359 | for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it ) { | ||
360 | if ( it != lines.begin() ) | ||
361 | result += "\n"; | ||
362 | result += (*it).simplifyWhiteSpace(); | ||
363 | } | ||
364 | return result; | ||
365 | } | ||
366 | |||
367 | QString escapeString( const QString& plain ) | ||
368 | { | ||
369 | QString tmp(plain); | ||
370 | int pos = tmp.length(); | ||
371 | const QChar *uc = plain.unicode(); | ||
372 | while ( pos-- ) { | ||
373 | unsigned char ch = uc[pos].latin1(); | ||
374 | if ( ch == '&' ) | ||
375 | tmp.replace( pos, 1, "&" ); | ||
376 | else if ( ch == '<' ) | ||
377 | tmp.replace( pos, 1, "<" ); | ||
378 | else if ( ch == '>' ) | ||
379 | tmp.replace( pos, 1, ">" ); | ||
380 | else if ( ch == '\"' ) | ||
381 | tmp.replace( pos, 1, """ ); | ||
382 | } | ||
383 | return tmp; | ||
384 | } | ||
385 | |||
386 | QString plainString( const char* escaped, unsigned int length ) | ||
387 | { | ||
388 | return plainString( QString::fromUtf8( escaped, length ) ); | ||
389 | } | ||
390 | |||
391 | QString plainString( const QCString& string ) | ||
392 | { | ||
393 | // We first have to pass it through a ::fromUtf8() | ||
394 | return plainString( string.data(), string.length() ); | ||
395 | } | ||
396 | |||
397 | QString plainString( const QString& string ) | ||
398 | { | ||
399 | QString tmp( string ); | ||
400 | int pos = -1; | ||
401 | while ( (pos = tmp.find( "&", pos +1 ) ) != -1 ) { | ||
402 | if ( tmp.find( "&", pos ) == pos ) | ||
403 | tmp.replace( pos, 5, "&" ); | ||
404 | else if ( tmp.find( "<", pos ) == pos ) | ||
405 | tmp.replace( pos, 4, "<" ); | ||
406 | else if( tmp.find( ">", pos ) == pos ) | ||
407 | tmp.replace( pos, 4, ">" ); | ||
408 | else if ( tmp.find( """, pos ) == pos ) | ||
409 | tmp.replace( pos, 6, "\"" ); | ||
410 | } | ||
411 | return tmp; | ||
412 | } | ||
413 | |||
414 | } // namespace QPC | ||
diff --git a/library/backend/timeconversion.cpp b/library/backend/timeconversion.cpp new file mode 100644 index 0000000..ef7762d --- a/dev/null +++ b/library/backend/timeconversion.cpp | |||
@@ -0,0 +1,237 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of Qtopia Environment. | ||
5 | ** | ||
6 | ** This file may be distributed and/or modified under the terms of the | ||
7 | ** GNU General Public License version 2 as published by the Free Software | ||
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
9 | ** packaging of this file. | ||
10 | ** | ||
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
13 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
15 | ** | ||
16 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
17 | ** not clear to you. | ||
18 | ** | ||
19 | **********************************************************************/ | ||
20 | |||
21 | #include <qglobal.h> | ||
22 | #include <qtopia/timeconversion.h> | ||
23 | #include <qregexp.h> | ||
24 | #include <stdlib.h> | ||
25 | |||
26 | QString TimeConversion::toString( const QDate &d ) | ||
27 | { | ||
28 | QString r = QString::number( d.day() ) + "." + | ||
29 | QString::number( d.month() ) + "." + | ||
30 | QString::number( d.year() ); | ||
31 | //qDebug("TimeConversion::toString %s", r.latin1()); | ||
32 | return r; | ||
33 | } | ||
34 | |||
35 | QDate TimeConversion::fromString( const QString &datestr ) | ||
36 | { | ||
37 | int monthPos = datestr.find('.'); | ||
38 | int yearPos = datestr.find('.', monthPos+1 ); | ||
39 | if ( monthPos == -1 || yearPos == -1 ) { | ||
40 | qDebug("fromString didn't find . in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, yearPos ); | ||
41 | return QDate(); | ||
42 | } | ||
43 | int d = datestr.left( monthPos ).toInt(); | ||
44 | int m = datestr.mid( monthPos+1, yearPos - monthPos - 1 ).toInt(); | ||
45 | int y = datestr.mid( yearPos+1 ).toInt(); | ||
46 | QDate date ( y,m,d ); | ||
47 | //qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, yearPos); | ||
48 | return date; | ||
49 | } | ||
50 | |||
51 | time_t TimeConversion::toUTC( const QDateTime& dt ) | ||
52 | { | ||
53 | time_t tmp; | ||
54 | struct tm *lt; | ||
55 | |||
56 | #if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) | ||
57 | _tzset(); | ||
58 | #else | ||
59 | tzset(); | ||
60 | #endif | ||
61 | |||
62 | // get a tm structure from the system to get the correct tz_name | ||
63 | tmp = time( 0 ); | ||
64 | lt = localtime( &tmp ); | ||
65 | |||
66 | lt->tm_sec = dt.time().second(); | ||
67 | lt->tm_min = dt.time().minute(); | ||
68 | lt->tm_hour = dt.time().hour(); | ||
69 | lt->tm_mday = dt.date().day(); | ||
70 | lt->tm_mon = dt.date().month() - 1; // 0-11 instead of 1-12 | ||
71 | lt->tm_year = dt.date().year() - 1900; // year - 1900 | ||
72 | //lt->tm_wday = dt.date().dayOfWeek(); ignored anyway | ||
73 | //lt->tm_yday = dt.date().dayOfYear(); ignored anyway | ||
74 | lt->tm_wday = -1; | ||
75 | lt->tm_yday = -1; | ||
76 | // tm_isdst negative -> mktime will find out about DST | ||
77 | lt->tm_isdst = -1; | ||
78 | // keep tm_zone and tm_gmtoff | ||
79 | tmp = mktime( lt ); | ||
80 | return tmp; | ||
81 | } | ||
82 | |||
83 | QDateTime TimeConversion::fromUTC( time_t time ) | ||
84 | { | ||
85 | struct tm *lt; | ||
86 | |||
87 | #if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) | ||
88 | _tzset(); | ||
89 | #else | ||
90 | tzset(); | ||
91 | #endif | ||
92 | lt = localtime( &time ); | ||
93 | QDateTime dt; | ||
94 | dt.setDate( QDate( lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday ) ); | ||
95 | dt.setTime( QTime( lt->tm_hour, lt->tm_min, lt->tm_sec ) ); | ||
96 | return dt; | ||
97 | } | ||
98 | |||
99 | |||
100 | int TimeConversion::secsTo( const QDateTime &from, const QDateTime &to ) | ||
101 | { | ||
102 | return toUTC( to ) - toUTC( from ); | ||
103 | } | ||
104 | |||
105 | QCString TimeConversion::toISO8601( const QDate &d ) | ||
106 | { | ||
107 | time_t tmp = toUTC( d ); | ||
108 | struct tm *utc = gmtime( &tmp ); | ||
109 | |||
110 | QCString str; | ||
111 | str.sprintf("%04d%02d%02d", (utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday ); | ||
112 | return str; | ||
113 | } | ||
114 | |||
115 | QCString TimeConversion::toISO8601( const QDateTime &dt ) | ||
116 | { | ||
117 | time_t tmp = toUTC( dt ); | ||
118 | struct tm *utc = gmtime( &tmp ); | ||
119 | |||
120 | QCString str; | ||
121 | str.sprintf("%04d%02d%02dT%02d%02d%02dZ", | ||
122 | (utc->tm_year + 1900), utc->tm_mon+1, utc->tm_mday, | ||
123 | utc->tm_hour, utc->tm_min, utc->tm_sec ); | ||
124 | return str; | ||
125 | } | ||
126 | |||
127 | QDateTime TimeConversion::fromISO8601( const QCString &s ) | ||
128 | { | ||
129 | |||
130 | #if defined(_OS_WIN32) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64) | ||
131 | _tzset(); | ||
132 | #else | ||
133 | tzset(); | ||
134 | #endif | ||
135 | |||
136 | struct tm *thetime = new tm; | ||
137 | |||
138 | QCString str = s.copy(); | ||
139 | str.replace(QRegExp("-"), "" ); | ||
140 | str.replace(QRegExp(":"), "" ); | ||
141 | str.stripWhiteSpace(); | ||
142 | str = str.lower(); | ||
143 | |||
144 | int i = str.find( "t" ); | ||
145 | QCString date; | ||
146 | QCString timestr; | ||
147 | if ( i != -1 ) { | ||
148 | date = str.left( i ); | ||
149 | timestr = str.mid( i+1 ); | ||
150 | } else { | ||
151 | date = str; | ||
152 | } | ||
153 | |||
154 | // qDebug("--- parsing ISO time---"); | ||
155 | thetime->tm_year = 100; | ||
156 | thetime->tm_mon = 0; | ||
157 | thetime->tm_mday = 0; | ||
158 | thetime->tm_hour = 0; | ||
159 | thetime->tm_min = 0; | ||
160 | thetime->tm_sec = 0; | ||
161 | |||
162 | // qDebug("date = %s", date.data() ); | ||
163 | |||
164 | switch( date.length() ) { | ||
165 | case 8: | ||
166 | thetime->tm_mday = date.right( 2 ).toInt(); | ||
167 | case 6: | ||
168 | thetime->tm_mon = date.mid( 4, 2 ).toInt() - 1; | ||
169 | case 4: | ||
170 | thetime->tm_year = date.left( 4 ).toInt(); | ||
171 | thetime->tm_year -= 1900; | ||
172 | break; | ||
173 | default: | ||
174 | break; | ||
175 | } | ||
176 | |||
177 | int tzoff = 0; | ||
178 | bool inLocalTime = FALSE; | ||
179 | if ( timestr.find( 'z' ) == (int)timestr.length() - 1 ) | ||
180 | // UTC | ||
181 | timestr = timestr.left( timestr.length() -1 ); | ||
182 | else { | ||
183 | int plus = timestr.find( "+" ); | ||
184 | int minus = timestr.find( "-" ); | ||
185 | if ( plus != -1 || minus != -1 ) { | ||
186 | // have a timezone offset | ||
187 | plus = (plus != -1) ? plus : minus; | ||
188 | QCString off = timestr.mid( plus ); | ||
189 | timestr = timestr.left( plus ); | ||
190 | |||
191 | int tzoffhour = 0; | ||
192 | int tzoffmin = 0; | ||
193 | switch( off.length() ) { | ||
194 | case 5: | ||
195 | tzoffmin = off.mid(3).toInt(); | ||
196 | case 3: | ||
197 | tzoffhour = off.left(3).toInt(); | ||
198 | default: | ||
199 | break; | ||
200 | } | ||
201 | tzoff = 60*tzoffhour + tzoffmin; | ||
202 | } else | ||
203 | inLocalTime = TRUE; | ||
204 | } | ||
205 | |||
206 | // get the time: | ||
207 | switch( timestr.length() ) { | ||
208 | case 6: | ||
209 | thetime->tm_sec = timestr.mid( 4 ).toInt(); | ||
210 | case 4: | ||
211 | thetime->tm_min = timestr.mid( 2, 2 ).toInt(); | ||
212 | case 2: | ||
213 | thetime->tm_hour = timestr.left( 2 ).toInt(); | ||
214 | default: | ||
215 | break; | ||
216 | } | ||
217 | |||
218 | int tzloc = 0; | ||
219 | time_t tmp = time( 0 ); | ||
220 | if ( !inLocalTime ) { | ||
221 | // have to get the offset between gmt and local time | ||
222 | struct tm *lt = localtime( &tmp ); | ||
223 | tzloc = mktime( lt ); | ||
224 | struct tm *ut = gmtime( &tmp ); | ||
225 | tzloc -= mktime( ut ); | ||
226 | } | ||
227 | // qDebug("time: %d %d %d, tzloc=%d, tzoff=%d", thetime->tm_hour, thetime->tm_min, thetime->tm_sec, | ||
228 | // tzloc, tzoff ); | ||
229 | |||
230 | tmp = mktime( thetime ); | ||
231 | tmp += 60*(-tzloc + tzoff); | ||
232 | |||
233 | delete thetime; | ||
234 | |||
235 | return fromUTC( tmp ); | ||
236 | } | ||
237 | |||