home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Utilities / ctc 1.6 / GetApplication name.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-11  |  2.7 KB  |  93 lines  |  [TEXT/KAHL]

  1. /*****************
  2.     The following routine are based on DTS sample code.
  3.     
  4. */
  5.  
  6. #include <Files.h>
  7. OSErr GetApplicationName(OSType fCreator, FSSpec *file, short ioVRefNum);
  8. OSErr VolHasOption( short vRefNum, Boolean *hasDesktop, short option );
  9. OSErr VolHasDesktopDB( short vRefNum, Boolean *hasDesktop );
  10. OSErr FindAppOnVolume( OSType sig, short vRefNum, FSSpec *file );
  11.     /*************************************
  12.     Get name of application that created it, if on volume being scanned!
  13.     **************************************/
  14. OSErr GetApplicationName(OSType fCreator, FSSpec *file, short ioVRefNum)
  15. {        Boolean hasDesktop;
  16.         OSErr rc;
  17.         
  18.         rc = VolHasDesktopDB( ioVRefNum, &hasDesktop);
  19.         if (rc == noErr && hasDesktop) {
  20.             rc = FindAppOnVolume(fCreator, ioVRefNum, file );
  21.         } else
  22.             if (rc == noErr) rc = -1;
  23. return rc;
  24. }
  25.  
  26. /* ////////////////////////////////////////////////////////////
  27.   //    VolHasDesktopDB                                        //
  28.  //            Check if a volume supports desktop DB calls       //
  29. //////////////////////////////////////////////////////////*/
  30. OSErr VolHasDesktopDB( short vRefNum, Boolean *hasDesktop )
  31. {
  32.     return VolHasOption(vRefNum, hasDesktop, bHasDesktopMgr );
  33. }
  34.  
  35.  
  36.  
  37. OSErr VolHasOption( short vRefNum, Boolean *hasDesktop, short option )
  38. {    HParamBlockRec pb;
  39.     GetVolParmsInfoBuffer info;    // Volume Info Rec; see IM-VI 25-32
  40.     OSErr err;
  41.     
  42. {    long i, *ip;
  43.     for( i=0, ip=(long*)&pb; i<sizeof(pb)/sizeof(long); i++ )        // Clear pb
  44.         *ip++ = 0;
  45. }
  46.     pb.ioParam.ioCompletion = NULL;
  47.     pb.ioParam.ioNamePtr = NULL;
  48.     pb.ioParam.ioVRefNum = vRefNum;
  49.     pb.ioParam.ioBuffer = (Ptr)&info;
  50.     pb.ioParam.ioReqCount = sizeof(info);
  51.     
  52.     err= PBHGetVolParms(&pb,false);            // Get volume info
  53.  
  54.     *hasDesktop = err==noErr && (info.vMAttrib & (1L << option))!=0;
  55.     return err;
  56. }
  57.  
  58. /* ////////////////////////////////////////////////////////////
  59.   //    FindAppOnVolume                                        //
  60.  //            Ask vol's desktop db for application           //
  61. //////////////////////////////////////////////////////////*/
  62. OSErr FindAppOnVolume( OSType sig, short vRefNum, FSSpec *file )
  63. {    DTPBRec pb;
  64.     OSErr err;
  65.     short refNum;
  66.     
  67. {    long i, *ip;
  68.     for( i=0, ip=(long*)&pb; i<sizeof(pb)/sizeof(long); i++ )        /* Clear pb */
  69.         *ip++ = 0;
  70. }
  71.     pb.ioCompletion = NULL;
  72.     pb.ioVRefNum = vRefNum;
  73.     pb.ioNamePtr = NULL;
  74.     err= PBDTGetPath(&pb);                /* Puts DT refnum into pb.ioDTRefNum */
  75.     if( err ) return err;
  76.     
  77.     refNum = pb.ioDTRefNum;
  78.     
  79.     pb.ioCompletion = NULL;
  80.     pb.ioDTRefNum = refNum;
  81.     pb.ioIndex = 0;
  82.     pb.ioFileCreator = sig;
  83.     pb.ioNamePtr = (StringPtr)&file->name;
  84.     err= PBDTGetAPPLSync(&pb);                        /* Find the Application! */
  85.     
  86.     if( err == fnfErr )
  87.         err = afpItemNotFound;                        /* Bug in PBDTGetAPPL() */
  88.     if( err )    return err;                            /* Returns afpItemNotFound if app wasn't found. */
  89.  
  90.     file->vRefNum = vRefNum;
  91.     file->parID = pb.ioAPPLParID;
  92.     return noErr;
  93. }    /* End of () */