I started this thread and I've been tinkering around with solutions
for weeks now. Let me start off by saying that I originally tried to
tackle this on my own, I search archives and all the RB sites for an
answer. I originally stumbled across Charles' 'DevInfo.rb' example. I
wrongly implemented the routines and found them too slow and
unresponsive to use. After finding no other answer to my problem I
asked the List. Charles responded with a suggestion to use the old
PrameterBlock method. While these routines are still alive in the OS
they are doomed to be dumped any minute. Charles is the man when it
comes to these kind of answers so I decided to take a look at re-
implementing his DevInfo code.
If used properly this is a very acceptable solution and all (almost
all) info is correct. At startup of my App I read all available
drives and store in my own list including volume name, ID, and all
info reported by the shell script. Then I just check to see if the
VolumeCount has changed. If VolumeCount is less I remove the missing
volume from the list and if it's greater I add the item to the list.
This way a volume only needs to be checked once. There are some
downsides to using this method: it is slow and enough to put the
business end of a pistol in your mouth when it comes across a DC/DVD
and the drive is sleeping. Unfortunately OSX users are familiar with
this sort of issue as unexpected stalls and the spinning rainbow
pizza of death pops up for a while many times and for unexpected
reasons. At least I know why it stalls while spinning up the CD/DVD
drive and gathering the info but it is painfully slow at best. Other
volumes take about a second each(which is very slow compared to the
old PB method). The more volumes the longer it takes. As a benchmark
I have a G4 with a 2.0 GHz single proc and 2Gb Ram, 4 internal hard
drives and a CD/DVD drive. For testing I also connected a USB Flash
drive, a USB external HD, and a Firewire external HD. If the CD/DVD
is awake it takes about 20 seconds to scan all 8 volumes. If the CD/
DVD drive is sleeping it can take well over a minute:-(
Using this method, all the data returned is correct except one little
issue. I have a laptop drive in an external USB enclosure and it
falsely reports that the volume is bootable. This is possibly due to
the drive was in a powerbook and a flag might be set on the drive at
formatting which is falsely reporting this condition. Not sure about
why I get the false info on that but all Firewire drive info is
accurate.
I hope this helps and realize this was a long winded post and I
apologize. I would also like to thank all who offered solutions to my
quest, especially Charles who seems to have many of the answers I
seek. I hope this can be my way to guide others as I have been guided.
Craig
==================================================
Message: 5
Subject: Re: Finding Ejectable Volumes.
From: "Dennis Birch" <[EMAIL PROTECTED]>
Date: Mon, 29 May 2006 12:52:14 -0700
I implemented the suggested declares solution in a module and it works
great for CD-ROMs and USB devices I've mounted. However my external
FireWire drive (which can be safely unmounted in the Finder) does not
show as being ejectable. Anybody happen to know why that might be the
case?
On 5/23/06, Charles Yeomans <[EMAIL PROTECTED]> wrote:
This information is not hard to retrieve for MacOS. You call
PBHGetVolParmsSync. You test the extended attributes field of the
GetVolParmsInfoBuffer struct passed. The volume is ejectable when
bit 0 is set. The Volumes section of chapter 4 of my declares book
has an example that calls PBHGetVolParmsSync.
==================================================
Message: 7
Subject: Re: Finding Ejectable Volumes.
From: "Dennis Birch" <[EMAIL PROTECTED]>
Date: Mon, 29 May 2006 13:58:15 -0700
I should add that the IsEjectable function also works correctly with
volumes mounted from disk images, and with network volumes.
On 5/29/06, Dennis Birch <[EMAIL PROTECTED]> wrote:
I implemented the suggested declares solution in a module and it
works
great for CD-ROMs and USB devices I've mounted. However my external
FireWire drive (which can be safely unmounted in the Finder) does not
show as being ejectable. Anybody happen to know why that might be the
case?
On 5/23/06, Charles Yeomans <[EMAIL PROTECTED]> wrote:
This information is not hard to retrieve for MacOS. You call
PBHGetVolParmsSync. You test the extended attributes field of the
GetVolParmsInfoBuffer struct passed. The volume is ejectable when
bit 0 is set. The Volumes section of chapter 4 of my declares book
has an example that calls PBHGetVolParmsSync.
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>