dcop
stub.cpp
Go to the documentation of this file.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 #include "type.h"
00035
00036
00037
00038
00039 void generateStub( const QString& idl, const QString& filename, QDomElement de)
00040 {
00041 QFile stub( filename );
00042 if ( !stub.open( IO_WriteOnly ) )
00043 qFatal("Could not write to %s", filename.local8Bit().data() );
00044
00045 QTextStream str( &stub );
00046
00047 str << "/****************************************************************************" << endl;
00048 str << "**" << endl;
00049 str << "** DCOP Stub Definition created by dcopidl2cpp from " << idl << endl;
00050 str << "**" << endl;
00051 str << "** WARNING! All changes made in this file will be lost!" << endl;
00052 str << "**" << endl;
00053 str << "*****************************************************************************/" << endl;
00054 str << endl;
00055
00056 QString ifdefstring = idl.upper();
00057 int pos = idl.findRev( '.' );
00058 if ( pos != -1 )
00059 ifdefstring = ifdefstring.left( pos );
00060
00061 QString ifdefsuffix = "_STUB__";
00062 str << "#ifndef __" << ifdefstring << ifdefsuffix << endl;
00063 str << "#define __" << ifdefstring << ifdefsuffix << endl << endl;
00064
00065 str << "#include <dcopstub.h>" << endl;
00066
00067 QStringList includeslist, all_includes;
00068 QDomElement e = de.firstChild().toElement();
00069 for( ; !e.isNull(); e = e.nextSibling().toElement() ) {
00070 if ( e.tagName() == "INCLUDE" ) {
00071
00072
00073 includeslist.prepend( e.firstChild().toText().data());
00074 continue;
00075 }
00076 if( !includeslist.empty()) {
00077 for( QStringList::ConstIterator it = includeslist.begin();
00078 it != includeslist.end();
00079 ++it ) {
00080 str << "#include <" << ( *it ) << ">" << endl;
00081 all_includes.append( *it );
00082 }
00083 includeslist.clear();
00084 }
00085 if ( e.tagName() != "CLASS" )
00086 continue;
00087
00088 str << endl;
00089
00090 QDomElement n = e.firstChild().toElement();
00091 Q_ASSERT( n.tagName() == "NAME" );
00092 QString className = n.firstChild().toText().data() + ( "_stub" );
00093
00094
00095 n = n.nextSibling().toElement();
00096 QString linkScope;
00097 if (n.tagName()=="LINK_SCOPE") {
00098 linkScope = n.firstChild().toText().data() + " ";
00099 n = n.nextSibling().toElement();
00100 }
00101
00102
00103 QString DCOPParent;
00104 for( ; !n.isNull(); n = n.nextSibling().toElement() ) {
00105 if ( n.tagName() == "SUPER" )
00106 DCOPParent = n.firstChild().toText().data();
00107 }
00108
00109 if( DCOPParent != "DCOPObject" ) {
00110 if( all_includes.contains( DCOPParent + ".h" ))
00111 str << "#include <" << DCOPParent << "_stub.h>" << endl;
00112 else if( all_includes.contains( DCOPParent.lower() + ".h" ))
00113 str << "#include <" << DCOPParent.lower() << "_stub.h>" << endl;
00114 else {
00115 QString stub_h = all_includes.last();
00116 unsigned int pos = stub_h.find( ".h" );
00117 if( pos > 0 ) {
00118 stub_h = stub_h.remove( pos, 100000 );
00119 str << "#include <" << stub_h << "_stub.h>" << endl;
00120 }
00121 else
00122 str << "#include <" << stub_h << ">" << endl;
00123 }
00124 }
00125
00126 QString classNameFull = className;
00127
00128 int namespace_count = 0;
00129 QString namespace_tmp = className;
00130 for(;;) {
00131 int pos = namespace_tmp.find( "::" );
00132 if( pos < 0 ) {
00133 className = namespace_tmp;
00134 break;
00135 }
00136 str << "namespace " << namespace_tmp.left( pos ) << " {" << endl;
00137 ++namespace_count;
00138 namespace_tmp = namespace_tmp.mid( pos + 2 );
00139 }
00140
00141 str << endl;
00142
00143
00144 str << "class " << linkScope << className;
00145
00146
00147 if ( !DCOPParent.isEmpty() && DCOPParent != "DCOPObject" ) {
00148 str << " : ";
00149 str << "virtual public " << DCOPParent << "_stub";
00150 } else {
00151 str << " : virtual public DCOPStub";
00152 }
00153
00154 str << endl;
00155 str << "{" << endl;
00156 str << "public:" << endl;
00157
00158
00159 str << " " << className << "( const QCString& app, const QCString& id );" << endl;
00160 str << " " << className << "( DCOPClient* client, const QCString& app, const QCString& id );" << endl;
00161 str << " explicit " << className << "( const DCOPRef& ref );" << endl;
00162
00163 n = e.firstChild().toElement();
00164 for( ; !n.isNull(); n = n.nextSibling().toElement() ) {
00165 if (n.tagName() != "FUNC")
00166 continue;
00167 QDomElement r = n.firstChild().toElement();
00168 str << " virtual ";
00169 writeType( str, r );
00170
00171 r = r.nextSibling().toElement();
00172 Q_ASSERT ( r.tagName() == "NAME" );
00173 str << r.firstChild().toText().data() << "(";
00174
00175 bool first = true;
00176 r = r.nextSibling().toElement();
00177 for( ; !r.isNull(); r = r.nextSibling().toElement() ) {
00178 if ( !first )
00179 str << ", ";
00180 else
00181 str << " ";
00182 first = false;
00183 Q_ASSERT( r.tagName() == "ARG" );
00184 QDomElement a = r.firstChild().toElement();
00185 writeType( str, a );
00186 a = a.nextSibling().toElement();
00187 if ( a.tagName() == "NAME" )
00188 str << a.firstChild().toText().data();
00189 }
00190 if ( !first )
00191 str << " ";
00192 str << ")";
00193
00194
00195
00196
00197 str << ";" << endl;
00198 }
00199
00200
00201 str << "protected:" << endl;
00202 str << " " << className << "() : DCOPStub( never_use ) {}" << endl;
00203
00204 str << "};" << endl;
00205 str << endl;
00206
00207 for(; namespace_count > 0; --namespace_count )
00208 str << "} // namespace" << endl;
00209 str << endl;
00210 }
00211
00212 str << "#endif" << endl;
00213 stub.close();
00214 }
00215
00216