1 USING: alien alien.c-types combinators
2 io io.backend io.buffers io.files io.nonblocking io.sockets
3 io.sockets.impl io.windows kernel libc math namespaces
4 prettyprint qualified sequences strings threads threads.private
5 windows windows.kernel32 ;
6 QUALIFIED: windows.winsock
9 ! M: windows-ce-io normalize-pathname ( string -- string )
10 ! dup 1 tail* CHAR: \\ = [ "*" append ] [ "\\*" append ] if ;
12 M: windows-ce-io CreateFile-flags ( -- DWORD ) FILE_ATTRIBUTE_NORMAL ;
13 M: windows-ce-io FileArgs-overlapped ( port -- f ) drop f ;
14 M: windows-ce-io io-multiplex ( ms -- ) (sleep) ;
15 M: windows-ce-io add-completion ( port -- ? ) drop f ;
17 : port-errored ( port -- )
18 win32-error-string swap set-port-error ;
20 GENERIC: wince-read ( port port-handle -- )
22 M: win32-file wince-read
23 drop dup make-FileArgs dup setup-read ReadFile zero? [
26 FileArgs-lpNumberOfBytesRet *uint dup zero? [
44 : make-WSAArgs ( port -- <WSARecv> )
45 [ port-handle win32-file-handle ] keep
46 delegate 1 "DWORD" <c-object> f f f <WSAArgs> ;
48 : setup-WSARecv ( <WSAArgs> -- s lpBuffers dwBufferCount lpNumberOfBytesRet lpFlags lpOverlapped lpCompletionRoutine )
51 WSAArgs-lpBuffers [ buffer-capacity ] keep
54 [ windows.winsock:set-WSABUF-buf ] keep
55 [ windows.winsock:set-WSABUF-len ] keep
57 [ WSAArgs-dwBufferCount ] keep
58 [ WSAArgs-lpNumberOfBytesRet ] keep
59 [ WSAArgs-lpFlags ] keep
60 [ WSAArgs-lpOverlapped ] keep
61 WSAArgs-lpCompletionRoutine ;
63 ! M: win32-socket wince-read ( port port-handle -- )
64 ! drop dup make-WSAArgs dup setup-WSARecv WSARecv zero? [
67 ! WSAArgs-lpNumberOfBytesRet *uint dup zero? [
69 ! t swap set-port-eof?
75 M: win32-socket wince-read ( port port-handle -- )
76 win32-file-handle over
77 delegate [ buffer-end ] keep buffer-capacity 0
78 windows.winsock:recv dup windows.winsock:SOCKET_ERROR = [
89 M: input-port (wait-to-read) ( port -- )
90 dup port-handle wince-read ;
92 GENERIC: wince-write ( port port-handle -- )
94 M: win32-file wince-write ( port port-handle -- )
95 drop dup make-FileArgs dup setup-write WriteFile zero? [
98 FileArgs-lpNumberOfBytesRet *uint ! *DWORD
99 over delegate [ buffer-consume ] keep
107 : setup-WSASend ( <WSAArgs> -- s lpBuffers dwBufferCount lpNumberOfBytesRet lpFlags lpOverlapped lpCompletionRoutine )
110 WSAArgs-lpBuffers [ buffer-length ] keep
113 [ windows.winsock:set-WSABUF-buf ] keep
114 [ windows.winsock:set-WSABUF-len ] keep
116 [ WSAArgs-dwBufferCount ] keep
117 [ WSAArgs-lpNumberOfBytesRet ] keep
118 [ WSAArgs-lpFlags ] keep
119 [ WSAArgs-lpOverlapped ] keep
120 WSAArgs-lpCompletionRoutine ;
122 ! M: win32-socket wince-write ( port port-handle -- )
123 ! drop dup make-WSAArgs dup setup-WSASend WSASend zero? [
126 ! FileArgs-lpNumberOfBytesRet *uint ! *DWORD
127 ! over delegate [ buffer-consume ] keep
128 ! buffer-length 0 > [
135 M: win32-socket wince-write ( port port-handle -- )
136 win32-file-handle over
137 delegate [ buffer@ ] keep
138 buffer-length 0 windows.winsock:send dup windows.winsock:SOCKET_ERROR = [
141 over delegate [ buffer-consume ] keep
149 M: windows-ce-io flush-output ( port -- )
150 dup port-handle wince-write ;
152 M: windows-ce-io WSASocket-flags ( -- DWORD ) 0 ;
154 : do-connect ( addrspec -- socket )
155 [ tcp-socket dup ] keep
156 make-sockaddr heap-size
157 f f f f windows.winsock:WSAConnect zero? [
158 winsock-error-string throw
161 M: windows-ce-io (client) ( addrspec -- duplex-stream )
162 do-connect <win32-socket> dup handle>duplex-stream ;
164 M: windows-ce-io <server> ( addrspec -- duplex-stream )
166 windows.winsock:SOCK_STREAM server-fd
168 <win32-socket> f <port>
169 ] keep <server-port> ;
171 M: windows-ce-io accept ( server -- client )
172 dup check-server-port
175 [ port-handle win32-file-handle ] keep
176 server-port-addr sockaddr-type heap-size
177 [ "char" <c-array> ] keep [
180 windows.winsock:WSAAccept dup windows.winsock:INVALID_SOCKET = [
181 winsock-error-string throw
184 ] keep server-port-addr parse-sockaddr swap
185 <win32-socket> dup handle>duplex-stream <client-stream> ;
187 T{ windows-ce-io } io-backend set-global
189 M: windows-ce-io init-io ( -- )
192 M: windows-ce-io <datagram> ( addrspec -- datagram )
194 windows.winsock:SOCK_DGRAM server-fd <win32-socket> f <port>
195 ] keep <datagram-port> ;
197 M: windows-ce-io receive ( datagram -- packet addrspec )
198 dup check-datagram-port
200 port-handle delegate win32-file-handle
202 default-buffer-size over windows.winsock:set-WSABUF-len
203 default-buffer-size "char" <c-array> over windows.winsock:set-WSABUF-buf
208 64 "char" <c-array> [
212 windows.winsock:WSARecvFrom zero? [
213 winsock-error-string throw
219 ! sockaddr count buf datagram
220 >r windows.winsock:WSABUF-buf swap memory>string swap r>
221 datagram-port-addr parse-sockaddr ;
223 M: windows-ce-io send ( packet addrspec datagram -- )
224 3dup check-datagram-send
225 delegate port-handle delegate win32-file-handle
226 rot dup length "WSABUF" <c-object>
227 [ windows.winsock:set-WSABUF-len ] keep
228 [ windows.winsock:set-WSABUF-buf ] keep
230 rot make-sockaddr heap-size
231 >r >r 1 0 <uint> 0 r> r> f f
232 windows.winsock:WSASendTo zero? [
233 winsock-error-string throw