[interfacekit] Re: MimeDatabase
- From: "Ingo Weinhold" <bonefish@xxxxxxxxxxxxxxx>
- To: interfacekit@xxxxxxxxxxxxx
- Date: Fri, 23 Aug 2002 01:15:21 CEST (+0200)
> On 2002-08-21 at 14:52:50 [-0700], interfacekit@xxxxxxxxxxxxx wrote:
> > Not so on my machine.
> [...]
> > Therefore my conclusion is, that =5F=5Fmime=5Ftable is not just legacy,
> > but
> > is useful to speed up the boot process -- when the registrar is
> > started, it doesn't need to scan the database for applications'
> > supported types and build the reverse mapping, but it can just read
> > in
> > =5F=5Fmime=5Ftable instead.
>
> That would make sense. I'm still not sure why I've been unable to add
> entries to my copy (I've tried rebooting, I've tried BEOS:FILE=5FTYPES
> resources as in the keymap preflet...), but it's possible I'm just
> not
> getting the formula right.
Mmh, I've just tried it, and it worked exactly as I expected: The app
had a signature and a supported file type set in the resources. After
launching it from the Tracker, its signature appeared in the list
retrieved via BMimeType::GetSupportingApps(), but not in =5F=5Fmime=5Ftable.
I immediately rebooted and voil=E0 it also found its way into the latter.
> > > I still don't know how information gets added to the =5F=5Fmime=5Ftable
> > > file
> > > though. As best I've been able to tell, create=5Fapp=5Fmeta=5Fmime()
> > > doesn't
> > > do it.
> >
> > I believe it does. Not directly though -- it sends a message to the
> > registrar and the "mime updater" does the job, certainly using
> > BAppFileInfo, which uses BMimeType::SetSupportedTypes(), which in
> > turn
> > does the change to the in-memory version of =5F=5Fmime=5Ftable. The file
> > is
> > only written on shutdown and probably now and then whilst running.
>
> Like I mentioned, I've tried rebooting, and to no effect. The
> information shows up in the database, but not =5F=5Fmime=5Ftable... I think
> I
> have a lazy registrar.
Lazy employees... you should fire it and hire a new one. ;-)
> I just don't see that supported types are all that different from the
> other attributes BMimeType gives access to. And certainly, why would
> we
> want to keep someone from being able to at least lookup the types
> supported by a given app=3F It seems highly inconsistent to me to give
> unlimited access to the rest of the database through BMimeType but
> then
> exclude supported types. And code-wise, they're essentially no
> different from Get/SetFileExtensions() or Get/SetAttrInfo(). A little
> more code will be needed to update the supported apps table, but not
> so
> much that it justifies making those methods private (plus, assuming
> BAppFileInfo implements SetSupportedTypes() functionality, we'll have
> to do it anyway... :-).
>
> So any way, my vote's for making them public. Like you said though,
> it's not like it'll be a lot of work to change them one way or the
> other :-).
That's true only for one direction. Once it has been public in a
release it can't be changed back to private without breaking source
compatibility. While I share your opinion in principle, it makes me a
bit unsure, that I don't know, why Be made them private. I think, they
must have had a reason.
> Incidentally, I have Get/SetSupportedTypes() implemented but
> not yet checked in, in case you might find them useful for
> BAppFileInfo.
Great!
> > I'm not sure, if this invalidation+lazy-reinitialization strategy
> > is
> > advantageous in all cases. E.g. the set of (all) installed types is
> > large, but seldomly changed. A single Install() or Delete() would
> > require to rebuild the whole message instead of just adding/
> > deleting
> > one item. There may be issues with finding the index of the type to
> > be
> > added/removed though. Don't know...
>
> Well, after looking BMessage over and thinking about it, I believe it
> *would* be faster to maintain everything in BMessages. You'd need to
> keep a mapping of mimetypes to indices in the BMessage. Adding would
> be
> easy, but deleting would require an update of the indices in the map
> for all the mimetypes following the type removed. Overall it's still
> O(n), but decrementing O(n) integers in memory should be considerably
> faster than walking through the entire database again on disk. It'll
> be
> a bit more complicated, too, but I bet it would be worth it.
>
> I have GetInstalledTypes(BMessage*) done using the method I
> originally
> mentioned, so perhaps I'll reimplement it using this BMessage method
> and see which is really faster before finishing everything else.
Please let's postpone this, as all optimizations, until more important
things have been done.
> > I'd like to propose to encapsulate all this functionality into a
> > separate class. If its interface is designed cleverly, we are free
> > to
> > play with its guts afterwards.
>
> Done. :-) The interface I'm currently using is essentially identical
> to
> that from BMimeType:
Alright, then just leave it like that for the time being. A time will
come, when we can fine-tune any aspect we've neglected. :-P
CU, Ingo
Other related posts: