00001 #include <stdio.h> 00002 #include "debug.h" 00003 #include "default_file.h" 00004 00005 00006 namespace audiere { 00007 00008 class CFile : public RefImplementation<File> { 00009 public: 00010 CFile(FILE* file) { 00011 ADR_ASSERT(file, "FILE* handle not valid"); 00012 m_file = file; 00013 } 00014 00015 ~CFile() { 00016 fclose(m_file); 00017 } 00018 00019 int ADR_CALL read(void* buffer, int size) { 00020 ADR_ASSERT(buffer, "buffer pointer not valid"); 00021 ADR_ASSERT(size >= 0, "can't read negative number of bytes"); 00022 return fread(buffer, 1, size, m_file); 00023 } 00024 00025 bool ADR_CALL seek(int position, SeekMode mode) { 00026 int m; 00027 switch (mode) { 00028 case BEGIN: m = SEEK_SET; break; 00029 case CURRENT: m = SEEK_CUR; break; 00030 case END: m = SEEK_END; break; 00031 default: return false; 00032 } 00033 00034 return (fseek(m_file, position, m) == 0); 00035 } 00036 00037 int ADR_CALL tell() { 00038 return ftell(m_file); 00039 } 00040 00041 private: 00042 FILE* m_file; 00043 }; 00044 00045 00046 ADR_EXPORT(File*) AdrOpenFile(const char* filename, bool writeable) { 00047 FILE* file = fopen(filename, writeable ? "wb" : "rb"); 00048 return (file ? new CFile(file) : 0); 00049 } 00050 00051 }