summaryrefslogtreecommitdiffstats
path: root/dcop/dcopidl2cpp/stub.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dcop/dcopidl2cpp/stub.cpp')
-rw-r--r--dcop/dcopidl2cpp/stub.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/dcop/dcopidl2cpp/stub.cpp b/dcop/dcopidl2cpp/stub.cpp
new file mode 100644
index 000000000..4060ae88f
--- /dev/null
+++ b/dcop/dcopidl2cpp/stub.cpp
@@ -0,0 +1,216 @@
+/*****************************************************************
+Copyright (c) 1999 Torben Weis <weis@kde.org>
+Copyright (c) 2000 Matthias Ettrich <ettrich@kde.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************/
+#include <qdom.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "main.h"
+#include "type.h"
+
+/*
+ * Writes the stubs header
+ */
+void generateStub( const QString& idl, const QString& filename, QDomElement de)
+{
+ QFile stub( filename );
+ if ( !stub.open( IO_WriteOnly ) )
+ qFatal("Could not write to %s", filename.local8Bit().data() );
+
+ QTextStream str( &stub );
+
+ str << "/****************************************************************************" << endl;
+ str << "**" << endl;
+ str << "** DCOP Stub Definition created by dcopidl2cpp from " << idl << endl;
+ str << "**" << endl;
+ str << "** WARNING! All changes made in this file will be lost!" << endl;
+ str << "**" << endl;
+ str << "*****************************************************************************/" << endl;
+ str << endl;
+
+ QString ifdefstring = idl.upper();
+ int pos = idl.findRev( '.' );
+ if ( pos != -1 )
+ ifdefstring = ifdefstring.left( pos );
+
+ QString ifdefsuffix = "_STUB__";
+ str << "#ifndef __" << ifdefstring << ifdefsuffix << endl;
+ str << "#define __" << ifdefstring << ifdefsuffix << endl << endl;
+
+ str << "#include <dcopstub.h>" << endl;
+
+ QStringList includeslist, all_includes;
+ QDomElement e = de.firstChild().toElement();
+ for( ; !e.isNull(); e = e.nextSibling().toElement() ) {
+ if ( e.tagName() == "INCLUDE" ) {
+ // dcopidl lists the includes in reversed order because of the used yacc/bison gramatic
+ // so let's reverse it back, as the order may be important
+ includeslist.prepend( e.firstChild().toText().data());
+ continue;
+ }
+ if( !includeslist.empty()) {
+ for( QStringList::ConstIterator it = includeslist.begin();
+ it != includeslist.end();
+ ++it ) {
+ str << "#include <" << ( *it ) << ">" << endl;
+ all_includes.append( *it );
+ }
+ includeslist.clear();
+ }
+ if ( e.tagName() != "CLASS" )
+ continue;
+
+ str << endl;
+
+ QDomElement n = e.firstChild().toElement();
+ Q_ASSERT( n.tagName() == "NAME" );
+ QString className = n.firstChild().toText().data() + ( "_stub" );
+
+ //add link scope, if available
+ n = n.nextSibling().toElement();
+ QString linkScope;
+ if (n.tagName()=="LINK_SCOPE") {
+ linkScope = n.firstChild().toText().data() + " ";
+ n = n.nextSibling().toElement();
+ }
+
+ // find dcop parent ( rightmost super class )
+ QString DCOPParent;
+ for( ; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if ( n.tagName() == "SUPER" )
+ DCOPParent = n.firstChild().toText().data();
+ }
+
+ if( DCOPParent != "DCOPObject" ) { // we need to include the .h file for the base stub
+ if( all_includes.contains( DCOPParent + ".h" ))
+ str << "#include <" << DCOPParent << "_stub.h>" << endl;
+ else if( all_includes.contains( DCOPParent.lower() + ".h" ))
+ str << "#include <" << DCOPParent.lower() << "_stub.h>" << endl;
+ else {// damn ... let's assume it's the last include
+ QString stub_h = all_includes.last();
+ unsigned int pos = stub_h.find( ".h" );
+ if( pos > 0 ) {
+ stub_h = stub_h.remove( pos, 100000 );
+ str << "#include <" << stub_h << "_stub.h>" << endl;
+ }
+ else
+ str << "#include <" << stub_h << ">" << endl;
+ }
+ }
+
+ QString classNameFull = className; // class name with possible namespaces prepended
+ // namespaces will be removed from className now
+ int namespace_count = 0;
+ QString namespace_tmp = className;
+ for(;;) {
+ int pos = namespace_tmp.find( "::" );
+ if( pos < 0 ) {
+ className = namespace_tmp;
+ break;
+ }
+ str << "namespace " << namespace_tmp.left( pos ) << " {" << endl;
+ ++namespace_count;
+ namespace_tmp = namespace_tmp.mid( pos + 2 );
+ }
+
+ str << endl;
+
+ // Stub class definition
+ str << "class " << linkScope << className;
+
+ // Parent : inherited interface stub or dcopstub
+ if ( !DCOPParent.isEmpty() && DCOPParent != "DCOPObject" ) {
+ str << " : ";
+ str << "virtual public " << DCOPParent << "_stub";
+ } else {
+ str << " : virtual public DCOPStub";
+ }
+
+ str << endl;
+ str << "{" << endl;
+ str << "public:" << endl;
+
+ // Constructors
+ str << " " << className << "( const QCString& app, const QCString& id );" << endl;
+ str << " " << className << "( DCOPClient* client, const QCString& app, const QCString& id );" << endl;
+ str << " explicit " << className << "( const DCOPRef& ref );" << endl;
+
+ n = e.firstChild().toElement();
+ for( ; !n.isNull(); n = n.nextSibling().toElement() ) {
+ if (n.tagName() != "FUNC")
+ continue;
+ QDomElement r = n.firstChild().toElement();
+ str << " virtual "; // KDE4 - I really don't think these need to be virtual
+ writeType( str, r );
+
+ r = r.nextSibling().toElement();
+ Q_ASSERT ( r.tagName() == "NAME" );
+ str << r.firstChild().toText().data() << "(";
+
+ bool first = true;
+ r = r.nextSibling().toElement();
+ for( ; !r.isNull(); r = r.nextSibling().toElement() ) {
+ if ( !first )
+ str << ", ";
+ else
+ str << " ";
+ first = false;
+ Q_ASSERT( r.tagName() == "ARG" );
+ QDomElement a = r.firstChild().toElement();
+ writeType( str, a );
+ a = a.nextSibling().toElement();
+ if ( a.tagName() == "NAME" )
+ str << a.firstChild().toText().data();
+ }
+ if ( !first )
+ str << " ";
+ str << ")";
+
+ //const methods stubs can't compile, they need to call setStatus().
+ //if ( n.hasAttribute("qual") )
+ // str << " " << n.attribute("qual");
+ str << ";" << endl;
+ }
+
+ // needed for inherited stubs
+ str << "protected:" << endl;
+ str << " " << className << "() : DCOPStub( never_use ) {}" << endl;
+
+ str << "};" << endl;
+ str << endl;
+
+ for(; namespace_count > 0; --namespace_count )
+ str << "} // namespace" << endl;
+ str << endl;
+ }
+
+ str << "#endif" << endl;
+ stub.close();
+}
+
+// :set expandtab!<RETURN>:set ts=8<RETURN>:set sts=4<RETURN>:set sw=4<RETURN>