home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / Catalog Service Access Module / DTS Sample CSAM / Src / DirectoryInterface.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-23  |  4.5 KB  |  190 lines  |  [TEXT/KAHL]

  1. /*                                DirectoryInterface.c                            */
  2. /*
  3.  * DirectoryInterface.c
  4.  * Copyright © 1992-93 Apple Computer Inc. All Rights Reserved.
  5.  *
  6.  * Interface jacket routines to a few of the low-level OCE
  7.  * directory service routines.
  8.  */
  9. #include "DTSSampleCSAM.h"
  10.  
  11. pascal void                ADASInitDSPB(
  12.         DirParamBlock            *dspb
  13.     );
  14.  
  15. /*
  16.  * Open the personal directory
  17.  */
  18. pascal OSErr
  19. ADASOpenPAB(
  20.         FSSpec                    *spec,
  21.         char                    permissionsRequested,
  22.         short                    *refNum
  23.     )
  24. {
  25.         OSErr                    status;
  26.         DirParamBlock            dspb;
  27.         
  28.         
  29.         ADASInitDSPB(&dspb);
  30.         dspb.openPersonalDirectoryPB.fsSpec = spec;
  31.         dspb.openPersonalDirectoryPB.accessRequested
  32.             = permissionsRequested;
  33.         status = DirOpenPersonalDirectory(&dspb);
  34.         *refNum = (status == noErr)
  35.                 ? dspb.header.dsRefNum
  36.                 : kRefNumUnknown;
  37.         LogStatusX('ADAS', status, "\pADASOpenPAB");
  38.         return (status);
  39. }
  40.  
  41. pascal OSErr
  42. ADASClosePAB(
  43.         short                    refNum
  44.     )
  45. {
  46.         OSErr                    status;
  47.         DirParamBlock            dspb;
  48.         
  49.         if (refNum == kRefNumUnknown)
  50.             status = noErr;            /* Correct status?    */
  51.         else {
  52.             ADASInitDSPB(&dspb);
  53.             dspb.header.dsRefNum = refNum;
  54.             status = DirClosePersonalDirectory(&dspb);
  55.         }    
  56.         LogStatusX('ADAS', status, "\pDirClosePersonalDirectory");
  57.         return (status);
  58. }
  59.  
  60. pascal OSErr
  61. ADASLookupAttributeValue(
  62.         RecordID                *rid,
  63.         short                    dsRefNum,
  64.         AuthIdentity            identity, 
  65.         long                    bufferSize,
  66.         Boolean                    includeStartingPoint,
  67.         AttributeType            *attrType, 
  68.         const AttributeCreationID *attrCID, 
  69.         long                    clientData,
  70.         ForEachAttrValue        eachAttrValue
  71.     )
  72. {
  73.         OSErr                    status;
  74.         DirParamBlock            dspb;
  75.         RecordIDPtr                aRecord[1];
  76.         AttributeTypePtr        attrTypeList[1];
  77.         void                    *dataBuffer;
  78.     
  79.         ADASInitDSPB(&dspb);
  80.         attrTypeList[0] = attrType;
  81.         aRecord[0] = rid;
  82.         /*
  83.          * We need to deal with the case where the buffer is
  84.          * too small.
  85.          */
  86.         dataBuffer = NewPtr(bufferSize);
  87.         status = MemError();
  88.         if (status == noErr) {
  89.             dspb.lookupGetPB.identity = identity;
  90.             dspb.lookupGetPB.dsRefNum = dsRefNum;
  91.             dspb.lookupGetPB.aRecordList = aRecord;
  92.             dspb.lookupGetPB.recordIDCount = 1;
  93.             dspb.lookupGetPB.attrTypeCount = 1;
  94.             dspb.lookupGetPB.attrTypeList = attrTypeList;
  95.             dspb.lookupGetPB.startingRecordIndex = 1;
  96.             dspb.lookupGetPB.startingAttrTypeIndex = 1;
  97.             dspb.lookupGetPB.startingAttribute.cid = *attrCID;
  98.             /*
  99.              */
  100.             dspb.lookupParsePB.clientData = clientData;
  101.             dspb.lookupParsePB.eachRecordID = NULL;
  102.             dspb.lookupParsePB.eachAttrType = NULL;
  103.             dspb.lookupParsePB.eachAttrValue = eachAttrValue;
  104.             do {
  105.                 dspb.lookupGetPB.includeStartingPoint
  106.                         = includeStartingPoint;
  107.                 dspb.lookupGetPB.getBuffer = dataBuffer;
  108.                 dspb.lookupGetPB.getBufferSize = bufferSize;
  109.                 AuditLookupGetPB(&dspb);
  110.                 status = DirLookupGet(&dspb, FALSE);
  111.                 LogStatusX('ALog', status, "\pDirLookupGet");
  112.                 if (status == noErr
  113.                  || status == kOCEMoreData) {
  114.                     status = DirLookupParse(&dspb, FALSE);
  115.                     LogStatusX('ALog', status, "\pDirLookupParse");
  116.                     /*
  117.                      * If we couldn't fit at least one attribute
  118.                      * value, increase our buffer and try again.
  119.                      */
  120.                     if (status == kOCEMoreAttrValue) {
  121.                         DisposPtr((Ptr) dataBuffer);
  122.                         bufferSize *= 2;
  123.                         dataBuffer = NewPtr(bufferSize);
  124.                         status = MemError();
  125.                         includeStartingPoint = true;
  126.                         if (status == noErr)
  127.                             status = kOCEMoreData;
  128.                     }
  129.                     else {
  130.                         includeStartingPoint = false;
  131.                     }
  132.                 }
  133.             } while (status == kOCEMoreData);
  134.             DisposePtr((Ptr) dataBuffer);
  135.         }
  136.         LogStatusX('ADAS', status, "\pADASLookupAttributeValue");
  137.         return (status);
  138. }
  139.  
  140. pascal OSErr
  141. ADASGetOCESetupInfo(
  142.         RecordID                *rid,
  143.         short                    *refNum
  144.     )
  145. {
  146.         OSErr                    status;
  147.         DirParamBlock            dspb;
  148.         
  149.         ADASInitDSPB(&dspb);
  150.         rid->rli = NULL;
  151.         rid->local.recordName = NULL;
  152.         rid->local.recordType = NULL;
  153.         status = DirGetOCESetupRefNum(&dspb, false);
  154.         if (status == noErr) {
  155.             *refNum = dspb.header.dsRefNum;
  156.             if (*refNum == kRefNumUnknown) {
  157.                 LogTextX('ADAS', "\pUnknown RefNum in ADASGetOCESetupInfo");
  158.                 status = paramErr;
  159.             }
  160.             rid->local.cid =
  161.                     dspb.dirGetOCESetupRefNumPB.oceSetupRecordCID;
  162.         }
  163.         else {
  164.             *refNum = kRefNumUnknown;
  165.             OCESetCreationIDtoNull(&rid->local.cid);
  166.         }
  167.         LogStatusX('ADAS', status, "\pADASGetOCESetupInfo err");
  168.         return (status);
  169. }
  170.  
  171. pascal void
  172. ADASInitDSPB(
  173.         DirParamBlock            *dspb
  174.     )
  175. {
  176.         register unsigned char        *pbPtr;
  177.         register unsigned char        *pbEnd;
  178.         
  179.         /*
  180.          * This is probably overkill.
  181.          */
  182.         pbPtr = (unsigned char *) dspb;
  183.         pbEnd = pbPtr + sizeof (DirParamBlock);
  184.         while (pbPtr < pbEnd)
  185.             *pbPtr++ = 0;
  186.         * ((long *) &dspb->header.serverHint) = 0;
  187.         dspb->header.identity = 0;
  188.         dspb->header.dsRefNum = kRefNumUnknown;    
  189. }
  190.