[RFC] std.mime design

Johannes Pfau spam at example.com
Sat Oct 1 09:06:31 PDT 2011


I've been working a std.mime module for some time now, and I'd like to
get some feedback on the API design:

Here's the documentation for the current version:
http://dl.dropbox.com/u/24218791/d/src/mime.html

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.

Here are some specific questions regarding the API design:

* I think it's useful to have a global default database which is
  currently implemented through the global functions like getMimeType,
  getByData and getByName etc. However, the windows MIME support is very
  simple and only supports getting the mime type by file extension. So
  getByData, resolveAlias, typesEqual, isSubclass etc won't work on
  windows. Should those functions be moved to a FDO specific backend?
  Should the DataBases be classes so that FDODatabase can be a subclass
  with additional functionality and user code can check which backend is
  used?

* Is it useful to have methods to load and unload additional databases
  to be used with the global functions? This would require all global
  functions to take a lock(ReadWriteMutex). Is it worth it?

* If additional databases could be added to the default database
  lookup, which one should be preferred? For example, if a FDO database
  is loaded on a windows system, should the windows database or the FDO
  database be preferred?

* It is of course always possible to load a FDOCache manually and use
  it's instance methods. The preceding questions only affect the global
  functions.

* getTypeFromFS currently doesn't throw if the underlying filesystem
  doesn't support extended attributes. Consider an application reading
  a directory with 10_000 files. The app wants to check if the files
  are music files. If someone explicitly set the files content type,
  that information can be trusted. So the app calls getTypeFromFS on
  all 10_000 files. Now if the filesystem didn't support extended
  attributes and getTypeFromFS did throw, 10_000 exceptions would slow
  down the application a lot. It's also not possible to say:
  getTypeFromFS wasn't supported on file 1, so it won't be supported
  on all other 9_999 files. Those files could be part of a different
  filesystem, and that's hard/impossible to check. So is it OK in this
  case not to throw an Exception on a ENOTSUP error?

* FDOCache currently uses strings instead of MimeTypes. I guess that
  should be changed? FDOCache needs some of these functions to return
  strings though, so I'd have to write wrapper functions taking &
  returning MimeTypes.

* Some of the functions names are not optimal. Thoughts?

* Feedback on the documentation is also appreciated.

And a small implementation issue:
I have to read strings from the mime.cache database files. How can I
prevent to!string(char*) from reading past the end of the data buffer if
a malformed file is loaded? Is there something like a cross-platform
strnlen?

-- 
Johannes Pfau



More information about the Digitalmars-d mailing list