Upstream version 5.34.92.0
[platform/framework/web/crosswalk.git] / src / third_party / libwebm / source / mkvreader.cpp
1 // Copyright (c) 2010 The WebM project authors. All Rights Reserved.\r
2 //\r
3 // Use of this source code is governed by a BSD-style license\r
4 // that can be found in the LICENSE file in the root of the source\r
5 // tree. An additional intellectual property rights grant can be found\r
6 // in the file PATENTS.  All contributing project authors may\r
7 // be found in the AUTHORS file in the root of the source tree.\r
8 \r
9 #include "mkvreader.hpp"\r
10 \r
11 #include <cassert>\r
12 \r
13 namespace mkvparser\r
14 {\r
15 \r
16 MkvReader::MkvReader() :\r
17     m_file(NULL)\r
18 {\r
19 }\r
20 \r
21 MkvReader::~MkvReader()\r
22 {\r
23     Close();\r
24 }\r
25 \r
26 int MkvReader::Open(const char* fileName)\r
27 {\r
28     if (fileName == NULL)\r
29         return -1;\r
30 \r
31     if (m_file)\r
32         return -1;\r
33 \r
34 #ifdef WIN32\r
35     const errno_t e = fopen_s(&m_file, fileName, "rb");\r
36 \r
37     if (e)\r
38         return -1;  //error\r
39 #else\r
40     m_file = fopen(fileName, "rb");\r
41 \r
42     if (m_file == NULL)\r
43         return -1;\r
44 #endif\r
45 \r
46 #ifdef WIN32\r
47     int status = _fseeki64(m_file, 0L, SEEK_END);\r
48 \r
49     if (status)\r
50         return -1;  //error\r
51 \r
52     m_length = _ftelli64(m_file);\r
53 #else\r
54     fseek(m_file, 0L, SEEK_END);\r
55     m_length = ftell(m_file);\r
56 #endif\r
57     assert(m_length >= 0);\r
58 \r
59 #ifdef WIN32\r
60     status = _fseeki64(m_file, 0L, SEEK_SET);\r
61 \r
62     if (status)\r
63         return -1;  //error\r
64 #else\r
65     fseek(m_file, 0L, SEEK_SET);\r
66 #endif\r
67 \r
68     return 0;\r
69 }\r
70 \r
71 void MkvReader::Close()\r
72 {\r
73     if (m_file != NULL)\r
74     {\r
75         fclose(m_file);\r
76         m_file = NULL;\r
77     }\r
78 }\r
79 \r
80 int MkvReader::Length(long long* total, long long* available)\r
81 {\r
82     if (m_file == NULL)\r
83         return -1;\r
84 \r
85     if (total)\r
86         *total = m_length;\r
87 \r
88     if (available)\r
89         *available = m_length;\r
90 \r
91     return 0;\r
92 }\r
93 \r
94 int MkvReader::Read(long long offset, long len, unsigned char* buffer)\r
95 {\r
96     if (m_file == NULL)\r
97         return -1;\r
98 \r
99     if (offset < 0)\r
100         return -1;\r
101 \r
102     if (len < 0)\r
103         return -1;\r
104 \r
105     if (len == 0)\r
106         return 0;\r
107 \r
108     if (offset >= m_length)\r
109         return -1;\r
110 \r
111 #ifdef WIN32\r
112     const int status = _fseeki64(m_file, offset, SEEK_SET);\r
113 \r
114     if (status)\r
115         return -1;  //error\r
116 #else\r
117     fseek(m_file, offset, SEEK_SET);\r
118 #endif\r
119 \r
120     const size_t size = fread(buffer, 1, len, m_file);\r
121 \r
122     if (size < size_t(len))\r
123         return -1;  //error\r
124 \r
125     return 0;  //success\r
126 }\r
127 \r
128 }  //end namespace mkvparser\r