/Mac/Modules/launch/_Launchmodule.c

http://unladen-swallow.googlecode.com/ · C · 481 lines · 431 code · 41 blank · 9 comment · 61 complexity · ca35062ed9cfad18e3a27dc5197ccd89 MD5 · raw file

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