1 2 /* ========================= Module _Launch ========================= */ 3 4 #include "Python.h" 5 6 7 8 #include "pymactoolbox.h" 9 10 /* Macro to test whether a weak-loaded CFM function exists */ 11 #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL ) {\ 12 PyErr_SetString(PyExc_NotImplementedError, \ 13 "Not available in this shared library/OS version"); \ 14 return NULL; \ 15 }} while(0) 16 17 18 #if PY_VERSION_HEX < 0x02040000 19 PyObject *PyMac_GetOSErrException(void); 20 #endif 21 22 #include <ApplicationServices/ApplicationServices.h> 23 24 /* 25 ** Optional CFStringRef. None will pass NULL 26 */ 27 static int 28 OptCFStringRefObj_Convert(PyObject *v, CFStringRef *spec) 29 { 30 if (v == Py_None) { 31 *spec = NULL; 32 return 1; 33 } 34 return CFStringRefObj_Convert(v, spec); 35 } 36 37 PyObject * 38 OptCFStringRefObj_New(CFStringRef it) 39 { 40 if (it == NULL) { 41 Py_INCREF(Py_None); 42 return Py_None; 43 } 44 return CFStringRefObj_New(it); 45 } 46 47 /* 48 ** Convert LSItemInfoRecord to Python. 49 */ 50 PyObject * 51 LSItemInfoRecord_New(LSItemInfoRecord *it) 52 { 53 #ifndef __LP64__ 54 return Py_BuildValue("{s:is:O&s:O&s:O&s:O&s:i}", 55 "flags", it->flags, 56 "filetype", PyMac_BuildOSType, it->filetype, 57 "creator", PyMac_BuildOSType, it->creator, 58 "extension", OptCFStringRefObj_New, it->extension, 59 "iconFileName", OptCFStringRefObj_New, it->iconFileName, 60 "kindID", it->kindID); 61 #else 62 return Py_BuildValue("{s:is:O&s:O&s:O&}", 63 "flags", it->flags, 64 "filetype", PyMac_BuildOSType, it->filetype, 65 "creator", PyMac_BuildOSType, it->creator, 66 "extension", OptCFStringRefObj_New, it->extension); 67 #endif 68 } 69 70 static PyObject *Launch_Error; 71 72 static PyObject *Launch_LSCopyItemInfoForRef(PyObject *_self, PyObject *_args) 73 { 74 PyObject *_res = NULL; 75 OSStatus _err; 76 FSRef inItemRef; 77 LSRequestedInfo inWhichInfo; 78 LSItemInfoRecord outItemInfo; 79 if (!PyArg_ParseTuple(_args, "O&l", 80 PyMac_GetFSRef, &inItemRef, 81 &inWhichInfo)) 82 return NULL; 83 _err = LSCopyItemInfoForRef(&inItemRef, 84 inWhichInfo, 85 &outItemInfo); 86 if (_err != noErr) return PyMac_Error(_err); 87 _res = Py_BuildValue("O&", 88 LSItemInfoRecord_New, &outItemInfo); 89 return _res; 90 } 91 92 static PyObject *Launch_LSCopyItemInfoForURL(PyObject *_self, PyObject *_args) 93 { 94 PyObject *_res = NULL; 95 OSStatus _err; 96 CFURLRef inURL; 97 LSRequestedInfo inWhichInfo; 98 LSItemInfoRecord outItemInfo; 99 if (!PyArg_ParseTuple(_args, "O&l", 100 CFURLRefObj_Convert, &inURL, 101 &inWhichInfo)) 102 return NULL; 103 _err = LSCopyItemInfoForURL(inURL, 104 inWhichInfo, 105 &outItemInfo); 106 if (_err != noErr) return PyMac_Error(_err); 107 _res = Py_BuildValue("O&", 108 LSItemInfoRecord_New, &outItemInfo); 109 return _res; 110 } 111 112 static PyObject *Launch_LSGetExtensionInfo(PyObject *_self, PyObject *_args) 113 { 114 PyObject *_res = NULL; 115 OSStatus _err; 116 UniChar *inNameLen__in__; 117 UniCharCount inNameLen__len__; 118 int inNameLen__in_len__; 119 UniCharCount outExtStartIndex; 120 if (!PyArg_ParseTuple(_args, "u#", 121 &inNameLen__in__, &inNameLen__in_len__)) 122 return NULL; 123 inNameLen__len__ = inNameLen__in_len__; 124 _err = LSGetExtensionInfo(inNameLen__len__, inNameLen__in__, 125 &outExtStartIndex); 126 if (_err != noErr) return PyMac_Error(_err); 127 _res = Py_BuildValue("l", 128 outExtStartIndex); 129 return _res; 130 } 131 132 static PyObject *Launch_LSCopyDisplayNameForRef(PyObject *_self, PyObject *_args) 133 { 134 PyObject *_res = NULL; 135 OSStatus _err; 136 FSRef inRef; 137 CFStringRef outDisplayName; 138 if (!PyArg_ParseTuple(_args, "O&", 139 PyMac_GetFSRef, &inRef)) 140 return NULL; 141 _err = LSCopyDisplayNameForRef(&inRef, 142 &outDisplayName); 143 if (_err != noErr) return PyMac_Error(_err); 144 _res = Py_BuildValue("O&", 145 CFStringRefObj_New, outDisplayName); 146 return _res; 147 } 148 149 static PyObject *Launch_LSCopyDisplayNameForURL(PyObject *_self, PyObject *_args) 150 { 151 PyObject *_res = NULL; 152 OSStatus _err; 153 CFURLRef inURL; 154 CFStringRef outDisplayName; 155 if (!PyArg_ParseTuple(_args, "O&", 156 CFURLRefObj_Convert, &inURL)) 157 return NULL; 158 _err = LSCopyDisplayNameForURL(inURL, 159 &outDisplayName); 160 if (_err != noErr) return PyMac_Error(_err); 161 _res = Py_BuildValue("O&", 162 CFStringRefObj_New, outDisplayName); 163 return _res; 164 } 165 166 static PyObject *Launch_LSSetExtensionHiddenForRef(PyObject *_self, PyObject *_args) 167 { 168 PyObject *_res = NULL; 169 OSStatus _err; 170 FSRef inRef; 171 Boolean inHide; 172 if (!PyArg_ParseTuple(_args, "O&b", 173 PyMac_GetFSRef, &inRef, 174 &inHide)) 175 return NULL; 176 _err = LSSetExtensionHiddenForRef(&inRef, 177 inHide); 178 if (_err != noErr) return PyMac_Error(_err); 179 Py_INCREF(Py_None); 180 _res = Py_None; 181 return _res; 182 } 183 184 static PyObject *Launch_LSSetExtensionHiddenForURL(PyObject *_self, PyObject *_args) 185 { 186 PyObject *_res = NULL; 187 OSStatus _err; 188 CFURLRef inURL; 189 Boolean inHide; 190 if (!PyArg_ParseTuple(_args, "O&b", 191 CFURLRefObj_Convert, &inURL, 192 &inHide)) 193 return NULL; 194 _err = LSSetExtensionHiddenForURL(inURL, 195 inHide); 196 if (_err != noErr) return PyMac_Error(_err); 197 Py_INCREF(Py_None); 198 _res = Py_None; 199 return _res; 200 } 201 202 static PyObject *Launch_LSCopyKindStringForRef(PyObject *_self, PyObject *_args) 203 { 204 PyObject *_res = NULL; 205 OSStatus _err; 206 FSRef inFSRef; 207 CFStringRef outKindString; 208 if (!PyArg_ParseTuple(_args, "O&", 209 PyMac_GetFSRef, &inFSRef)) 210 return NULL; 211 _err = LSCopyKindStringForRef(&inFSRef, 212 &outKindString); 213 if (_err != noErr) return PyMac_Error(_err); 214 _res = Py_BuildValue("O&", 215 CFStringRefObj_New, outKindString); 216 return _res; 217 } 218 219 static PyObject *Launch_LSCopyKindStringForURL(PyObject *_self, PyObject *_args) 220 { 221 PyObject *_res = NULL; 222 OSStatus _err; 223 CFURLRef inURL; 224 CFStringRef outKindString; 225 if (!PyArg_ParseTuple(_args, "O&", 226 CFURLRefObj_Convert, &inURL)) 227 return NULL; 228 _err = LSCopyKindStringForURL(inURL, 229 &outKindString); 230 if (_err != noErr) return PyMac_Error(_err); 231 _res = Py_BuildValue("O&", 232 CFStringRefObj_New, outKindString); 233 return _res; 234 } 235 236 static PyObject *Launch_LSGetApplicationForItem(PyObject *_self, PyObject *_args) 237 { 238 PyObject *_res = NULL; 239 OSStatus _err; 240 FSRef inItemRef; 241 LSRolesMask inRoleMask; 242 FSRef outAppRef; 243 CFURLRef outAppURL; 244 if (!PyArg_ParseTuple(_args, "O&l", 245 PyMac_GetFSRef, &inItemRef, 246 &inRoleMask)) 247 return NULL; 248 _err = LSGetApplicationForItem(&inItemRef, 249 inRoleMask, 250 &outAppRef, 251 &outAppURL); 252 if (_err != noErr) return PyMac_Error(_err); 253 _res = Py_BuildValue("O&O&", 254 PyMac_BuildFSRef, &outAppRef, 255 CFURLRefObj_New, outAppURL); 256 return _res; 257 } 258 259 static PyObject *Launch_LSGetApplicationForInfo(PyObject *_self, PyObject *_args) 260 { 261 PyObject *_res = NULL; 262 OSStatus _err; 263 OSType inType; 264 OSType inCreator; 265 CFStringRef inExtension; 266 LSRolesMask inRoleMask; 267 FSRef outAppRef; 268 CFURLRef outAppURL; 269 if (!PyArg_ParseTuple(_args, "O&O&O&l", 270 PyMac_GetOSType, &inType, 271 PyMac_GetOSType, &inCreator, 272 OptCFStringRefObj_Convert, &inExtension, 273 &inRoleMask)) 274 return NULL; 275 _err = LSGetApplicationForInfo(inType, 276 inCreator, 277 inExtension, 278 inRoleMask, 279 &outAppRef, 280 &outAppURL); 281 if (_err != noErr) return PyMac_Error(_err); 282 _res = Py_BuildValue("O&O&", 283 PyMac_BuildFSRef, &outAppRef, 284 CFURLRefObj_New, outAppURL); 285 return _res; 286 } 287 288 static PyObject *Launch_LSGetApplicationForURL(PyObject *_self, PyObject *_args) 289 { 290 PyObject *_res = NULL; 291 OSStatus _err; 292 CFURLRef inURL; 293 LSRolesMask inRoleMask; 294 FSRef outAppRef; 295 CFURLRef outAppURL; 296 if (!PyArg_ParseTuple(_args, "O&l", 297 CFURLRefObj_Convert, &inURL, 298 &inRoleMask)) 299 return NULL; 300 _err = LSGetApplicationForURL(inURL, 301 inRoleMask, 302 &outAppRef, 303 &outAppURL); 304 if (_err != noErr) return PyMac_Error(_err); 305 _res = Py_BuildValue("O&O&", 306 PyMac_BuildFSRef, &outAppRef, 307 CFURLRefObj_New, outAppURL); 308 return _res; 309 } 310 311 static PyObject *Launch_LSFindApplicationForInfo(PyObject *_self, PyObject *_args) 312 { 313 PyObject *_res = NULL; 314 OSStatus _err; 315 OSType inCreator; 316 CFStringRef inBundleID; 317 CFStringRef inName; 318 FSRef outAppRef; 319 CFURLRef outAppURL; 320 if (!PyArg_ParseTuple(_args, "O&O&O&", 321 PyMac_GetOSType, &inCreator, 322 OptCFStringRefObj_Convert, &inBundleID, 323 OptCFStringRefObj_Convert, &inName)) 324 return NULL; 325 _err = LSFindApplicationForInfo(inCreator, 326 inBundleID, 327 inName, 328 &outAppRef, 329 &outAppURL); 330 if (_err != noErr) return PyMac_Error(_err); 331 _res = Py_BuildValue("O&O&", 332 PyMac_BuildFSRef, &outAppRef, 333 CFURLRefObj_New, outAppURL); 334 return _res; 335 } 336 337 static PyObject *Launch_LSCanRefAcceptItem(PyObject *_self, PyObject *_args) 338 { 339 PyObject *_res = NULL; 340 OSStatus _err; 341 FSRef inItemFSRef; 342 FSRef inTargetRef; 343 LSRolesMask inRoleMask; 344 LSAcceptanceFlags inFlags; 345 Boolean outAcceptsItem; 346 if (!PyArg_ParseTuple(_args, "O&O&ll", 347 PyMac_GetFSRef, &inItemFSRef, 348 PyMac_GetFSRef, &inTargetRef, 349 &inRoleMask, 350 &inFlags)) 351 return NULL; 352 _err = LSCanRefAcceptItem(&inItemFSRef, 353 &inTargetRef, 354 inRoleMask, 355 inFlags, 356 &outAcceptsItem); 357 if (_err != noErr) return PyMac_Error(_err); 358 _res = Py_BuildValue("b", 359 outAcceptsItem); 360 return _res; 361 } 362 363 static PyObject *Launch_LSCanURLAcceptURL(PyObject *_self, PyObject *_args) 364 { 365 PyObject *_res = NULL; 366 OSStatus _err; 367 CFURLRef inItemURL; 368 CFURLRef inTargetURL; 369 LSRolesMask inRoleMask; 370 LSAcceptanceFlags inFlags; 371 Boolean outAcceptsItem; 372 if (!PyArg_ParseTuple(_args, "O&O&ll", 373 CFURLRefObj_Convert, &inItemURL, 374 CFURLRefObj_Convert, &inTargetURL, 375 &inRoleMask, 376 &inFlags)) 377 return NULL; 378 _err = LSCanURLAcceptURL(inItemURL, 379 inTargetURL, 380 inRoleMask, 381 inFlags, 382 &outAcceptsItem); 383 if (_err != noErr) return PyMac_Error(_err); 384 _res = Py_BuildValue("b", 385 outAcceptsItem); 386 return _res; 387 } 388 389 static PyObject *Launch_LSOpenFSRef(PyObject *_self, PyObject *_args) 390 { 391 PyObject *_res = NULL; 392 OSStatus _err; 393 FSRef inRef; 394 FSRef outLaunchedRef; 395 if (!PyArg_ParseTuple(_args, "O&", 396 PyMac_GetFSRef, &inRef)) 397 return NULL; 398 _err = LSOpenFSRef(&inRef, 399 &outLaunchedRef); 400 if (_err != noErr) return PyMac_Error(_err); 401 _res = Py_BuildValue("O&", 402 PyMac_BuildFSRef, &outLaunchedRef); 403 return _res; 404 } 405 406 static PyObject *Launch_LSOpenCFURLRef(PyObject *_self, PyObject *_args) 407 { 408 PyObject *_res = NULL; 409 OSStatus _err; 410 CFURLRef inURL; 411 CFURLRef outLaunchedURL; 412 if (!PyArg_ParseTuple(_args, "O&", 413 CFURLRefObj_Convert, &inURL)) 414 return NULL; 415 _err = LSOpenCFURLRef(inURL, 416 &outLaunchedURL); 417 if (_err != noErr) return PyMac_Error(_err); 418 _res = Py_BuildValue("O&", 419 CFURLRefObj_New, outLaunchedURL); 420 return _res; 421 } 422 423 static PyMethodDef Launch_methods[] = { 424 {"LSCopyItemInfoForRef", (PyCFunction)Launch_LSCopyItemInfoForRef, 1, 425 PyDoc_STR("(FSRef inItemRef, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")}, 426 {"LSCopyItemInfoForURL", (PyCFunction)Launch_LSCopyItemInfoForURL, 1, 427 PyDoc_STR("(CFURLRef inURL, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")}, 428 {"LSGetExtensionInfo", (PyCFunction)Launch_LSGetExtensionInfo, 1, 429 PyDoc_STR("(Buffer inNameLen) -> (UniCharCount outExtStartIndex)")}, 430 {"LSCopyDisplayNameForRef", (PyCFunction)Launch_LSCopyDisplayNameForRef, 1, 431 PyDoc_STR("(FSRef inRef) -> (CFStringRef outDisplayName)")}, 432 {"LSCopyDisplayNameForURL", (PyCFunction)Launch_LSCopyDisplayNameForURL, 1, 433 PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outDisplayName)")}, 434 {"LSSetExtensionHiddenForRef", (PyCFunction)Launch_LSSetExtensionHiddenForRef, 1, 435 PyDoc_STR("(FSRef inRef, Boolean inHide) -> None")}, 436 {"LSSetExtensionHiddenForURL", (PyCFunction)Launch_LSSetExtensionHiddenForURL, 1, 437 PyDoc_STR("(CFURLRef inURL, Boolean inHide) -> None")}, 438 {"LSCopyKindStringForRef", (PyCFunction)Launch_LSCopyKindStringForRef, 1, 439 PyDoc_STR("(FSRef inFSRef) -> (CFStringRef outKindString)")}, 440 {"LSCopyKindStringForURL", (PyCFunction)Launch_LSCopyKindStringForURL, 1, 441 PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outKindString)")}, 442 {"LSGetApplicationForItem", (PyCFunction)Launch_LSGetApplicationForItem, 1, 443 PyDoc_STR("(FSRef inItemRef, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")}, 444 {"LSGetApplicationForInfo", (PyCFunction)Launch_LSGetApplicationForInfo, 1, 445 PyDoc_STR("(OSType inType, OSType inCreator, CFStringRef inExtension, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")}, 446 {"LSGetApplicationForURL", (PyCFunction)Launch_LSGetApplicationForURL, 1, 447 PyDoc_STR("(CFURLRef inURL, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")}, 448 {"LSFindApplicationForInfo", (PyCFunction)Launch_LSFindApplicationForInfo, 1, 449 PyDoc_STR("(OSType inCreator, CFStringRef inBundleID, CFStringRef inName) -> (FSRef outAppRef, CFURLRef outAppURL)")}, 450 {"LSCanRefAcceptItem", (PyCFunction)Launch_LSCanRefAcceptItem, 1, 451 PyDoc_STR("(FSRef inItemFSRef, FSRef inTargetRef, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")}, 452 {"LSCanURLAcceptURL", (PyCFunction)Launch_LSCanURLAcceptURL, 1, 453 PyDoc_STR("(CFURLRef inItemURL, CFURLRef inTargetURL, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")}, 454 {"LSOpenFSRef", (PyCFunction)Launch_LSOpenFSRef, 1, 455 PyDoc_STR("(FSRef inRef) -> (FSRef outLaunchedRef)")}, 456 {"LSOpenCFURLRef", (PyCFunction)Launch_LSOpenCFURLRef, 1, 457 PyDoc_STR("(CFURLRef inURL) -> (CFURLRef outLaunchedURL)")}, 458 {NULL, NULL, 0} 459 }; 460 461 462 463 464 void init_Launch(void) 465 { 466 PyObject *m; 467 PyObject *d; 468 469 470 471 472 m = Py_InitModule("_Launch", Launch_methods); 473 d = PyModule_GetDict(m); 474 Launch_Error = PyMac_GetOSErrException(); 475 if (Launch_Error == NULL || 476 PyDict_SetItemString(d, "Error", Launch_Error) != 0) 477 return; 478 } 479 480 /* ======================= End module _Launch ======================= */ 481 482