
/* ========================= 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)
{
#ifndef __LP64__
    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);
#else
    return Py_BuildValue("{s:is:O&s:O&s:O&}",
        "flags", it->flags,
        "filetype", PyMac_BuildOSType, it->filetype,
        "creator", PyMac_BuildOSType, it->creator,
        "extension", OptCFStringRefObj_New, it->extension);
#endif
}

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 ======================= */

