home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1993 October: Windmill on DISC / ADC Developer CD (1993-10) (''Windmill On DISC'')_iso / Dev.CD Oct 93.iso / System Software / U.S. System Software / System 7 Pro™ Beta 11 / Development Tools / Sample Code / Messaging Service Access Module / Internet PMSAM / Internet PMSAM source / spoolfromaoce.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-28  |  8.2 KB  |  344 lines  |  [TEXT/MPS ]

  1. /*-------------------------------------------------------------------
  2.  
  3. AOCE Post Office Protocol (POP) / Simple Mail Transfer Protocol (SMTP)
  4. Mail Service Access Module
  5.  
  6. written by Steve Falkenburg-- MacDTS
  7. ©1991-1993 Apple Computer, Inc.
  8.  
  9. --------------
  10. change history
  11. --------------
  12.  
  13. SJF        02/19/93    update for beta build    b1
  14. SJF        10/29/92    update to a11            a11
  15. SJF        06/08/92    update to a8            a8
  16. SJF        02/15/92    first working version    a4.5
  17. SJF        10/16/91    initial coding            a3
  18.  
  19. ---------------------------------------------------------------------*/
  20.  
  21. #ifndef __TYPES__
  22. #include <Types.h>
  23. #endif
  24.  
  25. #ifndef __OCE__
  26. #include <OCE.h>
  27. #endif
  28.  
  29. #ifndef __OCEMAIL__
  30. #include <OCEMail.h>
  31. #endif
  32.  
  33. #include "const.h"
  34. #include "gwerrors.h"
  35. #include "mytypes.h"
  36. #include "globals.h"
  37. #include "utils.h"
  38. #include "spoolsystem.h"
  39. #include "gatewaystuff.h"
  40.  
  41. #include "spoolfromaoce.h"
  42.  
  43.  
  44. OSErr SpoolFromAOCE(MailMsgRef mailRef,FSSpec *spoolSpec)
  45. {
  46.     OSErr err;
  47.  
  48.     // put message data into spool file
  49.     
  50.     err = SpoolAttributesFromAOCE(spoolSpec,mailRef);
  51.     if (err!=noErr) {
  52.         RemoveSpoolFile(spoolSpec);
  53.         return err;
  54.     }
  55.  
  56.     err = SpoolAddressFromAOCE(spoolSpec,mailRef);
  57.     if (err!=noErr) {
  58.         RemoveSpoolFile(spoolSpec);
  59.         return err;
  60.     }
  61.  
  62.     err = SpoolContentsFromAOCE(spoolSpec,mailRef);
  63.     if (err!=noErr) {
  64.         RemoveSpoolFile(spoolSpec);
  65.         return err;
  66.     }
  67.     
  68.     return noErr;
  69. }
  70.  
  71.  
  72. OSErr SpoolAttributesFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
  73. {
  74.     OSErr err;
  75.     MSAMGetAttributesPB gwp;
  76.     MailAttributeBitmap reqBitmap;
  77.     MaximumLetterAttributes attrib;
  78.     long *clrBitmap;
  79.     char *attribPtr;
  80.     
  81.     
  82.     // get attributes from letter
  83.     
  84.     clrBitmap = (long *)&reqBitmap;
  85.     *clrBitmap = 0L;
  86.     clrBitmap = (long *)&gwp.responseMask;
  87.     
  88.     reqBitmap.letterID = reqBitmap.replyID = reqBitmap.conversationID = reqBitmap.sendTimeStamp =
  89.         reqBitmap.indications = reqBitmap.subject = 1;
  90.             
  91.     attribPtr = (char *)&attrib;
  92.     
  93.     gwp.ioCompletion = (ProcPtr)MSAMCompletion;
  94.     gwp.mailMsgRef = mailRef;
  95.     gwp.requestMask = reqBitmap;
  96.     gwp.buffer.bufferSize = sizeof(MaximumLetterAttributes);
  97.     gwp.buffer.buffer = attribPtr;
  98.     gwp.more = false;
  99.     
  100.     MSAMGetAttributes((MSAMParam *)&gwp,true);
  101.     err = WaitPBDone(&gwp);
  102.     if (err!=noErr)
  103.         return err;
  104.     
  105.     // spool received attributes to disk
  106.     
  107.     if (gwp.responseMask.letterID) {
  108.         err = SpoolToFile(spoolSpec,kLetterIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
  109.         if (err!=noErr)
  110.             return err;
  111.         attribPtr += sizeof(MailLetterID);
  112.     }
  113.     
  114.     if (gwp.responseMask.replyID) {
  115.         err = SpoolToFile(spoolSpec,kReplyIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
  116.         if (err!=noErr)
  117.             return err;
  118.         attribPtr += sizeof(MailLetterID);
  119.     }
  120.  
  121.     if (gwp.responseMask.conversationID) {
  122.         err = SpoolToFile(spoolSpec,kConversationIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
  123.         if (err!=noErr)
  124.             return err;
  125.         attribPtr += sizeof(MailLetterID);
  126.     }
  127.  
  128.     if (gwp.responseMask.sendTimeStamp) {
  129.         err = SpoolToFile(spoolSpec,kSendTimeType,kAttribCreator,0,attribPtr,sizeof(MailTime));
  130.         if (err!=noErr)
  131.             return err;
  132.         attribPtr += sizeof(MailTime);
  133.     }
  134.  
  135.     if (gwp.responseMask.indications) {
  136.         err = SpoolToFile(spoolSpec,kIndicationsType,kAttribCreator,0,attribPtr,sizeof(MailIndications));
  137.         if (err!=noErr)
  138.             return err;
  139.         attribPtr += sizeof(MailIndications);
  140.     }
  141.  
  142.     if (gwp.responseMask.subject) {
  143.         err = SpoolToFile(spoolSpec,kSubjectType,kAttribCreator,0,attribPtr,sizeof(RString));
  144.         if (err!=noErr)
  145.             return err;
  146.         attribPtr += sizeof(RString);
  147.     }
  148. }
  149.  
  150.  
  151. OSErr SpoolAddressFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
  152. {
  153.     OSErr err;
  154.     
  155.     // spool resolved addresses
  156.     
  157.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailResolvedList);
  158.     if (err!=noErr)
  159.         return err;
  160.     
  161.     // spool from
  162.         
  163.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailFromBit);
  164.     if (err!=noErr)
  165.         return err;
  166.     
  167.     // spool to
  168.         
  169.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailToBit);
  170.     if (err!=noErr)
  171.         return err;
  172.     
  173.     // spool cc
  174.         
  175.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailCcBit);
  176.     if (err!=noErr)
  177.         return err;
  178.     
  179.     // spool bcc
  180.         
  181.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailBccBit);
  182.     if (err!=noErr)
  183.         return err;
  184.     
  185.     return err;
  186. }
  187.  
  188.  
  189. OSErr SpoolGenericAddressFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef,MailAttributeID attrID)
  190. {
  191.     OSErr err;
  192.     MSAMGetRecipientsPB gwp;
  193.     short index,procIndex,numRecipients,internalRecipIndex;
  194.     OSType spoolType;
  195.     OriginalRecipientReply *origBlock;
  196.     ResolvedRecipientReply *resolvedBlock;
  197.     MailOriginalRecipientExt *origPtr;
  198.     MailResolvedRecipientExt *resolvedPtr;
  199.     Ptr ptrData,recipientPtr;
  200.     Boolean doingResolved;
  201.     short reportIndex = 0;
  202.     
  203.     ptrData = NewPtrChk(kMaxRecipSize);
  204.     if (MemError()!=noErr)
  205.         return MemError();
  206.         
  207.     doingResolved = false;
  208.     origBlock = (OriginalRecipientReply *) ptrData;
  209.     resolvedBlock = (ResolvedRecipientReply *) ptrData;
  210.     
  211.     switch (attrID) {
  212.         case kMailResolvedList:
  213.             doingResolved = true;
  214.             spoolType = kResolvedRecType;
  215.             break;
  216.         case kMailFromBit:
  217.             spoolType = kFromType;
  218.             break;
  219.         case kMailToBit:
  220.             spoolType = kToType;
  221.             break;
  222.         case kMailCcBit:
  223.             spoolType = kCCType;
  224.             break;
  225.         case kMailBccBit:
  226.             spoolType = kBCCType;
  227.             break;
  228.         default:
  229.             DisposPtrChk(ptrData);
  230.             return kUnexpectedAOCECondition;
  231.     }
  232.     
  233.     gwp.ioCompletion = (ProcPtr)MSAMCompletion;
  234.     gwp.mailMsgRef = mailRef;
  235.     gwp.attrID = attrID;
  236.     gwp.startIndex = 1;
  237.     gwp.buffer.buffer = ptrData;
  238.     gwp.buffer.bufferSize = kMaxRecipSize;
  239.     gwp.more = true;    // start at true to kick-start for loop
  240.     gwp.nextIndex = 1;
  241.     
  242.     err = noErr;
  243.     for (index=1; gwp.more==true && err==noErr; index=gwp.nextIndex) {
  244.  
  245.         gwp.startIndex = gwp.nextIndex;    // get next recipient
  246.  
  247.         MSAMGetRecipients((MSAMParam *)&gwp,true);
  248.         err = WaitPBDone(&gwp);
  249.         if (err!=noErr) {
  250.             DisposPtrChk(ptrData);
  251.             return err;
  252.         }
  253.         
  254.         recipientPtr = ptrData + sizeof(short);
  255.         numRecipients = origBlock->reply.tupleCount;
  256.         for (procIndex=0; procIndex<numRecipients && err==noErr; procIndex++) {
  257.             if (doingResolved) {
  258.                 resolvedPtr = (MailResolvedRecipientExt *)recipientPtr;
  259.                 internalRecipIndex = resolvedPtr->ext.index;
  260.                 recipientPtr += (sizeof(MailResolvedRecipient)+sizeof(short)+resolvedPtr->packedRecip.dataLength);
  261.                 if ((unsigned long)recipientPtr % 2)
  262.                     recipientPtr++;
  263.                 if (resolvedPtr->ext.responsible) {
  264.                     err = SpoolSingleRecipient(spoolSpec,spoolType,procIndex,&resolvedPtr->packedRecip);
  265.                     if (err==noErr) {
  266. //
  267. //    **NOTE** this is different from previous builds!
  268. //             you now need to use the procIndex+1 for the index instead of internalRecipientIndex!
  269. //
  270.                         err = SpoolRecipientReport(spoolSpec,procIndex+1,reportIndex++);
  271.                     }
  272.                 }
  273.             }
  274.             else {
  275.                 origPtr = (MailOriginalRecipientExt *)recipientPtr;
  276.                 internalRecipIndex = origPtr->ext.index;
  277.                 recipientPtr += (sizeof(MailOriginalRecipient)+sizeof(short)+origPtr->packedRecip.dataLength);
  278.                 if ((unsigned long)recipientPtr % 2)
  279.                     recipientPtr++;
  280.                 err = SpoolSingleRecipient(spoolSpec,spoolType,procIndex,&origPtr->packedRecip);
  281.             }
  282.         }
  283.     }
  284.     
  285.     DisposPtrChk(ptrData);
  286.     return err;
  287. }
  288.  
  289.  
  290. OSErr SpoolRecipientReport(FSSpec *spoolSpec,short recipIndex,short myIndex)
  291. {
  292.     OSErr err;
  293.     
  294.     err = SpoolToFile(spoolSpec,kRecipientType,kReportCreator,myIndex,(Ptr)&recipIndex,(unsigned long)sizeof(short));
  295.     return err;
  296. }
  297.  
  298.  
  299. OSErr SpoolSingleRecipient(FSSpec *spoolSpec,OSType spoolType,short index,OCEPackedRecipient *pRecip)
  300. {
  301.     OSErr err;
  302.  
  303.     err = SpoolToFile(spoolSpec,spoolType,kAddrCreator,index,(Ptr)pRecip,(unsigned long)pRecip->dataLength+sizeof(short));
  304.     return err;
  305. }
  306.  
  307.  
  308. /* spool content blocks here */
  309.  
  310. OSErr SpoolContentsFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
  311. {
  312.     MSAMGetContentPB gwp;
  313.     Ptr spoolData;
  314.     Boolean first;
  315.     OSErr err;
  316.     
  317.     spoolData = NewPtrChk(kMaxBufferSize);
  318.     if (MemError()!=noErr)
  319.         return MemError();
  320.     
  321.     gwp.ioCompletion = (ProcPtr)MSAMCompletion;
  322.     gwp.mailMsgRef = mailRef;
  323.     gwp.segmentMask = kMailTextSegmentType;        // we only want text for now
  324.     gwp.segmentID = 0;
  325.     gwp.buffer.buffer = spoolData;
  326.     gwp.buffer.bufferSize = kMaxBufferSize;
  327.  
  328.     first = true;
  329.     do {
  330.         MSAMGetContent((MSAMParam *)&gwp,true);
  331.         err = WaitPBDone(&gwp);
  332.         if (err==noErr) {
  333.             if (first) {
  334.                 SpoolToFile(spoolSpec,kTextContent,kContentCreator,0,gwp.buffer.buffer,gwp.buffer.dataSize);
  335.                 first = false;
  336.             }
  337.             else
  338.                 AppendToSpool(spoolSpec,kTextContent,kContentCreator,0,gwp.buffer.buffer,gwp.buffer.dataSize);
  339.         }
  340.     } while (err==noErr && gwp.endOfContent==false);
  341.     
  342.     DisposPtrChk(spoolData);
  343. }
  344.