
/* ========================= Module _Launch ========================= */

#include "Python.h"



#include "pymactoolbox.h"

/* Macro to test whether a weak-loaded CFM function exists */
#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
        PyErr_SetString(PyExc_NotImplementedError, \
        "Not available in this shared library/OS version"); \
        return NULL; \
    }} while(0)


#if PY_VERSION_HEX < 0x02040000
PyObject *PyMac_GetOSErrException(void);
#endif

#include <ApplicationServices/ApplicationServices.h>

/*
** Optional CFStringRef. None will pass NULL
*/
static int
OptCFStringRefObj_Convert(PyObject *v, CFStringRef *spec)
{
        if (v == Py_None) {
                *spec = NULL;
                return 1;
        }
        return CFStringRefObj_Convert(v, spec);
}

PyObject *
OptCFStringRefObj_New(CFStringRef it)
{
        if (it == NULL) {
                Py_INCREF(Py_None);
                return Py_None;
        }
        return CFStringRefObj_New(it);
}

/*
** Convert LSItemInfoRecord to Python.
*/
PyObject *
LSItemInfoRecord_New(LSItemInfoRecord *it)
{
        return Py_BuildValue("{s:is:O&s:O&s:O&s:O&s:i}",
                "flags", it->flags,
                "filetype", PyMac_BuildOSType, it->filetype,
                "creator", PyMac_BuildOSType, it->creator,
                "extension", OptCFStringRefObj_New, it->extension,
                "iconFileName", OptCFStringRefObj_New, it->iconFileName,
                "kindID", it->kindID);
}

static PyObject *Launch_Error;

static PyObject *Launch_LSCopyItemInfoForRef(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	FSRef inItemRef;
	LSRequestedInfo inWhichInfo;
	LSItemInfoRecord outItemInfo;
	if (!PyArg_ParseTuple(_args, "O&l",
	                      PyMac_GetFSRef, &inItemRef,
	                      &inWhichInfo))
		return NULL;
	_err = LSCopyItemInfoForRef(&inItemRef,
	                            inWhichInfo,
	                            &outItemInfo);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     LSItemInfoRecord_New, &outItemInfo);
	return _res;
}

static PyObject *Launch_LSCopyItemInfoForURL(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	CFURLRef inURL;
	LSRequestedInfo inWhichInfo;
	LSItemInfoRecord outItemInfo;
	if (!PyArg_ParseTuple(_args, "O&l",
	                      CFURLRefObj_Convert, &inURL,
	                      &inWhichInfo))
		return NULL;
	_err = LSCopyItemInfoForURL(inURL,
	                            inWhichInfo,
	                            &outItemInfo);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     LSItemInfoRecord_New, &outItemInfo);
	return _res;
}

static PyObject *Launch_LSGetExtensionInfo(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	UniChar *inNameLen__in__;
	UniCharCount inNameLen__len__;
	int inNameLen__in_len__;
	UniCharCount outExtStartIndex;
	if (!PyArg_ParseTuple(_args, "u#",
	                      &inNameLen__in__, &inNameLen__in_len__))
		return NULL;
	inNameLen__len__ = inNameLen__in_len__;
	_err = LSGetExtensionInfo(inNameLen__len__, inNameLen__in__,
	                          &outExtStartIndex);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("l",
	                     outExtStartIndex);
	return _res;
}

static PyObject *Launch_LSCopyDisplayNameForRef(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	FSRef inRef;
	CFStringRef outDisplayName;
	if (!PyArg_ParseTuple(_args, "O&",
	                      PyMac_GetFSRef, &inRef))
		return NULL;
	_err = LSCopyDisplayNameForRef(&inRef,
	                               &outDisplayName);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     CFStringRefObj_New, outDisplayName);
	return _res;
}

static PyObject *Launch_LSCopyDisplayNameForURL(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	CFURLRef inURL;
	CFStringRef outDisplayName;
	if (!PyArg_ParseTuple(_args, "O&",
	                      CFURLRefObj_Convert, &inURL))
		return NULL;
	_err = LSCopyDisplayNameForURL(inURL,
	                               &outDisplayName);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     CFStringRefObj_New, outDisplayName);
	return _res;
}

static PyObject *Launch_LSSetExtensionHiddenForRef(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	FSRef inRef;
	Boolean inHide;
	if (!PyArg_ParseTuple(_args, "O&b",
	                      PyMac_GetFSRef, &inRef,
	                      &inHide))
		return NULL;
	_err = LSSetExtensionHiddenForRef(&inRef,
	                                  inHide);
	if (_err != noErr) return PyMac_Error(_err);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Launch_LSSetExtensionHiddenForURL(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	CFURLRef inURL;
	Boolean inHide;
	if (!PyArg_ParseTuple(_args, "O&b",
	                      CFURLRefObj_Convert, &inURL,
	                      &inHide))
		return NULL;
	_err = LSSetExtensionHiddenForURL(inURL,
	                                  inHide);
	if (_err != noErr) return PyMac_Error(_err);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Launch_LSCopyKindStringForRef(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	FSRef inFSRef;
	CFStringRef outKindString;
	if (!PyArg_ParseTuple(_args, "O&",
	                      PyMac_GetFSRef, &inFSRef))
		return NULL;
	_err = LSCopyKindStringForRef(&inFSRef,
	                              &outKindString);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     CFStringRefObj_New, outKindString);
	return _res;
}

static PyObject *Launch_LSCopyKindStringForURL(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	CFURLRef inURL;
	CFStringRef outKindString;
	if (!PyArg_ParseTuple(_args, "O&",
	                      CFURLRefObj_Convert, &inURL))
		return NULL;
	_err = LSCopyKindStringForURL(inURL,
	                              &outKindString);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     CFStringRefObj_New, outKindString);
	return _res;
}

