mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			319 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			319 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Scan an Apple header file, generating a Python file of generator calls.
 | |
| 
 | |
| import sys
 | |
| import os
 | |
| from bgenlocations import TOOLBOXDIR, BGENDIR
 | |
| sys.path.append(BGENDIR)
 | |
| from scantools import Scanner
 | |
| 
 | |
| LONG = "QuickTime"
 | |
| SHORT = "qt"
 | |
| HEADERFILES= (
 | |
| #       "Components.h"  -- In Carbon.Cm
 | |
|         "Movies.h",
 | |
|         "ImageCompression.h",
 | |
|         "QuickTimeComponents.h",
 | |
| #       "ImageCodec.h"  -- seems not too useful, and difficult.
 | |
| #       "IsochronousDataHandlers.h" -- Is this useful?
 | |
|         "MediaHandlers.h",
 | |
| #       "QTML.h", -- Windows only, needs separate module
 | |
| #       "QuickTimeStreaming.h", -- Difficult
 | |
| #       "QTStreamingComponents.h", -- Needs QTStreaming
 | |
|         "QuickTimeMusic.h",
 | |
| #       "QuickTimeVR.h", -- Not done yet
 | |
| #       "Sound.h", -- In Carbon.Snd
 | |
|         )
 | |
| OBJECTS = ("Movie", "Track", "Media", "UserData", "TimeBase", "MovieController",
 | |
|         "IdleManager", "SGOutput")
 | |
| 
 | |
| def main():
 | |
|     input = HEADERFILES
 | |
|     output = SHORT + "gen.py"
 | |
|     defsoutput = TOOLBOXDIR + LONG + ".py"
 | |
|     scanner = MyScanner(input, output, defsoutput)
 | |
|     scanner.scan()
 | |
|     scanner.close()
 | |
|     scanner.gentypetest(SHORT+"typetest.py")
 | |
|     print "=== Testing definitions output code ==="
 | |
|     execfile(defsoutput, {}, {})
 | |
|     print "=== Done scanning and generating, now importing the generated code... ==="
 | |
|     exec "import " + SHORT + "support"
 | |
|     print "=== Done.  It's up to you to compile it now! ==="
 | |
| 
 | |
| class MyScanner(Scanner):
 | |
| 
 | |
|     def destination(self, type, name, arglist):
 | |
|         classname = "Function"
 | |
|         listname = "functions"
 | |
|         if arglist:
 | |
|             t, n, m = arglist[0]
 | |
|             if t in OBJECTS and m == "InMode":
 | |
|                 classname = "Method"
 | |
|                 listname = t + "_methods"
 | |
|         return classname, listname
 | |
| 
 | |
|     def writeinitialdefs(self):
 | |
|         self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
 | |
|         self.defsfile.write("xmlIdentifierUnrecognized = -1\n")
 | |
|         self.defsfile.write("kControllerMinimum = -0xf777\n")
 | |
|         self.defsfile.write("notImplementedMusicOSErr      = -2071\n")
 | |
|         self.defsfile.write("cantSendToSynthesizerOSErr    = -2072\n")
 | |
|         self.defsfile.write("cantReceiveFromSynthesizerOSErr = -2073\n")
 | |
|         self.defsfile.write("illegalVoiceAllocationOSErr   = -2074\n")
 | |
|         self.defsfile.write("illegalPartOSErr              = -2075\n")
 | |
|         self.defsfile.write("illegalChannelOSErr           = -2076\n")
 | |
|         self.defsfile.write("illegalKnobOSErr              = -2077\n")
 | |
|         self.defsfile.write("illegalKnobValueOSErr         = -2078\n")
 | |
|         self.defsfile.write("illegalInstrumentOSErr        = -2079\n")
 | |
|         self.defsfile.write("illegalControllerOSErr        = -2080\n")
 | |
|         self.defsfile.write("midiManagerAbsentOSErr        = -2081\n")
 | |
|         self.defsfile.write("synthesizerNotRespondingOSErr = -2082\n")
 | |
|         self.defsfile.write("synthesizerOSErr              = -2083\n")
 | |
|         self.defsfile.write("illegalNoteChannelOSErr       = -2084\n")
 | |
|         self.defsfile.write("noteChannelNotAllocatedOSErr  = -2085\n")
 | |
|         self.defsfile.write("tunePlayerFullOSErr           = -2086\n")
 | |
