src/dbus/qdbusintrospection.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtDBus module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qdbusintrospection_p.h"
       
    43 #include "qdbusxmlparser_p.h"
       
    44 
       
    45 QT_BEGIN_NAMESPACE
       
    46 
       
    47 /*!
       
    48     \class QDBusIntrospection
       
    49     \brief Information about introspected objects and interfaces on D-Bus.
       
    50     \internal
       
    51 
       
    52     This class provides structures and methods for parsing the XML introspection data for D-Bus.
       
    53     Normally, you don't have to use the methods provided here: QDBusInterface and QDBusObject will
       
    54     do that for you.
       
    55 
       
    56     But they may prove useful if the XML data was obtained through other means (like parsing a file).
       
    57 */
       
    58 
       
    59 /*!
       
    60     \class QDBusIntrospection::Argument
       
    61     \brief One argument to a D-Bus method or signal.
       
    62 
       
    63     This struct represents one argument passed to a method or received from a method or signal in
       
    64     D-Bus. The struct does not contain information on the direction (input or output).
       
    65 */
       
    66 
       
    67 /*!
       
    68     \variable QDBusIntrospection::Argument::type
       
    69     The argument type.
       
    70 */
       
    71 
       
    72 /*!
       
    73     \variable QDBusIntrospection::Argument::name
       
    74     The argument name. The argument name is optional, so this may be a null QString.
       
    75 */
       
    76 
       
    77 /*!
       
    78     \fn QDBusIntrospection::Argument::operator==(const Argument &other) const
       
    79     Compares this object against \a other and return true if they are the same.
       
    80 */
       
    81 
       
    82 /*!
       
    83     \class QDBusIntrospection::Method
       
    84     \brief Information about one method.
       
    85 
       
    86     This struct represents one method discovered through introspection. A method is composed of
       
    87     its \a name, its input arguments, its output arguments, and, optionally, annotations. There are no
       
    88     "in-out" arguments.
       
    89 */
       
    90 
       
    91 /*!
       
    92     \variable QDBusIntrospection::Method::name
       
    93     The method's name.
       
    94 */
       
    95 
       
    96 /*!
       
    97     \variable QDBusIntrospection::Method::inputArgs
       
    98     A list of the method's input arguments.
       
    99 */
       
   100 
       
   101 /*!
       
   102     \variable QDBusIntrospection::Method::outputArgs
       
   103     A list of the method's output arguments (i.e., return values).
       
   104 */
       
   105 
       
   106 /*!
       
   107     \variable QDBusIntrospection::Method::annotations
       
   108     The annotations associated with the method. Each annotation is a pair of strings, where the key
       
   109     is of the same format as a D-Bus interface name. The value is arbitrary.
       
   110 */
       
   111 
       
   112 /*!
       
   113     \fn QDBusIntrospection::Method::operator==(const Method &other) const
       
   114     Compares this object against \a other and return true if they are the same.
       
   115 */
       
   116 
       
   117 /*!
       
   118     \class QDBusIntrospection::Signal
       
   119     \brief Information about one signal.
       
   120 
       
   121     This struct represents one signal discovered through introspection. A signal is composed of
       
   122     its \a name, its output arguments, and, optionally, annotations.
       
   123 */
       
   124 
       
   125 /*!
       
   126     \variable QDBusIntrospection::Signal::name
       
   127     The signal's name.
       
   128 */
       
   129 
       
   130 /*!
       
   131     \variable QDBusIntrospection::Signal::outputArgs
       
   132     A list of the signal's arguments.
       
   133 */
       
   134 
       
   135 /*!
       
   136     \variable QDBusIntrospection::Signal::annotations
       
   137     The annotations associated with the signal. Each annotation is a pair of strings, where the key
       
   138     is of the same format as a D-Bus interface name. The value is arbitrary.
       
   139 */
       
   140 
       
   141 /*!
       
   142     \fn QDBusIntrospection::Signal::operator==(const Signal& other) const
       
   143     Compares this object against \a other and return true if they are the same.
       
   144 */
       
   145 
       
   146 /*!
       
   147     \class QDBusIntrospection::Property
       
   148     \brief Information about one property.
       
   149 
       
   150     This struct represents one property discovered through introspection. A property is composed of
       
   151     its \a name, its \a type, its \a access rights, and, optionally, annotations.
       
   152 */
       
   153 
       
   154 /*!
       
   155     \variable QDBusIntrospection::Property::name
       
   156     The property's name.
       
   157 */
       
   158 
       
   159 /*!
       
   160     \variable QDBusIntrospection::Property::type
       
   161     The property's type.
       
   162 */
       
   163 
       
   164 /*!
       
   165     \enum QDBusIntrospection::Property::Access
       
   166     The possible access rights for a property:
       
   167     \value Read
       
   168     \value Write
       
   169     \value ReadWrite
       
   170 */
       
   171 
       
   172 /*!
       
   173     \variable QDBusIntrospection::Property::access
       
   174     The property's access rights.
       
   175 */
       
   176 
       
   177 /*!
       
   178     \variable QDBusIntrospection::Property::annotations
       
   179     The annotations associated with the property. Each annotation is a pair of strings, where the key
       
   180     is of the same format as a D-Bus interface name. The value is arbitrary.
       
   181 */
       
   182 
       
   183 /*!
       
   184     \fn QDBusIntrospection::Property::operator==(const Property &other) const
       
   185     Compares this object against \a other and return true if they are the same.
       
   186 */
       
   187 
       
   188 /*!
       
   189     \class QDBusIntrospection::Interface
       
   190     \brief Information about one interface on the bus.
       
   191 
       
   192     Each interface on D-Bus has an unique \a name, identifying where that interface was defined.
       
   193     Interfaces may have annotations, methods, signals and properties, but none are mandatory.
       
   194 */
       
   195 
       
   196 /*!
       
   197     \variable QDBusIntrospection::Interface::name
       
   198     The interface's name.
       
   199 */
       
   200 
       
   201 /*!
       
   202     \variable QDBusIntrospection::Interface::introspection
       
   203     The XML document fragment describing this interface.
       
   204 
       
   205     If parsed again through parseInterface, the object returned should have the same contents as
       
   206     this object.
       
   207 */
       
   208 
       
   209 /*!
       
   210     \variable QDBusIntrospection::Interface::annotations
       
   211     The annotations associated with the interface. Each annotation is a pair of strings, where the key
       
   212     is of the same format as a D-Bus interface name. The value is arbitrary.
       
   213 */
       
   214 
       
   215 /*!
       
   216     \variable QDBusIntrospection::Interface::methods
       
   217     The methods available in this interface. Note that method names are not unique (i.e., methods
       
   218     can be overloaded with multiple arguments types).
       
   219 */
       
   220 
       
   221 /*!
       
   222     \variable QDBusIntrospection::Interface::signals_
       
   223     The signals available in this interface. Note that signal names are not unique (i.e., signals
       
   224     can be overloaded with multiple argument types).
       
   225 
       
   226     This member is called "signals_" because "signals" is a reserved keyword in Qt.
       
   227 */
       
   228 
       
   229 /*!
       
   230     \variable QDBusIntrospection::Interface::properties
       
   231     The properties available in this interface. Property names are unique.
       
   232 */
       
   233 
       
   234 /*!
       
   235     \fn QDBusIntrospection::Interface::operator==(const Interface &other) const
       
   236     Compares this object against \a other and return true if they are the same.
       
   237 
       
   238     Note that two interfaces are considered to be the same if they have the same name. The internal
       
   239     structures in the objects are not compared.
       
   240 */
       
   241 
       
   242 /*!
       
   243     \class QDBusIntrospection::Object
       
   244     \brief Information about one object on the bus.
       
   245 
       
   246     An object on the D-Bus bus is represented by its service and path on the service but, unlike
       
   247     interfaces, objects are mutable. That is, their contents can change with time. Therefore,
       
   248     while the (service, path) pair uniquely identifies an object, the information contained in
       
   249     this struct may no longer represent the object.
       
   250 
       
   251     An object can contain interfaces and child (sub) objects.
       
   252 */
       
   253 
       
   254 /*!
       
   255     \variable QDBusIntrospection::Object::service
       
   256     The object's service name.
       
   257 
       
   258     \sa parseObject(), parseObjectTree()
       
   259 */
       
   260 
       
   261 /*!
       
   262     \variable QDBusIntrospection::Object::path
       
   263     The object's path on the service. This is an absolute path.
       
   264 
       
   265     \sa parseObject(), parseObjectTree()
       
   266 */
       
   267 
       
   268 /*!
       
   269     \variable QDBusIntrospection::Object::introspection
       
   270     The XML document fragment describing this object, its interfaces and sub-objects at the time
       
   271     of the parsing.
       
   272 
       
   273     The result of parseObject with this XML data should be the same as the Object struct.
       
   274 */
       
   275 
       
   276 /*!
       
   277     \variable QDBusIntrospection::Object::interfaces
       
   278     The list of interface names in this object.
       
   279 */
       
   280 
       
   281 /*!
       
   282     \variable QDBusIntrospection::Object::childObjects
       
   283     The list of child object names in this object. Note that this is a relative name, not an
       
   284     absolute path. To obtain the absolute path, concatenate with \l
       
   285     {QDBusIntrospection::Object::path}{path}.
       
   286 */
       
   287 
       
   288 /*!
       
   289     \class QDBusIntrospection::ObjectTree
       
   290     \brief Complete information about one object node and its descendency.
       
   291     
       
   292     This struct contains the same data as QDBusIntrospection::Object, plus the actual data for the
       
   293     interfaces and child (sub) objects that was available in the XML document.
       
   294 */
       
   295 
       
   296 /*!
       
   297     \variable QDBusIntrospection::ObjectTree::interfaceData
       
   298     A map of interfaces and their names.
       
   299 */
       
   300 
       
   301 /*!
       
   302     \variable QDBusIntrospection::ObjectTree::childObjectData
       
   303     A map of object paths and their data. The map key contains the relative path to the object.
       
   304 
       
   305     Note this map contains only the child notes that do have information about the sub-object's
       
   306     contents. If the XML data did not contain the information, only the object name will be listed
       
   307     in childObjects, but not in childObjectData.
       
   308 */
       
   309 
       
   310 /*!
       
   311     \typedef QDBusIntrospection::Annotations
       
   312     Contains a QMap of an annotation pair. The annotation's name is stored in the QMap key and
       
   313     must be unique. The annotation's value is stored in the QMap's value and is arbitrary.
       
   314 */
       
   315 
       
   316 /*!
       
   317     \typedef QDBusIntrospection::Arguments
       
   318     Contains a list of arguments to either a Method or a Signal. The arguments' order is important.
       
   319 */
       
   320 
       
   321 /*!
       
   322     \typedef QDBusIntrospection::Methods
       
   323     Contains a QMap of methods and their names. The method's name is stored in the map's key and
       
   324     is not necessarily unique. The order in which multiple methods with the same name are stored
       
   325     in this map is undefined.
       
   326 */
       
   327 
       
   328 /*!
       
   329     \typedef QDBusIntrospection::Signals
       
   330     Contains a QMap of signals and their names. The signal's name is stored in the map's key and
       
   331     is not necessarily unique. The order in which multiple signals with the same name are stored
       
   332     in this map is undefined.
       
   333 */
       
   334 
       
   335 /*!
       
   336     \typedef QDBusIntrospection::Properties
       
   337     Contains a QMap of properties and their names. Each property must have a unique name.
       
   338 */
       
   339 
       
   340 /*!
       
   341     \typedef QDBusIntrospection::Interfaces
       
   342     Contains a QMap of interfaces and their names. Each interface has a unique name.
       
   343 */
       
   344 
       
   345 /*!
       
   346     \typedef QDBusIntrospection::Objects
       
   347     Contains a QMap of objects and their paths relative to their immediate parent.
       
   348 
       
   349     \sa parseObjectTree()
       
   350 */
       
   351 
       
   352 /*!
       
   353     Parses the XML document fragment (given by \a xml) containing one interface.
       
   354 
       
   355     The first element tag in this XML data must be either \<node\> or \<interface\>. If it is
       
   356     \<node\>, then the \<interface\> tag must be a child tag of the \<node\> one.
       
   357 
       
   358     If there are multiple interfaces in this XML data, it is undefined which one will be
       
   359     returned.
       
   360 */
       
   361 QDBusIntrospection::Interface
       
   362 QDBusIntrospection::parseInterface(const QString &xml)
       
   363 {
       
   364     // be lazy
       
   365     Interfaces ifs = parseInterfaces(xml);
       
   366     if (ifs.isEmpty())
       
   367         return Interface();
       
   368 
       
   369     // return the first in map order (probably alphabetical order)
       
   370     return *ifs.constBegin().value();
       
   371 }
       
   372 
       
   373 /*!
       
   374     Parses the XML document fragment (given by \a xml) containing several interfaces.
       
   375 
       
   376     If the first element tag in this document fragment is \<node\>, the interfaces parsed will
       
   377     be those found as child elements of the \<node\> tag.
       
   378 */
       
   379 QDBusIntrospection::Interfaces
       
   380 QDBusIntrospection::parseInterfaces(const QString &xml)
       
   381 {
       
   382     QString null;
       
   383     QDBusXmlParser parser(null, null, xml);
       
   384     return parser.interfaces();
       
   385 }
       
   386 
       
   387 /*!
       
   388     Parses the XML document fragment (given by \a xml) containing one object, found at the service
       
   389     \a service and path \a path.
       
   390 
       
   391     The first element tag in this document must be \<node\>. If that tag does not contain
       
   392     a name attribute, the \a path argument will be used to determine the path of this
       
   393     object node.
       
   394 
       
   395     This function does not parse the interfaces contained in the node, nor sub-object's contents.
       
   396     It will only list their names. If you need to know their contents, use parseObjectTree.
       
   397 */
       
   398 QDBusIntrospection::Object
       
   399 QDBusIntrospection::parseObject(const QString &xml, const QString &service, const QString &path)
       
   400 {
       
   401     QDBusXmlParser parser(service, path, xml);
       
   402     QSharedDataPointer<QDBusIntrospection::Object> retval = parser.object();
       
   403     if (!retval)
       
   404         return QDBusIntrospection::Object();
       
   405     return *retval;
       
   406 }
       
   407 
       
   408 /*!
       
   409     Parses the XML document fragment (given by \a xml) containing one object node and returns all
       
   410     the information about the interfaces and sub-objects, found at the service \a service and path
       
   411     \a path.
       
   412 
       
   413     The Objects map returned will contain the absolute path names in the key.
       
   414 */
       
   415 QDBusIntrospection::ObjectTree
       
   416 QDBusIntrospection::parseObjectTree(const QString &xml, const QString &service, const QString &path)
       
   417 {
       
   418     QDBusXmlParser parser(service, path, xml);
       
   419     QSharedDataPointer<QDBusIntrospection::ObjectTree> retval = parser.objectTree();
       
   420     if (!retval)
       
   421         return QDBusIntrospection::ObjectTree();
       
   422     return *retval;
       
   423 }
       
   424 
       
   425 QT_END_NAMESPACE