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 != '-') s++;
00045 int x = strtol(s, &end, 10);
00046 s = (const char *)end;
00047 while(*s && !isdigit(*s) && *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 != '-') s++;
00057 int w = strtol(s, &end, 10);
00058 s = (const char *)end;
00059 while(*s && !isdigit(*s) && *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 != '-') s++;
00069 int p1 = strtol(s, &end, 10);
00070 s = (const char *)end;
00071 bool legacy = (*s == 'x');
00072 while(*s && !isdigit(*s) && *s != '-') s++;
00073 int p2 = strtol(s, &end, 10);
00074 s = (const char *)end;
00075 while(*s && !isdigit(*s) && *s != '-') s++;
00076 int p3 = strtol(s, &end, 10);
00077 s = (const char *)end;
00078 while(*s && !isdigit(*s) && *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" || type == "Q_INT32" )
00106 {
00107 int i;
00108 stream >> i;
00109 result.setNum( i );
00110 } else if ( type == "uint" || type == "Q_UINT32" || type == "unsigned int" )
00111 {
00112 uint i;
00113 stream >> i;
00114 result.setNum( i );
00115 } else if ( type == "long" || type == "long int" )
00116 {
00117 long l;
00118 stream >> l;
00119 result.setNum( l );
00120 } else if ( type == "unsigned long" || type == "unsigned long int" )
00121 {
00122 unsigned long l;
00123 stream >> l;
00124 result.setNum( l );
00125 } else if ( type == "float" )
00126 {
00127 float f;
00128 stream >> f;
00129 result.setNum( f, 'f' );
00130 } else if ( type == "double" )
00131 {
00132 double d;
00133 stream >> d;
00134 result.setNum( d, 'f' );
00135 } else if ( type == "Q_INT64" ) {
00136 Q_INT64 i;
00137 stream >> i;
00138 result.sprintf( "%lld", i );
00139 } else if ( type == "Q_UINT64" ) {
00140 Q_UINT64 i;
00141 stream >> i;
00142 result.sprintf( "%llu", i );
00143 } else if ( type == "bool" )
00144 {
00145 bool b;
00146 stream >> b;
00147 result = b ? "true" : "false";
00148 } else if ( type == "QString" )
00149 {
00150 QString s;
00151 stream >> s;
00152 result = s.local8Bit();
00153 } else if ( type == "QCString" )
00154 {
00155 stream >> result;
00156 } else if ( type == "QCStringList" )
00157 {
00158 return demarshal( stream, "QValueList<QCString>" );
00159 } else if ( type == "QStringList" )
00160 {
00161 return demarshal( stream, "QValueList<QString>" );
00162 } else if ( type == "QColor" )
00163 {
00164 QColor c;
00165 stream >> c;
00166 result = c.name().local8Bit();
00167 } else if ( type == "QSize" )
00168 {
00169 QSize s;
00170 stream >> s;
00171 result.sprintf( "%dx%d", s.width(), s.height() );
00172 } else if ( type == "QPixmap" || type == "QImage" )
00173 {
00174 QImage i;
00175 stream >> i;
00176 QByteArray ba;
00177 QBuffer buf( ba );
00178 buf.open( IO_WriteOnly );
00179 i.save( &buf, "XPM" );
00180 result = ba;
00181 } else if ( type == "QPoint" )
00182 {
00183 QPoint p;
00184 stream >> p;
00185 result.sprintf( "+%d+%d", p.x(), p.y() );
00186 } else if ( type == "QRect" )
00187 {
00188 QRect r;
00189 stream >> r;
00190 result.sprintf( "%dx%d+%d+%d", r.width(), r.height(), r.x(), r.y() );
00191 } else if ( type == "QVariant" )
00192 {
00193 Q_INT32 type;
00194 stream >> type;
00195 return demarshal( stream, QVariant::typeToName( (QVariant::Type)type ) );
00196 } else if ( type == "DCOPRef" )
00197 {
00198 DCOPRef r;
00199 stream >> r;
00200 result.sprintf( "DCOPRef(%s,%s)", qStringToC(r.app()), qStringToC(r.object()) );
00201 } else if ( type == "KURL" )
00202 {
00203 KURL r;
00204 stream >> r;
00205 result = r.url().local8Bit();
00206 } else if ( type.left( 11 ) == "QValueList<" )
00207 {
00208 if ( (uint)type.find( '>', 11 ) != type.length() - 1 )
00209 return result;
00210
00211 QString nestedType = type.mid( 11, type.length() - 12 );
00212
00213 if ( nestedType.isEmpty() )
00214 return result;
00215
00216 Q_UINT32 count;
00217 stream >> count;
00218
00219 Q_UINT32 i = 0;
00220 for (; i < count; ++i )
00221 {
00222 QCString arg = demarshal( stream, nestedType );
00223 result += arg;
00224
00225 if ( i < count - 1 )
00226 result += '\n';
00227 }
00228 } else if ( type.left( 5 ) == "QMap<" )
00229 {
00230 int commaPos = type.find( ',', 5 );
00231
00232 if ( commaPos == -1 )
00233 return result;
00234
00235 if ( (uint)type.find( '>', commaPos ) != type.length() - 1 )
00236 return result;
00237
00238 QString keyType = type.mid( 5, commaPos - 5 );
00239 QString valueType = type.mid( commaPos + 1, type.length() - commaPos - 2 );
00240
00241 Q_UINT32 count;
00242 stream >> count;
00243
00244 Q_UINT32 i = 0;
00245 for (; i < count; ++i )
00246 {
00247 QCString key = demarshal( stream, keyType );
00248
00249 if ( key.isEmpty() )
00250 continue;
00251
00252 QCString value = demarshal( stream, valueType );
00253
00254 if ( value.isEmpty() )
00255 continue;
00256
00257 result += key + "->" + value;
00258
00259 if ( i < count - 1 )
00260 result += '\n';
00261 }
00262 }
00263 else
00264 {
00265 result.sprintf( "<%s>", type.latin1());
00266 }
00267
00268 return result;
00269
00270 }
00271
00272 void marshall( QDataStream &arg, QCStringList args, uint &i, QString type )
00273 {
00274 if( i >= args.count() )
00275 {
00276 qWarning("Not enough arguments (expected %d, got %d).", i, args.count());
00277 exit(1);
00278 }
00279 QString s = QString::fromLocal8Bit( args[ i ] );
00280
00281 if (type == "QStringList")
00282 type = "QValueList<QString>";
00283 if (type == "QCStringList")
00284 type = "QValueList<QCString>";
00285
00286 if ( type == "int" )
00287 arg << s.toInt();
00288 else if ( type == "uint" )
00289 arg << s.toUInt();
00290 else if ( type == "unsigned" )
00291 arg << s.toUInt();
00292 else if ( type == "unsigned int" )
00293 arg << s.toUInt();
00294 else if ( type == "Q_INT32" )
00295 arg << s.toInt();
00296 else if ( type == "Q_INT64" ) {
00297 QVariant qv = QVariant( s );
00298 arg << qv.toLongLong();
00299 }
00300 else if ( type == "Q_UINT32" )
00301 arg << s.toUInt();
00302 else if ( type == "Q_UINT64" ) {
00303 QVariant qv = QVariant( s );
00304 arg << qv.toULongLong();
00305 }
00306 else if ( type == "long" )
00307 arg << s.toLong();
00308 else if ( type == "long int" )
00309 arg << s.toLong();
00310 else if ( type == "unsigned long" )
00311 arg << s.toULong();
00312 else if ( type == "unsigned long int" )
00313 arg << s.toULong();
00314 else if ( type == "float" )
00315 arg << s.toFloat();
00316 else if ( type == "double" )
00317 arg << s.toDouble();
00318 else if ( type == "bool" )
00319 arg << mkBool( s );
00320 else if ( type == "QString" )
00321 arg << s;
00322 else if ( type == "QCString" )
00323 arg << QCString( args[ i ] );
00324 else if ( type == "QColor" )
00325 arg << mkColor( s );
00326 else if ( type == "QPoint" )
00327 arg << mkPoint( s );
00328 else if ( type == "QSize" )
00329 arg << mkSize( s );
00330 else if ( type == "QRect" )
00331 arg << mkRect( s );
00332 else if ( type == "KURL" )
00333 arg << KURL( s );
00334 else if ( type == "QVariant" ) {
00335 if ( s == "true" || s == "false" )
00336 arg << QVariant( mkBool( s ), 42 );
00337 else if ( s.left( 4 ) == "int(" )
00338 arg << QVariant( s.mid(4, s.length()-5).toInt() );
00339 else if ( s.left( 7 ) == "QPoint(" )
00340 arg << QVariant( mkPoint( s.mid(7, s.length()-8) ) );
00341 else if ( s.left( 6 ) == "QSize(" )
00342 arg << QVariant( mkSize( s.mid(6, s.length()-7) ) );
00343 else if ( s.left( 6 ) == "QRect(" )
00344 arg << QVariant( mkRect( s.mid(6, s.length()-7) ) );
00345 else if ( s.left( 7 ) == "QColor(" )
00346 arg << QVariant( mkColor( s.mid(7, s.length()-8) ) );
00347 else
00348 arg << QVariant( s );
00349 } else if ( type.startsWith("QValueList<") ||
00350 type == "KURL::List" ) {
00351 if ( type == "KURL::List" )
00352 type = "KURL";
00353 else
00354 type = type.mid(11, type.length() - 12);
00355 QStringList list;
00356 QString delim = s;
00357 if (delim == "[")
00358 delim = "]";
00359 if (delim == "(")
00360 delim = ")";
00361 i++;
00362 QByteArray dummy_data;
00363 QDataStream dummy_arg(dummy_data, IO_WriteOnly);
00364
00365 uint j = i;
00366 uint count = 0;
00367
00368 while (true) {
00369 if( j > args.count() )
00370 {
00371 qWarning("List end-delimiter '%s' not found.", delim.latin1());
00372 exit(1);
00373 }
00374 if( QString::fromLocal8Bit( args[ j ] ) == delim )
00375 break;
00376 marshall( dummy_arg, args, j, type );
00377 count++;
00378 }
00379 arg << (Q_UINT32) count;
00380
00381 while (true) {
00382 if( i > args.count() )
00383 {
00384 qWarning("List end-delimiter '%s' not found.", delim.latin1());
00385 exit(1);
00386 }
00387 if( QString::fromLocal8Bit( args[ i ] ) == delim )
00388 break;
00389 marshall( arg, args, i, type );
00390 }
00391 } else {
00392 qWarning( "cannot handle datatype '%s'", type.latin1() );
00393 exit(1);
00394 }
00395 i++;
00396 }
00397
00398
00399