/Mac/Modules/folder/_Foldermodule.c

http://unladen-swallow.googlecode.com/ · C · 342 lines · 306 code · 33 blank · 3 comment · 42 complexity · 4b76d34565fa2847d0c88eceae75765a MD5 · raw file

  1. /* ========================= Module _Folder ========================= */
  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. #include <Carbon/Carbon.h>
  11. static PyObject *Folder_Error;
  12. static PyObject *Folder_FindFolder(PyObject *_self, PyObject *_args)
  13. {
  14. PyObject *_res = NULL;
  15. OSErr _err;
  16. short vRefNum;
  17. OSType folderType;
  18. Boolean createFolder;
  19. FSVolumeRefNum foundVRefNum;
  20. SInt32 foundDirID;
  21. if (!PyArg_ParseTuple(_args, "hO&b",
  22. &vRefNum,
  23. PyMac_GetOSType, &folderType,
  24. &createFolder))
  25. return NULL;
  26. _err = FindFolder(vRefNum,
  27. folderType,
  28. createFolder,
  29. &foundVRefNum,
  30. &foundDirID);
  31. if (_err != noErr) return PyMac_Error(_err);
  32. _res = Py_BuildValue("hl",
  33. foundVRefNum,
  34. foundDirID);
  35. return _res;
  36. }
  37. static PyObject *Folder_ReleaseFolder(PyObject *_self, PyObject *_args)
  38. {
  39. PyObject *_res = NULL;
  40. OSErr _err;
  41. short vRefNum;
  42. OSType folderType;
  43. if (!PyArg_ParseTuple(_args, "hO&",
  44. &vRefNum,
  45. PyMac_GetOSType, &folderType))
  46. return NULL;
  47. _err = ReleaseFolder(vRefNum,
  48. folderType);
  49. if (_err != noErr) return PyMac_Error(_err);
  50. Py_INCREF(Py_None);
  51. _res = Py_None;
  52. return _res;
  53. }
  54. static PyObject *Folder_FSFindFolder(PyObject *_self, PyObject *_args)
  55. {
  56. PyObject *_res = NULL;
  57. OSErr _err;
  58. short vRefNum;
  59. OSType folderType;
  60. Boolean createFolder;
  61. FSRef foundRef;
  62. if (!PyArg_ParseTuple(_args, "hO&b",
  63. &vRefNum,
  64. PyMac_GetOSType, &folderType,
  65. &createFolder))
  66. return NULL;
  67. _err = FSFindFolder(vRefNum,
  68. folderType,
  69. createFolder,
  70. &foundRef);
  71. if (_err != noErr) return PyMac_Error(_err);
  72. _res = Py_BuildValue("O&",
  73. PyMac_BuildFSRef, &foundRef);
  74. return _res;
  75. }
  76. static PyObject *Folder_AddFolderDescriptor(PyObject *_self, PyObject *_args)
  77. {
  78. PyObject *_res = NULL;
  79. OSErr _err;
  80. FolderType foldType;
  81. FolderDescFlags flags;
  82. FolderClass foldClass;
  83. FolderLocation foldLocation;
  84. OSType badgeSignature;
  85. OSType badgeType;
  86. Str255 name;
  87. Boolean replaceFlag;
  88. if (!PyArg_ParseTuple(_args, "O&lO&O&O&O&O&b",
  89. PyMac_GetOSType, &foldType,
  90. &flags,
  91. PyMac_GetOSType, &foldClass,
  92. PyMac_GetOSType, &foldLocation,
  93. PyMac_GetOSType, &badgeSignature,
  94. PyMac_GetOSType, &badgeType,
  95. PyMac_GetStr255, name,
  96. &replaceFlag))
  97. return NULL;
  98. _err = AddFolderDescriptor(foldType,
  99. flags,
  100. foldClass,
  101. foldLocation,
  102. badgeSignature,
  103. badgeType,
  104. name,
  105. replaceFlag);
  106. if (_err != noErr) return PyMac_Error(_err);
  107. Py_INCREF(Py_None);
  108. _res = Py_None;
  109. return _res;
  110. }
  111. static PyObject *Folder_GetFolderTypes(PyObject *_self, PyObject *_args)
  112. {
  113. PyObject *_res = NULL;
  114. OSErr _err;
  115. UInt32 requestedTypeCount;
  116. UInt32 totalTypeCount;
  117. FolderType theTypes;
  118. if (!PyArg_ParseTuple(_args, "l",
  119. &requestedTypeCount))
  120. return NULL;
  121. _err = GetFolderTypes(requestedTypeCount,
  122. &totalTypeCount,
  123. &theTypes);
  124. if (_err != noErr) return PyMac_Error(_err);
  125. _res = Py_BuildValue("lO&",
  126. totalTypeCount,
  127. PyMac_BuildOSType, theTypes);
  128. return _res;
  129. }
  130. static PyObject *Folder_RemoveFolderDescriptor(PyObject *_self, PyObject *_args)
  131. {
  132. PyObject *_res = NULL;
  133. OSErr _err;
  134. FolderType foldType;
  135. if (!PyArg_ParseTuple(_args, "O&",
  136. PyMac_GetOSType, &foldType))
  137. return NULL;
  138. _err = RemoveFolderDescriptor(foldType);
  139. if (_err != noErr) return PyMac_Error(_err);
  140. Py_INCREF(Py_None);
  141. _res = Py_None;
  142. return _res;
  143. }
  144. #ifndef __LP64__
  145. static PyObject *Folder_GetFolderName(PyObject *_self, PyObject *_args)
  146. {
  147. PyObject *_res = NULL;
  148. OSErr _err;
  149. short vRefNum;
  150. OSType foldType;
  151. short foundVRefNum;
  152. Str255 name;
  153. if (!PyArg_ParseTuple(_args, "hO&O&",
  154. &vRefNum,
  155. PyMac_GetOSType, &foldType,
  156. PyMac_GetStr255, name))
  157. return NULL;
  158. _err = GetFolderName(vRefNum,
  159. foldType,
  160. &foundVRefNum,
  161. name);
  162. if (_err != noErr) return PyMac_Error(_err);
  163. _res = Py_BuildValue("h",
  164. foundVRefNum);
  165. return _res;
  166. }
  167. static PyObject *Folder_AddFolderRouting(PyObject *_self, PyObject *_args)
  168. {
  169. PyObject *_res = NULL;
  170. OSErr _err;
  171. OSType fileType;
  172. FolderType routeFromFolder;
  173. FolderType routeToFolder;
  174. RoutingFlags flags;
  175. Boolean replaceFlag;
  176. if (!PyArg_ParseTuple(_args, "O&O&O&lb",
  177. PyMac_GetOSType, &fileType,
  178. PyMac_GetOSType, &routeFromFolder,
  179. PyMac_GetOSType, &routeToFolder,
  180. &flags,
  181. &replaceFlag))
  182. return NULL;
  183. _err = AddFolderRouting(fileType,
  184. routeFromFolder,
  185. routeToFolder,
  186. flags,
  187. replaceFlag);
  188. if (_err != noErr) return PyMac_Error(_err);
  189. Py_INCREF(Py_None);
  190. _res = Py_None;
  191. return _res;
  192. }
  193. static PyObject *Folder_RemoveFolderRouting(PyObject *_self, PyObject *_args)
  194. {
  195. PyObject *_res = NULL;
  196. OSErr _err;
  197. OSType fileType;
  198. FolderType routeFromFolder;
  199. if (!PyArg_ParseTuple(_args, "O&O&",
  200. PyMac_GetOSType, &fileType,
  201. PyMac_GetOSType, &routeFromFolder))
  202. return NULL;
  203. _err = RemoveFolderRouting(fileType,
  204. routeFromFolder);
  205. if (_err != noErr) return PyMac_Error(_err);
  206. Py_INCREF(Py_None);
  207. _res = Py_None;
  208. return _res;
  209. }
  210. static PyObject *Folder_FindFolderRouting(PyObject *_self, PyObject *_args)
  211. {
  212. PyObject *_res = NULL;
  213. OSErr _err;
  214. OSType fileType;
  215. FolderType routeFromFolder;
  216. FolderType routeToFolder;
  217. RoutingFlags flags;
  218. if (!PyArg_ParseTuple(_args, "O&O&",
  219. PyMac_GetOSType, &fileType,
  220. PyMac_GetOSType, &routeFromFolder))
  221. return NULL;
  222. _err = FindFolderRouting(fileType,
  223. routeFromFolder,
  224. &routeToFolder,
  225. &flags);
  226. if (_err != noErr) return PyMac_Error(_err);
  227. _res = Py_BuildValue("O&l",
  228. PyMac_BuildOSType, routeToFolder,
  229. flags);
  230. return _res;
  231. }
  232. #endif /* !__LP64__ */
  233. static PyObject *Folder_InvalidateFolderDescriptorCache(PyObject *_self, PyObject *_args)
  234. {
  235. PyObject *_res = NULL;
  236. OSErr _err;
  237. short vRefNum;
  238. long dirID;
  239. if (!PyArg_ParseTuple(_args, "hl",
  240. &vRefNum,
  241. &dirID))
  242. return NULL;
  243. _err = InvalidateFolderDescriptorCache(vRefNum,
  244. dirID);
  245. if (_err != noErr) return PyMac_Error(_err);
  246. Py_INCREF(Py_None);
  247. _res = Py_None;
  248. return _res;
  249. }
  250. static PyObject *Folder_IdentifyFolder(PyObject *_self, PyObject *_args)
  251. {
  252. PyObject *_res = NULL;
  253. OSErr _err;
  254. short vRefNum;
  255. long dirID;
  256. FolderType foldType;
  257. if (!PyArg_ParseTuple(_args, "hl",
  258. &vRefNum,
  259. &dirID))
  260. return NULL;
  261. _err = IdentifyFolder(vRefNum,
  262. dirID,
  263. &foldType);
  264. if (_err != noErr) return PyMac_Error(_err);
  265. _res = Py_BuildValue("O&",
  266. PyMac_BuildOSType, foldType);
  267. return _res;
  268. }
  269. static PyMethodDef Folder_methods[] = {
  270. {"FindFolder", (PyCFunction)Folder_FindFolder, 1,
  271. PyDoc_STR("(short vRefNum, OSType folderType, Boolean createFolder) -> (short foundVRefNum, long foundDirID)")},
  272. {"ReleaseFolder", (PyCFunction)Folder_ReleaseFolder, 1,
  273. PyDoc_STR("(short vRefNum, OSType folderType) -> None")},
  274. {"FSFindFolder", (PyCFunction)Folder_FSFindFolder, 1,
  275. PyDoc_STR("(short vRefNum, OSType folderType, Boolean createFolder) -> (FSRef foundRef)")},
  276. {"AddFolderDescriptor", (PyCFunction)Folder_AddFolderDescriptor, 1,
  277. PyDoc_STR("(FolderType foldType, FolderDescFlags flags, FolderClass foldClass, FolderLocation foldLocation, OSType badgeSignature, OSType badgeType, Str255 name, Boolean replaceFlag) -> None")},
  278. {"GetFolderTypes", (PyCFunction)Folder_GetFolderTypes, 1,
  279. PyDoc_STR("(UInt32 requestedTypeCount) -> (UInt32 totalTypeCount, FolderType theTypes)")},
  280. {"RemoveFolderDescriptor", (PyCFunction)Folder_RemoveFolderDescriptor, 1,
  281. PyDoc_STR("(FolderType foldType) -> None")},
  282. #ifndef __LP64__
  283. {"GetFolderName", (PyCFunction)Folder_GetFolderName, 1,
  284. PyDoc_STR("(short vRefNum, OSType foldType, Str255 name) -> (short foundVRefNum)")},
  285. {"AddFolderRouting", (PyCFunction)Folder_AddFolderRouting, 1,
  286. PyDoc_STR("(OSType fileType, FolderType routeFromFolder, FolderType routeToFolder, RoutingFlags flags, Boolean replaceFlag) -> None")},
  287. {"RemoveFolderRouting", (PyCFunction)Folder_RemoveFolderRouting, 1,
  288. PyDoc_STR("(OSType fileType, FolderType routeFromFolder) -> None")},
  289. {"FindFolderRouting", (PyCFunction)Folder_FindFolderRouting, 1,
  290. PyDoc_STR("(OSType fileType, FolderType routeFromFolder) -> (FolderType routeToFolder, RoutingFlags flags)")},
  291. #endif /* !__LP64__ */
  292. {"InvalidateFolderDescriptorCache", (PyCFunction)Folder_InvalidateFolderDescriptorCache, 1,
  293. PyDoc_STR("(short vRefNum, long dirID) -> None")},
  294. {"IdentifyFolder", (PyCFunction)Folder_IdentifyFolder, 1,
  295. PyDoc_STR("(short vRefNum, long dirID) -> (FolderType foldType)")},
  296. {NULL, NULL, 0}
  297. };
  298. void init_Folder(void)
  299. {
  300. PyObject *m;
  301. PyObject *d;
  302. m = Py_InitModule("_Folder", Folder_methods);
  303. d = PyModule_GetDict(m);
  304. Folder_Error = PyMac_GetOSErrException();
  305. if (Folder_Error == NULL ||
  306. PyDict_SetItemString(d, "Error", Folder_Error) != 0)
  307. return;
  308. }
  309. /* ======================= End module _Folder ======================= */