1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Use of this source code is governed by a BSD-style license
5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  that can be found in the LICENSE file in the root of the source
6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  tree. An additional intellectual property rights grant can be found
7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  in the file PATENTS.  All contributing project authors may
8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  be found in the AUTHORS file in the root of the source tree.
9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "file_impl.h"
12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
13c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <assert.h>
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32
16c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <Windows.h>
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else
18c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <stdarg.h>
19c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <string.h>
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc {
23c55a96383497a772a307b346368133960b02ad03Eric Laurent
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentFileWrapper* FileWrapper::Create()
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return new FileWrapperImpl();
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentFileWrapperImpl::FileWrapperImpl()
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    : _id(NULL),
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      _open(false),
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      _looping(false),
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      _readOnly(false),
34c55a96383497a772a307b346368133960b02ad03Eric Laurent      _maxSizeInBytes(0),
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      _sizeInBytes(0)
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    memset(_fileNameUTF8, 0, kMaxFileNameSize);
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentFileWrapperImpl::~FileWrapperImpl()
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (_id != NULL)
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        fclose(_id);
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
48c55a96383497a772a307b346368133960b02ad03Eric Laurentint FileWrapperImpl::CloseFile()
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (_id != NULL)
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        fclose(_id);
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        _id = NULL;
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    memset(_fileNameUTF8, 0, kMaxFileNameSize);
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    _open = false;
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint FileWrapperImpl::Rewind()
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(_looping || !_readOnly)
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (_id != NULL)
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            _sizeInBytes = 0;
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            return fseek(_id, 0, SEEK_SET);
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return -1;
71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
73c55a96383497a772a307b346368133960b02ad03Eric Laurentint FileWrapperImpl::SetMaxFileSize(size_t bytes)
74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    _maxSizeInBytes = bytes;
76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
79c55a96383497a772a307b346368133960b02ad03Eric Laurentint FileWrapperImpl::Flush()
80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (_id != NULL)
82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return fflush(_id);
84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return -1;
86e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
88c55a96383497a772a307b346368133960b02ad03Eric Laurentint FileWrapperImpl::FileName(char* fileNameUTF8,
89c55a96383497a772a307b346368133960b02ad03Eric Laurent                              size_t size) const
90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
91c55a96383497a772a307b346368133960b02ad03Eric Laurent    size_t length = strlen(_fileNameUTF8);
92c55a96383497a772a307b346368133960b02ad03Eric Laurent    if(length > kMaxFileNameSize)
93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        assert(false);
95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
97c55a96383497a772a307b346368133960b02ad03Eric Laurent    if(length < 1)
98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
101c55a96383497a772a307b346368133960b02ad03Eric Laurent
102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Make sure to NULL terminate
103c55a96383497a772a307b346368133960b02ad03Eric Laurent    if(size < length)
104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
105c55a96383497a772a307b346368133960b02ad03Eric Laurent        length = size - 1;
106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
107c55a96383497a772a307b346368133960b02ad03Eric Laurent    memcpy(fileNameUTF8, _fileNameUTF8, length);
108c55a96383497a772a307b346368133960b02ad03Eric Laurent    fileNameUTF8[length] = 0;
109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
112c55a96383497a772a307b346368133960b02ad03Eric Laurentbool FileWrapperImpl::Open() const
113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return _open;
115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
117c55a96383497a772a307b346368133960b02ad03Eric Laurentint FileWrapperImpl::OpenFile(const char *fileNameUTF8, bool readOnly,
118c55a96383497a772a307b346368133960b02ad03Eric Laurent                              bool loop, bool text)
119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
120c55a96383497a772a307b346368133960b02ad03Eric Laurent    size_t length = strlen(fileNameUTF8);
121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (length > kMaxFileNameSize)
122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    _readOnly = readOnly;
127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    FILE *tmpId = NULL;
129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#if defined _WIN32
130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    wchar_t wideFileName[kMaxFileNameSize];
131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    wideFileName[0] = 0;
132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MultiByteToWideChar(CP_UTF8,
134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        0 /*UTF8 flag*/,
135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        fileNameUTF8,
136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        -1 /*Null terminated string*/,
137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        wideFileName,
138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        kMaxFileNameSize);
139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(text)
140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if(readOnly)
142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = _wfopen(wideFileName, L"rt");
144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        } else {
145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = _wfopen(wideFileName, L"wt");
146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    } else {
148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if(readOnly)
149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = _wfopen(wideFileName, L"rb");
151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        } else {
152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = _wfopen(wideFileName, L"wb");
153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else
156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(text)
157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if(readOnly)
159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = fopen(fileNameUTF8, "rt");
161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        } else {
162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = fopen(fileNameUTF8, "wt");
163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    } else {
165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if(readOnly)
166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = fopen(fileNameUTF8, "rb");
168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        } else {
169e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            tmpId = fopen(fileNameUTF8, "wb");
170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (tmpId != NULL)
175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
176c55a96383497a772a307b346368133960b02ad03Eric Laurent        // +1 comes from copying the NULL termination character.
177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        memcpy(_fileNameUTF8, fileNameUTF8, length + 1);
178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (_id != NULL)
179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            fclose(_id);
181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        _id = tmpId;
183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        _looping = loop;
184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        _open = true;
185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return 0;
186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return -1;
188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
190c55a96383497a772a307b346368133960b02ad03Eric Laurentint FileWrapperImpl::Read(void* buf, int length)
191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
192c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (length < 0)
193c55a96383497a772a307b346368133960b02ad03Eric Laurent        return -1;
194c55a96383497a772a307b346368133960b02ad03Eric Laurent
195c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (_id == NULL)
196c55a96383497a772a307b346368133960b02ad03Eric Laurent        return -1;
197c55a96383497a772a307b346368133960b02ad03Eric Laurent
198c55a96383497a772a307b346368133960b02ad03Eric Laurent    int bytes_read = static_cast<int>(fread(buf, 1, length, _id));
199c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (bytes_read != length && !_looping)
200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
201c55a96383497a772a307b346368133960b02ad03Eric Laurent        CloseFile();
202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
203c55a96383497a772a307b346368133960b02ad03Eric Laurent    return bytes_read;
204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
206c55a96383497a772a307b346368133960b02ad03Eric Laurentint FileWrapperImpl::WriteText(const char* format, ...)
207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
208c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (format == NULL)
209c55a96383497a772a307b346368133960b02ad03Eric Laurent        return -1;
210c55a96383497a772a307b346368133960b02ad03Eric Laurent
211c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (_readOnly)
212c55a96383497a772a307b346368133960b02ad03Eric Laurent        return -1;
213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (_id == NULL)
215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
217c55a96383497a772a307b346368133960b02ad03Eric Laurent    va_list args;
218c55a96383497a772a307b346368133960b02ad03Eric Laurent    va_start(args, format);
219c55a96383497a772a307b346368133960b02ad03Eric Laurent    int num_chars = vfprintf(_id, format, args);
220c55a96383497a772a307b346368133960b02ad03Eric Laurent    va_end(args);
221c55a96383497a772a307b346368133960b02ad03Eric Laurent
222c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (num_chars >= 0)
223c55a96383497a772a307b346368133960b02ad03Eric Laurent    {
224c55a96383497a772a307b346368133960b02ad03Eric Laurent        return num_chars;
225c55a96383497a772a307b346368133960b02ad03Eric Laurent    }
226c55a96383497a772a307b346368133960b02ad03Eric Laurent    else
227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        CloseFile();
229c55a96383497a772a307b346368133960b02ad03Eric Laurent        return -1;
230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
232e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
233c55a96383497a772a307b346368133960b02ad03Eric Laurentbool FileWrapperImpl::Write(const void* buf, int length)
234e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
235c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (buf == NULL)
236c55a96383497a772a307b346368133960b02ad03Eric Laurent        return false;
237c55a96383497a772a307b346368133960b02ad03Eric Laurent
238c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (length < 0)
239c55a96383497a772a307b346368133960b02ad03Eric Laurent        return false;
240c55a96383497a772a307b346368133960b02ad03Eric Laurent
241c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (_readOnly)
242c55a96383497a772a307b346368133960b02ad03Eric Laurent        return false;
243c55a96383497a772a307b346368133960b02ad03Eric Laurent
244c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (_id == NULL)
245c55a96383497a772a307b346368133960b02ad03Eric Laurent        return false;
246c55a96383497a772a307b346368133960b02ad03Eric Laurent
247c55a96383497a772a307b346368133960b02ad03Eric Laurent    // Check if it's time to stop writing.
248c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (_maxSizeInBytes > 0 && (_sizeInBytes + length) > _maxSizeInBytes)
249e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
250c55a96383497a772a307b346368133960b02ad03Eric Laurent        Flush();
251c55a96383497a772a307b346368133960b02ad03Eric Laurent        return false;
252c55a96383497a772a307b346368133960b02ad03Eric Laurent    }
253e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
254c55a96383497a772a307b346368133960b02ad03Eric Laurent    size_t num_bytes = fwrite(buf, 1, length, _id);
255c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (num_bytes > 0)
256c55a96383497a772a307b346368133960b02ad03Eric Laurent    {
257c55a96383497a772a307b346368133960b02ad03Eric Laurent        _sizeInBytes += num_bytes;
258c55a96383497a772a307b346368133960b02ad03Eric Laurent        return true;
259e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
260c55a96383497a772a307b346368133960b02ad03Eric Laurent
261c55a96383497a772a307b346368133960b02ad03Eric Laurent    CloseFile();
262e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return false;
263e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
264c55a96383497a772a307b346368133960b02ad03Eric Laurent
265e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc
266