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