summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmpeg3/mpeg3io.c
blob: c5cae00eeb72a473486d2128161168b3dac63575 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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);
}