1/*
2 * media.c -
3 *
4 * Written by Eryk Vershen
5 */
6
7/*
8 * Copyright 1997,1998 by Apple Computer, Inc.
9 *              All Rights Reserved
10 *
11 * Permission to use, copy, modify, and distribute this software and
12 * its documentation for any purpose and without fee is hereby granted,
13 * provided that the above copyright notice appears in all copies and
14 * that both the copyright notice and this permission notice appear in
15 * supporting documentation.
16 *
17 * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE.
20 *
21 * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
22 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
23 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
24 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
25 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26 */
27
28
29// for printf()
30#include <stdio.h>
31// for malloc() & free()
32#include <stdlib.h>
33
34#include "media.h"
35
36
37/*
38 * Defines
39 */
40
41
42/*
43 * Types
44 */
45
46
47/*
48 * Global Constants
49 */
50
51
52/*
53 * Global Variables
54 */
55static long media_kind = 0;
56
57/*
58 * Forward declarations
59 */
60
61
62/*
63 * Routines
64 */
65long
66allocate_media_kind(void)
67{
68    media_kind++;
69    return media_kind;
70}
71
72
73MEDIA
74new_media(long size)
75{
76    return (MEDIA) malloc(size);
77}
78
79
80void
81delete_media(MEDIA m)
82{
83    if (m == 0) {
84	return;
85    }
86    free(m);
87}
88
89
90unsigned long
91media_granularity(MEDIA m)
92{
93    if (m == 0) {
94	return 0;
95    } else {
96	return m->grain;
97    }
98}
99
100
101long long
102media_total_size(MEDIA m)
103{
104    if (m == 0) {
105	return 0;
106    } else {
107	return m->size_in_bytes;
108    }
109}
110
111
112long
113read_media(MEDIA m, long long offset, unsigned long count, void *address)
114{
115    long result;
116
117    if (m != 0 && m->do_read != 0) {
118	//printf("media: read type %d, offset %Ld, count %d\n\t", m->kind, offset, count);
119	result = (*m->do_read)(m, offset, count, address);
120	//printf(" - returns %d\n", result);
121	return result;
122    } else {
123	return 0;
124    }
125}
126
127
128long
129write_media(MEDIA m, long long offset, unsigned long count, void *address)
130{
131    long result;
132
133    if (m != 0 && m->do_write != 0) {
134	//printf("media: write type %d, offset %Ld, count %d\n\t", m->kind, offset, count);
135	result = (*m->do_write)(m, offset, count, address);
136	//printf(" - returns %d\n", result);
137	return result;
138    } else {
139	return 0;
140    }
141}
142
143
144void
145close_media(MEDIA m)
146{
147    if (m == 0) {
148	return;
149    }
150    if (m->kind != 0) {
151	if (m->do_close != 0) {
152	    (*m->do_close)(m);
153	}
154	m->kind = 0;
155	delete_media(m);
156    }
157}
158
159
160void
161os_reload_media(MEDIA m)
162{
163    if (m != 0 && m->do_os_reload != 0) {
164	(*m->do_os_reload)(m);
165    }
166}
167
168
169#if !defined(__linux__) && !defined(__unix__)
170#pragma mark -
171#endif
172
173
174
175MEDIA_ITERATOR
176new_media_iterator(long size)
177{
178    return (MEDIA_ITERATOR) malloc(size);
179}
180
181
182void
183private_delete_media_iterator(MEDIA_ITERATOR m)
184{
185    if (m == 0) {
186	return;
187    }
188    free(m);
189}
190
191
192void
193reset_media_iterator(MEDIA_ITERATOR m)
194{
195    if (m != 0 && m->do_reset != 0) {
196	(*m->do_reset)(m);
197    }
198}
199
200
201char *
202step_media_iterator(MEDIA_ITERATOR m)
203{
204    char *result;
205
206    if (m != 0 && m->do_step != 0) {
207	result = (*m->do_step)(m);
208    } else {
209	result = 0;
210    }
211    return result;
212}
213
214
215void
216delete_media_iterator(MEDIA_ITERATOR m)
217{
218    if (m == 0) {
219	return;
220    }
221    if (m->kind != 0) {
222	if (m->do_delete != 0) {
223	    (*m->do_delete)(m);
224	}
225	m->kind = 0;
226	private_delete_media_iterator(m);
227    }
228}
229