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 */ 55 static long media_kind = 0; 56 57 /* 58 * Forward declarations 59 */ 60 61 62 /* 63 * Routines 64 */ 65 long 66 allocate_media_kind(void) 67 { 68 media_kind++; 69 return media_kind; 70 } 71 72 73 MEDIA 74 new_media(long size) 75 { 76 return (MEDIA) malloc(size); 77 } 78 79 80 void 81 delete_media(MEDIA m) 82 { 83 if (m == 0) { 84 return; 85 } 86 free(m); 87 } 88 89 90 uint32_t 91 media_granularity(MEDIA m) 92 { 93 if (m == 0) { 94 return 0; 95 } else { 96 return m->grain; 97 } 98 } 99 100 101 long long 102 media_total_size(MEDIA m) 103 { 104 if (m == 0) { 105 return 0; 106 } else { 107 return m->size_in_bytes; 108 } 109 } 110 111 112 long 113 read_media(MEDIA m, long long offset, uint32_t 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 128 long 129 write_media(MEDIA m, long long offset, uint32_t 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 144 void 145 close_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 160 void 161 os_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 175 MEDIA_ITERATOR 176 new_media_iterator(long size) 177 { 178 return (MEDIA_ITERATOR) malloc(size); 179 } 180 181 182 void 183 private_delete_media_iterator(MEDIA_ITERATOR m) 184 { 185 if (m == 0) { 186 return; 187 } 188 free(m); 189 } 190 191 192 void 193 reset_media_iterator(MEDIA_ITERATOR m) 194 { 195 if (m != 0 && m->do_reset != 0) { 196 (*m->do_reset)(m); 197 } 198 } 199 200 201 char * 202 step_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 215 void 216 delete_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