blob: b756bfe8274deb022477030b7b290d459aa687b4 [file] [log] [blame]
Jack Jansencb4eaad1995-11-30 15:03:59 +00001# Scan an Apple header file, generating a Python file of generator calls.
2
Jack Jansen0c4d9471998-04-17 14:07:56 +00003import sys
4import os
Jack Jansenaaebdd62002-08-05 15:39:30 +00005from bgenlocations import TOOLBOXDIR, BGENDIR
Jack Jansen0c4d9471998-04-17 14:07:56 +00006sys.path.append(BGENDIR)
Jack Jansencb4eaad1995-11-30 15:03:59 +00007from scantools import Scanner
8
9LONG = "QuickTime"
10SHORT = "qt"
Jack Jansen2e5e6442004-01-09 23:18:47 +000011HEADERFILES= (
Jack Jansen49be4cc2004-02-24 21:25:31 +000012# "Components.h" -- In Carbon.Cm
Jack Jansen2e5e6442004-01-09 23:18:47 +000013 "Movies.h",
14 "ImageCompression.h",
15 "QuickTimeComponents.h",
16# "ImageCodec.h" -- seems not too useful, and difficult.
Jack Jansen49be4cc2004-02-24 21:25:31 +000017# "IsochronousDataHandlers.h" -- Is this useful?
Jack Jansenae57b7f2004-01-11 22:27:42 +000018 "MediaHandlers.h",
19# "QTML.h", -- Windows only, needs separate module
20# "QuickTimeStreaming.h", -- Difficult
21# "QTStreamingComponents.h", -- Needs QTStreaming
22 "QuickTimeMusic.h",
Jack Jansen49be4cc2004-02-24 21:25:31 +000023# "QuickTimeVR.h", -- Not done yet
24# "Sound.h", -- In Carbon.Snd
Jack Jansen2e5e6442004-01-09 23:18:47 +000025 )
Jack Jansen007b8eb2004-01-03 17:23:27 +000026OBJECTS = ("Movie", "Track", "Media", "UserData", "TimeBase", "MovieController",
27 "IdleManager", "SGOutput")
Jack Jansencb4eaad1995-11-30 15:03:59 +000028
29def main():
Jack Jansen007b8eb2004-01-03 17:23:27 +000030 input = HEADERFILES
Jack Jansencb4eaad1995-11-30 15:03:59 +000031 output = SHORT + "gen.py"
Jack Jansen46d9e791996-04-12 16:29:23 +000032 defsoutput = TOOLBOXDIR + LONG + ".py"
Jack Jansencb4eaad1995-11-30 15:03:59 +000033 scanner = MyScanner(input, output, defsoutput)
34 scanner.scan()
35 scanner.close()
Jack Jansen007b8eb2004-01-03 17:23:27 +000036 scanner.gentypetest(SHORT+"typetest.py")
Jack Jansen87eea882002-08-15 21:48:16 +000037 print "=== Testing definitions output code ==="
38 execfile(defsoutput, {}, {})
Jack Jansencb4eaad1995-11-30 15:03:59 +000039 print "=== Done scanning and generating, now importing the generated code... ==="
40 exec "import " + SHORT + "support"
41 print "=== Done. It's up to you to compile it now! ==="
42
43class MyScanner(Scanner):
44
45 def destination(self, type, name, arglist):
46 classname = "Function"
47 listname = "functions"
48 if arglist:
49 t, n, m = arglist[0]
Jack Jansen453ced51995-11-30 17:42:08 +000050 if t in OBJECTS and m == "InMode":
Jack Jansencb4eaad1995-11-30 15:03:59 +000051 classname = "Method"
Jack Jansen453ced51995-11-30 17:42:08 +000052 listname = t + "_methods"
Jack Jansencb4eaad1995-11-30 15:03:59 +000053 return classname, listname
54
Jack Jansen21f96871998-02-20 16:02:09 +000055 def writeinitialdefs(self):
56 self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
Jack Jansen007b8eb2004-01-03 17:23:27 +000057 self.defsfile.write("xmlIdentifierUnrecognized = -1\n")
Jack Jansenae57b7f2004-01-11 22:27:42 +000058 self.defsfile.write("kControllerMinimum = -0xf777\n")
59 self.defsfile.write("notImplementedMusicOSErr = -2071\n")
60 self.defsfile.write("cantSendToSynthesizerOSErr = -2072\n")
61 self.defsfile.write("cantReceiveFromSynthesizerOSErr = -2073\n")
62 self.defsfile.write("illegalVoiceAllocationOSErr = -2074\n")
63 self.defsfile.write("illegalPartOSErr = -2075\n")
64 self.defsfile.write("illegalChannelOSErr = -2076\n")
65 self.defsfile.write("illegalKnobOSErr = -2077\n")
66 self.defsfile.write("illegalKnobValueOSErr = -2078\n")
67 self.defsfile.write("illegalInstrumentOSErr = -2079\n")
68 self.defsfile.write("illegalControllerOSErr = -2080\n")
69 self.defsfile.write("midiManagerAbsentOSErr = -2081\n")
70 self.defsfile.write("synthesizerNotRespondingOSErr = -2082\n")
71 self.defsfile.write("synthesizerOSErr = -2083\n")
72 self.defsfile.write("illegalNoteChannelOSErr = -2084\n")
73 self.defsfile.write("noteChannelNotAllocatedOSErr = -2085\n")
74 self.defsfile.write("tunePlayerFullOSErr = -2086\n")
75 self.defsfile.write("tuneParseOSErr = -2087\n")
Jack Jansen21f96871998-02-20 16:02:09 +000076
Jack Jansencb4eaad1995-11-30 15:03:59 +000077 def makeblacklistnames(self):
78 return [
Jack Jansen007b8eb2004-01-03 17:23:27 +000079 "xmlIdentifierUnrecognized", # const with incompatible definition
Jack Jansencb4eaad1995-11-30 15:03:59 +000080 "DisposeMovie", # Done on python-object disposal
Jack Jansen453ced51995-11-30 17:42:08 +000081 "DisposeMovieTrack", # ditto
82 "DisposeTrackMedia", # ditto
83 "DisposeUserData", # ditto
Jack Jansenb2006391998-04-23 13:22:44 +000084# "DisposeTimeBase", # ditto
Jack Jansen9cfea101995-12-09 14:05:56 +000085 "DisposeMovieController", # ditto
Jack Jansen68a0ee01997-09-01 15:38:24 +000086
Jack Jansen453ced51995-11-30 17:42:08 +000087 # The following 4 use 'void *' in an uncontrolled way
88 # TBD when I've read the manual...
89 "GetUserDataItem",
90 "SetUserDataItem",
91 "SetTextSampleData",
Jack Jansene0cf87b1997-04-09 15:53:46 +000092 "BeginFullScreen",
Jack Jansen453ced51995-11-30 17:42:08 +000093 # bgen gets the argument in/out wrong..
94 "AddTextSample",
95 "AddTESample",
96 "AddHiliteSample",
97 "HiliteTextSample",
Jack Jansen1c4e6141998-04-21 15:23:55 +000098
99 "MakeTrackTimeTable", # Uses long * return?
100 "MakeMediaTimeTable", # ditto
Jack Jansena05ac601999-12-12 21:41:51 +0000101## "VideoMediaGetStallCount", # Undefined in CW Pro 3 library
Jack Jansen6c7e3262002-12-12 10:31:54 +0000102 # OS8 only:
103 'SpriteMediaGetIndImageProperty', # XXXX Why isn't this in carbon?
104 'CheckQuickTimeRegistration',
105 'SetMovieAnchorDataRef',
106 'GetMovieAnchorDataRef',
107 'GetMovieLoadState',
108 'OpenADataHandler',
109 'MovieMediaGetCurrentMovieProperty',
110 'MovieMediaGetCurrentTrackProperty',
111 'MovieMediaGetChildMovieDataReference',
112 'MovieMediaSetChildMovieDataReference',
113 'MovieMediaLoadChildMovieFromDataReference',
114 'Media3DGetViewObject',
Jack Jansencb4eaad1995-11-30 15:03:59 +0000115
Jack Jansen06778242004-01-02 23:51:22 +0000116 # these are ImageCompression blacklists
117 "GraphicsExportGetInputPtr",
Jack Jansen007b8eb2004-01-03 17:23:27 +0000118
119 # QuickTimeComponents
120 # These two need some help: the first returns a point to a databuffer that
121 # the second disposes. Generate manually?
122 "VDCompressDone",
123 "VDReleaseCompressBuffer",
124 "QTVideoOutputGetGWorldParameters", # How useful is this?
Jack Jansen2e5e6442004-01-09 23:18:47 +0000125
126 # MediaHandlers
127 "MediaMakeMediaTimeTable", # just lazy
128 "MediaGetSampleDataPointer", # funny output pointer
Jack Jansenae57b7f2004-01-11 22:27:42 +0000129
130 # QuickTimeMusic
131 "kControllerMinimum",
132 # These are artefacts of a macro definition
133 "ulen",
134 "_ext",
135 "x",
136 "w1",
137 "w2",
Jack Jansen6c7e3262002-12-12 10:31:54 +0000138 ]
Jack Jansen8d929ae2000-06-21 22:07:06 +0000139
Jack Jansencb4eaad1995-11-30 15:03:59 +0000140 def makeblacklisttypes(self):
141 return [
Jack Jansen453ced51995-11-30 17:42:08 +0000142 # I don't think we want to do these
143 "QTSyncTaskPtr",
144 # We dont do callbacks yet, so no need for these
Jack Jansencb4eaad1995-11-30 15:03:59 +0000145 "QTCallBack",
Jack Jansen453ced51995-11-30 17:42:08 +0000146 # Skipped for now, due to laziness
Jack Jansencb4eaad1995-11-30 15:03:59 +0000147 "TrackEditState",
148 "MovieEditState",
Jack Jansencb4eaad1995-11-30 15:03:59 +0000149 "MatrixRecord",
150 "MatrixRecord_ptr",
Jack Jansen453ced51995-11-30 17:42:08 +0000151 "SampleReferencePtr",
Jack Jansen1c4e6141998-04-21 15:23:55 +0000152 "QTTweener",
Jack Jansen59f7dc92004-01-02 23:27:42 +0000153 "QTErrorReplacementPtr",
154 "QTRestrictionSet",
155 "QTUUID",
156 "QTUUID_ptr",
Jack Jansen68a0ee01997-09-01 15:38:24 +0000157
Jack Jansen453ced51995-11-30 17:42:08 +0000158 # Routine pointers, not yet.
159 "MoviesErrorUPP",
160 "MoviePreviewCallOutUPP",
161 "MovieDrawingCompleteUPP",
Jack Jansencb4eaad1995-11-30 15:03:59 +0000162 "QTCallBackUPP",
163 "TextMediaUPP",
164 "MovieProgressUPP",
165 "MovieRgnCoverUPP",
166 "MCActionFilterUPP",
167 "MCActionFilterWithRefConUPP",
Jack Jansen453ced51995-11-30 17:42:08 +0000168 "GetMovieUPP",
169 "ModalFilterUPP",
Jack Jansene0cf87b1997-04-09 15:53:46 +0000170 "TrackTransferUPP",
Jack Jansen723ad8a2000-12-12 22:10:21 +0000171 "MoviePrePrerollCompleteUPP",
172 "MovieExecuteWiredActionsUPP",
173 "QTBandwidthNotificationUPP",
174 "DoMCActionUPP",
Jack Jansen59f7dc92004-01-02 23:27:42 +0000175 "QTNextTaskNeededSoonerCallbackUPP",
Jack Jansen723ad8a2000-12-12 22:10:21 +0000176
177 "SampleReference64Ptr", # Don't know what this does, yet
178 "QTRuntimeSpriteDescPtr",
179 "QTBandwidthReference",
180 "QTScheduledBandwidthReference",
Jack Jansen4a8c54e1997-02-24 13:56:59 +0000181 "QTAtomContainer",
182 "SpriteWorld",
183 "Sprite",
Jack Jansen06778242004-01-02 23:51:22 +0000184
185 # these are ImageCompression blacklists
186 "ICMDataUPP",
187 "ICMFlushUPP",
188 "ICMCompletionUPP",
189 "ICMProgressUPP",
190 "StdPixUPP",
191 "QDPixUPP",
192 "ICMAlignmentUPP",
193 "ICMCursorShieldedUPP",
194 "ICMMemoryDisposedUPP",
195 "ICMConvertDataFormatUPP",
196 "ModalFilterYDUPP",
197 "FileFilterUPP",
198
199 "CodecNameSpecListPtr",
200 "CodecInfo",
201 "ImageSequence",
202 "MatrixRecordPtr",
203 "ICMDataProcRecordPtr",
204 "OpenCPicParams",
205 "ICMProgressProcRecordPtr",
206 "ICMAlignmentProcRecordPtr",
207 "ICMPixelFormatInfoPtr",
208 "ImageSequenceDataSource",
209 "ConstStrFileNameParam",
210 "ImageTranscodeSequence",
211 "ImageFieldSequence",
212 "Fract",
213 "PixMapPtr",
214 "GWorldFlags",
215 "void_ptr", # XXX Being lazy, this one is doable.
Jack Jansen007b8eb2004-01-03 17:23:27 +0000216
217 # These are from QuickTimeComponents
218 "CDataHandlerUPP",
219 "CharDataHandlerUPP",
220 "CommentHandlerUPP",
221 "DataHCompletionUPP",
222 "'MovieExportGetDataUPP",
223 "MovieExportGetPropertyUPP",
224 "PreprocessInstructionHandlerUPP",
225 "SGModalFilterUPP",
226 "StartDocumentHandlerUPP",
227 "StartElementHandlerUPP",
228 "VdigIntUPP",
229 "SGDataUPP",
230 "EndDocumentHandlerUPP",
231 "EndElementHandlerUPP",
232 "VideoBottles", # Record full of UPPs
233
234 "SCParams",
235 "ICMCompletionProcRecordPtr",
236 "DataHVolumeList",
237 "DigitizerInfo",
238 "SGCompressInfo",
239 "SeqGrabExtendedFrameInfoPtr",
240 "SeqGrabFrameInfoPtr",
241 "TCTextOptionsPtr",
242 "SGCompressInfo_ptr",
243 "SGDeviceList",
244 "TextDisplayData",
245 "TimeCodeDef",
246 "TimeCodeRecord",
247 "TweenRecord",
248 "VDGamRecPtr",
249 "ToneDescription", # XXXX Just lazy: this one is easy.
250 "XMLDoc",
251 "UInt64", # XXXX lazy
252 "UInt64_ptr", # XXXX lazy
Jack Jansen2e5e6442004-01-09 23:18:47 +0000253
254 # From MediaHandlers
255 "ActionsUPP",
256 "PrePrerollCompleteUPP",
257 "CodecComponentHandle", # Difficult: handle containing list of components.
258 "GetMovieCompleteParams", # Immense struct
259 "LevelMeterInfoPtr", # Lazy. Also: can be an output parameter!!
260 "MediaEQSpectrumBandsRecordPtr", # ditto
Jack Jansenae57b7f2004-01-11 22:27:42 +0000261
262 # From QuickTimeMusic
263 "MusicMIDISendUPP",
264 "MusicOfflineDataUPP",
265 "TuneCallBackUPP",
266 "TunePlayCallBackUPP",
267 "GCPart", # Struct with lots of fields
268 "GCPart_ptr",
269 "GenericKnobDescription", # Struct with lots of fields
270 "KnobDescription", # Struct with lots of fields
271 "InstrumentAboutInfo", # Struct, not too difficult
272 "NoteChannel", # XXXX Lazy. Could be opaque, I think
273 "NoteRequest", # XXXX Lazy. Not-too-difficult struct
274 "SynthesizerConnections", # Struct with lots of fields
275 "SynthesizerDescription", # Struct with lots of fields
276 "TuneStatus", # Struct with lots of fields
277
Jack Jansencb4eaad1995-11-30 15:03:59 +0000278 ]
279
280 def makerepairinstructions(self):
281 return [
Jack Jansen453ced51995-11-30 17:42:08 +0000282 ([('FSSpec', '*', 'OutMode')], [('FSSpec_ptr', '*', 'InMode')]),
Jack Jansen9cfea101995-12-09 14:05:56 +0000283
284 # Movie controller creation
285 ([('ComponentInstance', 'NewMovieController', 'ReturnMode')],
286 [('MovieController', '*', 'ReturnMode')]),
287
288 # NewMovieFromFile
289 ([('short', 'resId', 'OutMode'), ('StringPtr', 'resName', 'InMode')],
Jack Jansene0cf87b1997-04-09 15:53:46 +0000290 [('short', 'resId', 'InOutMode'), ('dummyStringPtr', 'resName', 'InMode')]),
Jack Jansen9cfea101995-12-09 14:05:56 +0000291
Jack Jansen4a8c54e1997-02-24 13:56:59 +0000292 # MCDoAction and more
293 ([('void', '*', 'OutMode')], [('mcactionparams', '*', 'InMode')]),
294
Jack Jansen1b7a70f2000-03-03 17:06:13 +0000295 # SetTimeBaseZero. Does not handle NULLs, unfortunately
296 ([('TimeRecord', 'zero', 'OutMode')], [('TimeRecord', 'zero', 'InMode')]),
297
298 # ConvertTime and ConvertTimeScale
299 ([('TimeRecord', 'inout', 'OutMode')], [('TimeRecord', 'inout', 'InOutMode')]),
Jack Jansenb9fa1a92003-02-04 15:35:07 +0000300 ([('TimeRecord', 'theTime', 'OutMode')], [('TimeRecord', 'theTime', 'InOutMode')]),
Jack Jansen1b7a70f2000-03-03 17:06:13 +0000301
302 # AddTime and SubtractTime
303 ([('TimeRecord', 'dst', 'OutMode')], [('TimeRecord', 'dst', 'InOutMode')]),
Jack Jansen620a7662001-12-18 15:39:38 +0000304
305 # Funny definitions
306 ([('char_ptr', '*', 'InMode')], [('stringptr', '*', 'InMode')]),
307 ([('FSSpecPtr', '*', 'InMode')], [('FSSpec_ptr', '*', 'InMode')]),
308 ([('unsigned_char', 'swfVersion', 'OutMode')], [('UInt8', 'swfVersion', 'OutMode')]),
Jack Jansenae57b7f2004-01-11 22:27:42 +0000309
310 # It seems MusicMIDIPacket if never flagged with const but always used
311 # for sending only. If that ever changes this needs to be fixed.
312 ([('MusicMIDIPacket', '*', 'OutMode')], [('MusicMIDIPacket_ptr', '*', 'InMode')]),
Jack Jansen69387e12004-01-11 22:52:12 +0000313
314 # QTMusic const-less input parameters
315 ([('unsigned_long', 'header', 'OutMode')], [('UnsignedLongPtr', 'header', 'InMode')]),
Jack Jansencb4eaad1995-11-30 15:03:59 +0000316 ]
317
318if __name__ == "__main__":
319 main()