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 }