|         self.defsfile.write("tuneParseOSErr                = -2087\n")
 | |
| 
 | |
|     def makeblacklistnames(self):
 | |
|         return [
 | |
|                 "xmlIdentifierUnrecognized", # const with incompatible definition
 | |
|                 "DisposeMovie",         # Done on python-object disposal
 | |
|                 "DisposeMovieTrack",    # ditto
 | |
|                 "DisposeTrackMedia",    # ditto
 | |
|                 "DisposeUserData",              # ditto
 | |
| #                       "DisposeTimeBase",              # ditto
 | |
|                 "DisposeMovieController", # ditto
 | |
| 
 | |
|                 # The following 4 use 'void *' in an uncontrolled way
 | |
|                 # TBD when I've read the manual...
 | |
|                 "GetUserDataItem",
 | |
|                 "SetUserDataItem",
 | |
|                 "SetTextSampleData",
 | |
|                 "BeginFullScreen",
 | |
|                 # bgen gets the argument in/out wrong..
 | |
|                 "AddTextSample",
 | |
|                 "AddTESample",
 | |
|                 "AddHiliteSample",
 | |
|                 "HiliteTextSample",
 | |
| 
 | |
|                 "MakeTrackTimeTable", # Uses long * return?
 | |
|                 "MakeMediaTimeTable", # ditto
 | |
| ##                      "VideoMediaGetStallCount", # Undefined in CW Pro 3 library
 | |
|                 # OS8 only:
 | |
|                 'SpriteMediaGetIndImageProperty',       # XXXX Why isn't this in carbon?
 | |
|                 'CheckQuickTimeRegistration',
 | |
|                 'SetMovieAnchorDataRef',
 | |
|                 'GetMovieAnchorDataRef',
 | |
|                 'GetMovieLoadState',
 | |
|                 'OpenADataHandler',
 | |
|                 'MovieMediaGetCurrentMovieProperty',
 | |
|                 'MovieMediaGetCurrentTrackProperty',
 | |
|                 'MovieMediaGetChildMovieDataReference',
 | |
|                 'MovieMediaSetChildMovieDataReference',
 | |
|                 'MovieMediaLoadChildMovieFromDataReference',
 | |
|                 'Media3DGetViewObject',
 | |
| 
 | |
|     # these are ImageCompression blacklists
 | |
|                 "GraphicsExportGetInputPtr",
 | |
| 
 | |
|                 # QuickTimeComponents
 | |
|                 # These two need some help: the first returns a point to a databuffer that
 | |
|                 # the second disposes. Generate manually?
 | |
|                 "VDCompressDone",
 | |
|                 "VDReleaseCompressBuffer",
 | |
|                 "QTVideoOutputGetGWorldParameters", # How useful is this?
 | |
| 
 | |
|                 # MediaHandlers
 | |
|                 "MediaMakeMediaTimeTable", # just lazy
 | |
|                 "MediaGetSampleDataPointer", # funny output pointer
 | |
| 
 | |
|                 # QuickTimeMusic
 | |
|                 "kControllerMinimum",
 | |
|                 # These are artefacts of a macro definition
 | |
|                 "ulen",
 | |
|                 "_ext",
 | |
|                 "x",
 | |
|                 "w1",
 | |
|                 "w2",
 | |
|                 ]
 | |
| 
 | |
|     def makeblacklisttypes(self):
 | |
