1*103e46e4SHarish Mahendrakar // Copyright (c) 2012 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar
9*103e46e4SHarish Mahendrakar #include "mkvmuxer/mkvwriter.h"
10*103e46e4SHarish Mahendrakar
11*103e46e4SHarish Mahendrakar #include <sys/types.h>
12*103e46e4SHarish Mahendrakar
13*103e46e4SHarish Mahendrakar #ifdef _MSC_VER
14*103e46e4SHarish Mahendrakar #include <share.h> // for _SH_DENYWR
15*103e46e4SHarish Mahendrakar #endif
16*103e46e4SHarish Mahendrakar
17*103e46e4SHarish Mahendrakar namespace mkvmuxer {
18*103e46e4SHarish Mahendrakar
MkvWriter()19*103e46e4SHarish Mahendrakar MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {}
20*103e46e4SHarish Mahendrakar
MkvWriter(FILE * fp)21*103e46e4SHarish Mahendrakar MkvWriter::MkvWriter(FILE* fp) : file_(fp), writer_owns_file_(false) {}
22*103e46e4SHarish Mahendrakar
~MkvWriter()23*103e46e4SHarish Mahendrakar MkvWriter::~MkvWriter() { Close(); }
24*103e46e4SHarish Mahendrakar
Write(const void * buffer,uint32 length)25*103e46e4SHarish Mahendrakar int32 MkvWriter::Write(const void* buffer, uint32 length) {
26*103e46e4SHarish Mahendrakar if (!file_)
27*103e46e4SHarish Mahendrakar return -1;
28*103e46e4SHarish Mahendrakar
29*103e46e4SHarish Mahendrakar if (length == 0)
30*103e46e4SHarish Mahendrakar return 0;
31*103e46e4SHarish Mahendrakar
32*103e46e4SHarish Mahendrakar if (buffer == NULL)
33*103e46e4SHarish Mahendrakar return -1;
34*103e46e4SHarish Mahendrakar
35*103e46e4SHarish Mahendrakar const size_t bytes_written = fwrite(buffer, 1, length, file_);
36*103e46e4SHarish Mahendrakar
37*103e46e4SHarish Mahendrakar return (bytes_written == length) ? 0 : -1;
38*103e46e4SHarish Mahendrakar }
39*103e46e4SHarish Mahendrakar
Open(const char * filename)40*103e46e4SHarish Mahendrakar bool MkvWriter::Open(const char* filename) {
41*103e46e4SHarish Mahendrakar if (filename == NULL)
42*103e46e4SHarish Mahendrakar return false;
43*103e46e4SHarish Mahendrakar
44*103e46e4SHarish Mahendrakar if (file_)
45*103e46e4SHarish Mahendrakar return false;
46*103e46e4SHarish Mahendrakar
47*103e46e4SHarish Mahendrakar #ifdef _MSC_VER
48*103e46e4SHarish Mahendrakar file_ = _fsopen(filename, "wb", _SH_DENYWR);
49*103e46e4SHarish Mahendrakar #else
50*103e46e4SHarish Mahendrakar file_ = fopen(filename, "wb");
51*103e46e4SHarish Mahendrakar #endif
52*103e46e4SHarish Mahendrakar if (file_ == NULL)
53*103e46e4SHarish Mahendrakar return false;
54*103e46e4SHarish Mahendrakar return true;
55*103e46e4SHarish Mahendrakar }
56*103e46e4SHarish Mahendrakar
Close()57*103e46e4SHarish Mahendrakar void MkvWriter::Close() {
58*103e46e4SHarish Mahendrakar if (file_ && writer_owns_file_) {
59*103e46e4SHarish Mahendrakar fclose(file_);
60*103e46e4SHarish Mahendrakar }
61*103e46e4SHarish Mahendrakar file_ = NULL;
62*103e46e4SHarish Mahendrakar }
63*103e46e4SHarish Mahendrakar
Position() const64*103e46e4SHarish Mahendrakar int64 MkvWriter::Position() const {
65*103e46e4SHarish Mahendrakar if (!file_)
66*103e46e4SHarish Mahendrakar return 0;
67*103e46e4SHarish Mahendrakar
68*103e46e4SHarish Mahendrakar #ifdef _MSC_VER
69*103e46e4SHarish Mahendrakar return _ftelli64(file_);
70*103e46e4SHarish Mahendrakar #else
71*103e46e4SHarish Mahendrakar return ftell(file_);
72*103e46e4SHarish Mahendrakar #endif
73*103e46e4SHarish Mahendrakar }
74*103e46e4SHarish Mahendrakar
Position(int64 position)75*103e46e4SHarish Mahendrakar int32 MkvWriter::Position(int64 position) {
76*103e46e4SHarish Mahendrakar if (!file_)
77*103e46e4SHarish Mahendrakar return -1;
78*103e46e4SHarish Mahendrakar
79*103e46e4SHarish Mahendrakar #ifdef _MSC_VER
80*103e46e4SHarish Mahendrakar return _fseeki64(file_, position, SEEK_SET);
81*103e46e4SHarish Mahendrakar #elif defined(_WIN32)
82*103e46e4SHarish Mahendrakar return fseeko64(file_, static_cast<off_t>(position), SEEK_SET);
83*103e46e4SHarish Mahendrakar #else
84*103e46e4SHarish Mahendrakar return fseeko(file_, static_cast<off_t>(position), SEEK_SET);
85*103e46e4SHarish Mahendrakar #endif
86*103e46e4SHarish Mahendrakar }
87*103e46e4SHarish Mahendrakar
Seekable() const88*103e46e4SHarish Mahendrakar bool MkvWriter::Seekable() const { return true; }
89*103e46e4SHarish Mahendrakar
ElementStartNotify(uint64,int64)90*103e46e4SHarish Mahendrakar void MkvWriter::ElementStartNotify(uint64, int64) {}
91*103e46e4SHarish Mahendrakar
92*103e46e4SHarish Mahendrakar } // namespace mkvmuxer
93