move sections
[python/dscho.git] / Mac / Modules / qt / qtscan.py
blobcd001244f62e776920b91b78938c055ab1c3768a
1 # Scan an Apple header file, generating a Python file of generator calls.
3 import sys
4 from bgenlocations import TOOLBOXDIR, BGENDIR
5 sys.path.append(BGENDIR)
6 from scantools import Scanner
8 LONG = "QuickTime"
9 SHORT = "qt"
10 HEADERFILES= (
11 # "Components.h" -- In Carbon.Cm
12 "Movies.h",
13 "ImageCompression.h",
14 "QuickTimeComponents.h",
15 # "ImageCodec.h" -- seems not too useful, and difficult.
16 # "IsochronousDataHandlers.h" -- Is this useful?
17 "MediaHandlers.h",
18 # "QTML.h", -- Windows only, needs separate module
19 # "QuickTimeStreaming.h", -- Difficult
20 # "QTStreamingComponents.h", -- Needs QTStreaming
21 "QuickTimeMusic.h",
22 # "QuickTimeVR.h", -- Not done yet
23 # "Sound.h", -- In Carbon.Snd
25 OBJECTS = ("Movie", "Track", "Media", "UserData", "TimeBase", "MovieController",
26 "IdleManager", "SGOutput")
28 def main():
29 input = HEADERFILES
30 output = SHORT + "gen.py"
31 defsoutput = TOOLBOXDIR + LONG + ".py"
32 scanner = MyScanner(input, output, defsoutput)
33 scanner.scan()
34 scanner.close()
35 scanner.gentypetest(SHORT+"typetest.py")
36 print "=== Testing definitions output code ==="
37 execfile(defsoutput, {}, {})
38 print "=== Done scanning and generating, now importing the generated code... ==="
39 exec "import " + SHORT + "support"
40 print "=== Done. It's up to you to compile it now! ==="
42 class MyScanner(Scanner):
44 def destination(self, type, name, arglist):
45 classname = "Function"
46 listname = "functions"
47 if arglist:
48 t, n, m = arglist[0]
49 if t in OBJECTS and m == "InMode":
50 classname = "Method"
51 listname = t + "_methods"
52 return classname, listname
54 def writeinitialdefs(self):
55 self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
56 self.defsfile.write("xmlIdentifierUnrecognized = -1\n")
57 self.defsfile.write("kControllerMinimum = -0xf777\n")
58 self.defsfile.write("notImplementedMusicOSErr = -2071\n")
59 self.defsfile.write("cantSendToSynthesizerOSErr = -2072\n")
60 self.defsfile.write("cantReceiveFromSynthesizerOSErr = -2073\n")
61 self.defsfile.write("illegalVoiceAllocationOSErr = -2074\n")
62 self.defsfile.write("illegalPartOSErr = -2075\n")
63 self.defsfile.write("illegalChannelOSErr = -2076\n")
64 self.defsfile.write("illegalKnobOSErr = -2077\n")
65 self.defsfile.write("illegalKnobValueOSErr = -2078\n")
66 self.defsfile.write("illegalInstrumentOSErr = -2079\n")
67 self.defsfile.write("illegalControllerOSErr = -2080\n")
68 self.defsfile.write("midiManagerAbsentOSErr = -2081\n")
69 self.defsfile.write("synthesizerNotRespondingOSErr = -2082\n")
70 self.defsfile.write("synthesizerOSErr = -2083\n")
71 self.defsfile.write("illegalNoteChannelOSErr = -2084\n")
72 self.defsfile.write("noteChannelNotAllocatedOSErr = -2085\n")
73 self.defsfile.write("tunePlayerFullOSErr = -2086\n")
74 self.defsfile.write("tuneParseOSErr = -2087\n")
76 def makeblacklistnames(self):
77 return [
78 "xmlIdentifierUnrecognized", # const with incompatible definition
79 "DisposeMovie", # Done on python-object disposal
80 "DisposeMovieTrack", # ditto
81 "DisposeTrackMedia", # ditto
82 "DisposeUserData", # ditto
83 # "DisposeTimeBase", # ditto
84 "DisposeMovieController", # ditto
86 # The following 4 use 'void *' in an uncontrolled way
87 # TBD when I've read the manual...
88 "GetUserDataItem",
89 "SetUserDataItem",
90 "SetTextSampleData",
91 "BeginFullScreen",
92 # bgen gets the argument in/out wrong..
93 "AddTextSample",
94 "AddTESample",
95 "AddHiliteSample",
96 "HiliteTextSample",
98 "MakeTrackTimeTable", # Uses long * return?
99 "MakeMediaTimeTable", # ditto
100 ## "VideoMediaGetStallCount", # Undefined in CW Pro 3 library
101 # OS8 only:
102 'SpriteMediaGetIndImageProperty', # XXXX Why isn't this in carbon?
103 'CheckQuickTimeRegistration',
104 'SetMovieAnchorDataRef',
105 'GetMovieAnchorDataRef',
106 'GetMovieLoadState',
107 'OpenADataHandler',
108 'MovieMediaGetCurrentMovieProperty',
109 'MovieMediaGetCurrentTrackProperty',
110 'MovieMediaGetChildMovieDataReference',
111 'MovieMediaSetChildMovieDataReference',
112 'MovieMediaLoadChildMovieFromDataReference',
113 'Media3DGetViewObject',
115 # these are ImageCompression blacklists
116 "GraphicsExportGetInputPtr",
118 # QuickTimeComponents
119 # These two need some help: the first returns a point to a databuffer that
120 # the second disposes. Generate manually?
121 "VDCompressDone",
122 "VDReleaseCompressBuffer",
123 "QTVideoOutputGetGWorldParameters", # How useful is this?
125 # MediaHandlers
126 "MediaMakeMediaTimeTable", # just lazy
127 "MediaGetSampleDataPointer", # funny output pointer
129 # QuickTimeMusic
130 "kControllerMinimum",
131 # These are artefacts of a macro definition
132 "ulen",
133 "_ext",
134 "x",
135 "w1",
136 "w2",
139 def makeblacklisttypes(self):
140 return [
141 # I don't think we want to do these
142 "QTSyncTaskPtr",
143 # We dont do callbacks yet, so no need for these
144 "QTCallBack",
145 # Skipped for now, due to laziness
146 "TrackEditState",
147 "MovieEditState",
148 "MatrixRecord",
149 "MatrixRecord_ptr",
150 "SampleReferencePtr",
151 "QTTweener",
152 "QTErrorReplacementPtr",
153 "QTRestrictionSet",
154 "QTUUID",
155 "QTUUID_ptr",
157 # Routine pointers, not yet.
158 "MoviesErrorUPP",
159 "MoviePreviewCallOutUPP",
160 "MovieDrawingCompleteUPP",
161 "QTCallBackUPP",
162 "TextMediaUPP",
163 "MovieProgressUPP",
164 "MovieRgnCoverUPP",
165 "MCActionFilterUPP",
166 "MCActionFilterWithRefConUPP",
167 "GetMovieUPP",
168 "ModalFilterUPP",
169 "TrackTransferUPP",
170 "MoviePrePrerollCompleteUPP",
171 "MovieExecuteWiredActionsUPP",
172 "QTBandwidthNotificationUPP",
173 "DoMCActionUPP",
174 "QTNextTaskNeededSoonerCallbackUPP",
176 "SampleReference64Ptr", # Don't know what this does, yet
177 "QTRuntimeSpriteDescPtr",
178 "QTBandwidthReference",
179 "QTScheduledBandwidthReference",
180 "QTAtomContainer",
181 "SpriteWorld",
182 "Sprite",
184 # these are ImageCompression blacklists
185 "ICMDataUPP",
186 "ICMFlushUPP",
187 "ICMCompletionUPP",
188 "ICMProgressUPP",
189 "StdPixUPP",
190 "QDPixUPP",
191 "ICMAlignmentUPP",
192 "ICMCursorShieldedUPP",
193 "ICMMemoryDisposedUPP",
194 "ICMConvertDataFormatUPP",
195 "ModalFilterYDUPP",
196 "FileFilterUPP",
198 "CodecNameSpecListPtr",
199 "CodecInfo",
200 "ImageSequence",
201 "MatrixRecordPtr",
202 "ICMDataProcRecordPtr",
203 "OpenCPicParams",
204 "ICMProgressProcRecordPtr",
205 "ICMAlignmentProcRecordPtr",
206 "ICMPixelFormatInfoPtr",
207 "ImageSequenceDataSource",
208 "ConstStrFileNameParam",
209 "ImageTranscodeSequence",
210 "ImageFieldSequence",
211 "Fract",
212 "PixMapPtr",
213 "GWorldFlags",
214 "void_ptr", # XXX Being lazy, this one is doable.
216 # These are from QuickTimeComponents
217 "CDataHandlerUPP",
218 "CharDataHandlerUPP",
219 "CommentHandlerUPP",
220 "DataHCompletionUPP",
221 "'MovieExportGetDataUPP",
222 "MovieExportGetPropertyUPP",
223 "PreprocessInstructionHandlerUPP",
224 "SGModalFilterUPP",
225 "StartDocumentHandlerUPP",
226 "StartElementHandlerUPP",
227 "VdigIntUPP",
228 "SGDataUPP",
229 "EndDocumentHandlerUPP",
230 "EndElementHandlerUPP",
231 "VideoBottles", # Record full of UPPs
233 "SCParams",
234 "ICMCompletionProcRecordPtr",
235 "DataHVolumeList",
236 "DigitizerInfo",
237 "SGCompressInfo",
238 "SeqGrabExtendedFrameInfoPtr",
239 "SeqGrabFrameInfoPtr",
240 "TCTextOptionsPtr",
241 "SGCompressInfo_ptr",
242 "SGDeviceList",
243 "TextDisplayData",
244 "TimeCodeDef",
245 "TimeCodeRecord",
246 "TweenRecord",
247 "VDGamRecPtr",
248 "ToneDescription", # XXXX Just lazy: this one is easy.
249 "XMLDoc",
250 "UInt64", # XXXX lazy
251 "UInt64_ptr", # XXXX lazy
253 # From MediaHandlers
254 "ActionsUPP",
255 "PrePrerollCompleteUPP",
256 "CodecComponentHandle", # Difficult: handle containing list of components.
257 "GetMovieCompleteParams", # Immense struct
258 "LevelMeterInfoPtr", # Lazy. Also: can be an output parameter!!
259 "MediaEQSpectrumBandsRecordPtr", # ditto
261 # From QuickTimeMusic
262 "MusicMIDISendUPP",
263 "MusicOfflineDataUPP",
264 "TuneCallBackUPP",
265 "TunePlayCallBackUPP",
266 "GCPart", # Struct with lots of fields
267 "GCPart_ptr",
268 "GenericKnobDescription", # Struct with lots of fields
269 "KnobDescription", # Struct with lots of fields
270 "InstrumentAboutInfo", # Struct, not too difficult
271 "NoteChannel", # XXXX Lazy. Could be opaque, I think
272 "NoteRequest", # XXXX Lazy. Not-too-difficult struct
273 "SynthesizerConnections", # Struct with lots of fields
274 "SynthesizerDescription", # Struct with lots of fields
275 "TuneStatus", # Struct with lots of fields
279 def makerepairinstructions(self):
280 return [
281 ([('FSSpec', '*', 'OutMode')], [('FSSpec_ptr', '*', 'InMode')]),
283 # Movie controller creation
284 ([('ComponentInstance', 'NewMovieController', 'ReturnMode')],
285 [('MovieController', '*', 'ReturnMode')]),
287 # NewMovieFromFile
288 ([('short', 'resId', 'OutMode'), ('StringPtr', 'resName', 'InMode')],
289 [('short', 'resId', 'InOutMode'), ('dummyStringPtr', 'resName', 'InMode')]),
291 # MCDoAction and more
292 ([('void', '*', 'OutMode')], [('mcactionparams', '*', 'InMode')]),
294 # SetTimeBaseZero. Does not handle NULLs, unfortunately
295 ([('TimeRecord', 'zero', 'OutMode')], [('TimeRecord', 'zero', 'InMode')]),
297 # ConvertTime and ConvertTimeScale
298 ([('TimeRecord', 'inout', 'OutMode')], [('TimeRecord', 'inout', 'InOutMode')]),
299 ([('TimeRecord', 'theTime', 'OutMode')], [('TimeRecord', 'theTime', 'InOutMode')]),
301 # AddTime and SubtractTime
302 ([('TimeRecord', 'dst', 'OutMode')], [('TimeRecord', 'dst', 'InOutMode')]),
304 # Funny definitions
305 ([('char_ptr', '*', 'InMode')], [('stringptr', '*', 'InMode')]),
306 ([('FSSpecPtr', '*', 'InMode')], [('FSSpec_ptr', '*', 'InMode')]),
307 ([('unsigned_char', 'swfVersion', 'OutMode')], [('UInt8', 'swfVersion', 'OutMode')]),
309 # It seems MusicMIDIPacket if never flagged with const but always used
310 # for sending only. If that ever changes this needs to be fixed.
311 ([('MusicMIDIPacket', '*', 'OutMode')], [('MusicMIDIPacket_ptr', '*', 'InMode')]),
313 # QTMusic const-less input parameters
314 ([('unsigned_long', 'header', 'OutMode')], [('UnsignedLongPtr', 'header', 'InMode')]),
317 if __name__ == "__main__":
318 main()