diff options
Diffstat (limited to 'src/mac.c')
| -rw-r--r-- | src/mac.c | 50 |
1 files changed, 47 insertions, 3 deletions
| @@ -448,6 +448,22 @@ mac_coerce_file_name_ptr (type_code, data_ptr, data_size, | |||
| 448 | } | 448 | } |
| 449 | else | 449 | else |
| 450 | err = memFullErr; | 450 | err = memFullErr; |
| 451 | |||
| 452 | if (err != noErr) | ||
| 453 | { | ||
| 454 | /* Just to be paranoid ... */ | ||
| 455 | FSRef fref; | ||
| 456 | char *buf; | ||
| 457 | |||
| 458 | buf = xmalloc (data_size + 1); | ||
| 459 | memcpy (buf, data_ptr, data_size); | ||
| 460 | buf[data_size] = '\0'; | ||
| 461 | err = FSPathMakeRef (buf, &fref, NULL); | ||
| 462 | xfree (buf); | ||
| 463 | if (err == noErr) | ||
| 464 | err = AECoercePtr (typeFSRef, &fref, sizeof (FSRef), | ||
| 465 | to_type, result); | ||
| 466 | } | ||
| 451 | #else | 467 | #else |
| 452 | FSSpec fs; | 468 | FSSpec fs; |
| 453 | char *buf; | 469 | char *buf; |
| @@ -510,6 +526,34 @@ mac_coerce_file_name_ptr (type_code, data_ptr, data_size, | |||
| 510 | CFDataGetLength (data), result); | 526 | CFDataGetLength (data), result); |
| 511 | CFRelease (data); | 527 | CFRelease (data); |
| 512 | } | 528 | } |
| 529 | |||
| 530 | if (err != noErr) | ||
| 531 | { | ||
| 532 | /* Coercion from typeAlias to typeFileURL fails on Mac OS X | ||
| 533 | 10.2. In such cases, try typeFSRef as a target type. */ | ||
| 534 | char file_name[MAXPATHLEN]; | ||
| 535 | |||
| 536 | if (type_code == typeFSRef && data_size == sizeof (FSRef)) | ||
| 537 | err = FSRefMakePath (data_ptr, file_name, sizeof (file_name)); | ||
| 538 | else | ||
| 539 | { | ||
| 540 | AEDesc desc; | ||
| 541 | FSRef fref; | ||
| 542 | |||
| 543 | err = AECoercePtr (type_code, data_ptr, data_size, | ||
| 544 | typeFSRef, &desc); | ||
| 545 | if (err == noErr) | ||
| 546 | { | ||
| 547 | err = AEGetDescData (&desc, &fref, sizeof (FSRef)); | ||
| 548 | AEDisposeDesc (&desc); | ||
| 549 | } | ||
| 550 | if (err == noErr) | ||
| 551 | err = FSRefMakePath (&fref, file_name, sizeof (file_name)); | ||
| 552 | } | ||
| 553 | if (err == noErr) | ||
| 554 | err = AECreateDesc (TYPE_FILE_NAME, file_name, | ||
| 555 | strlen (file_name), result); | ||
| 556 | } | ||
| 513 | #else | 557 | #else |
| 514 | char file_name[MAXPATHLEN]; | 558 | char file_name[MAXPATHLEN]; |
| 515 | 559 | ||
| @@ -529,11 +573,11 @@ mac_coerce_file_name_ptr (type_code, data_ptr, data_size, | |||
| 529 | #else | 573 | #else |
| 530 | fs = *(FSSpec *)(*(desc.dataHandle)); | 574 | fs = *(FSSpec *)(*(desc.dataHandle)); |
| 531 | #endif | 575 | #endif |
| 532 | if (err == noErr) | ||
| 533 | err = fsspec_to_posix_pathname (&fs, file_name, | ||
| 534 | sizeof (file_name) - 1); | ||
| 535 | AEDisposeDesc (&desc); | 576 | AEDisposeDesc (&desc); |
| 536 | } | 577 | } |
| 578 | if (err == noErr) | ||
| 579 | err = fsspec_to_posix_pathname (&fs, file_name, | ||
| 580 | sizeof (file_name) - 1); | ||
| 537 | } | 581 | } |
| 538 | if (err == noErr) | 582 | if (err == noErr) |
| 539 | err = AECreateDesc (TYPE_FILE_NAME, file_name, | 583 | err = AECreateDesc (TYPE_FILE_NAME, file_name, |