stubimpl.cpp
00001
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
00035 int isIntType( const QString& t)
00036 {
00037 if ((t == "int")
00038 || (t == "signed int")
00039 || (t == "unsigned int")
00040 || (t == "uint")
00041 || (t == "unsigned")
00042 || (t == "signed short int")
00043 || (t == "signed short")
00044 || (t == "short int")
00045 || (t == "short")
00046 || (t == "unsigned short int")
00047 || (t == "unsigned short")
00048 || (t == "ushort")
00049 || (t == "long int")
00050 || (t == "signed long int")
00051 || (t == "long")
00052 || (t == "signed long")
00053 || (t == "unsigned long int")
00054 || (t == "unsigned long")
00055 || (t == "ulong")
00056 || (t == "char")
00057 || (t == "signed char")
00058 || (t == "unsigned char"))
00059 return 1;
00060 return 0;
00061 }
00062
00066 void generateStubImpl( const QString& idl, const QString& header, const QString& , const QString& filename, QDomElement de )
00067 {
00068 QFile impl( filename );
00069 if ( !impl.open( IO_WriteOnly ) )
00070 qFatal("Could not write to %s", filename.latin1() );
00071
00072 QTextStream str( &impl );
00073
00074 str << "/****************************************************************************" << endl;
00075 str << "**" << endl;
00076 str << "** DCOP Stub Implementation created by dcopidl2cpp from " << idl << endl;
00077 str << "**" << endl;
00078 str << "** WARNING! All changes made in this file will be lost!" << endl;
00079 str << "**" << endl;
00080 str << "*****************************************************************************/" << endl;
00081 str << endl;
00082
00083 str << "#include \"" << header << "\"" << endl;
00084 str << "#include <dcopclient.h>" << endl << endl;
00085 str << "#include <kdatastream.h>" << endl;
00086
00087 QDomElement e = de.firstChild().toElement();
00088 for( ; !e.isNull(); e = e.nextSibling().toElement() ) {
00089 if ( e.tagName() == "CLASS" ) {
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 {
00104 className_stub = namespace_tmp;
00105 break;
00106 }
00107 str << "namespace " << namespace_tmp.left( pos ) << " {" << endl;
00108 ++namespace_count;
00109 namespace_tmp = namespace_tmp.mid( pos + 2 );
00110 }
00111
00112 str << endl;
00113
00114
00115 str << className_stub << "::" << className_stub << "( const QCString& app, const QCString& obj )" << endl;
00116 str << " : ";
00117
00118
00119
00120 str << "DCOPStub( app, obj )" << endl;
00121
00122 str << "{" << endl;
00123 str << "}" << endl << endl;
00124
00125 str << className_stub << "::" << className_stub << "( DCOPClient* client, const QCString& app, const QCString& obj )" << endl;
00126 str << " : ";
00127
00128 str << "DCOPStub( client, app, obj )" << endl;
00129
00130 str << "{" << endl;
00131 str << "}" << endl << endl;
00132
00133
00134 QDomElement s = e.firstChild().toElement();
00135 for( ; !s.isNull(); s = s.nextSibling().toElement() ) {
00136 if (s.tagName() == "FUNC") {
00137 QDomElement r = s.firstChild().toElement();
00138 Q_ASSERT( r.tagName() == "TYPE" );
00139 QString result = r.firstChild().toText().data();
00140 bool async = result == "ASYNC";
00141 if ( async)
00142 result = "void";
00143 if ( r.hasAttribute( "qleft" ) )
00144 str << r.attribute("qleft") << " ";
00145 str << result;
00146 if ( r.hasAttribute( "qright" ) )
00147 str << r.attribute("qright") << " ";
00148 else
00149 str << " ";
00150
00151 r = r.nextSibling().toElement();
00152 Q_ASSERT ( r.tagName() == "NAME" );
00153 QString funcName = r.firstChild().toText().data();
00154 str << className_stub << "::" << funcName << "(";
00155
00156 QStringList args;
00157 QStringList argtypes;
00158 bool first = TRUE;
00159 r = r.nextSibling().toElement();
00160 for( ; !r.isNull(); r = r.nextSibling().toElement() ) {
00161 if ( !first )
00162 str << ", ";
00163 else
00164 str << " ";
00165 first = FALSE;
00166 Q_ASSERT( r.tagName() == "ARG" );
00167 QDomElement a = r.firstChild().toElement();
00168 Q_ASSERT( a.tagName() == "TYPE" );
00169 if ( a.hasAttribute( "qleft" ) )
00170 str << a.attribute("qleft") << " ";
00171 argtypes.append( a.firstChild().toText().data() );
00172 str << argtypes.last();
00173 if ( a.hasAttribute( "qright" ) )
00174 str << a.attribute("qright") << " ";
00175 else
00176 str << " ";
00177 args.append( QString("arg" ) + QString::number( args.count() ) ) ;
00178 str << args.last();
00179 }
00180 if ( !first )
00181 str << " ";
00182 str << ")";
00183
00184 if ( s.hasAttribute("qual") )
00185 str << " " << s.attribute("qual");
00186 str << endl;
00187
00188 str << "{" << endl ;
00189
00190
00191 funcName += "(";
00192 first = TRUE;
00193 for( QStringList::Iterator it = argtypes.begin(); it != argtypes.end(); ++it ){
00194 if ( !first )
00195 funcName += ",";
00196 first = FALSE;
00197 funcName += *it;
00198 }
00199 funcName += ")";
00200
00201 if ( async ) {
00202
00203 str << " if ( !dcopClient() ) {"<< endl;
00204 str << "\tsetStatus( CallFailed );" << endl;
00205 str << "\treturn;" << endl;
00206 str << " }" << endl;
00207
00208 str << " QByteArray data;" << endl;
00209 if ( !args.isEmpty() ) {
00210 str << " QDataStream arg( data, IO_WriteOnly );" << endl;
00211 for( QStringList::Iterator args_count = args.begin(); args_count != args.end(); ++args_count ){
00212 str << " arg << " << *args_count << ";" << endl;
00213 }
00214 }
00215
00216 str << " dcopClient()->send( app(), obj(), \"" << funcName << "\", data );" << endl;
00217 str << " setStatus( CallSucceeded );" << endl;
00218
00219 } else {
00220
00221 if ( result != "void" ) {
00222 str << " " << result << " result";
00223 if (isIntType( result ))
00224 str << " = 0";
00225 str << ";" << endl;
00226 }
00227
00228 str << " if ( !dcopClient() ) {"<< endl;
00229 str << "\tsetStatus( CallFailed );" << endl;
00230 if ( result != "void" )
00231 str << "\treturn result;" << endl;
00232 else
00233 str << "\treturn;" << endl;
00234 str << " }" << endl;
00235
00236 str << " QByteArray data, replyData;" << endl;
00237 str << " QCString replyType;" << endl;
00238
00239 if ( !args.isEmpty() ) {
00240 str << " QDataStream arg( data, IO_WriteOnly );" << endl;
00241 for( QStringList::Iterator args_count = args.begin(); args_count != args.end(); ++args_count ){
00242 str << " arg << " << *args_count << ";" << endl;
00243 }
00244 }
00245 str << " if ( dcopClient()->call( app(), obj(), \"" << funcName << "\",";
00246 str << " data, replyType, replyData ) ) {" << endl;
00247 if ( result != "void" ) {
00248 str << "\tif ( replyType == \"" << result << "\" ) {" << endl;
00249 str << "\t QDataStream _reply_stream( replyData, IO_ReadOnly );" << endl;
00250 str << "\t _reply_stream >> result;" << endl;
00251 str << "\t setStatus( CallSucceeded );" << endl;
00252 str << "\t} else {" << endl;
00253 str << "\t callFailed();" << endl;
00254 str << "\t}" << endl;
00255 } else {
00256 str << "\tsetStatus( CallSucceeded );" << endl;
00257 }
00258 str << " } else { " << endl;
00259 str << "\tcallFailed();" << endl;
00260 str << " }" << endl;
00261 if ( result != "void" )
00262 str << " return result;" << endl;
00263 }
00264 str << "}" << endl << endl;
00265 }
00266 }
00267
00268 for(;
00269 namespace_count > 0;
00270 --namespace_count )
00271 str << "} // namespace" << endl;
00272 str << endl;
00273 }
00274 }
00275 impl.close();
00276 }
This file is part of the documentation for kdelibs Version 3.1.4.