source: filezilla/trunk/fuentes/src/engine/file.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 3 years ago

First release to xenial

File size: 3.6 KB
Line 
1#include <filezilla.h>
2
3#include "file.h"
4
5CFile::CFile()
6{
7}
8
9CFile::CFile(wxString const& f, mode m, disposition d)
10{
11        Open(f, m, d);
12}
13
14CFile::~CFile()
15{
16        Close();
17}
18
19#ifdef __WXMSW__
20bool CFile::Open(wxString const& f, mode m, disposition d)
21{
22        Close();
23
24        DWORD dispositionFlags;
25        if (m == write) {
26                if (d == truncate) {
27                        dispositionFlags = CREATE_ALWAYS;
28                }
29                else {
30                        dispositionFlags = OPEN_ALWAYS;
31                }
32        }
33        else {
34                dispositionFlags = OPEN_EXISTING;
35        }
36
37        DWORD shareMode = FILE_SHARE_READ;
38        if (m == read) {
39                shareMode |= FILE_SHARE_WRITE;
40        }
41
42        hFile_ = CreateFile(f, (m == read) ? GENERIC_READ : GENERIC_WRITE, shareMode, 0, dispositionFlags, FILE_FLAG_SEQUENTIAL_SCAN, 0);
43
44        return hFile_ != INVALID_HANDLE_VALUE;
45}
46
47void CFile::Close()
48{
49        if (hFile_ != INVALID_HANDLE_VALUE) {
50                CloseHandle(hFile_);
51                hFile_ = INVALID_HANDLE_VALUE;
52        }
53}
54
55wxFileOffset CFile::Length() const
56{
57        wxFileOffset ret = -1;
58
59        LARGE_INTEGER size{};
60        if (GetFileSizeEx(hFile_, &size)) {
61                ret = size.QuadPart;
62        }
63        return ret;
64}
65
66wxFileOffset CFile::Seek(wxFileOffset offset, seekMode m)
67{
68        wxFileOffset ret = -1;
69
70        LARGE_INTEGER dist{};
71        dist.QuadPart = offset;
72
73        DWORD method = FILE_BEGIN;
74        if (m == current) {
75                method = FILE_CURRENT;
76        }
77        else if (m == end) {
78                method = FILE_END;
79        }
80
81        LARGE_INTEGER newPos{};
82        if (SetFilePointerEx(hFile_, dist, &newPos, method)) {
83                ret = newPos.QuadPart;
84        }
85        return ret;
86}
87
88bool CFile::Truncate()
89{
90        return !!SetEndOfFile(hFile_);
91}
92
93ssize_t CFile::Read(void *buf, size_t count)
94{
95        ssize_t ret = -1;
96
97        DWORD read = 0;
98        if (ReadFile(hFile_, buf, count, &read, 0)) {
99                ret = static_cast<ssize_t>(read);
100        }
101
102        return ret;
103}
104
105ssize_t CFile::Write(void const* buf, size_t count)
106{
107        ssize_t ret = -1;
108
109        DWORD written = 0;
110        if (WriteFile(hFile_, buf, count, &written, 0)) {
111                ret = static_cast<ssize_t>(written);
112        }
113
114        return ret;
115}
116
117bool CFile::Opened() const
118{
119        return hFile_ != INVALID_HANDLE_VALUE;
120}
121
122#else
123
124#include <errno.h>
125#include <sys/stat.h>
126
127bool CFile::Open(wxString const& f, mode m, disposition d)
128{
129        Close();
130
131        int flags = O_CLOEXEC;
132        if (m == read) {
133                flags |= O_RDONLY;
134        }
135        else {
136                flags |= O_WRONLY | O_CREAT;
137                if (d == truncate) {
138                        flags |= O_TRUNC;
139                }
140        }
141        fd_ = open(f.fn_str(), flags, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
142
143#if HAVE_POSIX_FADVISE
144        if (fd_ != -1) {
145                (void)posix_fadvise(fd_, 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE);
146        }
147#endif
148
149        return fd_ != -1;
150}
151
152void CFile::Close()
153{
154        if (fd_ != -1) {
155                close(fd_);
156                fd_ = -1;
157        }
158}
159
160wxFileOffset CFile::Length() const
161{
162        wxFileOffset ret = -1;
163
164        struct stat buf;
165        if (!fstat(fd_, &buf)) {
166                ret = buf.st_size;
167        }
168
169        return ret;
170}
171
172wxFileOffset CFile::Seek(wxFileOffset offset, seekMode m)
173{
174        wxFileOffset ret = -1;
175
176        int whence = SEEK_SET;
177        if (m == current) {
178                whence = SEEK_CUR;
179        }
180        else if (m == end) {
181                whence = SEEK_END;
182        }
183
184        auto newPos = lseek(fd_, offset, whence);
185        if (newPos != static_cast<off_t>(-1)) {
186                ret = newPos;
187        }
188
189        return ret;
190}
191
192bool CFile::Truncate()
193{
194        bool ret = false;
195
196        auto length = lseek(fd_, 0, SEEK_CUR);
197        if (length != static_cast<off_t>(-1)) {
198                do {
199                        ret = !ftruncate(fd_, length);
200                } while (!ret && (errno == EAGAIN || errno == EINTR));
201        }
202
203        return ret;
204}
205
206ssize_t CFile::Read(void *buf, size_t count)
207{
208        ssize_t ret;
209        do {
210                ret = ::read(fd_, buf, count);
211        } while (ret == -1 && (errno == EAGAIN || errno == EINTR));
212
213        return ret;
214}
215
216ssize_t CFile::Write(void const* buf, size_t count)
217{
218        ssize_t ret;
219        do {
220                ret = ::write(fd_, buf, count);
221        } while (ret == -1 && (errno == EAGAIN || errno == EINTR));
222
223        return ret;
224}
225
226bool CFile::Opened() const
227{
228        return fd_ != -1;
229}
230
231#endif
Note: See TracBrowser for help on using the repository browser.