5
cdef void socketCallBack(CFSocketRef s, CFSocketCallBackType _type, CFDataRef address, void *data, void *info):
9
socket = (<PyCFSocket>info)
10
#print "fileno = %r" % (socket.fileno,)
12
if _type == kCFSocketReadCallBack:
13
if socket.readcallback:
15
elif _type == kCFSocketWriteCallBack:
16
if socket.writecallback:
17
socket.writecallback()
18
elif _type == kCFSocketConnectCallBack:
23
if socket.connectcallback:
24
socket.connectcallback(res)
28
cdef void gilSocketCallBack(CFSocketRef s, CFSocketCallBackType _type, CFDataRef address, void *data, void *info):
29
cdef PyGILState_STATE gil
30
gil = PyGILState_Ensure()
31
socketCallBack(s, _type, address, data, info)
32
PyGILState_Release(gil)
34
cdef class PyCFSocket:
35
cdef public object readcallback
36
cdef public object writecallback
37
cdef public object connectcallback
38
cdef public object reading
39
cdef public object writing
41
cdef CFRunLoopSourceRef source
42
cdef readonly CFSocketNativeHandle fileno
43
cdef CFSocketContext context
45
def __new__(self, CFSocketNativeHandle fileno, readcallback=None, writecallback=None, connectcallback=None):
46
#print "new socket %r" % (fileno,)
48
self.readcallback = readcallback
49
self.writecallback = writecallback
50
self.connectcallback = connectcallback
51
self.context.version = 0
52
self.context.info = <void *>self
53
self.context.retain = NULL
54
self.context.release = NULL
55
self.context.copyDescription = NULL
58
self.cf = CFSocketCreateWithNative(kCFAllocatorDefault, fileno, kCFSocketConnectCallBack | kCFSocketReadCallBack | kCFSocketWriteCallBack, <CFSocketCallBack>&gilSocketCallBack, &self.context)
60
raise ValueError("Invalid Socket")
61
self.source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, self.cf, 10000)
62
if self.source == NULL:
63
raise ValueError("Couldn't create runloop source")
64
#print "made new socket"
70
mask = kCFSocketConnectCallBack | kCFSocketAcceptCallBack
72
automask = kCFSocketAutomaticallyReenableAcceptCallBack
74
mask = mask | kCFSocketReadCallBack
75
automask = automask | kCFSocketAutomaticallyReenableReadCallBack
77
offmask = offmask | kCFSocketReadCallBack
79
mask = mask | kCFSocketWriteCallBack
80
automask = automask | kCFSocketAutomaticallyReenableWriteCallBack
82
offmask = offmask | kCFSocketWriteCallBack
83
CFSocketDisableCallBacks(self.cf, offmask)
84
CFSocketEnableCallBacks(self.cf, mask)
85
CFSocketSetSocketFlags(self.cf, automask)
88
def startReading(self):
92
def stopReading(self):
96
def startWriting(self):
100
def stopWriting(self):
104
def __dealloc__(self):
105
#print "PyCFSocket(%r).__dealloc__()" % (self.fileno,)
106
if self.source != NULL:
107
CFRelease(self.source)
109
CFSocketInvalidate(self.cf)
111
#print "__dealloc__()"