summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmpeg3/mpeg3io.c
Side-by-side diff
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/mpeg3io.c') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmpeg3/mpeg3io.c127
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);
+}
+