rpms/dbus-qt3/devel BRANCH_UPDATE.diff, NONE, 1.1 dbus-qt3.spec, 1.2, 1.3

Dennis Gilmore (ausil) fedora-extras-commits at redhat.com
Tue Feb 5 18:30:12 UTC 2008


Author: ausil

Update of /cvs/extras/rpms/dbus-qt3/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv25735

Modified Files:
	dbus-qt3.spec 
Added Files:
	BRANCH_UPDATE.diff 
Log Message:
include patch pulled from suse needed for knm


BRANCH_UPDATE.diff:

--- NEW FILE BRANCH_UPDATE.diff ---
--- test/cross-test/crosstest-client.pro
+++ test/cross-test/crosstest-client.pro
@@ -3,11 +3,11 @@ TEMPLATE = app
 CONFIG += qt thread
 
 SOURCES += crosstest-client.cpp \
-           singletestsproxy.cpp testclient.cpp \
+           singletestsproxy.cpp testclientinterface.cpp \
            testsproxy.cpp testsignalsproxy.cpp
 
 HEADERS += crosstest-client.h \
-           singletestsproxy.h testclient.h \
+           singletestsproxy.h testclientinterface.h \
            testsproxy.h testsignalsproxy.h
 
 TARGET = crosstest-client
--- test/cross-test/crosstest-client.h
+++ test/cross-test/crosstest-client.h
@@ -10,7 +10,7 @@
 #include <dbus/qdbusconnection.h>
 
 // local includes
-#include "testclient.h"
+#include "testclientinterface.h"
 
 // forward declarations
 class QDBusMessage;
--- test/cross-test/interfaceimpls.h
+++ test/cross-test/interfaceimpls.h
@@ -5,9 +5,9 @@
 #include <qobject.h>
 
 // local includes
-#include "singletests.h"
-#include "tests.h"
-#include "testsignals.h"
+#include "singletestsinterface.h"
+#include "testsinterface.h"
+#include "testsignalsinterface.h"
 
 // forward declarations
 class TestNode;
--- test/cross-test/crosstest-server.pro
+++ test/cross-test/crosstest-server.pro
@@ -3,10 +3,12 @@ TEMPLATE = app
 CONFIG += qt thread
 
 SOURCES += crosstest-server.cpp interfaceimpls.cpp \
-           singletests.cpp testclientproxy.cpp tests.cpp testsignals.cpp
+           singletestsinterface.cpp testclientproxy.cpp \
+           testsinterface.cpp testsignalsinterface.cpp
 
 HEADERS += crosstest-server.h interfaceimpls.h \
-           singletests.h testclientproxy.h tests.h testsignals.h
+           singletestsinterface.h testclientproxy.h \
+           testsinterface.h testsignalsinterface.h
 
 TARGET = crosstest-server
 
--- test/cross-test/Makefile
+++ test/cross-test/Makefile
@@ -1,7 +1,10 @@
-GENERATED = tests.h tests.cpp testsproxy.h testsproxy.cpp \
-            singletests.h singletests.cpp singletestsproxy.h singletestsproxy.cpp \
-            testclient.h testclient.cpp testclientproxy.h testclientproxy.cpp \
-            testsignals.h testsignals.cpp testsignalsproxy.h testsignalsproxy.cpp
+GENERATED = testsinterface.h testsinterface.cpp testsproxy.h testsproxy.cpp \
+            singletestsinterface.h singletestsinterface.cpp \
+            singletestsproxy.h singletestsproxy.cpp \
+            testclientinterface.h testclientinterface.cpp \
+            testclientproxy.h testclientproxy.cpp \
+            testsignalsinterface.h testsignalsinterface.cpp \
+            testsignalsproxy.h testsignalsproxy.cpp
 
 all: cross-test-compile
 
