Fix incorrect CPDFSDK_PageView::CountAnnots().
[pdfium.git] / core / src / fxcrt / fxcrt_platforms.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../include/fxcrt/fx_basic.h"
8 #include "fxcrt_platforms.h"
9
10 #if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && \
11      _FXM_PLATFORM_ != _FXM_PLATFORM_LINUX_ &&   \
12      _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ &&   \
13      _FXM_PLATFORM_ != _FXM_PLATFORM_ANDROID_)
14 IFXCRT_FileAccess* FXCRT_FileAccess_Create() {
15   return new CFXCRT_FileAccess_CRT;
16 }
17 void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString& bsMode) {
18   if (dwModes & FX_FILEMODE_ReadOnly) {
19     bsMode = FX_BSTRC("rb");
20   } else if (dwModes & FX_FILEMODE_Truncate) {
21     bsMode = FX_BSTRC("w+b");
22   } else {
23     bsMode = FX_BSTRC("a+b");
24   }
25 }
26 void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString& wsMode) {
27   if (dwModes & FX_FILEMODE_ReadOnly) {
28     wsMode = FX_WSTRC(L"rb");
29   } else if (dwModes & FX_FILEMODE_Truncate) {
30     wsMode = FX_WSTRC(L"w+b");
31   } else {
32     wsMode = FX_WSTRC(L"a+b");
33   }
34 }
35 CFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT() : m_hFile(NULL) {}
36 CFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT() {
37   Close();
38 }
39 FX_BOOL CFXCRT_FileAccess_CRT::Open(const CFX_ByteStringC& fileName,
40                                     FX_DWORD dwMode) {
41   if (m_hFile) {
42     return FALSE;
43   }
44   CFX_ByteString strMode;
45   FXCRT_GetFileModeString(dwMode, strMode);
46   m_hFile = FXSYS_fopen(fileName.GetCStr(), strMode.c_str());
47   return m_hFile != NULL;
48 }
49 FX_BOOL CFXCRT_FileAccess_CRT::Open(const CFX_WideStringC& fileName,
50                                     FX_DWORD dwMode) {
51   if (m_hFile) {
52     return FALSE;
53   }
54   CFX_WideString strMode;
55   FXCRT_GetFileModeString(dwMode, strMode);
56   m_hFile = FXSYS_wfopen(fileName.GetPtr(), strMode.c_str());
57   return m_hFile != NULL;
58 }
59 void CFXCRT_FileAccess_CRT::Close() {
60   if (!m_hFile) {
61     return;
62   }
63   FXSYS_fclose(m_hFile);
64   m_hFile = NULL;
65 }
66 void CFXCRT_FileAccess_CRT::Release() {
67   delete this;
68 }
69 FX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const {
70   if (!m_hFile) {
71     return 0;
72   }
73   FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);
74   FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);
75   FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);
76   FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
77   return size;
78 }
79 FX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const {
80   if (!m_hFile) {
81     return (FX_FILESIZE)-1;
82   }
83   return (FX_FILESIZE)FXSYS_ftell(m_hFile);
84 }
85 FX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos) {
86   if (!m_hFile) {
87     return (FX_FILESIZE)-1;
88   }
89   FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
90   return (FX_FILESIZE)FXSYS_ftell(m_hFile);
91 }
92 size_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer) {
93   if (!m_hFile) {
94     return 0;
95   }
96   return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
97 }
98 size_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer) {
99   if (!m_hFile) {
100     return 0;
101   }
102   return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
103 }
104 size_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer,
105                                       size_t szBuffer,
106                                       FX_FILESIZE pos) {
107   if (!m_hFile) {
108     return (FX_FILESIZE)-1;
109   }
110   FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
111   return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
112 }
113 size_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer,
114                                        size_t szBuffer,
115                                        FX_FILESIZE pos) {
116   if (!m_hFile) {
117     return (FX_FILESIZE)-1;
118   }
119   FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
120   return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
121 }
122 FX_BOOL CFXCRT_FileAccess_CRT::Flush() {
123   if (!m_hFile) {
124     return FALSE;
125   }
126   return !FXSYS_fflush(m_hFile);
127 }
128 FX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile) {
129   return FALSE;
130 }
131 FX_BOOL FX_File_Exist(const CFX_ByteStringC& fileName) {
132   return access(fileName.GetCStr(), F_OK) > -1;
133 }
134 FX_BOOL FX_File_Exist(const CFX_WideStringC& fileName) {
135   return FX_File_Exist(FX_UTF8Encode(fileName));
136 }
137 FX_BOOL FX_File_Delete(const CFX_ByteStringC& fileName) {
138   return remove(fileName.GetCStr()) > -1;
139 }
140 FX_BOOL FX_File_Delete(const CFX_WideStringC& fileName) {
141   return FX_File_Delete(FX_UTF8Encode(fileName));
142 }
143 FX_BOOL FX_File_Copy(const CFX_ByteStringC& fileNameSrc,
144                      const CFX_ByteStringC& fileNameDst) {
145   CFXCRT_FileAccess_CRT src, dst;
146   if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
147     return FALSE;
148   }
149   FX_FILESIZE size = src.GetSize();
150   if (!size) {
151     return FALSE;
152   }
153   if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
154     return FALSE;
155   }
156   FX_FILESIZE num = 0;
157   uint8_t* pBuffer = FX_Alloc(uint8_t, 32768);
158   while (num = src.Read(pBuffer, 32768)) {
159     if (dst.Write(pBuffer, num) != num) {
160       break;
161     }
162   }
163   FX_Free(pBuffer);
164   return TRUE;
165 }
166 FX_BOOL FX_File_Copy(const CFX_WideStringC& fileNameSrc,
167                      const CFX_WideStringC& fileNameDst) {
168   return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
169 }
170 FX_BOOL FX_File_Move(const CFX_ByteStringC& fileNameSrc,
171                      const CFX_ByteStringC& fileNameDst) {
172   return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
173 }
174 FX_BOOL FX_File_Move(const CFX_WideStringC& fileNameSrc,
175                      const CFX_WideStringC& fileNameDst) {
176   return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
177 }
178 #endif