Annotation of XNU/iokit/IOKit/storage/IOStorage.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 IOStorage
        !            25:  * @abstract
        !            26:  * This header contains the IOStorage class definition.
        !            27:  */
        !            28: 
        !            29: #ifndef _IOSTORAGE_H
        !            30: #define _IOSTORAGE_H
        !            31: 
        !            32: /*!
        !            33:  * @enum IOStorageAccess
        !            34:  * @discussion
        !            35:  * The IOStorageAccess enumeration describes the possible access levels for open
        !            36:  * requests.
        !            37:  * @constant kAccessNone
        !            38:  * No access is requested; should not be passed to open().
        !            39:  * @constant kAccessReader
        !            40:  * Read-only access is requested.
        !            41:  * @constant kAccessReaderWriter
        !            42:  * Read and write access is requested.
        !            43:  */
        !            44: 
        !            45: enum IOStorageAccess
        !            46: {
        !            47:     kAccessNone = 0, kAccessReader = 1, kAccessReaderWriter = 3
        !            48: };
        !            49: 
        !            50: /*!
        !            51:  * @defined kIOStorageCategory
        !            52:  * @abstract
        !            53:  * kIOStorageCategory is a value for IOService's kIOMatchCategoryKey property.
        !            54:  * @discussion
        !            55:  * The kIOStorageCategory value is the standard value for the IOService property
        !            56:  * kIOMatchCategoryKey ("IOMatchCategory") for all storage drivers.  All storage
        !            57:  * objects that expect to drive new content (that is, produce new media objects)
        !            58:  * are expected to compete within the kIOStorageCategory namespace.
        !            59:  *
        !            60:  * See the IOService documentation for more information on match categories.
        !            61:  */
        !            62: 
        !            63: #define kIOStorageCategory "IOStorage"                /* (as IOMatchCategory) */
        !            64: 
        !            65: /*
        !            66:  * Kernel
        !            67:  */
        !            68: 
        !            69: #if defined(KERNEL) && defined(__cplusplus)
        !            70: 
        !            71: #include <IOKit/assert.h>
        !            72: #include <IOKit/IOMemoryDescriptor.h>
        !            73: #include <IOKit/IOService.h>
        !            74: 
        !            75: /*!
        !            76:  * @typedef IOStorageCompletionAction
        !            77:  * @discussion
        !            78:  * The IOStorageCompletionAction declaration describes the C (or C++) completion
        !            79:  * routine that is called once an asynchronous storage operation completes.
        !            80:  * @param target
        !            81:  * Opaque client-supplied pointer (or an instance pointer for a C++ callback).
        !            82:  * @param parameter
        !            83:  * Opaque client-supplied pointer.
        !            84:  * @param status
        !            85:  * Status of the data transfer.
        !            86:  * @param actualByteCount
        !            87:  * Actual number of bytes transferred in the data transfer.
        !            88:  */
        !            89: 
        !            90: typedef void (*IOStorageCompletionAction)(void *   target,
        !            91:                                           void *   parameter,
        !            92:                                           IOReturn status,
        !            93:                                           UInt64   actualByteCount);
        !            94: 
        !            95: /*!
        !            96:  * @struct IOStorageCompletion
        !            97:  * @discussion
        !            98:  * The IOStorageCompletion structure describes the C (or C++) completion routine
        !            99:  * that is called once an asynchronous storage operation completes.   The values
        !           100:  * passed for the target and parameter fields will be passed to the routine when
        !           101:  * it is called.
        !           102:  * @field target
        !           103:  * Opaque client-supplied pointer (or an instance pointer for a C++ callback).
        !           104:  * @field action
        !           105:  * Completion routine to call on completion of the data transfer.
        !           106:  * @field parameter
        !           107:  * Opaque client-supplied pointer.
        !           108:  */
        !           109: 
        !           110: struct IOStorageCompletion
        !           111: {
        !           112:     void *                    target;
        !           113:     IOStorageCompletionAction action;
        !           114:     void *                    parameter;
        !           115: };
        !           116: 
        !           117: /*!
        !           118:  * @class IOStorage
        !           119:  * @abstract
        !           120:  * The IOStorage class is the common base class for mass storage objects.
        !           121:  * @discussion
        !           122:  * The IOStorage class is the common base class for mass storage objects.  It is
        !           123:  * an abstract class that defines the open/close/read/write APIs that need to be
        !           124:  * implemented in a given subclass.  Synchronous versions of the read/write APIs
        !           125:  * are provided here -- they are coded in such a way as to wrap the asynchronous
        !           126:  * versions implmeneted in the subclass.
        !           127:  */
        !           128: 
        !           129: class IOStorage : public IOService
        !           130: {
        !           131:     OSDeclareAbstractStructors(IOStorage);
        !           132: 
        !           133: protected:
        !           134: 
        !           135:     /*!
        !           136:      * @function complete
        !           137:      * @discussion
        !           138:      * Invokes the specified completion action of the read/write request.  If
        !           139:      * the completion action is unspecified, no action is taken.  This method
        !           140:      * serves simply as a convenience to storage subclass developers.
        !           141:      * @param completion
        !           142:      * Completion information for the data transfer.
        !           143:      * @param status
        !           144:      * Status of the data transfer.
        !           145:      * @param actualByteCount
        !           146:      * Actual number of bytes transferred in the data transfer.
        !           147:      */
        !           148: 
        !           149:     inline void complete(IOStorageCompletion completion,
        !           150:                          IOReturn            status,
        !           151:                          UInt64              actualByteCount = 0);
        !           152: 
        !           153:     /*!
        !           154:      * @function handleOpen
        !           155:      * @discussion
        !           156:      * The handleOpen method grants or denies permission to access this object
        !           157:      * to an interested client.  The argument is an IOStorageAccess value that
        !           158:      * specifies the level of access desired -- reader or reader-writer.
        !           159:      *
        !           160:      * This method can be invoked to upgrade or downgrade the access level for
        !           161:      * an existing client as well.  The previous access level will prevail for
        !           162:      * upgrades that fail, of course.   A downgrade should never fail.  If the
        !           163:      * new access level should be the same as the old for a given client, this
        !           164:      * method will do nothing and return success.  In all cases, one, singular
        !           165:      * close-per-client is expected for all opens-per-client received.
        !           166:      * @param client
        !           167:      * Client requesting the open.
        !           168:      * @param options
        !           169:      * Options for the open.  Set to zero.
        !           170:      * @param access
        !           171:      * Access level for the open.  Set to kAccessReader or kAccessReaderWriter.
        !           172:      * @result
        !           173:      * Returns true if the open was successful, false otherwise.
        !           174:      */
        !           175: 
        !           176:     virtual bool handleOpen(IOService *  client,
        !           177:                             IOOptionBits options,
        !           178:                             void *       access) = 0;
        !           179: 
        !           180:     /*!
        !           181:      * @function handleIsOpen
        !           182:      * @discussion
        !           183:      * The handleIsOpen method determines whether the specified client, or any
        !           184:      * client if none is specificed, presently has an open on this object.
        !           185:      * @param client
        !           186:      * Client to check the open state of.  Set to zero to check the open state
        !           187:      * of all clients.
        !           188:      * @result
        !           189:      * Returns true if the client was (or clients were) open, false otherwise.
        !           190:      */
        !           191: 
        !           192:     virtual bool handleIsOpen(const IOService * client) const = 0;
        !           193: 
        !           194:     /*!
        !           195:      * @function handleClose
        !           196:      * @discussion
        !           197:      * The handleClose method closes the client's access to this object.
        !           198:      * @param client
        !           199:      * Client requesting the close.
        !           200:      * @param options
        !           201:      * Options for the close.  Set to zero.
        !           202:      */
        !           203: 
        !           204:     virtual void handleClose(IOService * client, IOOptionBits options) = 0;
        !           205: 
        !           206: public:
        !           207: 
        !           208:     /*!
        !           209:      * @function open
        !           210:      * @discussion
        !           211:      * Ask the storage object for permission to access its contents; the method
        !           212:      * is equivalent to IOService::open(), but with the correct parameter types.
        !           213:      *
        !           214:      * This method may also be invoked to upgrade or downgrade the access of an
        !           215:      * existing open (if it fails, the existing open prevails).
        !           216:      * @param client
        !           217:      * Client requesting the open.
        !           218:      * @param options
        !           219:      * Options for the open.  Set to zero.
        !           220:      * @param access
        !           221:      * Access level for the open.  Set to kAccessReader or kAccessReaderWriter.
        !           222:      * @result
        !           223:      * Returns true if the open was successful, false otherwise.
        !           224:      */
        !           225: 
        !           226:     inline bool open(IOService *     client,
        !           227:                      IOOptionBits    options,
        !           228:                      IOStorageAccess access);
        !           229: 
        !           230:     /*!
        !           231:      * @function read
        !           232:      * @discussion
        !           233:      * Read data from the storage object at the specified byte offset into the
        !           234:      * specified buffer, asynchronously.   When the read completes, the caller
        !           235:      * will be notified via the specified completion action.
        !           236:      *
        !           237:      * The buffer will be retained for the duration of the read.
        !           238:      * @param client
        !           239:      * Client requesting the read.
        !           240:      * @param byteStart
        !           241:      * Starting byte offset for the data transfer.
        !           242:      * @param buffer
        !           243:      * Buffer for the data transfer.  The size of the buffer implies the size of
        !           244:      * the data transfer.
        !           245:      * @param completion
        !           246:      * Completion routine to call once the data transfer is complete.
        !           247:      */
        !           248: 
        !           249:     virtual void read(IOService *          client,
        !           250:                       UInt64               byteStart,
        !           251:                       IOMemoryDescriptor * buffer,
        !           252:                       IOStorageCompletion  completion) = 0;
        !           253: 
        !           254:     /*!
        !           255:      * @function write
        !           256:      * @discussion
        !           257:      * Write data into the storage object at the specified byte offset from the
        !           258:      * specified buffer, asynchronously.   When the write completes, the caller
        !           259:      * will be notified via the specified completion action.
        !           260:      *
        !           261:      * The buffer will be retained for the duration of the write.
        !           262:      * @param client
        !           263:      * Client requesting the write.
        !           264:      * @param byteStart
        !           265:      * Starting byte offset for the data transfer.
        !           266:      * @param buffer
        !           267:      * Buffer for the data transfer.  The size of the buffer implies the size of
        !           268:      * the data transfer.
        !           269:      * @param completion
        !           270:      * Completion routine to call once the data transfer is complete.
        !           271:      */
        !           272: 
        !           273:     virtual void write(IOService *          client,
        !           274:                        UInt64               byteStart,
        !           275:                        IOMemoryDescriptor * buffer,
        !           276:                        IOStorageCompletion  completion) = 0;
        !           277: 
        !           278:     /*!
        !           279:      * @function read
        !           280:      * @discussion
        !           281:      * Read data from the storage object at the specified byte offset into the
        !           282:      * specified buffer, synchronously.   When the read completes, this method
        !           283:      * will return to the caller.  The actual byte count field is optional.
        !           284:      * @param client
        !           285:      * Client requesting the read.
        !           286:      * @param byteStart
        !           287:      * Starting byte offset for the data transfer.
        !           288:      * @param buffer
        !           289:      * Buffer for the data transfer.  The size of the buffer implies the size of
        !           290:      * the data transfer.
        !           291:      * @param actualByteCount
        !           292:      * Returns the actual number of bytes transferred in the data transfer.
        !           293:      * @result
        !           294:      * Returns the status of the data transfer.
        !           295:      */
        !           296: 
        !           297:     virtual IOReturn read(IOService *          client,
        !           298:                           UInt64               byteStart,
        !           299:                           IOMemoryDescriptor * buffer,
        !           300:                           UInt64 *             actualByteCount = 0);
        !           301: 
        !           302:     /*!
        !           303:      * @function write
        !           304:      * @discussion
        !           305:      * Write data into the storage object at the specified byte offset from the
        !           306:      * specified buffer, synchronously.   When the write completes, this method
        !           307:      * will return to the caller.  The actual byte count field is optional.
        !           308:      * @param client
        !           309:      * Client requesting the write.
        !           310:      * @param byteStart
        !           311:      * Starting byte offset for the data transfer.
        !           312:      * @param buffer
        !           313:      * Buffer for the data transfer.  The size of the buffer implies the size of
        !           314:      * the data transfer.
        !           315:      * @param actualByteCount
        !           316:      * Returns the actual number of bytes transferred in the data transfer.
        !           317:      * @result
        !           318:      * Returns the status of the data transfer.
        !           319:      */
        !           320: 
        !           321:     virtual IOReturn write(IOService *          client,
        !           322:                            UInt64               byteStart,
        !           323:                            IOMemoryDescriptor * buffer,
        !           324:                            UInt64 *             actualByteCount = 0);
        !           325: };
        !           326: 
        !           327: /*
        !           328:  * Inline Functions
        !           329:  */
        !           330: 
        !           331: inline void IOStorage::complete(IOStorageCompletion completion,
        !           332:                                 IOReturn            status,
        !           333:                                 UInt64              actualByteCount)
        !           334: {
        !           335:     /*
        !           336:      * Invokes the specified completion action of the read/write request.  If
        !           337:      * the completion action is unspecified, no action is taken.  This method
        !           338:      * serves simply as a convenience to storage subclass developers.
        !           339:      */
        !           340: 
        !           341:     if (completion.action)  (*completion.action)(completion.target, 
        !           342:                                                  completion.parameter,
        !           343:                                                  status,
        !           344:                                                  actualByteCount);
        !           345: }
        !           346: 
        !           347: inline bool IOStorage::open(IOService *     client,
        !           348:                             IOOptionBits    options,
        !           349:                             IOStorageAccess access)
        !           350: {
        !           351:     /*
        !           352:      * Ask the storage object for permission to access its contents; the method
        !           353:      * is equivalent to IOService::open(), but with the correct parameter types.
        !           354:      */
        !           355: 
        !           356:     return IOService::open(client, options, (void *) access);
        !           357: }
        !           358: 
        !           359: #endif /* defined(KERNEL) && defined(__cplusplus) */
        !           360: 
        !           361: #endif /* !_IOSTORAGE_H */

unix.superglobalmegacorp.com

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