--- qdbusmarshall.cpp
+++ qdbusmarshall.cpp
@@ -456,9 +456,10 @@ static QDBusData qFetchParameter(DBusMes
     case DBUS_TYPE_DOUBLE:
         return QDBusData::fromDouble(qIterGet<double>(it));
     case DBUS_TYPE_STRING:
-    case DBUS_TYPE_OBJECT_PATH:
     case DBUS_TYPE_SIGNATURE:
         return QDBusData::fromString(QString::fromUtf8(qIterGet<char *>(it)));
+    case DBUS_TYPE_OBJECT_PATH:
+        return QDBusData::fromObjectPath(QDBusObjectPath(qIterGet<char *>(it)));
     case DBUS_TYPE_ARRAY: {
         int arrayType = dbus_message_iter_get_element_type(it);
 
--- tools/dbusxml2qt3/classgen.cpp
+++ tools/dbusxml2qt3/classgen.cpp
@@ -192,6 +192,8 @@ static void writeHeaderIncludes(const Cl
             includes["qdbus"].insertString("<dbus/qdbusobject.h>");
             forwards.insertString("class QDBusError");
             forwards.insertString("class QDomElement");
+            if (!classData.signals.isEmpty())
+                forwards.insertString("class QString");
             break;
 
         case Class::Proxy:
@@ -266,6 +268,15 @@ static void writeSourceIncludes(const Cl
         extractSourceIncludes(*it, includes);
     }
 
+    it    = classData.signals.begin();
+    endIt = classData.signals.end();
+    for (; it != endIt; ++it)
+    {
+        if ((*it).arguments.isEmpty()) continue;
+
+        extractSourceIncludes(*it, includes);
+    }
+
     QValueList<Property>::const_iterator propertyIt = classData.properties.begin();
     QValueList<Property>::const_iterator propertyEndIt = classData.properties.end();
     for (; propertyIt != propertyEndIt; ++propertyIt)
@@ -318,24 +329,6 @@ static void writeSourceIncludes(const Cl
 
     if (!includes["local"].isEmpty())
         writeIncludes("local", includes["local"].keys(), stream);
-    else
-        stream << "// local includes" << endl;
-
-    switch (role)
-    {
-        case Class::Interface:
-            stream << "#include \"" << classData.name.lower() << ".h\"" << endl;
-            break;
-
-        case Class::Proxy:
-            stream << "#include \"" << classData.name.lower() << "proxy.h\""
-                   << endl;
-            break;
-
-        case Class::Node:
-            stream << "#include \"" << classData.name.lower() << ".h\"" << endl;
-            break;
-    }
 
     stream << endl;
 }
@@ -352,7 +345,7 @@ static void writeInterfaceIncludes(const
         stream << "#include \"" << (*it).name.lower() << ".h\"" << endl;
     }
 
-    stream << "#include \"introspectable.h\"" << endl;
+    stream << "#include \"introspectableinterface.h\"" << endl;
 
     stream << endl;
 }
@@ -491,6 +484,7 @@ static void writeMethodDeclarations(cons
 
             case Class::Proxy:
                 pureVirtual = false;
+                stream << "public:" << endl;
                 stream << "    virtual void setDBusProperty(const QString& name,"
                        << " const QDBusVariant& variant, QDBusError& error);"
                        << endl;
@@ -649,6 +643,56 @@ static void writeProxyProperties(const C
     }
 }
 
+bool ClassGenerator::initStreams(const QString& baseName,
+                                 QTextStream& headerStream,
+                                 QTextStream& sourceStream)
+{
+    QFile* headerFile = new QFile(baseName + ".h");
+    QFile* sourceFile = new QFile(baseName + ".cpp");
+
+    if (!headerFile->open(IO_WriteOnly) || !sourceFile->open(IO_WriteOnly))
+    {
+        delete headerFile;
+        delete sourceFile;
+
+        return false;
+    }
+
+    headerStream.setDevice(headerFile);
+    sourceStream.setDevice(sourceFile);
+
+    // create header
+    writeFileHeader(headerStream);
+    openIncludeGuard(baseName, headerStream);
+
+    // create source
+    writeFileHeader(sourceStream);
+    sourceStream << "// declaration include" << endl;
+    sourceStream << "#include \"" << baseName << ".h\"" << endl;
+    sourceStream << endl;
+
+    return true;
+}
+
+bool ClassGenerator::finishStreams(const QString& baseName,
+                                   QTextStream& headerStream,
+                                   QTextStream& sourceStream)
+{
+    closeIncludeGuard(baseName, headerStream);
+    writeFileFooter(headerStream);
+    writeFileFooter(sourceStream);
+
+    QIODevice* device = headerStream.device();
+    headerStream.unsetDevice();
+    delete device;
+
+    device = sourceStream.device();
+    sourceStream.unsetDevice();
+    delete device;
+
+    return true;
+}
+
 bool ClassGenerator::extractClass(const QDomElement& interfaceElement,
                                    Class& classData)
 {
@@ -668,22 +712,11 @@ bool ClassGenerator::extractClass(const 
     return MethodGenerator::extractMethods(interfaceElement, classData);
 }
 
-bool ClassGenerator::generateInterface(const Class& classData)
+bool ClassGenerator::generateInterface(const Class& classData,
+                                       QTextStream& headerStream,
+                                       QTextStream& sourceStream)
 {
-    QFile headerFile(classData.name.lower() + ".h");
-    QFile sourceFile(classData.name.lower() + ".cpp");
-
-    if (!headerFile.open(IO_WriteOnly) || !sourceFile.open(IO_WriteOnly))
-        return false;
-
-    // init streams
-    QTextStream headerStream(&headerFile);
-    QTextStream sourceStream(&sourceFile);
-
     // create header
-    writeFileHeader(headerStream);
-    openIncludeGuard(classData.name, headerStream);
-
     writeHeaderIncludes(classData, Class::Interface, headerStream);
 
     openNamespaces(classData.namespaces, headerStream);
@@ -695,11 +728,8 @@ bool ClassGenerator::generateInterface(c
 
     closeClassDeclaration(classData, Class::Interface, headerStream);
     closeNamespaces(classData.namespaces, headerStream);
-    closeIncludeGuard(classData.name, headerStream);
-    writeFileFooter(headerStream);
 
     // create source
-    writeFileHeader(sourceStream);
     writeSourceIncludes(classData, Class::Interface, sourceStream);
 
     openNamespaces(classData.namespaces, sourceStream);
@@ -713,27 +743,15 @@ bool ClassGenerator::generateInterface(c
     MethodGenerator::writeInterfaceMainMethod(classData, sourceStream);
 
     closeNamespaces(classData.namespaces, sourceStream);
-    writeFileFooter(sourceStream);
 
     return true;
 }
 
-bool ClassGenerator::generateProxy(const Class& classData)
+bool ClassGenerator::generateProxy(const Class& classData,
+                                   QTextStream& headerStream,
+                                   QTextStream& sourceStream)
 {
-    QFile headerFile(classData.name.lower() + "proxy.h");
-    QFile sourceFile(classData.name.lower() + "proxy.cpp");
-
-    if (!headerFile.open(IO_WriteOnly) || !sourceFile.open(IO_WriteOnly))
-        return false;
-
-    // init streams
-    QTextStream headerStream(&headerFile);
-    QTextStream sourceStream(&sourceFile);
-
     // create header
-    writeFileHeader(headerStream);
-    openIncludeGuard(classData.name + "PROXY", headerStream);
-
     writeHeaderIncludes(classData, Class::Proxy, headerStream);
 
     openNamespaces(classData.namespaces, headerStream);
@@ -744,11 +762,8 @@ bool ClassGenerator::generateProxy(const
 
     closeClassDeclaration(classData, Class::Proxy, headerStream);
     closeNamespaces(classData.namespaces, headerStream);
-    closeIncludeGuard(classData.name, headerStream);
-    writeFileFooter(headerStream);
 
     // create source
-    writeFileHeader(sourceStream);
     writeSourceIncludes(classData, Class::Proxy, sourceStream);
 
     openNamespaces(classData.namespaces, sourceStream);
@@ -763,28 +778,16 @@ bool ClassGenerator::generateProxy(const
         MethodGenerator::writeSignalHandler(classData, sourceStream);
 
     closeNamespaces(classData.namespaces, sourceStream);
-    writeFileFooter(sourceStream);
 
     return true;
 }
 
 bool ClassGenerator::generateNode(const Class& classData,
-                                  const QValueList<Class>& interfaces)
+                                  const QValueList<Class>& interfaces,
+                                  QTextStream& headerStream,
+                                  QTextStream& sourceStream)
 {
-    QFile headerFile(classData.name.lower() + ".h");
-    QFile sourceFile(classData.name.lower() + ".cpp");
-
-    if (!headerFile.open(IO_WriteOnly) || !sourceFile.open(IO_WriteOnly))
-        return false;
-
-    // init streams
-    QTextStream headerStream(&headerFile);
-    QTextStream sourceStream(&sourceFile);
-
     // create header
-    writeFileHeader(headerStream);
-    openIncludeGuard(classData.name, headerStream);
-
     writeHeaderIncludes(classData, Class::Node, headerStream);
 
     openNamespaces(classData.namespaces, headerStream);
@@ -792,11 +795,8 @@ bool ClassGenerator::generateNode(const 
 
     closeClassDeclaration(classData, Class::Node, headerStream);
     closeNamespaces(classData.namespaces, headerStream);
-    closeIncludeGuard(classData.name, headerStream);
-    writeFileFooter(headerStream);
 
     // create source
-    writeFileHeader(sourceStream);
     writeSourceIncludes(classData, Class::Node, sourceStream);
     writeInterfaceIncludes(interfaces, sourceStream);
 
@@ -809,7 +809,6 @@ bool ClassGenerator::generateNode(const 
     MethodGenerator::writeNodeMethods(classData, interfaces, sourceStream);
 
     closeNamespaces(classData.namespaces, sourceStream);
-    writeFileFooter(sourceStream);
 
     return true;
 }
--- tools/dbusxml2qt3/classgen.h
+++ tools/dbusxml2qt3/classgen.h
@@ -26,16 +26,27 @@
 // forward declarations
 class Class;
 class QDomElement;
+class QTextStream;
 template<typename T> class QValueList;
 
 class ClassGenerator
 {
 public:
+    static bool initStreams(const QString& baseName,
+                            QTextStream& headerStream, QTextStream& sourceStream);
+
+    static bool finishStreams(const QString& baseName,
+                              QTextStream& headerStream, QTextStream& sourceStream);
+
     static bool extractClass(const QDomElement& interfaceElement, Class& classData);
-    static bool generateInterface(const Class& classData);
-    static bool generateProxy(const Class& classData);
+    static bool generateInterface(const Class& classData,
+                                  QTextStream& headerStream,
+                                  QTextStream& sourceStream);
+    static bool generateProxy(const Class& classData,
+                              QTextStream& headerStream, QTextStream& sourceStream);
     static bool generateNode(const Class& classData,
-                             const QValueList<Class>& interfaces);
+                             const QValueList<Class>& interfaces,
+                             QTextStream& headerStream, QTextStream& sourceStream);
 };
 
 #endif
--- tools/dbusxml2qt3/main.cpp
+++ tools/dbusxml2qt3/main.cpp
@@ -20,38 +20,58 @@
 *   OTHER DEALINGS IN THE SOFTWARE.
 */
 
+// standard includes
+#include <iostream>
+#include <cstdlib>
+
 // Qt includes
 #include <qdom.h>
 #include <qfile.h>
+#include <qmap.h>
+#include <qtextstream.h>
 
 // local includes
 #include "classgen.h"
 #include "methodgen.h"
 
+typedef QMap<QString, QString> OptionMap;
+
+void usage();
+
+OptionMap parseOptions(int argc, char** argv);
+
+bool checkForOption(const OptionMap& options, const QString& option)
+{
+    return options.find(option) != options.end();
+}
+
 int main(int argc, char** argv)
 {
-    if (argc < 2)
-    {
-        qFatal("Missing input file: dbusxml2qt3 <introspection-file>"
-               " [NodeClassName]");
-    }
-    else if (argc > 3)
+    const OptionMap options = parseOptions(argc, argv);
+
+    if (!checkForOption(options, "filename"))
     {
-        qFatal("Too many arguments: dbusxml2qt3 <introspection-file>"
-               " [NodeClassName]");
+        std::cerr << "dbusxml2qt3: introspection data file missing" << std::endl;
+        usage();
+        exit(1);
     }
 
-    QString fileName = QString::fromLocal8Bit(argv[1]);
-
+    QString fileName = options["filename"];
     QFile file(fileName);
     if (!file.exists())
     {
-        qFatal("File '%s' does not exist", argv[1]);
+        std::cerr << "dbusxml2qt3: introspection data file '"
+                  << fileName.local8Bit().data()
+                  << "' does not exist" << std::endl;
+        exit(2);
     }
 
     if (!file.open(IO_ReadOnly))
     {
-        qFatal("File '%s' can not be read", argv[1]);
+        std::cerr << "dbusxml2qt3: introspection data file '"
+                  << fileName.local8Bit().data()
+                  << "' cannot be read" << std::endl;
+        exit(2);
     }
 
     QDomDocument document;
@@ -60,7 +80,10 @@ int main(int argc, char** argv)
     {
         file.close();
 
-        qFatal("Content of file '%s' not parsable", argv[1]);
+        std::cerr << "dbusxml2qt3: introspection data file '"
+                  << fileName.local8Bit().data()
+                  << "' cannot be parsed" << std::endl;
+        exit(2);
     }
 
     file.close();
@@ -68,12 +91,13 @@ int main(int argc, char** argv)
     QDomElement rootElement = document.documentElement();
     if (rootElement.isNull() || rootElement.tagName() != "node")
     {
-        qFatal("File '%s' is not a D-Bus introspection data file", argv[1]);
+        std::cerr << "dbusxml2qt3: introspection data file '"
+                  << fileName.local8Bit().data()
+                  << "' does not have a 'node' element as its root node"
+                  << std::endl;
+        exit(2);
     }
 
-    QString nodeClassName;
-    if (argc == 3) nodeClassName = QString::fromLocal8Bit(argv[2]);
-
     QValueList<Class> interfaces;
     bool hasIntrospectable = false;
 
@@ -91,9 +115,6 @@ int main(int argc, char** argv)
                 Class classData;
                 if (ClassGenerator::extractClass(element, classData))
                 {
-                    ClassGenerator::generateInterface(classData);
-                    ClassGenerator::generateProxy(classData);
-
                     if (classData.dbusName == "org.freedesktop.DBus.Introspectable")
                         hasIntrospectable = true;
                     else
@@ -103,7 +124,156 @@ int main(int argc, char** argv)
         }
     }
 
-    if (!nodeClassName.isEmpty() && !interfaces.isEmpty())
+    if (interfaces.isEmpty())
+    {
+        std::cerr << "dbusxml2qt3: introspection data file '"
+                  << fileName.local8Bit().data()
+                  << "' does not contain any valid interface descriptions"
+                  << std::endl;
+        exit(3);
+    }
+
+    bool generateProxies    = checkForOption(options, "proxy");
+    bool generateInterfaces = checkForOption(options, "interface");
+    bool generateNode       = checkForOption(options, "node");
+
+    // if no specific option is selected, we generate everything
+    bool generateAll = !(generateProxies || generateInterfaces || generateNode);
+
+    if (checkForOption(options, "classname"))
+    {
+        // class name only useful for single interfaces or just node
+        if (interfaces.count() > 1 && (generateAll || generateInterfaces || generateProxies))
+        {
+            std::cerr << "dbusxml2qt3: class name option specified but "
+                      << "introspection data file '"
+                      << fileName.local8Bit().data()
+                      << "' contains more than one interface description"
+                      << std::endl;
+            exit(3);
+        }
+
+        // class name for node is handled differently later on
+        if (!generateNode)
+        {
+            QStringList nameParts = QStringList::split("::", options["classname"]);
+
+            interfaces[0].name = nameParts.back();
+
+            nameParts.pop_back();
+            interfaces[0].namespaces = nameParts;
+        }
+    }
+
+    if (checkForOption(options, "namespace"))
+    {
+        QStringList nameParts = QStringList::split("::", options["namespace"]);
+
+        QValueList<Class>::iterator it    = interfaces.begin();
+        QValueList<Class>::iterator endIt = interfaces.end();
+        for (; it != endIt; ++it)
+        {
+            (*it).namespaces = nameParts;
+        }
+    }
+
+    if (generateInterfaces || generateAll)
+    {
+        QTextStream headerStream;
+        QTextStream sourceStream;
+
+        QString baseName = options["interface"];
+        if (!baseName.isEmpty())
+        {
+            if (!ClassGenerator::initStreams(baseName, headerStream, sourceStream))
+            {
+                std::cerr << "dbusxml2qt3: proxy files, using base name '"
+                          << baseName.local8Bit().data()
+                          << "', could not be opened for writing"
+                          << std::endl;
+                exit(4);
+            }
+        }
+
+        QValueList<Class>::const_iterator it    = interfaces.begin();
+        QValueList<Class>::const_iterator endIt = interfaces.end();
+        for (; it != endIt; ++it)
+        {
+            if (baseName.isEmpty())
+            {
+                if (!ClassGenerator::initStreams((*it).name.lower() + "interface",
+                                                 headerStream, sourceStream))
+                {
+                    std::cerr << "dbusxml2qt3: interface files, using base name '"
+                            << baseName.local8Bit().data()
+                            << "', could not be opened for writing"
+                            << std::endl;
+                    exit(4);
+                }
+            }
+
+            ClassGenerator::generateInterface(*it, headerStream, sourceStream);
+
+            if (baseName.isEmpty())
+            {
+                ClassGenerator::finishStreams((*it).name.lower() + "interface",
+                                              headerStream, sourceStream);
+            }
+        }
+
+        if (!baseName.isEmpty())
+            ClassGenerator::finishStreams(baseName, headerStream, sourceStream);
+    }
+
+    if (generateProxies || generateAll)
+    {
+        QTextStream headerStream;
+        QTextStream sourceStream;
+
+        QString baseName = options["proxy"];
+        if (!baseName.isEmpty())
+        {
+            if (!ClassGenerator::initStreams(baseName, headerStream, sourceStream))
+            {
+                std::cerr << "dbusxml2qt3: proxy files, using base name '"
+                          << baseName.local8Bit().data()
+                          << "', could not be opened for writing"
+                          << std::endl;
+                exit(4);
+            }
+        }
+
+        QValueList<Class>::const_iterator it    = interfaces.begin();
+        QValueList<Class>::const_iterator endIt = interfaces.end();
+        for (; it != endIt; ++it)
+        {
+            if (baseName.isEmpty())
+            {
+                if (!ClassGenerator::initStreams((*it).name.lower() + "proxy",
+                                                 headerStream, sourceStream))
+                {
+                    std::cerr << "dbusxml2qt3: proxy files, using base name '"
+                            << baseName.local8Bit().data()
+                            << "', could not be opened for writing"
+                            << std::endl;
+                    exit(4);
+                }
+            }
+
+            ClassGenerator::generateProxy(*it, headerStream, sourceStream);
+
+            if (baseName.isEmpty())
+            {
+                ClassGenerator::finishStreams((*it).name.lower() + "proxy",
+                                              headerStream, sourceStream);
+            }
+        }
+
+        if (!baseName.isEmpty())
+            ClassGenerator::finishStreams(baseName, headerStream, sourceStream);
+    }
+
+    if (generateNode || generateAll)
     {
         if (!hasIntrospectable)
         {
@@ -133,10 +303,40 @@ int main(int argc, char** argv)
             method.arguments << argument;
             classData.methods << method;
 
-            ClassGenerator::generateInterface(classData);
+            QTextStream headerStream;
+            QTextStream sourceStream;
+
+            if (!ClassGenerator::initStreams(classData.name.lower() + "interface",
+                                             headerStream, sourceStream))
+            {
+                std::cerr << "dbusxml2qt3: interface files, using base name '"
+                        << classData.name.lower().local8Bit().data() << "interface"
+                        << "', could not be opened for writing"
+                        << std::endl;
+                exit(4);
+            }
+
+            ClassGenerator::generateInterface(classData,
+                                              headerStream, sourceStream);
+
+            ClassGenerator::finishStreams(classData.name.lower() + "interface",
+                                          headerStream, sourceStream);
         }
 
-        qDebug("Generating node %s", nodeClassName.local8Bit().data());
+        QString nodeClassName = options["classname"];
+        if (nodeClassName.isEmpty())
+        {
+            nodeClassName = rootElement.attribute("name");
+            if (nodeClassName.startsWith("/")) nodeClassName = nodeClassName.mid(1);
+            if (nodeClassName.isEmpty())
+            {
+                std::cerr << "dbusxml2qt3: cannot generate node without class name."
+                          << std::endl;
+                exit(3);
+            }
+
+            nodeClassName.replace('/', "_");
+        }
 
         QStringList nameParts = QStringList::split("::", nodeClassName);
 
@@ -146,10 +346,291 @@ int main(int argc, char** argv)
         nameParts.pop_back();
         classData.namespaces = nameParts;
 
-        ClassGenerator::generateNode(classData, interfaces);
+        if (checkForOption(options, "namespace"))
+        {
+            nameParts = QStringList::split("::", options["namespace"]);
+
+            classData.namespaces = nameParts;
+        }
+
+        QTextStream headerStream;
+        QTextStream sourceStream;
+
+        QString baseName = options["node"];
+        if (baseName.isEmpty()) baseName = classData.name.lower() + "node";
+
+        if (!ClassGenerator::initStreams(baseName, headerStream, sourceStream))
+        {
+            std::cerr << "dbusxml2qt3: interface files, using base name '"
+                      << baseName.local8Bit().data()
+                      << "', could not be opened for writing"
+                      << std::endl;
+            exit(4);
+        }
+
+        ClassGenerator::generateNode(classData, interfaces,
+                                     headerStream, sourceStream);
+
+        ClassGenerator::finishStreams(baseName, headerStream, sourceStream);
     }
 
     return 0;
 }
 
+void usage()
+{
+    std::cout << "usage: dbusxml2qt3 [options] <introspectionfile>" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "Options:" << std::endl;
+    std::cout << "-h, --help" << std::endl;
+    std::cout << "\tDisplay this help" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "-c <classname>, --class <classname>" << std::endl;
+    std::cout << "\tUse 'classname' instead of last string in interface name"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "-N [namespace], --namespace [namespace]" << std::endl;
+    std::cout << "\tOverride namespaces. If provided, use 'namespace' instead, otherwise ignore namespaces"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "-i [basename], --interface [basename]" << std::endl;
+    std::cout << "\tGenerate interface files. If provided, use 'basename' for filenames"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "-p [basename], --proxy [basename]" << std::endl;
+    std::cout << "\tGenerate proxy files. If provided, use 'basename' for filenames"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "-n [basename], --node [basename]" << std::endl;
+    std::cout << "\tGenerate node files. If provided, use 'basename' for filenames"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "Examples:" << std::endl;
+    std::cout << "dbusxml2qt3 myinterface.xml" << std::endl;
+    std::cout << "\tGenerates as much as possible, i.e. interfaces, proxies and, "
+              << "if a node name is specified in 'myinterface.xml', the node files"
+              << std::endl;
+    std::cout << "\tUses lowercased interface names as plus type specific suffix "
+              << "for the file names" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "dbusxml2qt3 myinterface.xml -N" << std::endl;
+    std::cout << "\tSame as first example but does not use namespaces"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "dbusxml2qt3 myinterface.xml -N org::myorg" << std::endl;
+    std::cout << "\tSame as first example but overrides namespaces with 'org::myorg'"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "dbusxml2qt3 myinterface.xml -n mynode -c MyNode" << std::endl;
+    std::cout << "\tGenerate only node files, use 'mynode' as the file basename "
+              << "and classname 'MyClass'"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "dbusxml2qt3 myinterface.xml -p" << std::endl;
+    std::cout << "\tGenerate only proxy files, use default file basename"
+              << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "dbusxml2qt3 myinterface.xml -p myproxy" << std::endl;
+    std::cout << "\tGenerate only proxy files, use 'myproxy' as the file basename"
+              << std::endl;
+    std::cout << std::endl;
+}
+
+bool testAndSetOption(OptionMap& options, const QString& option, const QString& value)
+{
+    OptionMap::iterator it = options.find(option);
+    if (it == options.end())
+    {
+        options.insert(option, value);
+        return true;
+    }
+
+    return false;
+}
+
+OptionMap parseOptions(int argc, char** argv)
+{
+    QStringList args;
+    for (int i = 1; i < argc; ++i)
+    {
+        args << QString::fromLocal8Bit(argv[i]);
+    }
+
+    OptionMap options;
+
+    while (!args.isEmpty())
+    {
+        QString arg = args.front();
+        args.pop_front();
+
+        if (arg.startsWith("-"))
+        {
+            if (arg.endsWith("help"))
+            {
+                usage();
+                exit(0);
+            }
+            else if (arg == "-p" || arg == "--proxy")
+            {
+                // test for optional argument
+                QString value;
+                if (!args.isEmpty() > 0 && !args[0].startsWith("-"))
+                {
+                    value = args.front();
+                    args.pop_front();
+                }
+
+                if (!testAndSetOption(options, "proxy", value))
+                {
+                    std::cerr << "Error while parsing command line argument '"
+                              << arg.local8Bit().data() << "'";
+
+                    if (!value.isEmpty())
+                        std::cerr << ", value '" << value.local8Bit().data() << "':";
+                    else
+                        std::cerr << ":";
+
+                    std::cerr << " already set to '"
+                              << options["proxy"].local8Bit().data() << std::endl;
+                }
+            }
+            else if (arg == "-i" || arg == "--interface")
+            {
+                // test for optional argument
+                QString value;
+                if (!args.isEmpty() > 0 && !args[0].startsWith("-"))
+                {
+                    value = args.front();
+                    args.pop_front();
+                }
+
+                if (!testAndSetOption(options, "interface", value))
+                {
+                    std::cerr << "Error while parsing command line argument '"
+                              << arg.local8Bit().data() << "'";
+
+                    if (!value.isEmpty())
+                        std::cerr << ", value '" << value.local8Bit().data() << "':";
+                    else
+                        std::cerr << ":";
+
+                    std::cerr << " already set to '"
+                              << options["interface"].local8Bit().data() << std::endl;
+                }
+            }
+            else if (arg == "-n" || arg == "--node")
+            {
+                // test for optional argument
+                QString value;
+                if (!args.isEmpty() > 0 && !args[0].startsWith("-"))
+                {
+                    value = args.front();
+                    args.pop_front();
+                }
+
+                if (!testAndSetOption(options, "node", value))
+                {
+                    std::cerr << "Error while parsing command line argument '"
+                              << arg.local8Bit().data() << "'";
+
+                    if (!value.isEmpty())
+                        std::cerr << ", value '" << value.local8Bit().data() << "':";
+                    else
+                        std::cerr << ":";
+
+                    std::cerr << " already set to '"
+                              << options["node"].local8Bit().data() << std::endl;
+                }
+            }
+            else if (arg == "-N" || arg == "--namespace")
+            {
+                // test for optional argument
+                QString value;
+                if (!args.isEmpty() > 0 && !args[0].startsWith("-"))
+                {
+                    value = args.front();
+                    args.pop_front();
+                }
+
+                if (!testAndSetOption(options, "namespace", value))
+                {
+                    std::cerr << "Error while parsing command line argument '"
+                              << arg.local8Bit().data() << "'";
+
+                    if (!value.isEmpty())
+                        std::cerr << ", value '" << value.local8Bit().data() << "':";
+                    else
+                        std::cerr << ":";
+
+                    std::cerr << " already set to '"
+                              << options["namespace"].local8Bit().data() << std::endl;
+                }
+            }
+            else if (arg == "-c" || arg == "--class")
+            {
+                // test for mandatory argument
+                if (args.isEmpty() || args[0].startsWith("-"))
+                {
+                    std::cerr << "Error while parsing command line argument '"
+                              << arg.local8Bit().data()
+                              << "': mandatory parameter missing" << std::endl;
+                    usage();
+                    exit(1);
+                }
+
+                QString value = args.front();
+                args.pop_front();
+
+                if (!testAndSetOption(options, "classname", value))
+                {
+                    std::cerr << "Error while parsing command line argument '"
+                              << arg.local8Bit().data() << "'";
+
+                    if (!value.isEmpty())
+                        std::cerr << ", value '" << value.local8Bit().data() << "':";
+                    else
+                        std::cerr << ":";
+
+                    std::cerr << " already set to '"
+                              << options["classname"].local8Bit().data() << std::endl;
+                }
+            }
+            else
+            {
+                std::cerr << "Error while parsing command line argument '"
+                          << arg.local8Bit().data()
+                          << "': unknown option" << std::endl;
+                usage();
+                exit(1);
+            }
+        }
+        else
+        {
+            if (!testAndSetOption(options, "filename", arg))
+            {
+                std::cerr << "Error while parsing command line argument '"
+                          << arg.local8Bit().data()
+                          << "': introspection file already given as '"
+                          << options["filename"].local8Bit().data() << std::endl;
+                usage();
+                exit(1);
+            }
+        }
+    }
+
+    return options;
+}
+
 // End of File
--- tools/dbusxml2qt3/methodgen.cpp
+++ tools/dbusxml2qt3/methodgen.cpp
@@ -156,6 +156,7 @@ static bool parseDBusSignature(const QSt
                     argument.forwardDeclarations += key.forwardDeclarations;
 
                     argument.sourceIncludes = key.sourceIncludes;
+                    argument.sourceIncludes["qdbus"].append("<dbus/qdbusdata.h>");
                     argument.sourceIncludes["qdbus"].append("<dbus/qdbusdatamap.h>");
                 }
                 else
@@ -173,6 +174,7 @@ static bool parseDBusSignature(const QSt
 
                     argument.sourceIncludes = key.sourceIncludes;
                     argument.sourceIncludes["Qt"].append("<qmap.h>");
+                    argument.sourceIncludes["qdbus"].append("<dbus/qdbusdata.h>");
                     argument.sourceIncludes["qdbus"].append("<dbus/qdbusdatamap.h>");
 
                     QMap<QString, QStringList>::const_iterator it =
@@ -196,6 +198,7 @@ static bool parseDBusSignature(const QSt
                 argument.forwardDeclarations += key.forwardDeclarations;
 
                 argument.sourceIncludes = key.sourceIncludes;
+                argument.sourceIncludes["qdbus"].append("<dbus/qdbusdata.h>");
                 argument.sourceIncludes["qdbus"].append("<dbus/qdbusdatamap.h>");
             }
         }
--- qdbusconnection_p.h
+++ qdbusconnection_p.h
@@ -53,8 +53,8 @@ class QSocketNotifier;
 class QTimer;
 class QTimerEvent;
 
-typedef struct DBusConnection;
-typedef struct DBusServer;
+struct DBusConnection;
+struct DBusServer;
 
 class QDBusConnectionPrivate: public QObject
 {
--- dbus-1-qt3.pc.in
+++ dbus-1-qt3.pc.in
@@ -5,7 +5,7 @@ includedir=${prefix}/include/dbus-1.0/qt
 
 Name: dbus-1-qt3
 Description: Qt3 D-BUS Bindings
-Version: 0.8
+Version: 0.8.1
 Requires: dbus-1 >= 0.90
 Libs: -L${libdir} -ldbus-1-qt3
 Cflags: -I${includedir}
--- Makefile.am
+++ Makefile.am
@@ -23,31 +23,31 @@ dbusinclude_HEADERS=	\
 #	dbus/qdbusserver.h
 
 libdbus_1_qt3_la_SOURCES =                   \
-	$(srcdir)/dbus/qdbusproxy.h      \
-	$(srcdir)/dbus/qdbusserver.h     \
-	$(srcdir)/qdbusconnection_p.h    \
-	$(srcdir)/qdbusconnection.cpp    \
-	$(srcdir)/qdbuserror.cpp         \
-	$(srcdir)/qdbusintegrator.cpp    \
-	$(srcdir)/qdbusmarshall.cpp      \
-	$(srcdir)/qdbusmessage.cpp       \
-	$(srcdir)/qdbusserver.cpp        \
-	$(srcdir)/qdbusproxy.cpp         \
-	$(srcdir)/qdbusdata.cpp          \
-	$(srcdir)/qdbusdatalist.cpp      \
-	$(srcdir)/qdbusobjectpath.cpp    \
-	$(srcdir)/qdbusdataconverter.cpp
-
-$(srcdir)/qdbusserver.cpp: qdbusserver.moc
-$(srcdir)/qdbusconnection.cpp: qdbusconnection.moc
-$(srcdir)/qdbusproxy.cpp: qdbusproxy.moc
+	dbus/qdbusproxy.h      \
+	dbus/qdbusserver.h     \
+	qdbusconnection_p.h    \
+	qdbusconnection.cpp    \
+	qdbuserror.cpp         \
+	qdbusintegrator.cpp    \
+	qdbusmarshall.cpp      \
+	qdbusmessage.cpp       \
+	qdbusserver.cpp        \
+	qdbusproxy.cpp         \
+	qdbusdata.cpp          \
+	qdbusdatalist.cpp      \
+	qdbusobjectpath.cpp    \
+	qdbusdataconverter.cpp
+
+qdbusserver.lo: qdbusserver.moc
+qdbusconnection.lo: qdbusconnection.moc
+qdbusproxy.lo: qdbusproxy.moc
 
 CLEANFILES = qdbusserver.moc qdbusconnection.moc qdbusproxy.moc
 
 DISTCLEANFILES = dbus-1-qt3.pc
 
 libdbus_1_qt3_la_LIBADD= $(LIB_QT) $(DBUS_LIBS)
-libdbus_1_qt3_la_LDFLAGS= $(QT_LDFLAGS) -version-info 8:0:8 -no-undefined
+libdbus_1_qt3_la_LDFLAGS= $(QT_LDFLAGS) -version-info 8:1:8 -no-undefined
 
 # files that are an exception
 qdbusserver.moc: dbus/qdbusserver.h
@@ -59,9 +59,6 @@ qdbusconnection.moc: qdbusconnection_p.h
 qdbusproxy.moc: dbus/qdbusproxy.h
 	$(MOC) -o qdbusproxy.moc $(srcdir)/dbus/qdbusproxy.h
 
-%.moc: %.h
-	$(MOC) $< > $@
-
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = dbus-1-qt3.pc
 


Index: dbus-qt3.spec
===================================================================
RCS file: /cvs/extras/rpms/dbus-qt3/devel/dbus-qt3.spec,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- dbus-qt3.spec	28 Jan 2008 15:58:33 -0000	1.2
+++ dbus-qt3.spec	5 Feb 2008 18:29:28 -0000	1.3
@@ -4,13 +4,14 @@
 Name:    dbus-qt3
 Summary: Qt3 DBus Bindings
 Version: 0.8
-Release: 2%{?dist}
+Release: 3%{?dist}
 
 License: GPLv2+
 Group:   System Environment/Libraries 
 Url:     http://www.freedesktop.org/wiki/Software/DBusBindings
 Source0: http://people.freedesktop.org/~krake/dbus-1-qt3/libdbus-1-qt3-%{version}.tar.gz 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Patch0:  BRANCH_UPDATE.diff
 
 BuildRequires: dbus-devel
 BuildRequires: qt-devel
@@ -85,6 +86,11 @@
 
 
 %changelog
+* Tue Feb 05 2008 Dennis Gilmore <dennis at ausil.us> 0.8-3
+- apply BRANCH_UPDATE.diff pulled from suse
+- patch needed because it changes the opttions to dbusxml2qt3 
+- knm  needs the new calls
+
 * Sun Jan 27 2008 Rex Dieter <rdieter at fedoraproject.org> 0.8-2
 - Provides: libdbus-1-qt3(-devel)
 - fix mixed tabs/spaces




More information about the fedora-extras-commits mailing list