# This python script creates Finder aliases for all the
# dynamically-loaded modules that "live in" in a single
# shared library.
#
# This is sort-of a merger between Jack's MkPluginAliases
# and Guido's mkaliases.
#
# Jack Jansen, CWI, August 1996

import sys
import os
import macfs
import MacOS
verbose=0

SPLASH_LOCATE=512
SPLASH_REMOVE=513
SPLASH_CFM68K=514
SPLASH_PPC=515
SPLASH_NUMPY=516

ppc_goals = [
	("AE.ppc.slb", "toolboxmodules.ppc.slb"),
	("Ctl.ppc.slb", "toolboxmodules.ppc.slb"),
	("Dlg.ppc.slb", "toolboxmodules.ppc.slb"),
	("Evt.ppc.slb", "toolboxmodules.ppc.slb"),
	("Fm.ppc.slb", "toolboxmodules.ppc.slb"),
	("Help.ppc.slb", "toolboxmodules.ppc.slb"),
	("Menu.ppc.slb", "toolboxmodules.ppc.slb"),
	("List.ppc.slb", "toolboxmodules.ppc.slb"),
	("Qd.ppc.slb", "toolboxmodules.ppc.slb"),
	("Res.ppc.slb", "toolboxmodules.ppc.slb"),
	("Scrap.ppc.slb", "toolboxmodules.ppc.slb"),
	("Snd.ppc.slb", "toolboxmodules.ppc.slb"),
	("Sndihooks.ppc.slb", "toolboxmodules.ppc.slb"),
	("TE.ppc.slb", "toolboxmodules.ppc.slb"),
	("Win.ppc.slb", "toolboxmodules.ppc.slb"),

	("Cm.ppc.slb", "qtmodules.ppc.slb"),
	("Qt.ppc.slb", "qtmodules.ppc.slb"),

	("imgcolormap.ppc.slb", "imgmodules.ppc.slb"),
	("imgformat.ppc.slb", "imgmodules.ppc.slb"),
	("imggif.ppc.slb", "imgmodules.ppc.slb"),
	("imgjpeg.ppc.slb", "imgmodules.ppc.slb"),
	("imgop.ppc.slb", "imgmodules.ppc.slb"),
	("imgpbm.ppc.slb", "imgmodules.ppc.slb"),
	("imgpgm.ppc.slb", "imgmodules.ppc.slb"),
	("imgppm.ppc.slb", "imgmodules.ppc.slb"),
	("imgtiff.ppc.slb", "imgmodules.ppc.slb"),
	("imgsgi.ppc.slb", "imgmodules.ppc.slb")
]

