summaryrefslogtreecommitdiffstats
path: root/Mac/Unsupported/RunLibScript.py
blob: 6ecf643a9178f4995b3528e641348e544155dd34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""Import a module while pretending its name is __main__. This
can be used to run scripts from the PackedLib resource file while pretending
they have been double-clicked."""

import imp
import sys
import os
import string
from Carbon import Dlg
import macfs

DIALOG_ID = 512
OK = 1
CANCEL = 2
SCRIPTNAME=3
ARGV=4
STDIN_CONS=5
STDIN_FILE=6
STDOUT_CONS=7
STDOUT_FILE=8
WORKING_DIR=9
PAUSE=10

def import_as_main(name):
	fp, path, (suffix, mode, type) = imp.find_module(name)
	if type == imp.PY_SOURCE:
		imp.load_source('__main__', path, fp)
	elif type == imp.PY_COMPILED:
		imp.load_compiled('__main__', path, fp)
	elif type == imp.PY_RESOURCE:
		imp.load_resource('__main__', path)
		
def interact():
	d = Dlg.GetNewDialog(DIALOG_ID, -1)
	wdir = stdin = stdout = None
	pause = 0

	tp, in_c_h, rect = d.GetDialogItem(STDIN_CONS)
	tp, in_f_h, rect = d.GetDialogItem(STDIN_FILE)
	tp, out_c_h, rect = d.GetDialogItem(STDOUT_CONS)
	tp, out_f_h, rect = d.GetDialogItem(STDOUT_FILE)
	tp, pause_h, rect = d.GetDialogItem(PAUSE)
	in_c_h = in_c_h.as_Control()
	in_f_h = in_f_h.as_Control()
	out_c_h = out_c_h.as_Control()
	out_f_h = out_f_h.as_Control()
	pause_h = pause_h.as_Control()

	while 1:
		in_c_h.SetControlValue(not stdin)
		in_f_h.SetControlValue(not not stdin)
		out_c_h.SetControlValue(not stdout)
		out_f_h.SetControlValue(not not stdout)
		pause_h.SetControlValue(pause)
		
		n = Dlg.ModalDialog(None)
		if n == OK:
			break
		elif n == CANCEL:
			sys.exit(0)
		elif n == STDIN_CONS:
			stdin = None
		elif n == STDIN_FILE:
			fss, ok = macfs.StandardGetFile('TEXT')
			if ok:
				stdin = fss
		elif n == STDOUT_FILE:
			fss, ok = macfs.StandardPutFile('stdout:')
			if ok:
				stdout = fss
		elif n == WORKING_DIR:
			fss, ok = macfs.GetDirectory()
			if ok:
				wdir = fss
		elif n == PAUSE:
			pause = (not pause)
		
	tp, h, rect = d.GetDialogItem(SCRIPTNAME)
	name = Dlg.GetDialogItemText(h)
	tp, h, rect = d.GetDialogItem(ARGV)
	argv = Dlg.GetDialogItemText(h)
	return name, argv, stdin, stdout, wdir, pause
	
def main():
	curdir = os.getcwd()
	from Carbon import Res
	try:
		Res.FSpOpenResFile('RunLibScript.rsrc', 1)
	except:
		pass # Assume we're an applet already
	name, argv, stdin, stdout, wdir, pause = interact()
	if not name:
		sys.exit(0)
	sys.argv = [name] + string.split(argv)
	if stdin:
		sys.stdin = open(stdin.as_pathname())
	if stdout:
		sys.stdout = open(stdout.as_pathname(), 'w')
	if wdir:
		os.chdir(wdir.as_pathname())
	else:
		os.chdir(curdir)

	import_as_main(name)

	if pause:
		sys.exit(1)
	
if __name__ == '__main__':
	main()