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 == "QPixmap" || type == "QImage" )
00164 {
00165 QImage i;
00166 stream >> i;
00167 QByteArray ba;
00168 QBuffer buf( ba );
00169 buf.open( IO_WriteOnly );
00170 i.save( &buf, "XPM" );
00171 result = ba;
00172 } else if ( type == "QPoint" )
00173 {
00174 QPoint p;
00175 stream >> p;
00176 result.sprintf( "+%d+%d", p.x(), p.y() );
00177 } else if ( type == "QRect" )
00178 {
00179 QRect r;
00180 stream >> r;
00181 result.sprintf( "%dx%d+%d+%d", r.width(), r.height(), r.x(), r.y() );
00182 } else if ( type == "QVariant" )
00183 {
00184 Q_INT32 type;
00185 stream >> type;
00186 return demarshal( stream, QVariant::typeToName( (QVariant::Type)type ) );
00187 } else if ( type == "DCOPRef" )
00188 {
00189 DCOPRef r;
00190 stream >> r;
00191 result.sprintf( "DCOPRef(%s,%s)", qStringToC(r.app()), qStringToC(r.object()) );
00192 } else if ( type == "KURL" )
00193 {
00194 KURL r;
00195 stream >> r;
00196 result = r.url().local8Bit();
00197 } else if ( type.left( 11 ) == "QValueList<" )
00198 {
00199 if ( (uint)type.find( '>', 11 ) != type.length() - 1 )
00200 return result;
00201
00202 QString nestedType = type.mid( 11, type.length() - 12 );
00203
00204 if ( nestedType.isEmpty() )
00205 return result;
00206
00207 Q_UINT32 count;
00208 stream >> count;
00209
00210 Q_UINT32 i = 0;
00211 for (; i < count; ++i )
00212 {
00213 QCString arg = demarshal( stream, nestedType );
00214 if ( arg.isEmpty() )
00215 continue;
00216
00217 result += arg;
00218
00219 if ( i < count - 1 )
00220 result += '\n';
00221 }
00222 } else if ( type.left( 5 ) == "QMap<" )
00223 {
00224 int commaPos = type.find( ',', 5 );
00225
00226 if ( commaPos == -1 )
00227 return result;
00228
00229 if ( (uint)type.find( '>', commaPos ) != type.length() - 1 )
00230 return result;
00231
00232 QString keyType = type.mid( 5, commaPos - 5 );
00233 QString valueType = type.mid( commaPos + 1, type.length() - commaPos - 2 );
00234
00235 Q_UINT32 count;
00236 stream >> count;
00237
00238 Q_UINT32 i = 0;
00239 for (; i < count; ++i )
00240 {
00241 QCString key = demarshal( stream, keyType );
00242
00243 if ( key.isEmpty() )
00244 continue;
00245
00246 QCString value = demarshal( stream, valueType );
00247
00248 if ( value.isEmpty() )
00249 continue;
00250
00251 result += key + "->" + value;
00252
00253 if ( i < count - 1 )
00254 result += '\n';
00255 }
00256 }
00257 else
00258 {
00259 result.sprintf( "<%s>", type.latin1());
00260 }
00261
00262 return result;
00263
00264 }
00265
00266 void marshall( QDataStream &arg, QCStringList args, uint &i, QString type )
00267 {
00268 if (type == "QStringList")
00269 type = "QValueList<QString>";
00270 if (type == "QCStringList")
00271 type = "QValueList<QCString>";
00272 if( i >= args.count() )
00273 {
00274 qWarning("Not enough arguments.");
00275 exit(1);
00276 }
00277 QString s = QString::fromLocal8Bit( args[ i ] );
00278
00279 if ( type == "int" )
00280 arg << s.toInt();
00281 else if ( type == "uint" )
00282 arg << s.toUInt();
00283 else if ( type == "unsigned" )
00284 arg << s.toUInt();
00285 else if ( type == "unsigned int" )
00286 arg << s.toUInt();
00287 else if ( type == "Q_UINT32" )
00288 arg << s.toUInt();
00289 else if ( type == "Q_UINT64" ) {
00290 QVariant qv = QVariant( s );
00291 arg << qv.toULongLong();
00292 }
00293 else if ( type == "long" )
00294 arg << s.toLong();
00295 else if ( type == "long int" )
00296 arg << s.toLong();
00297 else if ( type == "unsigned long" )
00298 arg << s.toULong();
00299 else if ( type == "unsigned long int" )
00300 arg << s.toULong();
00301 else if ( type == "float" )
00302 arg << s.toFloat();
00303 else if ( type == "double" )
00304 arg << s.toDouble();
00305 else if ( type == "bool" )
00306 arg << mkBool( s );
00307 else if ( type == "QString" )
00308 arg << s;
00309 else if ( type == "QCString" )
00310 arg << QCString( args[ i ] );
00311 else if ( type == "QColor" )
00312 arg << mkColor( s );
00313 else if ( type == "QPoint" )
00314 arg << mkPoint( s );
00315 else if ( type == "QSize" )
00316 arg << mkSize( s );
00317 else if ( type == "QRect" )
00318 arg << mkRect( s );
00319 else if ( type == "KURL" )
00320 arg << KURL( s );
00321 else if ( type == "QVariant" ) {
00322 if ( s == "true" || s == "false" )
00323 arg << QVariant( mkBool( s ), 42 );
00324 else if ( s.left( 4 ) == "int(" )
00325 arg << QVariant( s.mid(4, s.length()-5).toInt() );
00326 else if ( s.left( 7 ) == "QPoint(" )
00327 arg << QVariant( mkPoint( s.mid(7, s.length()-8) ) );
00328 else if ( s.left( 6 ) == "QSize(" )
00329 arg << QVariant( mkSize( s.mid(6, s.length()-7) ) );
00330 else if ( s.left( 6 ) == "QRect(" )
00331 arg << QVariant( mkRect( s.mid(6, s.length()-7) ) );
00332 else if ( s.left( 7 ) == "QColor(" )
00333 arg << QVariant( mkColor( s.mid(7, s.length()-8) ) );
00334 else
00335 arg << QVariant( s );
00336 } else if ( type.startsWith("QValueList<") ||
00337 type == "KURL::List" ) {
00338 if ( type == "KURL::List" )
00339 type = "KURL";
00340 else
00341 type = type.mid(11, type.length() - 12);
00342 QStringList list;
00343 QString delim = s;
00344 if (delim == "[")
00345 delim = "]";
00346 if (delim == "(")
00347 delim = ")";
00348 i++;
00349 QByteArray dummy_data;
00350 QDataStream dummy_arg(dummy_data, IO_WriteOnly);
00351
00352 uint j = i;
00353 uint count = 0;
00354
00355 while (true) {
00356 if( j > args.count() )
00357 {
00358 qWarning("List end-delimiter '%s' not found.", delim.latin1());
00359 exit(1);
00360 }
00361 if( QString::fromLocal8Bit( args[ j ] ) == delim )
00362 break;
00363 marshall( dummy_arg, args, j, type );
00364 count++;
00365 }
00366 arg << (Q_UINT32) count;
00367
00368 while (true) {
00369 if( i > args.count() )
00370 {
00371 qWarning("List end-delimiter '%s' not found.", delim.latin1());
00372 exit(1);
00373 }
00374 if( QString::fromLocal8Bit( args[ i ] ) == delim )
00375 break;
00376 marshall( arg, args, i, type );
00377 }
00378 } else {
00379 qWarning( "cannot handle datatype '%s'", type.latin1() );
00380 exit(1);
00381 }
00382 i++;
00383 }
00384
00385
00386