cfm68k_goals = [
	("AE.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Ctl.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Dlg.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Evt.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Fm.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Help.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Menu.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("List.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Qd.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Res.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Scrap.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Snd.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Sndihooks.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("TE.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
	("Win.CFM68K.slb", "toolboxmodules.CFM68K.slb"),

	("Cm.CFM68K.slb", "qtmodules.CFM68K.slb"),
	("Qt.CFM68K.slb", "qtmodules.CFM68K.slb"),

	("imgcolormap.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgformat.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imggif.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgjpeg.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgop.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgpbm.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgpgm.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgppm.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgtiff.CFM68K.slb", "imgmodules.CFM68K.slb"),
	("imgsgi.CFM68K.slb", "imgmodules.CFM68K.slb")
]

def gotopluginfolder():
	"""Go to the plugin folder, assuming we are somewhere in the Python tree"""
	import os
	
	while not os.path.isdir(":Plugins"):
		os.chdir("::")
	os.chdir(":Plugins")
	if verbose: print "current directory is", os.getcwd()
	
def loadtoolboxmodules():
	"""Attempt to load the Res module"""
	try:
		import Res
	except ImportError, arg:
		err1 = arg
		pass
	else:
		if verbose: print 'imported Res the standard way.'
		return
	
	# We cannot import it. First attempt to load the cfm68k version
	import imp
	try:
		dummy = imp.load_dynamic('Res', 'toolboxmodules.CFM68K.slb')
	except ImportError, arg:
		err2 = arg
		pass
	else:
		if verbose:  print 'Loaded Res from toolboxmodules.CFM68K.slb.'
		return
		
	# Ok, try the ppc version
	try:
		dummy = imp.load_dynamic('Res', 'toolboxmodules.ppc.slb')
	except ImportError, arg:
		err3 = arg
		pass
	else:
		if verbose:  print 'Loaded Res from toolboxmodules.ppc.slb.'
		return
	
	# Tough luck....
	print "I cannot import the Res module, nor load it from either of"
	print "toolboxmodules shared libraries. The errors encountered were:"
	print "import Res:", err1
	print "load from toolboxmodules.CFM68K.slb:", err2
	print "load from toolboxmodules.ppc.slb:", err3
	sys.exit(1)
	
def getextensiondirfile(fname):
	import macfs
	import MACFS
	vrefnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk, MACFS.kExtensionFolderType, 0)
	fss = macfs.FSSpec((vrefnum, dirid, fname))
	return fss.as_pathname()
	
def mkcorealias(src, altsrc):
	import string
	import macostools
	version = string.split(sys.version)[0]
	dst = getextensiondirfile(src+ ' ' + version)
	if not os.path.exists(src):
		if not os.path.exists(altsrc):
			if verbose:  print '*', src, 'not found'
			return 0
		src = altsrc
	try:
		os.unlink(dst)
	except os.error:
		pass
	macostools.mkalias(src, dst)
	if verbose:  print ' ', dst, '->', src
	return 1
	

def main():
	MacOS.splash(SPLASH_LOCATE)
	gotopluginfolder()
	
	loadtoolboxmodules()
	
	sys.path.append('::Mac:Lib')
	import macostools
		
	# Remove old .slb aliases and collect a list of .slb files
	didsplash = 0
	LibFiles = []
	allfiles = os.listdir(':')
	if verbose:  print 'Removing old aliases...'
	for f in allfiles:
		if f[-4:] == '.slb':
			finfo = macfs.FSSpec(f).GetFInfo()
			if finfo.Flags & 0x8000:
				if not didsplash:
					MacOS.splash(SPLASH_REMOVE)
					didsplash = 1
				if verbose:  print '  Removing', f
				os.unlink(f)
			else:
				LibFiles.append(f)
				if verbose:  print '  Found', f
	if verbose:  print
	
	# Create the new PPC aliases.
	didsplash = 0
	if verbose:  print 'Creating PPC aliases...'
	for dst, src in ppc_goals:
		if src in LibFiles:
			if not didsplash:
				MacOS.splash(SPLASH_PPC)
				didsplash = 1
			macostools.mkalias(src, dst)
			if verbose:  print ' ', dst, '->', src
		else:
			if verbose:  print '*', dst, 'not created:', src, 'not found'
	if verbose:  print
	
	# Create the CFM68K aliases.
	didsplash = 0
	if verbose:  print 'Creating CFM68K aliases...'
	for dst, src in cfm68k_goals:
		if src in LibFiles:
			if not didsplash:
				MacOS.splash(SPLASH_CFM68K)
				didsplash = 1
			macostools.mkalias(src, dst)
			if verbose:  print ' ', dst, '->', src
		else:
			if verbose:  print '*', dst, 'not created:', src, 'not found'
	if verbose:  print
			
	# Create the PythonCore alias(es)
	if verbose:  print 'Creating PythonCore aliases in Extensions folder...'
	os.chdir('::')
	n = 0
	n = n + mkcorealias('PythonCore', 'PythonCore')
	n = n + mkcorealias('PythonCorePPC', ':build.macppc.shared:PythonCorePPC')
	n = n + mkcorealias('PythonCoreCFM68K', ':build.mac68k.shared:PythonCoreCFM68K')
	
	# Install NumPy
	if os.path.exists(':Extensions:NumPy:macmkaliases.py'):
		MacOS.splash(SPLASH_NUMPY)
		os.chdir(':Extensions:NumPy')
		import macmkaliases
		err = macmkaliases.main()
	if verbose and n == 0:
		sys.exit(1)
			
if __name__ == '__main__':
	if len(sys.argv) > 1 and sys.argv[1] == '-v':
		verbose = 1
	main()
