Initial import to Tizen
[profile/ivi/python-twisted.git] / twisted / internet / iocpreactor / iocpsupport / wsarecv.pxi
1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
3
4
5 def recv(long s, object bufflist, object obj, unsigned long flags = 0):
6     cdef int rc, res
7     cdef myOVERLAPPED *ov
8     cdef WSABUF *ws_buf
9     cdef unsigned long bytes
10     cdef PyObject **buffers
11     cdef Py_ssize_t i, size, buffcount
12
13     bufflist = PySequence_Fast(bufflist, 'second argument needs to be a list')
14     buffcount = PySequence_Fast_GET_SIZE(bufflist)
15     buffers = PySequence_Fast_ITEMS(bufflist)
16
17     ws_buf = <WSABUF *>PyMem_Malloc(buffcount*sizeof(WSABUF))
18
19     try:
20         for i from 0 <= i < buffcount:
21             PyObject_AsWriteBuffer(<object>buffers[i], <void **>&ws_buf[i].buf, &size)
22             ws_buf[i].len = <DWORD>size
23
24         ov = makeOV()
25         if obj is not None:
26             ov.obj = <PyObject *>obj
27
28         rc = WSARecv(s, ws_buf, <DWORD>buffcount, &bytes, &flags, <OVERLAPPED *>ov, NULL)
29
30         if rc == SOCKET_ERROR:
31             rc = WSAGetLastError()
32             if rc != ERROR_IO_PENDING:
33                 PyMem_Free(ov)
34                 return rc, 0
35
36         Py_XINCREF(obj)
37         return rc, bytes
38     finally:
39         PyMem_Free(ws_buf)
40
41 def recvfrom(long s, object buff, object addr_buff, object addr_len_buff, object obj, unsigned long flags = 0):
42     cdef int rc, c_addr_buff_len, c_addr_len_buff_len
43     cdef myOVERLAPPED *ov
44     cdef WSABUF ws_buf
45     cdef unsigned long bytes
46     cdef sockaddr *c_addr_buff
47     cdef int *c_addr_len_buff
48     cdef Py_ssize_t size
49
50     PyObject_AsWriteBuffer(buff, <void **>&ws_buf.buf, &size)
51     ws_buf.len = <DWORD>size
52     PyObject_AsWriteBuffer(addr_buff, <void **>&c_addr_buff, &size)
53     c_addr_buff_len = <int>size
54     PyObject_AsWriteBuffer(addr_len_buff, <void **>&c_addr_len_buff, &size)
55     c_addr_len_buff_len = <int>size
56
57     if c_addr_len_buff_len != sizeof(int):
58         raise ValueError, 'length of address length buffer needs to be sizeof(int)'
59
60     c_addr_len_buff[0] = c_addr_buff_len
61
62     ov = makeOV()
63     if obj is not None:
64         ov.obj = <PyObject *>obj
65
66     rc = WSARecvFrom(s, &ws_buf, 1, &bytes, &flags, c_addr_buff, c_addr_len_buff, <OVERLAPPED *>ov, NULL)
67
68     if rc == SOCKET_ERROR:
69         rc = WSAGetLastError()
70         if rc != ERROR_IO_PENDING:
71             PyMem_Free(ov)
72             return rc, 0
73
74     Py_XINCREF(obj)
75     return rc, bytes
76