discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Finding and Loading Bundles


From: Richard Frith-Macdonald
Subject: Re: Finding and Loading Bundles
Date: Wed, 17 Jun 2009 07:56:37 +0100


On 16 Jun 2009, at 23:49, Stefan Bidigaray wrote:

I'll try to be to the point... I'm need to be able to find some bundles that conform to a particular protocol so that I can load them and maybe use them. I've been reading the Apple docs and I already know how to search the bundle directories and use - conformWithProtocol:. What I'm having a hard time grasping is, how do I find out if the bundle I'm looking at actually meets my criterias before loading it? Is this even possible? Since NSBundle doesn't support unloading (at least according to Apple) I don't want to load every single bundle in the system just to then find out they are just going to take up space. I've read the Apple Plug-in docs and NSBundle Programming Guide, but I still don't know how to do what I'm trying to.

I'm not at all sure you can.

It's true to say that you can't unload bundle code ... the gnu runtime doesn't support it, and while I think I read somewhere that Apple's new 64bit runtime would support it, the standard one definitely didn't last time I looked.

As far as I'm aware, there's no convention for storing the protocols supported by a bundle's principal class in its info.plist, so I don't see how you can check what a bundle does without loading the code.

I think the normal way that an application determines which bundles to load is by using its own directory/filename conventions, so you just search the bundle directories for bundles with the correct names or bundles in subdirectories with the correct names.

> FYI: this is for the NSSound reimplementation effort... I'm trying to support multiple "plug-ins".

Well, as NSSound is a gui class, presumably bundles for it should count as gui library resources. In GNUstep we do have a standard location for gui library resources, and the GNUstep extension [NSBundle +bundleForLibrary:version:] returns the bundle for that location. The problem is, that only returns the bundle in the first domain found (assumed to be the one associated with the library being used), and I guess with plugins you would want to allow bundles to be provided by something other than the standard gui library.

So, I think you are going to have to define your own conventions for this. I would suggest using NSSerarchPathForDirectoriesInDomains(NSLibraryDirectory, NSAllDomainsMask,YES) to get a list of library directories, then look for specific naming patterns in those library directories.
eg.

Assuming your bundles are those with an 'nssound' extension located in the 'Bundles' subdirectory ...

{
  NSString      *path;
  NSArray       *paths;
  NSBundle      *bundle;
  NSEnumerator  *enumerator;
  NSMutableArray *all;

  /* Gather up the paths */
  paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
                                              NSAllDomainsMask, YES);

  enumerator = [paths objectEnumerator];
  all = [NSMutable array arrayWithCapacity: 10];
  while ((path = [enumerator nextObject]) != nil)
    {
      bundle = [self bundleWithPath: path];
paths = [bundle pathsForResourcesOfType: @"nssound" inDirectory: @"Bundles"];
      [all addObjectsFromArray: paths];
    }

  return all;
}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]