The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/iokit/IOKit/IORegistryEntry.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
    3  *
    4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
    5  * 
    6  * This file contains Original Code and/or Modifications of Original Code
    7  * as defined in and that are subject to the Apple Public Source License
    8  * Version 2.0 (the 'License'). You may not use this file except in
    9  * compliance with the License. The rights granted to you under the License
   10  * may not be used to create, or enable the creation or redistribution of,
   11  * unlawful or unlicensed copies of an Apple operating system, or to
   12  * circumvent, violate, or enable the circumvention or violation of, any
   13  * terms of an Apple operating system software license agreement.
   14  * 
   15  * Please obtain a copy of the License at
   16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
   17  * 
   18  * The Original Code and all software distributed under the License are
   19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   23  * Please see the License for the specific language governing rights and
   24  * limitations under the License.
   25  * 
   26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
   27  */
   28 /*
   29  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved. 
   30  *
   31  * HISTORY
   32  *
   33  */
   34 
   35 
   36 #ifndef _IOKIT_IOREGISTRYENTRY_H
   37 #define _IOKIT_IOREGISTRYENTRY_H
   38 
   39 #include <IOKit/IOTypes.h>
   40 #include <libkern/c++/OSContainers.h>
   41 
   42 
   43 extern const OSSymbol * gIONameKey;
   44 extern const OSSymbol * gIOLocationKey;
   45 extern const OSSymbol * gIORegistryEntryIDKey;
   46 
   47 class IORegistryEntry;
   48 class IORegistryPlane;
   49 class IORegistryIterator;
   50 
   51 typedef void (*IORegistryEntryApplierFunction)(IORegistryEntry * entry,
   52                                                void * context);
   53 
   54 enum {
   55     kIORegistryIterateRecursively       = 0x00000001,
   56     kIORegistryIterateParents           = 0x00000002
   57 };
   58 
   59 /*! @class IORegistryEntry : public OSObject
   60     @abstract The base class for all objects in the registry.
   61     @discussion The IORegistryEntry base class provides functions for describing graphs of connected registry entries, each with a dictionary-based property table. Entries may be connected in different planes, with differing topologies. Access to the registry is protected against multiple threads. Inside the kernel planes are specified with plane objects and are published by the creator - IOService exports the gIOServicePlane plane object for example. Non kernel clients specify planes by their name.
   62 */
   63 
   64 class IORegistryEntry : public OSObject
   65 {
   66     friend class IORegistryIterator;
   67 
   68     OSDeclareDefaultStructors(IORegistryEntry)
   69 
   70 protected:
   71 /*! @struct ExpansionData
   72     @discussion This structure will be used to expand the capablilties of this class in the future.
   73     */    
   74     struct ExpansionData
   75     {
   76         uint64_t        fRegistryEntryID;
   77     };
   78 
   79 /*! @var reserved
   80     Reserved for future use.  (Internal use only)  */
   81     ExpansionData * reserved;
   82 
   83 private:
   84 
   85     OSDictionary *      fRegistryTable;
   86     OSDictionary *      fPropertyTable;
   87 
   88 public:
   89     /* methods available in Mac OS X 10.1 or later */
   90 
   91 /*! @function copyProperty
   92     @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. Available in Mac OS X 10.1 or later.
   93     @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s).
   94     @param aKey The property's name as a C-string.
   95     @param plane The plane to iterate over, eg. gIOServicePlane.
   96     @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children.
   97     @result The property value found, or zero. A reference on any found property is returned to caller, which should be released. */
   98 
   99     virtual OSObject * copyProperty( const char *           aKey,
  100                                      const IORegistryPlane * plane,
  101                                      IOOptionBits            options =
  102                                         kIORegistryIterateRecursively |
  103                                         kIORegistryIterateParents) const;
  104 
  105 /*! @function copyProperty
  106     @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. Available in Mac OS X 10.1 or later.
  107     @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s).
  108     @param aKey The property's name as an OSString.
  109     @param plane The plane to iterate over, eg. gIOServicePlane.
  110     @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children.
  111     @result The property value found, or zero. A reference on any found property is returned to caller, which should be released. */
  112 
  113     virtual OSObject * copyProperty( const OSString *        aKey,
  114                                      const IORegistryPlane * plane,
  115                                      IOOptionBits            options =
  116                                         kIORegistryIterateRecursively |
  117                                         kIORegistryIterateParents) const;
  118 
  119 /*! @function copyProperty
  120     @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy. Available in Mac OS X 10.1 or later.
  121     @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s).
  122     @param aKey The property's name as an OSSymbol.
  123     @param plane The plane to iterate over, eg. gIOServicePlane.
  124     @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children.
  125     @result The property value found, or zero. A reference on any found property is returned to caller, which should be released. */
  126 
  127     virtual OSObject * copyProperty( const OSSymbol *        aKey,
  128                                      const IORegistryPlane * plane,
  129                                      IOOptionBits            options =
  130                                         kIORegistryIterateRecursively |
  131                                         kIORegistryIterateParents) const;
  132 
  133 /*! @function copyParentEntry
  134     @abstract Returns an registry entry's first parent entry in a plane. Available in Mac OS X 10.1 or later.
  135     @discussion This function will return the parent to which a registry entry was first attached. Since the majority of registry entrys have only one provider, this is a useful simplification.
  136     @param plane The plane object.
  137     @result Returns the first parent of the registry entry, or zero if the entry is not attached into the registry in that plane. A reference on the entry is returned to caller, which should be released. */
  138 
  139     virtual IORegistryEntry * copyParentEntry( const IORegistryPlane * plane ) const;
  140 
  141 /*! @function copyChildEntry
  142     @abstract Returns an registry entry's first child entry in a plane. Available in Mac OS X 10.1 or later.
  143     @discussion This function will return the child which first attached to a registry entry.
  144     @param plane The plane object.
  145     @result Returns the first child of the registry entry, or zero if the entry is not attached into the registry in that plane. A reference on the entry is returned to caller, which should be released. */
  146 
  147     virtual IORegistryEntry * copyChildEntry( const IORegistryPlane * plane ) const;
  148 
  149     /* method available in Mac OS X 10.4 or later */
  150 /*!
  151     @typedef Action
  152     @discussion Type and arguments of callout C function that is used when
  153 a runCommand is executed by a client.  Cast to this type when you want a C++
  154 member function to be used.  Note the arg1 - arg3 parameters are passed straight pass through to the action callout.
  155     @param target
  156         Target of the function, can be used as a refcon.  Note if a C++ function
  157 was specified, this parameter is implicitly the first parameter in the target
  158 member function's parameter list.
  159     @param arg0 Argument to action from run operation.
  160     @param arg1 Argument to action from run operation.
  161     @param arg2 Argument to action from run operation.
  162     @param arg3 Argument to action from run operation.
  163 */
  164     typedef IOReturn (*Action)(OSObject *target,
  165                                void *arg0, void *arg1,
  166                                void *arg2, void *arg3);
  167 
  168 /*! @function runPropertyAction
  169     @abstract Single thread a call to an action w.r.t. the property lock
  170     @discussion Client function that causes the given action to be called in a manner that syncrhonises with the registry iterators and serialisers.  This functin can be used to synchronously manipulate the property table of this nub
  171     @param action Pointer to function to be executed in work-loop context.
  172     @param arg0 Parameter for action parameter, defaults to 0.
  173     @param arg1 Parameter for action parameter, defaults to 0.
  174     @param arg2 Parameter for action parameter, defaults to 0.
  175     @param arg3 Parameter for action parameter, defaults to 0.
  176     @result Returns the value of the Action callout.
  177 */
  178     virtual IOReturn runPropertyAction(Action action, OSObject *target,
  179                                void *arg0 = 0, void *arg1 = 0,
  180                                void *arg2 = 0, void *arg3 = 0);
  181 
  182 private:
  183 #if __LP64__
  184     OSMetaClassDeclareReservedUnused(IORegistryEntry, 0);
  185     OSMetaClassDeclareReservedUnused(IORegistryEntry, 1);
  186     OSMetaClassDeclareReservedUnused(IORegistryEntry, 2);
  187     OSMetaClassDeclareReservedUnused(IORegistryEntry, 3);
  188     OSMetaClassDeclareReservedUnused(IORegistryEntry, 4);
  189     OSMetaClassDeclareReservedUnused(IORegistryEntry, 5);
  190 #else
  191     OSMetaClassDeclareReservedUsed(IORegistryEntry, 0);
  192     OSMetaClassDeclareReservedUsed(IORegistryEntry, 1);
  193     OSMetaClassDeclareReservedUsed(IORegistryEntry, 2);
  194     OSMetaClassDeclareReservedUsed(IORegistryEntry, 3);
  195     OSMetaClassDeclareReservedUsed(IORegistryEntry, 4);
  196     OSMetaClassDeclareReservedUsed(IORegistryEntry, 5);
  197 #endif
  198     OSMetaClassDeclareReservedUnused(IORegistryEntry, 6);
  199     OSMetaClassDeclareReservedUnused(IORegistryEntry, 7);
  200     OSMetaClassDeclareReservedUnused(IORegistryEntry, 8);
  201     OSMetaClassDeclareReservedUnused(IORegistryEntry, 9);
  202     OSMetaClassDeclareReservedUnused(IORegistryEntry, 10);
  203     OSMetaClassDeclareReservedUnused(IORegistryEntry, 11);
  204     OSMetaClassDeclareReservedUnused(IORegistryEntry, 12);
  205     OSMetaClassDeclareReservedUnused(IORegistryEntry, 13);
  206     OSMetaClassDeclareReservedUnused(IORegistryEntry, 14);
  207     OSMetaClassDeclareReservedUnused(IORegistryEntry, 15);
  208     OSMetaClassDeclareReservedUnused(IORegistryEntry, 16);
  209     OSMetaClassDeclareReservedUnused(IORegistryEntry, 17);
  210     OSMetaClassDeclareReservedUnused(IORegistryEntry, 18);
  211     OSMetaClassDeclareReservedUnused(IORegistryEntry, 19);
  212     OSMetaClassDeclareReservedUnused(IORegistryEntry, 20);
  213     OSMetaClassDeclareReservedUnused(IORegistryEntry, 21);
  214     OSMetaClassDeclareReservedUnused(IORegistryEntry, 22);
  215     OSMetaClassDeclareReservedUnused(IORegistryEntry, 23);
  216     OSMetaClassDeclareReservedUnused(IORegistryEntry, 24);
  217     OSMetaClassDeclareReservedUnused(IORegistryEntry, 25);
  218     OSMetaClassDeclareReservedUnused(IORegistryEntry, 26);
  219     OSMetaClassDeclareReservedUnused(IORegistryEntry, 27);
  220     OSMetaClassDeclareReservedUnused(IORegistryEntry, 28);
  221     OSMetaClassDeclareReservedUnused(IORegistryEntry, 29);
  222     OSMetaClassDeclareReservedUnused(IORegistryEntry, 30);
  223     OSMetaClassDeclareReservedUnused(IORegistryEntry, 31);
  224 
  225 public:
  226 
  227     /* Registry accessors */
  228 
  229 /*! @function getRegistryRoot
  230     @abstract Returns a pointer to the root instance of the registry.
  231     @discussion This method provides an accessor to the root of the registry for the machine. The root may be passed to a registry iterator when iterating a plane, and contains properties that describe the available planes, and diagnostic information for IOKit. Keys for these properties are in IOKitKeys.h.
  232     @result A pointer to the IORegistryEntry root instance. It should not be released by the caller. */
  233 
  234     static IORegistryEntry * getRegistryRoot( void );
  235     
  236 /*! @function getGenerationCount
  237     @abstract Returns an generation count for all registry changing operations.
  238     @discussion This method provides an accessor to the current generation count (or seed) of the registry which changes when any topology change occurs in the registry - this does not include property table changes. It may be used to invalidate any caching of the results from IORegistryEntry methods.
  239     @result An integer generation count. */
  240 
  241     static SInt32            getGenerationCount( void );
  242 
  243 /*! @function getPlane
  244     @abstract Looks up the plane object by a C-string name.
  245     @discussion Planes are usually provided as globals by the creator, eg. gIOServicePlane, gIODeviceTreePlane, or gIOAudioPlane, however they may also be looked up by name with this method.
  246     @result A pointer to the plane object, or zero if no such plane exists. The returned plane should not be released. */
  247 
  248     static const IORegistryPlane * getPlane( const char * name );
  249 
  250     /* Registry Entry allocation & init */
  251 
  252 /*! @function init
  253     @abstract Standard init method for all IORegistryEntry subclasses.
  254     @discussion A registry entry must be initialized with this method before it can be used. A property dictionary may passed and will be retained by this method for use as the registry entry's property table, or an empty one will be created.
  255     @param A dictionary that will become the registry entry's property table (retaining it), or zero which will cause an empty property table to be created.
  256     @result true on success, or false on a resource failure. */
  257 
  258     virtual bool init( OSDictionary * dictionary = 0 );
  259 
  260 /*! @function free
  261     @abstract Standard free method for all IORegistryEntry subclasses.
  262     @discussion This method will release any resources of the entry, in particular its property table. Note that the registry entry must always be detached from the registry before free may be called, and subclasses (namely IOService) will have additional protocols for removing registry entries. free should never need be called directly. */
  263 
  264     virtual void free( void );
  265 
  266 /*! @function setPropertyTable
  267     @abstract Replace a registry entry's property table.
  268     @discussion This method will release the current property table of a the entry and replace it with another, retaining the new property table.
  269     @param dict The new dictionary to be used as the entry's property table. */
  270 
  271     virtual void setPropertyTable( OSDictionary * dict );
  272 
  273     /* Synchronized property accessors; wrappers to OSDictionary
  274      * plus property creation helpers */
  275 
  276 /*! @function setProperty
  277     @abstract Synchronized method to add a property to a registry entry's property table.
  278     @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  279     @param aKey The properties name as an OSSymbol.
  280     @param anObject The property value.
  281     @result true on success or false on a resource failure. */
  282 
  283     virtual bool setProperty(const OSSymbol * aKey, OSObject * anObject);
  284 
  285 /*! @function setProperty
  286     @abstract Synchronized method to add a property to a registry entry's property table.
  287     @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  288     @param aKey The property's name as an OSString.
  289     @param anObject The property value.
  290     @result true on success or false on a resource failure. */
  291 
  292     virtual bool setProperty(const OSString * aKey, OSObject * anObject);
  293 
  294 /*! @function setProperty
  295     @abstract Synchronized method to add a property to a registry entry's property table.
  296     @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  297     @param aKey The property's name as a C-string.
  298     @param anObject The property value.
  299     @result true on success or false on a resource failure. */
  300 
  301     virtual bool setProperty(const char * aKey, OSObject * anObject);
  302 
  303 /*! @function setProperty
  304     @abstract Synchronized method to construct and add a OSString property to a registry entry's property table.
  305     @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSString from the supplied C-string, set in the property table with the given name, and released.
  306     @param aKey The property's name as a C-string.
  307     @param aString The property value as a C-string.
  308     @result true on success or false on a resource failure. */
  309 
  310     virtual bool setProperty(const char * aKey, const char * aString);
  311 
  312 /*! @function setProperty
  313     @abstract Synchronized method to construct and add an OSBoolean property to a registry entry's property table.
  314     @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSBoolean from the supplied value, set in the property table with the given name, and released.
  315     @param aKey The property's name as a C-string.
  316     @param aBoolean The property's boolean value.
  317     @result true on success or false on a resource failure. */
  318 
  319     virtual bool setProperty(const char * aKey, bool aBoolean);
  320 
  321 /*! @function setProperty
  322     @abstract Synchronized method to construct and add an OSNumber property to a registry entry's property table.
  323     @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSNumber from the supplied value and size, set in the property table with the given name, and released.
  324     @param aKey The property's name as a C-string.
  325     @param aValue The property's numeric value.
  326     @param aNumberOfBits The property's size in bits, for OSNumber.
  327     @result true on success or false on a resource failure. */
  328 
  329     virtual bool setProperty( const char *       aKey,
  330                               unsigned long long aValue,
  331                               unsigned int       aNumberOfBits);
  332 
  333 /*! @function setProperty
  334     @abstract Synchronized method to construct and add an OSData property to a registry entry's property table.
  335     @discussion This method will add or replace a property in a registry entry's property table, using the OSDictionary::setObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table. The property is created as an OSData copied from the supplied data and length, set in the property table with the given name, and released.
  336     @param aKey The property's name as a C-string.
  337     @param bytes The property's value as a pointer. OSData will copy this data.
  338     @param length The property's size in bytes, for OSData.
  339     @result true on success or false on a resource failure. */
  340 
  341     virtual bool setProperty( const char *       aKey,
  342                               void *             bytes,
  343                               unsigned int       length);
  344 
  345 /*! @function removeProperty
  346     @abstract Synchronized method to remove a property from a registry entry's property table.
  347     @discussion This method will remove a property from a registry entry's property table, using the OSDictionary::removeObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  348     @param aKey The property's name as an OSSymbol. */
  349 
  350     virtual void removeProperty( const OSSymbol * aKey);
  351 
  352 /*! @function removeProperty
  353     @abstract Synchronized method to remove a property from a registry entry's property table.
  354     @discussion This method will remove a property from a registry entry's property table, using the OSDictionary::removeObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  355     @param aKey The property's name as an OSString. */
  356 
  357     virtual void removeProperty( const OSString * aKey);
  358 
  359 /*! @function removeProperty
  360     @abstract Synchronized method to remove a property from a registry entry's property table.
  361     @discussion This method will remove a property from a registry entry's property table, using the OSDictionary::removeObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  362     @param aKey The property's name as a C-string. */
  363 
  364     virtual void removeProperty( const char * aKey);
  365 
  366 /*! @function getProperty
  367     @abstract Synchronized method to obtain a property from a registry entry's property table.
  368     @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  369     @param aKey The property's name as an OSSymbol.
  370     @result The property value found, or zero. */
  371 
  372     virtual OSObject * getProperty( const OSSymbol * aKey) const;
  373 
  374 /*! @function getProperty
  375     @abstract Synchronized method to obtain a property from a registry entry's property table.
  376     @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  377     @param aKey The property's name as an OSString.
  378     @result The property value found, or zero. */
  379 
  380     virtual OSObject * getProperty( const OSString * aKey) const;
  381 
  382 /*! @function getProperty
  383     @abstract Synchronized method to obtain a property from a registry entry's property table.
  384     @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics. This method is synchronized with other IORegistryEntry accesses to the property table.
  385     @param aKey The property's name as a C-string.
  386     @result The property value found, or zero. */
  387 
  388     virtual OSObject * getProperty( const char * aKey) const;
  389 
  390 /*! @function getProperty
  391     @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy.
  392     @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s).
  393     @param aKey The property's name as an OSSymbol.
  394     @param plane The plane to iterate over, eg. gIOServicePlane.
  395     @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children.
  396     @result The property value found, or zero. */
  397 
  398     virtual OSObject * getProperty( const OSSymbol *        aKey,
  399                                     const IORegistryPlane * plane,
  400                                     IOOptionBits            options =
  401                                         kIORegistryIterateRecursively |
  402                                         kIORegistryIterateParents) const;
  403 
  404 /*! @function getProperty
  405     @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy.
  406     @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s).
  407     @param aKey The property's name as an OSString.
  408     @param plane The plane to iterate over, eg. gIOServicePlane.
  409     @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children.
  410     @result The property value found, or zero. */
  411 
  412     virtual OSObject * getProperty( const OSString *        aKey,
  413                                     const IORegistryPlane * plane,
  414                                     IOOptionBits            options =
  415                                         kIORegistryIterateRecursively |
  416                                         kIORegistryIterateParents) const;
  417 
  418 /*! @function getProperty
  419     @abstract Synchronized method to obtain a property from a registry entry or one of its parents (or children) in the hierarchy.
  420     @discussion This method will search for a property, starting first with this registry entry's property table, then iterating recusively through either the parent registry entries or the child registry entries of this entry. Once the first occurrence is found, it will lookup and return the value of the property, using the OSDictionary::getObject semantics. The iteration keeps track of entries that have been recursed into previously to avoid loops. This method is synchronized with other IORegistryEntry accesses to the property table(s).
  421     @param aKey The property's name as a C-string.
  422     @param plane The plane to iterate over, eg. gIOServicePlane.
  423     @param options kIORegistryIterateRecursively may be set to recurse automatically into the registry hierarchy. Without this option, this method degenerates into the standard getProperty() call. kIORegistryIterateParents may be set to iterate the parents of the entry, in place of the children.
  424     @result The property value found, or zero. */
  425 
  426     virtual OSObject * getProperty( const char *            aKey,
  427                                     const IORegistryPlane * plane,
  428                                     IOOptionBits            options =
  429                                         kIORegistryIterateRecursively |
  430                                         kIORegistryIterateParents) const;
  431 
  432 /*! @function copyProperty
  433     @abstract Synchronized method to obtain a property from a registry entry's property table.
  434     @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics, and return a reference to the caller. This method is synchronized with other IORegistryEntry accesses to the property table.
  435     @param aKey The property's name as an OSSymbol.
  436     @result The property value found, or zero. It should be released by the caller. */
  437 
  438     virtual OSObject * copyProperty( const OSSymbol * aKey) const;
  439 
  440 /*! @function copyProperty
  441     @abstract Synchronized method to obtain a property from a registry entry's property table.
  442     @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics, and return a reference to the caller. This method is synchronized with other IORegistryEntry accesses to the property table.
  443     @param aKey The property's name as an OSString.
  444     @result The property value found, or zero. It should be released by the caller. */
  445 
  446     virtual OSObject * copyProperty( const OSString * aKey) const;
  447 
  448 /*! @function copyProperty
  449     @abstract Synchronized method to obtain a property from a registry entry's property table.
  450     @discussion This method will lookup a property in a registry entry's property table, using the OSDictionary::getObject semantics, and return a reference to the caller. This method is synchronized with other IORegistryEntry accesses to the property table.
  451     @param aKey The property's name as a C-string.
  452     @result The property value found, or zero. It should be released by the caller. */
  453 
  454     virtual OSObject * copyProperty( const char * aKey) const;
  455 
  456 /*! @function dictionaryWithProperties
  457     @abstract Synchronized method to obtain copy a registry entry's property table.
  458     @discussion This method will copy a registry entry's property table, using the OSDictionary::withDictionary semantics. This method is synchronized with other IORegistryEntry accesses to the property table. Since OSDictionary will only copy property values by reference, synchronization is not guaranteed to any collection values.
  459     @result The created dictionary, or zero on a resource value. It should be released by the caller. */
  460 
  461     virtual OSDictionary * dictionaryWithProperties( void ) const;
  462 
  463 /*! @function serializeProperties
  464     @abstract Synchronized method to serialize a registry entry's property table.
  465     @discussion This method will serialize a registry entry's property table, using the OSDictionary::serialize semantics. This method is synchronized with other IORegistryEntry accesses to the property table. Many non-kernel clients of IOKit read information from the registry via properties, and will invoke this method in a registry entry to create a serialization of all the entry's properties, which is then reconstructed in the client's task as a CFDictionary. This method may be intercepted by subclasses to update their properties or implement a different serialization method, though it is usually better to implement such functionality by creating objects in the property table and implementing their serialize methods, avoiding any need to implement serializeProperties.
  466     @param serialize The OSSerialize instance representing the serialization request.
  467     @result True on success, false otherwise. */
  468 
  469     virtual bool serializeProperties( OSSerialize * serialize ) const;
  470 
  471     /* Unsynchronized(!) property table access */
  472 
  473 /*! @function getPropertyTable
  474     @abstract Unsynchronized accessor to a registry entry's property table.
  475     @discussion This method will return a pointer to the live property table as an OSDictionery. Its use is not recommended in most cases, instead use the synchronized accessors and helper functions of IORegistryEntry to access properties. It can only safely be used by one thread, which usually means it can only be used before a registry entry is entered into the registry.
  476     @result A pointer to the property table as an OSDictionary. The pointer is valid while the registry entry is retained, and should not be released by the caller. */
  477 
  478     /* inline */ OSDictionary * getPropertyTable( void ) const;
  479             /* { return(fPropertyTable); } */
  480 
  481     /* Set properties from user level, to be overridden if supported */
  482 
  483 /*! @function setProperties
  484     @abstract Optionally supported external method to set properties in a registry entry.
  485     @discussion This method is not implemented by IORegistryEntry, but is available to kernel and non-kernel clients to set properties in a registry entry. IOUserClient provides connection based, more controlled access to this functionality and may be more appropriate for many uses, since there is no differentiation between clients available to this method.
  486     @param properties Any OSObject subclass, to be interpreted by the implementing method - for example an OSDictionary, OSData etc. may all be appropriate.
  487     @result An IOReturn code to be returned to the caller. */
  488 
  489     virtual IOReturn setProperties( OSObject * properties );
  490 
  491     /* Topology */
  492 
  493 /*! @function getParentIterator
  494     @abstract Returns an iterator over an registry entry's parent entries in a specified plane.
  495     @param plane The plane object.
  496     @result Returns an iterator over the parents of the registry entry, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, though they may no longer be attached during the iteration. */
  497 
  498     virtual OSIterator * getParentIterator( const IORegistryPlane * plane )
  499                                                                         const;
  500     virtual void applyToParents( IORegistryEntryApplierFunction applier,
  501                                  void * context,
  502                                  const IORegistryPlane * plane ) const;
  503 
  504 /*! @function getParentEntry
  505     @abstract Returns an registry entry's first parent entry in a plane.
  506     @discussion This function will return the parent to which a registry entry was first attached. Since the majority of registry entrys have only one provider, this is a useful simplification.
  507     @param plane The plane object.
  508     @result Returns the first parent of the registry entry, or zero if the entry is not attached into the registry in that plane. The parent is retained while the entry is attached, and should not be released by the caller. */
  509 
  510     virtual IORegistryEntry * getParentEntry( const IORegistryPlane * plane ) const;
  511 
  512 /*! @function getChildIterator
  513     @abstract Returns an iterator over an registry entry's child entries in a plane.
  514     @discussion This method creates an iterator which will return each of a registry entry's child entries in a specified plane.
  515     @param plane The plane object.
  516     @result Returns an iterator over the children of the entry, or zero if there is a resource failure. The iterator must be released when the iteration is finished. All objects returned by the iteration are retained while the iterator is valid, though they may no longer be attached during the iteration. */
  517 
  518     virtual OSIterator * getChildIterator( const IORegistryPlane * plane )
  519                                                                         const;
  520 
  521     virtual void applyToChildren( IORegistryEntryApplierFunction applier,
  522                                   void * context,
  523                                   const IORegistryPlane * plane ) const;
  524 
  525 /*! @function getChildEntry
  526     @abstract Returns an registry entry's first child entry in a plane.
  527     @discussion This function will return the child which first attached to a registry entry.
  528     @param plane The plane object.
  529     @result Returns the first child of the registry entry, or zero if the entry is not attached into the registry in that plane. The child is retained while the entry is attached, and should not be released by the caller. */
  530 
  531     virtual IORegistryEntry * getChildEntry( const IORegistryPlane * plane ) const;
  532 
  533 /*! @function isChild
  534     @abstract Determines whether a registry entry is the child of another in a plane.
  535     @discussion This method called in the parent entry determines if the specified entry is a child, in a plane. Additionally, it can check if the child is the only child of the parent entry.
  536     @param child The possible child registry entry.
  537     @param plane The plane object.
  538     @param onlyChild If true, check also if the child is the only child.
  539     @result If the child argument is not a child of the registry entry, false is returned. If onlyChild is true and the child is not the only child of the entry, false is returned, otherwise true is returned. */
  540 
  541     virtual bool isChild( IORegistryEntry * child,
  542                                 const IORegistryPlane * plane,
  543                                 bool onlyChild = false ) const;
  544 
  545 /*! @function isParent
  546     @abstract Determines whether a registry entry is the parent of another in a plane.
  547     @discussion This method called in the child entry determines if the specified entry is a parent, in a plane. Additionally, it can check if the parent is the only parent of the child entry.
  548     @param parent The possible parent registry entry.
  549     @param plane The plane object.
  550     @param onlyParent If true, check also if the parent is the only parent.
  551     @result If the parent argument is not a parent of the registry entry, false is returned. If onlyParent is true and the parent is not the only parent of the entry, false is returned, otherwise true is returned. */
  552 
  553     virtual bool isParent( IORegistryEntry * parent,
  554                                 const IORegistryPlane * plane,
  555                                 bool onlyParent = false ) const;
  556 
  557 /*! @function inPlane
  558     @abstract Determines whether a registry entry is attached in a plane.
  559     @discussion This method determines if the entry is attached in a plane to any other entry.  It can also be used to determine if the entry is a member of any plane.
  560     @param plane The plane object, 0 indicates any plane.
  561     @result If the entry has a parent in the given plane or if plane = 0 then if entry has any parent; return true, otherwise false. */
  562 
  563     virtual bool inPlane( const IORegistryPlane * plane = 0) const;
  564 
  565 /*! @function getDepth
  566     @abstract Counts the maximum number of entries between an entry and the registry root, in a plane.
  567     @discussion This method counts the number of entries between and entry and the registry root, in a plane, for each parent of the entry and returns the maximum value.
  568     @param plane The plane object.
  569     @result The maximum number of entries between the entry and the root. Zero is returned if the entry is not attached in the plane. */
  570 
  571     virtual unsigned int getDepth( const IORegistryPlane * plane ) const;
  572 
  573     /* Attach / detach */
  574 
  575 /*! @function attachToParent
  576     @abstract Attaches a entry to a parent entry in a plane.
  577     @discussion This is the usual method of entering an entry into the registry. It is a no-op and success if the entry is already attached to the parent. Attaching the  entry into the registry retains both the child and parent while they are attached. This method will call attachToChild in the parent entry if it is not being called from attachToChild.
  578     @param parent The registry entry to attach to.
  579     @param plane The plane object.
  580     @result true on success, or false on a resource failure, or if the parent is the same as the child. */
  581 
  582     virtual bool attachToParent( IORegistryEntry * parent,
  583                                 const IORegistryPlane * plane );
  584 
  585 /*! @function detachFromParent
  586     @abstract Detaches an entry from a parent entry in a plane.
  587     @discussion This is the usual method of removing an entry from the registry. It is a no-op if the entry is not attached to the parent. Detaching the entry will release both the child and parent. This method will call detachFromChild in the parent entry if it is not being called from detachFromChild.
  588     @param parent The registry entry to detach from.
  589     @param plane The plane object. */
  590 
  591     virtual void detachFromParent( IORegistryEntry * parent,
  592                                 const IORegistryPlane * plane );
  593 
  594 /*! @function attachToChild
  595     @abstract Method called in the parent entry when a child attaches.
  596     @discussion This method is called in the parent entry when a child attaches, to make overrides possible. This method will also call attachToParent in the child entry if it is not being called from attachToParent. It is a no-op and success if the entry is already a child. Attaching the  entry into the registry retains both the child and parent while they are attached.
  597     @param child The registry entry being attached.
  598     @param plane The plane object.
  599     @result true on success, or false on a resource failure, or if the parent is the same as the child. */
  600 
  601     virtual bool attachToChild( IORegistryEntry * child,
  602                                 const IORegistryPlane * plane );
  603 
  604 /*! @function detachFromChild
  605     @abstract Detaches a child entry from its parent in a plane.
  606     @discussion This method is called in the parent entry when a child detaches, to make overrides possible. It is a no-op if the entry is not a child of the parent. Detaching the entry will release both the child and parent. This method will call detachFromParent in the child entry if it is not being called from detachFromParent.
  607     @param parent The registry entry to detach.
  608     @param plane The plane object. */
  609 
  610     virtual void detachFromChild( IORegistryEntry * child,
  611                                 const IORegistryPlane * plane );
  612 
  613 /*! @function detachAbove
  614     @abstract Detaches an entry from all its parent entries in a plane.
  615     @discussion This method calls detachFromParent in the entry for each of its parent entries in the plane.
  616     @param plane The plane object. */
  617 
  618     virtual void detachAbove( const IORegistryPlane * plane );
  619 
  620 /*! @function detachAll
  621     @abstract Detaches an entry and all its children recursively in a plane.
  622     @discussion This method breaks the registry connections for a subtree. detachAbove is called in the entry, and all child entries and their children in the plane.
  623     @param plane The plane object. */
  624 
  625     virtual void detachAll( const IORegistryPlane * plane );
  626 
  627     /* Name, location and path accessors */
  628 
  629 /*! @function getName
  630     @abstract Returns the name assigned to the registry entry as a C-string.
  631     @discussion Entries can be named in a particular plane, or globally. If the entry is named in plane and the plane is specified that name will be returned, otherwise the global name is returned. The global name defaults to the entry's meta class name if it has not been named.
  632     @param plane The plane object, or zero for the global name.
  633     @result A C-string name, valid while the entry is retained. */
  634 
  635     virtual const char * getName( const IORegistryPlane * plane = 0 ) const;
  636 
  637 /*! @function copyName
  638     @abstract Returns the name assigned to the registry entry as an OSSymbol.
  639     @discussion Entries can be named in a particular plane, or globally. If the entry is named in plane and the plane is specified that name will be returned, otherwise the global name is returned. The global name defaults to the entry's meta class name if it has not been named.
  640     @param plane The plane object, or zero for the global name.
  641     @result A reference to an OSSymbol for the name, which should be released by the caller. */
  642 
  643     virtual const OSSymbol * copyName(
  644                                 const IORegistryPlane * plane = 0 ) const;
  645 
  646 /*! @function compareNames
  647     @abstract Compares the name of the entry with one or more names, and optionally returns the matching name.
  648     @discussion This method is called during IOService name matching and elsewhere to compare the entry's global name with a list of names, or a single name. A list of names may be passed as any OSCollection of OSStrings, while a single name may be passed an OSString, in the name parameter. compareNames will call the compareName method for each name, for overrides.
  649     @param name The name or names to compare with as any OSCollection (eg. OSArray, OSSet, OSDictionary) of OSStrings, or a single name may be passed an OSString.
  650     @param matched If the caller wants the successfully matched name returned, pass a non-zero pointer for the matched parameter and an OSString will be returned here. It should be released by the caller.
  651     @result True if one of the names compared true with the entry's global name. */
  652 
  653     virtual bool compareNames( OSObject * name, OSString ** matched = 0 ) const;
  654 
  655 /*! @function compareName
  656     @abstract Compares the name of the entry with one name, and optionally returns the matching name.
  657     @discussion This method is called during IOService name matching and elsewhere from the compareNames method. It should be overridden to provide non-standard name matching.
  658     @param name The name to compare with as an OSString.
  659     @param matched If the caller wants the successfully matched name returned, pass a non-zero pointer for the matched parameter and an OSString will be returned here. It should be released by the caller. Generally, this will be the same as the name parameter, but may not be if wildcards are used.
  660     @result True if the name compared true with the entry's global name. */
  661 
  662     virtual bool compareName( OSString * name, OSString ** matched = 0 ) const;
  663 
  664 /*! @function setName
  665     @abstract Sets a name for the registry entry, in a particular plane, or globally.
  666     @discussion Entries can be named in a particular plane, or globally. If the plane is specified the name applies only to that plane, otherwise the global name is set. The global name defaults to the entry's meta class name if it has not been named.
  667     @param name An OSSymbol which will be retained.
  668     @param plane The plane object, or zero to set the global name. */
  669 
  670     virtual void setName( const OSSymbol * name,
  671                                 const IORegistryPlane * plane = 0 );
  672 
  673 /*! @function setName
  674     @abstract Sets a name for the registry entry, in a particular plane, or globally.
  675     @discussion Entries can be named in a particular plane, or globally. If the plane is specified the name applies only to that plane, otherwise the global name is set. The global name defaults to the entry's meta class name if it has not been named.
  676     @param name A const C-string name which will be copied.
  677     @param plane The plane object, or zero to set the global name. */
  678 
  679     virtual void setName( const char * name,
  680                                 const IORegistryPlane * plane = 0 );
  681 
  682 /*! @function getLocation
  683     @abstract Returns the location string assigned to the registry entry as a C-string.
  684     @discussion Entries can given a location string in a particular plane, or globally. If the entry has had a location set in a plane and the plane is specified that location string will be returned, otherwise the global location string is returned. If no global location string has been set, zero is returned.
  685     @param plane The plane object, or zero for the global name.
  686     @result A C-string location string, valid while the entry is retained, or zero. */
  687 
  688     virtual const char * getLocation( const IORegistryPlane * plane = 0 ) const;
  689 
  690 /*! @function copyLocation
  691     @abstract Returns the location string assigned to the registry entry as an OSSymbol.
  692     @discussion Entries can given a location string in a particular plane, or globally. If the entry has had a location set in a plane and the plane is specified that location string will be returned, otherwise the global location string is returned. If no global location string has been set, zero is returned.
  693     @param plane The plane object, or zero for the global name.
  694     @result A reference to an OSSymbol for the location if one exists, which should be released by the caller, or zero. */
  695 
  696     virtual const OSSymbol * copyLocation(
  697                                 const IORegistryPlane * plane = 0 ) const;
  698 
  699 /*! @function setLocation
  700     @abstract Sets a location string for the registry entry, in a particular plane, or globally.
  701     @discussion Entries can be given a location string in a particular plane, or globally. If the plane is specified the location applies only to that plane, otherwise the global location is set. The location string may be used during path lookups of registry entries, to distinguish between sibling entries with the same name. The default IORegistryEntry parsing of location strings expects a list of hex numbers separated by commas, though subclasses of IORegistryEntry might do their own parsing.
  702     @param location A C-string location string which will be copied, or an OSSymbol which will be retained.
  703     @param plane The plane object, or zero to set the global location string. */
  704 
  705     virtual void setLocation( const OSSymbol * location,
  706                                 const IORegistryPlane * plane = 0 );
  707     virtual void setLocation( const char * location,
  708                                 const IORegistryPlane * plane = 0 );
  709 
  710 /*! @function getPath
  711     @abstract Create a path for a registry entry.
  712     @discussion The path for a registry entry is copied to the caller's buffer. The path describes the entry's attachment in a particular plane, which must be specified. The path begins with the plane name followed by a colon, and then followed by '/' separated path components for each of the entries between the root and the registry entry. Each component is constructed with the getPathComponent method called in each entry. An alias may also exist for the entry, which are described as properties in a registry entry found at /aliases in the plane. If a property value interpreted as a path in a call to IORegistryEntry::fromPath yields the entry, then the property name is used as the entry's path.
  713     @param path A char buffer allocated by the caller.
  714     @param length An in/out parameter - the caller sets the length of the buffer available, and getPath returns the total length of the path copied to the buffer.
  715     @param plane The plane object.
  716     @result getPath will fail if the entry is not attached in the plane, or if the buffer is not large enough to contain the path. */
  717 
  718     virtual bool getPath( char * path, int * length,
  719                             const IORegistryPlane * plane) const;
  720 
  721 /*! @function getPathComponent
  722     @abstract Create a path component for a registry entry.
  723     @discussion Each component of a path created with getPath is created with getPathComponent. The default implementation concatenates the entry's name in the the plane, with the "at" symbol and the location string of the entry in the plane if it has been set.
  724     @param path A char buffer allocated by the caller.
  725     @param length An in/out parameter - the caller sets the length of the buffer available, and getPathComponent returns the total length of the path component copied to the buffer.
  726     @param plane The plane object.
  727     @result true if the path fits into the supplied buffer or false on a overflow. */
  728 
  729     virtual bool getPathComponent( char * path, int * length,
  730                                     const IORegistryPlane * plane ) const;
  731 
  732 /*! @function fromPath
  733     @abstract Looks up a registry entry by path.
  734     @discussion This function parses paths to lookup registry entries. The path may begin with the <plane name>: created by getPath, or the plane may be set by the caller. If there are characters remaining unparsed after an entry has been looked up, this may be considered an invalid lookup, or those characters may be passed back to the caller and the lookup successful.
  735     @param path A C-string path.
  736     @param plane The plane to lookup up the path, or zero, in which case the path must begin with the plane name.
  737     @param residualPath If the path may contain residual characters after the last path component, the residual will be copied back to the caller's residualPath buffer. If there are residual characters and no residual buffer is specified, fromPath will fail.
  738     @param residualLength An in/out parameter - the caller sets the length of the residual buffer available, and fromPath returns the total length of the residual path copied to the buffer. If there is no residualBuffer (residualPath = 0) then residualLength may be zero also.
  739     @param fromEntry The lookup will proceed rooted at this entry if non-zero, otherwise it proceeds from the root of the plane.
  740     @result A retained registry entry is returned on success, or zero on failure. The caller should release the entry. */
  741 
  742     static IORegistryEntry * fromPath(  const char * path,
  743                                         const IORegistryPlane * plane = 0,
  744                                         char * residualPath = 0,
  745                                         int * residualLength = 0,
  746                                         IORegistryEntry * fromEntry = 0 );
  747 
  748 /*! @function fromPath
  749     @abstract Looks up a registry entry by relative path.
  750     @discussion This function looks up a entry below the called entry by a relative path. It is just a convenience that calls IORegistryEntry::fromPath with this as the fromEntry parameter.
  751     @param path See IORegistryEntry::fromPath.
  752     @param plane See IORegistryEntry::fromPath.
  753     @param residualPath See IORegistryEntry::fromPath.
  754     @param residualLength See IORegistryEntry::fromPath.
  755     @result See IORegistryEntry::fromPath. */
  756 
  757     virtual IORegistryEntry * childFromPath( const char * path,
  758                                              const IORegistryPlane * plane = 0,
  759                                              char * residualPath = 0,
  760                                              int * residualLength = 0 );
  761 
  762 /*! @function dealiasPath
  763     @abstract Strips any aliases from the head of path and returns the full path.
  764     @discussion If the path specified begins with an alias found in the /aliases entry, the value of the alias is returned, and a pointer into the passed in path after the alias is passed back to the caller. If an alias is not found, zero is returned and the path parameter is unchanged.
  765     @param opath An in/out paramter - the caller passes in a pointer to a C-string pointer to a path. If an alias is found, dealiasPath returns a pointer into the path just beyond the end of the alias.
  766     @param plane A plane object must be specified.
  767     @result A C-string pointer to the value of the alias if one is found, or zero if not. */
  768 
  769     static const char * dealiasPath( const char ** opath,
  770                                     const IORegistryPlane * plane );
  771 
  772 /*! @function makePlane
  773     @abstract Constructs an IORegistryPlane object.
  774     @discussion Most planes in IOKit are created by the OS, although other planes may be created.
  775     @param name A C-string name for the new plane, to be copied.
  776     @result A new instance of an IORegistryPlane, or zero on failure. */
  777 
  778     static const IORegistryPlane * makePlane( const char * name );
  779 
  780 /*!    @abstract Returns an ID for the registry entry that is global to all tasks.
  781     @discussion The entry ID returned by getRegistryEntryID can be used to identify a registry entry across all tasks. A registry entry may be looked up by its entry ID by creating a matching dictionary with IORegistryEntryIDMatching() in user space, or <code>IOService::registryEntryIDMatching()</code> in the kernel, to be used with the IOKit matching functions. The ID is valid only until the machine reboots.
  782     @result An ID for the registry entry, assigned when the entry is first attached in the registry. */
  783 
  784     uint64_t getRegistryEntryID( void );
  785 
  786     /* * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  787     /* * * * * * * * * * * * internals * * * * * * * * * * * */
  788     /* * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  789 
  790     virtual bool init( IORegistryEntry * from,
  791                                 const IORegistryPlane * inPlane );
  792 
  793 #ifdef XNU_KERNEL_PRIVATE
  794 public:
  795 #else
  796 private:
  797 #endif
  798     static IORegistryEntry * initialize( void );
  799 
  800 private:
  801     inline bool arrayMember( OSArray * set,
  802                             const IORegistryEntry * member,
  803                             unsigned int * index = 0 ) const;
  804 
  805     bool makeLink( IORegistryEntry * to,
  806                     unsigned int relation,
  807                     const IORegistryPlane * plane ) const;
  808     void breakLink( IORegistryEntry * to,
  809                     unsigned int relation,
  810                     const IORegistryPlane * plane ) const;
  811 
  812     APPLE_KEXT_COMPATIBILITY_VIRTUAL
  813         OSArray * getParentSetReference( const IORegistryPlane * plane )
  814                                                                         const;
  815 
  816     APPLE_KEXT_COMPATIBILITY_VIRTUAL
  817     OSArray * getChildSetReference( const IORegistryPlane * plane )
  818                                                                         const;
  819 
  820     APPLE_KEXT_COMPATIBILITY_VIRTUAL
  821     IORegistryEntry * getChildFromComponent( const char ** path,
  822                                 const IORegistryPlane * plane );
  823 
  824     APPLE_KEXT_COMPATIBILITY_VIRTUAL
  825     const OSSymbol * hasAlias(  const IORegistryPlane * plane,
  826                                     char * opath = 0, int * length = 0 ) const;
  827 
  828     APPLE_KEXT_COMPATIBILITY_VIRTUAL
  829     const char * matchPathLocation( const char * cmp,
  830                                 const IORegistryPlane * plane );
  831 
  832 };
  833 
  834 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  835 
  836 /*! @class IORegistryIterator : public OSIterator
  837     @abstract An iterator over the registry.
  838     @discussion An iterator that can traverse the children or parents of a registry entry in a plane, and recurse. Access to the registry is protected against multiple threads, but an IORegistryIterator instance is for use by one thread only. */
  839 
  840 class IORegistryIterator : public OSIterator
  841 {
  842     OSDeclareAbstractStructors(IORegistryIterator)
  843 
  844 private:
  845     struct IORegCursor {
  846         IORegCursor          *  next;
  847         IORegistryEntry      *  current;
  848         OSIterator           *  iter;
  849     };
  850     IORegCursor                 start;
  851     IORegCursor           *     where;
  852     IORegistryEntry       *     root;
  853     OSOrderedSet          *     done;
  854     const IORegistryPlane *     plane;
  855     IOOptionBits                options;
  856 
  857     virtual void free( void );
  858 
  859 public:
  860 /*! @function iterateOver
  861     @abstract Create an iterator rooted at a given registry entry.
  862     @discussion This method creates an IORegistryIterator that is set up with options to iterate children or parents of a root entry, and to recurse automatically into entries as they are returned, or only when instructed. The iterator object keeps track of entries that have been recursed into previously to avoid loops.
  863     @param start The root entry to begin the iteration at.
  864     @param plane A plane object must be specified.
  865     @param options kIORegistryIterateRecursively may be set to recurse automatically into each entry as it is returned. This option affects the behaviour of the getNextObject method, which is defined in the OSIterator superclass. Other methods will override this behaviour. kIORegistryIterateParents may be set to iterate the parents of each entry, by default the children are iterated.
  866     @result A created IORegistryIterator instance, to be released by the caller when it has finished with it. */
  867 
  868     static IORegistryIterator * iterateOver( IORegistryEntry * start,
  869                                              const IORegistryPlane * plane,
  870                                              IOOptionBits options = 0 );
  871 
  872 /*! @function iterateOver
  873     @abstract Create an iterator rooted at the registry root.
  874     @discussion This method creates an IORegistryIterator that is set up with options to iterate children of the registry root entry, and to recurse automatically into entries as they are returned, or only when instructed. The iterator object keeps track of entries that have been recursed into previously to avoid loops.
  875     @param plane A plane object must be specified.
  876     @param options kIORegistryIterateRecursively may be set to recurse automatically into each entry as it is returned. This option affects the behaviour of the getNextObject method, which is defined in the OSIterator superclass. Other methods will override this behaviour. kIORegistryIterateParents may be set to iterate the parents of each entry, by default the children are iterated.
  877     @result A created IORegistryIterator instance, to be released by the caller when it has finished with it. */
  878 
  879     static IORegistryIterator * iterateOver( const IORegistryPlane * plane,
  880                                              IOOptionBits options = 0 );
  881 
  882 /*! @function getNextObject
  883     @abstract Return the next object in the registry iteration.
  884     @discussion This method calls either getNextObjectFlat or getNextObjectRecursive depending on the options the iterator was created with. This implements the OSIterator defined getNextObject method. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it.
  885     @result The next registry entry in the iteration (the current entry), or zero if the iteration has finished at this level of recursion. The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */
  886 
  887     virtual IORegistryEntry * getNextObject( void );
  888 
  889 /*! @function getNextObjectFlat
  890     @abstract Return the next object in the registry iteration, ignoring the kIORegistryIterateRecursively option.
  891     @discussion This method returns the next child, or parent if the kIORegistryIterateParents option was used to create the iterator, of the current root entry. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it.
  892     @result The next registry entry in the iteration (the current entry), or zero if the iteration has finished at this level of recursion, or the iteration is invalid (see isValid). The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */
  893 
  894     virtual IORegistryEntry * getNextObjectFlat( void );
  895 
  896 /*! @function getNextObjectRecursive
  897     @abstract Return the next object in the registry iteration, and enter it.
  898     @discussion If the iterator has a current entry, and the iterator has not already entered previously, enterEntry is called to recurse into it, ie. make it the new root, and the next child, or parent if the kIORegistryIterateParents option was used to create the iterator, at this new level of recursion is returned. If there is no current entry at this level of recursion, exitEntry is called and the process repeats, until the iteration returns to the entry the iterator was created with and zero is returned. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it.
  899     @result The next registry entry in the iteration (the current entry), or zero if its finished, or the iteration is invalid (see isValid). The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */
  900 
  901     virtual IORegistryEntry * getNextObjectRecursive( void );
  902 
  903 /*! @function getCurrentEntry
  904     @abstract Return the current entry in the registry iteration.
  905     @discussion This method returns the current entry, last returned by getNextObject et al. The object returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. If the iteration is no longer valid (see isValid), the current entry is zero.
  906     @result The current registry entry in the iteration, or zero if the last iteration returned zero, or the iteration is invalid (see isValid). The entry returned is retained while the iterator is pointing at it (its the current entry), or recursing into it. The caller should not release it. */
  907 
  908     virtual IORegistryEntry * getCurrentEntry( void );
  909 
  910 /*! @function enterEntry
  911     @abstract Recurse into the current entry in the registry iteration.
  912     @discussion This method makes the current entry, ie. the last entry returned by getNextObject et al., the root in a new level of recursion. */
  913 
  914     virtual void enterEntry( void );
  915     
  916 /*! @function enterEntry
  917     @abstract Recurse into the current entry in the registry iteration.
  918     @discussion This method recurses into an entry as with enterEntry, but also switches from the current plane to a new one set by the caller.
  919     @param plane The new plane to switch into. */
  920 
  921     virtual void enterEntry( const IORegistryPlane * plane );
  922 
  923 /*! @function exitEntry
  924     @abstract Exits a level of recursion, restoring the current entry.
  925     @discussion This method undoes an enterEntry, restoring the current entry. If there are no more levels of recursion to exit false is returned, otherwise true is returned.
  926     @result true if a level of recursion was undone, false if no recursive levels are left in the iteration. */
  927 
  928     virtual bool exitEntry( void );
  929 
  930 /*! @function reset
  931     @abstract Exits all levels of recursion, restoring the iterator to its state at creation.
  932     @discussion This method exits all levels of recursion, and restores the iterator to its state at creation. */
  933 
  934     virtual void reset( void );
  935 
  936 /*! @function isValid
  937     @abstract Checks that no registry changes have invalidated the iteration.
  938     @discussion If a registry iteration is invalidated by changes to the registry, it will be made invalid, the currentEntry will be considered zero, and further calls to getNextObject et al. will return zero. The iterator should be reset to restart the iteration when this happens.
  939     @result false if the iterator has been invalidated by changes to the registry, true otherwise. */
  940 
  941     virtual bool isValid( void );
  942 
  943 /*! @function iterateAll
  944     @abstract Iterates all entries (with getNextObject) and returns a set of all returned entries.
  945     @discussion This method will reset, then iterate all entries in the iteration (with getNextObject) until successful (ie. the iterator is valid at the end of the iteration).
  946     @result A set of entries returned by the iteration. The caller should release the set when it has finished with it. Zero is returned on a resource failure. */
  947 
  948     virtual OSOrderedSet * iterateAll( void );
  949 };
  950 
  951 #endif /* _IOKIT_IOREGISTRYENTRY_H */

Cache object: 34a940260f9cb927679e9ab784653afb


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.