topical media & game development

talk show tell print

lib-of-vs-libs-QTDevWin-CIncludes-OCEMessaging.h / h



  /*
       File:       OCEMessaging.h
   
       Contains:   Apple Open Collaboration Environment Messaging Interfaces.
   
       Version:    Technology: AOCE Toolbox 1.02
                   Release:    QuickTime 6.0.2
   
       Copyright:  (c) 1994-2001 by Apple Computer, Inc., all rights reserved.
   
       Bugs?:      For bug reports, consult the following page on
                   the World Wide Web:
   
                       http://developer.apple.com/bugreporter/
   
  */
  ifndef __OCEMESSAGING__
  define __OCEMESSAGING__
  
  ifndef __FILES__
  include <Files.h>
  endif
  
  ifndef __MACTYPES__
  include <MacTypes.h>
  endif
  
  ifndef __DIGITALSIGNATURE__
  include <DigitalSignature.h>
  endif
  
  ifndef __OCE__
  include <OCE.h>
  endif
  
  ifndef __OCEAUTHDIR__
  include <OCEAuthDir.h>
  endif
  
  if PRAGMA_ONCE
  #pragma once
  endif
  
  ifdef __cplusplus
  extern "C" {
  endif
  
  if PRAGMA_IMPORT
  #pragma import on
  endif
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=mac68k
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(push, 2)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack(2)
  endif
  
  
***************************************************************************

  
  /* Definitions common to OCEMessaging and to OCEMail. These relate to addressing,
  message ids and priorities, etc. */
  
  /* Values of IPMPriority */
  enum {
      kIPMAnyPriority             = 0,                            /* FOR FILTER ONLY */
      kIPMNormalPriority          = 1,
      kIPMLowPriority             = 2,
      kIPMHighPriority            = 3
  };
  
  typedef Byte                            IPMPriority;
  /* Values of IPMAccessMode */
  enum {
      kIPMAtMark                  = 0,
      kIPMFromStart               = 1,
      kIPMFromLEOM                = 2,
      kIPMFromMark                = 3
  };
  
  typedef unsigned short                  IPMAccessMode;
  enum {
      kIPMUpdateMsgBit            = 4,
      kIPMNewMsgBit               = 5,
      kIPMDeleteMsgBit            = 6
  };
  
  /* Values of IPMNotificationType */
  enum {
      kIPMUpdateMsgMask           = 1 << kIPMUpdateMsgBit,
      kIPMNewMsgMask              = 1 << kIPMNewMsgBit,
      kIPMDeleteMsgMask           = 1 << kIPMDeleteMsgBit
  };
  
  typedef Byte                            IPMNotificationType;
  /* Values of IPMSenderTag */
  enum {
      kIPMSenderRStringTag        = 0,
      kIPMSenderRecordIDTag       = 1
  };
  
  typedef unsigned short                  IPMSenderTag;
  enum {
      kIPMFromDistListBit         = 0,
      kIPMDummyRecBit             = 1,
      kIPMFeedbackRecBit          = 2,                            /* should be redirected to feedback queue */
      kIPMReporterRecBit          = 3,                            /* should be redirected to reporter original queue */
      kIPMBCCRecBit               = 4                             /* this recipient is blind to all recipients of message */
  };
  
  /* Values of OCERecipientOffsetFlags */
  enum {
      kIPMFromDistListMask        = 1 << kIPMFromDistListBit,
      kIPMDummyRecMask            = 1 << kIPMDummyRecBit,
      kIPMFeedbackRecMask         = 1 << kIPMFeedbackRecBit,
      kIPMReporterRecMask         = 1 << kIPMReporterRecBit,
      kIPMBCCRecMask              = 1 << kIPMBCCRecBit
  };
  
  typedef Byte                            OCERecipientOffsetFlags;
  
  struct OCECreatorType {
      OSType                          msgCreator;
      OSType                          msgType;
  };
  typedef struct OCECreatorType           OCECreatorType;
  enum {
      kIPMTypeWildCard            = FOUR_CHAR_CODE('ipmw'),
      kIPMFamilyUnspecified       = 0,
      kIPMFamilyWildCard          = 0x3F3F3F3F,                   /* '????' * well known signature */
      kIPMSignature               = FOUR_CHAR_CODE('ipms'),       /* base type * well known message types */
      kIPMReportNotify            = FOUR_CHAR_CODE('rptn'),       /* routing feedback * well known message block types */
      kIPMEnclosedMsgType         = FOUR_CHAR_CODE('emsg'),       /* enclosed (nested) message */
      kIPMReportInfo              = FOUR_CHAR_CODE('rpti'),       /* recipient information */
      kIPMDigitalSignature        = FOUR_CHAR_CODE('dsig')        /* digital signature */
  };
  
  /* Values of IPMMsgFormat */
  enum {
      kIPMOSFormatType            = 1,
      kIPMStringFormatType        = 2
  };
  
  typedef unsigned short                  IPMMsgFormat;
  typedef Str32                           IPMStringMsgType;
  
  union TheType {
      OCECreatorType                  msgOSType;
      IPMStringMsgType                msgStrType;
  };
  typedef union TheType                   TheType;
  
  struct IPMMsgType {
      IPMMsgFormat                    format;                     /* IPMMsgFormat*/
      TheType                         theType;
  };
  typedef struct IPMMsgType               IPMMsgType;
  /*
  Following are the known extension values for IPM addresses handled by Apple.
  We define the definition of the entn extension below.
  */
  enum {
      kOCEalanXtn                 = FOUR_CHAR_CODE('alan'),
      kOCEentnXtn                 = FOUR_CHAR_CODE('entn'),       /* entn = entity name (aka DSSpec) */
      kOCEaphnXtn                 = FOUR_CHAR_CODE('aphn')
  };
  
  /*
  Following are the specific definitions for the extension for the standard
  OCEMail 'entn' addresses.  [Note, the actual extension is formatted as in
  IPMEntityNameExtension.]
  */
  /* entn extension forms */
  enum {
      kOCEAddrXtn                 = FOUR_CHAR_CODE('addr'),
      kOCEQnamXtn                 = FOUR_CHAR_CODE('qnam'),
      kOCEAttrXtn                 = FOUR_CHAR_CODE('attr'),       /* an attribute specification */
      kOCESpAtXtn                 = FOUR_CHAR_CODE('spat')        /* specific attribute */
  };
  
  /*
  Following are the specific definitions for standard
  OCEMail 'aphn' extension value.  
  
  All RStrings here are packed (e.g. truncated to length) and even padded (e.g.
  if length odd, then a pad byte (zero) should be introduced before the next field).
  
  The extension value is in the packed form of the following structure:
      RString     phoneNumber;
      RString     modemType;
      Str32       queueuName;
  
  The body of phoneNumber compound RString is in the packed form of the following structure:
      short       subType;
      RString     countryCode;                // used when subType == kOCEUseHandyDial
      RString     areaCode;                   // used when subType == kOCEUseHandyDial
      RString     phone;                      // used when subType == kOCEUseHandyDial
      RString     postFix;                    // used when subType == kOCEUseHandyDial
      RString     nonHandyDialString;         // used when subType == kOCEDontUseHandyDial
  */
  /* phoneNumber sub type constants */
  enum {
      kOCEUseHandyDial            = 1,
      kOCEDontUseHandyDial        = 2
  };
  
  /* FORMAT OF A PACKED FORM RECIPIENT */
  
  struct ProtoOCEPackedRecipient {
      unsigned short                  dataLength;
  };
  typedef struct ProtoOCEPackedRecipient  ProtoOCEPackedRecipient;
  enum {
      kOCEPackedRecipientMaxBytes = (4096 - sizeof(ProtoOCEPackedRecipient))
  };
  
  struct OCEPackedRecipient {
      unsigned short                  dataLength;
      Byte                            data[4094];
  };
  typedef struct OCEPackedRecipient       OCEPackedRecipient;
  
  struct IPMEntnQueueExtension {
      Str32                           queueName;
  };
  typedef struct IPMEntnQueueExtension    IPMEntnQueueExtension;
  /* kOCEAttrXtn */
  
  struct IPMEntnAttributeExtension {
      AttributeType                   attributeName;
  };
  typedef struct IPMEntnAttributeExtension IPMEntnAttributeExtension;
  /* kOCESpAtXtn */
  
  struct IPMEntnSpecificAttributeExtension {
      AttributeCreationID             attributeCreationID;
      AttributeType                   attributeName;
  };
  typedef struct IPMEntnSpecificAttributeExtension IPMEntnSpecificAttributeExtension;
  /* All IPM entn extensions fit within the following */
  
  struct IPMEntityNameExtension {
      OSType                          subExtensionType;
      union {
          IPMEntnSpecificAttributeExtension  specificAttribute;
          IPMEntnAttributeExtension       attribute;
          IPMEntnQueueExtension           queue;
      }                                 u;
  };
  typedef struct IPMEntityNameExtension   IPMEntityNameExtension;
  /* addresses with kIPMNBPXtn should specify this nbp type */
  define kIPMWSReceiverNBPType "\pMsgReceiver" 
  
  struct IPMMsgID {
      unsigned long                   id[4];
  };
  typedef struct IPMMsgID                 IPMMsgID;
  
  /* Values of IPMHeaderSelector */
  enum {
      kIPMTOC                     = 0,
      kIPMSender                  = 1,
      kIPMProcessHint             = 2,
      kIPMMessageTitle            = 3,
      kIPMMessageType             = 4,
      kIPMFixedInfo               = 7
  };
  
  typedef Byte                            IPMHeaderSelector;
  
  union TheSender {
      RString                         rString;
      PackedRecordID                  rid;
  };
  typedef union TheSender                 TheSender;
  
  struct IPMSender {
      IPMSenderTag                    sendTag;
      TheSender                       theSender;
  };
  typedef struct IPMSender                IPMSender;
  
***************************************************************************

  
  /* Definitions specific to OCEMessaging */
  
  typedef unsigned long                   IPMContextRef;
  typedef unsigned long                   IPMQueueRef;
  typedef unsigned long                   IPMMsgRef;
  typedef unsigned long                   IPMSeqNum;
  typedef Str32                           IPMProcHint;
  typedef Str32                           IPMQueueName;
  typedef CALLBACK_API( void , IPMNoteProcPtr )(IPMQueueRef queue, IPMSeqNum seqNum, IPMNotificationType notificationType, unsigned long userData);
  typedef STACK_UPP_TYPE(IPMNoteProcPtr)                          IPMNoteUPP;
  if OPAQUE_UPP_TYPES
  if CALL_NOT_IN_CARBON
      EXTERN_API(IPMNoteUPP)
      NewIPMNoteUPP                  (IPMNoteProcPtr          userRoutine);
  
      EXTERN_API(void)
      DisposeIPMNoteUPP              (IPMNoteUPP              userUPP);
  
      EXTERN_API(void)
      InvokeIPMNoteUPP               (IPMQueueRef             queue,
                                      IPMSeqNum               seqNum,
                                      IPMNotificationType     notificationType,
                                      unsigned long           userData,
                                      IPMNoteUPP              userUPP);
  
  endif  /* CALL_NOT_IN_CARBON */
  
  else
      enum { uppIPMNoteProcInfo = 0x000037C0 };                       /* pascal no_return_value Func(4_bytes, 4_bytes, 1_byte, 4_bytes) */
      #define NewIPMNoteUPP(userRoutine)                              (IPMNoteUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppIPMNoteProcInfo, GetCurrentArchitecture())
      #define DisposeIPMNoteUPP(userUPP)                              DisposeRoutineDescriptor(userUPP)
      #define InvokeIPMNoteUPP(queue, seqNum, notificationType, userData, userUPP)  CALL_FOUR_PARAMETER_UPP((userUPP), uppIPMNoteProcInfo, (queue), (seqNum), (notificationType), (userData))
  endif
  /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
  define NewIPMNoteProc(userRoutine)                             NewIPMNoteUPP(userRoutine)
  define CallIPMNoteProc(userRoutine, queue, seqNum, notificationType, userData) InvokeIPMNoteUPP(queue, seqNum, notificationType, userData, userRoutine)
  
  struct IPMFixedHdrInfo {
      unsigned short                  version;
      Boolean                         authenticated;
      Boolean                         signatureEnclosed;          /*  digital signature enclosed */
      unsigned long                   msgSize;
      IPMNotificationType             notification;
      IPMPriority                     priority;
      unsigned short                  blockCount;
      unsigned short                  originalRcptCount;          /*       original number of recipients */
      unsigned long                   refCon;                     /*       Client defined data */
      unsigned short                  reserved;
      UTCTime                         creationTime;               /*       Time when it was created */
      IPMMsgID                        msgID;
      OSType                          family;                     /* family this msg belongs (e.g. mail) */
  };
  typedef struct IPMFixedHdrInfo          IPMFixedHdrInfo;
  enum {
      kIPMDeliveryNotificationBit = 0,
      kIPMNonDeliveryNotificationBit = 1,
      kIPMEncloseOriginalBit      = 2,
      kIPMSummaryReportBit        = 3,                            /* modify enclose original to only on error */
      kIPMOriginalOnlyOnErrorBit  = 4
  };
  
  enum {
      kIPMNoNotificationMask      = 0x00,
      kIPMDeliveryNotificationMask = 1 << kIPMDeliveryNotificationBit,
      kIPMNonDeliveryNotificationMask = 1 << kIPMNonDeliveryNotificationBit,
      kIPMDontEncloseOriginalMask = 0x00,
      kIPMEncloseOriginalMask     = 1 << kIPMEncloseOriginalBit,
      kIPMImmediateReportMask     = 0x00,
      kIPMSummaryReportMask       = 1 << kIPMSummaryReportBit,
      kIPMOriginalOnlyOnErrorMask = 1 << kIPMOriginalOnlyOnErrorBit,
      kIPMEncloseOriginalOnErrorMask = (kIPMOriginalOnlyOnErrorMask | kIPMEncloseOriginalMask)
  };
  
  /* standard Non delivery codes */
  enum {
      kIPMNoSuchRecipient         = 0x0001,
      kIPMRecipientMalformed      = 0x0002,
      kIPMRecipientAmbiguous      = 0x0003,
      kIPMRecipientAccessDenied   = 0x0004,
      kIPMGroupExpansionProblem   = 0x0005,
      kIPMMsgUnreadable           = 0x0006,
      kIPMMsgExpired              = 0x0007,
      kIPMMsgNoTranslatableContent = 0x0008,
      kIPMRecipientReqStdCont     = 0x0009,
      kIPMRecipientReqSnapShot    = 0x000A,
      kIPMNoTransferDiskFull      = 0x000B,
      kIPMNoTransferMsgRejectedbyDest = 0x000C,
      kIPMNoTransferMsgTooLarge   = 0x000D
  };
  
  
**********************************************************************

  
  /*
  This is the structure that will be returned by enumerate and getmsginfo
  This definition is just to give you a template, the position of msgType
  is variable since this is a packed structure.  procHint and msgType are
  packed and even length padded.
  
  * master message info */
  
  struct IPMMsgInfo {
      IPMSeqNum                       sequenceNum;
      unsigned long                   userData;
      unsigned short                  respIndex;
      SInt8                           padByte;
      IPMPriority                     priority;
      unsigned long                   msgSize;
      unsigned short                  originalRcptCount;
      unsigned short                  reserved;
      UTCTime                         creationTime;
      IPMMsgID                        msgID;
      OSType                          family;                     /* family this msg belongs (e.g. mail) */
      IPMProcHint                     procHint;
      SInt8                           filler2;
      IPMMsgType                      msgType;
  };
  typedef struct IPMMsgInfo               IPMMsgInfo;
  
  typedef OCECreatorType                  IPMBlockType;
  
  struct IPMTOC {
      IPMBlockType                    blockType;
      long                            blockOffset;
      unsigned long                   blockSize;
      unsigned long                   blockRefCon;
  };
  typedef struct IPMTOC                   IPMTOC;
  /*
  The following structure is just to describe the layout of the SingleFilter.
  Each field should be packed and word aligned when passed to the IPM ToolBox.
  */
  
  struct IPMSingleFilter {
      IPMPriority                     priority;
      SInt8                           padByte;
      OSType                          family;                     /* family this msg belongs (e.g. mail), '????' for all */
      ScriptCode                      script;                     /* Language Identifier */
      IPMProcHint                     hint;
      SInt8                           filler2;
      IPMMsgType                      msgType;
  };
  typedef struct IPMSingleFilter          IPMSingleFilter;
  
  struct IPMFilter {
      unsigned short                  count;
      IPMSingleFilter                 sFilters[1];
  };
  typedef struct IPMFilter                IPMFilter;
  
*********************************************************************** Following structures define the "start" of a recipient report block and the elements of the array respectively.

  
  
  struct IPMReportBlockHeader {
      IPMMsgID                        msgID;                      /* message id of the original */
      UTCTime                         creationTime;               /* creation time of the report */
  };
  typedef struct IPMReportBlockHeader     IPMReportBlockHeader;
  
  struct OCERecipientReport {
      unsigned short                  rcptIndex;                  /* index of recipient in original message */
      OSErr                           result;                     /* result of sending letter to this recipient*/
  };
  typedef struct OCERecipientReport       OCERecipientReport;
  
**********************************************************************

  
  typedef union IPMParamBlock             IPMParamBlock;
  
  typedef IPMParamBlock *                 IPMParamBlockPtr;
  typedef CALLBACK_API( void , IPMIOCompletionProcPtr )(IPMParamBlockPtr paramBlock);
  /*
      WARNING: IPMIOCompletionProcPtr uses register based parameters under classic 68k
               and cannot be written in a high-level language without 
               the help of mixed mode or assembly glue.
  */
  typedef REGISTER_UPP_TYPE(IPMIOCompletionProcPtr)               IPMIOCompletionUPP;
  
  struct IPMOpenContextPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMContextRef                   contextRef;                 /* <--  Context reference to be used in further calls*/
  };
  typedef struct IPMOpenContextPB         IPMOpenContextPB;
  
  typedef IPMOpenContextPB                IPMCloseContextPB;
  
  struct IPMCreateQueuePB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      long                            filler1;
      OCERecipient *                  queue;
      AuthIdentity                    identity;                   /* used only if queue is remote */
      PackedRecordID *                owner;                      /* used only if queue is remote */
  };
  typedef struct IPMCreateQueuePB         IPMCreateQueuePB;
  /* For createqueue and deletequeue only queue and identity are used */
  
  typedef IPMCreateQueuePB                IPMDeleteQueuePB;
  
  struct IPMOpenQueuePB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMContextRef                   contextRef;
      OCERecipient *                  queue;
      AuthIdentity                    identity;
      IPMFilter *                     filter;
      IPMQueueRef                     newQueueRef;
      IPMNoteUPP                      notificationProc;
      unsigned long                   userData;
      IPMNotificationType             noteType;
      Byte                            padByte;
      long                            reserved;
      long                            reserved2;
  };
  typedef struct IPMOpenQueuePB           IPMOpenQueuePB;
  
  struct IPMCloseQueuePB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMQueueRef                     queueRef;
  };
  typedef struct IPMCloseQueuePB          IPMCloseQueuePB;
  
  struct IPMEnumerateQueuePB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMQueueRef                     queueRef;
      IPMSeqNum                       startSeqNum;
      Boolean                         getProcHint;
      Boolean                         getMsgType;
      short                           filler;
      IPMFilter *                     filter;
      unsigned short                  numToGet;
      unsigned short                  numGotten;
      unsigned long                   enumCount;
      void *                          enumBuffer;                 /* will be packed array of IPMMsgInfo */
      unsigned long                   actEnumCount;
  };
  typedef struct IPMEnumerateQueuePB      IPMEnumerateQueuePB;
  
  typedef IPMEnumerateQueuePB             IPMChangeQueueFilterPB;
  
  struct IPMDeleteMsgRangePB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMQueueRef                     queueRef;
      IPMSeqNum                       startSeqNum;
      IPMSeqNum                       endSeqNum;
      IPMSeqNum                       lastSeqNum;
  };
  typedef struct IPMDeleteMsgRangePB      IPMDeleteMsgRangePB;
  
  struct IPMOpenMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMQueueRef                     queueRef;
      IPMSeqNum                       sequenceNum;
      IPMMsgRef                       newMsgRef;
      IPMSeqNum                       actualSeqNum;
      Boolean                         exactMatch;
      Byte                            padByte;
      long                            reserved;
  };
  typedef struct IPMOpenMsgPB             IPMOpenMsgPB;
  
  struct IPMOpenHFSMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      FSSpec *                        hfsPath;
      long                            filler;
      IPMMsgRef                       newMsgRef;
      long                            filler2;
      Byte                            filler3;
      Boolean                         filler4;
      long                            reserved;
  };
  typedef struct IPMOpenHFSMsgPB          IPMOpenHFSMsgPB;
  
  struct IPMOpenBlockAsMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      unsigned long                   filler;
      IPMMsgRef                       newMsgRef;
      unsigned short                  filler2[7];
      unsigned short                  blockIndex;
  };
  typedef struct IPMOpenBlockAsMsgPB      IPMOpenBlockAsMsgPB;
  
  struct IPMCloseMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      Boolean                         deleteMsg;
      Boolean                         filler1;
  };
  typedef struct IPMCloseMsgPB            IPMCloseMsgPB;
  
  struct IPMGetMsgInfoPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      IPMMsgInfo *                    info;
  };
  typedef struct IPMGetMsgInfoPB          IPMGetMsgInfoPB;
  
  struct IPMReadHeaderPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      unsigned short                  fieldSelector;
      long                            offset;
      unsigned long                   count;
      void *                          buffer;
      unsigned long                   actualCount;
      unsigned short                  filler;
      unsigned long                   remaining;
  };
  typedef struct IPMReadHeaderPB          IPMReadHeaderPB;
  
  struct IPMReadRecipientPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      unsigned short                  rcptIndex;
      long                            offset;
      unsigned long                   count;
      void *                          buffer;
      unsigned long                   actualCount;
      short                           reserved;                   /* must be zero */
      unsigned long                   remaining;
      unsigned short                  originalIndex;
      OCERecipientOffsetFlags         recipientOffsetFlags;
      Boolean                         filler1;
  };
  typedef struct IPMReadRecipientPB       IPMReadRecipientPB;
  
  /*
  replyQueue works like recipient. [can no longer read it via ReadHeader]
  OriginalIndex is meaningless, rcptFlags are used seperately and there are
  currently none defined.
  */
  
  typedef IPMReadRecipientPB              IPMReadReplyQueuePB;
  
  struct IPMGetBlkIndexPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      IPMBlockType                    blockType;
      unsigned short                  index;
      unsigned short                  startingFrom;
      IPMBlockType                    actualBlockType;
      unsigned short                  actualBlockIndex;
  };
  typedef struct IPMGetBlkIndexPB         IPMGetBlkIndexPB;
  
  struct IPMReadMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      IPMAccessMode                   mode;
      long                            offset;
      unsigned long                   count;
      void *                          buffer;
      unsigned long                   actualCount;
      unsigned short                  blockIndex;
      unsigned long                   remaining;
  };
  typedef struct IPMReadMsgPB             IPMReadMsgPB;
  
  struct IPMVerifySignaturePB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      SIGContextPtr                   signatureContext;
  };
  typedef struct IPMVerifySignaturePB     IPMVerifySignaturePB;
  
  struct IPMNewMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      unsigned long                   filler;
      OCERecipient *                  recipient;
      OCERecipient *                  replyQueue;
      StringPtr                       procHint;
      unsigned short                  filler2;
      IPMMsgType *                    msgType;
      unsigned long                   refCon;
      IPMMsgRef                       newMsgRef;
      unsigned short                  filler3;
      long                            filler4;
      AuthIdentity                    identity;
      IPMSender *                     sender;
      unsigned long                   internalUse;
      unsigned long                   internalUse2;
  };
  typedef struct IPMNewMsgPB              IPMNewMsgPB;
  
  struct IPMNewHFSMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      FSSpec *                        hfsPath;
      OCERecipient *                  recipient;
      OCERecipient *                  replyQueue;
      StringPtr                       procHint;
      unsigned short                  filler2;
      IPMMsgType *                    msgType;
      unsigned long                   refCon;
      IPMMsgRef                       newMsgRef;
      unsigned short                  filler3;
      long                            filler4;
      AuthIdentity                    identity;
      IPMSender *                     sender;
      unsigned long                   internalUse;
      unsigned long                   internalUse2;
  };
  typedef struct IPMNewHFSMsgPB           IPMNewHFSMsgPB;
  
  struct IPMNestMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      unsigned short                  filler[9];
      unsigned long                   refCon;
      IPMMsgRef                       msgToNest;
      unsigned short                  filler2;
      long                            startingOffset;
  };
  typedef struct IPMNestMsgPB             IPMNestMsgPB;
  
  struct IPMNewNestedMsgBlockPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      OCERecipient *                  recipient;
      OCERecipient *                  replyQueue;
      StringPtr                       procHint;
      unsigned short                  filler1;
      IPMMsgType *                    msgType;
      unsigned long                   refCon;
      IPMMsgRef                       newMsgRef;
      unsigned short                  filler2;
      long                            startingOffset;
      AuthIdentity                    identity;
      IPMSender *                     sender;
      unsigned long                   internalUse;
      unsigned long                   internalUse2;
  };
  typedef struct IPMNewNestedMsgBlockPB   IPMNewNestedMsgBlockPB;
  
  struct IPMEndMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      IPMMsgID                        msgID;
      RString *                       msgTitle;
      IPMNotificationType             deliveryNotification;
      IPMPriority                     priority;
      Boolean                         cancel;
      Byte                            padByte;
      long                            reserved;
      SIGSignaturePtr                 signature;
      Size                            signatureSize;
      SIGContextPtr                   signatureContext;
                                                                  /* family this msg belongs (e.g. mail) use kIPMFamilyUnspecified by default */
      OSType                          family;
  };
  typedef struct IPMEndMsgPB              IPMEndMsgPB;
  
  struct IPMAddRecipientPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      OCERecipient *                  recipient;
      long                            reserved;
  };
  typedef struct IPMAddRecipientPB        IPMAddRecipientPB;
  
  struct IPMAddReplyQueuePB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      long                            filler;
      OCERecipient *                  replyQueue;
  };
  typedef struct IPMAddReplyQueuePB       IPMAddReplyQueuePB;
  
  struct IPMNewBlockPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      IPMBlockType                    blockType;
      unsigned short                  filler[5];
      unsigned long                   refCon;
      unsigned short                  filler2[3];
      long                            startingOffset;
  };
  typedef struct IPMNewBlockPB            IPMNewBlockPB;
  
  struct IPMWriteMsgPB {
      void *                          qLink;
      long                            reservedH1;
      long                            reservedH2;
      IPMIOCompletionUPP              ioCompletion;
      OSErr                           ioResult;
      long                            saveA5;
      short                           reqCode;
      IPMMsgRef                       msgRef;
      IPMAccessMode                   mode;
      long                            offset;
      unsigned long                   count;
      void *                          buffer;
      unsigned long                   actualCount;
      Boolean                         currentBlock;
      Boolean                         filler1;
  };
  typedef struct IPMWriteMsgPB            IPMWriteMsgPB;
  
  union IPMParamBlock {
      struct {
          void *                          qLink;
          long                            reservedH1;
          long                            reservedH2;
          IPMIOCompletionUPP              ioCompletion;
          OSErr                           ioResult;
          long                            saveA5;
          short                           reqCode;
      }                                 header;
      IPMOpenContextPB                openContextPB;
      IPMCloseContextPB               closeContextPB;
      IPMCreateQueuePB                createQueuePB;
      IPMDeleteQueuePB                deleteQueuePB;
      IPMOpenQueuePB                  openQueuePB;
      IPMCloseQueuePB                 closeQueuePB;
      IPMEnumerateQueuePB             enumerateQueuePB;
      IPMChangeQueueFilterPB          changeQueueFilterPB;
      IPMDeleteMsgRangePB             deleteMsgRangePB;
      IPMOpenMsgPB                    openMsgPB;
      IPMOpenHFSMsgPB                 openHFSMsgPB;
      IPMOpenBlockAsMsgPB             openBlockAsMsgPB;
      IPMCloseMsgPB                   closeMsgPB;
      IPMGetMsgInfoPB                 getMsgInfoPB;
      IPMReadHeaderPB                 readHeaderPB;
      IPMReadRecipientPB              readRecipientPB;
      IPMReadReplyQueuePB             readReplyQueuePB;
      IPMGetBlkIndexPB                getBlkIndexPB;
      IPMReadMsgPB                    readMsgPB;
      IPMVerifySignaturePB            verifySignaturePB;
      IPMNewMsgPB                     newMsgPB;
      IPMNewHFSMsgPB                  newHFSMsgPB;
      IPMNestMsgPB                    nestMsgPB;
      IPMNewNestedMsgBlockPB          newNestedMsgBlockPB;
      IPMEndMsgPB                     endMsgPB;
      IPMAddRecipientPB               addRecipientPB;
      IPMAddReplyQueuePB              addReplyQueuePB;
      IPMNewBlockPB                   newBlockPB;
      IPMWriteMsgPB                   writeMsgPB;
  };
  
  if OPAQUE_UPP_TYPES
  if CALL_NOT_IN_CARBON
      EXTERN_API(IPMIOCompletionUPP)
      NewIPMIOCompletionUPP          (IPMIOCompletionProcPtr  userRoutine);
  
      EXTERN_API(void)
      DisposeIPMIOCompletionUPP      (IPMIOCompletionUPP      userUPP);
  
      EXTERN_API(void)
      InvokeIPMIOCompletionUPP       (IPMParamBlockPtr        paramBlock,
                                      IPMIOCompletionUPP      userUPP);
  
  endif  /* CALL_NOT_IN_CARBON */
  
  else
      enum { uppIPMIOCompletionProcInfo = 0x00009802 };               /* register no_return_value Func(4_bytes:A0) */
      #define NewIPMIOCompletionUPP(userRoutine)                      (IPMIOCompletionUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppIPMIOCompletionProcInfo, GetCurrentArchitecture())
      #define DisposeIPMIOCompletionUPP(userUPP)                      DisposeRoutineDescriptor(userUPP)
      #if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
      #pragma parameter InvokeIPMIOCompletionUPP(__A0, __A1)
      void InvokeIPMIOCompletionUPP(IPMParamBlockPtr paramBlock, IPMIOCompletionUPP userUPP) = 0x4E91;
      #else
          #define InvokeIPMIOCompletionUPP(paramBlock, userUPP)           CALL_ONE_PARAMETER_UPP((userUPP), uppIPMIOCompletionProcInfo, (paramBlock))
      #endif
  endif
  /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */
  define NewIPMIOCompletionProc(userRoutine)                     NewIPMIOCompletionUPP(userRoutine)
  define CallIPMIOCompletionProc(userRoutine, paramBlock)        InvokeIPMIOCompletionUPP(paramBlock, userRoutine)
  if CALL_NOT_IN_CARBON
  EXTERN_API( OSErr )
  IPMOpenContext                  (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0400, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMCloseContext                 (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0401, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMNewMsg                       (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0402, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMNewBlock                     (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0404, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMNewNestedMsgBlock            (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0405, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMNestMsg                      (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0406, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMWriteMsg                     (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0407, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMEndMsg                       (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0408, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMOpenQueue                    (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0409, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMCloseQueue                   (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x040A, 0xAA5E);
  
  /* Always synchronous */
  EXTERN_API( OSErr )
  IPMVerifySignature              (IPMParamBlockPtr       paramBlock)                         FIVEWORDINLINE(0x7000, 0x1F00, 0x3F3C, 0x0422, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMOpenMsg                      (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x040B, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMCloseMsg                     (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x040C, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMReadMsg                      (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x040D, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMReadHeader                   (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x040E, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMOpenBlockAsMsg               (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x040F, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMNewHFSMsg                    (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x041E, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMReadRecipient                (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0410, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMReadReplyQueue               (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0421, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMCreateQueue                  (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0411, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMDeleteQueue                  (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0412, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMEnumerateQueue               (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0413, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMChangeQueueFilter            (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0414, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMDeleteMsgRange               (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0415, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMAddRecipient                 (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0403, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMAddReplyQueue                (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x041D, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMOpenHFSMsg                   (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0417, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMGetBlkIndex                  (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0418, 0xAA5E);
  
  EXTERN_API( OSErr )
  IPMGetMsgInfo                   (IPMParamBlockPtr       paramBlock,
                                   Boolean                async)                              THREEWORDINLINE(0x3F3C, 0x0419, 0xAA5E);
  
  endif  /* CALL_NOT_IN_CARBON */
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=reset
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(pop)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack()
  endif
  
  ifdef PRAGMA_IMPORT_OFF
  #pragma import off
  #elif PRAGMA_IMPORT
  #pragma import reset
  endif
  
  ifdef __cplusplus
  }
  endif
  
  endif /* __OCEMESSAGING__ */
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.