00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
#define KDE_QT_ONLY
00024
#include "../../kdecore/kurl.cpp"
00025
00026
bool mkBool(
const QString& s )
00027 {
00028
if ( s.
lower() ==
"true" )
00029
return true;
00030
if ( s.
lower() ==
"yes" )
00031
return true;
00032
if ( s.
lower() ==
"on" )
00033
return true;
00034
if ( s.
toInt() != 0 )
00035
return true;
00036
00037
return false;
00038 }
00039
00040
QPoint mkPoint(
const QString &str )
00041 {
00042
const char *s = str.
latin1();
00043
char *
end;
00044
while(*s && !isdigit(*s)) s++;
00045
int x = strtol(s, &end, 10);
00046 s = (
const char *)
end;
00047
while(*s && !isdigit(*s)) s++;
00048
int y = strtol(s, &end, 10);
00049
return QPoint( x, y );
00050 }
00051
00052
QSize mkSize(
const QString &str )
00053 {
00054
const char *s = str.
latin1();
00055
char *
end;
00056
while(*s && !isdigit(*s)) s++;
00057
int w = strtol(s, &end, 10);
00058 s = (
const char *)
end;
00059
while(*s && !isdigit(*s)) s++;
00060
int h = strtol(s, &end, 10);
00061
return QSize( w, h );
00062 }
00063
00064
QRect mkRect(
const QString &str )
00065 {
00066
const char *s = str.
latin1();
00067
char *
end;
00068
while(*s && !isdigit(*s)) s++;
00069
int p1 = strtol(s, &end, 10);
00070 s = (
const char *)
end;
00071
bool legacy = (*s ==
'x');
00072
while(*s && !isdigit(*s)) s++;
00073
int p2 = strtol(s, &end, 10);
00074 s = (
const char *)
end;
00075
while(*s && !isdigit(*s)) s++;
00076
int p3 = strtol(s, &end, 10);
00077 s = (
const char *)
end;
00078
while(*s && !isdigit(*s)) s++;
00079
int p4 = strtol(s, &end, 10);
00080
if (legacy)
00081 {
00082
return QRect( p3, p4, p1, p2 );
00083 }
00084
return QRect( p1, p2, p3, p4 );
00085 }
00086
00087
QColor mkColor(
const QString& s )
00088 {
00089
QColor c;
00090 c.
setNamedColor(s);
00091
return c;
00092 }
00093
00094
const char *qStringToC(
const QCString &s)
00095 {
00096
if (s.
isEmpty())
00097
return "";
00098
return s.data();
00099 }
00100
00101
QCString demarshal(
QDataStream &stream,
const QString &type )
00102 {
00103
QCString result;
00104
00105
if ( type ==
"int" )
00106 {
00107
int i;
00108 stream >> i;
00109 result.
setNum( i );
00110 }
else if ( type ==
"uint" || type ==
"Q_UINT32" )
00111 {
00112 uint i;
00113 stream >> i;
00114 result.
setNum( i );
00115 }
else if ( type ==
"long" )
00116 {
00117
long l;
00118 stream >> l;
00119 result.
setNum( l );
00120 }
else if ( type ==
"float" )
00121 {
00122
float f;
00123 stream >> f;
00124 result.
setNum( f,
'f' );
00125 }
else if ( type ==
"double" )
00126 {
00127
double d;
00128 stream >> d;
00129 result.
setNum( d,
'f' );
00130 }
else if ( type ==
"Q_UINT64" ) {
00131 Q_UINT64 i;
00132 stream >> i;
00133 result.
sprintf(
"%llu", i );
00134 }
else if ( type ==
"bool" )
00135 {
00136
bool b;
00137 stream >> b;
00138 result = b ?
"true" :
"false";
00139 }
else if ( type ==
"QString" )
00140 {
00141
QString s;
00142 stream >> s;
00143 result = s.local8Bit();
00144 }
else if ( type ==
"QCString" )
00145 {
00146 stream >> result;
00147 }
else if ( type ==
"QCStringList" )
00148 {
00149
return demarshal( stream,
"QValueList<QCString>" );
00150 }
else if ( type ==
"QStringList" )
00151 {
00152
return demarshal( stream,
"QValueList<QString>" );
00153 }
else if ( type ==
"QColor" )
00154 {
00155
QColor c;
00156 stream >> c;
00157 result = c.name().local8Bit();
00158 }
else if ( type ==
"QSize" )
00159 {
00160
QSize s;
00161 stream >> s;
00162 result.
sprintf(
"%dx%d", s.width(), s.height() );
00163 }
else if ( type ==
"QPoint" )
00164 {
00165
QPoint p;
00166 stream >> p;
00167 result.
sprintf(
"+%d+%d", p.x(), p.y() );
00168 }
else if ( type ==
"QRect" )
00169 {
00170
QRect r;
00171 stream >> r;
00172 result.
sprintf(
"%dx%d+%d+%d", r.width(), r.height(), r.x(), r.y() );
00173 }
else if ( type ==
"QVariant" )
00174 {
00175 Q_INT32 type;
00176 stream >> type;
00177
return demarshal( stream, QVariant::typeToName( (QVariant::Type)type ) );
00178 }
else if ( type ==
"DCOPRef" )
00179 {
00180
DCOPRef r;
00181 stream >> r;
00182 result.
sprintf(
"DCOPRef(%s,%s)", qStringToC(r.app()), qStringToC(r.object()) );
00183 }
else if ( type ==
"KURL" )
00184 {
00185
KURL r;
00186 stream >> r;
00187 result = r.url().local8Bit();
00188 }
else if ( type.left( 11 ) ==
"QValueList<" )
00189 {
00190
if ( (uint)type.find(
'>', 11 ) != type.length() - 1 )
00191
return result;
00192
00193
QString nestedType = type.
mid( 11, type.length() - 12 );
00194
00195
if ( nestedType.
isEmpty() )
00196
return result;
00197
00198 Q_UINT32 count;
00199 stream >> count;
00200
00201 Q_UINT32 i = 0;
00202
for (; i < count; ++i )
00203 {
00204
QCString arg = demarshal( stream, nestedType );
00205
if ( arg.
isEmpty() )
00206
continue;
00207
00208 result += arg;
00209
00210
if ( i < count - 1 )
00211 result +=
'\n';
00212 }
00213 }
else if ( type.left( 5 ) ==
"QMap<" )
00214 {
00215
int commaPos = type.
find(
',', 5 );
00216
00217
if ( commaPos == -1 )
00218
return result;
00219
00220
if ( (uint)type.find(
'>', commaPos ) != type.length() - 1 )
00221
return result;
00222
00223
QString keyType = type.
mid( 5, commaPos - 5 );
00224
QString valueType = type.mid( commaPos + 1, type.length() - commaPos - 2 );
00225
00226 Q_UINT32 count;
00227 stream >> count;
00228
00229 Q_UINT32 i = 0;
00230
for (; i < count; ++i )
00231 {
00232
QCString key = demarshal( stream, keyType );
00233
00234
if (
key.isEmpty() )
00235
continue;
00236
00237
QCString value = demarshal( stream, valueType );
00238
00239
if ( value.
isEmpty() )
00240
continue;
00241
00242 result +=
key +
"->" + value;
00243
00244
if ( i < count - 1 )
00245 result +=
'\n';
00246 }
00247 }
00248
else
00249 {
00250 result.
sprintf(
"<%s>", type.latin1());
00251 }
00252
00253
return result;
00254
00255 }
00256
00257
void marshall(
QDataStream &arg,
QCStringList args, uint &i,
QString type )
00258 {
00259
if (type ==
"QStringList")
00260 type =
"QValueList<QString>";
00261
if (type ==
"QCStringList")
00262 type =
"QValueList<QCString>";
00263
if( i >= args.
count() )
00264 {
00265 qWarning(
"Not enough arguments.");
00266 exit(1);
00267 }
00268
QString s =
QString::fromLocal8Bit( args[ i ] );
00269
00270
if ( type ==
"int" )
00271 arg << s.
toInt();
00272
else if ( type ==
"uint" )
00273 arg << s.
toUInt();
00274
else if ( type ==
"unsigned" )
00275 arg << s.
toUInt();
00276
else if ( type ==
"unsigned int" )
00277 arg << s.
toUInt();
00278
else if ( type ==
"Q_UINT32" )
00279 arg << s.
toUInt();
00280
else if ( type ==
"Q_UINT64" ) {
00281
QVariant qv =
QVariant( s );
00282 arg << qv.
toULongLong();
00283 }
00284
else if ( type ==
"long" )
00285 arg << s.
toLong();
00286
else if ( type ==
"long int" )
00287 arg << s.
toLong();
00288
else if ( type ==
"unsigned long" )
00289 arg << s.
toULong();
00290
else if ( type ==
"unsigned long int" )
00291 arg << s.
toULong();
00292
else if ( type ==
"float" )
00293 arg << s.
toFloat();
00294
else if ( type ==
"double" )
00295 arg << s.
toDouble();
00296
else if ( type ==
"bool" )
00297 arg << mkBool( s );
00298
else if ( type ==
"QString" )
00299 arg << s;
00300
else if ( type ==
"QCString" )
00301 arg <<
QCString( args[ i ] );
00302
else if ( type ==
"QColor" )
00303 arg << mkColor( s );
00304
else if ( type ==
"QPoint" )
00305 arg << mkPoint( s );
00306
else if ( type ==
"QSize" )
00307 arg << mkSize( s );
00308
else if ( type ==
"QRect" )
00309 arg << mkRect( s );
00310
else if ( type ==
"KURL" )
00311 arg <<
KURL( s );
00312
else if ( type ==
"QVariant" ) {
00313
if ( s ==
"true" || s ==
"false" )
00314 arg <<
QVariant( mkBool( s ), 42 );
00315
else if ( s.left( 4 ) ==
"int(" )
00316 arg <<
QVariant( s.mid(4, s.length()-5).toInt() );
00317
else if ( s.left( 7 ) ==
"QPoint(" )
00318 arg <<
QVariant( mkPoint( s.mid(7, s.length()-8) ) );
00319
else if ( s.left( 6 ) ==
"QSize(" )
00320 arg <<
QVariant( mkSize( s.mid(6, s.length()-7) ) );
00321
else if ( s.left( 6 ) ==
"QRect(" )
00322 arg <<
QVariant( mkRect( s.mid(6, s.length()-7) ) );
00323
else if ( s.left( 7 ) ==
"QColor(" )
00324 arg <<
QVariant( mkColor( s.mid(7, s.length()-8) ) );
00325
else
00326 arg <<
QVariant( s );
00327 }
else if ( type.
startsWith(
"QValueList<") ||
00328 type ==
"KURL::List" ) {
00329
if ( type ==
"KURL::List" )
00330 type =
"KURL";
00331
else
00332 type = type.
mid(11, type.
length() - 12);
00333
QStringList list;
00334
QString delim = s;
00335
if (delim ==
"[")
00336 delim =
"]";
00337
if (delim ==
"(")
00338 delim =
")";
00339 i++;
00340
QByteArray dummy_data;
00341
QDataStream dummy_arg(dummy_data, IO_WriteOnly);
00342
00343 uint j = i;
00344 uint count = 0;
00345
00346
while (
true) {
00347
if( j > args.
count() )
00348 {
00349 qWarning(
"List end-delimiter '%s' not found.", delim.
latin1());
00350 exit(1);
00351 }
00352
if(
QString::fromLocal8Bit( args[ j ] ) == delim )
00353
break;
00354 marshall( dummy_arg, args, j, type );
00355 count++;
00356 }
00357 arg << (Q_UINT32) count;
00358
00359
while (
true) {
00360
if( i > args.
count() )
00361 {
00362 qWarning(
"List end-delimiter '%s' not found.", delim.
latin1());
00363 exit(1);
00364 }
00365
if(
QString::fromLocal8Bit( args[ i ] ) == delim )
00366
break;
00367 marshall( arg, args, i, type );
00368 }
00369 }
else {
00370 qWarning(
"cannot handle datatype '%s'", type.
latin1() );
00371 exit(1);
00372 }
00373 i++;
00374 }
00375
00376
00377