From 2b3ce3ba3f6f3fa688cb9e38de640e8cb15c4095 Mon Sep 17 00:00:00 2001
From: Jack Jansen <jack.jansen@cwi.nl>
Date: Sun, 26 Jan 2003 20:22:41 +0000
Subject: FSRef and EasyDialogs pathname support was pretty much broken in
 MacPython-OS9. Fixed.

---
 Lib/plat-mac/EasyDialogs.py     | 28 ++++++++++++++++------------
 Mac/Modules/file/_Filemodule.c  | 27 ++++++++++++++++++++++++++-
 Mac/Modules/file/filesupport.py | 27 ++++++++++++++++++++++++++-
 3 files changed, 68 insertions(+), 14 deletions(-)

diff --git a/Lib/plat-mac/EasyDialogs.py b/Lib/plat-mac/EasyDialogs.py
index 1d67091..83daff8 100644
--- a/Lib/plat-mac/EasyDialogs.py
+++ b/Lib/plat-mac/EasyDialogs.py
@@ -34,6 +34,7 @@ from Carbon.ControlAccessor import *	# Also import Controls constants
 import Carbon.File
 import macresource
 import os
+import sys
 
 __all__ = ['Message', 'AskString', 'AskPassword', 'AskYesNoCancel',
 	'GetArgv', 'AskFileForOpen', 'AskFileForSave', 'AskFolder',
@@ -635,9 +636,9 @@ def AskFileForOpen(
 	if issubclass(tpwanted, Carbon.File.FSSpec):
 		return tpwanted(rr.selection[0])
 	if issubclass(tpwanted, str):
-		return tpwanted(rr.selection_fsr[0].FSRefMakePath())
+		return tpwanted(rr.selection_fsr[0].as_pathname())
 	if issubclass(tpwanted, unicode):
-		return tpwanted(rr.selection_fsr[0].FSRefMakePath(), 'utf8')
+		return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
 	raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
 
 def AskFileForSave(
@@ -686,13 +687,16 @@ def AskFileForSave(
 	if issubclass(tpwanted, Carbon.File.FSSpec):
 		return tpwanted(rr.selection[0])
 	if issubclass(tpwanted, (str, unicode)):
-		# This is gross, and probably incorrect too
-		vrefnum, dirid, name = rr.selection[0].as_tuple()
-		pardir_fss = Carbon.File.FSSpec((vrefnum, dirid, ''))
-		pardir_fsr = Carbon.File.FSRef(pardir_fss)
-		pardir_path = pardir_fsr.FSRefMakePath()  # This is utf-8
-		name_utf8 = unicode(name, 'macroman').encode('utf8')
-		fullpath = os.path.join(pardir_path, name_utf8)
+		if sys.platform == 'mac':
+			fullpath = rr.selection[0].as_pathname()
+		else:
+			# This is gross, and probably incorrect too
+			vrefnum, dirid, name = rr.selection[0].as_tuple()
+			pardir_fss = Carbon.File.FSSpec((vrefnum, dirid, ''))
+			pardir_fsr = Carbon.File.FSRef(pardir_fss)
+			pardir_path = pardir_fsr.FSRefMakePath()  # This is utf-8
+			name_utf8 = unicode(name, 'macroman').encode('utf8')
+			fullpath = os.path.join(pardir_path, name_utf8)
 		if issubclass(tpwanted, unicode):
 			return unicode(fullpath, 'utf8')
 		return tpwanted(fullpath)
@@ -741,14 +745,14 @@ def AskFolder(
 	if issubclass(tpwanted, Carbon.File.FSSpec):
 		return tpwanted(rr.selection[0])
 	if issubclass(tpwanted, str):
-		return tpwanted(rr.selection_fsr[0].FSRefMakePath())
+		return tpwanted(rr.selection_fsr[0].as_pathname())
 	if issubclass(tpwanted, unicode):
-		return tpwanted(rr.selection_fsr[0].FSRefMakePath(), 'utf8')
+		return tpwanted(rr.selection_fsr[0].as_pathname(), 'utf8')
 	raise TypeError, "Unknown value for argument 'wanted': %s" % repr(tpwanted)
 	
 
 def test():
-	import time, sys, macfs
+	import time, macfs
 
 	Message("Testing EasyDialogs.")
 	optionlist = (('v', 'Verbose'), ('verbose', 'Verbose as long option'), 
diff --git a/Mac/Modules/file/_Filemodule.c b/Mac/Modules/file/_Filemodule.c
index 5d3901f..8309b35 100644
--- a/Mac/Modules/file/_Filemodule.c
+++ b/Mac/Modules/file/_Filemodule.c
@@ -1840,7 +1840,26 @@ static PyObject *FSRef_as_pathname(FSRefObject *_self, PyObject *_args)
 {
 	PyObject *_res = NULL;
 
+#if TARGET_API_MAC_OSX
+	if (!PyArg_ParseTuple(_args, ""))
+		return NULL;
 	_res = FSRef_FSRefMakePath(_self, _args);
+#else
+	char strbuf[1024];
+	OSErr err;
+	FSSpec fss;
+
+	if (!PyArg_ParseTuple(_args, ""))
+		return NULL;
+	if ( !PyMac_GetFSSpec((PyObject *)_self, &fss))
+		return NULL;
+	err = PyMac_GetFullPathname(&fss, strbuf, sizeof(strbuf));
+	if ( err ) {
+		PyMac_Error(err);
+		return NULL;
+	}
+	_res = PyString_FromString(strbuf);
+#endif
 	return _res;
 
 }
@@ -3190,6 +3209,7 @@ int
 PyMac_GetFSRef(PyObject *v, FSRef *fsr)
 {
 	OSStatus err;
+	FSSpec fss;
 	
 	if (FSRef_Check(v)) {
 		*fsr = ((FSRefObject *)v)->ob_itself;
@@ -3208,8 +3228,13 @@ PyMac_GetFSRef(PyObject *v, FSRef *fsr)
 	/* XXXX Should try unicode here too */
 #endif
 	/* Otherwise we try to go via an FSSpec */
+#if TARGET_API_MAC_OSX
 	if (FSSpec_Check(v)) {
-		if ((err=FSpMakeFSRef(&((FSSpecObject *)v)->ob_itself, fsr)) == 0)
+		fss = ((FSSpecObject *)v)->ob_itself;
+#else
+	if (PyMac_GetFSSpec(v, &fss)) {
+#endif
+		if ((err=FSpMakeFSRef(&fss, fsr)) == 0)
 			return 1;
 		PyMac_Error(err);
 		return 0;
diff --git a/Mac/Modules/file/filesupport.py b/Mac/Modules/file/filesupport.py
index b7df7eb..26821dd 100644
--- a/Mac/Modules/file/filesupport.py
+++ b/Mac/Modules/file/filesupport.py
@@ -271,6 +271,7 @@ int
 PyMac_GetFSRef(PyObject *v, FSRef *fsr)
 {
 	OSStatus err;
+	FSSpec fss;
 	
 	if (FSRef_Check(v)) {
 		*fsr = ((FSRefObject *)v)->ob_itself;
@@ -289,8 +290,13 @@ PyMac_GetFSRef(PyObject *v, FSRef *fsr)
 	/* XXXX Should try unicode here too */
 #endif
 	/* Otherwise we try to go via an FSSpec */
+#if TARGET_API_MAC_OSX
 	if (FSSpec_Check(v)) {
-		if ((err=FSpMakeFSRef(&((FSSpecObject *)v)->ob_itself, fsr)) == 0)
+		fss = ((FSSpecObject *)v)->ob_itself;
+#else
+	if (PyMac_GetFSSpec(v, &fss)) {
+#endif
+		if ((err=FSpMakeFSRef(&fss, fsr)) == 0)
 			return 1;
 		PyMac_Error(err);
 		return 0;
@@ -808,7 +814,26 @@ f.docstring = lambda: "() -> string"
 fsref_methods.append(f)
 
 FSRef_as_pathname_body = """
+#if TARGET_API_MAC_OSX
+if (!PyArg_ParseTuple(_args, ""))
+	return NULL;
 _res = FSRef_FSRefMakePath(_self, _args);
+#else
+char strbuf[1024];
+OSErr err;
+FSSpec fss;
+
+if (!PyArg_ParseTuple(_args, ""))
+	return NULL;
+if ( !PyMac_GetFSSpec((PyObject *)_self, &fss))
+	return NULL;
+err = PyMac_GetFullPathname(&fss, strbuf, sizeof(strbuf));
+if ( err ) {
+	PyMac_Error(err);
+	return NULL;
+}
+_res = PyString_FromString(strbuf);
+#endif
 return _res;
 """
 f = ManualGenerator("as_pathname", FSRef_as_pathname_body)
-- 
cgit v0.12