|         return [
 | |
|                 # I don't think we want to do these
 | |
|                 "QTSyncTaskPtr",
 | |
|                 # We dont do callbacks yet, so no need for these
 | |
|                 "QTCallBack",
 | |
|                 # Skipped for now, due to laziness
 | |
|                 "TrackEditState",
 | |
|                 "MovieEditState",
 | |
|                 "MatrixRecord",
 | |
|                 "MatrixRecord_ptr",
 | |
|                 "SampleReferencePtr",
 | |
|                 "QTTweener",
 | |
|                 "QTErrorReplacementPtr",
 | |
|                 "QTRestrictionSet",
 | |
|                 "QTUUID",
 | |
|                 "QTUUID_ptr",
 | |
| 
 | |
|                 # Routine pointers, not yet.
 | |
|                 "MoviesErrorUPP",
 | |
|                 "MoviePreviewCallOutUPP",
 | |
|                 "MovieDrawingCompleteUPP",
 | |
|                 "QTCallBackUPP",
 | |
|                 "TextMediaUPP",
 | |
|                 "MovieProgressUPP",
 | |
|                 "MovieRgnCoverUPP",
 | |
|                 "MCActionFilterUPP",
 | |
|                 "MCActionFilterWithRefConUPP",
 | |
|                 "GetMovieUPP",
 | |
|                 "ModalFilterUPP",
 | |
|                 "TrackTransferUPP",
 | |
|                 "MoviePrePrerollCompleteUPP",
 | |
|                 "MovieExecuteWiredActionsUPP",
 | |
|                 "QTBandwidthNotificationUPP",
 | |
|                 "DoMCActionUPP",
 | |
|                 "QTNextTaskNeededSoonerCallbackUPP",
 | |
| 
 | |
|                 "SampleReference64Ptr", # Don't know what this does, yet
 | |
|                 "QTRuntimeSpriteDescPtr",
 | |
|                 "QTBandwidthReference",
 | |
|                 "QTScheduledBandwidthReference",
 | |
|                 "QTAtomContainer",
 | |
|                 "SpriteWorld",
 | |
|                 "Sprite",
 | |
| 
 | |
|     # these are ImageCompression blacklists
 | |
|     "ICMDataUPP",
 | |
|     "ICMFlushUPP",
 | |
|     "ICMCompletionUPP",
 | |
|     "ICMProgressUPP",
 | |
|     "StdPixUPP",
 | |
|     "QDPixUPP",
 | |
|     "ICMAlignmentUPP",
 | |
|     "ICMCursorShieldedUPP",
 | |
|     "ICMMemoryDisposedUPP",
 | |
|     "ICMConvertDataFormatUPP",
 | |
|     "ModalFilterYDUPP",
 | |
|                 "FileFilterUPP",
 | |
| 
 | |
|     "CodecNameSpecListPtr",
 | |
|     "CodecInfo",
 | |
|      "ImageSequence",
 | |
|     "MatrixRecordPtr",
 | |
|     "ICMDataProcRecordPtr",
 | |
|     "OpenCPicParams",
 | |
|     "ICMProgressProcRecordPtr",
 | |
|     "ICMAlignmentProcRecordPtr",
 | |
|     "ICMPixelFormatInfoPtr",
 | |
|     "ImageSequenceDataSource",
 | |
|     "ConstStrFileNameParam",
 | |
|     "ImageTranscodeSequence",
 | |
|     "ImageFieldSequence",
 | |
|     "Fract",
 | |
|     "PixMapPtr",
 | |
|     "GWorldFlags",
 | |
|     "void_ptr",   # XXX Being lazy, this one is doable.
 | |
| 
 | |
|     # These are from QuickTimeComponents
 | |
|     "CDataHandlerUPP",
 | |
|     "CharDataHandlerUPP",
 | |
|     "CommentHandlerUPP",
 | |
|     "DataHCompletionUPP",
 | |
|     "'MovieExportGetDataUPP",
 | |
|     "MovieExportGetPropertyUPP",
 | |
|     "PreprocessInstructionHandlerUPP",
 | |
|     "SGModalFilterUPP",
 | |
|     "StartDocumentHandlerUPP",
 | |
|     "StartElementHandlerUPP",
 | |
|     "VdigIntUPP",
 | |
|     "SGDataUPP",
 | |
|     "EndDocumentHandlerUPP",
 | |
|     "EndElementHandlerUPP",
 | |
|     "VideoBottles", # Record full of UPPs
 | |
| 
 | |
|     "SCParams",
 | |
|     "ICMCompletionProcRecordPtr",
 | |
|     "DataHVolumeList",
 | |
|     "DigitizerInfo",
 | |
|     "SGCompressInfo",
 | |
|     "SeqGrabExtendedFrameInfoPtr",
 | |
|     "SeqGrabFrameInfoPtr",
 | |
|     "TCTextOptionsPtr",
 | |
|     "SGCompressInfo_ptr",
 | |
|     "SGDeviceList",
 | |
|     "TextDisplayData",
 | |
|     "TimeCodeDef",
 | |
|     "TimeCodeRecord",
 | |
|     "TweenRecord",
 | |
|     "VDGamRecPtr",
 | |
|     "ToneDescription",  # XXXX Just lazy: this one is easy.
 | |
|     "XMLDoc",
 | |
|     "UInt64",   # XXXX lazy
 | |
|     "UInt64_ptr", # XXXX lazy
 | |
| 
 | |
|     # From MediaHandlers
 | |
|     "ActionsUPP",
 | |
|     "PrePrerollCompleteUPP",
 | |
|     "CodecComponentHandle", # Difficult: handle containing list of components.
 | |
|     "GetMovieCompleteParams", # Immense struct
 | |
|     "LevelMeterInfoPtr", # Lazy. Also: can be an output parameter!!
 | |
|     "MediaEQSpectrumBandsRecordPtr", # ditto
 | |
| 
 | |
|     # From QuickTimeMusic
 | |
|     "MusicMIDISendUPP",
 | |
|     "MusicOfflineDataUPP",
 | |
|     "TuneCallBackUPP",
 | |
|     "TunePlayCallBackUPP",
 | |
|     "GCPart", # Struct with lots of fields
 | |
|     "GCPart_ptr",
 | |
|     "GenericKnobDescription", # Struct with lots of fields
 | |
|     "KnobDescription",  # Struct with lots of fields
 | |
|     "InstrumentAboutInfo", # Struct, not too difficult
 | |
|     "NoteChannel", # XXXX Lazy. Could be opaque, I think
 | |
|     "NoteRequest", # XXXX Lazy. Not-too-difficult struct
 | |
|     "SynthesizerConnections", # Struct with lots of fields
 | |
|     "SynthesizerDescription", # Struct with lots of fields
 | |
|     "TuneStatus", # Struct with lots of fields
 | |
| 
 | |
|                 ]
 | |
