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