blob: cd001244f62e776920b91b78938c055ab1c3768a [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
Jack Jansenaaebdd62002-08-05 15:39:30 +00004from bgenlocations import TOOLBOXDIR, BGENDIR
Jack Jansen0c4d9471998-04-17 14:07:56 +00005sys.path.append(BGENDIR)
Jack Jansencb4eaad1995-11-30 15:03:59 +00006from scantools import Scanner
7
8LONG = "QuickTime"
9SHORT = "qt"
Jack Jansen2e5e6442004-01-09 23:18:47 +000010HEADERFILES= (
Tim Peters182b5ac2004-07-18 06:16:08 +000011# "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
24 )
25OBJECTS = ("Movie", "Track", "Media", "UserData", "TimeBase", "MovieController",
26 "IdleManager", "SGOutput")
Jack Jansencb4eaad1995-11-30 15:03:59 +000027
28def main():
Tim Peters182b5ac2004-07-18 06:16:08 +000029 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! ==="
Jack Jansencb4eaad1995-11-30 15:03:59 +000041
42class MyScanner(Scanner):
43
Tim Peters182b5ac2004-07-18 06:16:08 +000044 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
Jack Jansencb4eaad1995-11-30 15:03:59 +000053
Tim Peters182b5ac2004-07-18 06:16:08 +000054 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")
Jack Jansen21f96871998-02-20 16:02:09 +000075
Tim Peters182b5ac2004-07-18 06:16:08 +000076 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
Jack Jansen68a0ee01997-09-01 15:38:24 +000085
Tim Peters182b5ac2004-07-18 06:16:08 +000086 # 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",
Jack Jansencb4eaad1995-11-30 15:03:59 +000097
Tim Peters182b5ac2004-07-18 06:16:08 +000098 "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',
Jack Jansen8d929ae2000-06-21 22:07:06 +0000114
Tim Peters182b5ac2004-07-18 06:16:08 +0000115 # these are ImageCompression blacklists
116 "GraphicsExportGetInputPtr",
Jack Jansen68a0ee01997-09-01 15:38:24 +0000117
Tim Peters182b5ac2004-07-18 06:16:08 +0000118 # 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?
Jack Jansen06778242004-01-02 23:51:22 +0000124
Tim Peters182b5ac2004-07-18 06:16:08 +0000125 # MediaHandlers
126 "MediaMakeMediaTimeTable", # just lazy
127 "MediaGetSampleDataPointer", # funny output pointer
Jack Jansen06778242004-01-02 23:51:22 +0000128
Tim Peters182b5ac2004-07-18 06:16:08 +0000129 # QuickTimeMusic
130 "kControllerMinimum",
131 # These are artefacts of a macro definition
132 "ulen",
133 "_ext",
134 "x",
135 "w1",
136 "w2",
137 ]
Jack Jansencb4eaad1995-11-30 15:03:59 +0000138
Tim Peters182b5ac2004-07-18 06:16:08 +0000139 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",
156
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",
175
176 "SampleReference64Ptr", # Don't know what this does, yet
177 "QTRuntimeSpriteDescPtr",
178 "QTBandwidthReference",
179 "QTScheduledBandwidthReference",
180 "QTAtomContainer",
181 "SpriteWorld",
182 "Sprite",
183
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",
197
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.
215
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
232
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
252
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
260
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
276
277 ]
278
279 def makerepairinstructions(self):
280 return [
281 ([('FSSpec', '*', 'OutMode')], [('FSSpec_ptr', '*', 'InMode')]),
282
283 # Movie controller creation
284 ([('ComponentInstance', 'NewMovieController', 'ReturnMode')],
285 [('MovieController', '*', 'ReturnMode')]),
286
287 # NewMovieFromFile
288 ([('short', 'resId', 'OutMode'), ('StringPtr', 'resName', 'InMode')],
289 [('short', 'resId', 'InOutMode'), ('dummyStringPtr', 'resName', 'InMode')]),
290
291 # MCDoAction and more
292 ([('void', '*', 'OutMode')], [('mcactionparams', '*', 'InMode')]),
293
294 # SetTimeBaseZero. Does not handle NULLs, unfortunately
295 ([('TimeRecord', 'zero', 'OutMode')], [('TimeRecord', 'zero', 'InMode')]),
296
297 # ConvertTime and ConvertTimeScale
298 ([('TimeRecord', 'inout', 'OutMode')], [('TimeRecord', 'inout', 'InOutMode')]),
299 ([('TimeRecord', 'theTime', 'OutMode')], [('TimeRecord', 'theTime', 'InOutMode')]),
300
301 # AddTime and SubtractTime
302 ([('TimeRecord', 'dst', 'OutMode')], [('TimeRecord', 'dst', 'InOutMode')]),
303
304 # Funny definitions
305 ([('char_ptr', '*', 'InMode')], [('stringptr', '*', 'InMode')]),
306 ([('FSSpecPtr', '*', 'InMode')], [('FSSpec_ptr', '*', 'InMode')]),
307 ([('unsigned_char', 'swfVersion', 'OutMode')], [('UInt8', 'swfVersion', 'OutMode')]),
308
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')]),
312
313 # QTMusic const-less input parameters
314 ([('unsigned_long', 'header', 'OutMode')], [('UnsignedLongPtr', 'header', 'InMode')]),
315 ]
316
Jack Jansencb4eaad1995-11-30 15:03:59 +0000317if __name__ == "__main__":
Tim Peters182b5ac2004-07-18 06:16:08 +0000318 main()