OLD | NEW |
| (Empty) |
1 import traceback | |
2 | |
3 # possibly figure out how to subclass these or something | |
4 | |
5 cdef class PyCFRunLoopTimer: | |
6 cdef CFRunLoopTimerRef cf | |
7 cdef public object callout | |
8 cdef CFRunLoopTimerContext context | |
9 | |
10 def __new__(self, double fireDate, double interval, callout): | |
11 self.callout = callout | |
12 self.context.version = 0 | |
13 self.context.info = <void *>self | |
14 self.context.retain = NULL | |
15 self.context.release = NULL | |
16 self.context.copyDescription = NULL | |
17 self.cf = CFRunLoopTimerCreate(kCFAllocatorDefault, fireDate, interval,
0, 0, <CFRunLoopTimerCallBack>&gilRunLoopTimerCallBack, &self.context) | |
18 if self.cf == NULL: | |
19 raise ValueError("Invalid Socket") | |
20 | |
21 def getNextFireDate(self): | |
22 return CFRunLoopTimerGetNextFireDate(self.cf) | |
23 | |
24 def setNextFireDate(self, double fireDate): | |
25 CFRunLoopTimerSetNextFireDate(self.cf, fireDate) | |
26 | |
27 def invalidate(self): | |
28 CFRunLoopTimerInvalidate(self.cf) | |
29 | |
30 def __dealloc__(self): | |
31 if self.cf != NULL: | |
32 CFRelease(self.cf) | |
33 | |
34 cdef void runLoopTimerCallBack(CFRunLoopTimerRef timer, void *info): | |
35 cdef PyCFRunLoopTimer obj | |
36 obj = <PyCFRunLoopTimer>info | |
37 try: | |
38 if obj.callout: | |
39 obj.callout() | |
40 except: | |
41 traceback.print_exc() | |
42 | |
43 cdef void gilRunLoopTimerCallBack(CFRunLoopTimerRef timer, void *info): | |
44 cdef PyGILState_STATE gil | |
45 gil = PyGILState_Ensure() | |
46 runLoopTimerCallBack(timer, info) | |
47 PyGILState_Release(gil) | |
48 | |
49 cdef class PyCFRunLoop: | |
50 cdef public object cf | |
51 | |
52 def __new__(self, runLoop=None): | |
53 cdef CFTypeRef _runLoop | |
54 if runLoop is None: | |
55 _runLoop = CFRunLoopGetCurrent() | |
56 else: | |
57 if CFObj_Convert(runLoop, &_runLoop) == 0: | |
58 raise | |
59 #return -1 | |
60 # this is going to leak a reference | |
61 self.cf = CFObj_New(CFRetain(_runLoop)) | |
62 | |
63 def run(self): | |
64 CFRunLoopRun() | |
65 | |
66 def stop(self): | |
67 cdef CFTypeRef _runLoop | |
68 if CFObj_Convert(self.cf, &_runLoop) == 0: | |
69 raise ValueError, "CFRunLoopReference is invalid" | |
70 CFRunLoopStop(_runLoop) | |
71 | |
72 def currentMode(self): | |
73 cdef CFTypeRef _currentMode | |
74 cdef CFTypeRef _runLoop | |
75 if CFObj_Convert(self.cf, &_runLoop) == 0: | |
76 raise ValueError, "CFRunLoopReference is invalid" | |
77 _currentMode = CFRunLoopCopyCurrentMode(_runLoop) | |
78 if _currentMode == NULL: | |
79 return None | |
80 return CFObj_New(_currentMode) | |
81 | |
82 def addSocket(self, PyCFSocket socket not None): | |
83 cdef CFTypeRef _runLoop | |
84 if CFObj_Convert(self.cf, &_runLoop) == 0: | |
85 raise ValueError, "CFRunLoopReference is invalid" | |
86 CFRunLoopAddSource(_runLoop, socket.source, kCFRunLoopCommonModes) | |
87 | |
88 def removeSocket(self, PyCFSocket socket not None): | |
89 cdef CFTypeRef _runLoop | |
90 if CFObj_Convert(self.cf, &_runLoop) == 0: | |
91 raise ValueError, "CFRunLoopReference is invalid" | |
92 CFRunLoopRemoveSource(_runLoop, socket.source, kCFRunLoopCommonModes) | |
93 | |
94 def addTimer(self, PyCFRunLoopTimer timer not None): | |
95 cdef CFTypeRef _runLoop | |
96 if CFObj_Convert(self.cf, &_runLoop) == 0: | |
97 raise ValueError, "CFRunLoopReference is invalid" | |
98 CFRunLoopAddTimer(_runLoop, timer.cf, kCFRunLoopCommonModes) | |
99 | |
100 def removeTimer(self, PyCFRunLoopTimer timer not None): | |
101 cdef CFTypeRef _runLoop | |
102 if CFObj_Convert(self.cf, &_runLoop) == 0: | |
103 raise ValueError, "CFRunLoopReference is invalid" | |
104 CFRunLoopRemoveTimer(_runLoop, timer.cf, kCFRunLoopCommonModes) | |
OLD | NEW |