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