]> git.saurik.com Git - wxWidgets.git/blame - src/msw/wince/filefnwce.cpp
Define ACO_AUTOAPPEND for MinGW/Cygwin.
[wxWidgets.git] / src / msw / wince / filefnwce.cpp
CommitLineData
6294ac2e 1/////////////////////////////////////////////////////////////////////////////
7520f3da 2// Name: src/msw/wince/filefn.cpp
6294ac2e
VZ
3// Purpose: File- and directory-related functions
4// Author: Julian Smart
5// Modified by:
6// Created: 29/01/98
7// RCS-ID: $Id$
8// Copyright: (c) 1998 Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
6294ac2e
VZ
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
6294ac2e
VZ
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
7520f3da
WS
27#include "wx/file.h"
28
6294ac2e
VZ
29#include <ctype.h>
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
6294ac2e 33
08c63240 34#ifdef __WXWINCE__
45d9ef07 35#include "wx/msw/wince/missing.h"
6294ac2e 36
52de37c7 37int wxCRT_Open(const wxChar *filename, int oflag, int WXUNUSED(pmode))
6294ac2e
VZ
38{
39 DWORD access = 0;
40 DWORD shareMode = 0;
41 DWORD disposition = 0;
42
43 if ((oflag & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY)
44 {
45 access = GENERIC_READ;
46 shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE;
61577c61 47 disposition = OPEN_EXISTING;
6294ac2e
VZ
48 }
49 else if ((oflag & (O_RDONLY | O_WRONLY | O_RDWR)) == O_WRONLY)
50 {
51 access = GENERIC_WRITE;
61577c61 52 disposition = OPEN_ALWAYS;
6294ac2e
VZ
53 }
54 else if ((oflag & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDWR)
55 {
56 access = GENERIC_READ|GENERIC_WRITE;
61577c61 57 disposition = OPEN_ALWAYS;
6294ac2e 58 }
61577c61 59
6294ac2e
VZ
60 if (oflag & O_APPEND)
61 {
62 if ( wxFile::Exists(filename) )
63 {
64 access |= GENERIC_WRITE;
65 shareMode = FILE_SHARE_READ;
66 disposition = OPEN_EXISTING;
67 }
6294ac2e 68 else
61577c61 69 {
6294ac2e 70 oflag |= O_TRUNC;
61577c61 71 }
6294ac2e
VZ
72 }
73 if (oflag & O_TRUNC)
74 {
75 access |= GENERIC_WRITE;
76 shareMode = 0;
61577c61 77 disposition = oflag & O_CREAT ? CREATE_ALWAYS : TRUNCATE_EXISTING;
6294ac2e
VZ
78 }
79 else if (oflag & O_CREAT)
80 {
81 access |= GENERIC_WRITE;
82 shareMode = 0;
83 disposition = CREATE_NEW;
84 }
85 else if (oflag & O_EXCL)
86 {
87 access |= GENERIC_WRITE;
88 shareMode = 0;
89 disposition = TRUNCATE_EXISTING;
90 }
91
92 int fd = 0;
93 HANDLE fileHandle = ::CreateFile(filename, access, shareMode, NULL,
94 disposition, FILE_ATTRIBUTE_NORMAL, 0);
95 if (fileHandle == INVALID_HANDLE_VALUE)
96 fd = -1;
97 else
98 fd = (int) fileHandle;
99
100 return fd;
101}
102
52de37c7 103int wxCRT_Access(const wxChar *name, int WXUNUSED(how))
6294ac2e
VZ
104{
105 HANDLE fileHandle = ::CreateFile(name, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
106 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
107
108 if (fileHandle == INVALID_HANDLE_VALUE)
109 return -1;
110
111 CloseHandle(fileHandle);
112
113 return 0;
114}
115
116int wxClose(int fd)
117{
118 if (CloseHandle((HANDLE)fd))
119 return 0;
120 return -1;
121}
122
123int wxEof(int fd)
124{
ff24aeb7 125 DWORD off0 = SetFilePointer((HANDLE) fd, 0, NULL, FILE_CURRENT);
6294ac2e
VZ
126 if (off0 == 0xFFFFFFFF && GetLastError() != NO_ERROR)
127 return -1;
7520f3da 128
ff24aeb7 129 DWORD off1 = SetFilePointer((HANDLE) fd, 0, NULL, FILE_END);
6294ac2e
VZ
130 if (off1 == 0xFFFFFFFF && GetLastError() != NO_ERROR)
131 return -1;
7520f3da 132
ff24aeb7 133 if (off0 == off1)
6294ac2e
VZ
134 return 1;
135 else
136 {
ff24aeb7 137 SetFilePointer((HANDLE) fd, off0, NULL, FILE_BEGIN);
6294ac2e
VZ
138 return 0;
139 }
140}
141
142int wxRead(int fd, void *buf, unsigned int count)
143{
144 DWORD bytesRead = 0;
145
146 if (ReadFile((HANDLE) fd, buf, (DWORD) count, &bytesRead, NULL))
147 return bytesRead;
148 else
149 return -1;
150}
151
152int wxWrite(int fd, const void *buf, unsigned int count)
153{
154 DWORD bytesWritten = 0;
155
156 if (WriteFile((HANDLE) fd, buf, (DWORD) count, &bytesWritten, NULL))
157 return bytesWritten;
158 else
159 return -1;
160}
161
162__int64 wxSeek(int fd, __int64 offset, int origin)
163{
164 int method;
165 switch ( origin ) {
166 default:
167 wxFAIL_MSG(_("unknown seek origin"));
168
169 case SEEK_SET:
170 method = FILE_BEGIN;
171 break;
172
173 case SEEK_CUR:
174 method = FILE_CURRENT;
175 break;
176
177 case SEEK_END:
178 method = FILE_END;
179 break;
180 }
181
ff24aeb7 182 DWORD res = SetFilePointer((HANDLE) fd, offset, NULL, method) ;
6294ac2e
VZ
183 if (res == 0xFFFFFFFF && GetLastError() != NO_ERROR)
184 {
185 wxLogSysError(_("can't seek on file descriptor %d"), fd);
186 return wxInvalidOffset;
187 }
188 else
189 return (off_t)res;
190}
191
192__int64 wxTell(int fd)
193{
ff24aeb7
JS
194 // WinCE apparently doesn't support lpDistanceToMoveHigh.
195 // LONG high = 0;
196 DWORD res = SetFilePointer((HANDLE) fd, 0, NULL, FILE_CURRENT) ;
6294ac2e
VZ
197 if (res == 0xFFFFFFFF && GetLastError() != NO_ERROR)
198 {
199 wxLogSysError(_("can't get seek position on file descriptor %d"), fd);
200 return wxInvalidOffset;
201 }
202 else
ff24aeb7 203 return res ; // + (((__int64)high) << 32);
6294ac2e
VZ
204}
205
206int wxFsync(int WXUNUSED(fd))
207{
208 return 0;
209}
210
08c63240 211#endif //__WXWINCE__