static PyObject *Launch_LSGetApplicationForItem(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	FSRef inItemRef;
	LSRolesMask inRoleMask;
	FSRef outAppRef;
	CFURLRef outAppURL;
	if (!PyArg_ParseTuple(_args, "O&l",
	                      PyMac_GetFSRef, &inItemRef,
	                      &inRoleMask))
		return NULL;
	_err = LSGetApplicationForItem(&inItemRef,
	                               inRoleMask,
	                               &outAppRef,
	                               &outAppURL);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&O&",
	                     PyMac_BuildFSRef, &outAppRef,
	                     CFURLRefObj_New, outAppURL);
	return _res;
}

static PyObject *Launch_LSGetApplicationForInfo(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	OSType inType;
	OSType inCreator;
	CFStringRef inExtension;
	LSRolesMask inRoleMask;
	FSRef outAppRef;
	CFURLRef outAppURL;
	if (!PyArg_ParseTuple(_args, "O&O&O&l",
	                      PyMac_GetOSType, &inType,
	                      PyMac_GetOSType, &inCreator,
	                      OptCFStringRefObj_Convert, &inExtension,
	                      &inRoleMask))
		return NULL;
	_err = LSGetApplicationForInfo(inType,
	                               inCreator,
	                               inExtension,
	                               inRoleMask,
	                               &outAppRef,
	                               &outAppURL);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&O&",
	                     PyMac_BuildFSRef, &outAppRef,
	                     CFURLRefObj_New, outAppURL);
	return _res;
}

static PyObject *Launch_LSGetApplicationForURL(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	CFURLRef inURL;
	LSRolesMask inRoleMask;
	FSRef outAppRef;
	CFURLRef outAppURL;
	if (!PyArg_ParseTuple(_args, "O&l",
	                      CFURLRefObj_Convert, &inURL,
	                      &inRoleMask))
		return NULL;
	_err = LSGetApplicationForURL(inURL,
	                              inRoleMask,
	                              &outAppRef,
	                              &outAppURL);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&O&",
	                     PyMac_BuildFSRef, &outAppRef,
	                     CFURLRefObj_New, outAppURL);
	return _res;
}

static PyObject *Launch_LSFindApplicationForInfo(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	OSType inCreator;
	CFStringRef inBundleID;
	CFStringRef inName;
	FSRef outAppRef;
	CFURLRef outAppURL;
	if (!PyArg_ParseTuple(_args, "O&O&O&",
	                      PyMac_GetOSType, &inCreator,
	                      OptCFStringRefObj_Convert, &inBundleID,
	                      OptCFStringRefObj_Convert, &inName))
		return NULL;
	_err = LSFindApplicationForInfo(inCreator,
	                                inBundleID,
	                                inName,
	                                &outAppRef,
	                                &outAppURL);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&O&",
	                     PyMac_BuildFSRef, &outAppRef,
	                     CFURLRefObj_New, outAppURL);
	return _res;
}

static PyObject *Launch_LSCanRefAcceptItem(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	FSRef inItemFSRef;
	FSRef inTargetRef;
	LSRolesMask inRoleMask;
	LSAcceptanceFlags inFlags;
	Boolean outAcceptsItem;
	if (!PyArg_ParseTuple(_args, "O&O&ll",
	                      PyMac_GetFSRef, &inItemFSRef,
	                      PyMac_GetFSRef, &inTargetRef,
	                      &inRoleMask,
	                      &inFlags))
		return NULL;
	_err = LSCanRefAcceptItem(&inItemFSRef,
	                          &inTargetRef,
	                          inRoleMask,
	                          inFlags,
	                          &outAcceptsItem);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("b",
	                     outAcceptsItem);
	return _res;
}

static PyObject *Launch_LSCanURLAcceptURL(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	CFURLRef inItemURL;
	CFURLRef inTargetURL;
	LSRolesMask inRoleMask;
	LSAcceptanceFlags inFlags;
	Boolean outAcceptsItem;
	if (!PyArg_ParseTuple(_args, "O&O&ll",
	                      CFURLRefObj_Convert, &inItemURL,
	                      CFURLRefObj_Convert, &inTargetURL,
	                      &inRoleMask,
	                      &inFlags))
		return NULL;
	_err = LSCanURLAcceptURL(inItemURL,
	                         inTargetURL,
	                         inRoleMask,
	                         inFlags,
	                         &outAcceptsItem);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("b",
	                     outAcceptsItem);
	return _res;
}