| 
 | |
|     def makerepairinstructions(self):
 | |
|         return [
 | |
|                 ([('FSSpec', '*', 'OutMode')], [('FSSpec_ptr', '*', 'InMode')]),
 | |
| 
 | |
|                 # Movie controller creation
 | |
|                 ([('ComponentInstance', 'NewMovieController', 'ReturnMode')],
 | |
|                  [('MovieController', '*', 'ReturnMode')]),
 | |
| 
 | |
|                 # NewMovieFromFile
 | |
|                 ([('short', 'resId', 'OutMode'), ('StringPtr', 'resName', 'InMode')],
 | |
|                  [('short', 'resId', 'InOutMode'), ('dummyStringPtr', 'resName', 'InMode')]),
 | |
| 
 | |
|                 # MCDoAction and more
 | |
|                 ([('void', '*', 'OutMode')], [('mcactionparams', '*', 'InMode')]),
 | |
| 
 | |
|                 # SetTimeBaseZero. Does not handle NULLs, unfortunately
 | |
|                 ([('TimeRecord', 'zero', 'OutMode')], [('TimeRecord', 'zero', 'InMode')]),
 | |
| 
 | |
|                 # ConvertTime and ConvertTimeScale
 | |
|                 ([('TimeRecord', 'inout', 'OutMode')], [('TimeRecord', 'inout', 'InOutMode')]),
 | |
|                 ([('TimeRecord', 'theTime', 'OutMode')], [('TimeRecord', 'theTime', 'InOutMode')]),
 | |
| 
 | |
|                 # AddTime and SubtractTime
 | |
|                 ([('TimeRecord', 'dst', 'OutMode')], [('TimeRecord', 'dst', 'InOutMode')]),
 | |
| 
 | |
|                 # Funny definitions
 | |
|                 ([('char_ptr', '*', 'InMode')], [('stringptr', '*', 'InMode')]),
 | |
|                 ([('FSSpecPtr', '*', 'InMode')], [('FSSpec_ptr', '*', 'InMode')]),
 | |
|                 ([('unsigned_char', 'swfVersion', 'OutMode')], [('UInt8', 'swfVersion', 'OutMode')]),
 | |
| 
 | |
|                 # It seems MusicMIDIPacket if never flagged with const but always used
 | |
|                 # for sending only. If that ever changes this needs to be fixed.
 | |
|                 ([('MusicMIDIPacket', '*', 'OutMode')], [('MusicMIDIPacket_ptr', '*', 'InMode')]),
 | |
| 
 | |
|                 # QTMusic const-less input parameters
 | |
|                 ([('unsigned_long', 'header', 'OutMode')], [('UnsignedLongPtr', 'header', 'InMode')]),
 | |
|                 ]
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 | 
