1/*
2 * Copyright (c) 1998-2012 Apple Inc. All rights reserved.
3 *
4 * @APPLE_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. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24/*
25 * @header IOCDPartitionScheme
26 * @abstract
27 * This header contains the IOCDPartitionScheme class definition.
28 */
29
30#ifndef _IOCDPARTITIONSCHEME_H
31#define _IOCDPARTITIONSCHEME_H
32
33#include <IOKit/storage/IOCDTypes.h>
34
35/*
36 * @defined kIOCDPartitionSchemeClass
37 * @abstract
38 * kIOCDPartitionSchemeClass is the name of the IOCDPartitionScheme class.
39 * @discussion
40 * kIOCDPartitionSchemeClass is the name of the IOCDPartitionScheme class.
41 */
42
43#define kIOCDPartitionSchemeClass "IOCDPartitionScheme"
44
45/*
46 * @defined kIOMediaSessionIDKey
47 * @abstract
48 * kIOMediaSessionIDKey is property of IOMedia objects.  It has an OSNumber
49 * value.
50 * @discussion
51 * The kIOMediaSessionIDKey property is placed into each IOMedia instance
52 * created by the CD partition scheme.  It identifies the session number
53 * the track was recorded on.
54 */
55
56#define kIOMediaSessionIDKey "Session ID"
57
58#ifdef KERNEL
59#ifdef __cplusplus
60
61/*
62 * Kernel
63 */
64
65#include <IOKit/storage/IOCDMedia.h>
66#include <IOKit/storage/IOPartitionScheme.h>
67
68/*
69 * Class
70 */
71
72class IOCDPartitionScheme : public IOPartitionScheme
73{
74    OSDeclareDefaultStructors(IOCDPartitionScheme);
75
76protected:
77
78    struct ExpansionData { /* */ };
79    ExpansionData * _expansionData;
80
81    OSSet * _partitions;    /* (set of media objects representing partitions) */
82
83    /*
84     * Free all of this object's outstanding resources.
85     */
86
87    virtual void free(void);
88
89    /*
90     * Scan the provider media for CD partitions (in TOC).  Returns the set
91     * of media objects representing each of the partitions (the retain for
92     * the set is passed to the caller), or null should no CD partitions be
93     * found.  The default probe score can be adjusted up or down, based on
94     * the confidence of the scan.
95     */
96
97    virtual OSSet * scan(SInt32 * score);
98
99    /*
100     * Ask whether the given partition appears to be corrupt.  A partition that
101     * is corrupt will cause the failure of the CD partition scheme altogether.
102     */
103
104    virtual bool isPartitionCorrupt( CDTOCDescriptor * partition,
105                                     UInt64            partitionSize,
106                                     UInt32            partitionBlockSize,
107                                     CDSectorType      partitionBlockType,
108                                     CDTOC *           toc );
109
110    /*
111     * Ask whether the given partition appears to be invalid.  A partition that
112     * is invalid will cause it to be skipped in the scan, but will not cause a
113     * failure of the CD partition scheme.
114     */
115
116    virtual bool isPartitionInvalid( CDTOCDescriptor * partition,
117                                     UInt64            partitionSize,
118                                     UInt32            partitionBlockSize,
119                                     CDSectorType      partitionBlockType,
120                                     CDTOC *           toc );
121
122    /*
123     * Instantiate a new media object to represent the given partition.
124     */
125
126    virtual IOMedia * instantiateMediaObject(
127                                           CDTOCDescriptor * partition,
128                                           UInt64            partitionSize,
129                                           UInt32            partitionBlockSize,
130                                           CDSectorType      partitionBlockType,
131                                           CDTOC *           toc );
132
133    /*
134     * Allocate a new media object (called from instantiateMediaObject).
135     */
136
137    virtual IOMedia * instantiateDesiredMediaObject(
138                                           CDTOCDescriptor * partition,
139                                           UInt64            partitionSize,
140                                           UInt32            partitionBlockSize,
141                                           CDSectorType      partitionBlockType,
142                                           CDTOC *           toc );
143
144public:
145
146    /*
147     * Initialize this object's minimal state.
148     */
149
150    virtual bool init(OSDictionary * properties = 0);
151
152    /*
153     * Scan the provider media for CD partitions.
154     */
155
156    virtual IOService * probe(IOService * provider, SInt32 * score);
157
158    /*
159     * Determine whether the provider media contains CD partitions.
160     */
161
162    virtual bool start(IOService * provider);
163
164    /*
165     * Read data from the storage object at the specified byte offset into the
166     * specified buffer, asynchronously.   When the read completes, the caller
167     * will be notified via the specified completion action.
168     *
169     * The buffer will be retained for the duration of the read.
170     *
171     * For the CD partition scheme, we convert the read from a partition
172     * object into the appropriate readCD command to our provider media.
173     */
174
175    virtual void read(IOService *           client,
176                      UInt64                byteStart,
177                      IOMemoryDescriptor *  buffer,
178                      IOStorageAttributes * attributes,
179                      IOStorageCompletion * completion);
180
181    /*
182     * Write data into the storage object at the specified byte offset from the
183     * specified buffer, asynchronously.   When the write completes, the caller
184     * will be notified via the specified completion action.
185     *
186     * The buffer will be retained for the duration of the write.
187     *
188     * For the CD partition scheme, we convert the write from a partition
189     * object into the appropriate writeCD command to our provider media.
190     */
191
192    virtual void write(IOService *           client,
193                       UInt64                byteStart,
194                       IOMemoryDescriptor *  buffer,
195                       IOStorageAttributes * attributes,
196                       IOStorageCompletion * completion);
197
198    /*
199     * Obtain this object's provider.  We override the superclass's method
200     * to return a more specific subclass of OSObject -- IOCDMedia.   This
201     * method serves simply as a convenience to subclass developers.
202     */
203
204    virtual IOCDMedia * getProvider() const;
205
206    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  0);
207    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  1);
208    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  2);
209    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  3);
210    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  4);
211    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  5);
212    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  6);
213    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  7);
214    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  8);
215    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme,  9);
216    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 10);
217    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 11);
218    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 12);
219    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 13);
220    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 14);
221    OSMetaClassDeclareReservedUnused(IOCDPartitionScheme, 15);
222};
223
224#endif /* __cplusplus */
225#endif /* KERNEL */
226#endif /* !_IOCDPARTITIONSCHEME_H */
227