Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/mpeg3io.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/multimedia/opieplayer/libmpeg3/mpeg3io.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/mpeg3io.c b/core/multimedia/opieplayer/libmpeg3/mpeg3io.c new file mode 100644 index 0000000..c5807a7 --- a/dev/null +++ b/core/multimedia/opieplayer/libmpeg3/mpeg3io.c @@ -0,0 +1,127 @@ +#include "mpeg3private.h" +#include "mpeg3protos.h" + +#ifndef _WIN32 +#include <mntent.h> +#else + +#endif +#include <sys/stat.h> +#include <stdlib.h> +#include <string.h> + +mpeg3_fs_t* mpeg3_new_fs(char *path) +{ + mpeg3_fs_t *fs = (mpeg3_fs_t*)calloc(1, sizeof(mpeg3_fs_t)); + fs->css = mpeg3_new_css(); + strcpy(fs->path, path); + return fs; +} + +int mpeg3_delete_fs(mpeg3_fs_t *fs) +{ + mpeg3_delete_css(fs->css); + free(fs); + return 0; +} + +int mpeg3_copy_fs(mpeg3_fs_t *dst, mpeg3_fs_t *src) +{ + strcpy(dst->path, src->path); + dst->current_byte = 0; + return 0; +} + +long mpeg3io_get_total_bytes(mpeg3_fs_t *fs) +{ +/* + * struct stat st; + * if(stat(fs->path, &st) < 0) return 0; + * return (long)st.st_size; + */ + + fseek(fs->fd, 0, SEEK_END); + fs->total_bytes = ftell(fs->fd); + fseek(fs->fd, 0, SEEK_SET); + return fs->total_bytes; +} + +int mpeg3io_open_file(mpeg3_fs_t *fs) +{ +/* Need to perform authentication before reading a single byte. */ + mpeg3_get_keys(fs->css, fs->path); + + if(!(fs->fd = fopen(fs->path, "rb"))) + { + perror("mpeg3io_open_file"); + return 1; + } + + fs->total_bytes = mpeg3io_get_total_bytes(fs); + + if(!fs->total_bytes) + { + fclose(fs->fd); + return 1; + } + fs->current_byte = 0; + return 0; +} + +int mpeg3io_close_file(mpeg3_fs_t *fs) +{ + if(fs->fd) fclose(fs->fd); + fs->fd = 0; + return 0; +} + +int mpeg3io_read_data(unsigned char *buffer, long bytes, mpeg3_fs_t *fs) +{ + int result = 0; +//printf("read %d bytes\n",bytes); + result = !fread(buffer, 1, bytes, fs->fd); + fs->current_byte += bytes; + return (result && bytes); +} + +int mpeg3io_device(char *path, char *device) +{ + struct stat file_st, device_st; + struct mntent *mnt; + FILE *fp; + + if(stat(path, &file_st) < 0) + { + perror("mpeg3io_device"); + return 1; + } + +#ifndef _WIN32 + fp = setmntent(MOUNTED, "r"); + while(fp && (mnt = getmntent(fp))) + { + if(stat(mnt->mnt_fsname, &device_st) < 0) continue; + if(device_st.st_rdev == file_st.st_dev) + { + strncpy(device, mnt->mnt_fsname, MPEG3_STRLEN); + break; + } + } + endmntent(fp); +#endif + + return 0; +} + +int mpeg3io_seek(mpeg3_fs_t *fs, long byte) +{ + fs->current_byte = byte; + return fseek(fs->fd, byte, SEEK_SET); +} + +int mpeg3io_seek_relative(mpeg3_fs_t *fs, long bytes) +{ + fs->current_byte += bytes; + return fseek(fs->fd, fs->current_byte, SEEK_SET); +} + |