Annotation of XNU/iokit/IOKit/storage/IOMedia.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: 
        !            23: /*!
        !            24:  * @header IOMedia
        !            25:  * @abstract
        !            26:  * This header contains the IOMedia class definition.
        !            27:  */
        !            28: 
        !            29: #ifndef _IOMEDIA_H
        !            30: #define _IOMEDIA_H
        !            31: 
        !            32: /*!
        !            33:  * @defined kIOMediaContent
        !            34:  * @abstract
        !            35:  * kIOMediaContent is a property of IOMedia objects.  It is an OSString.
        !            36:  * @discussion
        !            37:  * The kIOMediaContent property contains a description of the media's contents.
        !            38:  * The description is the same as the hint at the time of the object's creation,
        !            39:  * but it is possible that the description be overrided by a client (which has
        !            40:  * probed the media and identified the content correctly) of the media object.
        !            41:  * It is more accurate than the hint for this reason.  The string is formed in
        !            42:  * the likeness of Apple's "Apple_HFS" strings.
        !            43:  */
        !            44: 
        !            45: #define kIOMediaContent "Content"
        !            46: 
        !            47: /*!
        !            48:  * @defined kIOMediaContentHint
        !            49:  * @abstract
        !            50:  * kIOMediaContentHint is a property of IOMedia objects.  It is an OSString.
        !            51:  * @discussion
        !            52:  * The kIOMediaContentHint property contains a hint of the media's contents.
        !            53:  * The hint is set at the time of the object's creation, should the creator have
        !            54:  * a clue as to what it may contain.  The hint string does not change for the
        !            55:  * lifetime of the object and is formed in the likeness of Apple's "Apple_HFS"
        !            56:  * strings.
        !            57:  */
        !            58: 
        !            59: #define kIOMediaContentHint "Content Hint"
        !            60: 
        !            61: /*!
        !            62:  * @defined kIOMediaEjectable
        !            63:  * @abstract
        !            64:  * kIOMediaEjectable is a property of IOMedia objects.  It is an OSBoolean.
        !            65:  * @discussion
        !            66:  * The kIOMediaEjectable property describes whether the media is ejectable.
        !            67:  */
        !            68: 
        !            69: #define kIOMediaEjectable "Ejectable"
        !            70: 
        !            71: /*!
        !            72:  * @defined kIOMediaLeaf
        !            73:  * @abstract
        !            74:  * kIOMediaLeaf is a property of IOMedia objects.  It is an OSBoolean.
        !            75:  * @discussion
        !            76:  * The kIOMediaLeaf property describes whether the media is a leaf, that is, it
        !            77:  * is the deepest media object in this branch of the I/O Kit registry.
        !            78:  */
        !            79: 
        !            80: #define kIOMediaLeaf "Leaf"
        !            81: 
        !            82: /*!
        !            83:  * @defined kIOMediaSize
        !            84:  * @abstract
        !            85:  * kIOMediaSize is a property of IOMedia objects.  It is an OSNumber.
        !            86:  * @discussion
        !            87:  * The kIOMediaSize property describes the total length of the media in bytes.
        !            88:  */
        !            89: 
        !            90: #define kIOMediaSize "Size"
        !            91: 
        !            92: /*!
        !            93:  * @defined kIOMediaWhole
        !            94:  * @abstract
        !            95:  * kIOMediaWhole is a property of IOMedia objects.  Is it an OSBoolean.
        !            96:  * @discussion
        !            97:  * The kIOMediaWhole property describes whether the media is whole, that is, it
        !            98:  * represents the whole disk (the physical disk, or a virtual replica thereof).
        !            99:  */
        !           100: 
        !           101: #define kIOMediaWhole "Whole"
        !           102: 
        !           103: /*!
        !           104:  * @defined kIOMediaWritable
        !           105:  * @abstract
        !           106:  * kIOMediaWritable is a property of IOMedia objects.  It is an OSBoolean.
        !           107:  * @discussion
        !           108:  * The kIOMediaWritable property describes whether the media is writable.
        !           109:  */
        !           110: 
        !           111: #define kIOMediaWritable "Writable"
        !           112: 
        !           113: /*!
        !           114:  * @defined kIOMediaContentMask
        !           115:  * @abstract
        !           116:  * kIOMediaContentMask is a property of IOMedia clients.  It is an OSString.
        !           117:  * @discussion
        !           118:  * The kIOMediaContentMask property must exist in all IOMedia clients that drive
        !           119:  * new content (that is, produce new media objects).  When the client matches on
        !           120:  * the provider media, the value of the client's kIOMediaContentMask property is
        !           121:  * used to replace the provider's kIOMediaContent property.
        !           122:  */
        !           123: 
        !           124: #define kIOMediaContentMask "Content Mask"
        !           125: 
        !           126: /*
        !           127:  * Kernel
        !           128:  */
        !           129: 
        !           130: #if defined(KERNEL) && defined(__cplusplus)
        !           131: 
        !           132: #include <IOKit/storage/IOStorage.h>
        !           133: 
        !           134: /*!
        !           135:  * @class IOMedia
        !           136:  * @abstract
        !           137:  * The IOMedia class is a random-access disk device abstraction.
        !           138:  * @discussion
        !           139:  * The IOMedia class is a random-access disk device abstraction.   It provides a
        !           140:  * consistent interface for both real and virtual disk devices, for subdivisions
        !           141:  * of disks such as partitions, for supersets of disks such as RAID volumes, and
        !           142:  * so on.   It extends the IOStorage class by implementing the appropriate open,
        !           143:  * close, read, write, and matching semantics for media objects.  The properties
        !           144:  * it has reflect the properties of real disk devices,  such as ejectability and
        !           145:  * writability.
        !           146:  *
        !           147:  * The read and write interfaces support byte-level access to the storage space,
        !           148:  * with the appropriate deblocking handled by IODrive, however, a typical client
        !           149:  * will want to obtain the natural block size in order to optimize access to the
        !           150:  * real disk device.  A read or write is accepted so long as the client's access
        !           151:  * is valid, the media is formatted and the transfer is within the bounds of the
        !           152:  * media.  An optional non-zero base (offset) is then applied before the read or
        !           153:  * write is passed to provider object.
        !           154:  *
        !           155:  * An open is accepted so long as no more than one writer is active at any time.
        !           156:  */
        !           157: 
        !           158: class IOMedia : public IOStorage
        !           159: {
        !           160:     OSDeclareDefaultStructors(IOMedia)
        !           161: 
        !           162: protected:
        !           163:     bool            _isEjectable;
        !           164:     bool            _isWhole;
        !           165:     bool            _isWritable;
        !           166: 
        !           167:     UInt64          _mediaBase;  /* (relative to the storage object below us) */
        !           168:     UInt64          _mediaSize;
        !           169: 
        !           170:     IOStorageAccess _openLevel;
        !           171:     OSSet *         _openReaders;
        !           172:     IOService *     _openReaderWriter;
        !           173: 
        !           174:     UInt64          _preferredBlockSize;
        !           175: 
        !           176:     /*
        !           177:      * Free all of this object's outstanding resources.
        !           178:      */
        !           179: 
        !           180:     virtual void free();
        !           181: 
        !           182:     /*!
        !           183:      * @function handleOpen
        !           184:      * @discussion
        !           185:      * The handleOpen method grants or denies permission to access this object
        !           186:      * to an interested client.  The argument is an IOStorageAccess value that
        !           187:      * specifies the level of access desired -- reader or reader-writer.
        !           188:      *
        !           189:      * This method can be invoked to upgrade or downgrade the access level for
        !           190:      * an existing client as well.  The previous access level will prevail for
        !           191:      * upgrades that fail, of course.   A downgrade should never fail.  If the
        !           192:      * new access level should be the same as the old for a given client, this
        !           193:      * method will do nothing and return success.  In all cases, one, singular
        !           194:      * close-per-client is expected for all opens-per-client received.
        !           195:      *
        !           196:      * This implementation replaces the IOService definition of handleOpen().
        !           197:      * @param client
        !           198:      * Client requesting the open.
        !           199:      * @param options
        !           200:      * Options for the open.  Set to zero.
        !           201:      * @param access
        !           202:      * Access level for the open.  Set to kAccessReader or kAccessReaderWriter.
        !           203:      * @result
        !           204:      * Returns true if the open was successful, false otherwise.
        !           205:      */
        !           206: 
        !           207:     virtual bool handleOpen(IOService *  client,
        !           208:                             IOOptionBits options,
        !           209:                             void *       access);
        !           210: 
        !           211:     /*!
        !           212:      * @function handleIsOpen
        !           213:      * @discussion
        !           214:      * The handleIsOpen method determines whether the specified client, or any
        !           215:      * client if none is specificed, presently has an open on this object.
        !           216:      *
        !           217:      * This implementation replaces the IOService definition of handleIsOpen().
        !           218:      * @param client
        !           219:      * Client to check the open state of.  Set to zero to check the open state
        !           220:      * of all clients.
        !           221:      * @result
        !           222:      * Returns true if the client was (or clients were) open, false otherwise.
        !           223:      */
        !           224: 
        !           225:     virtual bool handleIsOpen(const IOService * client) const;
        !           226: 
        !           227:     /*!
        !           228:      * @function handleClose
        !           229:      * @discussion
        !           230:      * The handleClose method closes the client's access to this object.
        !           231:      *
        !           232:      * This implementation replaces the IOService definition of handleClose().
        !           233:      * @param client
        !           234:      * Client requesting the close.
        !           235:      * @param options
        !           236:      * Options for the close.  Set to zero.
        !           237:      */
        !           238: 
        !           239:     virtual void handleClose(IOService * client, IOOptionBits options);
        !           240: 
        !           241: public:
        !           242: 
        !           243: ///m:2333367:workaround:commented:start
        !           244: //  IOStorage::open;
        !           245: //  IOStorage::close;
        !           246: //  IOStorage::read;
        !           247: //  IOStorage::write;
        !           248: ///m:2333367:workaround:commented:stop
        !           249: 
        !           250: ///m:2333367:workaround:added:start
        !           251:     inline bool open(IOService *     client,
        !           252:                      IOOptionBits    options,
        !           253:                      IOStorageAccess access)
        !           254:     { return IOStorage::open(client, options, access); }
        !           255: 
        !           256:     virtual IOReturn read(IOService *          client,
        !           257:                           UInt64               byteStart,
        !           258:                           IOMemoryDescriptor * buffer,
        !           259:                           UInt64 *             actualByteCount = 0)
        !           260:     { return IOStorage::read(client, byteStart, buffer, actualByteCount); }
        !           261: 
        !           262:     virtual IOReturn write(IOService *          client,
        !           263:                            UInt64               byteStart,
        !           264:                            IOMemoryDescriptor * buffer,
        !           265:                            UInt64 *             actualByteCount = 0)
        !           266:     { return IOStorage::write(client, byteStart, buffer, actualByteCount); }
        !           267: ///m:2333367:workaround:added:stop
        !           268: 
        !           269:     /*!
        !           270:      * @function init
        !           271:      * @discussion
        !           272:      * Initialize this object's minimal state.
        !           273:      * @param base
        !           274:      * Media offset, in bytes.
        !           275:      * @param size
        !           276:      * Media size, in bytes.
        !           277:      * @param preferredBlockSize
        !           278:      * Natural block size, in bytes.
        !           279:      * @param isEjectable
        !           280:      * Indicates whether the media is ejectable.
        !           281:      * @param isWhole
        !           282:      * Indicated whether the media represents the whole disk.
        !           283:      * @param isWritable
        !           284:      * Indicates whether the media is writable.
        !           285:      * @param contentHint
        !           286:      * Hint of media's contents (optional).  See getContentHint().
        !           287:      * @param properties
        !           288:      * Substitute property table for this object (optional).
        !           289:      * @result
        !           290:      * Returns true on success, false otherwise.
        !           291:      */
        !           292: 
        !           293:     virtual bool init(UInt64         base,
        !           294:                       UInt64         size,
        !           295:                       UInt64         preferredBlockSize,
        !           296:                       bool           isEjectable,
        !           297:                       bool           isWhole,
        !           298:                       bool           isWritable,
        !           299:                       const char *   contentHint = 0,
        !           300:                       OSDictionary * properties  = 0);
        !           301: 
        !           302:     /*
        !           303:      * This method is called for each client interested in the services we
        !           304:      * provide.  The superclass links us as a parent to this client in the
        !           305:      * I/O Kit registry on success.
        !           306:      */
        !           307: 
        !           308:     bool attachToChild(IORegistryEntry * client, const IORegistryPlane *);
        !           309: 
        !           310:     /*
        !           311:      * This method is called for each client that loses interest in the
        !           312:      * services we provide.  The superclass unlinks us from this client
        !           313:      * in the I/O Kit registry on success.
        !           314:      */
        !           315: 
        !           316:     void detachFromChild(IORegistryEntry * client, const IORegistryPlane *);
        !           317: 
        !           318:     /*
        !           319:      * I/O Kit is in the process of searching for a candidate object that wishes
        !           320:      * to match against an IOLocation={x} dictionary of properties.  This is the
        !           321:      * method called to determine whether this object wants to be the candidate.
        !           322:      *
        !           323:      * The matchLocation method should return "this" if it decides to match with
        !           324:      * the IOLocation={x} dictionary, otherwise it should call the superclass to
        !           325:      * continue with the search and skip this object as a candidate.
        !           326:      *
        !           327:      * If this object chooses to match, the dictionary {x} will be passed to the
        !           328:      * standard (passive) matching method matchPropertyTable for comparison.
        !           329:      */
        !           330: 
        !           331:     virtual IOService * matchLocation(IOService * client);
        !           332: 
        !           333:     /*
        !           334:      * Compare the properties in the supplied table to this object's properties.
        !           335:      */
        !           336: 
        !           337:     virtual bool matchPropertyTable(OSDictionary * table);
        !           338: 
        !           339:     /*
        !           340:      * Obtain a path to this service object.
        !           341:      */
        !           342: 
        !           343:     virtual bool getPath(char * path, int * len, const IORegistryPlane *) const;
        !           344: 
        !           345:     /*!
        !           346:      * @function read
        !           347:      * @discussion
        !           348:      * Read data from the storage object at the specified byte offset into the
        !           349:      * specified buffer, asynchronously.   When the read completes, the caller
        !           350:      * will be notified via the specified completion action.
        !           351:      *
        !           352:      * The buffer will be retained for the duration of the read.
        !           353:      * @param client
        !           354:      * Client requesting the read.
        !           355:      * @param byteStart
        !           356:      * Starting byte offset for the data transfer.
        !           357:      * @param buffer
        !           358:      * Buffer for the data transfer.  The size of the buffer implies the size of
        !           359:      * the data transfer.
        !           360:      * @param completion
        !           361:      * Completion routine to call once the data transfer is complete.
        !           362:      */
        !           363: 
        !           364:     virtual void read(IOService *          client,
        !           365:                       UInt64               byteStart,
        !           366:                       IOMemoryDescriptor * buffer,
        !           367:                       IOStorageCompletion  completion);
        !           368: 
        !           369:     /*!
        !           370:      * @function write
        !           371:      * @discussion
        !           372:      * Write data into the storage object at the specified byte offset from the
        !           373:      * specified buffer, asynchronously.   When the write completes, the caller
        !           374:      * will be notified via the specified completion action.
        !           375:      *
        !           376:      * The buffer will be retained for the duration of the write.
        !           377:      * @param client
        !           378:      * Client requesting the write.
        !           379:      * @param byteStart
        !           380:      * Starting byte offset for the data transfer.
        !           381:      * @param buffer
        !           382:      * Buffer for the data transfer.  The size of the buffer implies the size of
        !           383:      * the data transfer.
        !           384:      * @param completion
        !           385:      * Completion routine to call once the data transfer is complete.
        !           386:      */
        !           387: 
        !           388:     virtual void write(IOService *          client,
        !           389:                        UInt64               byteStart,
        !           390:                        IOMemoryDescriptor * buffer,
        !           391:                        IOStorageCompletion  completion);
        !           392: 
        !           393:     /*!
        !           394:      * @function getPreferredBlockSize
        !           395:      * @discussion
        !           396:      * Ask the media object for its natural block size.  This information
        !           397:      * is useful to clients that want to optimize access to the media.
        !           398:      * @result
        !           399:      * Natural block size, in bytes.
        !           400:      */
        !           401: 
        !           402:     virtual UInt64 getPreferredBlockSize() const;
        !           403: 
        !           404:     /*!
        !           405:      * @function getSize
        !           406:      * @discussion
        !           407:      * Ask the media object for its total length in bytes.
        !           408:      * @result
        !           409:      * Media size, in bytes.
        !           410:      */
        !           411: 
        !           412:     virtual UInt64 getSize() const;
        !           413: 
        !           414:     /*!
        !           415:      * @function getBase
        !           416:      * @discussion
        !           417:      * Ask the media object for its byte offset relative to its provider media
        !           418:      * object below it in the storage hierarchy.
        !           419:      * Media offset, in bytes.
        !           420:      */
        !           421: 
        !           422:     virtual UInt64 getBase() const;
        !           423: 
        !           424:     /*!
        !           425:      * @function isEjectable
        !           426:      * @discussion
        !           427:      * Ask the media object whether it is ejectable.
        !           428:      * @result
        !           429:      * Returns true if the media is ejectable, false otherwise.
        !           430:      */
        !           431: 
        !           432:     virtual bool isEjectable() const;
        !           433: 
        !           434:     /*!
        !           435:      * @function isFormatted
        !           436:      * @discussion
        !           437:      * Ask the media object whether it is formatted.
        !           438:      * @result
        !           439:      * Returns true if the media is formatted, false otherwise.
        !           440:      */
        !           441: 
        !           442:     virtual bool isFormatted() const;
        !           443: 
        !           444:     /*!
        !           445:      * @function isWhole
        !           446:      * @discussion
        !           447:      * Ask the media object whether it represents the whole disk.
        !           448:      * @result
        !           449:      * Returns true if the media represents the whole disk, false otherwise.
        !           450:      */
        !           451: 
        !           452:     virtual bool isWhole() const;
        !           453: 
        !           454:     /*!
        !           455:      * @function isWritable
        !           456:      * @discussion
        !           457:      * Ask the media object whether it is writable.
        !           458:      * @result
        !           459:      * Returns true if the media is writable, false otherwise.
        !           460:      */
        !           461: 
        !           462:     virtual bool isWritable() const;
        !           463: 
        !           464:     /*!
        !           465:      * @function getContent
        !           466:      * @discussion
        !           467:      * Ask the media object for a description of its contents.  The description
        !           468:      * is the same as the hint at the time of the object's creation,  but it is
        !           469:      * possible that the description be overrided by a client (which has probed
        !           470:      * the media and identified the content correctly) of the media object.  It
        !           471:      * is more accurate than the hint for this reason.  The string is formed in
        !           472:      * the likeness of Apple's "Apple_HFS" strings.
        !           473:      *
        !           474:      * The content description can be overrided by any client that matches onto
        !           475:      * this media object with a match category of kIOStorageCategory.  The media
        !           476:      * object checks for a kIOMediaContentMask property in the client, and if it
        !           477:      * finds one, it copies it into kIOMediaContent property.
        !           478:      * @result
        !           479:      * Description of media's contents.
        !           480:      */
        !           481: 
        !           482:     virtual const char * getContent() const;
        !           483: 
        !           484:     /*!
        !           485:      * @function getContentHint
        !           486:      * @discussion
        !           487:      * Ask the media object for a hint of its contents.  The hint is set at the
        !           488:      * time of the object's creation, should the creator have a clue as to what
        !           489:      * it may contain.  The hint string does not change for the lifetime of the
        !           490:      * object and is also formed in the likeness of Apple's "Apple_HFS" strings.
        !           491:      * @result
        !           492:      * Hint of media's contents.
        !           493:      */
        !           494: 
        !           495:     virtual const char * getContentHint() const;
        !           496: 
        !           497:     /*
        !           498:      * Obtain this object's provider.  We override the superclass's method to
        !           499:      * return a more specific subclass of OSObject -- IOStorage.  This method
        !           500:      * serves simply as a convenience to subclass developers.
        !           501:      */
        !           502: 
        !           503:     virtual IOStorage * getProvider() const
        !           504:     {
        !           505:         return (IOStorage *) IOStorage::getProvider();
        !           506:     }
        !           507: };
        !           508: 
        !           509: #endif /* defined(KERNEL) && defined(__cplusplus) */
        !           510: 
        !           511: #endif /* !_IOMEDIA_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.