stubimpl.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <qdom.h>
00024 #include <qfile.h>
00025 #include <qtextstream.h>
00026 #include <qstring.h>
00027 #include <qstringlist.h>
00028
00029 #include <string.h>
00030 #include <stdlib.h>
00031 #include <stdio.h>
00032 #include <unistd.h>
00033 #include "main.h"
00034 #include "type.h"
00035
00036 static bool isIntType( const QString& t )
00037 {
00038 return ((t == "int")
00039 || (t == "signed int")
00040 || (t == "unsigned int")
00041 || (t == "uint")
00042 || (t == "unsigned")
00043 || (t == "signed short int")
00044 || (t == "signed short")
00045 || (t == "short int")
00046 || (t == "short")
00047 || (t == "unsigned short int")
00048 || (t == "unsigned short")
00049 || (t == "ushort")
00050 || (t == "long int")
00051 || (t == "signed long int")
00052 || (t == "long")
00053 || (t == "signed long")
00054 || (t == "unsigned long int")
00055 || (t == "unsigned long")
00056 || (t == "ulong")
00057 || (t == "char")
00058 || (t == "signed char")
00059 || (t == "unsigned char"));
00060 }
00061
00062
00063
00064
00065 void generateStubImpl( const QString& idl, const QString& header, const QString& , const QString& filename, QDomElement de )
00066 {
00067 QFile impl( filename );
00068 if ( !impl.open( IO_WriteOnly ) )
00069 qFatal("Could not write to %s", filename.latin1() );
00070
00071 QTextStream str( &impl );
00072
00073 str << "/****************************************************************************" << endl;
00074 str << "**" << endl;
00075 str << "** DCOP Stub Implementation created by dcopidl2cpp from " << idl << endl;
00076 str << "**" << endl;
00077 str << "** WARNING! All changes made in this file will be lost!" << endl;
00078 str << "**" << endl;
00079 str << "*****************************************************************************/" << endl;
00080 str << endl;
00081
00082 str << "#include \"" << header << "\"" << endl;
00083 str << "#include <dcopclient.h>" << endl << endl;
00084 str << "#include <kdatastream.h>" << endl;
00085
00086 QDomElement e = de.firstChild().toElement();
00087 for( ; !e.isNull(); e = e.nextSibling().toElement() ) {
00088 if ( e.tagName() != "CLASS" )
00089 continue;
00090 QDomElement n = e.firstChild().toElement();
00091 Q_ASSERT( n.tagName() == "NAME" );
00092 QString classNameBase = n.firstChild().toText().data();
00093 QString className_stub = classNameBase + "_stub";
00094
00095 QString classNameFull = className_stub;
00096
00097 int namespace_count = 0;
00098 QString namespace_tmp = className_stub;
00099 str << endl;
00100 for(;;) {
00101 int pos = namespace_tmp.find( "::" );
00102 if( pos < 0 ) {
00103 className_stub = namespace_tmp;
00104 break;
00105 }
00106 str << "namespace " << namespace_tmp.left( pos ) << " {" << endl;
00107 ++namespace_count;
00108 namespace_tmp = namespace_tmp.mid( pos + 2 );
00109 }
00110
00111 str << endl;
00112
00113
00114 str << className_stub << "::" << className_stub << "( const QCString& app, const QCString& obj )" << endl;
00115 str << " : ";
00116
00117
00118
00119 str << "DCOPStub( app, obj )" << endl;
00120
00121 str << "{" << endl;
00122 str << "}" << endl << endl;
00123
00124 str << className_stub << "::" << className_stub << "( DCOPClient* client, const QCString& app, const QCString& obj )" << endl;
00125 str << " : ";
00126
00127 str << "DCOPStub( client, app, obj )" << endl;
00128
00129 str << "{" << endl;
00130 str << "}" << endl << endl;
00131
00132 str << className_stub << "::" << className_stub << "( const DCOPRef& ref )" << endl;
00133 str << " : ";
00134
00135 str << "DCOPStub( ref )" << endl;
00136
00137 str << "{" << endl;
00138 str << "}" << endl << endl;
00139
00140
00141 QDomElement s = e.firstChild().toElement();
00142 for( ; !s.isNull(); s = s.nextSibling().toElement() ) {
00143 if (s.tagName() != "FUNC")
00144 continue;
00145 QDomElement r = s.firstChild().toElement();
00146 Q_ASSERT( r.tagName() == "TYPE" );
00147 QString result = r.firstChild().toText().data();
00148 bool async = result == "ASYNC";
00149 if ( async) {
00150 result = "void";
00151 str << result << " ";
00152 } else
00153 result = writeType( str, r );
00154
00155 r = r.nextSibling().toElement();
00156 Q_ASSERT ( r.tagName() == "NAME" );
00157 QString funcName = r.firstChild().toText().data();
00158 str << className_stub << "::" << funcName << "(";
00159
00160 QStringList args;
00161 QStringList argtypes;
00162 bool first = true;
00163 r = r.nextSibling().toElement();
00164 for( ; !r.isNull(); r = r.nextSibling().toElement() ) {
00165 if ( !first )
00166 str << ", ";
00167 else
00168 str << " ";
00169 first = false;
00170 Q_ASSERT( r.tagName() == "ARG" );
00171 QDomElement a = r.firstChild().toElement();
00172 QString type = writeType( str, a );
00173 argtypes.append( type );
00174 args.append( QString("arg" ) + QString::number( args.count() ) ) ;
00175 str << args.last();
00176 }
00177 if ( !first )
00178 str << " ";
00179 str << ")";
00180
00181
00182
00183
00184 str << endl;
00185
00186 str << "{" << endl ;
00187
00188
00189 funcName += "(";
00190 first = true;
00191 for( QStringList::Iterator it = argtypes.begin(); it != argtypes.end(); ++it ){
00192 if ( !first )
00193 funcName += ",";
00194 first = false;
00195 funcName += *it;
00196 }
00197 funcName += ")";
00198
00199 if ( async ) {
00200
00201 str << " if ( !dcopClient() ) {"<< endl;
00202 str << "\tsetStatus( CallFailed );" << endl;
00203 str << "\treturn;" << endl;
00204 str << " }" << endl;
00205
00206 str << " QByteArray data;" << endl;
00207 if ( !args.isEmpty() ) {
00208 str << " QDataStream arg( data, IO_WriteOnly );" << endl;
00209 for( QStringList::Iterator args_count = args.begin(); args_count != args.end(); ++args_count ){
00210 str << " arg << " << *args_count << ";" << endl;
00211 }
00212 }
00213
00214 str << " dcopClient()->send( app(), obj(), \"" << funcName << "\", data );" << endl;
00215 str << " setStatus( CallSucceeded );" << endl;
00216
00217 } else {
00218
00219 if ( result != "void" ) {
00220 str << " " << result << " result";
00221 if (isIntType( result ))
00222 str << " = 0";
00223 else if (result == "float" || result == "double")
00224 str << " = 0.0";
00225 else if ( result == "bool" )
00226 str << " = false";
00227
00228 str << ";" << endl;
00229 }
00230
00231 str << " if ( !dcopClient() ) {"<< endl;
00232 str << "\tsetStatus( CallFailed );" << endl;
00233 if ( result != "void" )
00234 str << "\treturn result;" << endl;
00235 else
00236 str << "\treturn;" << endl;
00237 str << " }" << endl;
00238
00239 str << " QByteArray data, replyData;" << endl;
00240 str << " QCString replyType;" << endl;
00241
00242 if ( !args.isEmpty() ) {
00243 str << " QDataStream arg( data, IO_WriteOnly );" << endl;
00244 for( QStringList::Iterator args_count = args.begin(); args_count != args.end(); ++args_count ){
00245 str << " arg << " << *args_count << ";" << endl;
00246 }
00247 }
00248 str << " if ( dcopClient()->call( app(), obj(), \"" << funcName << "\",";
00249 str << " data, replyType, replyData ) ) {" << endl;
00250 if ( result != "void" ) {
00251 str << "\tif ( replyType == \"" << result << "\" ) {" << endl;
00252 str << "\t QDataStream _reply_stream( replyData, IO_ReadOnly );" << endl;
00253 str << "\t _reply_stream >> result;" << endl;
00254 str << "\t setStatus( CallSucceeded );" << endl;
00255 str << "\t} else {" << endl;
00256 str << "\t callFailed();" << endl;
00257 str << "\t}" << endl;
00258 } else {
00259 str << "\tsetStatus( CallSucceeded );" << endl;
00260 }
00261 str << " } else { " << endl;
00262 str << "\tcallFailed();" << endl;
00263 str << " }" << endl;
00264 if ( result != "void" )
00265 str << " return result;" << endl;
00266 }
00267 str << "}" << endl << endl;
00268 }
00269
00270 for(; namespace_count > 0; --namespace_count )
00271 str << "} // namespace" << endl;
00272 str << endl;
00273 }
00274 impl.close();
00275 }
00276
00277
|