[RFC] std.mime design

Michel Fortin michel.fortin at michelf.com
Sat Oct 1 14:35:10 PDT 2011


On 2011-10-01 16:06:31 +0000, Johannes Pfau <spam at example.com> said:

> The freedesktop.org part is complete, the windows part will be added
> soon (the public API won't change) and it seems there's no API on OSX to
> get a MIME type for a file, so OSX will have to use the freedesktop.org
> backend.

Mac OS X uses primarily Uniform Type Identifiers and maps all other 
kinds of type identifiers (extensions, MIME, HFS+ type codes) to UTIs.

<http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html#//apple_ref/doc/uid/TP40001319-CH202-CHDHIJDE>

If 

you want to get the MIME type for a file, first get its UTI:

	const char * path;

	FSRef fileRef;
	FSPathMakeRef(path, &fileRef, NULL);

	CFStringRef uti = NULL;
	LSCopyItemAttribute(&fileRef, kLSRolesAll, kLSItemContentType, &uti);

then ask for the preferred MIME type for this UTI:

	CFStringRef mime = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType);

You might want to create a C string from that:

	size_t mime_c_str_length = CFStringLength(mime); // assuming ASCII here
	char *mime_c_str = malloc(mime_c_str_length+1);
	CFStringGetCString(mime, mime_c_str, mime_c_str_length+1, 
kCFStringEncodingUTF8);

And once you're done, don't forget to release all those strings to avoid leaks:

	CFRelease(uti);
	CFRelease(mime);
	free(mime_c_str);

-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/



More information about the Digitalmars-d mailing list