git-svn-id: http://webrtc.googlecode.com/svn/trunk@6 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/system_wrappers/source/file_impl.cc b/system_wrappers/source/file_impl.cc
new file mode 100644
index 0000000..6046c2c
--- /dev/null
+++ b/system_wrappers/source/file_impl.cc
@@ -0,0 +1,267 @@
+/*
+ * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "file_impl.h"
+
+#include <cassert>
+
+#ifdef _WIN32
+ #include <Windows.h>
+#else
+ #include <stdarg.h>
+ #include <string.h>
+#endif
+
+namespace webrtc {
+FileWrapper* FileWrapper::Create()
+{
+ return new FileWrapperImpl();
+}
+
+FileWrapperImpl::FileWrapperImpl()
+ : _id(NULL),
+ _open(false),
+ _looping(false),
+ _readOnly(false),
+ _text(false),
+ _maxSizeInBytes(-1),
+ _sizeInBytes(0)
+{
+ memset(_fileNameUTF8, 0, kMaxFileNameSize);
+}
+
+FileWrapperImpl::~FileWrapperImpl()
+{
+ if (_id != NULL)
+ {
+ fclose(_id);
+ }
+}
+
+WebRtc_Word32 FileWrapperImpl::CloseFile()
+{
+ if (_id != NULL)
+ {
+ fclose(_id);
+ _id = NULL;
+ }
+ memset(_fileNameUTF8, 0, kMaxFileNameSize);
+ _open = false;
+ return 0;
+}
+
+int FileWrapperImpl::Rewind()
+{
+ if(_looping || !_readOnly)
+ {
+ if (_id != NULL)
+ {
+ _sizeInBytes = 0;
+ return fseek(_id, 0, SEEK_SET);
+ }
+ }
+ return -1;
+}
+
+WebRtc_Word32 FileWrapperImpl::SetMaxFileSize(WebRtc_Word32 bytes)
+{
+ _maxSizeInBytes = bytes;
+ return 0;
+}
+
+WebRtc_Word32 FileWrapperImpl::Flush()
+{
+ if (_id != NULL)
+ {
+ return fflush(_id);
+ }
+ return -1;
+}
+
+WebRtc_Word32 FileWrapperImpl::FileName(WebRtc_Word8* fileNameUTF8,
+ WebRtc_UWord32 size) const
+{
+ WebRtc_Word32 len = static_cast<WebRtc_Word32>(strlen(_fileNameUTF8));
+ if(len > kMaxFileNameSize)
+ {
+ assert(false);
+ return -1;
+ }
+ if(len < 1)
+ {
+ return -1;
+ }
+ // Make sure to NULL terminate
+ if(size < (WebRtc_UWord32)len)
+ {
+ len = size - 1;
+ }
+ memcpy(fileNameUTF8, _fileNameUTF8, len);
+ fileNameUTF8[len] = 0;
+ return 0;
+}
+
+bool
+FileWrapperImpl::Open() const
+{
+ return _open;
+}
+
+WebRtc_Word32 FileWrapperImpl::OpenFile(const WebRtc_Word8 *fileNameUTF8,
+ const bool readOnly, const bool loop,
+ const bool text)
+{
+ WebRtc_Word32 length = (WebRtc_Word32)strlen(fileNameUTF8);
+ if (length > kMaxFileNameSize)
+ {
+ return -1;
+ }
+
+ _readOnly = readOnly;
+
+ FILE *tmpId = NULL;
+#if defined _WIN32
+ wchar_t wideFileName[kMaxFileNameSize];
+ wideFileName[0] = 0;
+
+ MultiByteToWideChar(CP_UTF8,
+ 0 /*UTF8 flag*/,
+ fileNameUTF8,
+ -1 /*Null terminated string*/,
+ wideFileName,
+ kMaxFileNameSize);
+ if(text)
+ {
+ if(readOnly)
+ {
+ tmpId = _wfopen(wideFileName, L"rt");
+ } else {
+ tmpId = _wfopen(wideFileName, L"wt");
+ }
+ } else {
+ if(readOnly)
+ {
+ tmpId = _wfopen(wideFileName, L"rb");
+ } else {
+ tmpId = _wfopen(wideFileName, L"wb");
+ }
+ }
+#else
+ if(text)
+ {
+ if(readOnly)
+ {
+ tmpId = fopen(fileNameUTF8, "rt");
+ } else {
+ tmpId = fopen(fileNameUTF8, "wt");
+ }
+ } else {
+ if(readOnly)
+ {
+ tmpId = fopen(fileNameUTF8, "rb");
+ } else {
+ tmpId = fopen(fileNameUTF8, "wb");
+ }
+ }
+#endif
+
+ if (tmpId != NULL)
+ {
+ // + 1 comes fro copying the NULL termination charachter too
+ memcpy(_fileNameUTF8, fileNameUTF8, length + 1);
+ if (_id != NULL)
+ {
+ fclose(_id);
+ }
+ _id = tmpId;
+ _looping = loop;
+ _open = true;
+ return 0;
+ }
+ return -1;
+}
+
+int FileWrapperImpl::Read(void *buf, int len)
+{
+ if(len < 0)
+ {
+ return 0;
+ }
+ if (_id != NULL)
+ {
+ WebRtc_Word32 res = static_cast<WebRtc_Word32>(fread(buf, 1, len, _id));
+ if (res != len)
+ {
+ if(!_looping)
+ {
+ CloseFile();
+ }
+ }
+ return res;
+ }
+ return -1;
+}
+
+WebRtc_Word32 FileWrapperImpl::WriteText(const WebRtc_Word8* text, ...)
+{
+ assert(!_readOnly);
+ assert(!_text);
+
+ if (_id == NULL)
+ {
+ return -1;
+ }
+
+ char tempBuff[kFileMaxTextMessageSize];
+ if (text)
+ {
+ va_list args;
+ va_start(args, text);
+#ifdef _WIN32
+ _vsnprintf(tempBuff, kFileMaxTextMessageSize-1, text, args);
+#else
+ vsnprintf(tempBuff, kFileMaxTextMessageSize-1, text, args);
+#endif
+ va_end(args);
+ WebRtc_Word32 nBytes;
+ nBytes = fprintf(_id, "%s", tempBuff);
+ if (nBytes > 0)
+ {
+ return 0;
+ }
+ CloseFile();
+ }
+ return -1;
+}
+
+bool FileWrapperImpl::Write(const void* buf, int len)
+{
+ assert(!_readOnly);
+ if (_id != NULL)
+ {
+ // Check if it's time to stop writing.
+ if ((_maxSizeInBytes != -1) &&
+ _sizeInBytes + len > (WebRtc_UWord32)_maxSizeInBytes)
+ {
+ Flush();
+ return false;
+ }
+
+ size_t nBytes = fwrite((WebRtc_UWord8*)buf, 1, len, _id);
+ if (nBytes > 0)
+ {
+ _sizeInBytes += static_cast<WebRtc_Word32>(nBytes);
+ return true;
+ }
+ CloseFile();
+ }
+ return false;
+}
+} // namespace webrtc