Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
compgetinfo.c
#include <Memory.h> |
#include <Types.h> |
#include <Menus.h> |
#include <Windows.h> |
#include <Dialogs.h> |
#include <Fonts.h> |
#include <Devices.h> |
#include <Printing.h> |
#include <Controls.h> |
#include <Errors.h> |
#include <Quickdraw.h> |
/* this is the data structure pointed to in the result of the |
disk driver call csCode=21 (get ICN#/comment). This call |
works on all devices. |
*/ |
typedef struct TInfoBlk { |
unsigned char icon[128]; /* icon */ |
unsigned char mask[128]; /* mask */ |
Str255 infoString; /* info string (for get info) */ |
} TInfoBlk,*TInfoPtr; |
void GetDiskInfo(short driverRefNum,short driveNum,TInfoPtr *dataBlk); |
void DrawInfo(TInfoPtr infoBlock); |
void GetAllInfo(void); |
void GetAllInfoYourWay(void); |
#ifdef powerc |
QDGlobals qd; |
#endif |
void main(void) |
{ |
WindowPtr theWindow; |
Rect wBounds; |
InitGraf(&qd.thePort); |
InitFonts(); |
InitWindows(); |
InitMenus(); |
TEInit(); |
InitDialogs(nil); |
FlushEvents(everyEvent,0); |
InitCursor(); |
SetRect(&wBounds,40,40,100,100); |
theWindow = NewWindow (nil,&wBounds,(StringPtr)"\pIcons",true,documentProc, |
(WindowPtr)(-1),true,0L); |
SetPort(theWindow); |
GetAllInfo(); |
DisposeWindow(theWindow); |
} |
/* This routine traverses the currently mounted volumes |
index using PBHGetVInfo(). The drive # and device |
driver number for each volume is extracted from the |
parameter block, and passed into GetDiskInfo() to |
call the disk drivers. |
Once the data has been retrieved, the icon is plotted |
*/ |
void GetAllInfo(void) |
{ |
HParamBlockRec vBlock; /* volume parameter block used to traverse mounted vols */ |
OSErr err; |
TInfoPtr dataBlk; /* pointer used to point to result of csCode=21 call */ |
vBlock.volumeParam.ioNamePtr = nil; |
vBlock.volumeParam.ioVRefNum = 0; |
vBlock.volumeParam.ioVolIndex = 1; |
do { |
err = PBHGetVInfo (&vBlock,false); |
vBlock.volumeParam.ioVolIndex++; |
if (err==noErr) { |
GetDiskInfo(vBlock.volumeParam.ioVDRefNum, |
vBlock.volumeParam.ioVDrvInfo,&dataBlk); |
if (dataBlk) |
DrawInfo(dataBlk); |
} |
} while (err==noErr); |
} |
/* GetDiskInfo() makes the call to the volume's driver to get the |
volume icon and info string. A pointer to this data is returned |
by reference in dataBlk |
This routine tries to call the disk's driver with csCode=22, |
which attempts to get info on a specific physical volume. |
If the csCode=22 call fails, I call csCode=21 to get the generalized |
media icon. |
Both calls are documented in IM V-470 |
*/ |
void GetDiskInfo(short driverRefNum,short driveNum,TInfoPtr *dataBlk) |
{ |
ParamBlockRec pBlock; |
OSErr err; |
pBlock.cntrlParam.ioVRefNum = driveNum; |
pBlock.cntrlParam.ioCRefNum = driverRefNum; |
pBlock.cntrlParam.csCode = 22; |
err = PBControl(&pBlock,false); |
if (err==controlErr) { |
pBlock.cntrlParam.ioVRefNum = driveNum; |
pBlock.cntrlParam.ioCRefNum = driverRefNum; |
pBlock.cntrlParam.csCode = 21; |
err = PBControl(&pBlock,false); |
} |
if (err==noErr) |
*dataBlk = (TInfoPtr) *(Ptr *)pBlock.cntrlParam.csParam; /* messy way to get the locn out */ |
else *dataBlk = nil; |
} |
/* this routine uses CopyBits to draw the icon on the screen (ignoring the mask and |
the info string). Make sure you put up a window and call SetPort() first! |
*/ |
void DrawInfo(TInfoPtr infoBlock) |
{ |
BitMap iconMap; |
Rect destRect; |
iconMap.baseAddr = (Ptr)infoBlock; |
iconMap.rowBytes = 4; |
SetRect(&iconMap.bounds,0,0,32,32); |
SetRect(&destRect,0,0,32,32); |
OffsetRect(&destRect,10,10); |
CopyBits(&iconMap,&qd.thePort->portBits,&iconMap.bounds,&destRect, |
srcCopy,nil); |
while (!Button()); |
while (Button()); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14