AppOctetStream.cpp
上传用户:weimei12
上传日期:2022-08-11
资源大小:185k
文件大小:4k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // AppOctetStream.cpp: implementation of the CAppOctetStream class.
  2. // Author: Wes Clyburn (clyburnw@enmu.edu)
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MIMEContentAgent.h"
  6. #include "AppOctetStream.h"
  7. #include "MIMECode.h"
  8. #include "Base64.h"
  9. #include "MailMessage.h"
  10. #include "MIMEMessage.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. // IMPORTANT: The number of bytes we read must be
  17. //  a multiple of 3 because CBase64's Encode()
  18. //  method will append padding characters ('=')
  19. //  to make the output's size a multiple of 4.
  20. //  (Base64 treats 3 8-bit bytes as 4 6-bit 'bytes').
  21. //  MIME decoders are free to treat '=' as a signal
  22. //  that there's no more data, so we don't want to pad
  23. //  until we're supposed to.
  24. // When at the end of the file, the # of bytes read
  25. //  may not be a multiple of 3, but that's okay
  26. //  because we DO want the padding chars then.
  27. #define BYTES_TO_READ 54 // This number guarantess output won't
  28.  // won't exceed line-length limit
  29. //////////////////////////////////////////////////////////////////////
  30. // Construction/Destruction
  31. //////////////////////////////////////////////////////////////////////
  32. CAppOctetStream::CAppOctetStream(int nContentType)
  33. :CMIMEContentAgent(nContentType)
  34. {
  35. }
  36. CAppOctetStream::~CAppOctetStream()
  37. {
  38. }
  39. ///<summary>
  40. ///   append it to the body
  41. ///</summary>
  42. BOOL CAppOctetStream::AppendPart(LPCTSTR szContent, 
  43.  LPCTSTR szParameters, 
  44.  int nEncoding, 
  45.  BOOL bPath, 
  46.  CString& strDestination)
  47. {
  48. ASSERT(szContent != NULL);
  49. if(NULL == szContent)
  50. {
  51. return FALSE;
  52. }
  53. CStdioFile fAttachment;
  54. // This class handles only file attachments, so it ignores the bPath parameter.
  55. if(!fAttachment.Open(szContent, (CFile::modeRead | CFile::shareDenyWrite | CFile::typeBinary)))
  56. {
  57. return FALSE;
  58. }
  59. strDestination += BuildSubHeader(szContent,
  60.      szParameters,
  61.  nEncoding,
  62.  TRUE);
  63. AttachFile(&fAttachment, CMIMEMessage::BASE64, strDestination);
  64. fAttachment.Close();
  65. return TRUE;
  66. }
  67. ///<summary>
  68. ///   Get the content type sting
  69. ///</summary>
  70. CString CAppOctetStream::GetContentTypeString()
  71. {
  72. CString s;
  73. s = _T("application/octet-stream");
  74. return s;
  75. }
  76. ///<summary>
  77. ///   construct the sub-part header
  78. ///</summary>
  79. CString CAppOctetStream::BuildSubHeader(LPCTSTR szContent, 
  80. LPCTSTR szParameters, 
  81. int nEncoding, 
  82. BOOL bPath)
  83. {
  84. CString strSubHeader;
  85. CString strTemp;
  86. TCHAR szFName[_MAX_FNAME] = {0};
  87. TCHAR szExt[_MAX_EXT] = {0};
  88. _tsplitpath_s(szContent, NULL, 0, NULL, 0, szFName, _MAX_FNAME, szExt, _MAX_EXT);
  89. // This class ignores szParameters and nEncoding.
  90. // It controls its own parameters and only handles Base64 encoding.
  91. if(bPath)
  92. {
  93. strTemp.Format(_T("; file=%s%s"), szFName, szExt);
  94. }
  95. else
  96. {
  97. strTemp = _T("");
  98. }
  99. strSubHeader.Format(_T("Content-Type: %s%srn"),
  100. GetContentTypeString(),
  101. strTemp);
  102. strSubHeader += _T("Content-Transfer-Encoding: base64rn");
  103. strTemp.Format(_T("Content-Disposition: attachment; filename=%s%srn"),
  104.   szFName, szExt);
  105. strSubHeader += strTemp;
  106. // Signal end of sub-header.
  107. strSubHeader += _T("rn"); // Warning: numerous concatenations are inefficient.
  108. return strSubHeader;
  109. }
  110. ///<summary>
  111. ///   attach the file to the mail
  112. ///</summary>
  113. void CAppOctetStream::AttachFile(CStdioFile* pFileAtt, 
  114.  int nEncoding, 
  115.  CString & strDestination)
  116. {
  117. ASSERT(pFileAtt != NULL);
  118. if(NULL == pFileAtt)
  119. {
  120. return;
  121. }
  122. CMIMECode* pEncoder = NULL;
  123. int nBytesRead = 0;
  124. TCHAR szBuffer[BYTES_TO_READ + 1] = {0};
  125. switch(nEncoding)
  126. {
  127. // This class handles only Base64 encoding, but others may be added here.
  128. default:
  129. case CMIMEMessage::BASE64:
  130. try 
  131. {
  132. pEncoder = new CBase64;
  133. }
  134. catch(CMemoryException* e)
  135. {
  136. delete e;
  137. return;
  138. }
  139. }
  140. if(NULL == pEncoder)
  141. {
  142. return;
  143. }
  144. do
  145. {
  146. try
  147. {
  148. nBytesRead = pFileAtt->Read(szBuffer, BYTES_TO_READ);
  149. }
  150. catch(CFileException* e)
  151. {
  152. delete e;
  153. break;
  154. }
  155. szBuffer[nBytesRead] = 0;
  156. strDestination += pEncoder->Encode(szBuffer, nBytesRead);
  157. strDestination += _T("rn");
  158. } while(nBytesRead == BYTES_TO_READ);
  159. strDestination += _T("rn");
  160. delete pEncoder;
  161. }