static PyObject *Launch_LSOpenFSRef(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	FSRef inRef;
	FSRef outLaunchedRef;
	if (!PyArg_ParseTuple(_args, "O&",
	                      PyMac_GetFSRef, &inRef))
		return NULL;
	_err = LSOpenFSRef(&inRef,
	                   &outLaunchedRef);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     PyMac_BuildFSRef, &outLaunchedRef);
	return _res;
}

static PyObject *Launch_LSOpenCFURLRef(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSStatus _err;
	CFURLRef inURL;
	CFURLRef outLaunchedURL;
	if (!PyArg_ParseTuple(_args, "O&",
	                      CFURLRefObj_Convert, &inURL))
		return NULL;
	_err = LSOpenCFURLRef(inURL,
	                      &outLaunchedURL);
	if (_err != noErr) return PyMac_Error(_err);
	_res = Py_BuildValue("O&",
	                     CFURLRefObj_New, outLaunchedURL);
	return _res;
}

static PyMethodDef Launch_methods[] = {
	{"LSCopyItemInfoForRef", (PyCFunction)Launch_LSCopyItemInfoForRef, 1,
	 PyDoc_STR("(FSRef inItemRef, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")},
	{"LSCopyItemInfoForURL", (PyCFunction)Launch_LSCopyItemInfoForURL, 1,
	 PyDoc_STR("(CFURLRef inURL, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")},
	{"LSGetExtensionInfo", (PyCFunction)Launch_LSGetExtensionInfo, 1,
	 PyDoc_STR("(Buffer inNameLen) -> (UniCharCount outExtStartIndex)")},
	{"LSCopyDisplayNameForRef", (PyCFunction)Launch_LSCopyDisplayNameForRef, 1,
	 PyDoc_STR("(FSRef inRef) -> (CFStringRef outDisplayName)")},
	{"LSCopyDisplayNameForURL", (PyCFunction)Launch_LSCopyDisplayNameForURL, 1,
	 PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outDisplayName)")},
	{"LSSetExtensionHiddenForRef", (PyCFunction)Launch_LSSetExtensionHiddenForRef, 1,
	 PyDoc_STR("(FSRef inRef, Boolean inHide) -> None")},
	{"LSSetExtensionHiddenForURL", (PyCFunction)Launch_LSSetExtensionHiddenForURL, 1,
	 PyDoc_STR("(CFURLRef inURL, Boolean inHide) -> None")},
	{"LSCopyKindStringForRef", (PyCFunction)Launch_LSCopyKindStringForRef, 1,
	 PyDoc_STR("(FSRef inFSRef) -> (CFStringRef outKindString)")},
	{"LSCopyKindStringForURL", (PyCFunction)Launch_LSCopyKindStringForURL, 1,
	 PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outKindString)")},
	{"LSGetApplicationForItem", (PyCFunction)Launch_LSGetApplicationForItem, 1,
	 PyDoc_STR("(FSRef inItemRef, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")},
	{"LSGetApplicationForInfo", (PyCFunction)Launch_LSGetApplicationForInfo, 1,
	 PyDoc_STR("(OSType inType, OSType inCreator, CFStringRef inExtension, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")},
	{"LSGetApplicationForURL", (PyCFunction)Launch_LSGetApplicationForURL, 1,
	 PyDoc_STR("(CFURLRef inURL, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")},
	{"LSFindApplicationForInfo", (PyCFunction)Launch_LSFindApplicationForInfo, 1,
	 PyDoc_STR("(OSType inCreator, CFStringRef inBundleID, CFStringRef inName) -> (FSRef outAppRef, CFURLRef outAppURL)")},
	{"LSCanRefAcceptItem", (PyCFunction)Launch_LSCanRefAcceptItem, 1,
	 PyDoc_STR("(FSRef inItemFSRef, FSRef inTargetRef, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")},
	{"LSCanURLAcceptURL", (PyCFunction)Launch_LSCanURLAcceptURL, 1,
	 PyDoc_STR("(CFURLRef inItemURL, CFURLRef inTargetURL, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")},
	{"LSOpenFSRef", (PyCFunction)Launch_LSOpenFSRef, 1,
	 PyDoc_STR("(FSRef inRef) -> (FSRef outLaunchedRef)")},
	{"LSOpenCFURLRef", (PyCFunction)Launch_LSOpenCFURLRef, 1,
	 PyDoc_STR("(CFURLRef inURL) -> (CFURLRef outLaunchedURL)")},
	{NULL, NULL, 0}
};




void init_Launch(void)
{
	PyObject *m;
	PyObject *d;




	m = Py_InitModule("_Launch", Launch_methods);
	d = PyModule_GetDict(m);
	Launch_Error = PyMac_GetOSErrException();
	if (Launch_Error == NULL ||
	    PyDict_SetItemString(d, "Error", Launch_Error) != 0)
		return;
}

/* ======================= End module _Launch ======================= */

