IMapi.cpp
上传用户:aih203
上传日期:2007-01-03
资源大小:3k
文件大小:6k
源码类别:

Email客户端

开发平台:

Visual C++

  1. /*
  2.  * $Header: /MindProbe/IMapi.cpp 38    11/03/98 2:10p Admin $
  3.  *
  4.  * $Log: /MindProbe/IMapi.cpp $
  5.  * 
  6.  * 38    11/03/98 2:10p Admin
  7.  * Added jackpot and gambit.  Removed random player selection.  Added part
  8.  * of MPede support.  Added response to ChatgamesID request.  Added code
  9.  * to track server name.
  10.  */
  11. #include "stdafx.h"
  12. #include <mapi.h>
  13. #include "imapi.h"
  14. HINSTANCE CIMapi::m_hInstMail = (HINSTANCE) NULL;
  15. BOOL   CIMapi::m_isMailAvail = (BOOL) -1;
  16. CIMapi::CIMapi()
  17. {
  18. m_error = 0; // Initially error free
  19. memset(&m_message, 0, sizeof(MapiMessage));
  20. memset(&m_from, 0, sizeof(MapiRecipDesc));
  21. m_message.lpOriginator = &m_from;
  22. m_from.ulRecipClass = MAPI_ORIG;
  23. if (m_hInstMail == (HINSTANCE) NULL) // Load the MAPI dll
  24. m_hInstMail = ::LoadLibraryA("MAPI32.DLL");
  25. if (m_hInstMail == (HINSTANCE) NULL)
  26. {
  27. AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);
  28. m_error = IMAPI_LOADFAILED;
  29. return;
  30. }
  31. ASSERT(m_hInstMail != (HINSTANCE) NULL); // Now get the pointer to the send function
  32. (FARPROC&) m_lpfnSendMail = GetProcAddress(m_hInstMail, "MAPISendMail");
  33. if (m_lpfnSendMail == NULL)
  34. {
  35. AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
  36. m_error = IMAPI_INVALIDDLL;
  37. return;
  38. }
  39. ASSERT(m_lpfnSendMail != NULL);
  40. }
  41. CIMapi::~CIMapi()
  42. {
  43. if (m_hInstMail != (HINSTANCE) NULL)
  44. ::FreeLibrary(m_hInstMail);
  45. m_hInstMail = (HINSTANCE) NULL;
  46. free(m_message.lpFiles);
  47. free(m_message.lpRecips);
  48. }
  49. BOOL CIMapi::HasEmail()
  50. {
  51. if (m_isMailAvail == (BOOL) -1)
  52. m_isMailAvail = ::GetProfileInt(_T("MAIL"), _T("MAPI"), 0) != 0 && SearchPath(NULL, _T("MAPI32.DLL"), NULL, 0, NULL, NULL) != 0;
  53. return m_isMailAvail;
  54. }
  55. UINT CIMapi::Error()
  56. {
  57. UINT temp = m_error;
  58. m_error = IMAPI_SUCCESS;
  59. return temp;
  60. }
  61. BOOL CIMapi::AllocNewTo()
  62. {
  63. // Allocate a new MapiRecipDesc structure and initialise it to all zeros
  64. m_message.lpRecips = (MapiRecipDesc *) realloc(m_message.lpRecips, (m_message.nRecipCount + 1) * sizeof(MapiRecipDesc));
  65. memset(&m_message.lpRecips[m_message.nRecipCount], 0, sizeof(MapiRecipDesc));
  66. ASSERT(m_message.lpRecips);
  67. return m_message.lpRecips != (MapiRecipDesc *) NULL;
  68. }
  69. BOOL CIMapi::To(LPCTSTR recip)
  70. {
  71. if (AllocNewTo())
  72. {
  73. // We succeeded in allocating a new recipient record
  74. m_message.lpRecips[m_message.nRecipCount].lpszName = (LPTSTR) malloc(strlen(recip) + 1);
  75. strcpy(m_message.lpRecips[m_message.nRecipCount].lpszName, recip);
  76. m_message.lpRecips[m_message.nRecipCount].ulRecipClass = MAPI_TO;
  77. m_message.nRecipCount++;
  78. return TRUE;
  79. }
  80. m_error = IMAPI_FAILTO;
  81. return FALSE;
  82. }
  83. BOOL CIMapi::Cc(LPCTSTR recip)
  84. {
  85. if (AllocNewTo())
  86. {
  87. // We succeeded in allocating a new recipient record
  88. m_message.lpRecips[m_message.nRecipCount].lpszName = (LPTSTR) malloc(strlen(recip) + 1);
  89. strcpy(m_message.lpRecips[m_message.nRecipCount].lpszName, recip);
  90. m_message.lpRecips[m_message.nRecipCount].ulRecipClass = MAPI_CC;
  91. m_message.nRecipCount++;
  92. return TRUE;
  93. }
  94. m_error = IMAPI_FAILCC;
  95. return FALSE;
  96. }
  97. BOOL CIMapi::Attach(LPCTSTR path, LPCTSTR name)
  98. {
  99. // Add a new attachment record
  100. m_message.lpFiles = (MapiFileDesc *) realloc(m_message.lpFiles, (m_message.nFileCount + 1) * sizeof(MapiFileDesc));
  101. memset(&m_message.lpFiles[m_message.nFileCount], 0, sizeof(MapiFileDesc));
  102. ASSERT(m_message.lpFiles);
  103. if (m_message.lpFiles == (MapiFileDesc *) NULL)
  104. {
  105. m_error = IMAPI_FAILATTACH;
  106. return FALSE;
  107. }
  108. m_message.lpFiles[m_message.nFileCount].lpszPathName = (LPTSTR) malloc(strlen(path) + 1);
  109. strcpy(m_message.lpFiles[m_message.nFileCount].lpszPathName, path);
  110. if (name != (LPCTSTR) NULL)
  111. {
  112. m_message.lpFiles[m_message.nFileCount].lpszFileName = (LPTSTR) malloc(strlen(name) + 1);
  113. strcpy(m_message.lpFiles[m_message.nFileCount].lpszFileName, name);
  114. }
  115. m_message.nFileCount++;
  116. return TRUE;
  117. }
  118. BOOL CIMapi::Send(ULONG flags)
  119. {
  120. CWaitCursor wait;
  121. int offset = m_text.GetLength();
  122. // Add 1 space per attachment at the end of the body text.
  123. m_text += CString(' ', m_message.nFileCount);
  124. // Set each attachment to replace one of the added spaces at the end of the body text.
  125. for (UINT i = 0; i < m_message.nFileCount; i++)
  126. m_message.lpFiles[i].nPosition = offset++;
  127. m_message.lpszNoteText = (LPTSTR) (LPCTSTR) m_text; //  Set the body text
  128. // prepare for modal dialog box
  129. AfxGetApp()->EnableModeless(FALSE);
  130. HWND hWndTop;
  131. CWnd* pParentWnd = CWnd::GetSafeOwner(NULL, &hWndTop);
  132. // some extra precautions are required to use MAPISendMail as it
  133. // tends to enable the parent window in between dialogs (after
  134. // the login dialog, but before the send note dialog).
  135. pParentWnd->SetCapture();
  136. ::SetFocus(NULL);
  137. pParentWnd->m_nFlags |= WF_STAYDISABLED;
  138. int nError = m_lpfnSendMail(0, (ULONG) pParentWnd->GetSafeHwnd(), &m_message, MAPI_LOGON_UI | flags, 0);
  139. // after returning from the MAPISendMail call, the window must
  140. // be re-enabled and focus returned to the frame to undo the workaround
  141. // done before the MAPI call.
  142. ::ReleaseCapture();
  143. pParentWnd->m_nFlags &= ~WF_STAYDISABLED;
  144. pParentWnd->EnableWindow(TRUE);
  145. ::SetActiveWindow(NULL);
  146. pParentWnd->SetActiveWindow();
  147. pParentWnd->SetFocus();
  148. if (hWndTop != NULL)
  149. ::EnableWindow(hWndTop, TRUE);
  150. AfxGetApp()->EnableModeless(TRUE);
  151. // Now free malloced recipients
  152. for (i = 0; i < m_message.nRecipCount; i++)
  153. free(m_message.lpRecips[i].lpszName);
  154. // Then free malloced attachments
  155. for (i = 0; i < m_message.nFileCount; i++)
  156. {
  157. free(m_message.lpFiles[i].lpszPathName);
  158. free(m_message.lpFiles[i].lpszFileName);
  159. }
  160. if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
  161. {
  162. AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
  163. return FALSE;
  164. }
  165. return TRUE;
  166. }